[Mono-list] BigInt implementation

Alexander Larsson alexl@redhat.com
Mon, 21 Oct 2002 08:57:09 -0400 (EDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--279707962-904132616-1035205029=:25817
Content-Type: TEXT/PLAIN; charset=US-ASCII

I noted on the mono mailinglist (I read the archives now and then) that 
you needed a bignum implementation. I wrote a java BigInt class ages ago 
(1996 to be exact). It probably need some cleaning up and changes for C#, 
but might be interesting as a basis for something.

I have full copyright on this, so I can license it BSD style if you want 
to use it.

-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 Alexander Larsson                                            Red Hat, Inc 
                   alexl@redhat.com    alla@lysator.liu.se 
He's a suicidal gay romance novelist in a wheelchair. She's a beautiful 
motormouth archaeologist operating on the wrong side of the law. They fight 
crime! 

--279707962-904132616-1035205029=:25817
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="BigInt.java"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.44.0210210857090.25817@devserv.devel.redhat.com>
Content-Description: 
Content-Disposition: attachment; filename="BigInt.java"

aW1wb3J0IGphdmEubGFuZy4qOw0KLyogDQoNCiAgVE9ETzoNCiAgIHBvdw0K
ICAgc2hpZnQgZnVuY3Rpb25zDQoNCiAgIHRlc3QsIHRlc3QsIHRlc3QuLi4g
KHBhcnRpY3VsYXJ5IGRpdikNCiovDQoNCg0KDQpwdWJsaWMgY2xhc3MgQmln
SW50IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsNCi8vIFB1YmxpYyBDb25zdHJ1
Y3RvcnMNCiAgcHVibGljIEJpZ0ludChpbnQgeCkgeyANCiAgICBpZiAoeD09
LTB4ODAwMDAwMDApIHsNCiAgICAgIHZhbHVlPSBuZXcgaW50WzJdOw0KICAg
ICAgbGVuZ3RoPS0yOw0KICAgICAgdmFsdWVbMV09MTsNCiAgICAgIHZhbHVl
WzBdPTA7DQogICAgfSBlbHNlIHsNCiAgICAgIHZhbHVlPSBuZXcgaW50WzFd
Ow0KICAgICAgbGVuZ3RoPTE7DQogICAgICBpZiAoeD49MCkgew0KCXZhbHVl
WzBdPXg7DQogICAgICB9IGVsc2Ugew0KCXZhbHVlWzBdPS14Ow0KCWxlbmd0
aD0tbGVuZ3RoOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHB1YmxpYyBC
aWdJbnQoU3RyaW5nIHMpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24g
ew0KICAgIGJvb2xlYW4gbmVnYXRpdmU9ZmFsc2U7DQogICAgaW50IG0saSxk
LHQ7DQogICAgU3RyaW5nIGRzOw0KDQogICAgdHJ5IHsNCiAgICAgIGk9MDsN
CiAgICAgIGlmIChzLmNoYXJBdChpKT09Jy0nKSB7DQoJbmVnYXRpdmU9dHJ1
ZTsNCglpKys7DQogICAgICB9DQogICAgICBtPXMubGVuZ3RoKCktaTsNCiAg
DQoNCiAgICAgIGxlbmd0aD0xOw0KICAgICAgdmFsdWU9bmV3IGludFttKzFd
Ow0KICAgICAgdmFsdWVbMF09MDsNCiAgICAgIHdoaWxlIChtPjApIHsNCglp
ZiAobT49OSkgew0KCSAgZHM9cy5zdWJzdHJpbmcoaSxpKzkpOw0KCSAgZD1J
bnRlZ2VyLnBhcnNlSW50KGRzKTsNCgkgIGlmIChkPDApDQoJICAgIHRocm93
IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIictJyBpbiBkaWdpdCIpOw0K
CSAgdmFsdWVbbGVuZ3RoXT1kb011bHQodmFsdWUsMCxsZW5ndGgsMTAwMDAw
MDAwMCx2YWx1ZSwwKTsNCgkgIGlmICh2YWx1ZVtsZW5ndGhdIT0wKQ0KCSAg
ICBsZW5ndGgrKzsNCgkgIHZhbHVlW2xlbmd0aF09ZG9BZGQodmFsdWUsMCxs
ZW5ndGgsZCx2YWx1ZSwwKTsNCgkgIGlmICh2YWx1ZVtsZW5ndGhdIT0wKQ0K
CSAgICBsZW5ndGgrKzsNCgkgIGkrPTk7DQoJICBtLT05Ow0KCX0gZWxzZSB7
DQoJICBkcz1zLnN1YnN0cmluZyhpLGkrbSk7DQoJICBkPUludGVnZXIucGFy
c2VJbnQoZHMpOw0KCSAgdD0xOw0KCSAgd2hpbGUgKG0+MCkgew0KCSAgICB0
PXQqMTA7DQoJICAgIG0tLTsNCgkgIH0NCgkgIHZhbHVlW2xlbmd0aF09ZG9N
dWx0KHZhbHVlLDAsbGVuZ3RoLHQsdmFsdWUsMCk7DQoJICBpZiAodmFsdWVb
bGVuZ3RoXSE9MCkNCgkgICAgbGVuZ3RoKys7DQoJICB2YWx1ZVtsZW5ndGhd
PWRvQWRkKHZhbHVlLDAsbGVuZ3RoLGQsdmFsdWUsMCk7DQoJICBpZiAodmFs
dWVbbGVuZ3RoXSE9MCkNCgkgICAgbGVuZ3RoKys7DQoJICBicmVhazsNCgl9
DQogICAgICB9DQogICAgICBpZiAobmVnYXRpdmUpIHsNCglsZW5ndGg9LWxl
bmd0aDsNCiAgICAgIH0NCiAgICAgIHRyaW0oKTsNCg0KICAgIH0gY2F0Y2gg
KFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KICAgICAg
dGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiaW5kZXggb3V0IG9m
IGJvdW5kcyIpOw0KICAgIH0NCiAgfQ0KDQogIHB1YmxpYyBzdGF0aWMgZmlu
YWwgQmlnSW50IHJhbmRvbShpbnQgbikgew0KICAgIGphdmEudXRpbC5SYW5k
b20gcjsNCiAgICBpbnQgaSxsOw0KICAgIEJpZ0ludCB4Ow0KDQogICAgcj1u
ZXcgamF2YS51dGlsLlJhbmRvbSgpOw0KDQoNCiAgICBsPU1hdGguYWJzKHIu
bmV4dEludCgpJShuLTEpKSsxOw0KDQogICAgeD1uZXcgQmlnSW50KCk7DQog
ICAgeC5sZW5ndGg9bDsNCiAgICB4LnZhbHVlPW5ldyBpbnRbbF07DQogICAg
Zm9yIChpPTA7aTxsO2krKykgew0KICAgICAgeC52YWx1ZVtpXT1NYXRoLmFi
cyhyLm5leHRJbnQoKSk7DQogICAgfQ0KICAgIGlmICgoci5uZXh0SW50KCkl
Mik9PTApDQogICAgICB4Lmxlbmd0aD0teC5sZW5ndGg7DQogICAgeC50cmlt
KCk7DQogICAgcmV0dXJuIHg7DQogIH0NCg0KDQovLyBDbGFzcyBNZXRob2Rz
DQogIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50IGdjZChCaWdJbnQgYSxC
aWdJbnQgYikgew0KICAgIEJpZ0ludCBjLGQscixxOw0KICAgIGM9QmlnSW50
LmFicyhhKTsNCiAgICBkPUJpZ0ludC5hYnMoYik7DQoNCiAgICB3aGlsZSAo
IWQuaXNaZXJvKCkpIHsNCiAgICAgIHI9QmlnSW50LnJlbShjLGQpOw0KICAg
ICAgYz1kOw0KICAgICAgZD1yOw0KICAgIH0NCiAgICByZXR1cm4gYzsNCiAg
fQ0KDQogIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50IGdjZChCaWdJbnQg
YSxCaWdJbnQgYixCaWdJbnQgcyxCaWdJbnQgdCkgew0KICAgIEJpZ0ludCBj
LGQscixxOw0KICAgIEJpZ0ludCBjMSxkMSxjMixkMixyMSxyMjsNCiAgICBj
PUJpZ0ludC5hYnMoYSk7DQogICAgZD1CaWdJbnQuYWJzKGIpOw0KICAgIGMx
PW5ldyBCaWdJbnQoMSk7ICBkMT1uZXcgQmlnSW50KDApOw0KICAgIGMyPW5l
dyBCaWdJbnQoMCk7ICBkMj1uZXcgQmlnSW50KDEpOw0KDQogICAgcT1uZXcg
QmlnSW50KCk7DQogICAgcj1uZXcgQmlnSW50KCk7DQoNCiAgICB3aGlsZSAo
IWQuaXNaZXJvKCkpIHsNCiAgICAgIEJpZ0ludC5kaXZyZW0oYyxkLHEscik7
DQogICAgICByMT1CaWdJbnQuc3ViKGMxLEJpZ0ludC5tdWx0KHEsZDEpKTsN
CiAgICAgIHIyPUJpZ0ludC5zdWIoYzIsQmlnSW50Lm11bHQocSxkMikpOw0K
ICAgICAgYy5hc3NpZ24oZCk7IGMxPWQxOyBjMj1kMjsNCiAgICAgIGQuYXNz
aWduKHIpOyBkMT1yMTsgZDI9cjI7DQogICAgfQ0KICAgIHMuYXNzaWduKGMx
KTsNCiAgICB0LmFzc2lnbihjMik7DQogICAgaWYgKGEuaXNOZWdhdGl2ZSgp
KSB7DQogICAgICBzLm5lZygpOw0KICAgIH0NCiAgICBpZiAoYi5pc05lZ2F0
aXZlKCkpIHsNCiAgICAgIHQubmVnKCk7DQogICAgfQ0KICAgIGlmIChjLmlz
TmVnYXRpdmUoKSkgew0KICAgICAgdC5uZWcoKTsNCiAgICAgIHMubmVnKCk7
DQogICAgfQ0KDQogICAgcmV0dXJuIGM7DQogIH0NCg0KICBwdWJsaWMgc3Rh
dGljIGZpbmFsIEJpZ0ludCBsY20oQmlnSW50IGEsQmlnSW50IGIpIHsNCiAg
ICBCaWdJbnQgYyxyOw0KICAgIA0KICAgIGM9QmlnSW50Lm11bHQoYSxiKTsN
CiAgICByPWMuZGl2KEJpZ0ludC5nY2QoYSxiKSk7DQogICAgcmV0dXJuIGM7
DQogICAgDQogIH0NCiAgcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnQgbWF4
KEJpZ0ludCBhLEJpZ0ludCBiKSB7DQogICAgaWYgKGEuaXNHcmVhdGVyKGIp
KSB7DQogICAgICByZXR1cm4gKEJpZ0ludCkgYS5jbG9uZSgpOw0KICAgIH0g
ZWxzZSB7DQogICAgICByZXR1cm4gKEJpZ0ludCkgYi5jbG9uZSgpOw0KICAg
IH0NCiAgfQ0KICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpZ0ludCBtaW4oQmln
SW50IGEsQmlnSW50IGIpIHsNCiAgICBpZiAoYS5pc0dyZWF0ZXIoYikpIHsN
CiAgICAgIHJldHVybiAoQmlnSW50KSBiLmNsb25lKCk7DQogICAgfSBlbHNl
IHsNCiAgICAgIHJldHVybiAoQmlnSW50KSBhLmNsb25lKCk7DQogICAgfQ0K
ICB9DQogIA0KLy8gUHVibGljIEluc3RhbmNlIE1ldGhvZHMNCiAgcHVibGlj
IGZpbmFsIHZvaWQgYXNzaWduKEJpZ0ludCB4KSB7DQogICAgdGhpcy5sZW5n
dGg9eC5sZW5ndGg7DQogICAgdHJ5IHsNCiAgICAgIHRoaXMudmFsdWU9KGlu
dCBbXSl4LnZhbHVlLmNsb25lKCk7DQogICAgfSBjYXRjaCAoVGhyb3dhYmxl
IGUpIHsNCiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xvbmUgbm90IHN1
cHBvcnRlZCBieSBhcnJheSE/Iik7DQogICAgfQ0KICB9DQoNCiAgcHVibGlj
IGZpbmFsIE9iamVjdCBjbG9uZSgpIHsNCiAgICBCaWdJbnQgeDsNCiAgICB4
PW5ldyBCaWdJbnQoKTsNCiAgICB4Lmxlbmd0aD10aGlzLmxlbmd0aDsNCiAg
ICB0cnkgew0KICAgICAgeC52YWx1ZT0oaW50IFtdKXRoaXMudmFsdWUuY2xv
bmUoKTsNCiAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgew0KICAgICAgU3lz
dGVtLm91dC5wcmludGxuKCJDbG9uZSBub3Qgc3VwcG9ydGVkIGJ5IGFycmF5
IT8iKTsNCiAgICB9DQogICAgcmV0dXJuIChPYmplY3QpIHg7DQogIH0NCg0K
ICAvLyBOdW1lcmljYWwNCiAgcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnQg
YWRkKEJpZ0ludCBhLEJpZ0ludCBiKXsNCiAgICBCaWdJbnQgdG1wOw0KICAg
IEJpZ0ludCBjOw0KICAgIGludCBtLG47DQoNCiAgICBpZiAoYS5pc0Fic0xl
c3MoYikpIHsNCiAgICAgIHRtcD1iOw0KICAgICAgYj1hOw0KICAgICAgYT10
bXA7DQogICAgfQ0KICAgIC8vIHxBfCA+PSB8QnwNCg0KICAgIG09YS5sZW5n
dGg7DQogICAgbj1iLmxlbmd0aDsNCg0KICAgIGM9bmV3IEJpZ0ludCgpOw0K
DQogICAgaWYgKG0+MCkgew0KICAgICAgaWYgKG4+MCkgew0KCS8vIEE+MCwg
Qj4wDQoJYy5sZW5ndGg9bSsxOw0KCWMudmFsdWU9bmV3IGludFttKzFdOw0K
CWMudmFsdWVbbV09ZG9BZGQoYS52YWx1ZSwwLG0sYi52YWx1ZSwwLG4sYy52
YWx1ZSwwKTsNCiAgICAgIH0gZWxzZSB7DQoJLy8gQT4wLCBCPDANCgljLmxl
bmd0aD1tOw0KCWMudmFsdWU9bmV3IGludFttXTsNCglkb1N1YihhLnZhbHVl
LDAsbSxiLnZhbHVlLDAsLW4sYy52YWx1ZSwwKTsgLy8gTm8gQm9ycm93DQog
ICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIGlmIChuPjApIHsNCgkvLyBB
PDAsIEI+MA0KCWMubGVuZ3RoPW07DQoJYy52YWx1ZT1uZXcgaW50Wy1tXTsN
Cglkb1N1YihhLnZhbHVlLDAsLW0sYi52YWx1ZSwwLG4sYy52YWx1ZSwwKTsg
Ly8gTm8gQm9ycm93DQogICAgICB9IGVsc2Ugew0KCS8vIEE8MCwgQjwwDQog
CWMubGVuZ3RoPS0oLW0rMSk7DQogCWMudmFsdWU9bmV3IGludFstbSsxXTsN
CiAJYy52YWx1ZVstbV09ZG9BZGQoYS52YWx1ZSwwLC1tLGIudmFsdWUsMCwt
bixjLnZhbHVlLDApOw0KICAgICAgfQ0KICAgIH0NCiAgICBjLnRyaW0oKTsN
Cg0KICAgIHJldHVybiBjOw0KICB9DQoNCiAgcHVibGljIGZpbmFsIHZvaWQg
YWRkKEJpZ0ludCBiKXsNCiAgICB0aGlzLmFzc2lnbihCaWdJbnQuYWRkKHRo
aXMsYikpOw0KICB9DQoNCiAgcHVibGljIGZpbmFsIHZvaWQgYWRkKGludCBi
KXsNCiAgICBpbnQgY2Fycnk7DQogICAgaW50IG0saTsNCiAgICBpbnQgW10g
dGVtcDsNCg0KICAgIGlmIChiPT0tMjE0NzQ4MzY0OCkgew0KICAgICAgdGhp
cy5hZGQobmV3IEJpZ0ludChiKSk7DQogICAgICByZXR1cm47DQogICAgfQ0K
DQogICAgbT1NYXRoLmFicyhsZW5ndGgpOw0KDQogICAgaWYgKGI+MCkgew0K
ICAgICAgY2Fycnk9ZG9BZGQodmFsdWUsMCxtLGIsdmFsdWUsMCk7DQogICAg
ICBpZiAoY2FycnkhPTApIHsNCglpZiAobTx2YWx1ZS5sZW5ndGgpew0KCSAg
dmFsdWVbbV09Y2Fycnk7CQ0KCX0gZWxzZSB7DQoJICB0ZW1wPW5ldyBpbnRb
bSsxXTsNCgkgIC8vIGZvciAoaT0wO2k8bTtpKyspICB0ZW1wW2ldPXZhbHVl
W2ldOw0KCSAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZSwwLHRlbXAsMCxtKTsN
CgkgIHRlbXBbbV09Y2Fycnk7DQoJICB2YWx1ZT10ZW1wOw0KCX0NCglpZiAo
bGVuZ3RoPDApDQoJICBsZW5ndGgtLTsNCgllbHNlDQoJICBsZW5ndGgrKzsN
CiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgY2Fycnk9ZG9TdWIodmFs
dWUsMCxtLC1iLHZhbHVlLDApOw0KICAgICAgaWYgKGNhcnJ5PT0wKSB7IC8v
IEJvcnJvdywgdGhpcyBCaWdJbnQgaXMgdGhlbiA8YiBpZS4gdmVyeSBzbWFs
bC4NCgl2YWx1ZVswXT1iLXZhbHVlWzBdOw0KCWxlbmd0aD0tMTsNCiAgICAg
IH0NCiAgICB9DQogICAgdHJpbSgpOw0KICB9DQoNCiAgcHVibGljIHN0YXRp
YyBmaW5hbCBCaWdJbnQgc3ViKEJpZ0ludCBhLEJpZ0ludCBiKXsNCiAgICBC
aWdJbnQgdG1wOw0KICAgIEJpZ0ludCBjOw0KICAgIGJvb2xlYW4gc3dhcHBl
ZDsNCiAgICBpbnQgbSxuOw0KDQogICAgc3dhcHBlZD1mYWxzZTsNCiAgICBp
ZiAoYS5pc0Fic0xlc3MoYikpIHsNCiAgICAgIHRtcD1iOw0KICAgICAgYj1h
Ow0KICAgICAgYT10bXA7DQogICAgICBzd2FwcGVkPXRydWU7DQogICAgfQ0K
ICAgIC8vIHxBfCA+PSB8QnwNCg0KDQogICAgbT1hLmxlbmd0aDsNCiAgICBu
PWIubGVuZ3RoOw0KDQogICAgYz1uZXcgQmlnSW50KCk7DQoNCiAgICBpZiAo
bT4wKSB7DQogICAgICBpZiAobj4wKSB7DQoJLy8gQT4wLCBCPjANCgljLmxl
bmd0aD1tOw0KCWMudmFsdWU9bmV3IGludFttXTsNCglkb1N1YihhLnZhbHVl
LDAsbSxiLnZhbHVlLDAsbixjLnZhbHVlLDApOyAvLyBObyBCb3Jyb3cNCiAg
ICAgIH0gZWxzZSB7DQoJLy8gQT4wLCBCPDANCgljLmxlbmd0aD1tKzE7DQoJ
Yy52YWx1ZT1uZXcgaW50W20rMV07DQoJYy52YWx1ZVttXT1kb0FkZChhLnZh
bHVlLDAsbSxiLnZhbHVlLDAsLW4sYy52YWx1ZSwwKTsNCiAgICAgIH0NCiAg
ICB9IGVsc2Ugew0KICAgICAgaWYgKG4+MCkgew0KCS8vIEE8MCwgQj4wDQog
CWMubGVuZ3RoPS0oLW0rMSk7DQogCWMudmFsdWU9bmV3IGludFstbSsxXTsN
CiAJYy52YWx1ZVstbV09ZG9BZGQoYS52YWx1ZSwwLC1tLGIudmFsdWUsMCxu
LGMudmFsdWUsMCk7DQogICAgICB9IGVsc2Ugew0KCS8vIEE8MCwgQjwwDQoJ
Yy5sZW5ndGg9bTsNCgljLnZhbHVlPW5ldyBpbnRbLW1dOw0KCWRvU3ViKGEu
dmFsdWUsMCwtbSxiLnZhbHVlLDAsLW4sYy52YWx1ZSwwKTsgLy8gTm8gQm9y
cm93DQogICAgICB9DQogICAgfQ0KICAgIGlmIChzd2FwcGVkKSB7DQogICAg
ICBjLmxlbmd0aD0tYy5sZW5ndGg7DQogICAgfQ0KDQogICAgYy50cmltKCk7
DQogICAgDQogICAgcmV0dXJuIGM7DQogIH0NCg0KICBwdWJsaWMgZmluYWwg
dm9pZCBzdWIoQmlnSW50IGIpIHsNCiAgICB0aGlzLmFzc2lnbihzdWIodGhp
cyxiKSk7DQogIH0NCg0KICBwdWJsaWMgZmluYWwgdm9pZCBzdWIoaW50IGIp
ew0KICAgIGlmIChiPT0tMjE0NzQ4MzY0OCkgDQogICAgICB0aGlzLnN1Yihu
ZXcgQmlnSW50KGIpKTsNCiAgICBlbHNlDQogICAgICB0aGlzLmFkZCgtYik7
DQogIH0NCg0KICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpZ0ludCBtdWx0KEJp
Z0ludCBhLEJpZ0ludCBiKSB7DQogICAgQmlnSW50IGM7DQogICAgaW50IGks
bSxuOw0KICAgIGludCBqOw0KICAgIGxvbmcgdGVtcCxjYXJyeSxtdWw7DQoN
CiAgICBtPU1hdGguYWJzKGEubGVuZ3RoKTsNCiAgICBuPU1hdGguYWJzKGIu
bGVuZ3RoKTsNCg0KICAgIGM9bmV3IEJpZ0ludCgpOw0KICAgIGMubGVuZ3Ro
PW0rbjsNCiAgICBjLnZhbHVlPSBuZXcgaW50W20rbl07DQoNCiAgICBmb3Ig
KGk9MDtpPG07aSsrKSB7DQogICAgICBjLnZhbHVlW2ldPTA7DQogICAgfQ0K
DQogICAgZm9yIChpPTA7aTxuO2krKykgew0KICAgICAgbXVsPWIudmFsdWVb
aV07DQoNCiAgICAgIGNhcnJ5PTA7DQogICAgICBmb3IgKGo9MDtqPG07aisr
KSB7DQoJdGVtcD0gKChsb25nKSBhLnZhbHVlW2pdKSptdWwgKyAoKGxvbmcp
Yy52YWx1ZVtqK2ldKSArIGNhcnJ5Ow0KCWMudmFsdWVbaitpXT0oaW50KSAo
dGVtcCAmICgoMTw8MzEpLTEpKTsNCgljYXJyeT10ZW1wPj4+MzE7DQogICAg
ICB9DQogICAgICANCiAgICAgIGMudmFsdWVbaSttXT0oaW50KSBjYXJyeTsN
CiAgICB9DQoNCiAgICAvLyBGaXggc2lnbjoNCiAgICBpZiAoYS5sZW5ndGg8
MCkgew0KICAgICAgYy5sZW5ndGg9LWMubGVuZ3RoOw0KICAgIH0NCiAgICBp
ZiAoYi5sZW5ndGg8MCkgew0KICAgICAgYy5sZW5ndGg9LWMubGVuZ3RoOw0K
ICAgIH0NCg0KICAgIGMudHJpbSgpOw0KICAgIHJldHVybiBjOw0KICB9DQoN
CiAgcHVibGljIGZpbmFsIHZvaWQgbXVsdChCaWdJbnQgYil7DQogICAgdGhp
cy5hc3NpZ24oQmlnSW50Lm11bHQodGhpcyxiKSk7DQogIH0NCg0KICBwdWJs
aWMgc3RhdGljIGZpbmFsIEJpZ0ludCBtdWx0KEJpZ0ludCBhLGludCBiKXsN
CiAgICBCaWdJbnQgYzsNCiAgICBpbnQgaSxqLG07DQoNCiAgICBpZiAoYj09
LTIxNDc0ODM2NDgpIHsNCiAgICAgIHJldHVybiBCaWdJbnQubXVsdChhLG5l
dyBCaWdJbnQoYikpOw0KICAgIH0NCg0KICAgIG09TWF0aC5hYnMoYS5sZW5n
dGgpOw0KDQogICAgYz1uZXcgQmlnSW50KCk7DQogICAgYy5sZW5ndGg9bSsx
Ow0KICAgIGMudmFsdWU9IG5ldyBpbnRbbSsxXTsNCg0KICAgIGMudmFsdWVb
bV09ZG9NdWx0KGEudmFsdWUsMCxtLE1hdGguYWJzKGIpLGMudmFsdWUsMCk7
DQoNCiAgICAvLyBGaXggc2lnbjoNCiAgICBpZiAoYS5sZW5ndGg8MCkNCiAg
ICAgIGMubGVuZ3RoPS1jLmxlbmd0aDsNCiAgICBpZiAoYjwwKSANCiAgICAg
IGMubGVuZ3RoPS1jLmxlbmd0aDsNCg0KICAgIGMudHJpbSgpOw0KICAgIHJl
dHVybiBjOw0KICB9DQoNCiAgcHVibGljIGZpbmFsIHZvaWQgbXVsdChpbnQg
Yil7DQogICAgaW50IGksaixtOw0KICAgIGludCBjYXJyeTsNCiAgICBpbnQg
W10gdGVtcDsNCg0KICAgIGlmIChiPT0tMjE0NzQ4MzY0OCkgew0KICAgICAg
dGhpcy5hc3NpZ24oQmlnSW50Lm11bHQodGhpcyxuZXcgQmlnSW50KGIpKSk7
DQogICAgICByZXR1cm47DQogICAgfQ0KDQogICAgbT1NYXRoLmFicyhsZW5n
dGgpOw0KICAgIGNhcnJ5PWRvTXVsdCh2YWx1ZSwwLG0sTWF0aC5hYnMoYiks
dmFsdWUsMCk7DQoNCiAgICBpZiAoY2FycnkhPTApIHsNCiAgICAgIGlmICht
PHZhbHVlLmxlbmd0aCl7DQoJdmFsdWVbbV09Y2Fycnk7CQ0KICAgICAgfSBl
bHNlIHsNCgl0ZW1wPW5ldyBpbnRbbSsxXTsNCgkvLyBmb3IgKGk9MDtpPG07
aSsrKSAgdGVtcFtpXT12YWx1ZVtpXTsNCglTeXN0ZW0uYXJyYXljb3B5KHZh
bHVlLDAsdGVtcCwwLG0pOw0KCXRlbXBbbV09Y2Fycnk7DQoJdmFsdWU9dGVt
cDsNCiAgICAgIH0NCiAgICAgIGlmIChsZW5ndGg8MCkNCglsZW5ndGgtLTsN
CiAgICAgIGVsc2UNCglsZW5ndGgrKzsNCiAgICB9DQoNCiAgICAvLyBGaXgg
c2lnbjoNCiAgICBpZiAoYjwwKSANCiAgICAgIGxlbmd0aD0tbGVuZ3RoOw0K
DQogICAgdHJpbSgpOw0KICB9DQoNCiAgLyoqIERpdmlzaW9uIGFuZCByZW1h
aW5kZXIsDQogICAgY2FsY3VsYXRlcyBxICYgciBzbyB0aGF0OiBhPXEqYity
LCB8cnw8fGJ8LCBzaWduKHIpPXNpZ24oYSkgDQogICAgKi8NCiAgcHVibGlj
IHN0YXRpYyBmaW5hbCBpbnQgZGl2cmVtKEJpZ0ludCBhLGludCBiLEJpZ0lu
dCBxT3V0KSANCiAgICAgICAgICAgICAgdGhyb3dzIEFyaXRobWV0aWNFeGNl
cHRpb24gew0KICAgIGxvbmcgcmVtOw0KICAgIGludCBtOw0KICAgIGludCBb
XSBxdW87DQoNCiAgICBpZiAoYj09MCkNCiAgICAgIHRocm93IG5ldyBBcml0
aG1ldGljRXhjZXB0aW9uKCJCaWdJbnQgZGl2aWRlIGJ5IFplcm8iKTsNCg0K
ICAgIGlmIChiPT0tMjE0NzQ4MzY0OCkgew0KICAgICAgLy8gVGhpcyBpcyBh
IG5vdCByZWFsbHkgYSBidWcsIHRoZW4gbmVnYXRpdmUgb2YgdGhpcyB2YWx1
ZSAgDQogICAgICAvLyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gYW4gaW50
ID0+IHJlbWFpbmRlciBjYW5ub3QgZWl0aGVyLg0KICAgICAgLy8gPT4gVXNl
IGxvbmctZGl2IQ0KICAgICAgdGhyb3cgbmV3IEFyaXRobWV0aWNFeGNlcHRp
b24oIkRpdmlzaW9uIGJ5IC0yMTQ3NDgzNjQ4Iik7DQogICAgfQ0KDQogICAg
bT1NYXRoLmFicyhhLmxlbmd0aCk7IA0KICAgIGlmICgocU91dC52YWx1ZT09
bnVsbCkgfHwgKHFPdXQudmFsdWUubGVuZ3RoPG0pKSB7DQogICAgICBxdW89
bmV3IGludFttXTsNCiAgICB9IGVsc2Ugew0KICAgICAgcXVvPXFPdXQudmFs
dWU7DQogICAgfQ0KDQogICAgcmVtPWRvRGl2KGEudmFsdWUsMCxtLE1hdGgu
YWJzKGIpLHF1bywwKTsNCg0KICAgIHFPdXQubGVuZ3RoPWEubGVuZ3RoOw0K
ICAgIHFPdXQudmFsdWU9cXVvOw0KDQogICAgaWYgKGI8MCkNCiAgICAgIHFP
dXQubGVuZ3RoPS1xT3V0Lmxlbmd0aDsNCiAgICANCiAgICBxT3V0LnRyaW0o
KTsNCiAgIA0KICAgIGlmIChhLmxlbmd0aD4wKSB7DQogICAgICByZXR1cm4g
KGludCkgcmVtOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gKGludCkg
LXJlbTsNCiAgICB9DQogIH0NCg0KICBwdWJsaWMgZmluYWwgaW50IGRpdnJl
bShpbnQgYikgDQogICAgICAgICAgICAgIHRocm93cyBBcml0aG1ldGljRXhj
ZXB0aW9uIHsNCiAgICBsb25nIHJlbTsNCiAgICBpbnQgbTsNCg0KICAgIGlm
IChiPT0wKQ0KICAgICAgdGhyb3cgbmV3IEFyaXRobWV0aWNFeGNlcHRpb24o
IkJpZ0ludCBkaXZpZGUgYnkgWmVybyIpOw0KDQogICAgaWYgKGI9PS0yMTQ3
NDgzNjQ4KSB7DQogICAgICAvLyBUaGlzIGlzIGEgbm90IHJlYWxseSBhIGJ1
ZywgdGhlbiBuZWdhdGl2ZSBvZiB0aGlzIHZhbHVlICANCiAgICAgIC8vIGNh
bm5vdCBiZSByZXByZXNlbnRlZCBpbiBhbiBpbnQgPT4gcmVtYWluZGVyIGNh
bm5vdCBlaXRoZXIuDQogICAgICAvLyA9PiBVc2UgbG9uZy1kaXYhDQogICAg
ICB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiRGl2aXNpb24gYnkg
LTIxNDc0ODM2NDgiKTsNCiAgICB9DQoNCiAgICBtPU1hdGguYWJzKGxlbmd0
aCk7IA0KICAgIHJlbT1kb0Rpdih2YWx1ZSwwLG0sTWF0aC5hYnMoYiksdmFs
dWUsMCk7DQoNCiAgICBpZiAoYjwwKQ0KICAgICAgbGVuZ3RoPS1sZW5ndGg7
DQogICAgDQogICAgdHJpbSgpOw0KICAgDQogICAgaWYgKGxlbmd0aD4wKSB7
DQogICAgICByZXR1cm4gKGludCkgcmVtOw0KICAgIH0gZWxzZSB7DQogICAg
ICByZXR1cm4gKGludCkgLXJlbTsNCiAgICB9DQogIH0NCg0KICAvKiogRGl2
aXNpb24gYW5kIHJlbWFpbmRlciwNCiAgICBjYWxjdWxhdGVzIHEgJiByIHNv
IHRoYXQ6IGE9cSpiK3IsIHxyfDx8YnwsIHNpZ24ocik9c2lnbihhKSANCiAg
ICANCiAgICBhIGdvb2QgdGVzdC1jYXNlOg0KICAgIDgyNzc4NDc2NzY0MTE2
NTQ5ODUxNDU0OTc3ODY3Nzc1OTk5LzQ5NTMyNTUwNjk3NTIwMzk0NzY2NjQ3
Mjk2MDANCiAgICA9PSAxNjcxMTkzNCwgNDk1MzI1NTA2OTc1MjAzOTQ3NjY2
NDcyOTU5OQ0KICAgIGV4ZXJjaXNlcyBzb21lIHNlbGRvbS11c2VkIHBhcnRz
IG9mIHRoZSBjb2RlDQogICAgKi8NCiAgcHVibGljIHN0YXRpYyBmaW5hbCB2
b2lkIGRpdnJlbShCaWdJbnQgYSxCaWdJbnQgYixCaWdJbnQgcU91dCwgQmln
SW50IHJPdXQpDQogICAgICAgdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24g
ew0KICAgIGludCBbXSB1Ow0KICAgIGludCBbXSB2Ow0KICAgIGludCBbXSBy
ZXM7DQogICAgaW50IGksaixtLG47DQogICAgbG9uZyB0ZW1wLHEscixkOw0K
DQogICAgaWYgKGIuaXNaZXJvKCkpDQogICAgICB0aHJvdyBuZXcgQXJpdGht
ZXRpY0V4Y2VwdGlvbigiQmlnSW50IGRpdmlkZSBieSBaZXJvIik7DQoNCiAg
ICBpZiAoYT09Yikgew0KICAgICAgcU91dC5hc3NpZ24obmV3IEJpZ0ludCgx
KSk7DQogICAgICByT3V0LmFzc2lnbihuZXcgQmlnSW50KDApKTsNCiAgICAg
IHJldHVybjsNCiAgICB9DQoNCiAgICBpZiAoYi5sZW5ndGg9PTEpIHsNCiAg
ICAgIGk9ZGl2cmVtKGEsYi52YWx1ZVswXSxxT3V0KTsNCiAgICAgIHJPdXQu
YXNzaWduKG5ldyBCaWdJbnQoaSkpOw0KICAgICAgcmV0dXJuOw0KICAgIH0N
CiAgICBpZiAoYi5sZW5ndGg9PS0xKSB7DQogICAgICBpPWRpdnJlbShhLC1i
LnZhbHVlWzBdLHFPdXQpOw0KICAgICAgck91dC5hc3NpZ24obmV3IEJpZ0lu
dChpKSk7DQogICAgICByZXR1cm47DQogICAgfQ0KDQogICAgaWYgKGEuaXNB
YnNMZXNzKGIpKSB7IC8qIGEvYj0wIGElYj1hICovDQogICAgICBxT3V0LmFz
c2lnbihuZXcgQmlnSW50KDApKTsNCiAgICAgIHJPdXQuYXNzaWduKGEpOw0K
ICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIG09TWF0aC5hYnMoYS5sZW5n
dGgpOw0KICAgIG49TWF0aC5hYnMoYi5sZW5ndGgpOw0KDQogICAgdSA9IG5l
dyBpbnRbbSsxXTsNCiAgICB2ID0gbmV3IGludFtuXTsNCiAgICByZXMgPSBu
ZXcgaW50W20tbisxXTsNCiAgICANCiAgICAvKiBDYWxjdWxhdGUgZDogKi8N
CiAgICBkPSgxTDw8MzEpLygobG9uZyliLnZhbHVlW24tMV0rMSk7DQogICAg
DQogICAgaWYgKGQhPTEpIHsNCiAgICAgIC8qIHU9dSpkICovDQogICAgICB1
W21dPWRvTXVsdChhLnZhbHVlLDAsbSwoaW50KWQsdSwwKTsNCg0KICAgICAg
Lyogdj12KmQgKi8NCiAgICAgIGRvTXVsdChiLnZhbHVlLDAsbiwoaW50KWQs
diwwKTsgLy8gTmV2ZXIgYW55IGNhcnJ5DQogICAgfSBlbHNlIHsNCiAgICAg
IGZvciAoaT0wO2k8bTtpKyspIHsNCgl1W2ldPWEudmFsdWVbaV07DQogICAg
ICB9DQogICAgICB1W21dPTA7DQogICAgICBmb3IgKGk9MDtpPG47aSsrKSB7
DQoJdltpXT1iLnZhbHVlW2ldOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIA0K
ICAgIC8qIExvb3AgKi8NCiAgICBmb3IgKGo9bTtqPj1uO2otLSkgew0KICAg
ICAgLyogZ3Vlc3MgcV46ICovDQoNCiAgICAgIHRlbXA9KCgobG9uZyl1W2pd
KTw8MzEpKygobG9uZyl1W2otMV0pOw0KICAgICAgaWYgKHVbal09PXZbbi0x
XSkgew0KCXE9KDFMPDwzMSktMTsNCglyPXVbai0xXSt2W24tMV07DQoJU3lz
dGVtLm91dC5wcmludGxuKCJHdWVzc2VkIHFePWItMT0iK3EpOw0KICAgICAg
fSBlbHNlIHsNCglxPXRlbXAvdltuLTFdOw0KCXI9dGVtcCV2W24tMV07DQog
ICAgICB9DQogICAgICANCiAgICAgIHdoaWxlICggKCgobG9uZyl2W24tMl0p
KnEpID4gKChyPDwzMSkrdVtqLTJdKSkgew0KCXEtLTsNCglyKz12W24tMV07
DQogICAgICB9DQogICAgICANCiAgICAgIC8qIG11bHRpcGx5IGFuZCBzdWJ0
cmFjdCB1W2ouLmotbl0tcV4qdltuLTEuLjBdOyAqLw0KICAgICAgaWYgKEJp
Z0ludC5kb011bHRTdWIodSxqLW4sbisxLHYsMCxuLChpbnQpIHEpPT0wKSB7
DQoJLy8gcSB3YXMgdG8gbGFyZ2UNCglxLS07DQoJLy8gYWRkIDAudltuLTEu
LjBdIHRvIHVbai4uai1uXQ0KCWRvQWRkKHUsai1uLG4rMSx2LDAsbix1LGot
bik7IC8vIElnbm9yZSBjYXJyeSwgaXQgY2FuY2VscyB0aGUgYm9ycm93DQoJ
U3lzdGVtLm91dC5wcmludGxuKCJZZWFoISBUcmllZCBoYXJkIHBhcnQiKTsN
CiAgICAgIH0NCiAgICAgIHJlc1tqLW5dPShpbnQpIHE7DQogICAgfQ0KDQog
ICAgcU91dC52YWx1ZT1yZXM7DQogICAgcU91dC5sZW5ndGg9bS1uKzE7DQog
ICAgaWYgKGEubGVuZ3RoPDApDQogICAgICBxT3V0Lmxlbmd0aD0tcU91dC5s
ZW5ndGg7DQogICAgaWYgKGIubGVuZ3RoPDApDQogICAgICBxT3V0Lmxlbmd0
aD0tcU91dC5sZW5ndGg7DQoNCiAgICBxT3V0LnRyaW0oKTsNCg0KICAgIGlm
IChhLmxlbmd0aD4wKSB7DQogICAgICByT3V0Lmxlbmd0aD1uOw0KICAgIH0g
ZWxzZSB7DQogICAgICByT3V0Lmxlbmd0aD0tbjsNCiAgICB9DQogICAgck91
dC52YWx1ZT1uZXcgaW50W25dOw0KICAgIGlmIChkb0Rpdih1LDAsbiwoaW50
KWQsck91dC52YWx1ZSwwKSE9MCkgew0KICAgICAgU3lzdGVtLm91dC5wcmlu
dGxuKCJEaXYgRXJyb3I6IHJlbWFpbmRlciB3YXMgbm90IG11bHRpcGxlIG9m
IGQhISIpOw0KICAgIH0NCiAgICByT3V0LnRyaW0oKTsNCiAgfQ0KDQogIHB1
YmxpYyBmaW5hbCBCaWdJbnQgZGl2KEJpZ0ludCBiKSB0aHJvd3MgQXJpdGht
ZXRpY0V4Y2VwdGlvbiB7DQogICAgQmlnSW50IHEscjsNCiAgICByPW5ldyBC
aWdJbnQoKTsNCiAgICBCaWdJbnQuZGl2cmVtKHRoaXMsYix0aGlzLHIpOw0K
ICAgIHJldHVybiByOw0KICB9DQoNCiAgcHVibGljIHN0YXRpYyBmaW5hbCBC
aWdJbnQgcmVtKEJpZ0ludCBhLEJpZ0ludCBiKSB0aHJvd3MgQXJpdGhtZXRp
Y0V4Y2VwdGlvbnsNCiAgICBCaWdJbnQgcSxyOw0KICAgIHE9bmV3IEJpZ0lu
dCgpOw0KICAgIHI9bmV3IEJpZ0ludCgpOw0KICAgIEJpZ0ludC5kaXZyZW0o
YSxiLHEscik7DQogICAgcmV0dXJuIHI7DQogIH0NCg0KICBwdWJsaWMgZmlu
YWwgQmlnSW50IHBvdyhCaWdJbnQgYikgdGhyb3dzIEFyaXRobWV0aWNFeGNl
cHRpb24gew0KICAgIC8vIE5vdCBJbXBsZW1lbnRlZA0KICAgIHJldHVybiBu
ZXcgQmlnSW50KCk7DQogIH0NCg0KICBwdWJsaWMgc3RhdGljIGZpbmFsIEJp
Z0ludCBhYnMoQmlnSW50IGEpIHsNCiAgICBCaWdJbnQgeDsNCiAgICB4PShC
aWdJbnQpIGEuY2xvbmUoKTsNCiAgICBpZiAoeC5sZW5ndGg8MCkNCiAgICAg
IHgubGVuZ3RoPS14Lmxlbmd0aDsNCiAgICByZXR1cm4geDsNCiAgfQ0KDQog
IHB1YmxpYyBmaW5hbCB2b2lkIGFicygpIHsNCiAgICBpZiAobGVuZ3RoPDAp
DQogICAgICBsZW5ndGg9LWxlbmd0aDsNCiAgfQ0KDQogIHB1YmxpYyBzdGF0
aWMgZmluYWwgQmlnSW50IG5lZyhCaWdJbnQgYSkgew0KICAgIEJpZ0ludCB4
Ow0KICAgIHg9KEJpZ0ludCkgYS5jbG9uZSgpOw0KICAgIHgubGVuZ3RoPS14
Lmxlbmd0aDsNCiAgICByZXR1cm4geDsNCiAgfQ0KDQogIHB1YmxpYyBmaW5h
bCB2b2lkIG5lZygpIHsNCiAgICBsZW5ndGg9LWxlbmd0aDsNCiAgfQ0KDQog
IHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50IHNpZ24oQmlnSW50IGEpIHsN
CiAgICBpZiAoYS5sZW5ndGg+MCkNCiAgICAgIHJldHVybiBuZXcgQmlnSW50
KDEpOw0KICAgIGVsc2UNCiAgICAgIHJldHVybiBuZXcgQmlnSW50KC0xKTsN
CiAgfQ0KDQogIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7DQog
ICAgaW50IGksaixzdGFydCxsZW47DQogICAgY2hhciBbXSBidWZmZXI7DQog
ICAgY2hhciB0ZW1wOw0KICAgIEJpZ0ludCByZXN0Ow0KICAgIGludCBkaWdp
dHM7DQogICAgYm9vbGVhbiBmaW5pc2hlZDsNCg0KICAgIGlmIChpc1plcm8o
KSkgew0KICAgICAgcmV0dXJuICIwIjsNCiAgICB9DQogICAgDQogICAgYnVm
ZmVyPSBuZXcgY2hhclsxMCpNYXRoLmFicyhsZW5ndGgpKzFdOw0KDQogICAg
aT0wOw0KDQogICAgaWYgKGxlbmd0aDwwKSB7DQogICAgICBidWZmZXJbaSsr
XT0nLSc7DQogICAgfQ0KICAgIHN0YXJ0PWk7DQoNCiAgICByZXN0PShCaWdJ
bnQpIHRoaXMuY2xvbmUoKTsNCiAgICByZXN0LmFicygpOw0KICAgIGRvIHsN
CiAgICAgIGRpZ2l0cz1CaWdJbnQuZGl2cmVtKHJlc3QsMTAwMDAwMDAwMCxy
ZXN0KTsNCiAgICAgIGZpbmlzaGVkPXJlc3QuaXNaZXJvKCk7DQogICAgICBp
ZiAoZmluaXNoZWQpIHsNCgl3aGlsZSAoZGlnaXRzIT0wKSB7DQoJICBidWZm
ZXJbaSsrXT0oY2hhcikgKCcwJytkaWdpdHMlMTApOw0KCSAgZGlnaXRzLz0x
MDsNCgl9DQogICAgICB9IGVsc2Ugew0KCWZvciAoaj0wO2o8OTtqKyspIHsN
CgkgIGJ1ZmZlcltpKytdPShjaGFyKSAoJzAnK2RpZ2l0cyUxMCk7DQoJICBk
aWdpdHMvPTEwOw0KCX0NCiAgICAgIH0NCiAgICB9IHdoaWxlKCFmaW5pc2hl
ZCk7DQogICAgbGVuPWktc3RhcnQ7DQogICAgZm9yIChpPTA7aTwobGVuLzIp
O2krKykgew0KICAgICAgdGVtcD1idWZmZXJbc3RhcnQraV07DQogICAgICBi
dWZmZXJbc3RhcnQraV09YnVmZmVyW3N0YXJ0K2xlbi0xLWldOw0KICAgICAg
YnVmZmVyW3N0YXJ0K2xlbi0xLWldPXRlbXA7DQogICAgfQ0KICAgIHJldHVy
biBuZXcgU3RyaW5nKGJ1ZmZlciwwLHN0YXJ0K2xlbik7DQogIH0NCg0KICBw
dWJsaWMgZmluYWwgU3RyaW5nIHRvSGV4U3RyaW5nKCkgew0KICAgIGludCBp
LGxlbjsNCg0KICAgIFN0cmluZ0J1ZmZlciByZXM7DQogICAgcmVzID0gbmV3
IFN0cmluZ0J1ZmZlcigpOw0KDQogICAgbGVuPU1hdGguYWJzKGxlbmd0aCk7
DQogICAgaWYgKGxlbmd0aDwwKSANCiAgICAgIHJlcy5hcHBlbmQoJy0nKTsN
Cg0KICAgIGZvciAoaT1sZW4tMTtpPj0wO2ktLSkgew0KICAgICAgcmVzLmFw
cGVuZCgiMHgiK0ludGVnZXIudG9TdHJpbmcodmFsdWVbaV0sMTYpKTsNCiAg
ICAgIGlmIChpPjApIA0KCXJlcy5hcHBlbmQoJywnKTsNCiAgICB9DQogICAg
cmV0dXJuIHJlcy50b1N0cmluZygpOw0KICB9DQoNCiAgLy8gQm9vbGVhbg0K
ICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1plcm8oKSB7DQogICAgaWYgKGxl
bmd0aCE9MSkNCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICByZXR1cm4gKHZh
bHVlWzBdPT0wKTsNCiAgfQ0KICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc09u
ZSgpIHsNCiAgICBpZiAobGVuZ3RoIT0xKQ0KICAgICAgcmV0dXJuIGZhbHNl
Ow0KICAgIHJldHVybiAodmFsdWVbMF09PTEpOw0KICB9DQogIHB1YmxpYyBm
aW5hbCBib29sZWFuIGlzUG9zaXRpdmUoKSB7DQogICAgcmV0dXJuIChsZW5n
dGg+MCk7DQogIH0NCiAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNOZWdhdGl2
ZSgpIHsNCiAgICByZXR1cm4gKGxlbmd0aDwwKTsNCiAgfQ0KICBwdWJsaWMg
ZmluYWwgYm9vbGVhbiBpc0xlc3MoQmlnSW50IGIpIHsNCiAgICByZXR1cm4g
IWlzR3JlYXRlck9yRXF1YWwoYik7DQogIH0NCiAgcHVibGljIGZpbmFsIGJv
b2xlYW4gaXNMZXNzT3JFcXVhbChCaWdJbnQgYikgew0KICAgIHJldHVybiAh
aXNHcmVhdGVyKGIpOw0KICB9DQogIHB1YmxpYyBmaW5hbCBib29sZWFuIGlz
R3JlYXRlcihCaWdJbnQgYikgew0KICAgIGludCBpOw0KICAgIGludCBtLG47
DQogICAgbT10aGlzLmxlbmd0aDsNCiAgICBuPWIubGVuZ3RoOw0KDQogICAg
aWYgKChtPDApICYmIChuPDApKSB7DQogICAgICBpZiAobT5uKQ0KCXJldHVy
biBmYWxzZTsNCiAgICAgIGlmIChtPG4pDQoJcmV0dXJuIHRydWU7DQogICAg
ICAvLyBtPT1uLCBuZWdhdGl2ZQ0KDQogICAgICBpPW0tMTsNCiAgICAgIHdo
aWxlICgoaT4wKSAmJiAodGhpcy52YWx1ZVtpXT09Yi52YWx1ZVtpXSkpIA0K
CWktLTsNCiAgICAgIHJldHVybiAodGhpcy52YWx1ZVtpXTxiLnZhbHVlW2ld
KTsNCg0KICAgIH0gZWxzZSB7DQogICAgICBpZiAobT5uKQ0KCXJldHVybiB0
cnVlOw0KICAgICAgaWYgKG08bikNCglyZXR1cm4gZmFsc2U7DQogICAgICAv
LyBtPT1uLCBwb3NpdGl2ZQ0KICAgICAgDQogICAgICBpPW0tMTsNCiAgICAg
IHdoaWxlICgoaT4wKSAmJiAodGhpcy52YWx1ZVtpXT09Yi52YWx1ZVtpXSkp
IA0KCWktLTsNCiAgICAgIHJldHVybiAodGhpcy52YWx1ZVtpXT5iLnZhbHVl
W2ldKTsNCiAgICB9DQogIH0NCg0KICBwdWJsaWMgZmluYWwgYm9vbGVhbiBp
c0dyZWF0ZXJPckVxdWFsKEJpZ0ludCBiKSB7DQogICAgaW50IGk7DQogICAg
aW50IG0sbjsNCiAgICBtPXRoaXMubGVuZ3RoOw0KICAgIG49Yi5sZW5ndGg7
DQoNCiAgICBpZiAoKG08MCkgJiYgKG48MCkpIHsNCiAgICAgIGlmIChtPm4p
DQoJcmV0dXJuIGZhbHNlOw0KICAgICAgaWYgKG08bikNCglyZXR1cm4gdHJ1
ZTsNCiAgICAgIC8vIG09PW4sIG5lZ2F0aXZlDQoNCiAgICAgIGk9bS0xOw0K
ICAgICAgd2hpbGUgKChpPjApICYmICh0aGlzLnZhbHVlW2ldPT1iLnZhbHVl
W2ldKSkgDQoJaS0tOw0KICAgICAgcmV0dXJuICh0aGlzLnZhbHVlW2ldPD1i
LnZhbHVlW2ldKTsNCg0KICAgIH0gZWxzZSB7DQogICAgICBpZiAobT5uKQ0K
CXJldHVybiB0cnVlOw0KICAgICAgaWYgKG08bikNCglyZXR1cm4gZmFsc2U7
DQogICAgICAvLyBtPT1uLCBwb3NpdGl2ZQ0KICAgICAgDQogICAgICBpPW0t
MTsNCiAgICAgIHdoaWxlICgoaT4wKSAmJiAodGhpcy52YWx1ZVtpXT09Yi52
YWx1ZVtpXSkpIA0KCWktLTsNCiAgICAgIHJldHVybiAodGhpcy52YWx1ZVtp
XT49Yi52YWx1ZVtpXSk7DQogICAgfQ0KICB9DQogIHB1YmxpYyBmaW5hbCBi
b29sZWFuIGlzQWJzTGVzcyhCaWdJbnQgYikgew0KICAgIHJldHVybiAhaXNB
YnNHcmVhdGVyT3JFcXVhbChiKTsNCiAgfQ0KICBwdWJsaWMgZmluYWwgYm9v
bGVhbiBpc0Fic0xlc3NPckVxdWFsKEJpZ0ludCBiKSB7DQogICAgcmV0dXJu
ICFpc0Fic0dyZWF0ZXIoYik7DQogIH0NCiAgcHVibGljIGZpbmFsIGJvb2xl
YW4gaXNBYnNHcmVhdGVyKEJpZ0ludCBiKSB7DQogICAgaW50IGk7DQogICAg
aW50IG0sbjsNCiAgICBtPU1hdGguYWJzKHRoaXMubGVuZ3RoKTsNCiAgICBu
PU1hdGguYWJzKGIubGVuZ3RoKTsNCg0KICAgIGlmIChtPm4pDQogICAgICBy
ZXR1cm4gdHJ1ZTsNCiAgICBpZiAobTxuKQ0KICAgICAgcmV0dXJuIGZhbHNl
Ow0KICAgIC8vIG09PW4NCg0KICAgIGk9bS0xOw0KICAgIHdoaWxlICgoaT4w
KSAmJiAodGhpcy52YWx1ZVtpXT09Yi52YWx1ZVtpXSkpIA0KICAgICAgaS0t
Ow0KICAgIHJldHVybiAodGhpcy52YWx1ZVtpXT5iLnZhbHVlW2ldKTsNCiAg
fQ0KDQogIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWJzR3JlYXRlck9yRXF1
YWwoQmlnSW50IGIpIHsNCiAgICBpbnQgaTsNCiAgICBpbnQgbSxuOw0KICAg
IG09TWF0aC5hYnModGhpcy5sZW5ndGgpOw0KICAgIG49TWF0aC5hYnMoYi5s
ZW5ndGgpOw0KDQogICAgaWYgKG0+bikNCiAgICAgIHJldHVybiB0cnVlOw0K
ICAgIGlmIChtPG4pDQogICAgICByZXR1cm4gZmFsc2U7DQogICAgLy8gbT09
bg0KDQogICAgaT1tLTE7DQogICAgd2hpbGUgKChpPjApICYmICh0aGlzLnZh
bHVlW2ldPT1iLnZhbHVlW2ldKSkgDQogICAgICBpLS07DQogICAgcmV0dXJu
ICh0aGlzLnZhbHVlW2ldPj1iLnZhbHVlW2ldKTsNCiAgfQ0KDQogIHB1Ymxp
YyBmaW5hbCBib29sZWFuIGlzRXF1YWwoQmlnSW50IGIpIHsNCiAgICBpbnQg
bSxuLGk7DQogICAgbT10aGlzLmxlbmd0aDsNCiAgICBuPWIubGVuZ3RoOw0K
DQogICAgaWYgKG0hPW4pDQogICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICBt
PU1hdGguYWJzKG0pOw0KICAgDQogICAgZm9yIChpPW0tMTtpPj0wO2ktLSkg
ew0KICAgICAgaWYgKHRoaXMudmFsdWVbaV0hPWIudmFsdWVbaV0pDQoJcmV0
dXJuIGZhbHNlOw0KICAgIH0NCiAgICByZXR1cm4gdHJ1ZTsNCiAgfQ0KDQov
LyBQcml2YXRlIENvbnN0cnVjdG9ycw0KICBwcml2YXRlIEJpZ0ludCgpIHsN
CiAgICAvLyBFbXB0eSBjb25zdHJ1Y3Rvci4NCiAgfQ0KLy8gUHJpdmF0ZSBD
bGFzcyBmdW5jdGlvbnMNCiAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IGRv
QWRkKGludCBbXSBhLGludCBhc3RhcnQsaW50IGFsZW4sDQoJICAgICAgICAg
ICAgICAgICAgICBpbnQgW10gYixpbnQgYnN0YXJ0LGludCBibGVuLA0KCQkJ
ICAgIGludCBbXSBjLGludCBjc3RhcnQpIHsNCiAgICAvLyBhZGRzIG51bWJl
cnMsIGFsZW4+PWJsZW4uIHJldHVybnMgY2FycnkNCiAgICAvLyBjIG11c3Qg
aGF2ZSBzcGFjZSBmb3IgYWxlbiBkaWdpdHMuDQogICAgLy8gTm90ZTogaXRz
IG9rIGZvciBhIGFuZCBjIHRvIGJlIGVxdWFsIGlmZiBjc3RhcnQ8PWFzdGFy
dA0KICAgIGludCBpOw0KICAgIGxvbmcgY2FycnksdGVtcDsNCg0KICAgIGNh
cnJ5PTA7DQogICAgZm9yIChpPTA7aTxibGVuO2krKykgew0KICAgICAgdGVt
cD0oKGxvbmcpYVtpK2FzdGFydF0pKygobG9uZyliW2krYnN0YXJ0XSkrY2Fy
cnk7DQogICAgICBjW2krY3N0YXJ0XT0oaW50KSAodGVtcCAmICgoMTw8MzEp
LTEpKTsNCiAgICAgIGNhcnJ5PXRlbXA+PjMxOw0KICAgIH0NCiAgICBmb3Ig
KDtpPGFsZW47aSsrKSB7DQogICAgICB0ZW1wPSgobG9uZylhW2krYXN0YXJ0
XSkrY2Fycnk7DQogICAgICBjW2krY3N0YXJ0XT0oaW50KSAodGVtcCAmICgo
MTw8MzEpLTEpKTsNCiAgICAgIGNhcnJ5PXRlbXA+PjMxOw0KICAgIH0NCiAg
ICByZXR1cm4gKGludCkgY2Fycnk7DQogIH0NCg0KICBwcml2YXRlIGZpbmFs
IHN0YXRpYyBpbnQgZG9BZGQoaW50IFtdIGEsaW50IGFzdGFydCxpbnQgYWxl
bixpbnQgYiwNCgkJCSAgICBpbnQgW10gYyxpbnQgY3N0YXJ0KSB7DQogICAg
Ly8gYWRkcyBudW1iZXJzLiByZXR1cm5zIGNhcnJ5DQogICAgLy8gYyBtdXN0
IGhhdmUgc3BhY2UgZm9yIGFsZW4gZGlnaXRzLg0KICAgIC8vIE5vdGU6IGl0
cyBvayBmb3IgYSBhbmQgYyB0byBiZSBlcXVhbCBpZmYgY3N0YXJ0PD1hc3Rh
cnQNCiAgICBpbnQgaTsNCiAgICBsb25nIGNhcnJ5LHRlbXA7DQoNCiAgICB0
ZW1wPSgobG9uZylhW2FzdGFydF0pKyhsb25nKWI7DQogICAgY1tjc3RhcnRd
PShpbnQpICh0ZW1wICYgKCgxPDwzMSktMSkpOw0KICAgIGNhcnJ5PXRlbXA+
PjMxOw0KICAgIGZvciAoaT0xO2k8YWxlbjtpKyspIHsNCiAgICAgIHRlbXA9
KChsb25nKWFbaSthc3RhcnRdKStjYXJyeTsNCiAgICAgIGNbaStjc3RhcnRd
PShpbnQpICh0ZW1wICYgKCgxPDwzMSktMSkpOw0KICAgICAgY2Fycnk9dGVt
cD4+MzE7DQogICAgfQ0KICAgIHJldHVybiAoaW50KSBjYXJyeTsNCiAgfQ0K
DQogIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBkb1N1YihpbnQgW10gYSxp
bnQgYXN0YXJ0LGludCBhbGVuLA0KCSAgICAgICAgICAgICAgICAgICAgaW50
IFtdIGIsaW50IGJzdGFydCxpbnQgYmxlbiwNCgkJCSAgICBpbnQgW10gYyxp
bnQgY3N0YXJ0KSB7DQogICAgLy8gc3VidHJhY3RzIG51bWJlcnMsIGFsZW4+
PWJsZW4uDQogICAgLy8gcmV0dXJucyBib3Jyb3cuICgxPXBvc2l0aXZlIHJl
c3VsdCwgMD1uZWdhdGl2ZSwoYyBpcyAyLWNvbXBsZW1lbnQpDQogICAgLy8g
YyBtdXN0IGhhdmUgc3BhY2UgZm9yIGFsZW4gZGlnaXRzLg0KICAgIC8vIE5v
dGU6IGl0cyBvayBmb3IgYSBhbmQgYyB0byBiZSBlcXVhbCBpZmYgY3N0YXJ0
PD1hc3RhcnQNCiAgICANCiAgICBpbnQgaTsNCiAgICBsb25nIGJvcnJvdyx0
ZW1wOw0KDQogICAgYm9ycm93PTE7DQogICAgZm9yIChpPTA7aTxibGVuO2kr
Kykgew0KICAgICAgdGVtcD0oKGxvbmcpYVtpK2FzdGFydF0pLSgobG9uZyli
W2krYnN0YXJ0XSkrYm9ycm93KygxTDw8MzEpLTE7DQogICAgICBjW2krY3N0
YXJ0XT0oaW50KSAodGVtcCAmICgoMTw8MzEpLTEpKTsNCiAgICAgIGJvcnJv
dz10ZW1wPj4zMTsNCiAgICB9DQogICAgZm9yICg7aTxhbGVuO2krKykgew0K
ICAgICAgdGVtcD1hW2krYXN0YXJ0XStib3Jyb3crKDFMPDwzMSktMTsNCiAg
ICAgIGNbaStjc3RhcnRdPShpbnQpICh0ZW1wICYgKCgxPDwzMSktMSkpOw0K
ICAgICAgYm9ycm93PXRlbXA+PjMxOw0KICAgIH0NCg0KICAgIHJldHVybiAo
aW50KSBib3Jyb3c7DQogIH0NCg0KICBwcml2YXRlIGZpbmFsIHN0YXRpYyBp
bnQgZG9TdWIoaW50IFtdIGEsaW50IGFzdGFydCxpbnQgYWxlbixpbnQgYiwN
CgkJCSAgICBpbnQgW10gYyxpbnQgY3N0YXJ0KSB7DQogICAgLy8gYWRkcyBu
dW1iZXJzLiByZXR1cm5zIGJvcnJvdyAoMD1ib3Jyb3csMT1ubyBib3Jyb3cp
DQogICAgLy8gYyBtdXN0IGhhdmUgc3BhY2UgZm9yIGFsZW4gZGlnaXRzLg0K
ICAgIC8vIE5vdGU6IGl0cyBvayBmb3IgYSBhbmQgYyB0byBiZSBlcXVhbCBp
ZmYgY3N0YXJ0PD1hc3RhcnQNCiAgICBpbnQgaTsNCiAgICBsb25nIGJvcnJv
dyx0ZW1wOw0KDQogICAgdGVtcD0oKGxvbmcpYVthc3RhcnRdKS0oKGxvbmcp
YikrMSsoMUw8PDMxKS0xOw0KICAgIGNbY3N0YXJ0XT0oaW50KSAodGVtcCAm
ICgoMTw8MzEpLTEpKTsNCiAgICBib3Jyb3c9dGVtcD4+MzE7DQogICAgZm9y
IChpPTE7aTxhbGVuO2krKykgew0KICAgICAgdGVtcD0oKGxvbmcpYVtpK2Fz
dGFydF0pK2JvcnJvdysoMUw8PDMxKS0xOw0KICAgICAgY1tpK2NzdGFydF09
KGludCkgKHRlbXAgJiAoKDE8PDMxKS0xKSk7DQogICAgICBib3Jyb3c9dGVt
cD4+MzE7DQogICAgfQ0KICAgIHJldHVybiAoaW50KSBib3Jyb3c7DQogIH0N
Cg0KICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgZG9NdWx0KGludCBbXSBh
LGludCBhc3RhcnQsaW50IGFsZW4saW50IGIsDQoJCQkJICBpbnQgW10gYyxp
bnQgY3N0YXJ0KSB7DQogICAgLy8gQz1BKmIsIGI+MCwgbWF5IG92ZXJsYXAg
aWZmIGNzdGFydDw9YXN0YXJ0DQogICAgLy8gYyBtdXN0IGhhdmUgc3BhY2Ug
Zm9yIGFsZW4gZGlnaXRzDQogICAgLy8gY2FycnkgaXMgcmV0dXJuZWQNCiAg
ICBpbnQgaTsNCiAgICBsb25nIHRlbXAsY2Fycnk7DQogICAgbG9uZyBkOw0K
DQogICAgZD1iOw0KDQogICAgY2Fycnk9MDsNCiAgICBmb3IgKGk9MDtpPGFs
ZW47aSsrKSB7DQogICAgICB0ZW1wPSAoKGxvbmcpIGFbaSthc3RhcnRdKSpk
ICsgY2Fycnk7DQogICAgICBjW2krY3N0YXJ0XT0oaW50KSAodGVtcCAmICgo
MUw8PDMxKS0xKSk7DQogICAgICBjYXJyeT10ZW1wPj4+MzE7DQogICAgfQ0K
ICAgIHJldHVybiAoaW50KSBjYXJyeTsNCiAgfQ0KDQogIHByaXZhdGUgZmlu
YWwgc3RhdGljIGludCBkb0RpdihpbnQgW10gYSxpbnQgYXN0YXJ0LGludCBh
bGVuLGludCBiLA0KCQkJCSBpbnQgW10gYyxpbnQgY3N0YXJ0KSB7DQogICAg
Ly8gQz1BL2IsIGI+MCwgbWF5IG92ZXJsYXAgaWZmIGNzdGFydD49YXN0YXJ0
DQogICAgLy8gYyBtdXN0IGhhdmUgc3BhY2UgZm9yIGFsZW4gZGlnaXRzDQog
ICAgLy8gcmVtYWluZGVyIGlzIHJldHVybmVkDQogICAgaW50IGk7DQogICAg
bG9uZyB0ZW1wLGNhcnJ5Ow0KICAgIGxvbmcgZDsNCg0KICAgIGQ9YjsNCg0K
ICAgIGNhcnJ5PTA7DQogICAgZm9yIChpPWFsZW4tMTtpPj0wO2ktLSkgew0K
ICAgICAgdGVtcD0gKGNhcnJ5PDwzMSkgKyAoKGxvbmcpIGFbaSthc3RhcnRd
KTsNCiAgICAgIGNbaStjc3RhcnRdPShpbnQpICh0ZW1wL2QpOw0KICAgICAg
Y2Fycnk9dGVtcCVkOw0KICAgIH0NCiAgICByZXR1cm4gKGludCkgY2Fycnk7
DQogIH0NCg0KICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgZG9NdWx0QWRk
KGludCBbXSBhLGludCBhc3RhcnQsaW50IGFsZW4saW50IGIsDQoJCQkJICAg
ICBpbnQgW10gYyxpbnQgY3N0YXJ0KSB7DQogICAgLy8gQz1DK0EqYiwgPz9t
YXkgb3ZlcmxhcCBpZmYgY3N0YXJ0Pj1hc3RhcnQ/Pw0KICAgIC8vIGMgbXVz
dCBoYXZlIHNwYWNlIGZvciBhbGVuIGRpZ2l0cw0KICAgIC8vIGNhcnJ5IGlz
IHJldHVybmVkDQogICAgaW50IGk7DQogICAgbG9uZyB0ZW1wLGNhcnJ5LG07
DQoNCiAgICBtPWI7DQoNCiAgICBjYXJyeT0wOw0KICAgIGZvciAoaT0wO2k8
YWxlbjtpKyspIHsNCiAgICAgIHRlbXA9ICgobG9uZykgYVtpK2FzdGFydF0p
Km0gKyAoKGxvbmcpY1tpK2NzdGFydF0pICsgY2Fycnk7DQogICAgICBjW2kr
Y3N0YXJ0XT0oaW50KSAodGVtcCAmICgoMTw8MzEpLTEpKTsNCiAgICAgIGNh
cnJ5PXRlbXA+Pj4zMTsNCiAgICB9DQoNCiAgICByZXR1cm4gKGludCkgY2Fy
cnk7DQogIH0NCg0KICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgZG9NdWx0
U3ViKGludCBbXSBhLGludCBhc3RhcnQsaW50IGFsZW4sDQoJCQkJICAgICBp
bnQgW10gYixpbnQgYnN0YXJ0LGludCBibGVuLA0KCQkJCSAgICAgaW50IGMp
IHsNCiAgICAvLyBBPUEtQipjLCBibGVuPT1hbGVuLTENCiAgICAvLyBib3Jy
b3cgaXMgcmV0dXJuZWQsIGlmIHJlc3VsdCBuZWdhdGl2ZSBpdCdzIGluIDIt
Y29tcGxlbWVudCBmb3JtDQogICAgaW50IGk7DQogICAgbG9uZyB0ZW1wLGNh
cnJ5LGJvcnJvdzsNCg0KICAgIGNhcnJ5PTA7DQogICAgYm9ycm93PTE7DQog
ICAgZm9yIChpPTA7aTxibGVuO2krKykgew0KICAgICAgdGVtcD0oKGxvbmcp
Yltic3RhcnQraV0pKmMrY2Fycnk7DQogICAgICBjYXJyeT10ZW1wPj4+MzE7
DQoNCiAgICAgIHRlbXA9IGFbYXN0YXJ0K2ldLSh0ZW1wICYgKCgxTDw8MzEp
LTEpKStib3Jyb3crKCgxTDw8MzEpLTEpOw0KICAgICAgYVthc3RhcnQraV09
KGludCkgKHRlbXAgJiAoKDFMPDwzMSktMSkpOw0KICAgICAgYm9ycm93PXRl
bXA+PjMxOw0KICAgIH0NCiAgICBpZiAoYWxlbj5ibGVuKSB7DQogICAgICB0
ZW1wPSBhW2FzdGFydCthbGVuLTFdLWNhcnJ5K2JvcnJvdysoKDFMPDwzMSkt
MSk7DQogICAgICBhW2FzdGFydCthbGVuLTFdPShpbnQpICh0ZW1wICYgKCgx
PDwzMSktMSkpOw0KICAgICAgYm9ycm93PXRlbXA+PjMxOw0KICAgIH0NCg0K
ICAgIHJldHVybiAoaW50KSBib3Jyb3c7DQogIH0NCg0KLy8gUHJpdmF0ZSBN
ZW1iZXIgZnVuY3Rpb25zDQogIHByaXZhdGUgZmluYWwgdm9pZCB0cmltKCkg
ew0KICAgIGludCBuLGk7DQogICAgbj1NYXRoLmFicyh0aGlzLmxlbmd0aCk7
DQogICAgaT1uLTE7DQogICAgd2hpbGUgKChpPjApICYmICh2YWx1ZVtpXT09
MCkpIHsNCiAgICAgIG4tLTsNCiAgICAgIGktLTsNCiAgICB9DQogICAgaWYg
KChuPT0xKSAmJiAodmFsdWVbMF09PTApKSB7DQogICAgICB0aGlzLmxlbmd0
aD0xOyAvLyBaZXJvIGlzIGFsd2F5cyBwb3NpdGl2ZSENCiAgICB9IGVsc2Ug
ew0KICAgICAgaWYgKHRoaXMubGVuZ3RoPDApIA0KCXRoaXMubGVuZ3RoPS1u
Ow0KICAgICAgZWxzZQ0KCXRoaXMubGVuZ3RoPW47DQogICAgfQ0KICB9DQoN
Ci8vIFByaXZhdGUgRGF0YSBNZW1iZXJzDQogIHByaXZhdGUgaW50IGxlbmd0
aDsgLy8gYWxzbyBzaWduIG9mIG51bWJlcg0KICBwcml2YXRlIGludCBbXSB2
YWx1ZTsgLy8gTm8gVHJhaWxpbmcgWmVyb3Mgd2hlbiBzdGFydGluZyBhdCB8
bGVuZ3RofC0xDQogfQ0K
--279707962-904132616-1035205029=:25817--