Transaction executed successfully

Transaction Details

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

Transaction hash
0B52C9A516985C4AAC812DF7D537131C363419CD5ACCD1DE741755C73D7EBDC2

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
135,000,000
Requested gas limit
GAS USED
53,765,163
Gas consumed
FEE
135000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf15000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cs+lAgoML3ZtLm1fYWRkcGtnEr2lAgooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhKApQIKA25mdBIjZ25vLmxhbmQvci9zYW1jcmV3L2xhdW5jaHBhZC9uZnQvdjEaSgoLZ25vbW9kLnRvbWwSO21vZHVsZSA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvbGF1bmNocGFkL25mdC92MSIKZ25vID0gIjAuOSIKGuEvCgxtZXRhZGF0YS5nbm8S0C9wYWNrYWdlIG5mdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjcnlwdG8vc2hhMjU2IgoJImVuY29kaW5nL2hleCIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3Avc2FtY3Jldy9sYXVuY2hwYWQvbWV0YS92MSIKKQoKY29uc3QgKAoJTWV0YWRhdGFTdGF0aWMgID0gInN0YXRpYyIgIC8vIGJhc2UgVVJJIGZpeGVkIGF0IGNyZWF0aW9uCglNZXRhZGF0YVJldmVhbCAgPSAicmV2ZWFsIiAgLy8gcGxhY2Vob2xkZXIgdW50aWwgb25lIGNvbW1pdHRlZCByZXZlYWwKCU1ldGFkYXRhTXV0YWJsZSA9ICJtdXRhYmxlIiAvLyBjcmVhdG9yIG1heSBjaGFuZ2UgdGhlIGJhc2UgVVJJIHVudGlsIGZyb3plbgopCgovLyBtZXRhZGF0YSBkZWNpZGVzIHdoYXQgVG9rZW5VUkkgYW5zd2Vycy4gT25jZSBmcm96ZW4sIHRoZSBiYXNlIFVSSSBjYW4gbmV2ZXIKLy8gY2hhbmdlIGFnYWluOyBvbmx5IHRoZW4gY2FuIHRyYWl0cyBiZSBjb21taXR0ZWQuCnR5cGUgbWV0YWRhdGEgc3RydWN0IHsKCW1vZGUgICAgICAgICAgIHN0cmluZwoJYmFzZVVSSSAgICAgICAgc3RyaW5nICAvLyBlbXB0eSB1bnRpbCBhIHJldmVhbAoJcGxhY2Vob2xkZXJVUkkgc3RyaW5nICAvLyByZXZlYWw6IHNlcnZlZCBmb3IgZXZlcnkgdG9rZW4gdW50aWwgUmV2ZWFsCgljb21taXRtZW50ICAgICBzdHJpbmcgIC8vIHJldmVhbDogUmV2ZWFsQ29tbWl0bWVudCBvZiB0aGUgYmFzZSBVUkkgdG8gY29tZQoJY29tbWl0dGVyICAgICAgYWRkcmVzcyAvLyByZXZlYWw6IHRoZSBjcmVhdG9yIHdobyBtYWRlIHRoZSBjb21taXRtZW50Cglwcm92ZW5hbmNlICAgICBzdHJpbmcgIC8vIHJldmVhbDogU0hBLTI1NiBvZiB0aGUgb3JkZXJlZCBtZXRhZGF0YSBtYW5pZmVzdAoJZnJvemVuICAgICAgICAgYm9vbAoJcmV2aXNpb24gICAgICAgaW50NjQgLy8gYmFzZSBVUkkgY2hhbmdlcyBzaW5jZSBjcmVhdGlvbgp9CgovLyBjb250ZW50QWRkcmVzc2VkIGFjY2VwdHMgYW4gSVBGUyBwYXRoIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgZmlsZXMgZm9yCi8vIGdvb2Q6IGEgc2VydmVyIGJlaGluZCBhbnkgb3RoZXIgc2NoZW1lIGNvdWxkIGNoYW5nZSB0aGVtIGF0IHdpbGwsIGFuZCBhbgovLyBlbXB0eSBDSUQsIGEgIi4iIG9yICIuLiIgc2VnbWVudCwgYW4gZXNjYXBlLCBhIHF1ZXJ5IG9yIGEgZnJhZ21lbnQgY291bGQKLy8gbWFrZSBhIGdhdGV3YXkgcmVzb2x2ZSBpdCBlbHNld2hlcmUsIGEgbXV0YWJsZSBJUE5TIG5hbWUgaW5jbHVkZWQuCmZ1bmMgY29udGVudEFkZHJlc3NlZChzIHN0cmluZykgYm9vbCB7CglyZXR1cm4gc3RyaW5ncy5IYXNQcmVmaXgocywgImlwZnM6Ly8iKSAmJiBsZW4ocykgPiA3ICYmIHNbN10gIT0gJy8nICYmCgkJIXN0cmluZ3MuQ29udGFpbnMocywgIi8uIikgJiYgIXN0cmluZ3MuQ29udGFpbnNBbnkocywgIiU/IyIpICYmIG1ldGEuSW1hZ2UocykgPT0gbmlsCn0KCi8vIEEgYmFzZSBVUkkgaXMgYSBkaXJlY3Rvcnk6IHRva2VuIG4gcmVzb2x2ZXMgdG8gPGJhc2U+PG4+Lmpzb24uCmZ1bmMgdmFsaWRCYXNlVVJJKHMgc3RyaW5nKSBib29sIHsKCXJldHVybiBjb250ZW50QWRkcmVzc2VkKHMpICYmIHNbbGVuKHMpLTFdID09ICcvJwp9CgpmdW5jIHZhbGlkSGFzaChzIHN0cmluZykgYm9vbCB7CglpZiBsZW4ocykgIT0gNjQgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQlpZiBjIDo9IHNbaV07ICEoYyA+PSAnMCcgJiYgYyA8PSAnOScpICYmICEoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKLy8gUmV2ZWFsQ29tbWl0bWVudCBpcyB3aGF0IGEgY3JlYXRvciBjb21taXRzIHRvIGF0IGNyZWF0aW9uIGFuZCBvcGVucyBhdAovLyBSZXZlYWw6IHNoYTI1NigibGF1bmNocGFkLXJldmVhbC12MXw8Y3JlYXRvcj58PHNhbHQ+fDxiYXNlIFVSST4iKSwgd2l0aCBhCi8vIHNhbHQgb2YgNjQgaGV4IGRpZ2l0cyB0aGUgY3JlYXRvciBrZWVwcyBzZWNyZXQgdW50aWwgdGhlbi4gVGhlIHNhbHQga2VlcHMgYQovLyBndWVzc2VkIFVSSSBmcm9tIGJlaW5nIGNvbmZpcm1lZCBiZWZvcmUgdGhlIHJldmVhbC4gVGhlIGNyZWF0b3IncyBhZGRyZXNzCi8vIGtlZXBzIGFub3RoZXIgYWNjb3VudCBmcm9tIHJldXNpbmcgdGhlIGNvbW1pdG1lbnQ6IGEgY29sbGVjdGlvbidzIElEIGRvZXMKLy8gbm90IGV4aXN0IHlldCB3aGVuIGl0cyBjcmVhdG9yIGNvbW1pdHMsIHNvIHRoZSBhY2NvdW50IHN0YW5kcyBpbiBmb3IgaXQuCmZ1bmMgUmV2ZWFsQ29tbWl0bWVudChjcmVhdG9yIGFkZHJlc3MsIHNhbHQsIGJhc2VVUkkgc3RyaW5nKSBzdHJpbmcgewoJaCA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZSgibGF1bmNocGFkLXJldmVhbC12MXwiICsgY3JlYXRvci5TdHJpbmcoKSArICJ8IiArIHNhbHQgKyAifCIgKyBiYXNlVVJJKSkKCXJldHVybiBoZXguRW5jb2RlVG9TdHJpbmcoaFs6XSkKfQoKZnVuYyBuZXdNZXRhZGF0YShtb2RlLCBiYXNlVVJJLCBwbGFjZWhvbGRlclVSSSwgY29tbWl0bWVudCwgcHJvdmVuYW5jZSBzdHJpbmcsIGNyZWF0b3IgYWRkcmVzcykgbWV0YWRhdGEgewoJb2sgOj0gZmFsc2UKCXN3aXRjaCBtb2RlIHsKCWNhc2UgTWV0YWRhdGFTdGF0aWMsIE1ldGFkYXRhTXV0YWJsZToKCQlvayA9IHZhbGlkQmFzZVVSSShiYXNlVVJJKSAmJiBwbGFjZWhvbGRlclVSSSA9PSAiIiAmJiBjb21taXRtZW50ID09ICIiICYmIHByb3ZlbmFuY2UgPT0gIiIKCWNhc2UgTWV0YWRhdGFSZXZlYWw6CgkJLy8gV2hhdCBpcyBoaWRkZW4gbXVzdCBiZSBjb250ZW50LWFkZHJlc3NlZCwgb3IgdGhlIGNvbW1pdG1lbnQgd291bGQKCQkvLyBzYXkgbm90aGluZyBhYm91dCB0aGUgZmlsZXMgYmVoaW5kIGl0LgoJCW9rID0gYmFzZVVSSSA9PSAiIiAmJiBjb250ZW50QWRkcmVzc2VkKHBsYWNlaG9sZGVyVVJJKSAmJgoJCQlzdHJpbmdzLkhhc1N1ZmZpeChwbGFjZWhvbGRlclVSSSwgIi5qc29uIikgJiYKCQkJdmFsaWRIYXNoKGNvbW1pdG1lbnQpICYmIGNvbW1pdG1lbnQgIT0gc3RyaW5ncy5SZXBlYXQoIjAiLCA2NCkgJiYKCQkJdmFsaWRIYXNoKHByb3ZlbmFuY2UpCgl9CglpZiAhb2sgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIG1ldGFkYXRhIHRlcm1zIikKCX0KCW0gOj0gbWV0YWRhdGF7bW9kZTogbW9kZSwgYmFzZVVSSTogYmFzZVVSSSwgcGxhY2Vob2xkZXJVUkk6IHBsYWNlaG9sZGVyVVJJLAoJCWNvbW1pdG1lbnQ6IGNvbW1pdG1lbnQsIHByb3ZlbmFuY2U6IHByb3ZlbmFuY2UsIGZyb3plbjogbW9kZSA9PSBNZXRhZGF0YVN0YXRpY30KCWlmIG1vZGUgPT0gTWV0YWRhdGFSZXZlYWwgewoJCW0uY29tbWl0dGVyID0gY3JlYXRvcgoJfQoJcmV0dXJuIG0KfQoKZnVuYyAobSBtZXRhZGF0YSkgdG9rZW5VUkkobnVtYmVyIGludDY0KSBzdHJpbmcgewoJaWYgbS5iYXNlVVJJID09ICIiIHsKCQlyZXR1cm4gbS5wbGFjZWhvbGRlclVSSQoJfQoJcmV0dXJuIG0uYmFzZVVSSSArIHN0cmNvbnYuRm9ybWF0SW50KG51bWJlciwgMTApICsgIi5qc29uIgp9CgpmdW5jIGVtaXRNZXRhZGF0YShpZCBzdHJpbmcsIG0gbWV0YWRhdGEpIHsKCWNoYWluLkVtaXQoIk1ldGFkYXRhQ2hhbmdlZCIsICJjb2xsZWN0aW9uIiwgaWQsICJiYXNlX3VyaSIsIG0uYmFzZVVSSSwKCQkicmV2aXNpb24iLCBzdHJjb252LkZvcm1hdEludChtLnJldmlzaW9uLCAxMCksCgkJImZyb3plbiIsIHN0cmNvbnYuRm9ybWF0Qm9vbChtLmZyb3plbikpCn0KCi8vIFJldmVhbCBwdWJsaXNoZXMgdGhlIGJhc2UgVVJJIGNvbW1pdHRlZCBhdCBjcmVhdGlvbiwgd2l0aCB0aGUgc2FsdCB0aGF0Ci8vIG9wZW5zIHRoZSBjb21taXRtZW50LCBhbmQgZml4ZXMgaXQgZm9yIGdvb2QuIFRoZSBjb21taXRtZW50IHN0YXlzIGJvdW5kIHRvCi8vIHRoZSBhY2NvdW50IHRoYXQgY3JlYXRlZCB0aGUgY29sbGVjdGlvbiwgd2hvZXZlciBob2xkcyB0aGUgY3JlYXRvciByb2xlIG5vdy4KZnVuYyBSZXZlYWwoY3VyIHJlYWxtLCBpZCwgYmFzZVVSSSwgc2FsdCBzdHJpbmcpIHsKCW0gOj0gJmNyZWF0b3JPZihjdXIsIGlkKS5tZXRhZGF0YQoJaWYgbS5tb2RlICE9IE1ldGFkYXRhUmV2ZWFsIHx8IG0uZnJvemVuIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogbm90aGluZyB0byByZXZlYWwiKQoJfQoJaWYgIXZhbGlkQmFzZVVSSShiYXNlVVJJKSB8fCAhdmFsaWRIYXNoKHNhbHQpIHx8CgkJUmV2ZWFsQ29tbWl0bWVudChtLmNvbW1pdHRlciwgc2FsdCwgYmFzZVVSSSkgIT0gbS5jb21taXRtZW50IHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogcmV2ZWFsIGRvZXMgbm90IG1hdGNoIHRoZSBjb21taXRtZW50IikKCX0KCW0uYmFzZVVSSSwgbS5mcm96ZW4sIG0ucmV2aXNpb24gPSBiYXNlVVJJLCB0cnVlLCAxCgllbWl0TWV0YWRhdGEoaWQsICptKQp9CgpmdW5jIG11dGFibGUoY3VyIHJlYWxtLCBpZCBzdHJpbmcpICptZXRhZGF0YSB7CgltIDo9ICZjcmVhdG9yT2YoY3VyLCBpZCkubWV0YWRhdGEKCWlmIG0ubW9kZSAhPSBNZXRhZGF0YU11dGFibGUgfHwgbS5mcm96ZW4gewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBtZXRhZGF0YSBpcyBmaXhlZCIpCgl9CglyZXR1cm4gbQp9CgovLyBTZXRCYXNlVVJJIHBvaW50cyBhIG11dGFibGUgY29sbGVjdGlvbiBhdCBuZXcgbWV0YWRhdGEuIEV2ZXJ5IGNoYW5nZSBpcwovLyBhbm5vdW5jZWQgd2l0aCBpdHMgcmV2aXNpb24gbnVtYmVyLgpmdW5jIFNldEJhc2VVUkkoY3VyIHJlYWxtLCBpZCwgYmFzZVVSSSBzdHJpbmcpIHsKCW0gOj0gbXV0YWJsZShjdXIsIGlkKQoJaWYgIXZhbGlkQmFzZVVSSShiYXNlVVJJKSB8fCBiYXNlVVJJID09IG0uYmFzZVVSSSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IGludmFsaWQgYmFzZSBVUkkiKQoJfQoJbS5iYXNlVVJJID0gYmFzZVVSSQoJbS5yZXZpc2lvbisrCgllbWl0TWV0YWRhdGEoaWQsICptKQp9CgovLyBGcmVlemVNZXRhZGF0YSBnaXZlcyB1cCB0aGUgcmlnaHQgdG8gY2hhbmdlIGEgbXV0YWJsZSBjb2xsZWN0aW9uJ3MgYmFzZSBVUkkuCmZ1bmMgRnJlZXplTWV0YWRhdGEoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIHsKCW0gOj0gbXV0YWJsZShjdXIsIGlkKQoJbS5mcm96ZW4gPSB0cnVlCgllbWl0TWV0YWRhdGEoaWQsICptKQp9CgovLyBDb21taXRUcmFpdHMgcmVjb3Jkcywgb25jZSwgdGhlIE1lcmtsZSByb290IG9mIHRoZSBjb2xsZWN0aW9uJ3MgdHJhaXRzLiBJdAovLyB3YWl0cyBmb3IgZnJvemVuIG1ldGFkYXRhIHNvIHRoZSByb290IGNhbm5vdCBvdXRsaXZlIHRoZSBmaWxlcyBpdCBkZXNjcmliZXMuCi8vIEEgbGVhZiBpcyBzaGEyNTYoMHgwMCB8fCAibGF1bmNocGFkLXRyYWl0LXYxfDxjb2xsZWN0aW9uPnw8bnVtYmVyPnw8dHlwZT49PHZhbHVlPiIpCi8vIGluIGEgcC9zYW1jcmV3L2xhdW5jaHBhZC9tZXJrbGUvdjEgdHJlZSwgd2hlcmUgbmVpdGhlciB0aGUgdHlwZSBub3IgdGhlCi8vIHZhbHVlIGNvbnRhaW5zICI9IiBvciAifCI6IGEgbGVhZiBoYXMgdGhlbiBvbmUgcmVhZGluZyBvbmx5LCBhbmQgYSBsZWFmCi8vIHRoYXQgYnJlYWtzIHRoZSBydWxlIG1hdGNoZXMgbm8gdHJhaXQgb2ZmZXIuIFRoZSBsZWRnZXIgY2Fubm90IGNoZWNrIHRoZQovLyByb290IGFnYWluc3QgdGhlIGZpbGVzOyB3aG9ldmVyIHJlbGllcyBvbiBpdCBtdXN0IHJlY29tcHV0ZSBpdCBmcm9tIHRoZW0uCmZ1bmMgQ29tbWl0VHJhaXRzKGN1ciByZWFsbSwgaWQsIHJvb3Qgc3RyaW5nKSB7CgljIDo9IGNyZWF0b3JPZihjdXIsIGlkKQoJaWYgIWMubWV0YWRhdGEuZnJvemVuIHx8IGMudHJhaXRzUm9vdCAhPSAiIiB8fCAhdmFsaWRIYXNoKHJvb3QpIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogdHJhaXRzIGNhbm5vdCBiZSBjb21taXR0ZWQiKQoJfQoJYy50cmFpdHNSb290ID0gcm9vdAoJY2hhaW4uRW1pdCgiVHJhaXRzQ29tbWl0dGVkIiwgImNvbGxlY3Rpb24iLCBpZCwgInJvb3QiLCByb290KQp9CgovLyBUcmFpdHNSb290IGlzIGVtcHR5IHVudGlsIHRoZSBjcmVhdG9yIGNvbW1pdHMgb25lLgpmdW5jIFRyYWl0c1Jvb3QoaWQgc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gbXVzdENvbGxlY3Rpb24oaWQpLnRyYWl0c1Jvb3QgfQoa3I0BCgduZnQuZ25vEs+NAS8vIFBhY2thZ2UgbmZ0IGlzIHRoZSBMYXVuY2hwYWQgY29sbGVjdGlvbiBsZWRnZXIuIEVhY2ggY29sbGVjdGlvbiBpcyBhIEdSQzcyMQovLyB0b2tlbiB3aG9zZSB0cmFuc2ZlciBtb2RlLCByb3lhbHRpZXMgYW5kIG1ldGFkYXRhIHJ1bGVzIGFyZSBmaXhlZCBhdAovLyBjcmVhdGlvbi4gQ29sbGVjdGlvbnMgYXJlIGNyZWF0ZWQsIGFuZCB0aGVpciB0b2tlbnMgbWludGVkLCBvbmx5IGJ5IGlzc3VlcgovLyByZWFsbXM6IHRoZSBMYXVuY2hwYWQgZHJvcHMgcmVhbG0gYW5kIGFueSByZWFsbSB0aGUgY29uZmlnIGFkbWluIGFkZHMuCi8vIEhvbGRlcnMgbW92ZSwgYXBwcm92ZSBhbmQgYnVybiB0aGVpciBvd24gdG9rZW5zLiBUaGUgbGVkZ2VyIGhhcyBubyBhZG1pbiBvZgovLyBpdHMgb3duOiBub3RoaW5nIGhlcmUgY2FuIG1vdmUgYSBob2xkZXIncyB0b2tlbiBvciBjaGFuZ2UgYSBjb2xsZWN0aW9uJ3MKLy8gdGVybXMsIGFuZCBhIHBhdXNlZCBsYW5lIHN0b3BzIG9ubHkgbmV3IGNvbGxlY3Rpb25zIGFuZCBuZXcgbWludHMuCnBhY2thZ2UgbmZ0CgppbXBvcnQgKAoJImNoYWluIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvZ3JjNzIxL3YwIgoJImduby5sYW5kL3AvbnQvc2VxaWQvdjAiCgkiZ25vLmxhbmQvcC9zYW1jcmV3L2xhdW5jaHBhZC9jdXJyZW5jeS92MSIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbGF1bmNocGFkL21ldGEvdjEiCglzbSAiZ25vLmxhbmQvcC9zYW1jcmV3L2xhdW5jaHBhZC9zYWZlbWF0aC92MSIKCSJnbm8ubGFuZC9yL3NhbWNyZXcvbGF1bmNocGFkL2NvbmZpZy92MSIKKQoKY29uc3QgKAoJZHJvcHNQYXRoICAgICAgICAgICAgPSAiZ25vLmxhbmQvci9zYW1jcmV3L2xhdW5jaHBhZC9kcm9wcy92MSIKCW1hcmtldFBhdGggICAgICAgICAgID0gImduby5sYW5kL3Ivc2FtY3Jldy9sYXVuY2hwYWQvbWFya2V0L3YxIgoJTW9kZU9wZW4gICAgICAgICAgICAgPSAib3BlbiIKCU1vZGVSb3lhbHR5UHJvdGVjdGVkID0gInJveWFsdHlfcHJvdGVjdGVkIgoJTW9kZVNvdWxib3VuZCAgICAgICAgPSAic291bGJvdW5kIgoJU3RhdHVzQWN0aXZlICAgICAgICAgPSAiYWN0aXZlIgoJU3RhdHVzQnVybmVkICAgICAgICAgPSAiYnVybmVkIgoJU3RhdHVzUmV2b2tlZCAgICAgICAgPSAicmV2b2tlZCIKKQoKLy8gSW5mbyBpcyBhIGNvbGxlY3Rpb24ncyBwdWJsaWMgcmVjb3JkLiBUaGUgY3JlYXRvciBtYXkgZWRpdCB0aGUgcHJvZmlsZQovLyBmaWVsZHMgdW50aWwgRnJlZXplUHJvZmlsZSwgaGFuZCB0aGUgY3JlYXRvciByb2xlIG92ZXIgYW5kIHNlYWwgdGhlIHN1cHBseTsKLy8gZXZlcnl0aGluZyBlbHNlIGlzIGltbXV0YWJsZS4KdHlwZSBJbmZvIHN0cnVjdCB7CglJRCAgICAgICAgICAgICBzdHJpbmcgLy8gIkM8bj4iCglHUkM3MjFJRCAgICAgICBzdHJpbmcKCUlzc3VlciAgICAgICAgIGFkZHJlc3MgLy8gdGhlIG9ubHkgcmVhbG0gdGhhdCBtaW50cyBpbnRvIHRoZSBjb2xsZWN0aW9uCglDcmVhdG9yICAgICAgICBhZGRyZXNzCglPcmlnaW5hdG9yICAgICBhZGRyZXNzIC8vIHRoZSBjcmVhdG9yIGF0IGNyZWF0aW9uLCB3aG9ldmVyIGhvbGRzIHRoZSByb2xlIG5vdwoJUGVuZGluZ0NyZWF0b3IgYWRkcmVzcwoJTmFtZSAgICAgICAgICAgc3RyaW5nCglTeW1ib2wgICAgICAgICBzdHJpbmcKCURlc2NyaXB0aW9uICAgIHN0cmluZwoJSW1hZ2UgICAgICAgICAgc3RyaW5nCglCYW5uZXIgICAgICAgICBzdHJpbmcKCVdlYnNpdGUgICAgICAgIHN0cmluZwoJTW9kZSAgICAgICAgICAgc3RyaW5nCglSZXZvY2FibGUgICAgICBib29sICAvLyBzb3VsYm91bmQgb25seTogdGhlIGNyZWF0b3IgbWF5IHJldm9rZSBhIHRva2VuCglNYXhTdXBwbHkgICAgICBpbnQ2NCAvLyB6ZXJvIG1lYW5zIGFuIHVuY2FwcGVkIG9wZW4gZWRpdGlvbgoJU2VhbGVkICAgICAgICAgYm9vbCAgLy8gbm8gdG9rZW4gY2FuIGV2ZXIgYmUgbWludGVkIGFnYWluCglNaW50ZWQgICAgICAgICBpbnQ2NCAvLyBpbmNsdWRlcyByZXRpcmVkIHRva2VuczsgbnVtYmVycyBhcmUgbmV2ZXIgcmV1c2VkCglQcm9maWxlRnJvemVuICBib29sCn0KCnR5cGUgY29sbGVjdGlvbiBzdHJ1Y3QgewoJa2V5ICAgICAgICBzdHJpbmcgLy8gdHJlZSBrZXk6IGZpeGVkIHdpZHRoLCBpbiBjcmVhdGlvbiBvcmRlcgoJaW5mbyAgICAgICBJbmZvCgl0b2tlbiAgICAgICpncmM3MjEuVG9rZW4KCWxlZGdlciAgICAgKmdyYzcyMS5Qcml2YXRlTGVkZ2VyCgltZXRhZGF0YSAgIG1ldGFkYXRhCgl0cmFpdHNSb290IHN0cmluZyAgICAvLyBNZXJrbGUgcm9vdCBvZiB0aGUgdG9rZW4gdHJhaXRzLCBzZXQgb25jZQoJcm95YWx0aWVzICBbXXJveWFsdHkgLy8gYXQgbW9zdCBtYXhSb3lhbHR5UmVjZWl2ZXJzCglyb3lhbHR5QlBTIGludDY0CgltYXJrZXRzICAgIFtdYWRkcmVzcyAvLyByb3lhbHR5LXByb3RlY3RlZCBvbmx5LCBhdCBtb3N0IG1heE1hcmtldHMKCXJldGlyZWQgICAgYXZsLlRyZWUgIC8vIHRva2VuIG51bWJlciAtPiBTdGF0dXNCdXJuZWQgfCBTdGF0dXNSZXZva2VkCn0KCnZhciAoCglsYXN0SUQgICAgICBzZXFpZC5JRAoJY29sbGVjdGlvbnMgYXZsLlRyZWUgLy8gY29sbGVjdGlvbiBrZXkgLT4gKmNvbGxlY3Rpb24KCWhvbGRpbmdzICAgIGF2bC5UcmVlIC8vIG93bmVyIC0+ICphdmwuVHJlZSBvZiAiPGNvbGxlY3Rpb24ga2V5Pi88bnVtYmVyIGtleT4iIC0+IGN1c3RvZHkgSUQKCWxhc3RDdXN0b2R5IHNlcWlkLklEIC8vIHRoZSBsYXN0IGN1c3RvZHkgSUQgZ2l2ZW4KKQoKLy8gaXNJc3N1ZXIgcmVwb3J0cyB3aGV0aGVyIGEgcmVhbG0gbWF5IGNyZWF0ZSBjb2xsZWN0aW9ucyBhbmQgbWludCBpbnRvIGl0cwovLyBvd246IHRoZSBkcm9wcyByZWFsbSBhbHdheXMsIGFuZCBldmVyeSByZWFsbSBvbiBjb25maWcncyBhZGQtb25seSBsaXN0LgpmdW5jIGlzSXNzdWVyKHdobyBhZGRyZXNzKSBib29sIHsKCXJldHVybiB3aG8gPT0gY2hhaW4uUGFja2FnZUFkZHJlc3MoZHJvcHNQYXRoKSB8fCBjb25maWcuSXNJc3N1ZXIoY29uZmlnLkxlZGdlck5GVCwgd2hvKQp9CgovLyBnYXRlIHN0b3BzIGEgbmV3IGNvbGxlY3Rpb24gb3IgYSBuZXcgbWludCB3aGlsZSBpdHMgbGFuZSBpcyBwYXVzZWQsIHNvIHRoZQovLyBwYXVzZXIgaXMgYSBicmFrZSBvbiBldmVyeSBpc3N1ZXIgY29uZmlnIG1heSBhZGQsIHdoYXRldmVyIHRoYXQgaXNzdWVyCi8vIGNoZWNrcy4gVGhlIGRyb3BzIHJlYWxtIGlzIG5vdCBhc2tlZCB0d2ljZTogaXQgYXBwbGllcyB0aGUgc2FtZSBnYXRlIGl0c2VsZiwKLy8gd2l0aCB0aGUgY3VycmVuY3kgaXQgY2hhcmdlcywgYmVmb3JlIGl0IGNhbGxzIGhlcmUuCmZ1bmMgZ2F0ZShpc3N1ZXIgYWRkcmVzcywgbGFuZSBzdHJpbmcpIHsKCWlmIGlzc3VlciAhPSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhkcm9wc1BhdGgpICYmIGNvbmZpZy5Jc1BhdXNlZChsYW5lKSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IGxhbmUgcGF1c2VkIikKCX0KfQoKLy8gY2FsbGluZ1JlYWxtIHJldHVybnMgdGhlIHJlYWxtIHRoYXQgY2FsbGVkOyBhIHdhbGxldCBpcyByZWZ1c2VkLgpmdW5jIGNhbGxpbmdSZWFsbShjdXIgcmVhbG0pIGFkZHJlc3MgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB8fCBjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpc3N1ZXIgcmVhbG0gb25seSIpCgl9CglyZXR1cm4gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCn0KCi8vIGFjdG9yIHJldHVybnMgdGhlIGltbWVkaWF0ZSBjYWxsZXIuIENvaW5zIGEgd2FsbGV0IGF0dGFjaGVzIHRvIGEgZGlyZWN0IGNhbGwKLy8gd291bGQgc3RheSBpbiB0aGlzIHJlYWxtLCBzbyB0aGV5IGFyZSByZWZ1c2VkOyBhIGNhbGxpbmcgcmVhbG0ga2VlcHMgd2hhdGV2ZXIKLy8gaXRzIG93biBjYWxsZXIgc2VudC4KZnVuYyBhY3RvcihjdXIgcmVhbG0pIGFkZHJlc3MgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IHN0YWxlIHJlYWxtIGNvbnRleHQiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsKCQljdXJyZW5jeS5Bc3NlcnROb0NvaW5zKDAsIGN1cikKCX0KCXJldHVybiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKfQoKZnVuYyBjaGVjayhlcnIgZXJyb3IpIHsKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQp9CgpmdW5jIGNoZWNrUHJvZmlsZShkZXNjcmlwdGlvbiwgaW1hZ2UsIGJhbm5lciwgd2Vic2l0ZSBzdHJpbmcpIHsKCWNoZWNrKG1ldGEuRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pKQoJY2hlY2sobWV0YS5JbWFnZShpbWFnZSkpCgljaGVjayhtZXRhLkltYWdlKGJhbm5lcikpCgljaGVjayhtZXRhLldlYnNpdGUod2Vic2l0ZSkpCn0KCmZ1bmMgbXVzdENvbGxlY3Rpb24oaWQgc3RyaW5nKSAqY29sbGVjdGlvbiB7CglpZiBsZW4oaWQpID49IDIgJiYgbGVuKGlkKSA8PSAyMSAmJiBpZFswXSA9PSAnQycgJiYgaWRbMV0gIT0gJzAnIHsKCQlpZiBuLCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQoaWRbMTpdLCAxMCwgNjQpOyBlcnIgPT0gbmlsIHsKCQkJaWYgYyA6PSBjb2xsZWN0aW9ucy5HZXQoc2VxaWQuSUQobikuU3RyaW5nKCkpOyBjICE9IG5pbCB7CgkJCQlyZXR1cm4gYy4oKmNvbGxlY3Rpb24pCgkJCX0KCQl9Cgl9CglwYW5pYygibGF1bmNocGFkL25mdDogdW5rbm93biBjb2xsZWN0aW9uIikKfQoKZnVuYyB0b2tlbklEKG51bWJlciBpbnQ2NCkgZ3JjNzIxLlRva2VuSUQgewoJaWYgbnVtYmVyIDw9IDAgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIHRva2VuIG51bWJlciIpCgl9CglyZXR1cm4gZ3JjNzIxLlRva2VuSUQoc3RyY29udi5Gb3JtYXRJbnQobnVtYmVyLCAxMCkpCn0KCmZ1bmMgaG9sZGluZ0tleShjICpjb2xsZWN0aW9uLCBudW1iZXIgaW50NjQpIHN0cmluZyB7CglyZXR1cm4gYy5rZXkgKyAiLyIgKyBzZXFpZC5JRChudW1iZXIpLlN0cmluZygpCn0KCi8vIGhvbGQgYW5kIHJlbGVhc2Uga2VlcCB0aGUgaG9sZGluZ3MgaW5kZXggZXF1YWwgdG8gb3duZXJzaGlwOiBvbmUgdHJlZSBwZXIKLy8gb3duZXIsIHNvIGEgcGFnZSBvZiBhbiBhY2NvdW50J3MgdG9rZW5zIGNvc3RzIHRoZSBzYW1lIHdoZXJldmVyIGl0IHN0YXJ0cy4KZnVuYyBob2xkKG93bmVyIGFkZHJlc3MsIGMgKmNvbGxlY3Rpb24sIG51bWJlciBpbnQ2NCkgewoJbWluZSwgXyA6PSBob2xkaW5ncy5HZXQob3duZXIuU3RyaW5nKCkpLigqYXZsLlRyZWUpCglpZiBtaW5lID09IG5pbCB7CgkJbWluZSA9IGF2bC5OZXdUcmVlKCkKCQlob2xkaW5ncy5TZXQob3duZXIuU3RyaW5nKCksIG1pbmUpCgl9CgltaW5lLlNldChob2xkaW5nS2V5KGMsIG51bWJlciksIGludDY0KGxhc3RDdXN0b2R5Lk5leHQoKSkpCn0KCi8vIHJlbmV3IGdpdmVzIGEgaGVsZCB0b2tlbiBhIG5ldyBjdXN0b2R5IElELCBhcyBhIG1vdmUgZG9lczogYSBjaGFuZ2Ugb2YgaXRzCi8vIHNpbmdsZS10b2tlbiBhcHByb3ZhbCBzdGFydHMgYSBuZXcgY3VzdG9keSB0b28uCmZ1bmMgcmVuZXcob3duZXIgYWRkcmVzcywgYyAqY29sbGVjdGlvbiwgbnVtYmVyIGludDY0KSB7Cglob2xkaW5ncy5HZXQob3duZXIuU3RyaW5nKCkpLigqYXZsLlRyZWUpLlNldChob2xkaW5nS2V5KGMsIG51bWJlciksIGludDY0KGxhc3RDdXN0b2R5Lk5leHQoKSkpCn0KCmZ1bmMgcmVsZWFzZShvd25lciBhZGRyZXNzLCBjICpjb2xsZWN0aW9uLCBudW1iZXIgaW50NjQpIHsKCW1pbmUgOj0gaG9sZGluZ3MuR2V0KG93bmVyLlN0cmluZygpKS4oKmF2bC5UcmVlKQoJbWluZS5SZW1vdmUoaG9sZGluZ0tleShjLCBudW1iZXIpKQoJaWYgbWluZS5TaXplKCkgPT0gMCB7CgkJaG9sZGluZ3MuUmVtb3ZlKG93bmVyLlN0cmluZygpKQoJfQp9CgovLyBDcmVhdGUgcmVnaXN0ZXJzIGEgY29sbGVjdGlvbiBmb3IgYSBjcmVhdG9yIHRoZSBjYWxsaW5nIGlzc3VlciByZWFsbSBoYXMKLy8gYXV0aGVudGljYXRlZCBhbmQgY2hhcmdlZC4gVGhlIGlzc3VlciBpcyByZWNvcmRlZCBvbiB0aGUgY29sbGVjdGlvbiBhbmQgbm8KLy8gb3RoZXIgcmVhbG0gY2FuIG1pbnQgaW50byBpdC4gcm95YWx0aWVzIGlzICJhZGRyZXNzOmJwczthZGRyZXNzOmJwcyIgd2l0aAovLyBhZGRyZXNzZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLCBvciBlbXB0eTsgdGhlIG1ldGFkYXRhIGFyZ3VtZW50cyBhcmUKLy8gdGhvc2Ugb2YgbmV3TWV0YWRhdGEuCmZ1bmMgQ3JlYXRlKGN1ciByZWFsbSwgY3JlYXRvciBhZGRyZXNzLCBuYW1lLCBzeW1ib2wsIGRlc2NyaXB0aW9uLCBpbWFnZSwKCWJhbm5lciwgd2Vic2l0ZSwgbW9kZSBzdHJpbmcsIHJldm9jYWJsZSBib29sLCBtYXhTdXBwbHkgaW50NjQsCgltZXRhZGF0YU1vZGUsIGJhc2VVUkksIHBsYWNlaG9sZGVyVVJJLCBjb21taXRtZW50LCBwcm92ZW5hbmNlLAoJcm95YWx0aWVzIHN0cmluZykgc3RyaW5nIHsKCWlzc3VlciA6PSBjYWxsaW5nUmVhbG0oY3VyKQoJaWYgIWlzSXNzdWVyKGlzc3VlcikgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpc3N1ZXIgcmVhbG0gb25seSIpCgl9CglnYXRlKGlzc3VlciwgY29uZmlnLkxhbmVDb2xsZWN0aW9uKQoJaWYgIW1ldGEuVmFsaWRBZGRyZXNzKGNyZWF0b3IpIHx8IG1heFN1cHBseSA8IDAgfHwKCQkobW9kZSAhPSBNb2RlT3BlbiAmJiBtb2RlICE9IE1vZGVSb3lhbHR5UHJvdGVjdGVkICYmIG1vZGUgIT0gTW9kZVNvdWxib3VuZCkgfHwKCQkocmV2b2NhYmxlICYmIG1vZGUgIT0gTW9kZVNvdWxib3VuZCkgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIGNvbGxlY3Rpb24gdGVybXMiKQoJfQoJY2hlY2sobWV0YS5OYW1lKG5hbWUpKQoJY2hlY2sobWV0YS5UaWNrZXIoc3ltYm9sKSkKCWlmIGNvbmZpZy5Jc1Jlc2VydmVkKHN5bWJvbCkgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiByZXNlcnZlZCBzeW1ib2wiKQoJfQoJY2hlY2tQcm9maWxlKGRlc2NyaXB0aW9uLCBpbWFnZSwgYmFubmVyLCB3ZWJzaXRlKQoJYyA6PSAmY29sbGVjdGlvbnttZXRhZGF0YTogbmV3TWV0YWRhdGEobWV0YWRhdGFNb2RlLCBiYXNlVVJJLCBwbGFjZWhvbGRlclVSSSwKCQljb21taXRtZW50LCBwcm92ZW5hbmNlLCBjcmVhdG9yKX0KCWMucm95YWx0aWVzLCBjLnJveWFsdHlCUFMgPSBwYXJzZVJveWFsdGllcyhyb3lhbHRpZXMsIG1vZGUpCglpZiBtb2RlID09IE1vZGVSb3lhbHR5UHJvdGVjdGVkIHsKCQljLm1hcmtldHMgPSBbXWFkZHJlc3N7Y2hhaW4uUGFja2FnZUFkZHJlc3MobWFya2V0UGF0aCl9Cgl9CgluIDo9IGxhc3RJRC5OZXh0KCkKCWlkIDo9ICJDIiArIHN0cmNvbnYuRm9ybWF0VWludCh1aW50NjQobiksIDEwKQoJYy5rZXkgPSBuLlN0cmluZygpCgljLnRva2VuLCBjLmxlZGdlciA9IGdyYzcyMS5OZXdUb2tlbihuYW1lLCBzeW1ib2wsIG4sIGN1cikKCWMuaW5mbyA9IEluZm97CgkJSUQ6IGlkLCBHUkM3MjFJRDogYy50b2tlbi5JRCgpLCBJc3N1ZXI6IGlzc3VlciwgQ3JlYXRvcjogY3JlYXRvciwKCQlPcmlnaW5hdG9yOiBjcmVhdG9yLCBOYW1lOiBuYW1lLCBTeW1ib2w6IHN5bWJvbCwgRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLCBJbWFnZTogaW1hZ2UsCgkJQmFubmVyOiBiYW5uZXIsIFdlYnNpdGU6IHdlYnNpdGUsIE1vZGU6IG1vZGUsIFJldm9jYWJsZTogcmV2b2NhYmxlLAoJCU1heFN1cHBseTogbWF4U3VwcGx5LAoJfQoJY29sbGVjdGlvbnMuU2V0KGMua2V5LCBjKQoJY2hhaW4uRW1pdCgiQ29sbGVjdGlvbkNyZWF0ZWQiLCAiY29sbGVjdGlvbiIsIGlkLCAidG9rZW4iLCBjLnRva2VuLklEKCksCgkJImlzc3VlciIsIGlzc3Vlci5TdHJpbmcoKSwgImNyZWF0b3IiLCBjcmVhdG9yLlN0cmluZygpLAoJCSJuYW1lIiwgbmFtZSwgInN5bWJvbCIsIHN5bWJvbCwgIm1vZGUiLCBtb2RlLAoJCSJyZXZvY2FibGUiLCBzdHJjb252LkZvcm1hdEJvb2wocmV2b2NhYmxlKSwKCQkibWF4X3N1cHBseSIsIHN0cmNvbnYuRm9ybWF0SW50KG1heFN1cHBseSwgMTApLAoJCSJtZXRhZGF0YSIsIG1ldGFkYXRhTW9kZSwgImJhc2VfdXJpIiwgYmFzZVVSSSwKCQkicGxhY2Vob2xkZXJfdXJpIiwgcGxhY2Vob2xkZXJVUkksICJiYXNlX3VyaV9jb21taXRtZW50IiwgY29tbWl0bWVudCwKCQkicHJvdmVuYW5jZSIsIHByb3ZlbmFuY2UsICJyb3lhbHRpZXMiLCByb3lhbHRpZXMsCgkJImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24sICJpbWFnZSIsIGltYWdlLCAiYmFubmVyIiwgYmFubmVyLAoJCSJ3ZWJzaXRlIiwgd2Vic2l0ZSkKCXJldHVybiBpZAp9CgovLyBNaW50VG8gaXNzdWVzIHRoZSBuZXh0IHRva2VuIG51bWJlci4gT25seSB0aGUgY29sbGVjdGlvbidzIGlzc3VlciBjYWxscyBpdCwKLy8gYWZ0ZXIgaXRzIG93biBhY2NvdW50aW5nIG9mIHN0YWdlcyBhbmQgcGF5bWVudC4gVGhlIGxlZGdlciBtaW50cyB0byB3aG9ldmVyCi8vIHRoZSBpc3N1ZXIgbmFtZXM6IGl0IGlzIHRoZSBpc3N1ZXIncyBkdXR5IHRvIG1pbnQgYSBzb3VsYm91bmQgdG9rZW4gb25seSB0bwovLyB0aGUgd2FsbGV0IHRoYXQgYXNrZWQgZm9yIGl0LgpmdW5jIE1pbnRUbyhjdXIgcmVhbG0sIGlkIHN0cmluZywgcmVjaXBpZW50IGFkZHJlc3MpIGludDY0IHsKCWlzc3VlciA6PSBjYWxsaW5nUmVhbG0oY3VyKQoJYyA6PSBtdXN0Q29sbGVjdGlvbihpZCkKCWlmIGlzc3VlciAhPSBjLmluZm8uSXNzdWVyIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogdGhlIGNvbGxlY3Rpb24ncyBpc3N1ZXIgb25seSIpCgl9CglnYXRlKGlzc3VlciwgY29uZmlnLkxhbmVORlREcm9wcykKCWlmICFtZXRhLlZhbGlkQWRkcmVzcyhyZWNpcGllbnQpIHx8IGMuaW5mby5TZWFsZWQgfHwKCQkoYy5pbmZvLk1heFN1cHBseSA+IDAgJiYgYy5pbmZvLk1pbnRlZCA+PSBjLmluZm8uTWF4U3VwcGx5KSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IG1pbnQgZGVuaWVkIikKCX0KCW51bWJlciA6PSBzbS5BZGQoYy5pbmZvLk1pbnRlZCwgMSkKCWNoZWNrKGMubGVkZ2VyLk1pbnQocmVjaXBpZW50LCB0b2tlbklEKG51bWJlcikpKQoJYy5pbmZvLk1pbnRlZCA9IG51bWJlcgoJaG9sZChyZWNpcGllbnQsIGMsIG51bWJlcikKCXJldHVybiBudW1iZXIKfQoKLy8gb3BlcmF0b3IgcmVwb3J0cyB3aGV0aGVyIHdobyBtYXkgYmUgYXBwcm92ZWQgZm9yLCBvciBtb3ZlLCBhIHRva2VuIG9mIGMuCi8vIFNvdWxib3VuZCB0b2tlbnMgbmV2ZXIgbW92ZS4gQSByb3lhbHR5LXByb3RlY3RlZCB0b2tlbiBtb3ZlcyBvbmx5IHRocm91Z2ggYQovLyByZWFsbSBvbiB0aGUgY29sbGVjdGlvbidzIG1hcmtldCBsaXN0LiBUaGUgbGVkZ2VyIGNhbm5vdCBtYWtlIGEgcmVhbG0gcGF5OgovLyB0aGUgY3JlYXRvciB3aG8gbGlzdHMgb25lIHZvdWNoZXMgdGhhdCBpdCBwYXlzIHRoZSBjb2xsZWN0aW9uJ3Mgcm95YWx0aWVzLgpmdW5jIG9wZXJhdG9yKGMgKmNvbGxlY3Rpb24sIHdobyBhZGRyZXNzKSBib29sIHsKCXN3aXRjaCBjLmluZm8uTW9kZSB7CgljYXNlIE1vZGVPcGVuOgoJCXJldHVybiB0cnVlCgljYXNlIE1vZGVSb3lhbHR5UHJvdGVjdGVkOgoJCWZvciBfLCBtYXJrZXQgOj0gcmFuZ2UgYy5tYXJrZXRzIHsKCQkJaWYgd2hvID09IG1hcmtldCB7CgkJCQlyZXR1cm4gdHJ1ZQoJCQl9CgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCmZ1bmMgZGVuaWVkKGMgKmNvbGxlY3Rpb24pIHsKCWlmIGMuaW5mby5Nb2RlID09IE1vZGVTb3VsYm91bmQgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBzb3VsYm91bmQgdG9rZW5zIGNhbm5vdCBtb3ZlIikKCX0KCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiByb3lhbHR5LXByb3RlY3RlZCB0b2tlbnMgbW92ZSBvbmx5IHRocm91Z2ggYW4gYWxsb3dlZCBtYXJrZXQiKQp9CgovLyBUcmFuc2ZlckZyb20gbW92ZXMgYSB0b2tlbiB3aGVuIHRoZSBjb2xsZWN0aW9uJ3MgbW9kZSBsZXRzIHRoZSBjYWxsZXIgbW92ZQovLyBvbmUsIGFuZCB0aGUgY2FsbGVyIG93bnMgaXQgb3IgaXMgYXBwcm92ZWQgZm9yIGl0LgpmdW5jIFRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGlkIHN0cmluZywgZnJvbSwgdG8gYWRkcmVzcywgbnVtYmVyIGludDY0KSB7Cgl3aG8gOj0gYWN0b3IoY3VyKQoJYyA6PSBtdXN0Q29sbGVjdGlvbihpZCkKCWlmICFvcGVyYXRvcihjLCB3aG8pIHsKCQlkZW5pZWQoYykKCX0KCWlmICFtZXRhLlZhbGlkQWRkcmVzcyh0bykgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIHJlY2lwaWVudCIpCgl9CgljaGVjayhjLmxlZGdlci5UcmFuc2ZlckZyb20od2hvLCBmcm9tLCB0bywgdG9rZW5JRChudW1iZXIpKSkKCXJlbGVhc2UoZnJvbSwgYywgbnVtYmVyKQoJaG9sZCh0bywgYywgbnVtYmVyKQp9CgovLyBBcHByb3ZlIGxldHMgb25lIGFjY291bnQgbW92ZSBvbmUgdG9rZW47IGFuIGVtcHR5IGFkZHJlc3MgY2xlYXJzIGl0LiBBCi8vIHNvdWxib3VuZCB0b2tlbiB0YWtlcyBubyBhcHByb3ZhbCBhdCBhbGwsIGEgcm95YWx0eS1wcm90ZWN0ZWQgb25lIG9ubHkgYQovLyBsaXN0ZWQgbWFya2V0LgpmdW5jIEFwcHJvdmUoY3VyIHJlYWxtLCBpZCBzdHJpbmcsIHRvIGFkZHJlc3MsIG51bWJlciBpbnQ2NCkgewoJd2hvIDo9IGFjdG9yKGN1cikKCWMgOj0gbXVzdENvbGxlY3Rpb24oaWQpCglpZiBjLmluZm8uTW9kZSA9PSBNb2RlU291bGJvdW5kIHx8ICh0byAhPSAiIiAmJiAhb3BlcmF0b3IoYywgdG8pKSB7CgkJZGVuaWVkKGMpCgl9CglpZiB0byAhPSAiIiAmJiAhbWV0YS5WYWxpZEFkZHJlc3ModG8pIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogaW52YWxpZCBvcGVyYXRvciIpCgl9CgliZWZvcmUgOj0gR2V0QXBwcm92ZWQoaWQsIG51bWJlcikKCWNoZWNrKGMubGVkZ2VyLkFwcHJvdmUod2hvLCB0bywgdG9rZW5JRChudW1iZXIpKSkKCWlmIHRvICE9IGJlZm9yZSB7CgkJcmVuZXcob3duZXJPZihjLCBudW1iZXIpLCBjLCBudW1iZXIpCgl9Cn0KCi8vIFNldEFwcHJvdmFsRm9yQWxsIGxldHMsIG9yIHN0b3BzIGxldHRpbmcsIG9uZSBhY2NvdW50IG1vdmUgZXZlcnkgdG9rZW4gdGhlCi8vIGNhbGxlciBob2xkcyBpbiB0aGUgY29sbGVjdGlvbi4KZnVuYyBTZXRBcHByb3ZhbEZvckFsbChjdXIgcmVhbG0sIGlkIHN0cmluZywgdG8gYWRkcmVzcywgYXBwcm92ZWQgYm9vbCkgewoJd2hvIDo9IGFjdG9yKGN1cikKCWMgOj0gbXVzdENvbGxlY3Rpb24oaWQpCglpZiAhb3BlcmF0b3IoYywgdG8pIHsKCQlkZW5pZWQoYykKCX0KCWlmICFtZXRhLlZhbGlkQWRkcmVzcyh0bykgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIG9wZXJhdG9yIikKCX0KCWNoZWNrKGMubGVkZ2VyLlNldEFwcHJvdmFsRm9yQWxsKHdobywgdG8sIGFwcHJvdmVkKSkKfQoKZnVuYyBvd25lck9mKGMgKmNvbGxlY3Rpb24sIG51bWJlciBpbnQ2NCkgYWRkcmVzcyB7Cglvd25lciwgZXJyIDo9IGMudG9rZW4uT3duZXJPZih0b2tlbklEKG51bWJlcikpCgljaGVjayhlcnIpCglyZXR1cm4gb3duZXIKfQoKZnVuYyByZXRpcmUoYyAqY29sbGVjdGlvbiwgb3duZXIgYWRkcmVzcywgbnVtYmVyIGludDY0LCBzdGF0dXMgc3RyaW5nKSB7Cgl0aWQgOj0gdG9rZW5JRChudW1iZXIpCgljaGVjayhjLmxlZGdlci5CdXJuKHRpZCkpCgljLnJldGlyZWQuU2V0KHRpZC5TdHJpbmcoKSwgc3RhdHVzKQoJcmVsZWFzZShvd25lciwgYywgbnVtYmVyKQp9CgovLyBCdXJuIGlzIHRoZSBob2xkZXIncyBhbG9uZSwgaW4gZXZlcnkgbW9kZS4gTm8gY3JlYXRvciwgb3BlcmF0b3Igb3IgYWRtaW4KLy8gY2FuIGRlc3Ryb3kgYSB0b2tlbiBzb21lYm9keSBlbHNlIGhvbGRzLCBleGNlcHQgdGhyb3VnaCBSZXZva2UuCmZ1bmMgQnVybihjdXIgcmVhbG0sIGlkIHN0cmluZywgbnVtYmVyIGludDY0KSB7Cgl3aG8gOj0gYWN0b3IoY3VyKQoJYyA6PSBtdXN0Q29sbGVjdGlvbihpZCkKCWlmIHdobyAhPSBvd25lck9mKGMsIG51bWJlcikgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBob2xkZXIgb25seSIpCgl9CglyZXRpcmUoYywgd2hvLCBudW1iZXIsIFN0YXR1c0J1cm5lZCkKfQoKLy8gUmV2b2tlIHJldGlyZXMgYSBjcmVkZW50aWFsLiBJdCBleGlzdHMgb25seSBmb3Igc291bGJvdW5kIGNvbGxlY3Rpb25zCi8vIGNyZWF0ZWQgYXMgcmV2b2NhYmxlLCBhIHRlcm0gZXZlcnkgaG9sZGVyIGNvdWxkIHJlYWQgYmVmb3JlIGNsYWltaW5nLiBBCi8vIGhvbGRlciB3aG8gYnVybnMgZmlyc3QgbGVhdmVzIGEgYnVybmVkIHRva2VuLCBub3QgYSByZXZva2VkIG9uZS4KZnVuYyBSZXZva2UoY3VyIHJlYWxtLCBpZCBzdHJpbmcsIG51bWJlciBpbnQ2NCwgcmVhc29uIHN0cmluZykgewoJYyA6PSBjcmVhdG9yT2YoY3VyLCBpZCkKCWlmIGMuaW5mby5Nb2RlICE9IE1vZGVTb3VsYm91bmQgfHwgIWMuaW5mby5SZXZvY2FibGUgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBub3QgYSByZXZvY2FibGUgY29sbGVjdGlvbiIpCgl9Cglzd2l0Y2ggcmVhc29uIHsKCWNhc2UgImV4cGlyZWQiLCAiZnJhdWQiLCAiZWxpZ2liaWxpdHlfbG9zdCIsICJpc3N1ZXJfZXJyb3IiLCAib3RoZXIiOgoJZGVmYXVsdDoKCQlwYW5pYygibGF1bmNocGFkL25mdDogaW52YWxpZCByZXZvY2F0aW9uIHJlYXNvbiIpCgl9Cglob2xkZXIgOj0gb3duZXJPZihjLCBudW1iZXIpCglyZXRpcmUoYywgaG9sZGVyLCBudW1iZXIsIFN0YXR1c1Jldm9rZWQpCgljaGFpbi5FbWl0KCJSZXZva2VkIiwgImNvbGxlY3Rpb24iLCBpZCwKCQkibnVtYmVyIiwgc3RyY29udi5Gb3JtYXRJbnQobnVtYmVyLCAxMCksICJob2xkZXIiLCBob2xkZXIuU3RyaW5nKCksCgkJInJlYXNvbiIsIHJlYXNvbikKfQoKLy8gY3JlYXRvck9mIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gd2hlbiB0aGUgY2FsbGVyIGlzIGl0cyBjcmVhdG9yLgpmdW5jIGNyZWF0b3JPZihjdXIgcmVhbG0sIGlkIHN0cmluZykgKmNvbGxlY3Rpb24gewoJd2hvIDo9IGFjdG9yKGN1cikKCWMgOj0gbXVzdENvbGxlY3Rpb24oaWQpCglpZiB3aG8gIT0gYy5pbmZvLkNyZWF0b3IgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBjcmVhdG9yIG9ubHkiKQoJfQoJcmV0dXJuIGMKfQoKLy8gUHJvcG9zZUNyZWF0b3Igc3RhcnRzIGhhbmRpbmcgdGhlIGNyZWF0b3Igcm9sZSB0byBhbm90aGVyIGFjY291bnQuIE5vdGhpbmcKLy8gY2hhbmdlcyB1bnRpbCB0aGF0IGFjY291bnQgYWNjZXB0czsgYW4gZW1wdHkgYWRkcmVzcyB3aXRoZHJhd3MgdGhlIG9mZmVyLgpmdW5jIFByb3Bvc2VDcmVhdG9yKGN1ciByZWFsbSwgaWQgc3RyaW5nLCBuZXh0IGFkZHJlc3MpIHsKCWMgOj0gY3JlYXRvck9mKGN1ciwgaWQpCglpZiBuZXh0ICE9ICIiICYmICghbWV0YS5WYWxpZEFkZHJlc3MobmV4dCkgfHwgbmV4dCA9PSBjLmluZm8uQ3JlYXRvcikgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIG5leHQgY3JlYXRvciIpCgl9CgljLmluZm8uUGVuZGluZ0NyZWF0b3IgPSBuZXh0CgljaGFpbi5FbWl0KCJDcmVhdG9yUHJvcG9zZWQiLCAiY29sbGVjdGlvbiIsIGlkLCAibmV4dCIsIG5leHQuU3RyaW5nKCkpCn0KCi8vIEFjY2VwdENyZWF0b3IgbWFrZXMgdGhlIGNhbGxlciB0aGUgY3JlYXRvciBpdCB3YXMgcHJvcG9zZWQgYXMuCmZ1bmMgQWNjZXB0Q3JlYXRvcihjdXIgcmVhbG0sIGlkIHN0cmluZykgewoJd2hvIDo9IGFjdG9yKGN1cikKCWMgOj0gbXVzdENvbGxlY3Rpb24oaWQpCglpZiBjLmluZm8uUGVuZGluZ0NyZWF0b3IgPT0gIiIgfHwgd2hvICE9IGMuaW5mby5QZW5kaW5nQ3JlYXRvciB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IHByb3Bvc2VkIGNyZWF0b3Igb25seSIpCgl9CgljLmluZm8uQ3JlYXRvciwgYy5pbmZvLlBlbmRpbmdDcmVhdG9yID0gd2hvLCAiIgoJY2hhaW4uRW1pdCgiQ3JlYXRvckNoYW5nZWQiLCAiY29sbGVjdGlvbiIsIGlkLCAiY3JlYXRvciIsIHdoby5TdHJpbmcoKSkKfQoKLy8gU2V0SXNzdWVyIG1vdmVzIHRoZSBjb2xsZWN0aW9uJ3MgbWludGluZyB0byBhbm90aGVyIGlzc3VlciByZWFsbSwgZm9yCi8vIGluc3RhbmNlIGEgbGF0ZXIgdmVyc2lvbiBvZiB0aGUgb25lIHRoYXQgY3JlYXRlZCBpdC4gT25seSB0aGUgY3JlYXRvciBjYW4KLy8gY2hvb3NlIGl0LCBhbmQgb25seSBhbW9uZyByZWFsbXMgYWxsb3dlZCB0byBpc3N1ZS4KZnVuYyBTZXRJc3N1ZXIoY3VyIHJlYWxtLCBpZCwgcGtnUGF0aCBzdHJpbmcpIHsKCWMgOj0gY3JlYXRvck9mKGN1ciwgaWQpCglpZiBsZW4ocGtnUGF0aCkgPCAxMiB8fCBsZW4ocGtnUGF0aCkgPiAyMDAgfHwgcGtnUGF0aFs6MTFdICE9ICJnbm8ubGFuZC9yLyIgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIGlzc3VlciIpCgl9CgluZXh0IDo9IGNoYWluLlBhY2thZ2VBZGRyZXNzKHBrZ1BhdGgpCglpZiAhaXNJc3N1ZXIobmV4dCkgfHwgbmV4dCA9PSBjLmluZm8uSXNzdWVyIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogaW52YWxpZCBpc3N1ZXIiKQoJfQoJYy5pbmZvLklzc3VlciA9IG5leHQKCWNoYWluLkVtaXQoIklzc3VlckNoYW5nZWQiLCAiY29sbGVjdGlvbiIsIGlkLCAiaXNzdWVyIiwgbmV4dC5TdHJpbmcoKSwKCQkicGF0aCIsIHBrZ1BhdGgpCn0KCi8vIFNlYWxTdXBwbHkgZW5kcyBtaW50aW5nIGZvciBnb29kLCB3aGF0ZXZlciB0aGUgY2FwIHdhcy4KZnVuYyBTZWFsU3VwcGx5KGN1ciByZWFsbSwgaWQgc3RyaW5nKSB7CgljIDo9IGNyZWF0b3JPZihjdXIsIGlkKQoJaWYgYy5pbmZvLlNlYWxlZCB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IHN1cHBseSBhbHJlYWR5IHNlYWxlZCIpCgl9CgljLmluZm8uU2VhbGVkID0gdHJ1ZQoJY2hhaW4uRW1pdCgiU3VwcGx5U2VhbGVkIiwgImNvbGxlY3Rpb24iLCBpZCwKCQkibWludGVkIiwgc3RyY29udi5Gb3JtYXRJbnQoYy5pbmZvLk1pbnRlZCwgMTApKQp9CgpmdW5jIHByb2ZpbGVPd25lcihjdXIgcmVhbG0sIGlkIHN0cmluZykgKmNvbGxlY3Rpb24gewoJYyA6PSBjcmVhdG9yT2YoY3VyLCBpZCkKCWlmIGMuaW5mby5Qcm9maWxlRnJvemVuIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogcHJvZmlsZSBmcm96ZW4iKQoJfQoJcmV0dXJuIGMKfQoKZnVuYyBTZXRQcm9maWxlKGN1ciByZWFsbSwgaWQsIGRlc2NyaXB0aW9uLCBpbWFnZSwgYmFubmVyLCB3ZWJzaXRlIHN0cmluZykgewoJYyA6PSBwcm9maWxlT3duZXIoY3VyLCBpZCkKCWNoZWNrUHJvZmlsZShkZXNjcmlwdGlvbiwgaW1hZ2UsIGJhbm5lciwgd2Vic2l0ZSkKCWMuaW5mby5EZXNjcmlwdGlvbiwgYy5pbmZvLkltYWdlID0gZGVzY3JpcHRpb24sIGltYWdlCgljLmluZm8uQmFubmVyLCBjLmluZm8uV2Vic2l0ZSA9IGJhbm5lciwgd2Vic2l0ZQoJY2hhaW4uRW1pdCgiUHJvZmlsZUNoYW5nZWQiLCAiY29sbGVjdGlvbiIsIGlkLCAiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbiwKCQkiaW1hZ2UiLCBpbWFnZSwgImJhbm5lciIsIGJhbm5lciwgIndlYnNpdGUiLCB3ZWJzaXRlKQp9CgpmdW5jIEZyZWV6ZVByb2ZpbGUoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIHsKCXByb2ZpbGVPd25lcihjdXIsIGlkKS5pbmZvLlByb2ZpbGVGcm96ZW4gPSB0cnVlCgljaGFpbi5FbWl0KCJQcm9maWxlRnJvemVuIiwgImNvbGxlY3Rpb24iLCBpZCkKfQoKZnVuYyBHZXRJbmZvKGlkIHN0cmluZykgSW5mbyB7IHJldHVybiBtdXN0Q29sbGVjdGlvbihpZCkuaW5mbyB9CmZ1bmMgQ291bnQoKSBpbnQ2NCAgICAgICAgICAgeyByZXR1cm4gaW50NjQoY29sbGVjdGlvbnMuU2l6ZSgpKSB9CgpmdW5jIEJhbGFuY2VPZihpZCBzdHJpbmcsIG93bmVyIGFkZHJlc3MpIGludDY0IHsKCWlmICFtZXRhLlZhbGlkQWRkcmVzcyhvd25lcikgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIG93bmVyIikKCX0KCW4sIGVyciA6PSBtdXN0Q29sbGVjdGlvbihpZCkudG9rZW4uQmFsYW5jZU9mKG93bmVyKQoJY2hlY2soZXJyKQoJcmV0dXJuIG4KfQoKZnVuYyBPd25lck9mKGlkIHN0cmluZywgbnVtYmVyIGludDY0KSBhZGRyZXNzIHsgcmV0dXJuIG93bmVyT2YobXVzdENvbGxlY3Rpb24oaWQpLCBudW1iZXIpIH0KCmZ1bmMgVG90YWxTdXBwbHkoaWQgc3RyaW5nKSBpbnQ2NCB7IHJldHVybiBtdXN0Q29sbGVjdGlvbihpZCkudG9rZW4uVG90YWxTdXBwbHkoKSB9CgovLyBHZXRBcHByb3ZlZCByZXR1cm5zIHRoZSBlbXB0eSBhZGRyZXNzIHdoZW4gbm9ib2R5IGlzIGFwcHJvdmVkLgpmdW5jIEdldEFwcHJvdmVkKGlkIHN0cmluZywgbnVtYmVyIGludDY0KSBhZGRyZXNzIHsKCWEsIGVyciA6PSBtdXN0Q29sbGVjdGlvbihpZCkudG9rZW4uR2V0QXBwcm92ZWQodG9rZW5JRChudW1iZXIpKQoJaWYgZXJyID09IGdyYzcyMS5FcnJUb2tlbklkTm90QXBwcm92ZWQgewoJCXJldHVybiAiIgoJfQoJY2hlY2soZXJyKQoJcmV0dXJuIGEKfQoKZnVuYyBJc0FwcHJvdmVkRm9yQWxsKGlkIHN0cmluZywgb3duZXIsIG9wZXJhdG9yIGFkZHJlc3MpIGJvb2wgewoJaWYgIW1ldGEuVmFsaWRBZGRyZXNzKG93bmVyKSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IGludmFsaWQgb3duZXIiKQoJfQoJaWYgIW1ldGEuVmFsaWRBZGRyZXNzKG9wZXJhdG9yKSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IGludmFsaWQgb3BlcmF0b3IiKQoJfQoJcmV0dXJuIG11c3RDb2xsZWN0aW9uKGlkKS50b2tlbi5Jc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvcikKfQoKZnVuYyBzdGF0dXNPZihjICpjb2xsZWN0aW9uLCBudW1iZXIgaW50NjQpIHN0cmluZyB7CglpZiBudW1iZXIgPD0gMCB8fCBudW1iZXIgPiBjLmluZm8uTWludGVkIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogaW52YWxpZCB0b2tlbiBudW1iZXIiKQoJfQoJaWYgc3RhdHVzIDo9IGMucmV0aXJlZC5HZXQoc3RyY29udi5Gb3JtYXRJbnQobnVtYmVyLCAxMCkpOyBzdGF0dXMgIT0gbmlsIHsKCQlyZXR1cm4gc3RhdHVzLihzdHJpbmcpCgl9CglyZXR1cm4gU3RhdHVzQWN0aXZlCn0KCi8vIEVwb2NoIHJldHVybnMgdGhlIElEIG9mIGEgdG9rZW4ncyBjdXJyZW50IGN1c3RvZHk6IGEgbmV3IG9uZSBhdCBldmVyeSBtb3ZlCi8vIGFuZCBldmVyeSBjaGFuZ2Ugb2YgaXRzIHNpbmdsZS10b2tlbiBhcHByb3ZhbCAodGhlIHNhbWUgYXBwcm92YWwgYWdhaW4KLy8gY2hhbmdlcyBub3RoaW5nKSwgbmV2ZXIgb25lIGdpdmVuIGJlZm9yZTsgMCBmb3IgYSByZXRpcmVkIHRva2VuLiBBIG1hcmtldAovLyBiaW5kcyBhbiBvcmRlciB0byBpdCwgc28gdGhlIG9yZGVyIGRpZXMgd2l0aCB0aGUgY3VzdG9keSBpdCB3YXMgbWFkZSB1bmRlci4KZnVuYyBFcG9jaChpZCBzdHJpbmcsIG51bWJlciBpbnQ2NCkgaW50NjQgewoJYyA6PSBtdXN0Q29sbGVjdGlvbihpZCkKCWlmIHN0YXR1c09mKGMsIG51bWJlcikgIT0gU3RhdHVzQWN0aXZlIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGhvbGRpbmdzLkdldChvd25lck9mKGMsIG51bWJlcikuU3RyaW5nKCkpLigqYXZsLlRyZWUpLkdldChob2xkaW5nS2V5KGMsIG51bWJlcikpLihpbnQ2NCkKfQoKZnVuYyBTdGF0dXNPZihpZCBzdHJpbmcsIG51bWJlciBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0YXR1c09mKG11c3RDb2xsZWN0aW9uKGlkKSwgbnVtYmVyKSB9CgovLyBUb2tlblVSSSBhbnN3ZXJzIGZvciBldmVyeSBtaW50ZWQgbnVtYmVyLCByZXRpcmVkIG9yIG5vdDogdGhlIG1ldGFkYXRhIG9mIGEKLy8gYnVybmVkIHRva2VuIGlzIHN0aWxsIHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24ncyBwdWJsaWMgcmVjb3JkLgpmdW5jIFRva2VuVVJJKGlkIHN0cmluZywgbnVtYmVyIGludDY0KSBzdHJpbmcgewoJYyA6PSBtdXN0Q29sbGVjdGlvbihpZCkKCXN0YXR1c09mKGMsIG51bWJlcikKCXJldHVybiBjLm1ldGFkYXRhLnRva2VuVVJJKG51bWJlcikKfQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoID09ICIiIHsKCQlyZXR1cm4gIiMgTGF1bmNocGFkIE5GVCBjb2xsZWN0aW9uc1xuXG4iICsKCQkJc3RyY29udi5JdG9hKGNvbGxlY3Rpb25zLlNpemUoKSkgKyAiIGNvbGxlY3Rpb25zLlxuIgoJfQoJYyA6PSBtdXN0Q29sbGVjdGlvbihwYXRoKQoJcmV0dXJuICIjICIgKyBtZXRhLkVzY2FwZU1hcmtkb3duKGMuaW5mby5OYW1lKSArICJcblxuIiArCgkJIk1vZGU6ICIgKyBjLmluZm8uTW9kZSArICJcblxuIiArCgkJIk1pbnRlZDogIiArIHN0cmNvbnYuRm9ybWF0SW50KGMuaW5mby5NaW50ZWQsIDEwKSArICJcbiIKfQoa1SQKCXRlcm1zLmdubxLHJHBhY2thZ2UgbmZ0CgppbXBvcnQgKAoJImNoYWluIgoJInN0cmluZ3MiCgoJc20gImduby5sYW5kL3Avc2FtY3Jldy9sYXVuY2hwYWQvc2FmZW1hdGgvdjEiCgkiZ25vLmxhbmQvci9zYW1jcmV3L2xhdW5jaHBhZC9jb25maWcvdjEiCikKCi8vIEhhcmQgbGltaXRzLCBmaXhlZCBmb3IgdGhlIGxpZmUgb2YgdGhpcyByZWFsbS4KY29uc3QgKAoJbWF4Um95YWx0eVJlY2VpdmVycyA9IDEwCgltYXhSb3lhbHR5QlBTICAgICAgID0gMTAwMCAvLyAxMCUgb2YgYSBzYWxlLCBhY3Jvc3MgYWxsIHJlY2VpdmVycwoJbWF4TWFya2V0cyAgICAgICAgICA9IDUKKQoKLy8gcm95YWx0eSBpcyBvbmUgcmVjZWl2ZXIncyBzaGFyZSBvZiBldmVyeSBzYWxlLCBpbiBiYXNpcyBwb2ludHMuCnR5cGUgcm95YWx0eSBzdHJ1Y3QgewoJQWNjb3VudCBhZGRyZXNzCglCUFMgICAgIGludDY0Cn0KCnR5cGUgUm95YWx0eVBheW91dCBzdHJ1Y3QgewoJQWNjb3VudCBhZGRyZXNzCglBbW91bnQgIGludDY0Cn0KCi8vIHBhcnNlQlBTIHJlYWRzIGEgcG9zaXRpdmUgZGVjaW1hbCB3aXRoIG5vIHNpZ24sIHNwYWNlIG9yIGxlYWRpbmcgemVyby4KZnVuYyBwYXJzZUJQUyhzIHN0cmluZykgaW50NjQgewoJaWYgcyA9PSAiIiB8fCBsZW4ocykgPiA0IHx8IHNbMF0gPT0gJzAnIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogaW52YWxpZCByb3lhbHR5IHNoYXJlIikKCX0KCXZhciBuIGludDY0Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHMpOyBpKysgewoJCWlmIHNbaV0gPCAnMCcgfHwgc1tpXSA+ICc5JyB7CgkJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIHJveWFsdHkgc2hhcmUiKQoJCX0KCQluID0gbioxMCArIGludDY0KHNbaV0tJzAnKQoJfQoJcmV0dXJuIG4KfQoKLy8gcGFyc2VSb3lhbHRpZXMgcmVhZHMgImFkZHJlc3M6YnBzO2FkZHJlc3M6YnBzIi4gU3RyaWN0bHkgYXNjZW5kaW5nIGFkZHJlc3NlcwovLyBnaXZlIGV2ZXJ5IHNwbGl0IGV4YWN0bHkgb25lIGVuY29kaW5nIGFuZCBydWxlIG91dCBkdXBsaWNhdGVzLgpmdW5jIHBhcnNlUm95YWx0aWVzKGVuY29kZWQsIG1vZGUgc3RyaW5nKSAoW11yb3lhbHR5LCBpbnQ2NCkgewoJaWYgZW5jb2RlZCA9PSAiIiB7CgkJaWYgbW9kZSA9PSBNb2RlUm95YWx0eVByb3RlY3RlZCB7CgkJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBhIHJveWFsdHktcHJvdGVjdGVkIGNvbGxlY3Rpb24gbmVlZHMgcm95YWx0aWVzIikKCQl9CgkJcmV0dXJuIG5pbCwgMAoJfQoJaWYgbW9kZSA9PSBNb2RlU291bGJvdW5kIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogc291bGJvdW5kIHRva2VucyBhcmUgbmV2ZXIgc29sZCIpCgl9CglyZWNvcmRzIDo9IHN0cmluZ3MuU3BsaXQoZW5jb2RlZCwgIjsiKQoJaWYgbGVuKHJlY29yZHMpID4gbWF4Um95YWx0eVJlY2VpdmVycyB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IHRvbyBtYW55IHJveWFsdHkgcmVjZWl2ZXJzIikKCX0KCW91dCA6PSBtYWtlKFtdcm95YWx0eSwgMCwgbGVuKHJlY29yZHMpKQoJcHJldmlvdXMgOj0gIiIKCXZhciB0b3RhbCBpbnQ2NAoJZm9yIF8sIHJlY29yZCA6PSByYW5nZSByZWNvcmRzIHsKCQlmaWVsZHMgOj0gc3RyaW5ncy5TcGxpdChyZWNvcmQsICI6IikKCQlpZiBsZW4oZmllbGRzKSAhPSAyIHx8IGZpZWxkc1swXSA8PSBwcmV2aW91cyB7CgkJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIHJveWFsdHkgbGlzdCIpCgkJfQoJCXdobyA6PSBhZGRyZXNzKGZpZWxkc1swXSkKCQkvLyBVbnNwZW5kYWJsZSBjb3ZlcnMgZXZlcnkgdGV4dCBidXQgdGhlIGNoYWluJ3Mgc3BlbGxpbmcgb2YgYW4gYWNjb3VudC4KCQlpZiBjb25maWcuSXNVbnNwZW5kYWJsZSh3aG8pIHsKCQkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IGludmFsaWQgcm95YWx0eSByZWNlaXZlciIpCgkJfQoJCWJwcyA6PSBwYXJzZUJQUyhmaWVsZHNbMV0pCgkJaWYgdG90YWwgPSBzbS5BZGQodG90YWwsIGJwcyk7IHRvdGFsID4gbWF4Um95YWx0eUJQUyB7CgkJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiByb3lhbHRpZXMgZXhjZWVkIDEwJSIpCgkJfQoJCW91dCA9IGFwcGVuZChvdXQsIHJveWFsdHl7QWNjb3VudDogd2hvLCBCUFM6IGJwc30pCgkJcHJldmlvdXMgPSBmaWVsZHNbMF0KCX0KCXJldHVybiBvdXQsIHRvdGFsCn0KCi8vIHZhbGlkTmFtZSBpcyB0aGUgY2hhaW4ncyBydWxlIGZvciBvbmUgc2VnbWVudCBvZiBhIHBhY2thZ2UgcGF0aDogYSBsZXR0ZXIKLy8gZmlyc3QsIHRoZW4gbGV0dGVycyBhbmQgZGlnaXRzLCBqb2luZWQgYnkgc2luZ2xlICJfIiBvciAiLSIuCmZ1bmMgdmFsaWROYW1lKHMgc3RyaW5nKSBib29sIHsKCWlmIHMgPT0gIiIgfHwgc1swXSA8ICdhJyB8fCBzWzBdID4gJ3onIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWpvaW5lZCA6PSBmYWxzZSAvLyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGpvaW5zIHR3byBydW5zCglmb3IgaSA6PSAxOyBpIDwgbGVuKHMpOyBpKysgewoJCXN3aXRjaCBjIDo9IHNbaV07IHsKCQljYXNlIChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKToKCQkJam9pbmVkID0gZmFsc2UKCQljYXNlIChjID09ICdfJyB8fCBjID09ICctJykgJiYgIWpvaW5lZDoKCQkJam9pbmVkID0gdHJ1ZQoJCWRlZmF1bHQ6CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiAham9pbmVkCn0KCi8vIEEgbWFya2V0IG1heSBiZSBhbnkgcmVhbG0gdGhlIGNoYWluIGNhbiBob3N0LCBhIHRoaXJkIHBhcnR5J3MgaW5jbHVkZWQsIHNvCi8vIGl0cyBwYXRoIGZvbGxvd3MgdGhlIGNoYWluJ3Mgb3duIHJ1bGUgZm9yIGEgcmVhbG0gcGF0aDogImduby5sYW5kL3IvIiwgdGhlbgovLyBuYW1lcyBzZXBhcmF0ZWQgYnkgIi8iLCBub25lIGVuZGluZyBpbiAiX3Rlc3QiLCBpbiBhdCBtb3N0IDIwMCBieXRlcy4gQSBzbG90Ci8vIGlzIHBlcm1hbmVudDogbm9uZSBpcyBnaXZlbiB0byBhIHBhdGggbm8gcmVhbG0gY2FuIGhhdmUuIFRoZSBydWxlIGZvcgovLyBpc3N1ZXJzIGlzIGNvbmZpZydzIGFuZCBpcyBuYXJyb3dlciAocGxhaW4gc2VnbWVudHMgaW4gb3VyIG93biBuYW1lc3BhY2UpOgovLyBhbiBpc3N1ZXIgaXMgb25lIG9mIG91cnMsIGEgbWFya2V0IG5lZWQgbm90IGJlLgpmdW5jIHZhbGlkTWFya2V0UGF0aChwYXRoIHN0cmluZykgYm9vbCB7CglpZiBsZW4ocGF0aCkgPiAyMDAgfHwgIXN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJnbm8ubGFuZC9yLyIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KHBhdGgsICJfdGVzdCIpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBuYW1lIDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQocGF0aFtsZW4oImduby5sYW5kL3IvIik6XSwgIi8iKSB7CgkJaWYgIXZhbGlkTmFtZShuYW1lKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgUm95YWx0eUJQUyhpZCBzdHJpbmcpIGludDY0IHsgcmV0dXJuIG11c3RDb2xsZWN0aW9uKGlkKS5yb3lhbHR5QlBTIH0KCi8vIFJveWFsdHlRdW90ZSBmbG9vcnMgZWFjaCByZWNlaXZlcidzIHNoYXJlIG9mIHByaWNlLiBUaGUgc2VsbGVyIGtlZXBzIHRoZQovLyByb3VuZGluZyByZW1haW5kZXIuCmZ1bmMgUm95YWx0eVF1b3RlKGlkIHN0cmluZywgcHJpY2UgaW50NjQpIFtdUm95YWx0eVBheW91dCB7Cglyb3lhbHRpZXMgOj0gbXVzdENvbGxlY3Rpb24oaWQpLnJveWFsdGllcwoJb3V0IDo9IG1ha2UoW11Sb3lhbHR5UGF5b3V0LCBsZW4ocm95YWx0aWVzKSkKCWZvciBpLCByIDo9IHJhbmdlIHJveWFsdGllcyB7CgkJb3V0W2ldID0gUm95YWx0eVBheW91dHtBY2NvdW50OiByLkFjY291bnQsIEFtb3VudDogc20uQlBTKHByaWNlLCByLkJQUyl9Cgl9CglyZXR1cm4gb3V0Cn0KCi8vIEFsbG93TWFya2V0IGFkZHMgYSByZWFsbSB0aHJvdWdoIHdoaWNoIGEgcm95YWx0eS1wcm90ZWN0ZWQgY29sbGVjdGlvbidzCi8vIHRva2VucyBtYXkgYmUgc29sZC4gVGhlIGxpc3Qgc3RhcnRzIHdpdGggdGhlIExhdW5jaHBhZCBtYXJrZXQgYW5kIG9ubHkKLy8gZ3Jvd3M6IGEgaG9sZGVyJ3Mgd2F5IG91dCBjYW4gYmUgd2lkZW5lZCwgbmV2ZXIgdGFrZW4gYXdheS4gVGhlIGxlZGdlcgovLyBjYW5ub3QgbWFrZSBhIHJlYWxtIHBheTogdGhlIGNyZWF0b3Igdm91Y2hlcyB0aGF0IHRoZSBtYXJrZXQgaXQgbGlzdHMgcGF5cwovLyB0aGlzIGNvbGxlY3Rpb24ncyByb3lhbHRpZXMsIGFuZCBldmVyeSBob2xkZXIgY2FuIHJlYWQgdGhlIGxpc3QuCmZ1bmMgQWxsb3dNYXJrZXQoY3VyIHJlYWxtLCBpZCwgcGtnUGF0aCBzdHJpbmcpIHsKCWMgOj0gY3JlYXRvck9mKGN1ciwgaWQpCglpZiBjLmluZm8uTW9kZSAhPSBNb2RlUm95YWx0eVByb3RlY3RlZCB8fCAhdmFsaWRNYXJrZXRQYXRoKHBrZ1BhdGgpIHx8CgkJbGVuKGMubWFya2V0cykgPj0gbWF4TWFya2V0cyB8fAoJCW9wZXJhdG9yKGMsIGNoYWluLlBhY2thZ2VBZGRyZXNzKHBrZ1BhdGgpKSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IG1hcmtldCBjYW5ub3QgYmUgYWRkZWQiKQoJfQoJbWFya2V0IDo9IGNoYWluLlBhY2thZ2VBZGRyZXNzKHBrZ1BhdGgpCgljLm1hcmtldHMgPSBhcHBlbmQoYy5tYXJrZXRzLCBtYXJrZXQpCgljaGFpbi5FbWl0KCJNYXJrZXRBbGxvd2VkIiwgImNvbGxlY3Rpb24iLCBpZCwgIm1hcmtldCIsIHBrZ1BhdGgsCgkJImFkZHJlc3MiLCBtYXJrZXQuU3RyaW5nKCkpCn0KGsdBCgl2aWV3cy5nbm8SuUFwYWNrYWdlIG5mdAoKaW1wb3J0ICgKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvc2VxaWQvdjAiCgkiZ25vLmxhbmQvcC9zYW1jcmV3L2xhdW5jaHBhZC9tZXRhL3YxIgopCgovLyBMaXN0cyBhcmUgcGFnZWQ6IGEgemVyby1iYXNlZCBwYWdlIG9mIDEgdG8gbWF4UGFnZSBlbnRyaWVzLgpjb25zdCBtYXhQYWdlID0gNTAKCi8vIGludDY0IHZhbHVlcyBhcmUgZGVjaW1hbCBzdHJpbmdzIHNvIGEgSlNPTiBjbGllbnQgY2Fubm90IHJvdW5kIHRoZW0uCmZ1bmMgbnVtKG4gaW50NjQpIHN0cmluZyB7IHJldHVybiBtZXRhLkpTT05TdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQobiwgMTApKSB9CgovLyBsaXN0SlNPTiByZW5kZXJzIG9uZSBwYWdlIG9mIGEgdHJlZSBpbiBrZXkgb3JkZXIuIFRoZSB0cmVlIHNlZWtzIHRoZSBmaXJzdAovLyBlbnRyeSBieSBzdWJ0cmVlIHNpemVzLCBzbyBhIGRlZXAgcGFnZSBjb3N0cyB3aGF0IHRoZSBmaXJzdCBvbmUgZG9lcy4KZnVuYyBsaXN0SlNPTih0cmVlICphdmwuVHJlZSwgcGFnZSwgc2l6ZSBpbnQ2NCwgcmVuZGVyIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBzdHJpbmcpIHN0cmluZyB7CglpZiBwYWdlIDwgMCB8fCBzaXplIDwgMSB8fCBzaXplID4gbWF4UGFnZSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IGludmFsaWQgcGFnZSIpCgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVCeXRlKCdbJykKCS8vIEEgcGFnZSBwYXN0IHRoZSBlbmQgY2Fubm90IG92ZXJmbG93OiBub3RoaW5nIGlzIG11bHRpcGxpZWQgYmVmb3JlIHRoaXMuCglpZiB0cmVlICE9IG5pbCAmJiBwYWdlIDw9IGludDY0KHRyZWUuU2l6ZSgpKS9zaXplIHsKCQl0cmVlLkl0ZXJhdGVCeU9mZnNldChpbnQocGFnZSpzaXplKSwgaW50KHNpemUpLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJCWlmIGIuTGVuKCkgPiAxIHsKCQkJCWIuV3JpdGVCeXRlKCcsJykKCQkJfQoJCQliLldyaXRlU3RyaW5nKHJlbmRlcihrZXksIHZhbHVlKSkKCQkJcmV0dXJuIGZhbHNlCgkJfSkKCX0KCWIuV3JpdGVCeXRlKCddJykKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgQ29sbGVjdGlvbkpTT04oaWQgc3RyaW5nKSBzdHJpbmcgewoJYyA6PSBtdXN0Q29sbGVjdGlvbihpZCkKCWkgOj0gYy5pbmZvCglyZXR1cm4gInsiICsKCQlgImlkIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuSUQpICsKCQlgLCJncmM3MjFJZCI6YCArIG1ldGEuSlNPTlN0cmluZyhpLkdSQzcyMUlEKSArCgkJYCwiaXNzdWVyIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuSXNzdWVyLlN0cmluZygpKSArCgkJYCwiY3JlYXRvciI6YCArIG1ldGEuSlNPTlN0cmluZyhpLkNyZWF0b3IuU3RyaW5nKCkpICsKCQlgLCJvcmlnaW5hdG9yIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuT3JpZ2luYXRvci5TdHJpbmcoKSkgKwoJCWAsInBlbmRpbmdDcmVhdG9yIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuUGVuZGluZ0NyZWF0b3IuU3RyaW5nKCkpICsKCQlgLCJuYW1lIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuTmFtZSkgKwoJCWAsInN5bWJvbCI6YCArIG1ldGEuSlNPTlN0cmluZyhpLlN5bWJvbCkgKwoJCWAsImRlc2NyaXB0aW9uIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuRGVzY3JpcHRpb24pICsKCQlgLCJpbWFnZSI6YCArIG1ldGEuSlNPTlN0cmluZyhpLkltYWdlKSArCgkJYCwiYmFubmVyIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuQmFubmVyKSArCgkJYCwid2Vic2l0ZSI6YCArIG1ldGEuSlNPTlN0cmluZyhpLldlYnNpdGUpICsKCQlgLCJtb2RlIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuTW9kZSkgKwoJCWAsInJldm9jYWJsZSI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChpLlJldm9jYWJsZSkgKwoJCWAsIm1heFN1cHBseSI6YCArIG51bShpLk1heFN1cHBseSkgKwoJCWAsInNlYWxlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChpLlNlYWxlZCkgKwoJCWAsIm1pbnRlZCI6YCArIG51bShpLk1pbnRlZCkgKwoJCWAsInRvdGFsU3VwcGx5IjpgICsgbnVtKGMudG9rZW4uVG90YWxTdXBwbHkoKSkgKwoJCWAsInByb2ZpbGVGcm96ZW4iOmAgKyBzdHJjb252LkZvcm1hdEJvb2woaS5Qcm9maWxlRnJvemVuKSArCgkJYCwibWV0YWRhdGFNb2RlIjpgICsgbWV0YS5KU09OU3RyaW5nKGMubWV0YWRhdGEubW9kZSkgKwoJCWAsIm1ldGFkYXRhRnJvemVuIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGMubWV0YWRhdGEuZnJvemVuKSArCgkJYCwibWV0YWRhdGFSZXZpc2lvbiI6YCArIG51bShjLm1ldGFkYXRhLnJldmlzaW9uKSArCgkJYCwiYmFzZVVSSSI6YCArIG1ldGEuSlNPTlN0cmluZyhjLm1ldGFkYXRhLmJhc2VVUkkpICsKCQlgLCJwbGFjZWhvbGRlclVSSSI6YCArIG1ldGEuSlNPTlN0cmluZyhjLm1ldGFkYXRhLnBsYWNlaG9sZGVyVVJJKSArCgkJYCwiYmFzZVVSSUNvbW1pdG1lbnQiOmAgKyBtZXRhLkpTT05TdHJpbmcoYy5tZXRhZGF0YS5jb21taXRtZW50KSArCgkJYCwiY29tbWl0dGVyIjpgICsgbWV0YS5KU09OU3RyaW5nKGMubWV0YWRhdGEuY29tbWl0dGVyLlN0cmluZygpKSArCgkJYCwicHJvdmVuYW5jZUhhc2giOmAgKyBtZXRhLkpTT05TdHJpbmcoYy5tZXRhZGF0YS5wcm92ZW5hbmNlKSArCgkJYCwidHJhaXRzUm9vdCI6YCArIG1ldGEuSlNPTlN0cmluZyhjLnRyYWl0c1Jvb3QpICsKCQlgLCJyb3lhbHR5QlBTIjpgICsgbnVtKGMucm95YWx0eUJQUykgKwoJCWAsInJveWFsdGllcyI6YCArIHJveWFsdGllc0pTT04oYy5yb3lhbHRpZXMpICsKCQlgLCJtYXJrZXRzIjpgICsgYWRkcmVzc2VzSlNPTihjLm1hcmtldHMpICsgIn0iCn0KCmZ1bmMgcm95YWx0aWVzSlNPTihyb3lhbHRpZXMgW11yb3lhbHR5KSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlQnl0ZSgnWycpCglmb3IgaSwgciA6PSByYW5nZSByb3lhbHRpZXMgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZUJ5dGUoJywnKQoJCX0KCQliLldyaXRlU3RyaW5nKGB7ImFjY291bnQiOmAgKyBtZXRhLkpTT05TdHJpbmcoci5BY2NvdW50LlN0cmluZygpKSArCgkJCWAsImJwcyI6YCArIG51bShyLkJQUykgKyAifSIpCgl9CgliLldyaXRlQnl0ZSgnXScpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIGFkZHJlc3Nlc0pTT04obGlzdCBbXWFkZHJlc3MpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVCeXRlKCdbJykKCWZvciBpLCBhIDo9IHJhbmdlIGxpc3QgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZUJ5dGUoJywnKQoJCX0KCQliLldyaXRlU3RyaW5nKG1ldGEuSlNPTlN0cmluZyhhLlN0cmluZygpKSkKCX0KCWIuV3JpdGVCeXRlKCddJykKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIENhcGFiaWxpdGllc0pTT04gdGVsbHMgYSB3YWxsZXQgb3IgYSBtYXJrZXQgd2hhdCBhIGhvbGRlciBvZiB0aGlzCi8vIGNvbGxlY3Rpb24gY2FuIGRvLCB3aXRob3V0IGl0IGtub3dpbmcgdGhlIG1vZGVzLiAibWFya2V0cyIgaXMgZW1wdHkgd2hlbgovLyBhbnkgb3BlcmF0b3IgbWF5IGJlIGFwcHJvdmVkLiBSb3lhbHRpZXMgYXJlIHBhaWQgYnkgbWFya2V0cyBhdCBzYWxlLgovLyAicm95YWx0eUVuZm9yY2VtZW50IiBpcyAibm9uZSIgd2l0aG91dCByb3lhbHRpZXM7ICJtYXJrZXRfc2FsZXMiIGZvciBhbiBvcGVuCi8vIGNvbGxlY3Rpb24sIHdoZXJlIHRoZSBsZWRnZXIgZW5mb3JjZXMgbm90aGluZzogYSBtYXJrZXQgdGhhdCBob25vdXJzCi8vIHJveWFsdGllcyBwYXlzIHRoZW0gYXQgYSBzYWxlLCBhbmQgYSBkaXJlY3QgdHJhbnNmZXIgb3IgYW55IG90aGVyIHJlYWxtCi8vIHBheXMgbm9uZTsgImxpc3RlZF9tYXJrZXRzIiB3aGVuIHRoZSBsZWRnZXIgbGV0cyBhIHRva2VuIG1vdmUgb25seSB0aHJvdWdoCi8vIHRoZSByZWFsbXMgaW4gIm1hcmtldHMiLiBXaGV0aGVyIGEgbGlzdGVkIHJlYWxtIHBheXMgaXMgdGhlIHdvcmQgb2YgdGhlCi8vIGNyZWF0b3Igd2hvIGxpc3RlZCBpdC4gImNyZWF0b3JSZXZva2UiIGlzIHRoZSBjcmVhdG9yJ3MgcmlnaHQgdG8gcmV2b2tlCi8vIGEgdG9rZW4gb2YgYSByZXZvY2FibGUgc291bGJvdW5kIGNvbGxlY3Rpb24uCmZ1bmMgQ2FwYWJpbGl0aWVzSlNPTihpZCBzdHJpbmcpIHN0cmluZyB7CgljIDo9IG11c3RDb2xsZWN0aW9uKGlkKQoJaSA6PSBjLmluZm8KCWVuZm9yY2VtZW50IDo9ICJub25lIgoJaWYgYy5yb3lhbHR5QlBTID4gMCB7CgkJZW5mb3JjZW1lbnQgPSAibWFya2V0X3NhbGVzIgoJCWlmIGkuTW9kZSA9PSBNb2RlUm95YWx0eVByb3RlY3RlZCB7CgkJCWVuZm9yY2VtZW50ID0gImxpc3RlZF9tYXJrZXRzIgoJCX0KCX0KCXJldHVybiAieyIgKwoJCWAic2NoZW1hIjoibGF1bmNocGFkLW5mdC1jYXBhYmlsaXRpZXMvdjEiYCArCgkJYCwiY29sbGVjdGlvbiI6YCArIG1ldGEuSlNPTlN0cmluZyhpZCkgKwoJCWAsInN0YW5kYXJkIjoiZ3JjNzIxImAgKwoJCWAsIm1vZGUiOmAgKyBtZXRhLkpTT05TdHJpbmcoaS5Nb2RlKSArCgkJYCwiaG9sZGVyVHJhbnNmZXIiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woaS5Nb2RlID09IE1vZGVPcGVuKSArCgkJYCwibWFya2V0U2FsZSI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChpLk1vZGUgIT0gTW9kZVNvdWxib3VuZCkgKwoJCWAsIm1hcmtldHMiOmAgKyBhZGRyZXNzZXNKU09OKGMubWFya2V0cykgKwoJCWAsImhvbGRlckJ1cm4iOnRydWVgICsKCQlgLCJjcmVhdG9yUmV2b2tlIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGkuUmV2b2NhYmxlKSArCgkJYCwibWF4U3VwcGx5IjpgICsgbnVtKGkuTWF4U3VwcGx5KSArCgkJYCwibWV0YWRhdGFNb2RlIjpgICsgbWV0YS5KU09OU3RyaW5nKGMubWV0YWRhdGEubW9kZSkgKwoJCWAsIm1ldGFkYXRhRnJvemVuIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGMubWV0YWRhdGEuZnJvemVuKSArCgkJYCwidHJhaXRzQ29tbWl0dGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGMudHJhaXRzUm9vdCAhPSAiIikgKwoJCWAsInJveWFsdHlCUFMiOmAgKyBudW0oYy5yb3lhbHR5QlBTKSArCgkJYCwicm95YWx0eUVuZm9yY2VtZW50IjpgICsgbWV0YS5KU09OU3RyaW5nKGVuZm9yY2VtZW50KSArICJ9Igp9CgovLyBMaXN0Q29sbGVjdGlvbnNKU09OIHBhZ2VzIHRocm91Z2ggYSBzdW1tYXJ5IG9mIGV2ZXJ5IGNvbGxlY3Rpb24sIGluCi8vIGNyZWF0aW9uIG9yZGVyLiBDb2xsZWN0aW9uSlNPTiBoYXMgdGhlIGZ1bGwgcmVjb3JkLgpmdW5jIExpc3RDb2xsZWN0aW9uc0pTT04ocGFnZSwgc2l6ZSBpbnQ2NCkgc3RyaW5nIHsKCXJldHVybiBsaXN0SlNPTigmY29sbGVjdGlvbnMsIHBhZ2UsIHNpemUsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgc3RyaW5nIHsKCQlpIDo9IHZhbHVlLigqY29sbGVjdGlvbikuaW5mbwoJCXJldHVybiAieyIgKwoJCQlgImlkIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuSUQpICsKCQkJYCwiY3JlYXRvciI6YCArIG1ldGEuSlNPTlN0cmluZyhpLkNyZWF0b3IuU3RyaW5nKCkpICsKCQkJYCwibmFtZSI6YCArIG1ldGEuSlNPTlN0cmluZyhpLk5hbWUpICsKCQkJYCwic3ltYm9sIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuU3ltYm9sKSArCgkJCWAsImltYWdlIjpgICsgbWV0YS5KU09OU3RyaW5nKGkuSW1hZ2UpICsKCQkJYCwibW9kZSI6YCArIG1ldGEuSlNPTlN0cmluZyhpLk1vZGUpICsKCQkJYCwibWF4U3VwcGx5IjpgICsgbnVtKGkuTWF4U3VwcGx5KSArCgkJCWAsInNlYWxlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChpLlNlYWxlZCkgKwoJCQlgLCJtaW50ZWQiOmAgKyBudW0oaS5NaW50ZWQpICsgIn0iCgl9KQp9CgpmdW5jIHRva2VuSlNPTihjICpjb2xsZWN0aW9uLCBudW1iZXIgaW50NjQpIHN0cmluZyB7CglzdGF0dXMgOj0gc3RhdHVzT2YoYywgbnVtYmVyKQoJdmFyIG93bmVyIGFkZHJlc3MKCWlmIHN0YXR1cyA9PSBTdGF0dXNBY3RpdmUgewoJCW93bmVyID0gb3duZXJPZihjLCBudW1iZXIpCgl9CglyZXR1cm4gInsiICsKCQlgImNvbGxlY3Rpb24iOmAgKyBtZXRhLkpTT05TdHJpbmcoYy5pbmZvLklEKSArCgkJYCwibnVtYmVyIjpgICsgbnVtKG51bWJlcikgKwoJCWAsIm93bmVyIjpgICsgbWV0YS5KU09OU3RyaW5nKG93bmVyLlN0cmluZygpKSArCgkJYCwic3RhdHVzIjpgICsgbWV0YS5KU09OU3RyaW5nKHN0YXR1cykgKwoJCWAsInVyaSI6YCArIG1ldGEuSlNPTlN0cmluZyhjLm1ldGFkYXRhLnRva2VuVVJJKG51bWJlcikpICsgIn0iCn0KCi8vIFRva2VuSlNPTiBkZXNjcmliZXMgb25lIG1pbnRlZCBudW1iZXIuIEEgcmV0aXJlZCB0b2tlbiBoYXMgbm8gb3duZXIuCmZ1bmMgVG9rZW5KU09OKGlkIHN0cmluZywgbnVtYmVyIGludDY0KSBzdHJpbmcgeyByZXR1cm4gdG9rZW5KU09OKG11c3RDb2xsZWN0aW9uKGlkKSwgbnVtYmVyKSB9CgovLyBBcHByb3ZhbEpTT04gYW5zd2VycywgaW4gb25lIHJlYWQsIHdoZXRoZXIgb3BlcmF0b3IgbWF5IG1vdmUgYW4gYWN0aXZlCi8vIHRva2VuOiBieSBhIHNpbmdsZS10b2tlbiBhcHByb3ZhbCBvciBieSB0aGUgb3duZXIncyBjb2xsZWN0aW9uLXdpZGUgb25lLgpmdW5jIEFwcHJvdmFsSlNPTihpZCBzdHJpbmcsIG51bWJlciBpbnQ2NCwgb3BlcmF0b3Igc3RyaW5nKSBzdHJpbmcgewoJYyA6PSBtdXN0Q29sbGVjdGlvbihpZCkKCW93bmVyIDo9IG93bmVyT2YoYywgbnVtYmVyKQoJd2hvIDo9IGFkZHJlc3Mob3BlcmF0b3IpCglpZiAhbWV0YS5WYWxpZEFkZHJlc3Mod2hvKSB7CgkJcGFuaWMoImxhdW5jaHBhZC9uZnQ6IGludmFsaWQgb3BlcmF0b3IiKQoJfQoJcmV0dXJuICJ7IiArCgkJYCJjb2xsZWN0aW9uIjpgICsgbWV0YS5KU09OU3RyaW5nKGlkKSArCgkJYCwibnVtYmVyIjpgICsgbnVtKG51bWJlcikgKwoJCWAsIm93bmVyIjpgICsgbWV0YS5KU09OU3RyaW5nKG93bmVyLlN0cmluZygpKSArCgkJYCwib3BlcmF0b3IiOmAgKyBtZXRhLkpTT05TdHJpbmcob3BlcmF0b3IpICsKCQlgLCJ0b2tlbkFwcHJvdmVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKEdldEFwcHJvdmVkKGlkLCBudW1iZXIpID09IHdobykgKwoJCWAsImNvbGxlY3Rpb25BcHByb3ZlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChjLnRva2VuLklzQXBwcm92ZWRGb3JBbGwob3duZXIsIHdobykpICsgIn0iCn0KCi8vIFRva2Vuc0pTT04gcGFnZXMgdGhyb3VnaCBhIGNvbGxlY3Rpb24ncyBtaW50ZWQgbnVtYmVycyBpbiBvcmRlciwgcmV0aXJlZAovLyBvbmVzIGluY2x1ZGVkLgpmdW5jIFRva2Vuc0pTT04oaWQgc3RyaW5nLCBwYWdlLCBzaXplIGludDY0KSBzdHJpbmcgewoJaWYgcGFnZSA8IDAgfHwgc2l6ZSA8IDEgfHwgc2l6ZSA+IG1heFBhZ2UgewoJCXBhbmljKCJsYXVuY2hwYWQvbmZ0OiBpbnZhbGlkIHBhZ2UiKQoJfQoJYyA6PSBtdXN0Q29sbGVjdGlvbihpZCkKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZUJ5dGUoJ1snKQoJaWYgcGFnZSA8PSBjLmluZm8uTWludGVkL3NpemUgewoJCWZvciBudW1iZXIgOj0gcGFnZSpzaXplICsgMTsgbnVtYmVyIDw9IGMuaW5mby5NaW50ZWQgJiYgc2l6ZSA+IDA7IG51bWJlciwgc2l6ZSA9IG51bWJlcisxLCBzaXplLTEgewoJCQlpZiBiLkxlbigpID4gMSB7CgkJCQliLldyaXRlQnl0ZSgnLCcpCgkJCX0KCQkJYi5Xcml0ZVN0cmluZyh0b2tlbkpTT04oYywgbnVtYmVyKSkKCQl9Cgl9CgliLldyaXRlQnl0ZSgnXScpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBIb2xkaW5nc0pTT04gcGFnZXMgdGhyb3VnaCB0aGUgdG9rZW5zIGFuIGFjY291bnQgaG9sZHMsIGFjcm9zcyBldmVyeQovLyBjb2xsZWN0aW9uLCBpbiBjb2xsZWN0aW9uIHRoZW4gbnVtYmVyIG9yZGVyLgpmdW5jIEhvbGRpbmdzSlNPTihvd25lciBzdHJpbmcsIHBhZ2UsIHNpemUgaW50NjQpIHN0cmluZyB7CglpZiAhbWV0YS5WYWxpZEFkZHJlc3MoYWRkcmVzcyhvd25lcikpIHsKCQlwYW5pYygibGF1bmNocGFkL25mdDogaW52YWxpZCBvd25lciIpCgl9CgltaW5lLCBfIDo9IGhvbGRpbmdzLkdldChvd25lcikuKCphdmwuVHJlZSkKCXJldHVybiBsaXN0SlNPTihtaW5lLCBwYWdlLCBzaXplLCBmdW5jKGtleSBzdHJpbmcsIF8gYW55KSBzdHJpbmcgewoJCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQoa2V5LCAiLyIpCgkJYyA6PSBjb2xsZWN0aW9ucy5HZXQocGFydHNbMF0pLigqY29sbGVjdGlvbikKCQludW1iZXIsIF8gOj0gc2VxaWQuRnJvbVN0cmluZyhwYXJ0c1sxXSkKCQlyZXR1cm4gInsiICsKCQkJYCJjb2xsZWN0aW9uIjpgICsgbWV0YS5KU09OU3RyaW5nKGMuaW5mby5JRCkgKwoJCQlgLCJudW1iZXIiOmAgKyBudW0oaW50NjQobnVtYmVyKSkgKwoJCQlgLCJ1cmkiOmAgKyBtZXRhLkpTT05TdHJpbmcoYy5tZXRhZGF0YS50b2tlblVSSShpbnQ2NChudW1iZXIpKSkgKyAifSIKCX0pCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0xNTAwMDAwMHVnbm90EhMIgL/fgAESCzEzNTAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQImwcTB98sGFXpxw9Tv62bYKwkIpytD4GVCWsLzGaf10a0B5BEUWhi1gVUljMkFn1Wf+hwgGEZ0SfRuODarhb0kSQJBWmOjuuXyT1tRQQlIoIUqp2X+WQY46O/vSVo7D/2/VIzXQw4uIhjZDxdWqoAFIhM0WFU8XP0EFNlBn/8OjZOkaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data