Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
D00224A3896426D2E3EA892BEF8049AC412E54B97D7436095239FA1B96405EE0

Transaction overview

Status
Success
Execution completed
Block
#256211
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
108,301,036
Requested gas limit
GAS USED
72,200,691
Gas consumed
FEE
216604ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g10ragdr3cjqkael8rslpw4y6rlelhev4h0fswcx10000000ugnot

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CuWsAwoML3ZtLm1fYWRkcGtnEtOsAwooZzEwcmFnZHIzY2pxa2FlbDhyc2xwdzR5NnJsZWxoZXY0aDBmc3djeBKWrAMKB2Zpc2h0cnkSO2duby5sYW5kL3IvZzEwcmFnZHIzY2pxa2FlbDhyc2xwdzR5NnJsZWxoZXY0aDBmc3djeC9maXNodHJ5GoEZCghib29rLmdubxL0GHBhY2thZ2UgZmlzaHRyeQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJzdHJjb252IgopCgpmdW5jIExpc3QoY3VyIHJlYWxtLCBpZCBpbnQsIHByaWNlVWdub3QgaW50NjQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglpZiBwcmljZVVnbm90IDw9IDAgfHwgcHJpY2VVZ25vdCA+IG1heFByaWNlIHsKCQlwYW5pYygiZmlzaDogcHJpY2UiKQoJfQoJdGFrZUV4YWN0KDApCglib2R5IDo9IG11c3QoaWQpCglpZiBib2R5Lm93bmVyICE9IGNhbGxlciB7CgkJcGFuaWMoImZpc2g6IG93bmVyIikKCX0KCWd1YXJkTW92YWJsZShib2R5KQoJaWYgYm9keS5tdXN0SGVhbCB7CgkJcGFuaWMoImZpc2g6IGhlYWwiKQoJfQoJbW92ZVRva2VuKGNhbGxlciwgY2FsbGVyLCBzZWxmLCBpZCkKCWJvZHkubGlzdGVkID0gdHJ1ZQoJYm9keS5zZWxsZXIgPSBjYWxsZXIKCWJvZHkucHJpY2UgPSBwcmljZVVnbm90Cglib2R5Lm93bmVyID0gc2VsZgoJY2hhaW4uRW1pdCgiTGlzdCIsICJpZCIsIHN0cmNvbnYuSXRvYShpZCksICJzZWxsZXIiLCBjYWxsZXIuU3RyaW5nKCksICJwcmljZSIsIHN0cmNvbnYuRm9ybWF0SW50KHByaWNlVWdub3QsIDEwKSkKfQoKZnVuYyBVcGRhdGVQcmljZShjdXIgcmVhbG0sIGlkIGludCwgcHJpY2VVZ25vdCBpbnQ2NCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWlmIHByaWNlVWdub3QgPD0gMCB8fCBwcmljZVVnbm90ID4gbWF4UHJpY2UgewoJCXBhbmljKCJmaXNoOiBwcmljZSIpCgl9Cgl0YWtlRXhhY3QoMCkKCWJvZHkgOj0gbXVzdChpZCkKCWlmICFib2R5Lmxpc3RlZCB7CgkJcGFuaWMoImZpc2g6IGxpc3RlZCIpCgl9CglpZiBib2R5LnNlbGxlciAhPSBjYWxsZXIgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9Cglib2R5LnByaWNlID0gcHJpY2VVZ25vdAoJY2hhaW4uRW1pdCgiTGlzdCIsICJpZCIsIHN0cmNvbnYuSXRvYShpZCksICJzZWxsZXIiLCBjYWxsZXIuU3RyaW5nKCksICJwcmljZSIsIHN0cmNvbnYuRm9ybWF0SW50KHByaWNlVWdub3QsIDEwKSkKfQoKZnVuYyBDYW5jZWwoY3VyIHJlYWxtLCBpZCBpbnQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCgl0YWtlRXhhY3QoMCkKCWJvZHkgOj0gbXVzdChpZCkKCWlmICFib2R5Lmxpc3RlZCB7CgkJcGFuaWMoImZpc2g6IGxpc3RlZCIpCgl9CglpZiBib2R5LnNlbGxlciAhPSBjYWxsZXIgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9Cgltb3ZlVG9rZW4oc2VsZiwgc2VsZiwgYm9keS5zZWxsZXIsIGlkKQoJYm9keS5vd25lciA9IGJvZHkuc2VsbGVyCglib2R5LnNlbGxlciA9IGFkZHJlc3MoIiIpCglib2R5LnByaWNlID0gMAoJYm9keS5saXN0ZWQgPSBmYWxzZQoJY2hhaW4uRW1pdCgiQ2FuY2VsIiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSkKfQoKZnVuYyBCdXkoY3VyIHJlYWxtLCBpZCBpbnQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglib2R5IDo9IG11c3QoaWQpCglpZiAhYm9keS5saXN0ZWQgewoJCXBhbmljKCJmaXNoOiBsaXN0ZWQiKQoJfQoJaWYgY2FsbGVyID09IGJvZHkuc2VsbGVyIHsKCQlwYW5pYygiZmlzaDogc2VsZiIpCgl9Cgl0YWtlRXhhY3QoYm9keS5wcmljZSkKCXByb3RvIDo9IGJvZHkucHJpY2UgKiBwcm90b2NvbEJwcyAvIDEwMDAwCglyb3lhbCA6PSBib2R5LnByaWNlICogcm95YWx0eUJwcyAvIDEwMDAwCglpZiBwcm90bytyb3lhbCA+IGJvZHkucHJpY2UgewoJCXBhbmljKCJmaXNoOiBmZWUiKQoJfQoJc2VsbGVyQW10IDo9IGJvZHkucHJpY2UgLSBwcm90byAtIHJveWFsCglzZW5kKGJvZHkuc2VsbGVyLCBzZWxsZXJBbXQsIGN1cikKCXNlbmQoY3JlYXRvciwgcm95YWwsIGN1cikKCXNlbmQocHJvdG9jb2xTaW5rLCBwcm90bywgY3VyKQoJbW92ZVRva2VuKHNlbGYsIHNlbGYsIGNhbGxlciwgaWQpCglib2R5Lm93bmVyID0gY2FsbGVyCglib2R5LnNlbGxlciA9IGFkZHJlc3MoIiIpCglib2R5LnByaWNlID0gMAoJYm9keS5saXN0ZWQgPSBmYWxzZQoJY2hhaW4uRW1pdCgiQnV5IiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSwgImJ1eWVyIiwgY2FsbGVyLlN0cmluZygpKQp9CgpmdW5jIFNlbGxlck9mKGlkIGludCkgYWRkcmVzcyB7IHJldHVybiBtdXN0KGlkKS5zZWxsZXIgfQpmdW5jIFByaWNlT2YoaWQgaW50KSBpbnQ2NCAgICB7IHJldHVybiBtdXN0KGlkKS5wcmljZSB9CmZ1bmMgSW1hZ2VPZihpZCBpbnQpIHN0cmluZyAgIHsgcmV0dXJuIG11c3QoaWQpLmltYWdlIH0KZnVuYyBOYW1lT2YoaWQgaW50KSBzdHJpbmcgICAgeyByZXR1cm4gbXVzdChpZCkubmFtZSB9CgpmdW5jIEdyY093bmVyT2YoaWQgaW50KSBzdHJpbmcgewoJd2hvLCBlcnIgOj0gT3duZXJPZihzdHJjb252Lkl0b2EoaWQpKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gd2hvLlN0cmluZygpCn0KCmZ1bmMgSXRlbUxpbmUoaWQgaW50KSBzdHJpbmcgewoJYm9keSA6PSBtdXN0KGlkKQoJcmV0dXJuIHN0cmNvbnYuSXRvYShib2R5LmlkKSArICJ8IiArIGJvZHkubmFtZSArICJ8IiArIGFkZHJTdHIoYm9keS5vd25lcikgKyAifCIgKyBhZGRyU3RyKGJvZHkuc2VsbGVyKSArICJ8IiArCgkJc3RyY29udi5Gb3JtYXRJbnQoYm9keS5wcmljZSwgMTApICsgInwiICsgc3RyY29udi5Gb3JtYXRCb29sKGJvZHkubGlzdGVkKSArICJ8IiArIGJvZHkuaW1hZ2UgKyAifGZpc2h8IiArCgkJYm9keS5yYXJpdHkgKyAifFNpemU6IiArIGJvZHkuc2l6ZSArICI7VHJhaXQ6IiArIGJvZHkudHJhaXQgKyAiO1NwZWNpZXM6IiArIGJvZHkuc3BlY2llcyArICI7SFA6IiArIHN0cmNvbnYuSXRvYShib2R5LmhwKSArCgkJInx0cnVlfC0xIgp9CgpmdW5jIExpc3RPcGVuKCkgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCW91dCA6PSAiIgoJbiA6PSAwCglmb3IgXywgYm9keSA6PSByYW5nZSBib2RpZXMgewoJCWlmIGJvZHkgPT0gbmlsIHx8ICFib2R5Lmxpc3RlZCB8fCBib2R5LmJ1cm5lZCB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIG4gPj0gbGlzdENhcCB7CgkJCWJyZWFrCgkJfQoJCWlmIG91dCAhPSAiIiB7CgkJCW91dCArPSAiXG4iCgkJfQoJCW91dCArPSBJdGVtTGluZShib2R5LmlkKQoJCW4rKwoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIGFkZHJTdHIoYSBhZGRyZXNzKSBzdHJpbmcgewoJaWYgIWEuSXNWYWxpZCgpIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiBhLlN0cmluZygpCn0KGthbCgpjb21iYXQuZ25vEslbcGFja2FnZSBmaXNodHJ5CgppbXBvcnQgKAoJImNoYWluIgoJInN0cmNvbnYiCgkidGltZSIKCgkiZ25vLmxhbmQvci9nMW40cGw1dWM0eXQ1cjk2bTl3NmZtZHpueDN4MGp5ZzhsNmFyaG10L3Nob2FsL3BhcnR5IgoJImduby5sYW5kL3IvZzEwcmFnZHIzY2pxa2FlbDhyc2xwdzR5NnJsZWxoZXY0aDBmc3djeC9zaG9hbHRva2VuIgopCgp0eXBlIGRhbWFnZVJvdyBzdHJ1Y3QgewoJb3duZXIgYWRkcmVzcwoJZG1nICAgaW50Cn0KCi8vIGJsb3dzW3ZpY3RpbUlEXSBzdW1zIEhQIGFjdHVhbGx5IHJlbW92ZWQsIGtleWVkIGJ5IHRoZSBhdHRhY2tlcidzIG93bmVyLgp2YXIgYmxvd3MgW11bXWRhbWFnZVJvdwoKLy8gQml0ZSBpcyBvbmUgdXNlciBjYWxsIGFuZCB0YWtlcyBubyBwYXltZW50LiBUaGUgaGl0IHRlc3QgaXMgc2VjdG9yLWNlbnRlcgovLyByZWFjaCBwbHVzIGEgNDIgZGVncmVlIG1vdXRoIGNvbmUuIEEgbWlzcyBkb2VzIG5vdCBzdGFydCBjb29sZG93bi4gTWVtYmVycwovLyBvZiB0aGUgc2FtZSBwYXJ0eSBjYW5ub3QgYml0ZSBlYWNoIG90aGVyLiBBIGtpbGxpbmcgYmxvdyBwYXlzIHRoZSBzbWFsbGVyCi8vIFBvb2wgWCBhbmQgbGVhdmVzIHRoZSBORlQgYXQgMzAlIEhQLiBUaGUga2lsbGVyIHNoYXJlIGlzIHNwbGl0IGJ5IEhQIHJlbW92ZWQuCi8vIEVtcHR5IGNoZWVyIHBheXMgdGhlIHRlYW0gc2luay4gQSBuZXcga2lsbCBkb2VzIG5vdCBkcm9wIHdhdGNoIHNoYXJkcy4KLy8gQnV5YmFjayBHTk9UIHRoYXQgY2Fubm90IGJ1eSBvbmUgRklTSCBmcm9tIHRoZSByZXNlcnZlIGJ1cm5zLiBTcGVudCBHTk9UIGpvaW5zIGxpcXVpZGl0eS4KZnVuYyBCaXRlKGN1ciByZWFsbSwgaWQsIHRhcmdldCBpbnQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCgl0YWtlRXhhY3QoMCkKCWlmIGlkID09IHRhcmdldCB7CgkJcGFuaWMoImZpc2g6IGJpdGUiKQoJfQoJYXRrIDo9IG11c3QoaWQpCgl2aWMgOj0gbXVzdCh0YXJnZXQpCglpZiBhdGsub3duZXIgIT0gY2FsbGVyIHsKCQlwYW5pYygiZmlzaDogb3duZXIiKQoJfQoJaWYgYXRrLm11c3RIZWFsIHx8IHZpYy5tdXN0SGVhbCB7CgkJcGFuaWMoImZpc2g6IGhlYWwiKQoJfQoJbm93IDo9IHRpbWUuTm93KCkuVW5peCgpCglpZiAhbGl2ZUZpc2goYXRrLCBub3cpIHx8ICFsaXZlRmlzaCh2aWMsIG5vdykgewoJCXBhbmljKCJmaXNoOiBtYXRjaCIpCgl9CglpZiBhdGsub3duZXIgPT0gdmljLm93bmVyIHsKCQlwYW5pYygiZmlzaDogYml0ZSIpCgl9CglpZiBwYXJ0eS5TYW1lUGFydHkoY3Jvc3MoY3VyKSwgYXRrLm93bmVyLCB2aWMub3duZXIpIHsKCQlwYW5pYygiZmlzaDogcGFydHkiKQoJfQoJbm93TXMgOj0gdGltZS5Ob3coKS5Vbml4TWlsbGkoKQoJLy8gQSBjYXZlIG9yIHJlZWYgZG9lcyBub3QgZG9kZ2UuIFRoZSBjb25lIHN0aWxsIGhhcyB0byBmYWNlIHRoZSBmaXNoIGluc2lkZS4KCWlmICFtb3V0aEhpdChhdGssIHZpYykgJiYgIXNoZWx0ZXJNb3V0aChhdGssIHZpYywgbm93TXMpIHsKCQlwYW5pYygiZmlzaDogcmFuZ2UiKQoJfQoJaWYgbm93TXMgPCBhdGsubmV4dEJpdGVNaWxsaSB7CgkJcGFuaWMoImZpc2g6IGNvb2wiKQoJfQoJaWYgYXRrLmJpdHRlbkJ5ID09IHZpYy5pZCAmJiBub3dNcyA8IGF0ay5iaXR0ZW5VbnRpbCB7CgkJcGFuaWMoImZpc2g6IGNvb2wiKQoJfQoJY29vbCA6PSBub3dNcyArIGNvb2xkb3duTXMoYXRrLnJhcml0eSkKCWF0ay5uZXh0Qml0ZU1pbGxpID0gY29vbAoJYXRrLmxhc3RDb21iYXRNaWxsaSA9IG5vd01zCglpZiByZWRpcmVjdFNoZWx0ZXIoYXRrLCB2aWMsIG5vd01zKSB7CgkJY2hhaW4uRW1pdCgiQml0ZSIsICJpZCIsIHN0cmNvbnYuSXRvYShpZCksICJ0YXJnZXQiLCBzdHJjb252Lkl0b2EodGFyZ2V0KSwgImRhbWFnZSIsICJzaGVsdGVyIikKCQlyZXR1cm4KCX0KCXZpYy5sYXN0Q29tYmF0TWlsbGkgPSBub3dNcwoJdmljLmJpdHRlbkJ5ID0gYXRrLmlkCgl2aWMuYml0dGVuVW50aWwgPSBjb29sCglkbWcgOj0gc3RyaWtlRm91Z2h0KGJpdGVOb3coYXRrKSwgdmljLmhwLCBhdGsuc2l6ZSwgdmljLnNpemUsIGF0ay5yYXJpdHksIHZpYy5yYXJpdHkpCglsYW5kZWQgOj0gZG1nCglpZiBsYW5kZWQgPiB2aWMuaHBOb3cgewoJCWxhbmRlZCA9IHZpYy5ocE5vdwoJfQoJYWRkRGFtYWdlKHZpYy5pZCwgYXRrLm93bmVyLCBsYW5kZWQpCglpZiB2aWMuaHBOb3cgPiBkbWcgewoJCXZpYy5ocE5vdyAtPSBkbWcKCQljaGFpbi5FbWl0KCJCaXRlIiwgImlkIiwgc3RyY29udi5JdG9hKGlkKSwgInRhcmdldCIsIHN0cmNvbnYuSXRvYSh0YXJnZXQpLCAiZGFtYWdlIiwgc3RyY29udi5JdG9hKGRtZykpCgkJcmV0dXJuCgl9CglwYXlLaWxsKGF0aywgdmljLCBjdXIpCn0KCmZ1bmMgcGF5S2lsbChhdGssIHZpYyAqZmlzaEJvZHksIHJsbSByZWFsbSkgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImZpc2g6IHJlYWxtIikKCX0KCWNvdmVyZWQgOj0gY292ZXJlZFN0YWtlKGF0ay5wb29sLCB2aWMucG9vbCkKCWV4Y2VzcyA6PSB2aWMucG9vbCAtIGNvdmVyZWQKCWtpbGxlciwgbHAsIHRlYW0sIGJ1eWJhY2ssIGNoZWVyIDo9IHNwbGl0UGFydHMoY292ZXJlZCkKCW5vd01zIDo9IHRpbWUuTm93KCkuVW5peE1pbGxpKCkKCWNyZWRpdEJvdXQoYXRrKQoJY3JlZGl0Qm91dCh2aWMpCglncm93RnJvbUtpbGwoYXRrLCB2aWMpCglyZXR1cm5DaGVlcnModmljLCBybG0pCgl2aWMucG9vbCA9IDAKCXZpYy5pbk1hdGNoID0gZmFsc2UKCXZpYy5ib3V0UGFpZCA9IGZhbHNlCgl2aWMubXVzdEhlYWwgPSB0cnVlCgl2aWMuaHBOb3cgPSBkb3duSFAodmljLmhwKQoJY2hlZXJIZWxkIDo9IGJvb2tDaGVlckNsYWltcyhhdGssIHZpYywgY2hlZXIsIG5vd01zKQoJdGVhbSArPSBjaGVlciAtIGNoZWVySGVsZAoJc2VuZCh2aWMub3duZXIsIGV4Y2VzcywgcmxtKQoJcGF5S2lsbGVyKGF0ay5vd25lciwgdmljLmlkLCBraWxsZXIsIHJsbSkKCXNlbmQobHBTaW5rLCBscCwgcmxtKQoJc2VuZCh0ZWFtU2luaywgdGVhbSwgcmxtKQoJc3BlbnQgOj0gc2V0dGxlQnV5YmFjayhidXliYWNrLCBybG0pCglzZW5kKGxwU2luaywgc3BlbnQsIHJsbSkKCXNlbmQoYnVyblNpbmssIGJ1eWJhY2stc3BlbnQsIHJsbSkKCXBheVdpbkZpc2goYXRrLm93bmVyLCBjb3ZlcmVkLCBybG0pCgljbGVhckRhbWFnZSh2aWMuaWQpCgljaGFpbi5FbWl0KAoJCSJLaWxsIiwKCQkiaWQiLCBzdHJjb252Lkl0b2EoYXRrLmlkKSwKCQkidGFyZ2V0Iiwgc3RyY29udi5JdG9hKHZpYy5pZCksCgkJImNvdmVyZWQiLCBzdHJjb252LkZvcm1hdEludChjb3ZlcmVkLCAxMCksCgkJImtpbGxlciIsIHN0cmNvbnYuRm9ybWF0SW50KGtpbGxlciwgMTApLAoJKQp9CgovLyBwYXlLaWxsZXIgc3BsaXRzIHRoZSBraWxsZXIgc2hhcmUgYnkgSFAgcmVtb3ZlZCBhbW9uZyBjdXJyZW50IG1lbWJlcnMuCi8vIFRoZSBwYXJ0eSByZWFsbSBob2xkcyBubyBjb2lucy4gQSBzb2xvIG93bmVyLCBvciBhIHBhcnR5IHdpdGggbm8gcmVjb3JkZWQKLy8gZGFtYWdlLCByZWNlaXZlcyB0aGUgd2hvbGUgc2hhcmUuIER1c3QgZ29lcyB0byB0aGUgaGlnaGVzdCBkYW1hZ2UsIGFuZCBhCi8vIHRpZSBwcmVmZXJzIHRoZSBvd25lciB3aG8gbGFuZGVkIHRoZSBibG93LgpmdW5jIHBheUtpbGxlcihvd25lciBhZGRyZXNzLCB2aWN0aW0gaW50LCBhbW91bnQgaW50NjQsIHJsbSByZWFsbSkgewoJaWYgYW1vdW50IDw9IDAgewoJCXJldHVybgoJfQoJcGlkIDo9IHBhcnR5LlBhcnR5T2YoY3Jvc3MocmxtKSwgb3duZXIpCglpZiBwaWQgPT0gMCB7CgkJc2VuZChvd25lciwgYW1vdW50LCBybG0pCgkJcmV0dXJuCgl9CgluIDo9IHBhcnR5Lk1lbWJlckNvdW50KGNyb3NzKHJsbSksIHBpZCkKCWlmIG4gPD0gMCB7CgkJc2VuZChvd25lciwgYW1vdW50LCBybG0pCgkJcmV0dXJuCgl9Cglvd25lcnMgOj0gbWFrZShbXWFkZHJlc3MsIG4pCgl3ZWlnaHRzIDo9IG1ha2UoW11pbnQsIG4pCgl0b3RhbCA6PSAwCglmb3IgaSA6PSAwOyBpIDwgbjsgaSsrIHsKCQl3aG8gOj0gcGFydHkuTWVtYmVyQXQoY3Jvc3MocmxtKSwgcGlkLCBpKQoJCW93bmVyc1tpXSA9IHdobwoJCXcgOj0gZGFtYWdlT2YodmljdGltLCB3aG8pCgkJaWYgdyA8IDAgewoJCQl3ID0gMAoJCX0KCQl3ZWlnaHRzW2ldID0gdwoJCXRvdGFsICs9IHcKCX0KCWlmIHRvdGFsIDw9IDAgewoJCXNlbmQob3duZXIsIGFtb3VudCwgcmxtKQoJCXJldHVybgoJfQoJc2hhcmVzIDo9IHNwbGl0V2VpZ2h0cyhhbW91bnQsIHdlaWdodHMsIG93bmVyLCBvd25lcnMpCglmb3IgaSA6PSByYW5nZSBvd25lcnMgewoJCXNlbmQob3duZXJzW2ldLCBzaGFyZXNbaV0sIHJsbSkKCX0KfQoKZnVuYyBzcGxpdFdlaWdodHMoYW1vdW50IGludDY0LCB3ZWlnaHRzIFtdaW50LCBwcmVmZXIgYWRkcmVzcywgb3duZXJzIFtdYWRkcmVzcykgW11pbnQ2NCB7Cgl0b3RhbCA6PSAwCglmb3IgXywgdyA6PSByYW5nZSB3ZWlnaHRzIHsKCQlpZiB3ID4gMCB7CgkJCXRvdGFsICs9IHcKCQl9Cgl9CglvdXQgOj0gbWFrZShbXWludDY0LCBsZW4od2VpZ2h0cykpCglpZiBhbW91bnQgPD0gMCB8fCB0b3RhbCA8PSAwIHsKCQlyZXR1cm4gb3V0Cgl9Cgl2YXIgdXNlZCBpbnQ2NAoJYmVzdCA6PSAtMQoJYmVzdFcgOj0gMAoJZm9yIGksIHcgOj0gcmFuZ2Ugd2VpZ2h0cyB7CgkJaWYgdyA8PSAwIHsKCQkJY29udGludWUKCQl9CgkJc2hhcmUgOj0gYW1vdW50ICogaW50NjQodykgLyBpbnQ2NCh0b3RhbCkKCQlvdXRbaV0gPSBzaGFyZQoJCXVzZWQgKz0gc2hhcmUKCQlpZiBiZXN0IDwgMCB8fCB3ID4gYmVzdFcgfHwgKHcgPT0gYmVzdFcgJiYgaSA8IGxlbihvd25lcnMpICYmIG93bmVyc1tpXSA9PSBwcmVmZXIpIHsKCQkJYmVzdCA9IGkKCQkJYmVzdFcgPSB3CgkJfQoJfQoJaWYgdXNlZCA8IGFtb3VudCAmJiBiZXN0ID49IDAgewoJCW91dFtiZXN0XSArPSBhbW91bnQgLSB1c2VkCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgYWRkRGFtYWdlKGlkIGludCwgb3duZXIgYWRkcmVzcywgbiBpbnQpIHsKCWlmIG4gPD0gMCB8fCBpZCA8IDEgfHwgIW93bmVyLklzVmFsaWQoKSB7CgkJcmV0dXJuCgl9Cglmb3IgbGVuKGJsb3dzKSA8PSBpZCB7CgkJYmxvd3MgPSBhcHBlbmQoYmxvd3MsIG5pbCkKCX0KCXJvd3MgOj0gYmxvd3NbaWRdCglmb3IgaSA6PSAwOyBpIDwgbGVuKHJvd3MpOyBpKysgewoJCWlmIHJvd3NbaV0ub3duZXIgPT0gb3duZXIgewoJCQlyb3dzW2ldLmRtZyArPSBuCgkJCWJsb3dzW2lkXSA9IHJvd3MKCQkJcmV0dXJuCgkJfQoJfQoJYmxvd3NbaWRdID0gYXBwZW5kKHJvd3MsIGRhbWFnZVJvd3tvd25lcjogb3duZXIsIGRtZzogbn0pCn0KCmZ1bmMgZGFtYWdlT2YoaWQgaW50LCBvd25lciBhZGRyZXNzKSBpbnQgewoJaWYgaWQgPCAwIHx8IGlkID49IGxlbihibG93cykgewoJCXJldHVybiAwCgl9Cglmb3IgaSA6PSAwOyBpIDwgbGVuKGJsb3dzW2lkXSk7IGkrKyB7CgkJaWYgYmxvd3NbaWRdW2ldLm93bmVyID09IG93bmVyICYmIGJsb3dzW2lkXVtpXS5kbWcgPiAwIHsKCQkJcmV0dXJuIGJsb3dzW2lkXVtpXS5kbWcKCQl9Cgl9CglyZXR1cm4gMAp9CgovLyBjbGVhckRhbWFnZSBkcm9wcyBpbmNvbWluZyBibG93cyBzbyB0aGUgbmV4dCBlbnRyeSBzdGFydHMgY2xlYW4uCmZ1bmMgY2xlYXJEYW1hZ2UoaWQgaW50KSB7CglpZiBpZCA8IDAgfHwgaWQgPj0gbGVuKGJsb3dzKSB7CgkJcmV0dXJuCgl9CglibG93c1tpZF0gPSBuaWwKfQoKLy8gY3JlZGl0Qm91dCBjb3VudHMgb25lIGZpbmlzaGVkIGVudHJ5LiBMZWF2ZSBkb2VzIG5vdCBjYWxsIGl0LgovLyBTZXR0bGVNYXRjaCBkb2VzIG5vdCBjb3VudCB0aGUgZW50cnkgYWdhaW4uCmZ1bmMgY3JlZGl0Qm91dChib2R5ICpmaXNoQm9keSkgewoJaWYgYm9keS5ib3V0UGFpZCB7CgkJcmV0dXJuCgl9Cglib2R5LmJvdXRQYWlkID0gdHJ1ZQoJYm9keS5ib3V0cysrCn0KCmZ1bmMgbGl2ZUZpc2goYm9keSAqZmlzaEJvZHksIG5vdyBpbnQ2NCkgYm9vbCB7CglpZiBub3cgPCAwIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiBib2R5LmluTWF0Y2ggJiYgYm9keS5wb29sID4gMAp9CgpmdW5jIGRvd25IUChtYXggaW50KSBpbnQgewoJaHAgOj0gbWF4ICogMzAgLyAxMDAKCWlmIGhwIDwgMSB7CgkJcmV0dXJuIDEKCX0KCXJldHVybiBocAp9CgpmdW5jIGNvdmVyZWRTdGFrZShraWxsZXJQb29sLCB2aWN0aW1Qb29sIGludDY0KSBpbnQ2NCB7CglpZiBraWxsZXJQb29sIDwgMCB7CgkJa2lsbGVyUG9vbCA9IDAKCX0KCWlmIHZpY3RpbVBvb2wgPCAwIHsKCQl2aWN0aW1Qb29sID0gMAoJfQoJaWYga2lsbGVyUG9vbCA8IHZpY3RpbVBvb2wgewoJCXJldHVybiBraWxsZXJQb29sCgl9CglyZXR1cm4gdmljdGltUG9vbAp9CgovLyBzcGxpdFBhcnRzIGlzIDgwLzEwLzMvMy80LiBLaWxsZXIsIGxpcXVpZGl0eSwgdGVhbSwgRklTSCBidXliYWNrLCBjaGVlci4KLy8gRHVzdCBqb2lucyB0aGUgYnV5YmFjay4KZnVuYyBzcGxpdFBhcnRzKGFtb3VudCBpbnQ2NCkgKGtpbGxlciwgbHAsIHRlYW0sIGJ1eWJhY2ssIGNoZWVyIGludDY0KSB7CglpZiBhbW91bnQgPCAwIHsKCQlhbW91bnQgPSAwCgl9CglraWxsZXIgPSBhbW91bnQgKiA4MDAwIC8gMTAwMDAKCWxwID0gYW1vdW50ICogMTAwMCAvIDEwMDAwCgl0ZWFtID0gYW1vdW50ICogMzAwIC8gMTAwMDAKCWJ1eWJhY2sgPSBhbW91bnQgKiAzMDAgLyAxMDAwMAoJY2hlZXIgPSBhbW91bnQgKiA0MDAgLyAxMDAwMAoJZHVzdCA6PSBhbW91bnQgLSBraWxsZXIgLSBscCAtIHRlYW0gLSBidXliYWNrIC0gY2hlZXIKCWJ1eWJhY2sgKz0gZHVzdAoJcmV0dXJuCn0KCi8vIHNldHRsZUJ1eWJhY2sgc3BlbmRzIHdob2xlIEZJU0ggZnJvbSB0aGUgcmVzZXJ2ZSBhdCAwLjAyIEdOT1QgZWFjaC4KLy8gR05PVCB0aGF0IGNhbm5vdCBidXkgb25lIEZJU0ggc3RheXMgd2l0aCB0aGUgY2FsbGVyIHRvIGJ1cm4uIFRoaXMgZG9lcyBub3QgbWludC4KZnVuYyBzZXR0bGVCdXliYWNrKGJ1ZGdldCBpbnQ2NCwgcmxtIHJlYWxtKSBpbnQ2NCB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlwYW5pYygiZmlzaDogcmVhbG0iKQoJfQoJdW5pdHMgOj0gcmVzZXJ2ZVVuaXRzKGJ1ZGdldCAvIHR3YXBVZ25vdCkKCWlmIHVuaXRzIDw9IDAgewoJCXJldHVybiAwCgl9Cglnb3QgOj0gc2hvYWx0b2tlbi5EcmF3KGNyb3NzKHJsbSksIGZpc2hSZXNlcnZlLCBidXJuU2luaywgdW5pdHMpCglpZiBnb3QgIT0gdW5pdHMgewoJCXBhbmljKCJmaXNoOiBmaXNoIikKCX0KCXJldHVybiAodW5pdHMgLyBmaXNoVW5pdCkgKiB0d2FwVWdub3QKfQoKLy8gcGF5V2luRmlzaCBwYXlzIDEgd2hvbGUgRklTSCBwZXIgMSB3aG9sZSBHTk9UIG9mIHRoZSBjb3ZlcmVkIHN0YWtlLCB0aGVuIHRoZSBwYXJ0eSBib251cy4KLy8gQm90aCBjb21lIGZyb20gdGhlIHJlc2VydmUgYWZ0ZXIgYnV5YmFjay4gQSBzaG9ydCByZXNlcnZlIHBheXMgbGVzcy4gVGhpcyBkb2VzIG5vdCBtaW50LgpmdW5jIHBheVdpbkZpc2gob3duZXIgYWRkcmVzcywgc3Rha2UgaW50NjQsIHJsbSByZWFsbSkgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImZpc2g6IHJlYWxtIikKCX0KCXdob2xlIDo9IHN0YWtlIC8gdWdub3QKCWlmIHdob2xlIDwgMCB7CgkJd2hvbGUgPSAwCgl9CgliYXNlVW5pdHMgOj0gcmVzZXJ2ZVVuaXRzKHdob2xlKQoJaWYgYmFzZVVuaXRzID4gMCB7CgkJZ290IDo9IHNob2FsdG9rZW4uRHJhdyhjcm9zcyhybG0pLCBmaXNoUmVzZXJ2ZSwgb3duZXIsIGJhc2VVbml0cykKCQlpZiBnb3QgIT0gYmFzZVVuaXRzIHsKCQkJcGFuaWMoImZpc2g6IGZpc2giKQoJCX0KCX0KCWJhc2VGaXNoIDo9IGJhc2VVbml0cyAvIGZpc2hVbml0Cglvd25lcnMgOj0gcGFydHlNZW1iZXJzKG93bmVyLCBybG0pCgltZW1iZXJzIDo9IGxlbihvd25lcnMpCglpZiBtZW1iZXJzID09IDAgewoJCW1lbWJlcnMgPSAxCgl9Cglib251c0Zpc2ggOj0gYmFzZUZpc2ggKiBpbnQ2NChwYXJ0eUZpc2hCb251c0JwcyhtZW1iZXJzKSkgLyAxMDAwMAoJYm9udXNVbml0cyA6PSByZXNlcnZlVW5pdHMoYm9udXNGaXNoKQoJaWYgYm9udXNVbml0cyA8PSAwIHsKCQlyZXR1cm4KCX0KCXNoYXJlcyA6PSBzcGxpdFBhcnR5RmlzaChib251c1VuaXRzL2Zpc2hVbml0LCBvd25lcnMsIG93bmVyKQoJZm9yIGkgOj0gcmFuZ2Ugb3duZXJzIHsKCQlwYXJ0IDo9IHNoYXJlc1tpXSAqIGZpc2hVbml0CgkJaWYgcGFydCA8PSAwIHsKCQkJY29udGludWUKCQl9CgkJZ290IDo9IHNob2FsdG9rZW4uRHJhdyhjcm9zcyhybG0pLCBmaXNoUmVzZXJ2ZSwgb3duZXJzW2ldLCBwYXJ0KQoJCWlmIGdvdCAhPSBwYXJ0IHsKCQkJcGFuaWMoImZpc2g6IGZpc2giKQoJCX0KCX0KfQoKZnVuYyByZXNlcnZlVW5pdHMod2hvbGUgaW50NjQpIGludDY0IHsKCWlmIHdob2xlIDw9IDAgfHwgIWZpc2hUb2tlblJlYWR5KCkgfHwgIWZpc2hSZXNlcnZlLklzVmFsaWQoKSB7CgkJcmV0dXJuIDAKCX0KCXVuaXRzIDo9IHdob2xlICogZmlzaFVuaXQKCXJvb20gOj0gc2hvYWx0b2tlbi5CYWxhbmNlT2YoZmlzaFJlc2VydmUpCglhbGxvdyA6PSBzaG9hbHRva2VuLkFsbG93YW5jZShmaXNoUmVzZXJ2ZSwgc2VsZikKCWlmIGFsbG93IDwgcm9vbSB7CgkJcm9vbSA9IGFsbG93Cgl9Cglyb29tID0gcm9vbSAvIGZpc2hVbml0ICogZmlzaFVuaXQKCWlmIHVuaXRzID4gcm9vbSB7CgkJcmV0dXJuIHJvb20KCX0KCXJldHVybiB1bml0cwp9CgpmdW5jIHBhcnR5TWVtYmVycyhvd25lciBhZGRyZXNzLCBybG0gcmVhbG0pIFtdYWRkcmVzcyB7CglwaWQgOj0gcGFydHkuUGFydHlPZihjcm9zcyhybG0pLCBvd25lcikKCWlmIHBpZCA9PSAwIHsKCQlyZXR1cm4gbmlsCgl9CgluIDo9IHBhcnR5Lk1lbWJlckNvdW50KGNyb3NzKHJsbSksIHBpZCkKCW91dCA6PSBtYWtlKFtdYWRkcmVzcywgbikKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCW91dFtpXSA9IHBhcnR5Lk1lbWJlckF0KGNyb3NzKHJsbSksIHBpZCwgaSkKCX0KCXJldHVybiBvdXQKfQoKZnVuYyBwYXJ0eUZpc2hCb251c0JwcyhtZW1iZXJzIGludCkgaW50IHsKCWlmIG1lbWJlcnMgPD0gMSB7CgkJcmV0dXJuIDAKCX0KCW4gOj0gbWVtYmVycwoJaWYgbiA+IDggewoJCW4gPSA4Cgl9CglyZXR1cm4gKG4gLSAxKSAqIDEwMDAgLyA3Cn0KCmZ1bmMgc3BsaXRQYXJ0eUZpc2goYm9udXMgaW50NjQsIG93bmVycyBbXWFkZHJlc3MsIGtpbGxlciBhZGRyZXNzKSBbXWludDY0IHsKCW91dCA6PSBtYWtlKFtdaW50NjQsIGxlbihvd25lcnMpKQoJaWYgYm9udXMgPD0gMCB8fCBsZW4ob3duZXJzKSA9PSAwIHsKCQlyZXR1cm4gb3V0Cgl9CgllYWNoIDo9IGJvbnVzIC8gaW50NjQobGVuKG93bmVycykpCglkdXN0QXQgOj0gMAoJZm9yIGksIHdobyA6PSByYW5nZSBvd25lcnMgewoJCW91dFtpXSA9IGVhY2gKCQlpZiB3aG8gPT0ga2lsbGVyIHsKCQkJZHVzdEF0ID0gaQoJCX0KCX0KCW91dFtkdXN0QXRdICs9IGJvbnVzIC0gZWFjaCppbnQ2NChsZW4ob3duZXJzKSkKCXJldHVybiBvdXQKfQoKZnVuYyBzdHJpa2VEYW1hZ2UoYml0ZSwgaHBNYXggaW50LCBhdGtTaXplLCBkZWZTaXplIHN0cmluZykgaW50IHsKCWRtZyA6PSBiaXRlICogMTAwIC8gKGhwTWF4ICsgMTAwKQoJaWYgZG1nIDwgMSB7CgkJZG1nID0gMQoJfQoJXyA9IGF0a1NpemUKCV8gPSBkZWZTaXplCglyZXR1cm4gZG1nCn0KCmZ1bmMgc2l6ZUluZGV4KHNpemUgc3RyaW5nKSBpbnQgewoJc3dpdGNoIHNpemUgewoJY2FzZSAic21hbGwiOgoJCXJldHVybiAwCgljYXNlICJtZWRpdW0iOgoJCXJldHVybiAxCgljYXNlICJsYXJnZSI6CgkJcmV0dXJuIDIKCWRlZmF1bHQ6CgkJcGFuaWMoImZpc2g6IHNpemUiKQoJfQp9CgpmdW5jIGJpdGVPZihyYXJpdHksIHNpemUsIHRyYWl0IHN0cmluZykgaW50IHsKCXZhciBiYXNlIGludDY0Cglzd2l0Y2ggcmFyaXR5IHsKCWNhc2UgImNvbW1vbiI6CgkJYmFzZSA9IDIyCgljYXNlICJ1bmNvbW1vbiI6CgkJYmFzZSA9IDI2CgljYXNlICJyYXJlIjoKCQliYXNlID0gMzEKCWNhc2UgImVwaWMiOgoJCWJhc2UgPSAzNwoJY2FzZSAibGVnZW5kYXJ5IjoKCQliYXNlID0gNDQKCWNhc2UgIm15dGhpYyI6CgkJYmFzZSA9IDUyCglkZWZhdWx0OgoJCXBhbmljKCJmaXNoOiByYXJpdHkiKQoJfQoJdHJhaXRCcHMgOj0gaW50NjQoMTAwMDApCglpZiB0cmFpdCA9PSAiZmFuZyIgewoJCXRyYWl0QnBzID0gMTEyMDAKCX0KCXNpemVCcHMgOj0gaW50NjQoMTAwMDApCglpZiBzaXplID09ICJzbWFsbCIgewoJCXNpemVCcHMgPSA4NjAwCgl9IGVsc2UgaWYgc2l6ZSA9PSAibGFyZ2UiIHsKCQlzaXplQnBzID0gMTE4MDAKCX0KCXYgOj0gKGJhc2UqdHJhaXRCcHMqc2l6ZUJwcyArIDUwXzAwMF8wMDApIC8gMTAwXzAwMF8wMDAKCWlmIHYgPCAxIHsKCQl2ID0gMQoJfQoJcmV0dXJuIGludCh2KQp9CgpmdW5jIGNvb2xkb3duTXMocmFyaXR5IHN0cmluZykgaW50NjQgewoJc3dpdGNoIHJhcml0eSB7CgljYXNlICJjb21tb24iOgoJCXJldHVybiAyNDAwCgljYXNlICJ1bmNvbW1vbiI6CgkJcmV0dXJuIDI1NTAKCWNhc2UgInJhcmUiOgoJCXJldHVybiAyNzAwCgljYXNlICJlcGljIjoKCQlyZXR1cm4gMjg1MAoJY2FzZSAibGVnZW5kYXJ5IjoKCQlyZXR1cm4gMzAwMAoJY2FzZSAibXl0aGljIjoKCQlyZXR1cm4gMzIwMAoJZGVmYXVsdDoKCQlwYW5pYygiZmlzaDogcmFyaXR5IikKCX0KfQoKLy8gcmVhY2hVbml0cyBpcyB0aGUgZG9kZ2VkIGJpdGUgcmVhY2ggaW4gMS8xMDAwMCBvZiBhIHdvcmxkIHVuaXQuCi8vIEEgc2VjdG9yIGlzIDggd29ybGQgdW5pdHMsIHNvIHRoZSBuZXh0IGNlbnRlciBpcyA4MDAwMCB1bml0cyBhd2F5LgpmdW5jIHJlYWNoVW5pdHMocmFyaXR5LCBzaXplIHN0cmluZywgZG9kZ2VUZW50aHMgaW50KSBpbnQ2NCB7Cgl2YXIgc3BlYyBpbnQ2NAoJc3dpdGNoIHJhcml0eSB7CgljYXNlICJjb21tb24iOgoJCXNwZWMgPSAxMDAwMAoJY2FzZSAidW5jb21tb24iOgoJCXNwZWMgPSAxMDYwMAoJY2FzZSAicmFyZSI6CgkJc3BlYyA9IDExMjAwCgljYXNlICJlcGljIjoKCQlzcGVjID0gMTE4MDAKCWNhc2UgImxlZ2VuZGFyeSI6CgkJc3BlYyA9IDEyNDAwCgljYXNlICJteXRoaWMiOgoJCXNwZWMgPSAxMzIwMAoJZGVmYXVsdDoKCQlwYW5pYygiZmlzaDogcmFyaXR5IikKCX0KCXNpemVNb2QgOj0gaW50NjQoMTAwMDApCglpZiBzaXplID09ICJzbWFsbCIgewoJCXNpemVNb2QgPSA4NjAwCgl9IGVsc2UgaWYgc2l6ZSA9PSAibGFyZ2UiIHsKCQlzaXplTW9kID0gMTIyMDAKCX0KCXJlYWNoIDo9IHNwZWMgKiBzaXplTW9kICogOCAvIDEwMDAwCglyZWFjaCAtPSBpbnQ2NChkb2RnZVRlbnRocykgKiAxMDAwCglpZiByZWFjaCA8IDEwXzAwMCB7CgkJcmV0dXJuIDEwXzAwMAoJfQoJcmV0dXJuIHJlYWNoCn0KCmZ1bmMgaW5SZWFjaChhdGssIGRlZiAqZmlzaEJvZHkpIGJvb2wgewoJcmV0dXJuIGluUmVhY2hEb2RnZShhdGssIGRlZiwgZGVmLmRvZGdlKQp9CgpmdW5jIGluUmVhY2hEb2RnZShhdGssIGRlZiAqZmlzaEJvZHksIGRvZGdlIGludCkgYm9vbCB7CglkeCA6PSBpbnQ2NChhdGsuc3ggLSBkZWYuc3gpCglkeiA6PSBpbnQ2NChhdGsuc3ogLSBkZWYuc3opCglzcGFuIDo9IGR4KmR4ICsgZHoqZHoKCXJlYWNoIDo9IHJlYWNoVW5pdHMoYXRrLnJhcml0eSwgYXRrLnNpemUsIGRvZGdlKQoJZGlzdDIgOj0gc3BhbiAqIDgwXzAwMCAqIDgwXzAwMAoJcmV0dXJuIGRpc3QyIDw9IHJlYWNoKnJlYWNoCn0KGux+CghmaXNoLmdubxLffi8vIFBhY2thZ2UgZmlzaCBpcyB0aGUgU2hvYWwgY29sbGVjdGlvbi4gRWFjaCBmaXNoIGlzIGEgR1JDNzIxIG9uIHRoaXMgcmVhbG0uCi8vIExpc3QsIGNhbmNlbCwgYnV5LCBhbmQgQml0ZSBsaXZlIGhlcmUgdG9vLiBHbm8gY2Fubm90IHB1bGwgYSBmb3JlaWduIHRva2VuIGludG8KLy8gQmF6YWFyLCBzbyB0aGUgYm9vayBpcyBub3QgYSBzZWNvbmQgcGFja2FnZS4KLy8KLy8gRGVwbG95ZWQgb24gb255eC0xIGF0IGduby5sYW5kL3IvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9zaG9hbC9maXNoLgovLyBJbml0IGRvZXMgbm90IGNhbGwgYmF6YWFydjIgUmVzZXJ2ZSBvciBSZWdpc3Rlci4gVGhlIG9sZGVyIGZpc2ggYW5kIGZpc2gyIHBhY2thZ2VzIHN0YXkgYXMgdGhleSB3ZXJlLgpwYWNrYWdlIGZpc2h0cnkKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJImVycm9ycyIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvbnQvZ3JjNzIxL21ldGFkYXRhL3YwIgoJImduby5sYW5kL3AvbnQvZ3JjNzIxL3YwIgoJImduby5sYW5kL3AvbnQvc2VxaWQvdjAiCgkiZ25vLmxhbmQvci9nMTByYWdkcjNjanFrYWVsOHJzbHB3NHk2cmxlbGhldjRoMGZzd2N4L3Nob2FsdG9rZW4iCikKCmNvbnN0ICgKCWRlbm9tICAgICAgICA9ICJ1Z25vdCIKCXVnbm90ICAgICAgICA9IDFfMDAwXzAwMAoJbGF5RmVlICAgICAgICAgPSAyICogdWdub3QKCWZpc2hVbml0ICAgICAgID0gMV8wMDBfMDAwCgl0d2FwVWdub3QgICAgICA9IDIwXzAwMAoJdXBncmFkZUZpc2hGZWUgPSAxNSAqIGZpc2hVbml0Cglwcm90b2NvbEJwcyAgICA9IDIwMAoJbWF4Um95YWx0eSAgID0gMTAwMAoJbWF4UHJpY2UgICAgID0gMV8wMDBfMDAwICogdWdub3QKCS8vIHN0YWtlQ2VpbCBpcyBNYXhJbnQ2NC8xMDAwMCBzbyBhIGJwcyBzcGxpdCBjYW5ub3Qgb3ZlcmZsb3cgaW50NjQuIEl0IGlzIG5vdCBhIGdhbWUgY2FwLgoJc3Rha2VDZWlsICAgID0gOTIyMzM3MjAzNjg1NDc3Cgljb21iYXRMb2NrTXMgPSA1MDAwCglsYXlCbG9ja3MgICAgPSAyCglsaXN0Q2FwICAgICAgPSA1MAopCgp0eXBlIGZpc2hCb2R5IHN0cnVjdCB7CglpZCAgICAgICAgICAgICAgaW50CgluYW1lICAgICAgICAgICAgc3RyaW5nCglyYXJpdHkgICAgICAgICAgc3RyaW5nCglzcGVjaWVzICAgICAgICAgc3RyaW5nCglzaXplICAgICAgICAgICAgc3RyaW5nCgl0cmFpdCAgICAgICAgICAgc3RyaW5nCglocCAgICAgICAgICAgICAgaW50CglocE5vdyAgICAgICAgICAgaW50Cglkb2RnZSAgICAgICAgICAgaW50Cglib3V0cyAgICAgICAgICAgaW50CglsYXlCb3V0c1VzZWQgICAgaW50CglsYXlPcGVuICAgICAgICAgYm9vbAoJbGF5SGVpZ2h0ICAgICAgIGludDY0Cglwb29sICAgICAgICAgICAgaW50NjQKCWluTWF0Y2ggICAgICAgICBib29sCglib3V0UGFpZCAgICAgICAgYm9vbAoJbXVzdEhlYWwgICAgICAgIGJvb2wKCXN0YXJ0VW5peCAgICAgICBpbnQ2NAoJZW5kVW5peCAgICAgICAgIGludDY0CglzeCAgICAgICAgICAgICAgaW50CglzeiAgICAgICAgICAgICAgaW50CglmYWNlRHggICAgICAgICAgaW50CglmYWNlRHogICAgICAgICAgaW50Cglncm93dGggICAgICAgICAgaW50Cglldm9sdmVkICAgICAgICAgYm9vbAoJYXNwZWN0ICAgICAgICAgIHN0cmluZwoJYXNwZWN0QnBzICAgICAgIGludAoJaGVhbERheSAgICAgICAgIGludDY0CgloZWFsc1VzZWQgICAgICAgaW50CgloZWFsUmVhZHlBdCAgICAgaW50NjQKCXNwcmluZ0Jvcm4gICAgICBpbnQ2NAoJbmV4dE1vdmVNaWxsaSAgIGludDY0CglidXJzdFVudGlsICAgICAgaW50NjQKCW5leHRCdXJzdEF0ICAgICBpbnQ2NAoJbmV4dEJpdGVNaWxsaSAgIGludDY0CglsYXN0Q29tYmF0TWlsbGkgaW50NjQKCWJpdHRlbkJ5ICAgICAgICBpbnQKCWJpdHRlblVudGlsICAgICBpbnQ2NAoJb3duZXIgICAgICAgICAgIGFkZHJlc3MKCXNlbGxlciAgICAgICAgICBhZGRyZXNzCglwcmljZSAgICAgICAgICAgaW50NjQKCWxpc3RlZCAgICAgICAgICBib29sCglidXJuZWQgICAgICAgICAgYm9vbAoJaW1hZ2UgICAgICAgICAgIHN0cmluZwp9Cgp2YXIgKAoJYm9kaWVzICAgICAgIFtdKmZpc2hCb2R5CgluZXh0SUQgICAgICAgaW50CgltaW50ZWQgICAgICAgaW50Cglpbml0ZWQgICAgICAgYm9vbAoJdG9rZW4gICAgICAgICpncmM3MjEuVG9rZW4KCWxlZGdlciAgICAgICAqZ3JjNzIxLlByaXZhdGVMZWRnZXIKCW1ldGFWaWV3ICAgICAqbWV0YWRhdGEuTWV0YWRhdGEKCW1ldGFMZWQgICAgICAqbWV0YWRhdGEuTGVkZ2VyCgl0b2tlblNlcSAgICAgc2VxaWQuSUQKCWNyZWF0b3IgICAgICBhZGRyZXNzCglzZWxmICAgICAgICAgYWRkcmVzcwoJdXBncmFkZVNpbmsgIGFkZHJlc3MKCWxwU2luayAgICAgICBhZGRyZXNzCglidXJuU2luayAgICAgYWRkcmVzcwoJdGVhbVNpbmsgICAgIGFkZHJlc3MKCXByb3RvY29sU2luayBhZGRyZXNzCglzZWFzb25TaW5rICAgYWRkcmVzcwoJZmlzaFJlc2VydmUgIGFkZHJlc3MKCXJveWFsdHlCcHMgICBpbnQ2NAoJaW1hZ2VCYXNlICAgIHN0cmluZwoJcG9ydHJhaXQgICAgIHN0cmluZwoJY29sTmFtZSAgICAgIHN0cmluZwoJY29sU3ltYm9sICAgIHN0cmluZwoJbWludEZlZSAgICAgIGludDY0ID0gMTUwICogdWdub3QKCXN0YWtlTWluICAgICBpbnQ2NCA9IDEwICogdWdub3QKKQoKZnVuYyBJbml0KGN1ciByZWFsbSwgbmFtZSwgc3ltYm9sLCBpbWFnZXMgc3RyaW5nLCByb3lhbHR5IGludDY0LCB1cGdyYWRlLCBscCwgYnVybiwgdGVhbSwgcHJvdG9jb2wsIHNlYXNvbiBhZGRyZXNzKSB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygiZmlzaDogcmVhbG0iKQoJfQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoImZpc2g6IGVvYSIpCgl9CglpZiBpbml0ZWQgewoJCXBhbmljKCJmaXNoOiBpbml0IikKCX0KCXRha2VFeGFjdCgwKQoJaWYgIXZhbGlkQ29sbGVjdGlvbk5hbWUobmFtZSkgfHwgIXZhbGlkU3ltYm9sKHN5bWJvbCkgewoJCXBhbmljKCJmaXNoOiBuYW1lIikKCX0KCWlmICFzdHJpbmdzLkhhc1ByZWZpeChpbWFnZXMsICJodHRwczovLyIpIHx8IHN0cmluZ3MuQ29udGFpbnMoaW1hZ2VzLCAifCIpIHx8IGxlbihpbWFnZXMpID4gMTYwIHsKCQlwYW5pYygiZmlzaDogaW1hZ2UiKQoJfQoJaWYgcm95YWx0eSA8IDAgfHwgcm95YWx0eSA+IG1heFJveWFsdHkgewoJCXBhbmljKCJmaXNoOiByb3lhbHR5IikKCX0KCWlmICF1cGdyYWRlLklzVmFsaWQoKSB8fCAhbHAuSXNWYWxpZCgpIHx8ICFidXJuLklzVmFsaWQoKSB8fCAhdGVhbS5Jc1ZhbGlkKCkgfHwgIXByb3RvY29sLklzVmFsaWQoKSB8fCAhc2Vhc29uLklzVmFsaWQoKSB7CgkJcGFuaWMoImZpc2g6IHNpbmsiKQoJfQoJdG9rLCBsZWQgOj0gZ3JjNzIxLk5ld1Rva2VuKG5hbWUsIHN5bWJvbCwgdG9rZW5TZXEuTmV4dCgpLCBjdXIpCgl0b2tlbiA9IHRvawoJbGVkZ2VyID0gbGVkCgltZXRhVmlldywgbWV0YUxlZCA9IG1ldGFkYXRhLk5ld01ldGFkYXRhKGxlZCkKCWNyZWF0b3IgPSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCXNlbGYgPSBjdXIuQWRkcmVzcygpCgl1cGdyYWRlU2luayA9IHVwZ3JhZGUKCWxwU2luayA9IGxwCglidXJuU2luayA9IGJ1cm4KCXRlYW1TaW5rID0gdGVhbQoJcHJvdG9jb2xTaW5rID0gcHJvdG9jb2wKCXNlYXNvblNpbmsgPSBzZWFzb24KCWZpc2hSZXNlcnZlID0gYWRkcmVzcygiIikKCXJveWFsdHlCcHMgPSByb3lhbHR5CglpbWFnZUJhc2UgPSBpbWFnZXMKCWNvbE5hbWUgPSBuYW1lCgljb2xTeW1ib2wgPSBzeW1ib2wKCWJvZGllcyA9IFtdKmZpc2hCb2R5e25pbH0KCW5leHRJRCA9IDAKCW1pbnRlZCA9IDAKCWluaXRlZCA9IHRydWUKCWNoYWluLkVtaXQoIkluaXQiLCAiY3JlYXRvciIsIGNyZWF0b3IuU3RyaW5nKCksICJzeW1ib2wiLCBzeW1ib2wpCn0KCmZ1bmMgTWludChjdXIgcmVhbG0sIG5hbWUsIHNpemUsIHRyYWl0IHN0cmluZykgaW50IHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglpZiB1bnBsYXllZChjYWxsZXIpIHsKCQlwYW5pYygiZmlzaDogdW5wbGF5ZWQiKQoJfQoJaWYgIXZhbGlkRmlzaE5hbWUobmFtZSkgewoJCXBhbmljKCJmaXNoOiBuYW1lIikKCX0KCWlmICF2YWxpZFNpemUoc2l6ZSkgewoJCXBhbmljKCJmaXNoOiBzaXplIikKCX0KCWlmICF2YWxpZFRyYWl0KHRyYWl0KSB7CgkJcGFuaWMoImZpc2g6IHRyYWl0IikKCX0KCXRha2VFeGFjdChtaW50RmVlKQoJcGF5TWludChtaW50RmVlLCBjdXIpCglyZXR1cm4gaXNzdWUoY2FsbGVyLCBuYW1lLCAiY29tbW9uIiwgc2l6ZSwgdHJhaXQpCn0KCi8vIFNldEFydCBzZXRzIG9uZSBodHRwcyBpbWFnZSBvbiBldmVyeSB1bmJ1cm5lZCBmaXNoLiBUaGUgY3JlYXRvciBtYXkgY2FsbCBpdCBhZ2Fpbi4KZnVuYyBTZXRBcnQoY3VyIHJlYWxtLCBpbWFnZSBzdHJpbmcpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCglyZXF1aXJlSW5pdCgpCglpZiBjYWxsZXIgIT0gY3JlYXRvciB7CgkJcGFuaWMoImZpc2g6IG93bmVyIikKCX0KCXRha2VFeGFjdCgwKQoJaWYgIXZhbGlkQXJ0KGltYWdlKSB7CgkJcGFuaWMoImZpc2g6IGltYWdlIikKCX0KCXBvcnRyYWl0ID0gaW1hZ2UKCWZvciBfLCBib2R5IDo9IHJhbmdlIGJvZGllcyB7CgkJaWYgYm9keSA9PSBuaWwgfHwgYm9keS5idXJuZWQgewoJCQljb250aW51ZQoJCX0KCQlib2R5LmltYWdlID0gaW1hZ2UKCQl3cml0ZVVSSShib2R5KQoJfQoJY2hhaW4uRW1pdCgiU2V0QXJ0IiwgImltYWdlIiwgaW1hZ2UpCn0KCmZ1bmMgUG9ydHJhaXQoKSBzdHJpbmcgewoJcmVxdWlyZUluaXQoKQoJcmV0dXJuIHBvcnRyYWl0Cn0KCmZ1bmMgVHJhbnNmZXIoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBpZCBpbnQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCgl0YWtlRXhhY3QoMCkKCWlmICF0by5Jc1ZhbGlkKCkgfHwgdG8gPT0gY2FsbGVyIHx8IHRvID09IHNlbGYgewoJCXBhbmljKCJmaXNoOiBhZGRyIikKCX0KCWJvZHkgOj0gbXVzdChpZCkKCWlmIGJvZHkub3duZXIgIT0gY2FsbGVyIHsKCQlwYW5pYygiZmlzaDogb3duZXIiKQoJfQoJZ3VhcmRNb3ZhYmxlKGJvZHkpCgltb3ZlVG9rZW4oY2FsbGVyLCBjYWxsZXIsIHRvLCBpZCkKCWJvZHkub3duZXIgPSB0bwp9CgpmdW5jIFRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvLCB0aWQgc3RyaW5nKSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJdGFrZUV4YWN0KDApCglpZCA6PSBwYXJzZUlEKHRpZCkKCXNyYyA6PSBhZGRyZXNzKGZyb20pCglkc3QgOj0gYWRkcmVzcyh0bykKCWlmICFzcmMuSXNWYWxpZCgpIHx8ICFkc3QuSXNWYWxpZCgpIHx8IGRzdCA9PSBzZWxmIHsKCQlwYW5pYygiZmlzaDogYWRkciIpCgl9Cglib2R5IDo9IG11c3QoaWQpCglpZiBib2R5Lm93bmVyICE9IHNyYyB7CgkJcGFuaWMoImZpc2g6IG93bmVyIikKCX0KCWd1YXJkTW92YWJsZShib2R5KQoJbW92ZVRva2VuKGNhbGxlciwgc3JjLCBkc3QsIGlkKQoJYm9keS5vd25lciA9IGRzdAp9CgpmdW5jIEFwcHJvdmUoY3VyIHJlYWxtLCB0bywgdGlkIHN0cmluZykgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCXRha2VFeGFjdCgwKQoJaWQgOj0gcGFyc2VJRCh0aWQpCglib2R5IDo9IG11c3QoaWQpCglndWFyZE1vdmFibGUoYm9keSkKCXdobyA6PSBhZGRyZXNzKHRvKQoJaWYgdG8gIT0gIiIgJiYgIXdoby5Jc1ZhbGlkKCkgewoJCXBhbmljKCJmaXNoOiBhZGRyIikKCX0KCWlmIGVyciA6PSBsZWRnZXIuQXBwcm92ZShjYWxsZXIsIHdobywgdG9rZW5JRChpZCkpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiZmlzaDogYXBwcm92ZSIpCgl9Cn0KCmZ1bmMgU2V0QXBwcm92YWxGb3JBbGwoY3VyIHJlYWxtLCBvcGVyYXRvciBzdHJpbmcsIGFwcHJvdmVkIGJvb2wpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCgl0YWtlRXhhY3QoMCkKCW9wIDo9IGFkZHJlc3Mob3BlcmF0b3IpCglpZiAhb3AuSXNWYWxpZCgpIHsKCQlwYW5pYygiZmlzaDogYWRkciIpCgl9CglpZiBlcnIgOj0gbGVkZ2VyLlNldEFwcHJvdmFsRm9yQWxsKGNhbGxlciwgb3AsIGFwcHJvdmVkKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImZpc2g6IGFwcHJvdmUiKQoJfQp9CgpmdW5jIE93bmVyT2YodGlkIHN0cmluZykgKGFkZHJlc3MsIGVycm9yKSB7CglyZXF1aXJlSW5pdCgpCglpZCwgZXJyIDo9IHN0cmNvbnYuQXRvaSh0aWQpCglpZiBlcnIgIT0gbmlsIHx8IGlkIDwgMSB8fCBpZCA+PSBsZW4oYm9kaWVzKSB8fCBib2RpZXNbaWRdID09IG5pbCB8fCBib2RpZXNbaWRdLmJ1cm5lZCB7CgkJcmV0dXJuIGFkZHJlc3MoIiIpLCBlcnJvcnMuTmV3KCJmaXNoOiB1bmtub3duIikKCX0KCXJldHVybiBib2RpZXNbaWRdLm93bmVyLCBuaWwKfQoKZnVuYyBOYW1lKCkgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCXJldHVybiB0b2tlbi5HZXROYW1lKCkKfQoKZnVuYyBTeW1ib2woKSBzdHJpbmcgewoJcmVxdWlyZUluaXQoKQoJcmV0dXJuIHRva2VuLkdldFN5bWJvbCgpCn0KCmZ1bmMgR3JjTmFtZSgpIHN0cmluZyAgIHsgcmV0dXJuIE5hbWUoKSB9CmZ1bmMgR3JjU3ltYm9sKCkgc3RyaW5nIHsgcmV0dXJuIFN5bWJvbCgpIH0KCmZ1bmMgQmFsYW5jZU9mKGFkZHIgc3RyaW5nKSBpbnQ2NCB7CglyZXF1aXJlSW5pdCgpCgl3aG8gOj0gYWRkcmVzcyhhZGRyKQoJaWYgIXdoby5Jc1ZhbGlkKCkgewoJCXJldHVybiAwCgl9CgluLCBlcnIgOj0gdG9rZW4uQmFsYW5jZU9mKHdobykKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gbgp9CgpmdW5jIEdyY0JhbGFuY2VPZihhZGRyIHN0cmluZykgaW50NjQgeyByZXR1cm4gQmFsYW5jZU9mKGFkZHIpIH0KCmZ1bmMgVG9rZW5VUkkodGlkIHN0cmluZykgc3RyaW5nIHsKCWlkIDo9IHBhcnNlSUQodGlkKQoJbXVzdChpZCkKCXVyaSwgZXJyIDo9IG1ldGFWaWV3LlRva2VuVVJJKHRva2VuSUQoaWQpKQoJaWYgZXJyICE9IG5pbCB8fCB1cmkgPT0gIiIgewoJCXBhbmljKCJmaXNoOiB1cmkiKQoJfQoJcmV0dXJuIHVyaQp9CgpmdW5jIFRva2Vuc09mKG93bmVyIHN0cmluZykgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCXdobyA6PSBhZGRyZXNzKG93bmVyKQoJaWYgIXdoby5Jc1ZhbGlkKCkgewoJCXJldHVybiAiIgoJfQoJb3V0IDo9ICIiCglmb3IgXywgYm9keSA6PSByYW5nZSBib2RpZXMgewoJCWlmIGJvZHkgPT0gbmlsIHx8IGJvZHkuYnVybmVkIHx8IGJvZHkub3duZXIgIT0gd2hvIHsKCQkJY29udGludWUKCQl9CgkJaWYgb3V0ICE9ICIiIHsKCQkJb3V0ICs9ICIsIgoJCX0KCQlvdXQgKz0gc3RyY29udi5JdG9hKGJvZHkuaWQpCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgVG9rZW5PZk93bmVyQnlJbmRleChvd25lciBzdHJpbmcsIGluZGV4IGludDY0KSBzdHJpbmcgewoJcmVxdWlyZUluaXQoKQoJd2hvIDo9IGFkZHJlc3Mob3duZXIpCglpZiAhd2hvLklzVmFsaWQoKSB7CgkJcGFuaWMoImZpc2g6IGFkZHIiKQoJfQoJaWYgaW5kZXggPCAwIHsKCQlwYW5pYygiZmlzaDogaW5kZXgiKQoJfQoJdmFyIHNlZW4gaW50NjQKCWZvciBfLCBib2R5IDo9IHJhbmdlIGJvZGllcyB7CgkJaWYgYm9keSA9PSBuaWwgfHwgYm9keS5idXJuZWQgfHwgYm9keS5vd25lciAhPSB3aG8gewoJCQljb250aW51ZQoJCX0KCQlpZiBzZWVuID09IGluZGV4IHsKCQkJcmV0dXJuIHN0cmNvbnYuSXRvYShib2R5LmlkKQoJCX0KCQlzZWVuKysKCX0KCXBhbmljKCJmaXNoOiBpbmRleCIpCn0KCmZ1bmMgVG90YWxTdXBwbHkoKSBpbnQ2NCB7CglyZXF1aXJlSW5pdCgpCglyZXR1cm4gdG9rZW4uVG90YWxTdXBwbHkoKQp9CgpmdW5jIEdldEFwcHJvdmVkKGlkIGludCkgc3RyaW5nIHsKCXJlcXVpcmVJbml0KCkKCXdobywgZXJyIDo9IHRva2VuLkdldEFwcHJvdmVkKHRva2VuSUQoaWQpKQoJaWYgZXJyICE9IG5pbCB8fCAhd2hvLklzVmFsaWQoKSB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gd2hvLlN0cmluZygpCn0KCmZ1bmMgSXNBcHByb3ZlZEZvckFsbChvd25lciwgb3BlcmF0b3Igc3RyaW5nKSBib29sIHsKCXJlcXVpcmVJbml0KCkKCWEgOj0gYWRkcmVzcyhvd25lcikKCWIgOj0gYWRkcmVzcyhvcGVyYXRvcikKCWlmICFhLklzVmFsaWQoKSB8fCAhYi5Jc1ZhbGlkKCkgewoJCXJldHVybiBmYWxzZQoJfQoJcmV0dXJuIHRva2VuLklzQXBwcm92ZWRGb3JBbGwoYSwgYikKfQoKZnVuYyBNaW50UHJpY2UoKSBpbnQ2NCAgIHsgcmV0dXJuIG1pbnRGZWUgfQpmdW5jIFN0YWtlTWluKCkgaW50NjQgICAgeyByZXR1cm4gc3Rha2VNaW4gfQpmdW5jIFN0YWtlQ2VpbCgpIGludDY0ICAgeyByZXR1cm4gc3Rha2VDZWlsIH0KZnVuYyBWZXJzaW9uKCkgc3RyaW5nICAgIHsgcmV0dXJuICJmaXNodHJ5LTEiIH0KCi8vIFNldEZpc2hSZXNlcnZlIG5hbWVzIHRoZSBhZGRyZXNzIHdob3NlIEZJU0ggYWxsb3dhbmNlIHBheXMgYSBraWxsLgovLyBUaGUgcmVzZXJ2ZSBtdXN0IGFwcHJvdmUgdGhpcyByZWFsbS4gVGhpcyBkb2VzIG5vdCBtaW50IEZJU0guCmZ1bmMgU2V0RmlzaFJlc2VydmUoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcykgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCXRha2VFeGFjdCgwKQoJcmVxdWlyZUluaXQoKQoJaWYgY2FsbGVyICE9IGNyZWF0b3IgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9CglpZiAhd2hvLklzVmFsaWQoKSB7CgkJcGFuaWMoImZpc2g6IHNpbmsiKQoJfQoJZmlzaFJlc2VydmUgPSB3aG8KCWNoYWluLkVtaXQoIlNldEZpc2hSZXNlcnZlIiwgIndobyIsIHdoby5TdHJpbmcoKSkKfQoKZnVuYyBGaXNoUmVzZXJ2ZSgpIGFkZHJlc3MgeyByZXR1cm4gZmlzaFJlc2VydmUgfQoKLy8gU2V0TWludEZlZSBjaGFuZ2VzIHRoZSBuZXh0IG1pbnQgcHJpY2UuIFRoZSBkZWZhdWx0IGlzIDE1MCBHTk9ULgpmdW5jIFNldE1pbnRGZWUoY3VyIHJlYWxtLCBuZXh0IGludDY0KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJdGFrZUV4YWN0KDApCglyZXF1aXJlSW5pdCgpCglpZiBjYWxsZXIgIT0gY3JlYXRvciB7CgkJcGFuaWMoImZpc2g6IG93bmVyIikKCX0KCWlmIG5leHQgPCB1Z25vdCB8fCBuZXh0ID4gMTAwMCp1Z25vdCB7CgkJcGFuaWMoImZpc2g6IGZlZSIpCgl9CgltaW50RmVlID0gbmV4dAoJY2hhaW4uRW1pdCgiU2V0TWludEZlZSIsICJ1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KG5leHQsIDEwKSkKfQoKLy8gU2V0U3Rha2VNaW4gY2hhbmdlcyB0aGUgc2VhIGZsb29yLiBUaGVyZSBpcyBubyBwcm9kdWN0IG1heGltdW0uIHN0YWtlQ2VpbCBzdGF5cyB0aGUgaW50ZWdlciBjZWlsaW5nLgpmdW5jIFNldFN0YWtlTWluKGN1ciByZWFsbSwgbmV4dCBpbnQ2NCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCXRha2VFeGFjdCgwKQoJcmVxdWlyZUluaXQoKQoJaWYgY2FsbGVyICE9IGNyZWF0b3IgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9CglpZiBuZXh0IDwgdWdub3QgfHwgbmV4dCA+IHN0YWtlQ2VpbCB7CgkJcGFuaWMoImZpc2g6IHN0YWtlIikKCX0KCXN0YWtlTWluID0gbmV4dAoJY2hhaW4uRW1pdCgiU2V0U3Rha2VNaW4iLCAidWdub3QiLCBzdHJjb252LkZvcm1hdEludChuZXh0LCAxMCkpCn0KZnVuYyBNYXhTdXBwbHkoKSBpbnQgICAgIHsgcmV0dXJuIDAgfQpmdW5jIE1pbnRlZCgpIGludCAgICAgICAgeyByZXR1cm4gbWludGVkIH0KZnVuYyBSb3lhbHR5QnBzKCkgaW50NjQgIHsgcmV0dXJuIHJveWFsdHlCcHMgfQpmdW5jIENyZWF0b3IoKSBhZGRyZXNzICAgeyByZXR1cm4gY3JlYXRvciB9CmZ1bmMgUHJvdG9jb2xCcHMoKSBpbnQ2NCB7IHJldHVybiBwcm90b2NvbEJwcyB9CgpmdW5jIEJvdXRzT2YoaWQgaW50KSBpbnQgICAgICB7IHJldHVybiBtdXN0KGlkKS5ib3V0cyB9CmZ1bmMgUG9vbE9mKGlkIGludCkgaW50NjQgICAgIHsgcmV0dXJuIG11c3QoaWQpLnBvb2wgfQpmdW5jIExpc3RlZChpZCBpbnQpIGJvb2wgICAgICB7IHJldHVybiBtdXN0KGlkKS5saXN0ZWQgfQpmdW5jIEluTWF0Y2goaWQgaW50KSBib29sICAgICB7IHJldHVybiBtdXN0KGlkKS5pbk1hdGNoIH0KZnVuYyBMYXlPcGVuKGlkIGludCkgYm9vbCAgICAgeyByZXR1cm4gbXVzdChpZCkubGF5T3BlbiB9CmZ1bmMgUmFyaXR5T2YoaWQgaW50KSBzdHJpbmcgIHsgcmV0dXJuIG11c3QoaWQpLnJhcml0eSB9CmZ1bmMgU2l6ZU9mKGlkIGludCkgc3RyaW5nICAgIHsgcmV0dXJuIG11c3QoaWQpLnNpemUgfQpmdW5jIFRyYWl0T2YoaWQgaW50KSBzdHJpbmcgICB7IHJldHVybiBtdXN0KGlkKS50cmFpdCB9CmZ1bmMgU3BlY2llc09mKGlkIGludCkgc3RyaW5nIHsgcmV0dXJuIG11c3QoaWQpLnNwZWNpZXMgfQoKZnVuYyBpc3N1ZSh0byBhZGRyZXNzLCBuYW1lLCByYXJpdHksIHNpemUsIHRyYWl0IHN0cmluZykgaW50IHsKCW5leHRJRCsrCglpZCA6PSBuZXh0SUQKCW1heEhQIDo9IGhwT2YocmFyaXR5LCBzaXplLCB0cmFpdCkKCWJvZHkgOj0gJmZpc2hCb2R5ewoJCWlkOiAgICAgIGlkLAoJCW5hbWU6ICAgIG5hbWUsCgkJcmFyaXR5OiAgcmFyaXR5LAoJCXNwZWNpZXM6IHNwZWNpZXNPZihyYXJpdHkpLAoJCXNpemU6ICAgIHNpemUsCgkJdHJhaXQ6ICAgdHJhaXQsCgkJaHA6ICAgICAgbWF4SFAsCgkJaHBOb3c6ICAgbWF4SFAsCgkJZG9kZ2U6ICAgICAgICAgICBkb2RnZU9mKHNpemUpLAoJCWZhY2VEeDogICAgICAgICAgMCwKCQlmYWNlRHo6ICAgICAgICAgIC0xLAoJCWFzcGVjdEJwczogICAgICAgMTAwMDAsCgkJc3ByaW5nQm9ybjogICAgICAtMSwKCQlsYXN0Q29tYmF0TWlsbGk6IC0xLAoJCW93bmVyOiAgICAgICAgICAgdG8sCgkJaW1hZ2U6ICAgYXJ0T2YocmFyaXR5KSwKCX0KCWZvciBsZW4oYm9kaWVzKSA8PSBpZCB7CgkJYm9kaWVzID0gYXBwZW5kKGJvZGllcywgbmlsKQoJfQoJYm9kaWVzW2lkXSA9IGJvZHkKCW1pbnRlZCsrCgltaW50R1JDKHRvLCBib2R5KQoJcmV0dXJuIGlkCn0KCmZ1bmMgbWludEdSQyh0byBhZGRyZXNzLCBib2R5ICpmaXNoQm9keSkgewoJdGlkIDo9IHRva2VuSUQoYm9keS5pZCkKCWlmIGVyciA6PSBsZWRnZXIuTWludCh0bywgdGlkKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImZpc2g6IG1pbnQiKQoJfQoJd3JpdGVVUkkoYm9keSkKfQoKZnVuYyB3cml0ZVVSSShib2R5ICpmaXNoQm9keSkgewoJaWYgZXJyIDo9IG1ldGFMZWQuU2V0VG9rZW5VUkkodG9rZW5JRChib2R5LmlkKSwgdG9rZW5KU09OKGJvZHkpKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImZpc2g6IHVyaSIpCgl9Cn0KCmZ1bmMgYXJ0T2YocmFyaXR5IHN0cmluZykgc3RyaW5nIHsKCWlmIHBvcnRyYWl0ICE9ICIiIHsKCQlyZXR1cm4gcG9ydHJhaXQKCX0KCXJldHVybiBpbWFnZUJhc2UgKyAiLyIgKyByYXJpdHkgKyAiLnBuZyIKfQoKZnVuYyBidXJuR1JDKGlkIGludCkgewoJaWYgZXJyIDo9IGxlZGdlci5CdXJuKHRva2VuSUQoaWQpKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImZpc2g6IGJ1cm4iKQoJfQp9CgpmdW5jIG1vdmVUb2tlbihzcGVuZGVyLCBmcm9tLCB0byBhZGRyZXNzLCBpZCBpbnQpIHsKCWlmIGVyciA6PSBsZWRnZXIuVHJhbnNmZXJGcm9tKHNwZW5kZXIsIGZyb20sIHRvLCB0b2tlbklEKGlkKSk7IGVyciAhPSBuaWwgewoJCXBhbmljKCJmaXNoOiB0cmFuc2ZlciIpCgl9Cn0KCmZ1bmMgdG9rZW5KU09OKGJvZHkgKmZpc2hCb2R5KSBzdHJpbmcgewoJcmV0dXJuICJkYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCwiICsKCQlgeyJuYW1lIjoiYCArIGJvZHkubmFtZSArIGAiLCJkZXNjcmlwdGlvbiI6IlNob2FsIGZpc2giLCJpbWFnZSI6ImAgKyBib2R5LmltYWdlICsKCQlgIiwiYXR0cmlidXRlcyI6W3sidHJhaXRfdHlwZSI6IlNwZWNpZXMiLCJ2YWx1ZSI6ImAgKyBib2R5LnNwZWNpZXMgKwoJCWAifSx7InRyYWl0X3R5cGUiOiJTaXplIiwidmFsdWUiOiJgICsgYm9keS5zaXplICsKCQlgIn0seyJ0cmFpdF90eXBlIjoiVHJhaXQiLCJ2YWx1ZSI6ImAgKyBib2R5LnRyYWl0ICsKCQlgIn0seyJ0cmFpdF90eXBlIjoiUmFyaXR5IiwidmFsdWUiOiJgICsgYm9keS5yYXJpdHkgKwoJCWAifSx7InRyYWl0X3R5cGUiOiJIUCIsInZhbHVlIjoiYCArIHN0cmNvbnYuSXRvYShib2R5LmhwKSArIGAifV19YAp9CgpmdW5jIHJlcXVpcmVVc2VyKGN1ciByZWFsbSkgYWRkcmVzcyB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygiZmlzaDogcmVhbG0iKQoJfQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoImZpc2g6IGVvYSIpCgl9CglyZXR1cm4gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCn0KCmZ1bmMgcmVxdWlyZUluaXQoKSB7CglpZiAhaW5pdGVkIHx8IHRva2VuID09IG5pbCB7CgkJcGFuaWMoImZpc2g6IGluaXQiKQoJfQp9CgpmdW5jIHRha2VFeGFjdChuIGludDY0KSB7CglzZW50IDo9IHVuc2FmZS5PcmlnaW5TZW5kKCkKCWlmIG4gPT0gMCB7CgkJaWYgbGVuKHNlbnQpICE9IDAgewoJCQlwYW5pYygiZmlzaDogcGF5bWVudCIpCgkJfQoJCXJldHVybgoJfQoJaWYgbGVuKHNlbnQpICE9IDEgfHwgc2VudFswXS5EZW5vbSAhPSBkZW5vbSB8fCBzZW50WzBdLkFtb3VudCAhPSBuIHsKCQlwYW5pYygiZmlzaDogcGF5bWVudCIpCgl9Cn0KCmZ1bmMgcGF5TWludChmZWUgaW50NjQsIHJsbSByZWFsbSkgewoJdXAgOj0gZmVlICogNjAwMCAvIDEwMDAwCglscCA6PSBmZWUgKiAyMDAwIC8gMTAwMDAKCXRlYW0gOj0gZmVlICogMTAwMCAvIDEwMDAwCglidXJuIDo9IGZlZSAtIHVwIC0gbHAgLSB0ZWFtCglzZW5kKHVwZ3JhZGVTaW5rLCB1cCwgcmxtKQoJc2VuZChscFNpbmssIGxwLCBybG0pCglzZW5kKHRlYW1TaW5rLCB0ZWFtLCBybG0pCglzZW5kKGJ1cm5TaW5rLCBidXJuLCBybG0pCn0KCmZ1bmMgZmlzaFRva2VuUmVhZHkoKSBib29sIHsKCXJldHVybiBzZWxmICE9IGFkZHJlc3MoIiIpICYmIHNob2FsdG9rZW4uU2VhbGVkKCkgJiYgc2hvYWx0b2tlbi5TcGVuZGVyKCkgPT0gc2VsZgp9CgpmdW5jIHNlbmQodG8gYWRkcmVzcywgYW10IGludDY0LCBybG0gcmVhbG0pIHsKCWlmIGFtdCA9PSAwIHsKCQlyZXR1cm4KCX0KCWlmICF0by5Jc1ZhbGlkKCkgewoJCXBhbmljKCJmaXNoOiBzaW5rIikKCX0KCWJrIDo9IGJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIHJsbSkKCWJrLlNlbmRDb2lucyhybG0uQWRkcmVzcygpLCB0bywgY2hhaW4uQ29pbnN7e0Rlbm9tOiBkZW5vbSwgQW1vdW50OiBhbXR9fSkKfQoKZnVuYyBtdXN0KGlkIGludCkgKmZpc2hCb2R5IHsKCXJlcXVpcmVJbml0KCkKCWlmIGlkIDwgMSB8fCBpZCA+PSBsZW4oYm9kaWVzKSB8fCBib2RpZXNbaWRdID09IG5pbCB8fCBib2RpZXNbaWRdLmJ1cm5lZCB7CgkJcGFuaWMoImZpc2g6IHVua25vd24iKQoJfQoJcmV0dXJuIGJvZGllc1tpZF0KfQoKZnVuYyBndWFyZE1vdmFibGUoYm9keSAqZmlzaEJvZHkpIHsKCWlmIGJvZHkubGlzdGVkIHsKCQlwYW5pYygiZmlzaDogbGlzdGVkIikKCX0KCWlmIGJvZHkuaW5NYXRjaCB7CgkJcGFuaWMoImZpc2g6IG1hdGNoIikKCX0KCWlmIGJvZHkucG9vbCAhPSAwIHsKCQlwYW5pYygiZmlzaDogcG9vbCIpCgl9CglpZiBib2R5LmxheU9wZW4gewoJCXBhbmljKCJmaXNoOiBsYXkiKQoJfQp9CgpmdW5jIHVucGxheWVkKG93bmVyIGFkZHJlc3MpIGJvb2wgewoJZm9yIF8sIGJvZHkgOj0gcmFuZ2UgYm9kaWVzIHsKCQlpZiBib2R5ID09IG5pbCB8fCBib2R5LmJ1cm5lZCB8fCBib2R5LmJvdXRzID49IDEgewoJCQljb250aW51ZQoJCX0KCQlpZiBib2R5Lm93bmVyID09IG93bmVyIHx8IChib2R5Lmxpc3RlZCAmJiBib2R5LnNlbGxlciA9PSBvd25lcikgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CgpmdW5jIHRva2VuSUQoaWQgaW50KSBncmM3MjEuVG9rZW5JRCB7CglyZXR1cm4gZ3JjNzIxLlRva2VuSUQoc3RyY29udi5JdG9hKGlkKSkKfQoKZnVuYyBwYXJzZUlEKHRpZCBzdHJpbmcpIGludCB7CglpZCwgZXJyIDo9IHN0cmNvbnYuQXRvaSh0aWQpCglpZiBlcnIgIT0gbmlsIHx8IGlkIDwgMSB7CgkJcGFuaWMoImZpc2g6IHVua25vd24iKQoJfQoJcmV0dXJuIGlkCn0KCmZ1bmMgdmFsaWRGaXNoTmFtZShuYW1lIHN0cmluZykgYm9vbCB7CglpZiBsZW4obmFtZSkgPCAxIHx8IGxlbihuYW1lKSA+IDIwIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBjIDo9IHJhbmdlIG5hbWUgewoJCWlmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmIChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJyAnIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKZnVuYyB2YWxpZENvbGxlY3Rpb25OYW1lKG5hbWUgc3RyaW5nKSBib29sIHsKCXJldHVybiBuYW1lICE9ICIiICYmIGxlbihuYW1lKSA8PSA2NCAmJiAhc3RyaW5ncy5Db250YWlucyhuYW1lLCAifCIpCn0KCmZ1bmMgdmFsaWRBcnQoaW1hZ2Ugc3RyaW5nKSBib29sIHsKCWlmICFzdHJpbmdzLkhhc1ByZWZpeChpbWFnZSwgImh0dHBzOi8vIikgfHwgbGVuKGltYWdlKSA+IDE2MCB8fCBzdHJpbmdzLkNvbnRhaW5zKGltYWdlLCAifCIpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIHN0cmluZ3MuQ29udGFpbnMoaW1hZ2UsIGAiYCkgfHwgc3RyaW5ncy5Db250YWlucyhpbWFnZSwgIlxuIikgfHwgc3RyaW5ncy5Db250YWlucyhpbWFnZSwgIlxcIikgewoJCXJldHVybiBmYWxzZQoJfQoJcmV0dXJuIHRydWUKfQoKZnVuYyB2YWxpZFN5bWJvbChzeW1ib2wgc3RyaW5nKSBib29sIHsKCWlmIHN5bWJvbCA9PSAiIiB8fCBsZW4oc3ltYm9sKSA+IGdyYzcyMS5NYXhTeW1ib2xMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIF8sIGMgOj0gcmFuZ2Ugc3ltYm9sIHsKCQlpZiAoYyA8ICdhJyB8fCBjID4gJ3onKSAmJiAoYyA8ICdBJyB8fCBjID4gJ1onKSAmJiAoYyA8ICcwJyB8fCBjID4gJzknKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgdmFsaWRTaXplKHNpemUgc3RyaW5nKSBib29sIHsKCXJldHVybiBzaXplID09ICJzbWFsbCIgfHwgc2l6ZSA9PSAibWVkaXVtIiB8fCBzaXplID09ICJsYXJnZSIKfQoKZnVuYyB2YWxpZFRyYWl0KHRyYWl0IHN0cmluZykgYm9vbCB7CglyZXR1cm4gdHJhaXQgPT0gInN3aWZ0IiB8fCB0cmFpdCA9PSAiZmFuZyIgfHwgdHJhaXQgPT0gImhpZGUiCn0KCmZ1bmMgc3BlY2llc09mKHJhcml0eSBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggcmFyaXR5IHsKCWNhc2UgImNvbW1vbiI6CgkJcmV0dXJuICJNaW5ub3ciCgljYXNlICJ1bmNvbW1vbiI6CgkJcmV0dXJuICJNYWNrZXJlbCIKCWNhc2UgInJhcmUiOgoJCXJldHVybiAiU25hcHBlciIKCWNhc2UgImVwaWMiOgoJCXJldHVybiAiQW5nbGVyIgoJY2FzZSAibGVnZW5kYXJ5IjoKCQlyZXR1cm4gIktvaSBEcmFnb24iCgljYXNlICJteXRoaWMiOgoJCXJldHVybiAiQWJ5c3MgTGV2aWF0aGFuIgoJZGVmYXVsdDoKCQlwYW5pYygiZmlzaDogcmFyaXR5IikKCX0KfQoKZnVuYyBocEJhc2UocmFyaXR5IHN0cmluZykgaW50IHsKCXN3aXRjaCByYXJpdHkgewoJY2FzZSAiY29tbW9uIjoKCQlyZXR1cm4gMTAwCgljYXNlICJ1bmNvbW1vbiI6CgkJcmV0dXJuIDExMgoJY2FzZSAicmFyZSI6CgkJcmV0dXJuIDEyNgoJY2FzZSAiZXBpYyI6CgkJcmV0dXJuIDE0MgoJY2FzZSAibGVnZW5kYXJ5IjoKCQlyZXR1cm4gMTYwCgljYXNlICJteXRoaWMiOgoJCXJldHVybiAxODAKCWRlZmF1bHQ6CgkJcGFuaWMoImZpc2g6IHJhcml0eSIpCgl9Cn0KCmZ1bmMgaHBPZihyYXJpdHksIHNpemUsIHRyYWl0IHN0cmluZykgaW50IHsKCWhwIDo9IGhwQmFzZShyYXJpdHkpCglpZiBzaXplID09ICJzbWFsbCIgewoJCWhwID0gaHAgKiA4OCAvIDEwMAoJfQoJaWYgc2l6ZSA9PSAibGFyZ2UiIHsKCQlocCA9IGhwICogMTIwIC8gMTAwCgl9CglpZiB0cmFpdCA9PSAiaGlkZSIgewoJCWhwID0gaHAgKiAxMTIgLyAxMDAKCX0KCWlmIGhwIDwgMSB7CgkJaHAgPSAxCgl9CglyZXR1cm4gaHAKfQoKZnVuYyBkb2RnZU9mKHNpemUgc3RyaW5nKSBpbnQgewoJaWYgc2l6ZSA9PSAic21hbGwiIHsKCQlyZXR1cm4gMjQKCX0KCXJldHVybiAwCn0KCmZ1bmMgYXJlbmFTdGFrZShzdGFrZSBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gc3Rha2UgPj0gc3Rha2VNaW4gJiYgc3Rha2UgPD0gc3Rha2VDZWlsCn0KGmIKC2dub21vZC50b21sElMKbW9kdWxlID0gImduby5sYW5kL3IvZzEwcmFnZHIzY2pxa2FlbDhyc2xwdzR5NnJsZWxoZXY0aDBmc3djeC9maXNodHJ5Igpnbm8gPSAiMC45IhrUHgoIbGlmZS5nbm8Sxx5wYWNrYWdlIGZpc2h0cnkKCmltcG9ydCAoCgkiY2hhaW4vcnVudGltZSIKCSJjcnlwdG8vc2hhMjU2IgoJInN0cmNvbnYiCgkidGltZSIKCgkiZ25vLmxhbmQvci9nMTByYWdkcjNjanFrYWVsOHJzbHB3NHk2cmxlbGhldjRoMGZzd2N4L3Nob2FsdG9rZW4iCikKCmZ1bmMgUmVnaXN0ZXIoY3VyIHJlYWxtLCBpZCBpbnQsIHN0YWtlIGludDY0KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJYm9keSA6PSBtdXN0KGlkKQoJaWYgYm9keS5vd25lciAhPSBjYWxsZXIgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9CglpZiBib2R5LmluTWF0Y2ggewoJCXBhbmljKCJmaXNoOiBtYXRjaCIpCgl9CglpZiBib2R5Lm11c3RIZWFsIHsKCQlwYW5pYygiZmlzaDogaGVhbCIpCgl9CglndWFyZE1vdmFibGUoYm9keSkKCWlmIHRvb0h1cnQoYm9keSkgewoJCXBhbmljKCJmaXNoOiBocCIpCgl9CglpZiB3YWxsZXRJblNlYShjYWxsZXIpIHsKCQlwYW5pYygiZmlzaDogb25lIikKCX0KCWlmICFhcmVuYVN0YWtlKHN0YWtlKSB7CgkJcGFuaWMoImZpc2g6IHN0YWtlIikKCX0KCXRha2VFeGFjdChzdGFrZSkKCW5vdyA6PSB0aW1lLk5vdygpLlVuaXgoKQoJYm9keS5wb29sID0gc3Rha2UKCWJvZHkuaW5NYXRjaCA9IHRydWUKCWJvZHkuYm91dFBhaWQgPSBmYWxzZQoJYm9keS5zdGFydFVuaXggPSBub3cKCWJvZHkuZW5kVW5peCA9IDAKCWJvZHkubGFzdENvbWJhdE1pbGxpID0gLTEKCWJvZHkubmV4dE1vdmVNaWxsaSA9IDAKCWJvZHkuYnVyc3RVbnRpbCA9IDAKCWJvZHkubmV4dEJ1cnN0QXQgPSAwCglib2R5LnNwcmluZ0Jvcm4gPSAtMQoJcGxhY2VTd2ltbWVyKGJvZHkpCgljbGVhckRhbWFnZShpZCkKfQoKZnVuYyBMZWF2ZShjdXIgcmVhbG0sIGlkIGludCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCXRha2VFeGFjdCgwKQoJYm9keSA6PSBtdXN0KGlkKQoJaWYgYm9keS5vd25lciAhPSBjYWxsZXIgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9CglpZiAhYm9keS5pbk1hdGNoIHsKCQlwYW5pYygiZmlzaDogbWF0Y2giKQoJfQoJbm93TXMgOj0gdGltZS5Ob3coKS5Vbml4TWlsbGkoKQoJaWYgYm9keS5sYXN0Q29tYmF0TWlsbGkgPj0gMCAmJiBub3dNcyA8IGJvZHkubGFzdENvbWJhdE1pbGxpK2NvbWJhdExvY2tNcyB7CgkJcGFuaWMoImZpc2g6IHN0YXkiKQoJfQoJcmV0dXJuQ2hlZXJzKGJvZHksIGN1cikKCXN0YWtlIDo9IGJvZHkucG9vbAoJYm9keS5wb29sID0gMAoJYm9keS5pbk1hdGNoID0gZmFsc2UKCWJvZHkuYm91dFBhaWQgPSBmYWxzZQoJY2xlYXJEYW1hZ2UoaWQpCglzZW5kKGNhbGxlciwgc3Rha2UsIGN1cikKfQoKZnVuYyBTZXR0bGVNYXRjaChjdXIgcmVhbG0sIGlkIGludCkgewoJcmVxdWlyZVVzZXIoY3VyKQoJdGFrZUV4YWN0KDApCglib2R5IDo9IG11c3QoaWQpCglpZiAhYm9keS5pbk1hdGNoIHsKCQlwYW5pYygiZmlzaDogbWF0Y2giKQoJfQoJXyA9IGJvZHkKCXBhbmljKCJmaXNoOiBzZWEiKQp9CgpmdW5jIENvbW1pdExheShjdXIgcmVhbG0sIGlkIGludCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCWJvZHkgOj0gbXVzdChpZCkKCWlmIGJvZHkub3duZXIgIT0gY2FsbGVyIHsKCQlwYW5pYygiZmlzaDogb3duZXIiKQoJfQoJZ3VhcmRNb3ZhYmxlKGJvZHkpCglsZWZ0IDo9IGJvZHkuYm91dHMgLSBib2R5LmxheUJvdXRzVXNlZAoJaWYgbGVmdCA8IDMgewoJCXBhbmljKCJmaXNoOiBib3V0cyIpCgl9Cgl0YWtlRXhhY3QobGF5RmVlKQoJcGF5TWludChsYXlGZWUsIGN1cikKCWJvZHkubGF5Qm91dHNVc2VkID0gYm9keS5ib3V0cwoJYm9keS5sYXlPcGVuID0gdHJ1ZQoJYm9keS5sYXlIZWlnaHQgPSBydW50aW1lLkNoYWluSGVpZ2h0KCkKfQoKZnVuYyBTZXR0bGVMYXkoY3VyIHJlYWxtLCBpZCBpbnQpIGludCB7CglyZXF1aXJlVXNlcihjdXIpCgl0YWtlRXhhY3QoMCkKCWJvZHkgOj0gbXVzdChpZCkKCWlmICFib2R5LmxheU9wZW4gewoJCXBhbmljKCJmaXNoOiBsYXkiKQoJfQoJaGVpZ2h0IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWYgaGVpZ2h0IDwgYm9keS5sYXlIZWlnaHQrbGF5QmxvY2tzIHsKCQlwYW5pYygiZmlzaDogZWFybHkiKQoJfQoJdHJhaXQgOj0gdHJhaXRGcm9tKGJvZHkuaWQsIGJvZHkubGF5SGVpZ2h0LCBoZWlnaHQsIHRpbWUuTm93KCkuVW5peCgpKQoJYm9keS5sYXlPcGVuID0gZmFsc2UKCXJldHVybiBpc3N1ZShib2R5Lm93bmVyLCBib2R5Lm5hbWUrIiBmcnkiLCBib2R5LnJhcml0eSwgYm9keS5zaXplLCB0cmFpdCkKfQoKLy8gVXBncmFkZSBzcGVuZHMgMTUgRklTSCB0byBzdGVwIHR3byBwbGF5ZWQgQ29tbW9uIGZpc2ggdG8gVW5jb21tb24uCi8vIFRoZSBGSVNIIGZlZSBidXJucy4gVGhlIHRlYW0gdGFrZXMgbm9uZSBvZiBpdC4gTm8gR05PVCBtb3Zlcy4KLy8gSGlnaGVyIHRpZXJzIHN0YXkgY2xvc2VkIHVudGlsIGEgY29tbWl0LXJldmVhbCByb2xsIGV4aXN0cy4KZnVuYyBVcGdyYWRlKGN1ciByZWFsbSwga2VlcCwgZm9vZCBpbnQpIGludCB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJaWYga2VlcCA9PSBmb29kIHsKCQlwYW5pYygiZmlzaDogdXBncmFkZSIpCgl9CglhIDo9IG11c3Qoa2VlcCkKCWIgOj0gbXVzdChmb29kKQoJaWYgYS5vd25lciAhPSBjYWxsZXIgfHwgYi5vd25lciAhPSBjYWxsZXIgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9CglndWFyZE1vdmFibGUoYSkKCWd1YXJkTW92YWJsZShiKQoJaWYgYS5yYXJpdHkgIT0gYi5yYXJpdHkgfHwgYS5zaXplICE9IGIuc2l6ZSB8fCBhLnRyYWl0ICE9IGIudHJhaXQgewoJCXBhbmljKCJmaXNoOiBwYWlyIikKCX0KCWlmIGEuYm91dHMgPCAxIHx8IGIuYm91dHMgPCAxIHsKCQlwYW5pYygiZmlzaDogYm91dHMiKQoJfQoJaWYgYS5yYXJpdHkgIT0gImNvbW1vbiIgewoJCXBhbmljKCJmaXNoOiByb2xsIikKCX0KCXRha2VFeGFjdCgwKQoJaWYgIWZpc2hUb2tlblJlYWR5KCkgewoJCXBhbmljKCJmaXNoOiBmaXNoIikKCX0KCWdvdCA6PSBzaG9hbHRva2VuLkRyYXcoY3Jvc3MoY3VyKSwgY2FsbGVyLCBidXJuU2luaywgdXBncmFkZUZpc2hGZWUpCglpZiBnb3QgIT0gdXBncmFkZUZpc2hGZWUgewoJCXBhbmljKCJmaXNoOiBmaXNoIikKCX0KCW5hbWUgOj0gYS5uYW1lCglzaXplIDo9IGEuc2l6ZQoJdHJhaXQgOj0gYS50cmFpdAoJYnVybkJvZHkoYSkKCWJ1cm5Cb2R5KGIpCglyZXR1cm4gaXNzdWUoY2FsbGVyLCBuYW1lLCAidW5jb21tb24iLCBzaXplLCB0cmFpdCkKfQoKZnVuYyBidXJuQm9keShib2R5ICpmaXNoQm9keSkgewoJYnVybkdSQyhib2R5LmlkKQoJYm9keS5idXJuZWQgPSB0cnVlCglib2R5Lm93bmVyID0gYWRkcmVzcygiIikKCWJvZHkuc2VsbGVyID0gYWRkcmVzcygiIikKCWJvZHkucHJpY2UgPSAwCglib2R5Lmxpc3RlZCA9IGZhbHNlCglib2R5LnBvb2wgPSAwCglib2R5LmluTWF0Y2ggPSBmYWxzZQoJYm9keS5sYXlPcGVuID0gZmFsc2UKfQoKZnVuYyB0cmFpdEZyb20oaWQgaW50LCBjb21taXRIZWlnaHQsIHNldHRsZUhlaWdodCwgdW5peCBpbnQ2NCkgc3RyaW5nIHsKCXJhdyA6PSBzdHJjb252Lkl0b2EoaWQpICsgIjoiICsgc3RyY29udi5Gb3JtYXRJbnQoY29tbWl0SGVpZ2h0LCAxMCkgKyAiOiIgKyBzdHJjb252LkZvcm1hdEludChzZXR0bGVIZWlnaHQsIDEwKSArICI6IiArIHN0cmNvbnYuRm9ybWF0SW50KHVuaXgsIDEwKQoJc3VtIDo9IHNoYTI1Ni5TdW0yNTYoW11ieXRlKHJhdykpCgl2YXIgbiBpbnQ2NAoJZm9yIGkgOj0gMDsgaSA8IGxlbihzdW0pOyBpKysgewoJCW4gPSAobioyNTYgKyBpbnQ2NChzdW1baV0pKSAlIDMKCX0KCXN3aXRjaCBuIHsKCWNhc2UgMDoKCQlyZXR1cm4gInN3aWZ0IgoJY2FzZSAxOgoJCXJldHVybiAiZmFuZyIKCWRlZmF1bHQ6CgkJcmV0dXJuICJoaWRlIgoJfQp9ChrDmAEKB3NlYS5nbm8StpgBcGFja2FnZSBmaXNodHJ5CgppbXBvcnQgKAoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJIm1hdGgiCgkidGltZSIKKQoKLy8gT25lIHNoYXJlZCBzZWEuIENlbGxzIGFyZSA4IHdvcmxkIHVuaXRzLiBBIHNlY3RvciBjZW50ZXIgaXMgdGhlIGNoYWluIHBvc2l0aW9uLgovLyBTcHJpbmdzIGFuZCBzaGVsdGVyIGRpc2NzIHVzZSB0aGUgc2FtZSBsYXlvdXQgYXMgdGhlIHByYWN0aWNlIHNlYS4gTm8gUk5HLgoKY29uc3QgKAoJc2VhUmFkaXVzICAgICAgICAgPSAzNjAKCXNlY3RvciAgICAgICAgICAgID0gOAoJdW5pdE1pbGxpICAgICAgICAgPSAxMDAwCglzZWN0b3JNaWxsaSAgICAgICA9IDgwMDAKCW1vdXRoQWxpZ25OdW0gICAgID0gNTUyMjY0Cgltb3V0aENvbnRhY3QgICAgICA9IDEwMDAKCWhlYWxzUGVyRGF5ICAgICAgID0gMgoJaGVhbFBlcmNlbnQgICAgICAgPSA0MAoJaGVhbENvb2xkb3duTXMgICAgPSA4ICogMzYwMCAqIDEwMDAKCWljdE9mZnNldE1zICAgICAgID0gNyAqIDM2MDAgKiAxMDAwCglkYXlNcyAgICAgICAgICAgICA9IDI0ICogMzYwMCAqIDEwMDAKCXNwcmluZ1BlcmlvZE1zICAgID0gMjAwMDAKCXNwcmluZ0xpZmVNcyAgICAgID0gMTUwMDAKCXNwcmluZ1JhZGl1c01pbGxpID0gMzAwMAoJc3ByaW5nSGVhbFBlcmNlbnQgPSAyMAoJc2hlbHRlckhQTWF4ICAgICAgPSA2NAoJc2hlbHRlclJlYnVpbGRNcyAgPSAyMDAwMAoJYnVyc3RXaW5kb3dNcyAgICAgPSAxMDAwCglidXJzdENvb2xNcyAgICAgICA9IDIwMDAKCXZpZXdlclNoYXJkcyAgICAgID0gMTAKCXZpZXdlcldhdGNoTXMgICAgID0gMTUwMDAKCXZpZXdlcldpbmRvd01zICAgID0gMzAwMDAKCW1pbkNoZWVyICAgICAgICAgID0gdWdub3QKCWdyb3dNZWRpdW1BdCAgICAgID0gMgoJZ3Jvd0xhcmdlQXQgICAgICAgPSA0Cglncm93RXZvbHZlQXQgICAgICA9IDYKKQoKdHlwZSBjaGVlclJvdyBzdHJ1Y3QgewoJZmlzaCAgIGludAoJd2hvICAgIGFkZHJlc3MKCWFtb3VudCBpbnQ2NAoJbGl2ZSAgIGJvb2wKfQoKdHlwZSBjbGFpbVJvdyBzdHJ1Y3QgewoJd2hvICAgICBhZGRyZXNzCglhbW91bnQgIGludDY0CglraW5kICAgIHN0cmluZwoJa2lsbEF0ICBpbnQ2NAoJZXhwaXJlcyBpbnQ2NAoJY2xhaW1lZCBib29sCglraWxsZXIgIGFkZHJlc3MKCXZpY3RpbSAgYWRkcmVzcwoJa2lsbElEICBpbnQKfQoKdHlwZSB3YXRjaFJvdyBzdHJ1Y3QgewoJd2hvICAgYWRkcmVzcwoJc2luY2UgaW50NjQKfQoKdHlwZSBkaXNjIHN0cnVjdCB7Cgl4ICAgICBpbnQKCXogICAgIGludAoJciAgICAgaW50Cglpbm5lciBpbnQKCWtpbmQgIHN0cmluZwp9Cgp2YXIgKAoJY2hlZXJzICAgICAgW11jaGVlclJvdwoJY2xhaW1zICAgICAgW11jbGFpbVJvdwoJd2F0Y2hlcyAgICAgW113YXRjaFJvdwoJa2lsbFNlcSAgICAgaW50CglzaGVsdGVySFAgICBbXWludAoJc2hlbHRlckRvd24gW11pbnQ2NAoJc2hlbHRlclRhYmxlID0gW11kaXNjewoJCXt4OiA5Nl8wMDAsIHo6IDhfMDAwLCBpbm5lcjogNV8yMDAsIGtpbmQ6ICJyZWVmIn0sCgkJe3g6IC0xMjBfMDAwLCB6OiA3Ml8wMDAsIGlubmVyOiA1XzYwMCwga2luZDogInJlZWYifSwKCQl7eDogMjhfMDAwLCB6OiAtMTEwXzAwMCwgaW5uZXI6IDRfNDAwLCBraW5kOiAiY2F2ZSJ9LAoJCXt4OiAtMTQwXzAwMCwgejogMTUwXzAwMCwgaW5uZXI6IDRfNDAwLCBraW5kOiAiY2F2ZSJ9LAoJfQoJcm9ja1RhYmxlID0gW11kaXNjewoJCXt4OiAxOF8wMDAsIHo6IC0yNF8wMDAsIHI6IDNfNjAwfSwKCQl7eDogLThfMDAwLCB6OiA0OF8wMDAsIHI6IDNfNjAwfSwKCQl7eDogMTIwXzAwMCwgejogLTQ4XzAwMCwgcjogNF8yMDB9LAoJfQopCgpmdW5jIFR1cm4oY3VyIHJlYWxtLCBpZCwgZHgsIGR6IGludCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCXRha2VFeGFjdCgwKQoJYm9keSA6PSBtdXN0KGlkKQoJaWYgYm9keS5vd25lciAhPSBjYWxsZXIgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9CglpZiAhYm9keS5pbk1hdGNoIHx8IGJvZHkucG9vbCA8PSAwIHsKCQlwYW5pYygiZmlzaDogbWF0Y2giKQoJfQoJaWYgZHggPCAtMSB8fCBkeCA+IDEgfHwgZHogPCAtMSB8fCBkeiA+IDEgfHwgKGR4ID09IDAgJiYgZHogPT0gMCkgewoJCXBhbmljKCJmaXNoOiBmYWNlIikKCX0KCWJvZHkuZmFjZUR4ID0gZHgKCWJvZHkuZmFjZUR6ID0gZHoKfQoKZnVuYyBNb3ZlKGN1ciByZWFsbSwgaWQgaW50KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJdGFrZUV4YWN0KDApCglib2R5IDo9IHN3aW1taW5nKGlkKQoJaWYgYm9keS5vd25lciAhPSBjYWxsZXIgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9Cglub3cgOj0gdGltZS5Ob3coKS5Vbml4TWlsbGkoKQoJaWYgbm93IDwgYm9keS5uZXh0TW92ZU1pbGxpIHsKCQlwYW5pYygiZmlzaDogbW92ZSIpCgl9CglzdGVwRmlzaChib2R5LCBub3cpCn0KCmZ1bmMgQnVyc3QoY3VyIHJlYWxtLCBpZCBpbnQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCgl0YWtlRXhhY3QoMCkKCWJvZHkgOj0gc3dpbW1pbmcoaWQpCglpZiBib2R5Lm93bmVyICE9IGNhbGxlciB7CgkJcGFuaWMoImZpc2g6IG93bmVyIikKCX0KCW5vdyA6PSB0aW1lLk5vdygpLlVuaXhNaWxsaSgpCglpZiBub3cgPCBib2R5Lm5leHRCdXJzdEF0IHsKCQlyZXR1cm4KCX0KCWJvZHkuYnVyc3RVbnRpbCA9IG5vdyArIGJ1cnN0V2luZG93TXMKCWJvZHkubmV4dEJ1cnN0QXQgPSBib2R5LmJ1cnN0VW50aWwgKyBidXJzdENvb2xNcwp9CgpmdW5jIEhlYWwoY3VyIHJlYWxtLCBpZCBpbnQpIHsKCWNhbGxlciA6PSByZXF1aXJlVXNlcihjdXIpCgl0YWtlRXhhY3QoMCkKCWJvZHkgOj0gbXVzdChpZCkKCWlmIGJvZHkub3duZXIgIT0gY2FsbGVyIHsKCQlwYW5pYygiZmlzaDogb3duZXIiKQoJfQoJaWYgYm9keS5pbk1hdGNoIHsKCQlwYW5pYygiZmlzaDogbWF0Y2giKQoJfQoJbm93IDo9IHRpbWUuTm93KCkuVW5peE1pbGxpKCkKCWRheSwgdXNlZCwgcmVhZHkgOj0gcm9sbGVkSGVhbChib2R5LCBub3cpCglpZiBib2R5LmhwTm93ID49IGJvZHkuaHAgJiYgIWJvZHkubXVzdEhlYWwgewoJCXBhbmljKCJmaXNoOiBocCIpCgl9CglpZiB1c2VkID49IGhlYWxzUGVyRGF5IHx8IG5vdyA8IHJlYWR5IHsKCQlwYW5pYygiZmlzaDogaGVhbCIpCgl9Cgl1c2VkKysKCWlmIHVzZWQgPj0gaGVhbHNQZXJEYXkgewoJCXJlYWR5ID0gbm93ICsgaGVhbENvb2xkb3duTXMKCX0KCXdyaXRlSGVhbChib2R5LCBkYXksIHVzZWQsIHJlYWR5KQoJZ2FpbiA6PSBib2R5LmhwICogaGVhbFBlcmNlbnQgLyAxMDAKCWJvZHkuaHBOb3cgKz0gZ2FpbgoJaWYgYm9keS5ocE5vdyA+IGJvZHkuaHAgewoJCWJvZHkuaHBOb3cgPSBib2R5LmhwCgl9CglpZiBib2R5LmhwTm93IDwgMSB7CgkJYm9keS5ocE5vdyA9IDEKCX0KCWJvZHkubXVzdEhlYWwgPSBmYWxzZQp9CgpmdW5jIFJ1c2hIZWFsKGN1ciByZWFsbSwgaWQgaW50KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJYm9keSA6PSBtdXN0KGlkKQoJaWYgYm9keS5vd25lciAhPSBjYWxsZXIgewoJCXBhbmljKCJmaXNoOiBvd25lciIpCgl9Cglub3cgOj0gdGltZS5Ob3coKS5Vbml4TWlsbGkoKQoJZGF5LCB1c2VkLCByZWFkeSA6PSByb2xsZWRIZWFsKGJvZHksIG5vdykKCWlmIHVzZWQgPCBoZWFsc1BlckRheSB8fCBub3cgPj0gcmVhZHkgewoJCXBhbmljKCJmaXNoOiBoZWFsIikKCX0KCXJlbWFpbmluZyA6PSByZWFkeSAtIG5vdwoJY29zdCA6PSBpbnQ2NCh0aWVyT2YoYm9keS5yYXJpdHkpKSAqIHJlbWFpbmluZyAqIHVnbm90IC8gKDE2ICogM182MDBfMDAwKQoJdGFrZUV4YWN0KGNvc3QpCgl3cml0ZUhlYWwoYm9keSwgZGF5LCBoZWFsc1BlckRheS0xLCAwKQoJc2VuZChidXJuU2luaywgY29zdCwgY3VyKQp9CgovLyBDaGVlciBsb2NrcyB1Z25vdCBvbiBhIGZpc2ggYWxyZWFkeSBpbiB0aGUgc2VhLiBUaGUgZGVwb3NpdCBjb21lcyBiYWNrIHdoZW4KLy8gdGhhdCBmaXNoIGxlYXZlcyBvciBpcyBkb3duZWQuIEl0IGRvZXMgbm90IGNoYW5nZSBiaXRlLgpmdW5jIENoZWVyKGN1ciByZWFsbSwgaWQgaW50KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJYm9keSA6PSBtdXN0KGlkKQoJc2VudCA6PSB1bnNhZmUuT3JpZ2luU2VuZCgpCglpZiBsZW4oc2VudCkgIT0gMSB8fCBzZW50WzBdLkRlbm9tICE9IGRlbm9tIHx8IHNlbnRbMF0uQW1vdW50IDwgbWluQ2hlZXIgewoJCXBhbmljKCJmaXNoOiBwYXltZW50IikKCX0KCWFtb3VudCA6PSBzZW50WzBdLkFtb3VudAoJaWYgY2FsbGVyID09IGJvZHkub3duZXIgewoJCXBhbmljKCJmaXNoOiBjaGVlciIpCgl9CglpZiAhbGl2ZUZpc2goYm9keSwgdGltZS5Ob3coKS5Vbml4KCkpIHsKCQlwYW5pYygiZmlzaDogbWF0Y2giKQoJfQoJaWYgY2hlZXJMb2NrZWQoaWQpK2Ftb3VudCA+IGJvZHkucG9vbC8yIHsKCQlwYW5pYygiZmlzaDogY2FwIikKCX0KCWNoZWVycyA9IGFwcGVuZChjaGVlcnMsIGNoZWVyUm93e2Zpc2g6IGlkLCB3aG86IGNhbGxlciwgYW1vdW50OiBhbW91bnQsIGxpdmU6IHRydWV9KQp9CgpmdW5jIFdhdGNoKGN1ciByZWFsbSwgb24gYm9vbCkgewoJY2FsbGVyIDo9IHJlcXVpcmVVc2VyKGN1cikKCXRha2VFeGFjdCgwKQoJaWYgIW9uIHsKCQlkcm9wV2F0Y2goY2FsbGVyKQoJCXJldHVybgoJfQoJZm9yIGkgOj0gcmFuZ2Ugd2F0Y2hlcyB7CgkJaWYgd2F0Y2hlc1tpXS53aG8gPT0gY2FsbGVyIHsKCQkJcmV0dXJuCgkJfQoJfQoJd2F0Y2hlcyA9IGFwcGVuZCh3YXRjaGVzLCB3YXRjaFJvd3t3aG86IGNhbGxlciwgc2luY2U6IHRpbWUuTm93KCkuVW5peE1pbGxpKCl9KQp9CgpmdW5jIENsYWltKGN1ciByZWFsbSwgaWQgaW50KSB7CgljYWxsZXIgOj0gcmVxdWlyZVVzZXIoY3VyKQoJdGFrZUV4YWN0KDApCglpZiBpZCA8IDEgfHwgaWQgPiBsZW4oY2xhaW1zKSB7CgkJcGFuaWMoImZpc2g6IGNsYWltIikKCX0KCXJvdyA6PSAmY2xhaW1zW2lkLTFdCglpZiByb3cuY2xhaW1lZCB7CgkJcGFuaWMoImZpc2g6IGNsYWltIikKCX0KCW5vdyA6PSB0aW1lLk5vdygpLlVuaXhNaWxsaSgpCglpZiByb3cuZXhwaXJlcyA+IDAgJiYgbm93ID49IHJvdy5leHBpcmVzIHsKCQlhbXQgOj0gcm93LmFtb3VudAoJCXJvdy5jbGFpbWVkID0gdHJ1ZQoJCXJvdy5hbW91bnQgPSAwCgkJc2VuZChzZWFzb25TaW5rLCBhbXQsIGN1cikKCQlyZXR1cm4KCX0KCWlmIHJvdy5raW5kID09ICJ3YXRjaCIgewoJCWlmIGNhbGxlciA9PSByb3cua2lsbGVyIHx8IGNhbGxlciA9PSByb3cudmljdGltIHsKCQkJcGFuaWMoImZpc2g6IGNsYWltIikKCQl9CgkJaWYgIXdhdGNoRWxpZ2libGUoY2FsbGVyLCByb3cua2lsbEF0KSB7CgkJCXBhbmljKCJmaXNoOiB3YXRjaCIpCgkJfQoJCWlmIHdhdGNoQ2xhaW1lZChjYWxsZXIsIHJvdy5raWxsSUQpIHsKCQkJcGFuaWMoImZpc2g6IGNsYWltIikKCQl9CgkJcm93LndobyA9IGNhbGxlcgoJfSBlbHNlIGlmIHJvdy53aG8gIT0gY2FsbGVyIHsKCQlwYW5pYygiZmlzaDogb3duZXIiKQoJfQoJYW10IDo9IHJvdy5hbW91bnQKCXJvdy5jbGFpbWVkID0gdHJ1ZQoJcm93LmFtb3VudCA9IDAKCXNlbmQoY2FsbGVyLCBhbXQsIGN1cikKfQoKZnVuYyBzd2ltbWluZyhpZCBpbnQpICpmaXNoQm9keSB7Cglib2R5IDo9IG11c3QoaWQpCglpZiAhbGl2ZUZpc2goYm9keSwgdGltZS5Ob3coKS5Vbml4KCkpIHsKCQlwYW5pYygiZmlzaDogbWF0Y2giKQoJfQoJaWYgYm9keS5tdXN0SGVhbCB7CgkJcGFuaWMoImZpc2g6IGhlYWwiKQoJfQoJcmV0dXJuIGJvZHkKfQoKZnVuYyB3YWxsZXRJblNlYShvd25lciBhZGRyZXNzKSBib29sIHsKCWZvciBfLCBib2R5IDo9IHJhbmdlIGJvZGllcyB7CgkJaWYgYm9keSA9PSBuaWwgfHwgYm9keS5idXJuZWQgfHwgIWJvZHkuaW5NYXRjaCB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGJvZHkub3duZXIgPT0gb3duZXIgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CgpmdW5jIHRvb0h1cnQoYm9keSAqZmlzaEJvZHkpIGJvb2wgewoJaWYgYm9keS5ocCA8PSAwIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJcmV0dXJuIGJvZHkuaHBOb3cqMTAwIDwgYm9keS5ocCozMAp9CgpmdW5jIHBsYWNlU3dpbW1lcihib2R5ICpmaXNoQm9keSkgewoJZW5zdXJlU2VhKCkKCWZvciBzeCA6PSAwOyBzeCA8IDkwOyBzeCsrIHsKCQlpZiB0cnlQbGFjZShib2R5LCBzeCwgMCkgewoJCQlyZXR1cm4KCQl9Cgl9Cglmb3Igc3ogOj0gMTsgc3ogPCA0MDsgc3orKyB7CgkJZm9yIHN4IDo9IC00MDsgc3ggPCA0MDsgc3grKyB7CgkJCWlmIHRyeVBsYWNlKGJvZHksIHN4LCBzeikgewoJCQkJcmV0dXJuCgkJCX0KCQl9Cgl9CglwYW5pYygiZmlzaDogc2VhIikKfQoKZnVuYyB0cnlQbGFjZShib2R5ICpmaXNoQm9keSwgc3gsIHN6IGludCkgYm9vbCB7CglpZiBzcGF3bkJsb2NrZWQoc3gsIHN6KSB8fCBjZWxsVGFrZW4oc3gsIHN6LCBib2R5LmlkKSB7CgkJcmV0dXJuIGZhbHNlCgl9Cglib2R5LnN4ID0gc3gKCWJvZHkuc3ogPSBzegoJYm9keS5mYWNlRHggPSAwCglib2R5LmZhY2VEeiA9IC0xCglyZXR1cm4gdHJ1ZQp9CgpmdW5jIHN0ZXBGaXNoKGJvZHkgKmZpc2hCb2R5LCBub3cgaW50NjQpIHsKCWlmIGJvZHkuZmFjZUR4ID09IDAgJiYgYm9keS5mYWNlRHogPT0gMCB7CgkJcGFuaWMoImZpc2g6IGZhY2UiKQoJfQoJbnggOj0gYm9keS5zeCArIGJvZHkuZmFjZUR4CglueiA6PSBib2R5LnN6ICsgYm9keS5mYWNlRHoKCWlmICFzZWN0b3JJblNlYShueCwgbnopIHsKCQlwYW5pYygiZmlzaDogc2VhIikKCX0KCWlmIGNlbGxCbG9ja2VkKG54LCBueiwgYm9keS5zaXplLCBub3cpIHsKCQlwYW5pYygiZmlzaDogY292ZXIiKQoJfQoJYm9keS5zeCA9IG54Cglib2R5LnN6ID0gbnoKCWJvZHkubmV4dE1vdmVNaWxsaSA9IG5vdyArIG1vdmVEZWxheShib2R5LCBub3cpCgl0b3VjaFNwcmluZyhib2R5LCBub3cpCn0KCmZ1bmMgc2VjdG9ySW5TZWEoc3gsIHN6IGludCkgYm9vbCB7Cgl4LCB6IDo9IGNlbGxNaWxsaShzeCwgc3opCglkeCA6PSBpbnQ2NCh4KQoJZHogOj0gaW50NjQoeikKCWxpbWl0IDo9IGludDY0KHNlYVJhZGl1cyAqIHVuaXRNaWxsaSkKCXJldHVybiBkeCpkeCtkeipkeiA8PSBsaW1pdCpsaW1pdAp9CgpmdW5jIGNlbGxUYWtlbihzeCwgc3osIHNlbGYgaW50KSBib29sIHsKCWZvciBfLCBib2R5IDo9IHJhbmdlIGJvZGllcyB7CgkJaWYgYm9keSA9PSBuaWwgfHwgYm9keS5idXJuZWQgfHwgYm9keS5pZCA9PSBzZWxmIHx8ICFib2R5LmluTWF0Y2ggewoJCQljb250aW51ZQoJCX0KCQlpZiBib2R5LnN4ID09IHN4ICYmIGJvZHkuc3ogPT0gc3ogewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CgpmdW5jIHNwYXduQmxvY2tlZChzeCwgc3ogaW50KSBib29sIHsKCWlmICFzZWN0b3JJblNlYShzeCwgc3opIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJZW5zdXJlU2VhKCkKCWZvciBpIDo9IHJhbmdlIHJvY2tUYWJsZSB7CgkJaWYgZGlzY0hvbGRzKHN4LCBzeiwgcm9ja1RhYmxlW2ldLngsIHJvY2tUYWJsZVtpXS56LCByb2NrVGFibGVbaV0ucikgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCW5vdyA6PSB0aW1lLk5vdygpLlVuaXhNaWxsaSgpCglmb3IgaSA6PSByYW5nZSBzaGVsdGVyVGFibGUgewoJCXJlZnJlc2hTaGVsdGVyKGksIG5vdykKCQlpZiBzaGVsdGVySFBbaV0gPD0gMCB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGRpc2NIb2xkcyhzeCwgc3osIHNoZWx0ZXJUYWJsZVtpXS54LCBzaGVsdGVyVGFibGVbaV0ueiwgc2hlbHRlclRhYmxlW2ldLmlubmVyKSB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCmZ1bmMgY2VsbEJsb2NrZWQoc3gsIHN6IGludCwgc2l6ZSBzdHJpbmcsIG5vdyBpbnQ2NCkgYm9vbCB7CglpZiAhc2VjdG9ySW5TZWEoc3gsIHN6KSB7CgkJcmV0dXJuIHRydWUKCX0KCWVuc3VyZVNlYSgpCglmb3IgaSA6PSByYW5nZSByb2NrVGFibGUgewoJCWlmIGRpc2NIb2xkcyhzeCwgc3osIHJvY2tUYWJsZVtpXS54LCByb2NrVGFibGVbaV0ueiwgcm9ja1RhYmxlW2ldLnIpIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9Cglmb3IgaSA6PSByYW5nZSBzaGVsdGVyVGFibGUgewoJCXJlZnJlc2hTaGVsdGVyKGksIG5vdykKCQlpZiBzaGVsdGVySFBbaV0gPD0gMCB8fCBzaGVsdGVyQWRtaXRzKHNoZWx0ZXJUYWJsZVtpXS5raW5kLCBzaXplKSB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGRpc2NIb2xkcyhzeCwgc3osIHNoZWx0ZXJUYWJsZVtpXS54LCBzaGVsdGVyVGFibGVbaV0ueiwgc2hlbHRlclRhYmxlW2ldLmlubmVyKSB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCmZ1bmMgY2VsbE1pbGxpKHN4LCBzeiBpbnQpIChpbnQsIGludCkgewoJcmV0dXJuIHN4KnNlY3Rvck1pbGxpICsgc2VjdG9yTWlsbGkvMiwgc3oqc2VjdG9yTWlsbGkgKyBzZWN0b3JNaWxsaS8yCn0KCmZ1bmMgaW5zaWRlRGlzYyh4LCB6LCBjeCwgY3osIHIgaW50KSBib29sIHsKCWR4IDo9IGludDY0KHggLSBjeCkKCWR6IDo9IGludDY0KHogLSBjeikKCXJyIDo9IGludDY0KHIpCglyZXR1cm4gZHgqZHgrZHoqZHogPD0gcnIqcnIKfQoKZnVuYyBlbnN1cmVTZWEoKSB7CglpZiBsZW4oc2hlbHRlckhQKSA9PSBsZW4oc2hlbHRlclRhYmxlKSAmJiBsZW4oc2hlbHRlckRvd24pID09IGxlbihzaGVsdGVyVGFibGUpIHsKCQlyZXR1cm4KCX0KCXNoZWx0ZXJIUCA9IG1ha2UoW11pbnQsIGxlbihzaGVsdGVyVGFibGUpKQoJc2hlbHRlckRvd24gPSBtYWtlKFtdaW50NjQsIGxlbihzaGVsdGVyVGFibGUpKQoJZm9yIGkgOj0gcmFuZ2Ugc2hlbHRlckhQIHsKCQlzaGVsdGVySFBbaV0gPSBzaGVsdGVySFBNYXgKCX0KfQoKZnVuYyByZWZyZXNoU2hlbHRlcihpIGludCwgbm93IGludDY0KSB7CgllbnN1cmVTZWEoKQoJaWYgc2hlbHRlckhQW2ldID4gMCB7CgkJcmV0dXJuCgl9CglpZiBzaGVsdGVyRG93bltpXSA+IDAgJiYgbm93ID49IHNoZWx0ZXJEb3duW2ldIHsKCQlzaGVsdGVySFBbaV0gPSBzaGVsdGVySFBNYXgKCQlzaGVsdGVyRG93bltpXSA9IDAKCX0KfQoKZnVuYyBzaGVsdGVyQWRtaXRzKGtpbmQsIHNpemUgc3RyaW5nKSBib29sIHsKCWlmIHNpemUgPT0gImxhcmdlIiB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBraW5kID09ICJjYXZlIiB7CgkJcmV0dXJuIHNpemUgPT0gInNtYWxsIgoJfQoJcmV0dXJuIHNpemUgPT0gInNtYWxsIiB8fCBzaXplID09ICJtZWRpdW0iCn0KCmZ1bmMgY292ZXJJbmRleChib2R5ICpmaXNoQm9keSwgbm93IGludDY0KSBpbnQgewoJZW5zdXJlU2VhKCkKCWZvciBpIDo9IHJhbmdlIHNoZWx0ZXJUYWJsZSB7CgkJcmVmcmVzaFNoZWx0ZXIoaSwgbm93KQoJCWlmIHNoZWx0ZXJIUFtpXSA8PSAwIHx8ICFzaGVsdGVyQWRtaXRzKHNoZWx0ZXJUYWJsZVtpXS5raW5kLCBib2R5LnNpemUpIHsKCQkJY29udGludWUKCQl9CgkJaWYgZGlzY0hvbGRzKGJvZHkuc3gsIGJvZHkuc3osIHNoZWx0ZXJUYWJsZVtpXS54LCBzaGVsdGVyVGFibGVbaV0ueiwgc2hlbHRlclRhYmxlW2ldLmlubmVyKSB7CgkJCXJldHVybiBpCgkJfQoJfQoJcmV0dXJuIC0xCn0KCmZ1bmMgcmVkaXJlY3RTaGVsdGVyKGF0aywgdmljICpmaXNoQm9keSwgbm93IGludDY0KSBib29sIHsKCWlkeCA6PSBjb3ZlckluZGV4KHZpYywgbm93KQoJaWYgaWR4IDwgMCB8fCBzaGVsdGVyQWRtaXRzKHNoZWx0ZXJUYWJsZVtpZHhdLmtpbmQsIGF0ay5zaXplKSB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBkaXNjSG9sZHMoYXRrLnN4LCBhdGsuc3osIHNoZWx0ZXJUYWJsZVtpZHhdLngsIHNoZWx0ZXJUYWJsZVtpZHhdLnosIHNoZWx0ZXJUYWJsZVtpZHhdLmlubmVyKSB7CgkJcmV0dXJuIGZhbHNlCgl9CglkbWcgOj0gc3RyaWtlRGFtYWdlKGJpdGVOb3coYXRrKSwgc2hlbHRlckhQTWF4LCBhdGsuc2l6ZSwgIm1lZGl1bSIpCglpZiBkbWcgPiBzaGVsdGVySFBbaWR4XSB7CgkJZG1nID0gc2hlbHRlckhQW2lkeF0KCX0KCXNoZWx0ZXJIUFtpZHhdIC09IGRtZwoJaWYgc2hlbHRlckhQW2lkeF0gPD0gMCB7CgkJc2hlbHRlckhQW2lkeF0gPSAwCgkJc2hlbHRlckRvd25baWR4XSA9IG5vdyArIHNoZWx0ZXJSZWJ1aWxkTXMKCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgbW91dGhIaXQoYXRrLCBkZWYgKmZpc2hCb2R5KSBib29sIHsKCXJldHVybiBtb3V0aEFpbWVkKGF0aywgZGVmLCBkZWYuZG9kZ2UpCn0KCi8vIHNoZWx0ZXJNb3V0aCBpcyBhIGJpdGUgYWdhaW5zdCB0aGUgcG9ja2V0LCBub3QgYWdhaW5zdCB0aGUgZmlzaCdzIGRvZGdlLgovLyBUaGUgYXR0YWNrZXIgbXVzdCBzdGFuZCBvdXRzaWRlLCBtdXN0IG5vdCBmaXQgaW5zaWRlLCBhbmQgbXVzdCBmYWNlIHRoZSBmaXNoLgpmdW5jIHNoZWx0ZXJNb3V0aChhdGssIHZpYyAqZmlzaEJvZHksIG5vdyBpbnQ2NCkgYm9vbCB7CglpZHggOj0gY292ZXJJbmRleCh2aWMsIG5vdykKCWlmIGlkeCA8IDAgfHwgc2hlbHRlckFkbWl0cyhzaGVsdGVyVGFibGVbaWR4XS5raW5kLCBhdGsuc2l6ZSkgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgZGlzY0hvbGRzKGF0ay5zeCwgYXRrLnN6LCBzaGVsdGVyVGFibGVbaWR4XS54LCBzaGVsdGVyVGFibGVbaWR4XS56LCBzaGVsdGVyVGFibGVbaWR4XS5pbm5lcikgewoJCXJldHVybiBmYWxzZQoJfQoJcmV0dXJuIG1vdXRoQWltZWQoYXRrLCB2aWMsIDApCn0KCi8vIFNlY3RvciBjZW50ZXJzIHNpdCBvZmYgdGhlIHByYWN0aWNlIGRpc2NzLCBzYW1lIGFzIGEgc3ByaW5nIG9uIHogPSAwLgovLyBUaGUgY2VsbCB0aGF0IGhvbGRzIHRoZSBwb2ludCBjb3VudHMgYXMgaW5zaWRlLgpmdW5jIGRpc2NIb2xkcyhzeCwgc3osIGN4LCBjeiwgciBpbnQpIGJvb2wgewoJeCwgeiA6PSBjZWxsTWlsbGkoc3gsIHN6KQoJaWYgaW5zaWRlRGlzYyh4LCB6LCBjeCwgY3osIHIpIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJcHggOj0gaW50KG1hdGguRmxvb3IoZmxvYXQ2NChjeCkgLyBmbG9hdDY0KHNlY3Rvck1pbGxpKSkpCglweiA6PSBpbnQobWF0aC5GbG9vcihmbG9hdDY0KGN6KSAvIGZsb2F0NjQoc2VjdG9yTWlsbGkpKSkKCXJldHVybiBzeCA9PSBweCAmJiBzeiA9PSBwegp9CgpmdW5jIG1vdXRoQWltZWQoYXRrLCBkZWYgKmZpc2hCb2R5LCBkb2RnZSBpbnQpIGJvb2wgewoJaWYgIWluUmVhY2hEb2RnZShhdGssIGRlZiwgZG9kZ2UpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWF4LCBheiA6PSBjZWxsTWlsbGkoYXRrLnN4LCBhdGsuc3opCglieCwgYnogOj0gY2VsbE1pbGxpKGRlZi5zeCwgZGVmLnN6KQoJZHggOj0gYnggLSBheAoJZHogOj0gYnogLSBhegoJZGlzdDIgOj0gaW50NjQoZHgpKmludDY0KGR4KSArIGludDY0KGR6KSppbnQ2NChkeikKCWlmIGRpc3QyIDw9IGludDY0KG1vdXRoQ29udGFjdCkqaW50NjQobW91dGhDb250YWN0KSB7CgkJcmV0dXJuIHRydWUKCX0KCWZ4LCBmeiA6PSBmYWNlTWlsbGkoYXRrLmZhY2VEeCwgYXRrLmZhY2VEeikKCWxlYWQgOj0gbW91dGhMZWFkKGF0ay5zaXplKQoJbXggOj0gZHggLSBmeCpsZWFkLzEwMDAKCW16IDo9IGR6IC0gZnoqbGVhZC8xMDAwCgltb3V0aDIgOj0gaW50NjQobXgpKmludDY0KG14KSArIGludDY0KG16KSppbnQ2NChteikKCWlmIG1vdXRoMiA9PSAwIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJZG90IDo9IGludDY0KG14KSppbnQ2NChmeCkgKyBpbnQ2NChteikqaW50NjQoZnopCglpZiBkb3QgPD0gMCB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gZG90KmRvdCA+PSBpbnQ2NChtb3V0aEFsaWduTnVtKSptb3V0aDIKfQoKZnVuYyBmYWNlTWlsbGkoZHgsIGR6IGludCkgKGludCwgaW50KSB7CglpZiBkeCA9PSAwICYmIGR6ID09IDAgewoJCXJldHVybiAwLCAtMTAwMAoJfQoJc3BhbiA6PSBkeCpkeCArIGR6KmR6CglpZiBzcGFuID09IDEgewoJCXJldHVybiBkeCAqIDEwMDAsIGR6ICogMTAwMAoJfQoJaWYgc3BhbiA9PSAyIHsKCQlzeCA6PSA3MDcKCQlzeiA6PSA3MDcKCQlpZiBkeCA8IDAgewoJCQlzeCA9IC03MDcKCQl9CgkJaWYgZHogPCAwIHsKCQkJc3ogPSAtNzA3CgkJfQoJCXJldHVybiBzeCwgc3oKCX0KCXJldHVybiAwLCAtMTAwMAp9CgpmdW5jIG1vdXRoTGVhZChzaXplIHN0cmluZykgaW50IHsKCXN3aXRjaCBzaXplIHsKCWNhc2UgInNtYWxsIjoKCQlyZXR1cm4gNzAwCgljYXNlICJsYXJnZSI6CgkJcmV0dXJuIDE0NTAKCWRlZmF1bHQ6CgkJcmV0dXJuIDEwMDAKCX0KfQoKZnVuYyBiaXRlTm93KGJvZHkgKmZpc2hCb2R5KSBpbnQgewoJYiA6PSBiaXRlT2YoYm9keS5yYXJpdHksIGJvZHkuc2l6ZSwgYm9keS50cmFpdCkKCWlmIGJvZHkuZXZvbHZlZCAmJiBib2R5LmFzcGVjdEJwcyA+IDAgewoJCWIgPSAoYipib2R5LmFzcGVjdEJwcyArIDUwMDApIC8gMTAwMDAKCX0KCWlmIGIgPCAxIHsKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIGIKfQoKZnVuYyBzdHJpa2VGb3VnaHQoYml0ZSwgaHBNYXggaW50LCBhdGtTaXplLCBkZWZTaXplLCBhdGtSLCBkZWZSIHN0cmluZykgaW50IHsKCV8gPSBhdGtTaXplCglfID0gZGVmU2l6ZQoJXyA9IGF0a1IKCV8gPSBkZWZSCglkbWcgOj0gYml0ZSAqIDEwMCAvIChocE1heCArIDEwMCkKCWlmIGRtZyA8IDEgewoJCWRtZyA9IDEKCX0KCXJldHVybiBkbWcKfQoKZnVuYyBwcmV5T2YocmFyaXR5IHN0cmluZykgc3RyaW5nIHsKCXN3aXRjaCByYXJpdHkgewoJY2FzZSAiY29tbW9uIjoKCQlyZXR1cm4gIm15dGhpYyIKCWNhc2UgInVuY29tbW9uIjoKCQlyZXR1cm4gImNvbW1vbiIKCWNhc2UgInJhcmUiOgoJCXJldHVybiAidW5jb21tb24iCgljYXNlICJlcGljIjoKCQlyZXR1cm4gInJhcmUiCgljYXNlICJsZWdlbmRhcnkiOgoJCXJldHVybiAiZXBpYyIKCWNhc2UgIm15dGhpYyI6CgkJcmV0dXJuICJsZWdlbmRhcnkiCglkZWZhdWx0OgoJCXBhbmljKCJmaXNoOiByYXJpdHkiKQoJfQp9CgpmdW5jIG5leHRSYXJpdHkocmFyaXR5IHN0cmluZykgc3RyaW5nIHsKCXN3aXRjaCByYXJpdHkgewoJY2FzZSAiY29tbW9uIjoKCQlyZXR1cm4gInVuY29tbW9uIgoJY2FzZSAidW5jb21tb24iOgoJCXJldHVybiAicmFyZSIKCWNhc2UgInJhcmUiOgoJCXJldHVybiAiZXBpYyIKCWNhc2UgImVwaWMiOgoJCXJldHVybiAibGVnZW5kYXJ5IgoJY2FzZSAibGVnZW5kYXJ5IjoKCQlyZXR1cm4gIm15dGhpYyIKCWRlZmF1bHQ6CgkJcmV0dXJuICIiCgl9Cn0KCmZ1bmMgZ3Jvd0Zyb21LaWxsKGF0aywgdmljICpmaXNoQm9keSkgewoJaWYgc2l6ZUluZGV4KHZpYy5zaXplKSA+PSBzaXplSW5kZXgoYXRrLnNpemUpKzEgewoJCWF0ay5ncm93dGggKz0gMgoJfSBlbHNlIHsKCQlhdGsuZ3Jvd3RoKysKCX0KCW5leHQgOj0gYXRrLnNpemUKCWlmIG5leHQgPT0gInNtYWxsIiAmJiBhdGsuZ3Jvd3RoID49IGdyb3dNZWRpdW1BdCB7CgkJbmV4dCA9ICJtZWRpdW0iCgl9CglpZiBuZXh0ID09ICJtZWRpdW0iICYmIGF0ay5ncm93dGggPj0gZ3Jvd0xhcmdlQXQgewoJCW5leHQgPSAibGFyZ2UiCgl9CglpZiBuZXh0ICE9IGF0ay5zaXplIHsKCQlvbGQgOj0gYXRrLmhwCgkJaWYgb2xkIDwgMSB7CgkJCW9sZCA9IDEKCQl9CgkJYXRrLnNpemUgPSBuZXh0CgkJYXRrLmhwID0gaHBPZihhdGsucmFyaXR5LCBuZXh0LCBhdGsudHJhaXQpCgkJYXRrLmRvZGdlID0gZG9kZ2VPZihuZXh0KQoJCWF0ay5ocE5vdyA9IGF0ay5ocE5vdyAqIGF0ay5ocCAvIG9sZAoJCWlmIGF0ay5ocE5vdyA8IDEgewoJCQlhdGsuaHBOb3cgPSAxCgkJfQoJCWlmIGF0ay5ocE5vdyA+IGF0ay5ocCB7CgkJCWF0ay5ocE5vdyA9IGF0ay5ocAoJCX0KCX0KCWlmIGF0ay5ldm9sdmVkIHx8IGF0ay5zaXplICE9ICJsYXJnZSIgfHwgYXRrLmdyb3d0aCA8IGdyb3dFdm9sdmVBdCB7CgkJcmV0dXJuCgl9Cglhc3BlY3QgOj0gbmV4dFJhcml0eShhdGsucmFyaXR5KQoJaWYgYXNwZWN0ID09ICIiIHsKCQlyZXR1cm4KCX0KCWF0ay5ldm9sdmVkID0gdHJ1ZQoJYXRrLmFzcGVjdCA9IGFzcGVjdAoJYXRrLmFzcGVjdEJwcyA9IDEwODAwCglhdGsuaHAgPSAoYXRrLmhwKjEwOCArIDUwKSAvIDEwMAoJaWYgYXRrLmhwIDwgMSB7CgkJYXRrLmhwID0gMQoJfQoJYXRrLmhwTm93ID0gKGF0ay5ocE5vdyoxMDggKyA1MCkgLyAxMDAKCWlmIGF0ay5ocE5vdyA8IDEgewoJCWF0ay5ocE5vdyA9IDEKCX0KCWlmIGF0ay5ocE5vdyA+IGF0ay5ocCB7CgkJYXRrLmhwTm93ID0gYXRrLmhwCgl9Cn0KCmZ1bmMgd29ybGRTcGVlZChib2R5ICpmaXNoQm9keSkgaW50IHsKCWJhc2UgOj0gMTAwCglzd2l0Y2ggYm9keS5yYXJpdHkgewoJY2FzZSAiY29tbW9uIjoKCQliYXNlID0gMTAwCgljYXNlICJ1bmNvbW1vbiI6CgkJYmFzZSA9IDk3CgljYXNlICJyYXJlIjoKCQliYXNlID0gOTQKCWNhc2UgImVwaWMiOgoJCWJhc2UgPSA5MQoJY2FzZSAibGVnZW5kYXJ5IjoKCQliYXNlID0gODgKCWNhc2UgIm15dGhpYyI6CgkJYmFzZSA9IDg1CglkZWZhdWx0OgoJCXBhbmljKCJmaXNoOiByYXJpdHkiKQoJfQoJdW5pdHMgOj0gYmFzZSAqIDIyMCAvIDEwMDAKCWlmIGJvZHkuc2l6ZSA9PSAic21hbGwiIHsKCQl1bml0cyA9IHVuaXRzICogMTE2IC8gMTAwCgl9CglpZiBib2R5LnNpemUgPT0gImxhcmdlIiB7CgkJdW5pdHMgPSB1bml0cyAqIDg4IC8gMTAwCgl9CglpZiBib2R5LnRyYWl0ID09ICJzd2lmdCIgewoJCXVuaXRzID0gdW5pdHMgKiAxMTIgLyAxMDAKCX0KCWlmIHVuaXRzIDwgMSB7CgkJcmV0dXJuIDEKCX0KCXJldHVybiB1bml0cwp9CgpmdW5jIG1vdmVEZWxheShib2R5ICpmaXNoQm9keSwgbm93IGludDY0KSBpbnQ2NCB7Cgl1bml0cyA6PSB3b3JsZFNwZWVkKGJvZHkpCglpZiBub3cgPCBib2R5LmJ1cnN0VW50aWwgewoJCXVuaXRzID0gdW5pdHMgKiA3IC8gNAoJfQoJaWYgdW5pdHMgPCAxIHsKCQl1bml0cyA9IDEKCX0KCWRlbGF5IDo9IGludDY0KHNlY3RvcioxMDAwKSAvIGludDY0KHVuaXRzKQoJaWYgZGVsYXkgPCAxIHsKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIGRlbGF5Cn0KCmZ1bmMgdGllck9mKHJhcml0eSBzdHJpbmcpIGludCB7Cglzd2l0Y2ggcmFyaXR5IHsKCWNhc2UgImNvbW1vbiI6CgkJcmV0dXJuIDEKCWNhc2UgInVuY29tbW9uIjoKCQlyZXR1cm4gMgoJY2FzZSAicmFyZSI6CgkJcmV0dXJuIDMKCWNhc2UgImVwaWMiOgoJCXJldHVybiA0CgljYXNlICJsZWdlbmRhcnkiOgoJCXJldHVybiA1CgljYXNlICJteXRoaWMiOgoJCXJldHVybiA2CglkZWZhdWx0OgoJCXBhbmljKCJmaXNoOiByYXJpdHkiKQoJfQp9CgpmdW5jIHJvbGxlZEhlYWwoYm9keSAqZmlzaEJvZHksIG5vdyBpbnQ2NCkgKGRheSBpbnQ2NCwgdXNlZCBpbnQsIHJlYWR5IGludDY0KSB7CglkYXkgPSAobm93ICsgaWN0T2Zmc2V0TXMpIC8gZGF5TXMKCXVzZWQgPSBib2R5LmhlYWxzVXNlZAoJcmVhZHkgPSBib2R5LmhlYWxSZWFkeUF0CglpZiBib2R5LmhlYWxEYXkgIT0gZGF5IHsKCQl1c2VkID0gMAoJCXJlYWR5ID0gMAoJfQoJaWYgdXNlZCA+PSBoZWFsc1BlckRheSAmJiByZWFkeSA+IDAgJiYgbm93ID49IHJlYWR5IHsKCQl1c2VkID0gaGVhbHNQZXJEYXkgLSAxCgkJcmVhZHkgPSAwCgl9CglyZXR1cm4KfQoKZnVuYyB3cml0ZUhlYWwoYm9keSAqZmlzaEJvZHksIGRheSBpbnQ2NCwgdXNlZCBpbnQsIHJlYWR5IGludDY0KSB7Cglib2R5LmhlYWxEYXkgPSBkYXkKCWJvZHkuaGVhbHNVc2VkID0gdXNlZAoJYm9keS5oZWFsUmVhZHlBdCA9IHJlYWR5Cn0KCmZ1bmMgY2hlZXJMb2NrZWQoaWQgaW50KSBpbnQ2NCB7Cgl2YXIgbiBpbnQ2NAoJZm9yIGkgOj0gcmFuZ2UgY2hlZXJzIHsKCQlpZiBjaGVlcnNbaV0ubGl2ZSAmJiBjaGVlcnNbaV0uZmlzaCA9PSBpZCB7CgkJCW4gKz0gY2hlZXJzW2ldLmFtb3VudAoJCX0KCX0KCXJldHVybiBuCn0KCmZ1bmMgcmV0dXJuQ2hlZXJzKGJvZHkgKmZpc2hCb2R5LCBybG0gcmVhbG0pIHsKCWZvciBpIDo9IHJhbmdlIGNoZWVycyB7CgkJaWYgIWNoZWVyc1tpXS5saXZlIHx8IGNoZWVyc1tpXS5maXNoICE9IGJvZHkuaWQgewoJCQljb250aW51ZQoJCX0KCQlhbXQgOj0gY2hlZXJzW2ldLmFtb3VudAoJCXdobyA6PSBjaGVlcnNbaV0ud2hvCgkJY2hlZXJzW2ldLmxpdmUgPSBmYWxzZQoJCWNoZWVyc1tpXS5hbW91bnQgPSAwCgkJc2VuZCh3aG8sIGFtdCwgcmxtKQoJfQp9CgpmdW5jIGJvb2tDaGVlckNsYWltcyhhdGssIHZpYyAqZmlzaEJvZHksIGNoZWVyLCBub3cgaW50NjQpIGludDY0IHsKCWlmIGNoZWVyIDw9IDAgewoJCXJldHVybiAwCgl9Cgl2YXIgd2VpZ2h0cyBbXWludAoJdmFyIG93bmVycyBbXWFkZHJlc3MKCWZvciBpIDo9IHJhbmdlIGNoZWVycyB7CgkJaWYgIWNoZWVyc1tpXS5saXZlIHx8IGNoZWVyc1tpXS5maXNoICE9IGF0ay5pZCB8fCBjaGVlcnNbaV0uYW1vdW50IDw9IDAgewoJCQljb250aW51ZQoJCX0KCQl3ZWlnaHRzID0gYXBwZW5kKHdlaWdodHMsIGludChjaGVlcnNbaV0uYW1vdW50KSkKCQlvd25lcnMgPSBhcHBlbmQob3duZXJzLCBjaGVlcnNbaV0ud2hvKQoJfQoJaWYgbGVuKHdlaWdodHMpID09IDAgewoJCXJldHVybiAwCgl9CglzaGFyZXMgOj0gc3BsaXRXZWlnaHRzKGNoZWVyLCB3ZWlnaHRzLCBvd25lcnNbMF0sIG93bmVycykKCWtpbGxTZXErKwoJdmFyIHBsYWNlZCBpbnQ2NAoJZm9yIGksIHNoYXJlIDo9IHJhbmdlIHNoYXJlcyB7CgkJaWYgc2hhcmUgPD0gMCB7CgkJCWNvbnRpbnVlCgkJfQoJCWNsYWltcyA9IGFwcGVuZChjbGFpbXMsIGNsYWltUm93ewoJCQl3aG86ICAgICBvd25lcnNbaV0sCgkJCWFtb3VudDogIHNoYXJlLAoJCQlraW5kOiAgICAiY2hlZXIiLAoJCQlraWxsQXQ6ICBub3csCgkJCWtpbGxlcjogIGF0ay5vd25lciwKCQkJdmljdGltOiAgdmljLm93bmVyLAoJCQlraWxsSUQ6ICBraWxsU2VxLAoJCX0pCgkJcGxhY2VkICs9IHNoYXJlCgl9CglyZXR1cm4gcGxhY2VkCn0KCmZ1bmMgYm9va1dhdGNoQ2xhaW1zKGF0aywgdmljICpmaXNoQm9keSwgdmlld2VyLCBub3cgaW50NjQpIGludDY0IHsKCWlmIHZpZXdlciA8PSAwIHx8ICFhbnlFbGlnaWJsZShhdGsub3duZXIsIHZpYy5vd25lciwgbm93KSB7CgkJcmV0dXJuIDAKCX0KCXNoYXJkIDo9IHZpZXdlciAvIGludDY0KHZpZXdlclNoYXJkcykKCWlmIHNoYXJkIDw9IDAgewoJCXJldHVybiAwCgl9CglraWxsU2VxKysKCXZhciBwbGFjZWQgaW50NjQKCWZvciBpIDo9IDA7IGkgPCB2aWV3ZXJTaGFyZHM7IGkrKyB7CgkJY2xhaW1zID0gYXBwZW5kKGNsYWltcywgY2xhaW1Sb3d7CgkJCWFtb3VudDogIHNoYXJkLAoJCQlraW5kOiAgICAid2F0Y2giLAoJCQlraWxsQXQ6ICBub3csCgkJCWV4cGlyZXM6IG5vdyArIHZpZXdlcldpbmRvd01zLAoJCQlraWxsZXI6ICBhdGsub3duZXIsCgkJCXZpY3RpbTogIHZpYy5vd25lciwKCQkJa2lsbElEOiAga2lsbFNlcSwKCQl9KQoJCXBsYWNlZCArPSBzaGFyZAoJfQoJcmV0dXJuIHBsYWNlZAp9CgpmdW5jIGFueUVsaWdpYmxlKGtpbGxlciwgdmljdGltIGFkZHJlc3MsIGtpbGxBdCBpbnQ2NCkgYm9vbCB7Cglmb3IgaSA6PSByYW5nZSB3YXRjaGVzIHsKCQlpZiB3YXRjaEVsaWdpYmxlKHdhdGNoZXNbaV0ud2hvLCBraWxsQXQpICYmIHdhdGNoZXNbaV0ud2hvICE9IGtpbGxlciAmJiB3YXRjaGVzW2ldLndobyAhPSB2aWN0aW0gewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CgpmdW5jIHdhdGNoRWxpZ2libGUod2hvIGFkZHJlc3MsIGtpbGxBdCBpbnQ2NCkgYm9vbCB7Cglmb3IgaSA6PSByYW5nZSB3YXRjaGVzIHsKCQlpZiB3YXRjaGVzW2ldLndobyA9PSB3aG8gJiYgd2F0Y2hlc1tpXS5zaW5jZSA8PSBraWxsQXQtdmlld2VyV2F0Y2hNcyB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCmZ1bmMgd2F0Y2hDbGFpbWVkKHdobyBhZGRyZXNzLCBraWxsSUQgaW50KSBib29sIHsKCWZvciBpIDo9IHJhbmdlIGNsYWltcyB7CgkJaWYgY2xhaW1zW2ldLmNsYWltZWQgJiYgY2xhaW1zW2ldLmtpbmQgPT0gIndhdGNoIiAmJiBjbGFpbXNbaV0ua2lsbElEID09IGtpbGxJRCAmJiBjbGFpbXNbaV0ud2hvID09IHdobyB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCmZ1bmMgZHJvcFdhdGNoKHdobyBhZGRyZXNzKSB7CgluZXh0IDo9IG1ha2UoW113YXRjaFJvdywgMCwgbGVuKHdhdGNoZXMpKQoJZm9yIGkgOj0gcmFuZ2Ugd2F0Y2hlcyB7CgkJaWYgd2F0Y2hlc1tpXS53aG8gIT0gd2hvIHsKCQkJbmV4dCA9IGFwcGVuZChuZXh0LCB3YXRjaGVzW2ldKQoJCX0KCX0KCXdhdGNoZXMgPSBuZXh0Cn0KCmZ1bmMgc3ByaW5nTWlsbGkobm93IGludDY0KSAoeCwgeiBpbnQsIGJvcm4gaW50NjQsIG9rIGJvb2wpIHsKCWlmIG5vdyA8IDAgewoJCXJldHVybiAwLCAwLCAwLCBmYWxzZQoJfQoJc2xvdCA6PSBub3cgLyBzcHJpbmdQZXJpb2RNcwoJYm9ybiA9IHNsb3QgKiBzcHJpbmdQZXJpb2RNcwoJaWYgbm93ID49IGJvcm4rc3ByaW5nTGlmZU1zIHsKCQlyZXR1cm4gMCwgMCwgYm9ybiwgZmFsc2UKCX0KCWFuZ2xlIDo9IG1hdGguTW9kKGZsb2F0NjQoc2xvdCkqMi4zOTk5NjMsIDIqbWF0aC5QaSkKCXJhZGl1cyA6PSA0OCArIChzbG90KjE3KSU5KjIyCgl4ID0gaW50KG1hdGguRmxvb3IobWF0aC5Db3MoYW5nbGUpKmZsb2F0NjQocmFkaXVzKSoxMDAwICsgMC41KSkKCXogPSBpbnQobWF0aC5GbG9vcihtYXRoLlNpbihhbmdsZSkqZmxvYXQ2NChyYWRpdXMpKjEwMDAgKyAwLjUpKQoJcmV0dXJuIHgsIHosIGJvcm4sIHRydWUKfQoKZnVuYyBzcHJpbmdUb3VjaGVzKHN4LCBzeiwgc3ByaW5nWCwgc3ByaW5nWiBpbnQpIGJvb2wgewoJZngsIGZ6IDo9IGNlbGxNaWxsaShzeCwgc3opCglkeCA6PSBpbnQ2NChmeCAtIHNwcmluZ1gpCglkeiA6PSBpbnQ2NChmeiAtIHNwcmluZ1opCglsaW1pdCA6PSBpbnQ2NChzcHJpbmdSYWRpdXNNaWxsaSkKCWlmIGR4KmR4K2R6KmR6IDw9IGxpbWl0KmxpbWl0IHsKCQlyZXR1cm4gdHJ1ZQoJfQoJc3N4IDo9IGludChtYXRoLkZsb29yKGZsb2F0NjQoc3ByaW5nWCkgLyBmbG9hdDY0KHNlY3Rvck1pbGxpKSkpCglzc3ogOj0gaW50KG1hdGguRmxvb3IoZmxvYXQ2NChzcHJpbmdaKSAvIGZsb2F0NjQoc2VjdG9yTWlsbGkpKSkKCXJldHVybiBzeCA9PSBzc3ggJiYgc3ogPT0gc3N6Cn0KCmZ1bmMgdG91Y2hTcHJpbmcoYm9keSAqZmlzaEJvZHksIG5vdyBpbnQ2NCkgewoJaWYgYm9keSA9PSBuaWwgfHwgYm9keS5idXJuZWQgfHwgYm9keS5tdXN0SGVhbCB8fCAhYm9keS5pbk1hdGNoIHx8IGJvZHkucG9vbCA8PSAwIHsKCQlyZXR1cm4KCX0KCXgsIHosIGJvcm4sIG9rIDo9IHNwcmluZ01pbGxpKG5vdykKCWlmICFvayB8fCBib2R5LnNwcmluZ0Jvcm4gPT0gYm9ybiB7CgkJcmV0dXJuCgl9CglpZiAhc3ByaW5nVG91Y2hlcyhib2R5LnN4LCBib2R5LnN6LCB4LCB6KSB7CgkJcmV0dXJuCgl9Cglib2R5LnNwcmluZ0Jvcm4gPSBib3JuCglnYWluIDo9IGJvZHkuaHAgKiBzcHJpbmdIZWFsUGVyY2VudCAvIDEwMAoJaWYgZ2FpbiA8IDEgewoJCWdhaW4gPSAxCgl9Cglib2R5LmhwTm93ICs9IGdhaW4KCWlmIGJvZHkuaHBOb3cgPiBib2R5LmhwIHsKCQlib2R5LmhwTm93ID0gYm9keS5ocAoJfQp9CiINMTAwMDAwMDB1Z25vdBISCNirpGcSCzIxNjYwNHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohA9bSAK4jbBLNFkrhDhSKBRF1np99ZwdRtYKSEAcsn/M+EkDk+T/3S+Y0MWiuxiTZIbGVwirB0lR0Itu4bRrhgOzEImKQsJxSKXY1EqZmRtmVlvmoNMXr3Zk/HmXCb86MEnGDGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data