Transaction executed successfully

Transaction Details

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

Transaction hash
0ED92EDD2DAADB4F91577BD067E92411AA9E99ECF32A17DAB7EB73EED656CA6C

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
71,639,049
Requested gas limit
GAS USED
55,106,931
Gas consumed
FEE
71640ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems17000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CoTEAgoML3ZtLm1fYWRkcGtnEvLDAgooZzE3Y2p5bTVlOWhod3M0Nmx0NjMyOXB2Mmd0eDJheTA1MDNoZ2VtcxK1wwIKBnN0YWJsZRI/Z25vLmxhbmQvci9nMTdjanltNWU5aGh3czQ2bHQ2MzI5cHYyZ3R4MmF5MDUwM2hnZW1zL2dlbXMvc3RhYmxlGmYKC2dub21vZC50b21sEldtb2R1bGUgPSAiZ25vLmxhbmQvci9nMTdjanltNWU5aGh3czQ2bHQ2MzI5cHYyZ3R4MmF5MDUwM2hnZW1zL2dlbXMvc3RhYmxlIgpnbm8gPSAiMC45Igoa3MECCgpzdGFibGUuZ25vEszBAi8vIFBhY2thZ2Ugc3RhYmxldjQgaXMgdGhlIHBlcm1hbmVudCBoYWxmIG9mIHRoZSBnZW1zNnYyIHNwbGl0LXJlYWxtCi8vIGRlc2lnbiAoc3RhYmxldjMgcGx1cyB0d28gZml4ZXMgZnJvbSB0aGUgMjAyNi0wOS0xNSBQZWFybCB0ZXN0IHJ1bjoKLy8gYSBidXJuZWQgdG9rZW4ncyBvd24gcGFnZSwgYW5kIG5vIHBlci10b2tlbiBjb3B5IG9mIHRoZSBzZWFsZWQgaW1hZ2UpIC0tIGEgY2FuZGlkYXRlIHN1Y2Nlc3NvciB0byB0aGUgcmVhbCBnZW1zNi9zdGFibGUsIGJ1aWx0IHRvCi8vIHByb3ZlIHR3byB0aGluZ3MgdG9nZXRoZXIgYmVmb3JlIGVpdGhlciBnb2VzIGFueXdoZXJlIG5lYXIgbWFpbm5ldDoKLy8gYSBkZWxheWVkLXJldmVhbCBtaW50IChmaXhpbmcgdGhlIE91dE9mR2FzRXJyb3IgcHJvYmxlbSB0aGUgcmVhbAovLyBnZW1zNi92MSdzIGluc3RhbnQtcmV2ZWFsIE1pbnRBc3NlbWJsZWQgaGFzIGFnYWluc3QgQWRlbmEncyBvd24gZ2FzCi8vIGVzdGltYXRpb24gLS0gY29uZmlybWVkIG9uIGEgdGhyb3dhd2F5IHNpbmdsZS1yZWFsbSBzcGlrZSwKLy8gZ25vLmxhbmQvci9nMWduNnQwcTl3ZW53aGRkYTQ3cmtycGZkNjNrY3hqdnlwN2Vxd2t1L3JldmVhbHBvYywKLy8gYmVmb3JlIHRoaXMgcmVhbCBzcGxpdC1yZWFsbSB2ZXJzaW9uIHdhcyBhdHRlbXB0ZWQpLCBhbmQgdGhlCi8vIGFwcHJvdmVkIGdlbXNhcnRmYWIgYXJ0IHBhY2thZ2UgKGNyeXN0YWwtbG9vayByZXBhaW50ICsgYSByZWFsIFJvc2UKLy8gQ3V0IGNhc2NhZGUgZml4ICsgYSBmYWNldC1tZXJnZSBzZWFtIGZpeCBvbiBSb3VuZCBCcmlsbGlhbnQvT3ZhbCkuCi8vCi8vIERlcGxveWVkIHVuZGVyIGEgdGVzdCBhZGRyZXNzIChub3QgdGhlIHZlc3Rpbmcgd2FsbGV0KSBzbyB0aGlzIHdob2xlCi8vIHByb3RvdHlwZSAtLSBzdGFibGUsIGNhbXBhaWduLCB2MiwgYW5kIGdlbXNhcnRmYWIgaXRzZWxmIC0tIGlzCi8vIHNlbGYtY29udGFpbmVkIGFuZCBkb2Vzbid0IG5lZWQgdGhlIHJlYWwgY29sbGVjdGlvbidzIG93biBrZXlzIHRvCi8vIHZhbGlkYXRlLiBGb2xkaW5nIGEgY29uZmlybWVkLWdvb2QgZGVzaWduIGludG8gdGhlIHJlYWwgbWFpbm5ldAovLyBkZXBsb3kgaXMgYSBzZXBhcmF0ZSBzdGVwIG9uY2UgdGhpcyBwcm92ZXMgb3V0LgovLwovLyBSZXZlYWwgbWVjaGFuaXNtOiBNaW50QXNzZW1ibGVkIHJlY29yZHMgYSB0cmFpdCBzZWxlY3Rpb24gYW5kIGEKLy8gU0VBTEVEIHBsYWNlaG9sZGVyIGltYWdlIGltbWVkaWF0ZWx5IChjaGVhcCwgc2VlIFJlY29yZE1pbnQncyBvd24KLy8gZG9jIGNvbW1lbnQgZm9yIHdoeSB0aGlzIGlzIHRoZSB3aG9sZSBwb2ludCkuIFRva2VuVVJJL1Rva2VuTWV0YWRhdGEKLy8gY29tcHV0ZSB0aGUgcmVhbCBpbWFnZSB2aWEgZ2Vtc2FydGZhYiAtLSBidXQgT05MWSBvbmNlCi8vIFJldmVhbERlbGF5QmxvY2tzIGhhcyBwYXNzZWQgLS0gdGhyb3VnaCBjdXJyZW50TWV0YWRhdGEsIHdoaWNoIGlzCi8vIHRoZSBvbmUgYWRkaXRpb24gdG8gdGhlIHJlYWwgc3RhYmxlJ3Mgb3duIHJlYWQgcGF0aC4gVGhpcyBET0VTIG1lYW4KLy8gdGhpcyByZWFsbSwgdW5saWtlIHRoZSByZWFsIGdlbXM2L3N0YWJsZSwgaW1wb3J0cyBhbiBhcnQgcGFja2FnZQovLyBkaXJlY3RseTogdW5hdm9pZGFibGUgZ2l2ZW4gZ25vJ3Mgc3RhdGljIGltcG9ydHMgKHRoZSByZWFsbSBzZXJ2aW5nCi8vIFRva2VuVVJJIGhhcyB0byBrbm93IGhvdyB0byByZW5kZXIsIGFuZCByZW5kZXJpbmcgY2FuJ3QgYmUgZGVmZXJyZWQKLy8gdG8gIndoaWNoZXZlciByZWFsbSBpcyBjdXJyZW50bHkgYXBwcm92ZWQiIHRoZSB3YXkgbWludGluZyBjYW4sCi8vIHNpbmNlIGEgZnV0dXJlIHZlcnNpb24ncyBvd24gYXJ0IHBhY2thZ2UgaXNuJ3QgaW1wb3J0YWJsZSBiZWZvcmUgaXQKLy8gZXhpc3RzKS4gTWF0Y2hlcyB0aGUgdHJhZGVvZmYgdGhlIG9sZGVyIGcyMCBjb2xsZWN0aW9uIGFscmVhZHkKLy8gYWNjZXB0ZWQgZm9yIHRoZSBleGFjdCBzYW1lIHJlYXNvbiAtLSBub3QgYSBuZXcgcHJvYmxlbSBpbnRyb2R1Y2VkCi8vIGhlcmUuCi8vCi8vIEV2ZXJ5dGhpbmcgZWxzZSAob3duZXJzaGlwLCB3aGl0ZWxpc3QsIHJveWFsdHksIGNsYWltIGxvZywgY2FtcGFpZ24KLy8gd2lyaW5nKSBpcyB1bmNoYW5nZWQgZnJvbSB0aGUgcmVhbCBnZW1zNi9zdGFibGUgLS0gc2VlIHRoYXQKLy8gcGFja2FnZSdzIG93biBkb2MgY29tbWVudHMgZm9yIHRoZSBmdWxsIGRlc2lnbiBoaXN0b3J5LgovLwovLyBMZWRnZXI6IHRoZSBzdGFuZGFyZCBnbm8ubGFuZC9wL250L2dyYzcyMS92MCAoMjAyNi0wOS0yNiksIG5vdCBhCi8vIHZlbmRvcmVkIGdyYzcyMS4gQWRlbmEgbGlzdHMgb25seSBjb2xsZWN0aW9ucyB3aG9zZSBOZXdUb2tlbi9UcmFuc2ZlcgovLyBldmVudHMgY29tZSBmcm9tIHRoYXQgZXhhY3QgcGFja2FnZSAoc2VlIH4vZ25vLWxhbmQtZGV2LW5vdGVzLm1kKSwgYW5kCi8vIGNoYWluLkVtaXQgc3RhbXBzIHRoZSBlbWl0dGluZyBwYWNrYWdlLCBzbyB0aGlzIGNhbm5vdCBiZSByZXRyb2ZpdHRlZAovLyBsYXRlci4gVGhlIHBhY2thZ2Ugc3RvcmVzIG93bmVyc2hpcCBvbmx5OyBldmVyeSB0b2tlbidzIG1ldGFkYXRhIGlzCi8vIGNvbXB1dGVkIGhlcmUgZnJvbSBpdHMgdHJhaXRzIChzZWFsZWREYXRhKSwgbmV2ZXIgc3RvcmVkIHBlciB0b2tlbi4KLy8gVG9rZW5VUkkgcmV0dXJucyB0aGUgaW1hZ2UgaXRzZWxmIChBZGVuYSBwdXRzIGl0IHN0cmFpZ2h0IGludG8gYW4KLy8gPGltZz4pOyBUb2tlbk1ldGFkYXRhIHJldHVybnMgdGhlIG1ldGFkYXRhIGFzIGEgSlNPTiBzdHJpbmcsIGFuZAovLyBUb2tlbkpTT04gdGhlIGNsYXNzaWMgYmFzZTY0IEpTT04gZGF0YSBVUkkgZm9yIG1hcmtldHBsYWNlcyB0aGF0IHdhbnQgaXQuCnBhY2thZ2Ugc3RhYmxlCgppbXBvcnQgKAoJcnVudGltZSAiY2hhaW4vcnVudGltZSIKCXVuc2FmZXJlYWxtICJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJlbmNvZGluZy9iYXNlNjQiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L2dyYzcyMS92MCIKCSJnbm8ubGFuZC9wL250L3NlcWlkL3YwIgoJY2FtcGFpZ24gImduby5sYW5kL3IvZzE3Y2p5bTVlOWhod3M0Nmx0NjMyOXB2Mmd0eDJheTA1MDNoZ2Vtcy9nZW1zL2NhbXBhaWduIgoJZ2Vtc2FydCAiZ25vLmxhbmQvcC9nMTdjanltNWU5aGh3czQ2bHQ2MzI5cHYyZ3R4MmF5MDUwM2hnZW1zL2dlbXNhcnQzZDIiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCAoCglDb2xsZWN0aW9uTmFtZSAgID0gIkdOTyBHZW1zIgoJQ29sbGVjdGlvblN5bWJvbCA9ICJHRU1TIgoKCS8vIHJlYWxtUmVsUGF0aDogdGhpcyByZWFsbSdzIG93biBnbm93ZWItcmVsYXRpdmUgcGF0aCwgYmFrZWQgaW4gYXMKCS8vIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IC0tIHNlZSB0aGUgcmVhbCBnZW1zNi9zdGFibGUncyBvd24KCS8vIGNvbW1lbnQgb24gd2h5ICh1bnNhZmVyZWFsbS5DdXJyZW50UmVhbG0oKSByZXNvbHZlcyBkaWZmZXJlbnRseQoJLy8gbmVzdGVkIGluc2lkZSBSZW5kZXIgdGhhbiBjYWxsZWQgZGlyZWN0bHkpLiBCdW1wZWQgZm9yIHRoaXMKCS8vIGRlcGxveW1lbnQsIHBlciB0aGUgZ2Vtc2FydGZhYiBoYW5kb2ZmJ3Mgb3duIHJlbWluZGVyIHRoYXQgdGhpcwoJLy8gZ2V0cyBtaXNzZWQuCglyZWFsbVJlbFBhdGggPSAiL3IvZzE3Y2p5bTVlOWhod3M0Nmx0NjMyOXB2Mmd0eDJheTA1MDNoZ2Vtcy9nZW1zL3N0YWJsZSIKCgkvLyA2LCBub3QgMTA6IGV2ZXJ5IHJlYWQgaGFzIGEgMywwMDAsMDAwLDAwMCBnYXMgY2VpbGluZyAodm0KCS8vIG1heEdhc1F1ZXJ5KSBhbmQgYSAzRCB0b2tlbiByZW5kZXJzIGZvciB1cCB0byB+MjY1TSAoQ3VzaGlvbik7IDgKCS8vIHJlbmRlcnMgcGx1cyBwYWdlIG92ZXJoZWFkIHJhbiBvdXQgb2YgZ2FzIG9uIGEgbG9jYWwgY2hhaW4sIDYgbGVhdmUKCS8vIGFib3V0IGhhbGYgdGhlIGJ1ZGdldCBzcGFyZQoJLy8gc3VtbWFyeVBhZ2VTaXplOiB0b2tlbnMgcGVyIENvbGxlY3Rpb25TdW1tYXJ5IC8gV2FsbGV0U3VtbWFyeSBjYWxsCgkvLyAodGhlIG1pbnQgc2l0ZSdzIGdyaWRzKS4gVGh1bWJuYWlsIHJlbmRlcnMsIGxpa2UgdGhlIGdub3dlYiB0YWJsZTsKCS8vIFRva2VuU3VtbWFyeSBvZiBvbmUgdG9rZW4ga2VlcHMgdGhlIGZ1bGwgYXJ0LgoJc3VtbWFyeVBhZ2VTaXplID0gMTAKCS8vIGdub3dlYkxpc3RMaW1pdDogcm93cyBwZXIgcGFnZSBvZiB0aGUgZ25vd2ViIGNvbGxlY3Rpb24gdGFibGUuIFJvd3MKCS8vIHVzZSB0aGUgYXJ0J3MgdGh1bWJuYWlsIHJlbmRlciAofjE0NS0xNjVNIGdhcywgdnMgfjI0NS0yNjVNIGZ1bGwpLAoJLy8gc28gMTAgZml0IHdlbGwgdW5kZXIgdGhlIDNCIHF1ZXJ5IGNlaWxpbmc7IHRoZSB0b2tlbiBwYWdlIGFuZCB0aGUKCS8vIHN1bW1hcmllcyB0aGUgbWludCBzaXRlIHJlYWRzIGtlZXAgdGhlIGZ1bGwgYXJ0LgoJZ25vd2ViTGlzdExpbWl0ID0gMTAKCXBhZ2VXaW5kb3cgICAgICAgICA9IDIKCXRva2VuUGFnZUltYWdlU2l6ZSA9ICI0MjAiCgoJLy8gUmV2ZWFsRGVsYXlCbG9ja3M6IGtlcHQgc2hvcnQgc28gdGhpcyBjYW5kaWRhdGUgZGVzaWduIGNhbiBiZQoJLy8gdGVzdGVkIGVuZC10by1lbmQgaW4gb25lIHNpdHRpbmcgLS0gYSByZWFsIHByb2R1Y3Rpb24gdmFsdWUKCS8vIHdvdWxkIGJlIHR1bmVkIHNlcGFyYXRlbHkgYmVmb3JlIG1haW5uZXQuCglSZXZlYWxEZWxheUJsb2NrcyA9IDUKKQoKdmFyICgKCXRva2VuICAqZ3JjNzIxLlRva2VuCglsZWRnZXIgKmdyYzcyMS5Qcml2YXRlTGVkZ2VyIC8vIHByaXZhdGU6IG9ubHkgdGhpcyByZWFsbSBtaW50cywgYnVybnMgYW5kIG1vdmVzIHRva2VucwoKCWNvbGxlY3Rpb25Pd25lciBhZGRyZXNzID0gImcxN2NqeW01ZTloaHdzNDZsdDYzMjlwdjJndHgyYXkwNTAzaGdlbXMiCgoJYXBwcm92ZWRWZXJzaW9uIHN0cmluZwoKCW1pbnRQcmljZVVnbm90IGludDY0ID0gMTAwMDAwMDAwIC8vIDEwMCBHTk9ULCBwZXIgcmVxdWVzdAoKCXdoaXRlbGlzdEJwcyBhdmwuVHJlZQoKCXJveWFsdHlCcHMgICAgICAgaW50NjQgICA9IDUwMAoJcm95YWx0eVJlY2lwaWVudCBhZGRyZXNzID0gImcxN2NqeW01ZTloaHdzNDZsdDYzMjlwdjJndHgyYXkwNTAzaGdlbXMiCgoJbWludGVkSURzIFtdZ3JjNzIxLlRva2VuSUQKCgltaW50ZWRUcmFpdENvbWJvcyBhdmwuVHJlZSAvLyBjb21ibyBrZXkgLT4gdHJ1ZQoJdG9rZW5Db21ib0tleXMgICAgYXZsLlRyZWUgLy8gdGlkLlN0cmluZygpIC0+IGNvbWJvS2V5IHN0cmluZwoJbWludENvdW50QnlXYWxsZXQgYXZsLlRyZWUgLy8gYWRkcmVzcy5TdHJpbmcoKSAtPiBpbnQ2NAoKCW1pbnRpbmdPcGVuTWlycm9yICAgICAgID0gdHJ1ZQoJbWF4TWludHNQZXJXYWxsZXRNaXJyb3IgaW50NjQgPSAwCgoJYnVybmVkUmVjb3JkcyBhdmwuVHJlZSAvLyB0aWQuU3RyaW5nKCkgLT4gYnVyblJlY29yZAoJYnVybmVkSURzICAgICBbXWdyYzcyMS5Ub2tlbklECgoJY2xhaW1SZWNvcmRzIFtdY2xhaW1SZWNvcmQKCgkvLyBzZWFsZWREYXRhL21pbnRIZWlnaHQ6IHRoZSByZXZlYWwgbWVjaGFuaXNtJ3Mgb3duIHN0YXRlLiB0aWQgLT4KCS8vIGl0cyBsb2NrZWQtaW4gdHJhaXQgc2VsZWN0aW9uIC8gdGhlIGJsb2NrIGl0IHdhcyBtaW50ZWQgYXQuCgkvLyBEZWxldGVkIGZyb20gYm90aCBvbiBCdXJuIChyZWxlYXNlcyB0aGVpciBzdG9yYWdlIGRlcG9zaXQsIHNhbWUKCS8vIGFzIHRva2VuQ29tYm9LZXlzIGFscmVhZHkgZG9lcykgYW5kIG5ldmVyIHRvdWNoZWQgYWdhaW4gb25jZSBhCgkvLyB0b2tlbiBpcyByZXZlYWxlZCAtLSBJc1JldmVhbGVkIGtlZXBzIHdvcmtpbmcgYWZ0ZXIgdGhhdCBwb2ludAoJLy8gcHVyZWx5IGZyb20gQWdlLCBubyBzZXBhcmF0ZSAiYWxyZWFkeSByZXZlYWxlZCIgZmxhZyBuZWVkZWQuCglzZWFsZWREYXRhIGF2bC5UcmVlIC8vIHRpZC5TdHJpbmcoKSAtPiB0cmFpdFByZXNldAoJbWludEhlaWdodCBhdmwuVHJlZSAvLyB0aWQuU3RyaW5nKCkgLT4gaW50NjQKCglzZWFsZWRJbWFnZSBzdHJpbmcKKQoKLy8gdHJhaXRQcmVzZXQgaXMgb25lIHRva2VuJ3MgbG9ja2VkLWluIHRyYWl0IHNlbGVjdGlvbiAtLSBldmVyeXRoaW5nCi8vIGdlbXNhcnRmYWIgbmVlZHMgdG8gcmVuZGVyIHRoZSByZWFsIGltYWdlIG9uY2UgcmV2ZWFsZWQuIE93bmVkIGhlcmUKLy8gKG5vdCBpbXBvcnRlZCBmcm9tIHdoaWNoZXZlciByZWFsbSBtaW50ZWQgaXQpIHNpbmNlIHN0YWJsZSBpcyB0aGUKLy8gb25lIHBsYWNlIHRoaXMgbmVlZHMgdG8gc3Vydml2ZSBhbnkgZnV0dXJlIG1pbnQtbWVjaGFuaWNzIHZlcnNpb24KLy8gc3dhcC4KdHlwZSB0cmFpdFByZXNldCBzdHJ1Y3QgewoJQ2hhaW4gICAgc3RyaW5nCglTaGFwZUlkeCBpbnQKCUNvbG9ySWR4IGludAoJTWV0YWwgICAgc3RyaW5nCglBY3RpdmUgICBib29sCglSYXJpdHkgICBzdHJpbmcgLy8gdGllciBmaXhlZCBhdCBtaW50IGJ5IHRoZSB2ZXJzaW9uIHJlYWxtICh2NS5yYXJpdHlUaWVyKQp9Cgp0eXBlIGNsYWltUmVjb3JkIHN0cnVjdCB7CglXYWxsZXQgICAgIGFkZHJlc3MKCUJwcyAgICAgICAgaW50NjQKCU1pbnRIZWlnaHQgaW50NjQKCVRpZCAgICAgICAgZ3JjNzIxLlRva2VuSUQKfQoKLy8gYnVyblJlY29yZCBrZWVwcyBhIGJ1cm5lZCB0b2tlbidzIGNvbXBhY3QgdHJhaXQgc2VsZWN0aW9uLCBub3QgaXRzCi8vIGV4cGFuZGVkIG5hbWUvZGVzY3JpcHRpb24vYXR0cmlidXRlIHN0cmluZ3M6IHRoZSB0ZXh0IGlzIHJlYnVpbHQgb24gcmVhZAovLyAodHJhaXRPbmx5TWV0YWRhdGEpLCBzbyBhIGJ1cm4gZnJlZXMgbW9yZSBzdG9yYWdlIGRlcG9zaXQuCnR5cGUgYnVyblJlY29yZCBzdHJ1Y3QgewoJQnVybmVkQnkgICBhZGRyZXNzCglCdXJuSGVpZ2h0IGludDY0CglUcmFpdHMgICAgIHRyYWl0UHJlc2V0Cn0KCmZ1bmMgKHIgYnVyblJlY29yZCkgbWV0YWRhdGEoKSBNZXRhZGF0YSB7CglpZiByLlRyYWl0cy5DaGFpbiA9PSAiIiB7CgkJcmV0dXJuIE1ldGFkYXRhe05hbWU6ICJVbnRpdGxlZCJ9Cgl9CglyZXR1cm4gdHJhaXRPbmx5TWV0YWRhdGEoci5UcmFpdHMpCn0KCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKCS8vIGVtaXRzIE5ld1Rva2VuOyB0aGUgdG9rZW4gaWQgYmVjb21lcyAiPHRoaXMgcmVhbG0+LjxzeW1ib2w+LjAwMDAwMDAiCgl0b2tlbiwgbGVkZ2VyID0gZ3JjNzIxLk5ld1Rva2VuKENvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uU3ltYm9sLCBzZXFpZC5JRCgwKSwgY3VyKQoJc3ZnIDo9IGA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE3MCIgaGVpZ2h0PSIxNzAiIHZpZXdCb3g9IjAgMCAxNzAgMTcwIj5gICsKCQlgPHJlY3Qgd2lkdGg9IjE3MCIgaGVpZ2h0PSIxNzAiIGZpbGw9IiMwYTBiMTAiLz5gICsKCQlgPGNpcmNsZSBjeD0iODUiIGN5PSI3OCIgcj0iMzQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU1NSIgc3Ryb2tlLXdpZHRoPSI0Ii8+YCArCgkJYDx0ZXh0IHg9Ijg1IiB5PSI4MyIgZm9udC1zaXplPSIxMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzk5OSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSI+U0VBTEVEPC90ZXh0PmAgKwoJCWA8L3N2Zz5gCglzZWFsZWRJbWFnZSA9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHN2ZykpCn0KCi8vIE1ldGFkYXRhL1RyYWl0OiB0aGUgc2hhcGUgZXZlcnkgcmVhZGVyIGhlcmUgYnVpbGRzIChncmM3MjEvdjAga2VlcHMgbm8KLy8gbWV0YWRhdGEgb2YgaXRzIG93bikuIE5ldmVyIHN0b3JlZCBwZXIgdG9rZW4gLS0gc2VlIGN1cnJlbnRNZXRhZGF0YS4KdHlwZSBUcmFpdCBzdHJ1Y3QgewoJVHJhaXRUeXBlIHN0cmluZwoJVmFsdWUgICAgIHN0cmluZwp9Cgp0eXBlIE1ldGFkYXRhIHN0cnVjdCB7CglOYW1lICAgICAgICAgICAgc3RyaW5nCglEZXNjcmlwdGlvbiAgICAgc3RyaW5nCglJbWFnZSAgICAgICAgICAgc3RyaW5nCglCYWNrZ3JvdW5kQ29sb3Igc3RyaW5nCglBdHRyaWJ1dGVzICAgICAgW11UcmFpdAp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RhbmRhcmQgcmVhZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpmdW5jIE5hbWUoKSBzdHJpbmcgICAgICB7IHJldHVybiBDb2xsZWN0aW9uTmFtZSB9CmZ1bmMgU3ltYm9sKCkgc3RyaW5nICAgIHsgcmV0dXJuIENvbGxlY3Rpb25TeW1ib2wgfQpmdW5jIFRva2VuQ291bnQoKSBpbnQ2NCB7IHJldHVybiB0b2tlbi5Ub3RhbFN1cHBseSgpIH0KZnVuYyBUb2tlbklEKCkgc3RyaW5nICAgeyByZXR1cm4gdG9rZW4uSUQoKSB9CgovLyBHZXROYW1lL0dldFN5bWJvbDogdGhlIFRlbGxlci1zdHlsZSBuYW1lcyBzb21lIHRvb2xzIGxvb2sgZm9yLgpmdW5jIEdldE5hbWUoKSBzdHJpbmcgICB7IHJldHVybiBDb2xsZWN0aW9uTmFtZSB9CmZ1bmMgR2V0U3ltYm9sKCkgc3RyaW5nIHsgcmV0dXJuIENvbGxlY3Rpb25TeW1ib2wgfQoKZnVuYyBPd25lck9mKHRpZCBncmM3MjEuVG9rZW5JRCkgKGFkZHJlc3MsIGVycm9yKSAgICAgeyByZXR1cm4gdG9rZW4uT3duZXJPZih0aWQpIH0KZnVuYyBCYWxhbmNlT2Yob3duZXIgYWRkcmVzcykgKGludDY0LCBlcnJvcikgICAgICAgICAgeyByZXR1cm4gdG9rZW4uQmFsYW5jZU9mKG93bmVyKSB9CmZ1bmMgR2V0QXBwcm92ZWQodGlkIGdyYzcyMS5Ub2tlbklEKSAoYWRkcmVzcywgZXJyb3IpIHsgcmV0dXJuIHRva2VuLkdldEFwcHJvdmVkKHRpZCkgfQpmdW5jIElzQXBwcm92ZWRGb3JBbGwob3duZXIsIG9wZXJhdG9yIGFkZHJlc3MpIGJvb2wgICB7IHJldHVybiB0b2tlbi5Jc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvcikgfQoKZnVuYyBBcHByb3ZlZFZlcnNpb24oKSBzdHJpbmcgeyByZXR1cm4gYXBwcm92ZWRWZXJzaW9uIH0KZnVuYyBPd25lcigpIGFkZHJlc3MgICAgICAgICAgeyByZXR1cm4gY29sbGVjdGlvbk93bmVyIH0KZnVuYyBNaW50UHJpY2UoKSBpbnQ2NCAgICAgICAgeyByZXR1cm4gbWludFByaWNlVWdub3QgfQoKZnVuYyBNaW50ZWRJRHMoKSBbXWdyYzcyMS5Ub2tlbklEIHsgcmV0dXJuIG1pbnRlZElEcyB9CmZ1bmMgVG90YWxCdXJuZWQoKSBpbnQ2NCAgICAgICAgICB7IHJldHVybiBpbnQ2NChsZW4oYnVybmVkSURzKSkgfQoKZnVuYyBNaW50aW5nT3BlbigpIGJvb2wgICAgICAgIHsgcmV0dXJuIG1pbnRpbmdPcGVuTWlycm9yIH0KZnVuYyBNYXhNaW50c1BlcldhbGxldCgpIGludDY0IHsgcmV0dXJuIG1heE1pbnRzUGVyV2FsbGV0TWlycm9yIH0KCmZ1bmMgTWludHNCeVdhbGxldChvd25lciBhZGRyZXNzKSBpbnQ2NCB7CgluLCBfIDo9IG1pbnRDb3VudEJ5V2FsbGV0LkdldChvd25lci5TdHJpbmcoKSkuKGludDY0KQoJcmV0dXJuIG4KfQoKZnVuYyBJc1RyYWl0Q29tYm9BdmFpbGFibGUoY29tYm9LZXkgc3RyaW5nKSBib29sIHsKCXJldHVybiAhbWludGVkVHJhaXRDb21ib3MuSGFzKGNvbWJvS2V5KQp9CgpmdW5jIFdoaXRlbGlzdEJwcyh3YWxsZXQgYWRkcmVzcykgKGJwcyBpbnQ2NCwgb2sgYm9vbCkgewoJaWYgIXdoaXRlbGlzdEJwcy5IYXMod2FsbGV0LlN0cmluZygpKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gd2hpdGVsaXN0QnBzLkdldCh3YWxsZXQuU3RyaW5nKCkpLihpbnQ2NCksIHRydWUKfQoKZnVuYyBXaGl0ZWxpc3RDb3VudCgpIGludDY0IHsgcmV0dXJuIGludDY0KHdoaXRlbGlzdEJwcy5TaXplKCkpIH0KCmZ1bmMgV2hpdGVsaXN0RW50cnkoaW5kZXggaW50KSAod2FsbGV0IHN0cmluZywgYnBzIGludDY0KSB7Cgl3LCB2IDo9IHdoaXRlbGlzdEJwcy5HZXRCeUluZGV4KGluZGV4KQoJcmV0dXJuIHcsIHYuKGludDY0KQp9CgpmdW5jIEVmZmVjdGl2ZVByaWNlKGNhbGxlciBhZGRyZXNzKSBpbnQ2NCB7CglpZiB2LCBvayA6PSB3aGl0ZWxpc3RCcHMuR2V0KGNhbGxlci5TdHJpbmcoKSkuKGludDY0KTsgb2sgewoJCXJldHVybiBtaW50UHJpY2VVZ25vdCAqIHYgLyAxMDAwMAoJfQoJaWYgYnBzLCBfLCBvayA6PSBjYW1wYWlnbi5QZWVrKGNhbGxlcik7IG9rIHsKCQlyZXR1cm4gbWludFByaWNlVWdub3QgKiBicHMgLyAxMDAwMAoJfQoJcmV0dXJuIG1pbnRQcmljZVVnbm90Cn0KCmZ1bmMgUm95YWx0eUluZm8odGlkIGdyYzcyMS5Ub2tlbklELCBzYWxlUHJpY2UgaW50NjQpIChhZGRyZXNzLCBpbnQ2NCwgZXJyb3IpIHsKCWlmIF8sIGVyciA6PSB0b2tlbi5Pd25lck9mKHRpZCk7IGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgMCwgZXJyCgl9CglyZXR1cm4gcm95YWx0eVJlY2lwaWVudCwgc2FsZVByaWNlICogcm95YWx0eUJwcyAvIDEwMDAwLCBuaWwKfQoKZnVuYyBSb3lhbHR5QnBzKCkgaW50NjQgICAgICAgICB7IHJldHVybiByb3lhbHR5QnBzIH0KZnVuYyBSb3lhbHR5UmVjaXBpZW50KCkgYWRkcmVzcyB7IHJldHVybiByb3lhbHR5UmVjaXBpZW50IH0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG93bmVyLWdhdGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpmdW5jIGNhbGxlckFkZHJlc3MoKSBhZGRyZXNzIHsKCXJldHVybiB1bnNhZmVyZWFsbS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCn0KCmZ1bmMgYXNzZXJ0T3duZXIoKSB7CglpZiBjYWxsZXJBZGRyZXNzKCkgIT0gY29sbGVjdGlvbk93bmVyIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBjYWxsZXIgaXMgbm90IHRoZSBjb2xsZWN0aW9uIG93bmVyIikKCX0KfQoKZnVuYyBTZXRBcHByb3ZlZFZlcnNpb24oY3VyIHJlYWxtLCBwa2dwYXRoIHN0cmluZykgewoJYXNzZXJ0T3duZXIoKQoJYXBwcm92ZWRWZXJzaW9uID0gcGtncGF0aAp9CgpmdW5jIFNldE1pbnRQcmljZShjdXIgcmVhbG0sIHVnbm90IGludDY0KSB7Cglhc3NlcnRPd25lcigpCglpZiB1Z25vdCA8IDAgewoJCXBhbmljKCJwcmljZSBjYW5ub3QgYmUgbmVnYXRpdmUiKQoJfQoJbWludFByaWNlVWdub3QgPSB1Z25vdAp9CgpmdW5jIEFkZFRvV2hpdGVsaXN0KGN1ciByZWFsbSwgd2FsbGV0IGFkZHJlc3MsIGJwcyBpbnQ2NCkgewoJYXNzZXJ0T3duZXIoKQoJaWYgYnBzIDwgMCB8fCBicHMgPiAxMDAwMCB7CgkJcGFuaWMoImJwcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwMDAiKQoJfQoJd2hpdGVsaXN0QnBzLlNldCh3YWxsZXQuU3RyaW5nKCksIGJwcykKfQoKZnVuYyBBZGRUb1doaXRlbGlzdEJhdGNoKGN1ciByZWFsbSwgd2FsbGV0c0NTViBzdHJpbmcsIGJwcyBpbnQ2NCkgewoJYXNzZXJ0T3duZXIoKQoJaWYgYnBzIDwgMCB8fCBicHMgPiAxMDAwMCB7CgkJcGFuaWMoImJwcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwMDAiKQoJfQoJZm9yIF8sIHcgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdCh3YWxsZXRzQ1NWLCAiLCIpIHsKCQl3ID0gc3RyaW5ncy5UcmltU3BhY2UodykKCQlpZiB3ID09ICIiIHsKCQkJY29udGludWUKCQl9CgkJd2hpdGVsaXN0QnBzLlNldCh3LCBicHMpCgl9Cn0KCmZ1bmMgUmVtb3ZlRnJvbVdoaXRlbGlzdChjdXIgcmVhbG0sIHdhbGxldCBhZGRyZXNzKSB7Cglhc3NlcnRPd25lcigpCgl3aGl0ZWxpc3RCcHMuUmVtb3ZlKHdhbGxldC5TdHJpbmcoKSkKfQoKZnVuYyBTZXRSb3lhbHR5QnBzKGN1ciByZWFsbSwgYnBzIGludDY0KSB7Cglhc3NlcnRPd25lcigpCglpZiBicHMgPCAwIHx8IGJwcyA+IDEwMDAwIHsKCQlwYW5pYygiYnBzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAwMCIpCgl9Cglyb3lhbHR5QnBzID0gYnBzCn0KCmZ1bmMgU2V0Um95YWx0eVJlY2lwaWVudChjdXIgcmVhbG0sIHJlY2lwaWVudCBhZGRyZXNzKSB7Cglhc3NlcnRPd25lcigpCglyb3lhbHR5UmVjaXBpZW50ID0gcmVjaXBpZW50Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdmVyc2lvbi1nYXRlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKZnVuYyBhc3NlcnRDYWxsZXJJc0FwcHJvdmVkVmVyc2lvbihjdXIgcmVhbG0pIHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5Qa2dQYXRoKCkKCWlmIGFwcHJvdmVkVmVyc2lvbiA9PSAiIiB7CgkJcGFuaWMoIm5vIHZlcnNpb24gcmVhbG0gaGFzIGJlZW4gYXBwcm92ZWQgeWV0IikKCX0KCWlmIGNhbGxlciAhPSBhcHByb3ZlZFZlcnNpb24gewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IGNhbGxlciBpcyBub3QgdGhlIGFwcHJvdmVkIHZlcnNpb24gcmVhbG0iKQoJfQp9CgovLyBSZWNvcmRNaW50OiB0aGUgRU5USVJFIHBvaW50IG9mIHRoaXMgdjIgY2FuZGlkYXRlLiBVbmxpa2UgdGhlIHJlYWwKLy8gZ2VtczYvc3RhYmxlJ3Mgb3duIFJlY29yZE1pbnQsIHRoaXMgZG9lcyBOT1QgdGFrZSBhIGZ1bGwsIHJlbmRlcmVkCi8vIGdyYzcyMS5NZXRhZGF0YSAtLSBpdCB0YWtlcyB0aGUgcmF3IHRyYWl0IGZpZWxkcyBpbnN0ZWFkLCBhbmQgd3JpdGVzCi8vIGEgc21hbGwgZml4ZWQtc2l6ZSBTRUFMRUQgcGxhY2Vob2xkZXIgdG8gbmZ0J3Mgb3duIHN0b3JhZ2UuIFRoZSByZWFsCi8vIGltYWdlIGlzIG5ldmVyIGNvbXB1dGVkIGhlcmUsIG9yIGFueXdoZXJlLCBkdXJpbmcgYSBtaW50IHRyYW5zYWN0aW9uCi8vIC0tIHNlZSBjdXJyZW50TWV0YWRhdGEgZm9yIHdoZXJlIGl0IGFjdHVhbGx5IGhhcHBlbnMgKGEgcGxhaW4gcmVhZCwKLy8gdW5ib3VuZCBieSBhbnkgdHgtbGV2ZWwgZ2FzLXdhbnRlZCkuIE9ubHkgdGhlIGFwcHJvdmVkIHZlcnNpb24gcmVhbG0KLy8gbWF5IGNhbGwgdGhpcy4gUmVzZXJ2ZXMgY29tYm9LZXkgYXRvbWljYWxseSB3aXRoIHRoZSBtaW50LCBzYW1lCi8vIGF1dGhvcml0YXRpdmUtY2hlY2sgcm9sZSB0aGUgcmVhbCBzdGFibGUncyBSZWNvcmRNaW50IHBsYXlzLgpmdW5jIFJlY29yZE1pbnQoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBwYXllciBhZGRyZXNzLCB0aWQgZ3JjNzIxLlRva2VuSUQsIGNoYWluTmFtZSBzdHJpbmcsIHNoYXBlSWR4LCBjb2xvcklkeCBpbnQsIG1ldGFsIHN0cmluZywgYWN0aXZlIGJvb2wsIGNvbWJvS2V5IHN0cmluZywgcmFyaXR5IHN0cmluZykgZ3JjNzIxLlRva2VuSUQgewoJYXNzZXJ0Q2FsbGVySXNBcHByb3ZlZFZlcnNpb24oY3VyKQoJaWYgbWludGVkVHJhaXRDb21ib3MuSGFzKGNvbWJvS2V5KSB7CgkJcGFuaWMoInRyYWl0IGNvbWJpbmF0aW9uIGFscmVhZHkgbWludGVkIikKCX0KCS8vIE93bmVyc2hpcCBvbmx5OiBubyBtZXRhZGF0YSBpcyBzdG9yZWQgcGVyIHRva2VuLCBub3QgZXZlbiBhCgkvLyAiU2VhbGVkIiByZWNvcmQgLS0gY3VycmVudE1ldGFkYXRhIGRlcml2ZXMgaXQgZnJvbSBzZWFsZWREYXRhLgoJY2hlY2tFcnIobGVkZ2VyLk1pbnQodG8sIHRpZCkpCgltaW50ZWRUcmFpdENvbWJvcy5TZXQoY29tYm9LZXksIHRydWUpCgl0b2tlbkNvbWJvS2V5cy5TZXQodGlkLlN0cmluZygpLCBjb21ib0tleSkKCW1pbnRDb3VudEJ5V2FsbGV0LlNldCh0by5TdHJpbmcoKSwgTWludHNCeVdhbGxldCh0bykrMSkKCW1pbnRlZElEcyA9IGFwcGVuZChtaW50ZWRJRHMsIHRpZCkKCgloZWlnaHQgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgltaW50SGVpZ2h0LlNldCh0aWQuU3RyaW5nKCksIGhlaWdodCkKCXNlYWxlZERhdGEuU2V0KHRpZC5TdHJpbmcoKSwgdHJhaXRQcmVzZXR7CgkJQ2hhaW46IGNoYWluTmFtZSwgU2hhcGVJZHg6IHNoYXBlSWR4LCBDb2xvcklkeDogY29sb3JJZHgsIE1ldGFsOiBtZXRhbCwgQWN0aXZlOiBhY3RpdmUsIFJhcml0eTogcmFyaXR5LAoJfSkKCglpZiBfLCBoYXNPdmVycmlkZSA6PSB3aGl0ZWxpc3RCcHMuR2V0KHBheWVyLlN0cmluZygpKS4oaW50NjQpOyAhaGFzT3ZlcnJpZGUgewoJCWlmIGJwcywgb2sgOj0gY2FtcGFpZ24uQ29uc3VtZURpc2NvdW50KGNyb3NzKGN1ciksIHBheWVyKTsgb2sgewoJCQljbGFpbVJlY29yZHMgPSBhcHBlbmQoY2xhaW1SZWNvcmRzLCBjbGFpbVJlY29yZHsKCQkJCVdhbGxldDogICAgIHBheWVyLAoJCQkJQnBzOiAgICAgICAgYnBzLAoJCQkJTWludEhlaWdodDogaGVpZ2h0LAoJCQkJVGlkOiAgICAgICAgdGlkLAoJCQl9KQoJCX0KCX0KCXJldHVybiB0aWQKfQoKZnVuYyBDbGFpbUNvdW50KCkgaW50NjQgeyByZXR1cm4gaW50NjQobGVuKGNsYWltUmVjb3JkcykpIH0KCmZ1bmMgQ2xhaW1BdChpbmRleCBpbnQpICh3YWxsZXQgYWRkcmVzcywgYnBzIGludDY0LCBtaW50SGVpZ2h0XyBpbnQ2NCwgdGlkIHN0cmluZykgewoJciA6PSBjbGFpbVJlY29yZHNbaW5kZXhdCglyZXR1cm4gci5XYWxsZXQsIHIuQnBzLCByLk1pbnRIZWlnaHQsIHIuVGlkLlN0cmluZygpCn0KCmZ1bmMgUmVwb3J0TWludGluZ09wZW4oY3VyIHJlYWxtLCBvcGVuIGJvb2wpIHsKCWFzc2VydENhbGxlcklzQXBwcm92ZWRWZXJzaW9uKGN1cikKCW1pbnRpbmdPcGVuTWlycm9yID0gb3Blbgp9CgpmdW5jIFJlcG9ydE1heE1pbnRzUGVyV2FsbGV0KGN1ciByZWFsbSwgbWF4IGludDY0KSB7Cglhc3NlcnRDYWxsZXJJc0FwcHJvdmVkVmVyc2lvbihjdXIpCgltYXhNaW50c1BlcldhbGxldE1pcnJvciA9IG1heAp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXZlYWwgbG9naWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLy8gQWdlIHJldHVybnMgcmVhbCBibG9ja3MgZWxhcHNlZCBzaW5jZSB0aWQgd2FzIG1pbnRlZCwgb3IgLTEgaWYgaXQKLy8gZG9lc24ndCBleGlzdCAvIHdhcyBuZXZlciBzZWFsZWQuCmZ1bmMgQWdlKHRpZCBncmM3MjEuVG9rZW5JRCkgaW50NjQgewoJaCA6PSBtaW50SGVpZ2h0LkdldCh0aWQuU3RyaW5nKCkpCglpZiBoID09IG5pbCB7CgkJcmV0dXJuIC0xCgl9CglyZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIC0gaC4oaW50NjQpCn0KCi8vIElzUmV2ZWFsZWQgcmVwb3J0cyB3aGV0aGVyIHRpZCdzIHJlYWwgbWV0YWRhdGEgaXMgdmlzaWJsZSB5ZXQuCmZ1bmMgSXNSZXZlYWxlZCh0aWQgZ3JjNzIxLlRva2VuSUQpIGJvb2wgewoJaWYgXywgaXNUcmFpdFByZXNldCA6PSBzZWFsZWREYXRhLkdldCh0aWQuU3RyaW5nKCkpLih0cmFpdFByZXNldCk7ICFpc1RyYWl0UHJlc2V0IHsKCQlyZXR1cm4gdHJ1ZQoJfQoJYWdlIDo9IEFnZSh0aWQpCglyZXR1cm4gYWdlID49IDAgJiYgYWdlID49IFJldmVhbERlbGF5QmxvY2tzCn0KCi8vIGN1cnJlbnRNZXRhZGF0YSBpcyB3aGF0IGV2ZXJ5IHJlYWRlci1mYWNpbmcgZnVuY3Rpb24gYmVsb3cgYWN0dWFsbHkKLy8gcmV0dXJuczogbmZ0J3Mgb3duIHN0b3JlZCAoc2VhbGVkKSBtZXRhZGF0YSBiZWZvcmUgcmV2ZWFsLCBvciB0aGUKLy8gcmVhbCBpbWFnZSBhc3NlbWJsZWQgZnJlc2ggZnJvbSBnZW1zYXJ0ZmFiIGFmdGVyIC0tIGNvbXB1dGVkIG9uIHRoaXMKLy8gcGxhaW4gcmVhZCwgbmV2ZXIgaW5zaWRlIGEgbWludCBvciBhbnkgb3RoZXIgZ2FzLW1ldGVyZWQgd3JpdGUuIFRoaXMKLy8gaXMgdGhlIG9uZSBhZGRpdGlvbiB0byB0aGUgcmVhbCBnZW1zNi9zdGFibGUncyBvd24gcmVhZCBwYXRoLgpmdW5jIGN1cnJlbnRNZXRhZGF0YSh0aWQgZ3JjNzIxLlRva2VuSUQpIChNZXRhZGF0YSwgZXJyb3IpIHsKCWlmIF8sIGVyciA6PSB0b2tlbi5Pd25lck9mKHRpZCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBNZXRhZGF0YXt9LCBlcnIKCX0KCXRwLCBvayA6PSBzZWFsZWREYXRhLkdldCh0aWQuU3RyaW5nKCkpLih0cmFpdFByZXNldCkKCWlmICFvayB7CgkJcmV0dXJuIE1ldGFkYXRhe30sIGdyYzcyMS5FcnJJbnZhbGlkVG9rZW5JZAoJfQoJaWYgIUlzUmV2ZWFsZWQodGlkKSB7CgkJcmV0dXJuIHNlYWxlZE1ldGFkYXRhKCksIG5pbAoJfQoJcmV0dXJuIGFzc2VtYmxlZE1ldGFkYXRhKHRpZCwgdHApLCBuaWwKfQoKLy8gc2VhbGVkTWV0YWRhdGE6IHdoYXQgZXZlcnkgdG9rZW4gc2hvd3MgdW50aWwgaXRzIHJldmVhbCBibG9jaywgdGhlIG9uZQovLyBzaGFyZWQgcGxhY2Vob2xkZXIgaW1hZ2UgKG5vdCBwZXItdG9rZW4gc3RvcmFnZSkuCmZ1bmMgc2VhbGVkTWV0YWRhdGEoKSBNZXRhZGF0YSB7CglyZXR1cm4gTWV0YWRhdGF7TmFtZTogIlNlYWxlZCIsIEltYWdlOiBzZWFsZWRJbWFnZSwgQmFja2dyb3VuZENvbG9yOiAiMGEwYjEwIiwgQXR0cmlidXRlczogW11UcmFpdHt7VHJhaXRUeXBlOiAiU3RhdHVzIiwgVmFsdWU6ICJTZWFsZWQifX19Cn0KCi8vIGxpc3RSb3cgaXMgb25lIGdub3dlYiB0YWJsZSByb3cncyBuYW1lIGFuZCBpbWFnZTogdGhlIG5hbWUgZnJvbSB0aGUKLy8gdHJhaXRzIChubyByZW5kZXIpLCB0aGUgaW1hZ2UgdGhlIGFydCdzIHRodW1ibmFpbCByZW5kZXIgb25jZSByZXZlYWxlZCwKLy8gdGhlIHNoYXJlZCBzZWFsZWQgcGxhY2Vob2xkZXIgYmVmb3JlLgpmdW5jIGxpc3RSb3codGlkIGdyYzcyMS5Ub2tlbklEKSAobmFtZSwgaW1hZ2Ugc3RyaW5nKSB7Cgl0cCwgb2sgOj0gc2VhbGVkRGF0YS5HZXQodGlkLlN0cmluZygpKS4odHJhaXRQcmVzZXQpCglpZiAhb2sgewoJCXJldHVybiAiVW50aXRsZWQiLCAiIgoJfQoJaWYgIUlzUmV2ZWFsZWQodGlkKSB7CgkJcmV0dXJuICJTZWFsZWQiLCBzZWFsZWRJbWFnZQoJfQoJbmFtZSA9IHRyYWl0T25seU1ldGFkYXRhKHRwKS5OYW1lCglzdmcgOj0gZ2Vtc2FydC5SZW5kZXJUb2tlblRodW1iU1ZHKHRwLkNoYWluLCB0cC5NZXRhbCwgdHAuU2hhcGVJZHgsIHRwLkNvbG9ySWR4LCB0cC5BY3RpdmUsIHRpZC5TdHJpbmcoKSkKCXJldHVybiBuYW1lLCAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiICsgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShzdmcpKQp9CgpmdW5jIGFzc2VtYmxlZE1ldGFkYXRhKHRpZCBncmM3MjEuVG9rZW5JRCwgdHAgdHJhaXRQcmVzZXQpIE1ldGFkYXRhIHsKCXN2Zywgc3RvbmUsIF8sIGNvbG9yTmFtZSA6PSBnZW1zYXJ0LlJlbmRlclRva2VuU1ZHKHRwLkNoYWluLCB0cC5NZXRhbCwgdHAuU2hhcGVJZHgsIHRwLkNvbG9ySWR4LCB0cC5BY3RpdmUsIHRpZC5TdHJpbmcoKSkKCXNoYXBlTmFtZSA6PSBnZW1zYXJ0LlNoYXBlTmFtZXNbdHAuU2hhcGVJZHhdCglpZiBzdG9uZSA9PSAiUGVhcmwiIHsKCQlzaGFwZU5hbWUgPSBnZW1zYXJ0LlBlYXJsU2hhcGVOYW1lc1t0cC5TaGFwZUlkeF0KCX0KCWltYWdlIDo9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHN2ZykpCglzdGF0dXMgOj0gIlN1bnNldCIKCWlmIHRwLkFjdGl2ZSB7CgkJc3RhdHVzID0gIkFjdGl2ZSIKCX0KCXJldHVybiBNZXRhZGF0YXsKCQlOYW1lOiAgICAgICAgICAgIGdlbURpc3BsYXlOYW1lKGNvbG9yTmFtZSwgc3RvbmUsIHNoYXBlTmFtZSwgdHAuTWV0YWwsIHRwLkNoYWluKSwKCQlEZXNjcmlwdGlvbjogICAgIHVmbXQuU3ByaW50ZigiJXMgJXMgJXMgc2V0IGluICVzICVzIHJpbmcsIG1pbnRlZCBvbiAlcy4iLCBhcnRpY2xlKGNvbG9yTmFtZSksIGNvbG9yTmFtZSwgc2hhcGVOYW1lLCBzdHJpbmdzLlRvTG93ZXIoYXJ0aWNsZSh0cC5NZXRhbCkpLCB0cC5NZXRhbCwgdHAuQ2hhaW4pLAoJCUltYWdlOiAgICAgICAgICAgaW1hZ2UsCgkJQmFja2dyb3VuZENvbG9yOiAiMGEwYjEwIiwKCQlBdHRyaWJ1dGVzOiBbXVRyYWl0ewoJCQl7VHJhaXRUeXBlOiAiQ2hhaW4iLCBWYWx1ZTogdHAuQ2hhaW59LAoJCQl7VHJhaXRUeXBlOiAiU3RvbmUiLCBWYWx1ZTogc3RvbmV9LAoJCQl7VHJhaXRUeXBlOiAiU2hhcGUiLCBWYWx1ZTogc2hhcGVOYW1lfSwKCQkJe1RyYWl0VHlwZTogIkNvbG9yIiwgVmFsdWU6IGNvbG9yTmFtZX0sCgkJCXtUcmFpdFR5cGU6ICJSaW5nIiwgVmFsdWU6IHRwLk1ldGFsfSwKCQkJe1RyYWl0VHlwZTogIlN0YXR1cyIsIFZhbHVlOiBzdGF0dXN9LAoJCQl7VHJhaXRUeXBlOiAiUmFyaXR5IiwgVmFsdWU6IHRwLlJhcml0eX0sCgkJfSwKCX0KfQoKLy8gYXJ0aWNsZSBpcyAiQW4iIGJlZm9yZSBhIHZvd2VsIHNvdW5kIChBbWV0aHlzdCwgSW1wZXJpYWwsIE9yYW5nZSksIGVsc2UgIkEiLgpmdW5jIGFydGljbGUod29yZCBzdHJpbmcpIHN0cmluZyB7CglpZiB3b3JkICE9ICIiICYmIHN0cmluZ3MuQ29udGFpbnNSdW5lKCJBRUlPVWFlaW91IiwgcnVuZSh3b3JkWzBdKSkgewoJCXJldHVybiAiQW4iCgl9CglyZXR1cm4gIkEiCn0KCmZ1bmMgZ2VtRGlzcGxheU5hbWUoY29sb3JOYW1lLCBzdG9uZSwgc2hhcGUsIG1ldGFsLCBjaGFpbiBzdHJpbmcpIHN0cmluZyB7CgkvLyAiQW1ldGh5c3QgT3ZhbCDCtyBHb2xkIFJpbmcgwrcgVEVTVC03IjogdGhlIHBpZWNlLCBpdHMgc2V0dGluZywgaXRzCgkvLyBjaGFpbiwgc3BsaXQgYnkgYSBtaWRkbGUgZG90ICh0aGUgb2xkICJYIC0tIFkgUmluZyAtIFogQ2hhaW4iIHdhcyBhCgkvLyBwYXJzaW5nIGRlbGltaXRlciB0aGF0IGxlYWtlZCBpbnRvIHRoZSBuYW1lKS4gUXVhcnR6IGNvbG91ciBuYW1lcyBhcmUKCS8vIHRoZSB2YXJpZXR5IG5hbWVzIGFuZCBhbHJlYWR5IHNheSB3aGF0IHRoZSBzdG9uZSBpcyAoQW1ldGh5c3QsCgkvLyBDaXRyaW5lLCBSb3NlIFF1YXJ0eiwgUm9jayBDcnlzdGFsLi4uKTogIkFtZXRoeXN0IE92YWwiLCBub3QKCS8vICJBbWV0aHlzdCBRdWFydHogT3ZhbCIuCglwaWVjZSA6PSBjb2xvck5hbWUgKyAiICIgKyBzdG9uZSArICIgIiArIHNoYXBlCglpZiBzdG9uZSA9PSAiUXVhcnR6IiB8fCBzdG9uZSA9PSAiIiB7CgkJcGllY2UgPSBjb2xvck5hbWUgKyAiICIgKyBzaGFwZQoJfQoJcmV0dXJuIHBpZWNlICsgIiDCtyAiICsgbWV0YWwgKyAiIFJpbmcgwrcgIiArIGNoYWluCn0KCi8vIGNvbG9yTmFtZUZvciBsb29rcyB1cCBhIHN0b25lJ3MgY29sb3JJZHgtdGggY29sb3IgbmFtZSBmcm9tCi8vIGdlbXNhcnQuQ29sb3JQYWxldHRlQ1NWICgiaGV4Om5hbWU7aGV4Om5hbWU7Li4uIikgLS0gYSBjaGVhcCBwYXJzZSwKLy8gbm90IGEgcmVuZGVyLiBLZXB0IGluIHN5bmMgd2l0aCBnZW1zYXJ0LlJlbmRlclRva2VuU1ZHJ3Mgb3duIGludGVybmFsCi8vIGNvbG9yRm9yU3RvbmUgYnkgY29uc3RydWN0aW9uIChzYW1lIHBhbGV0dGUgc291cmNlKSwgd2l0aG91dCBldmVyCi8vIGNhbGxpbmcgUmVuZGVyVG9rZW5TVkcgaXRzZWxmLgpmdW5jIGNvbG9yTmFtZUZvcihzdG9uZSBzdHJpbmcsIGNvbG9ySWR4IGludCkgc3RyaW5nIHsKCXBhaXJzIDo9IHN0cmluZ3MuU3BsaXQoZ2Vtc2FydC5Db2xvclBhbGV0dGVDU1Yoc3RvbmUpLCAiOyIpCglpZiBjb2xvcklkeCA8IDAgfHwgY29sb3JJZHggPj0gbGVuKHBhaXJzKSB7CgkJcmV0dXJuICIiCgl9CglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0TihwYWlyc1tjb2xvcklkeF0sICI6IiwgMikKCWlmIGxlbihwYXJ0cykgIT0gMiB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gcGFydHNbMV0KfQoKLy8gdHJhaXRPbmx5TWV0YWRhdGEgYnVpbGRzIHRoZSBhcmNoaXZlZCByZWNvcmQgc3RyYWlnaHQgZnJvbSB0cCdzIHJhdwovLyBmaWVsZHMgLS0gbm8gZ2Vtc2FydC5SZW5kZXJUb2tlblNWRyBjYWxsLCBzbyBubyBpbWFnZSwgZXZlci4gVGhpcyBpcwovLyB3aGF0IEJ1cm4gYXJjaGl2ZXM6IHRoZSBidXJuIHJlY29yZCB3YXMgbmV2ZXIgbWVhbnQgdG8ga2VlcCB0aGUKLy8gcGljdHVyZSAoc2VlIEJ1cm4ncyBvd24gY29tbWVudCksIHNvIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHBheSB0aGUKLy8gcmVuZGVyIGNvc3QgdG8gYnVpbGQgb25lIGp1c3QgdG8gaW1tZWRpYXRlbHkgZGlzY2FyZCBpdC4KZnVuYyB0cmFpdE9ubHlNZXRhZGF0YSh0cCB0cmFpdFByZXNldCkgTWV0YWRhdGEgewoJc3RvbmUgOj0gZ2Vtc2FydC5TdG9uZUZvckNoYWluKHRwLkNoYWluKQoJc2hhcGVOYW1lIDo9IGdlbXNhcnQuU2hhcGVOYW1lc1t0cC5TaGFwZUlkeF0KCWlmIHN0b25lID09ICJQZWFybCIgewoJCXNoYXBlTmFtZSA9IGdlbXNhcnQuUGVhcmxTaGFwZU5hbWVzW3RwLlNoYXBlSWR4XQoJfQoJY29sb3JOYW1lIDo9IGNvbG9yTmFtZUZvcihzdG9uZSwgdHAuQ29sb3JJZHgpCglzdGF0dXMgOj0gIlN1bnNldCIKCWlmIHRwLkFjdGl2ZSB7CgkJc3RhdHVzID0gIkFjdGl2ZSIKCX0KCXJldHVybiBNZXRhZGF0YXsKCQlOYW1lOiAgICAgICAgICAgIGdlbURpc3BsYXlOYW1lKGNvbG9yTmFtZSwgc3RvbmUsIHNoYXBlTmFtZSwgdHAuTWV0YWwsIHRwLkNoYWluKSwKCQlEZXNjcmlwdGlvbjogICAgIHVmbXQuU3ByaW50ZigiJXMgJXMgJXMgc2V0IGluICVzICVzIHJpbmcsIG1pbnRlZCBvbiAlcy4iLCBhcnRpY2xlKGNvbG9yTmFtZSksIGNvbG9yTmFtZSwgc2hhcGVOYW1lLCBzdHJpbmdzLlRvTG93ZXIoYXJ0aWNsZSh0cC5NZXRhbCkpLCB0cC5NZXRhbCwgdHAuQ2hhaW4pLAoJCUJhY2tncm91bmRDb2xvcjogIjBhMGIxMCIsCgkJQXR0cmlidXRlczogW11UcmFpdHsKCQkJe1RyYWl0VHlwZTogIkNoYWluIiwgVmFsdWU6IHRwLkNoYWlufSwKCQkJe1RyYWl0VHlwZTogIlN0b25lIiwgVmFsdWU6IHN0b25lfSwKCQkJe1RyYWl0VHlwZTogIlNoYXBlIiwgVmFsdWU6IHNoYXBlTmFtZX0sCgkJCXtUcmFpdFR5cGU6ICJDb2xvciIsIFZhbHVlOiBjb2xvck5hbWV9LAoJCQl7VHJhaXRUeXBlOiAiUmluZyIsIFZhbHVlOiB0cC5NZXRhbH0sCgkJCXtUcmFpdFR5cGU6ICJTdGF0dXMiLCBWYWx1ZTogc3RhdHVzfSwKCQkJe1RyYWl0VHlwZTogIlJhcml0eSIsIFZhbHVlOiB0cC5SYXJpdHl9LAoJCX0sCgl9Cn0KCi8vIFRva2VuVVJJIGlzIHRoZSB0b2tlbidzIGltYWdlIGl0c2VsZiwgYXMgYSBkYXRhIFVSSTogdGhlIHNlYWxlZAovLyBwbGFjZWhvbGRlciB1bnRpbCB0aGUgcmV2ZWFsIGJsb2NrLCB0aGVuIHRoZSBmdWxsIGFydC4gQWRlbmEgcHV0cyBpdAovLyBzdHJhaWdodCBpbnRvIGFuIDxpbWc+LCB3aGljaCBhbHNvIHJ1bnMgdGhlIGFydCdzIENTUyBhbmltYXRpb24uCmZ1bmMgVG9rZW5VUkkodGlkIGdyYzcyMS5Ub2tlbklEKSAoc3RyaW5nLCBlcnJvcikgewoJbWV0YWRhdGEsIGVyciA6PSBjdXJyZW50TWV0YWRhdGEodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCXJldHVybiBtZXRhZGF0YS5JbWFnZSwgbmlsCn0KCi8vIFRva2VuTWV0YWRhdGEgaXMgdGhlIG1ldGFkYXRhIGFzIGEgSlNPTiBzdHJpbmcgaW4gdGhlIGNhbWVsQ2FzZSBzaGFwZQovLyBBZGVuYSByZWFkcyAobmFtZSwgZGVzY3JpcHRpb24sIGJhY2tncm91bmRDb2xvciwgYXR0cmlidXRlcyBvZgovLyB7dHJhaXRUeXBlLCB2YWx1ZX0pLiBObyBpbWFnZSBpbiBpdCwgc28gaXQgY29zdHMgbm8gcmVuZGVyOiB0aGUgaW1hZ2UKLy8gaXMgVG9rZW5VUkkuCmZ1bmMgVG9rZW5NZXRhZGF0YSh0aWQgZ3JjNzIxLlRva2VuSUQpIChzdHJpbmcsIGVycm9yKSB7CglpZiBfLCBlcnIgOj0gdG9rZW4uT3duZXJPZih0aWQpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIGVycgoJfQoJbSA6PSBzZWFsZWRNZXRhZGF0YSgpCglpZiB0cCwgb2sgOj0gc2VhbGVkRGF0YS5HZXQodGlkLlN0cmluZygpKS4odHJhaXRQcmVzZXQpOyBvayAmJiBJc1JldmVhbGVkKHRpZCkgewoJCW0gPSB0cmFpdE9ubHlNZXRhZGF0YSh0cCkKCX0KCW0uSW1hZ2UgPSAiIgoJcmV0dXJuIG1ldGFkYXRhSlNPTihtLCAidHJhaXRUeXBlIiwgImJhY2tncm91bmRDb2xvciIpLCBuaWwKfQoKLy8gVG9rZW5KU09OIGlzIHRoZSBjbGFzc2ljIE9wZW5TZWEtc3R5bGUgbWV0YWRhdGEgKHNuYWtlX2Nhc2Uga2V5cywgdGhlCi8vIGltYWdlIGlubGluZSkgYXMgYSBiYXNlNjQgSlNPTiBkYXRhIFVSSSwgZm9yIG1hcmtldHBsYWNlcyB0aGF0IGV4cGVjdCBhCi8vIHRva2VuVVJJIG9mIHRoYXQgc2hhcGUuCmZ1bmMgVG9rZW5KU09OKHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsKCW1ldGFkYXRhLCBlcnIgOj0gY3VycmVudE1ldGFkYXRhKHRpZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgZXJyCgl9CglyZXR1cm4gImRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsIiArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobWV0YWRhdGFKU09OKG1ldGFkYXRhLCAidHJhaXRfdHlwZSIsICJiYWNrZ3JvdW5kX2NvbG9yIikpKSwgbmlsCn0KCmZ1bmMganNvbkVzY2FwZShzIHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlzd2l0Y2ggYyB7CgkJY2FzZSAnIic6CgkJCWIuV3JpdGVTdHJpbmcoYFwiYCkKCQljYXNlICdcXCc6CgkJCWIuV3JpdGVTdHJpbmcoYFxcYCkKCQlkZWZhdWx0OgoJCQliLldyaXRlQnl0ZShjKQoJCX0KCX0KCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgbWV0YWRhdGFKU09OKG0gTWV0YWRhdGEsIHRyYWl0S2V5LCBiZ0tleSBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYHsibmFtZSI6ImApCgliLldyaXRlU3RyaW5nKGpzb25Fc2NhcGUobS5OYW1lKSkKCWIuV3JpdGVTdHJpbmcoYCIsImRlc2NyaXB0aW9uIjoiYCkKCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZShtLkRlc2NyaXB0aW9uKSkKCWIuV3JpdGVTdHJpbmcoYCJgKQoJaWYgbS5JbWFnZSAhPSAiIiB7CgkJYi5Xcml0ZVN0cmluZyhgLCJpbWFnZSI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKG0uSW1hZ2UpKQoJCWIuV3JpdGVTdHJpbmcoYCJgKQoJfQoJaWYgbS5CYWNrZ3JvdW5kQ29sb3IgIT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoYCwiYCArIGJnS2V5ICsgYCI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKG0uQmFja2dyb3VuZENvbG9yKSkKCQliLldyaXRlU3RyaW5nKGAiYCkKCX0KCWIuV3JpdGVTdHJpbmcoYCwiYXR0cmlidXRlcyI6W2ApCglmb3IgaSwgdCA6PSByYW5nZSBtLkF0dHJpYnV0ZXMgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiLCIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoYHsiYCArIHRyYWl0S2V5ICsgYCI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKHQuVHJhaXRUeXBlKSkKCQliLldyaXRlU3RyaW5nKGAiLCJ2YWx1ZSI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKHQuVmFsdWUpKQoJCWIuV3JpdGVTdHJpbmcoYCJ9YCkKCX0KCWIuV3JpdGVTdHJpbmcoIl19IikKCXJldHVybiBiLlN0cmluZygpCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRva2VuLW93bmVyIGFjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpmdW5jIEFwcHJvdmUoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCB0aWQgZ3JjNzIxLlRva2VuSUQpIHsKCWNoZWNrRXJyKGxlZGdlci5BcHByb3ZlKGNhbGxlckFkZHJlc3MoKSwgdG8sIHRpZCkpCn0KCmZ1bmMgU2V0QXBwcm92YWxGb3JBbGwoY3VyIHJlYWxtLCBvcGVyYXRvciBhZGRyZXNzLCBhcHByb3ZlZCBib29sKSB7CgljaGVja0VycihsZWRnZXIuU2V0QXBwcm92YWxGb3JBbGwoY2FsbGVyQWRkcmVzcygpLCBvcGVyYXRvciwgYXBwcm92ZWQpKQp9CgpmdW5jIFRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2hlY2tFcnIobGVkZ2VyLlRyYW5zZmVyRnJvbShjYWxsZXJBZGRyZXNzKCksIGZyb20sIHRvLCB0aWQpKQp9CgovLyBTYWZlVHJhbnNmZXJGcm9tOiBrZXB0IGZvciB0aGUgc3RhbmRhcmQgc2lnbmF0dXJlLiBncmM3MjEvdjAgaGFzIG5vCi8vIHJlY2VpdmVyLWNvbnRyYWN0IGhvb2ssIHNvIGl0IGlzIFRyYW5zZmVyRnJvbS4KZnVuYyBTYWZlVHJhbnNmZXJGcm9tKGN1ciByZWFsbSwgZnJvbSwgdG8gYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSB7CgljaGVja0VycihsZWRnZXIuVHJhbnNmZXJGcm9tKGNhbGxlckFkZHJlc3MoKSwgZnJvbSwgdG8sIHRpZCkpCn0KCi8vIEJ1cm4gZGVzdHJveXMgYSB0b2tlbi4gQ2FsbGVyIG11c3QgYmUgaXRzIGN1cnJlbnQgb3duZXIuIEFyY2hpdmVzIHRoZQovLyByZWFsIHRyYWl0IGNvbWJpbmF0aW9uIGFzIHRleHQgLS0gYWx3YXlzIHRoZSByZWFsIHRyYWl0cywgZXZlbiBpZgovLyBidXJuZWQgYmVmb3JlIHRoZSByZXZlYWwgZGVsYXkgcGFzc2VkLCBzaW5jZSBzZWFsZWREYXRhIGFscmVhZHkgaGFzCi8vIHRoZW0gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIFRva2VuVVJJIGhhcyBzdGFydGVkIHNob3dpbmcgdGhlbQovLyBwdWJsaWNseSB5ZXQuIERlbGliZXJhdGVseSBuZXZlciByZW5kZXJzIG9yIHN0b3JlcyBhbiBpbWFnZTogdGhlCi8vIGFyY2hpdmUgd2FzIG9ubHkgZXZlciBhIHRleHQgcmVjb3JkIChzZWUgQnVybmVkVG9rZW5TdW1tYXJ5LwovLyByZW5kZXJNaW50ZWRMaXN0UGFnZSdzIG93biAiQnVybmVkIiByb3cpLCBzbyBjYWxsaW5nCi8vIGdlbXNhcnQuUmVuZGVyVG9rZW5TVkcgaGVyZSBqdXN0IHRvIGltbWVkaWF0ZWx5IGRpc2NhcmQgaXRzIG91dHB1dAovLyB3YXMgcHVyZSB3YXN0ZSAtLSBjb25maXJtZWQgbGl2ZSwgYSBidXJuIG9uIGFuIGFscmVhZHktcmV2ZWFsZWQgdG9rZW4KLy8gY29zdCB+MTY1TSBnYXMsIGFsbW9zdCBlbnRpcmVseSB0aGF0IG9uZSByZS1yZW5kZXIsIHJvdWdobHkgdGhlIHNhbWUKLy8gY29zdCB0aGUgd2hvbGUgcmV2ZWFsLWRlbGF5IGRlc2lnbiBleGlzdHMgdG8gYXZvaWQgcGF5aW5nIG9uIG1pbnQuCi8vIFJlbGVhc2VzIHRoZSB0cmFpdCBjb21ibyBBTkQgdGhlIHJldmVhbCBib29ra2VlcGluZyAoc2VhbGVkRGF0YS8KLy8gbWludEhlaWdodCkgLS0gbWF4aW1pemVzIHRoZSByZWFsIHN0b3JhZ2UtZGVwb3NpdCByZWZ1bmQsIHNhbWUKLy8gcmVhc29uaW5nIHRoZSByZWFsIGdlbXM2L3N0YWJsZSdzIG93biBCdXJuIGFscmVhZHkgZG9jdW1lbnRzLgpmdW5jIEJ1cm4oY3VyIHJlYWxtLCB0aWQgZ3JjNzIxLlRva2VuSUQpIHsKCWNhbGxlciA6PSBjYWxsZXJBZGRyZXNzKCkKCW93bmVyLCBlcnIgOj0gdG9rZW4uT3duZXJPZih0aWQpCgljaGVja0VycihlcnIpCglpZiBjYWxsZXIgIT0gb3duZXIgewoJCXBhbmljKGdyYzcyMS5FcnJDYWxsZXJJc05vdE93bmVyKQoJfQoKCWtleSA6PSB0aWQuU3RyaW5nKCkKCWFyY2hpdmVkLCBfIDo9IHNlYWxlZERhdGEuR2V0KGtleSkuKHRyYWl0UHJlc2V0KQoKCWlmIGNvbWJvS2V5LCBvayA6PSB0b2tlbkNvbWJvS2V5cy5HZXQoa2V5KS4oc3RyaW5nKTsgb2sgewoJCW1pbnRlZFRyYWl0Q29tYm9zLlJlbW92ZShjb21ib0tleSkKCQl0b2tlbkNvbWJvS2V5cy5SZW1vdmUoa2V5KQoJfQoJc2VhbGVkRGF0YS5SZW1vdmUoa2V5KQoJbWludEhlaWdodC5SZW1vdmUoa2V5KQoKCWNoZWNrRXJyKGxlZGdlci5CdXJuKHRpZCkpCgoJYnVybmVkUmVjb3Jkcy5TZXQoa2V5LCBidXJuUmVjb3JkewoJCUJ1cm5lZEJ5OiAgIGNhbGxlciwKCQlCdXJuSGVpZ2h0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgkJVHJhaXRzOiAgICAgYXJjaGl2ZWQsCgl9KQoJYnVybmVkSURzID0gYXBwZW5kKGJ1cm5lZElEcywgdGlkKQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ25vd2ViIGRpc3BsYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpmdW5jIHRyYWl0c1RvQ1NWKGF0dHJzIFtdVHJhaXQpIHN0cmluZyB7CglwYWlycyA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oYXR0cnMpKQoJZm9yIGksIGEgOj0gcmFuZ2UgYXR0cnMgewoJCXBhaXJzW2ldID0gYS5UcmFpdFR5cGUgKyAiPSIgKyBhLlZhbHVlCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhaXJzLCAiOyIpCn0KCmZ1bmMgVG9rZW5TdW1tYXJ5KHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsgcmV0dXJuIHRva2VuU3VtbWFyeSh0aWQsIGZhbHNlKSB9CgovLyB0aHVtYlN1bW1hcnkgaXMgVG9rZW5TdW1tYXJ5IHdpdGggdGhlIGFydCdzIHRodW1ibmFpbCByZW5kZXIgYW5kIHRoZQovLyBtZXRhZGF0YSBidWlsdCBmcm9tIHRoZSB0cmFpdHMsIHNvIGEgcGFnZSBvZiB0aGVtIHN0YXlzIHdlbGwgdW5kZXIgdGhlCi8vIHF1ZXJ5IGdhcyBjZWlsaW5nLgpmdW5jIHRodW1iU3VtbWFyeSh0aWQgZ3JjNzIxLlRva2VuSUQpIChzdHJpbmcsIGVycm9yKSB7IHJldHVybiB0b2tlblN1bW1hcnkodGlkLCB0cnVlKSB9CgpmdW5jIHRva2VuU3VtbWFyeSh0aWQgZ3JjNzIxLlRva2VuSUQsIHRodW1iIGJvb2wpIChzdHJpbmcsIGVycm9yKSB7Cglvd25lciwgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCXZhciBtZXRhZGF0YSBNZXRhZGF0YQoJaWYgdHAsIG9rIDo9IHNlYWxlZERhdGEuR2V0KHRpZC5TdHJpbmcoKSkuKHRyYWl0UHJlc2V0KTsgdGh1bWIgJiYgb2sgJiYgSXNSZXZlYWxlZCh0aWQpIHsKCQltZXRhZGF0YSA9IHRyYWl0T25seU1ldGFkYXRhKHRwKQoJCXN2ZyA6PSBnZW1zYXJ0LlJlbmRlclRva2VuVGh1bWJTVkcodHAuQ2hhaW4sIHRwLk1ldGFsLCB0cC5TaGFwZUlkeCwgdHAuQ29sb3JJZHgsIHRwLkFjdGl2ZSwgdGlkLlN0cmluZygpKQoJCW1ldGFkYXRhLkltYWdlID0gImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsIiArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUoc3ZnKSkKCX0gZWxzZSB7CgkJbWV0YWRhdGEsIGVyciA9IGN1cnJlbnRNZXRhZGF0YSh0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiAiIiwgZXJyCgkJfQoJfQoJZW5jIDo9IGJhc2U2NC5TdGRFbmNvZGluZwoJZmllbGRzIDo9IFtdc3RyaW5newoJCXRpZC5TdHJpbmcoKSwKCQlvd25lci5TdHJpbmcoKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKG1ldGFkYXRhLk5hbWUpKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKG1ldGFkYXRhLkRlc2NyaXB0aW9uKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShtZXRhZGF0YS5JbWFnZSkpLAoJCSIiLCAvLyBleHRlcm5hbCBVUkw6IG5vbmUKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHRyYWl0c1RvQ1NWKG1ldGFkYXRhLkF0dHJpYnV0ZXMpKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShtZXRhZGF0YS5CYWNrZ3JvdW5kQ29sb3IpKSwKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4oZmllbGRzLCAifCIpLCBuaWwKfQoKZnVuYyBDb2xsZWN0aW9uU3VtbWFyeShwYWdlIGludCkgc3RyaW5nIHsKCXRvdGFsIDo9IGxlbihtaW50ZWRJRHMpCglpZiBwYWdlIDwgMSB7CgkJcGFnZSA9IDEKCX0KCXN0YXJ0SyA6PSAocGFnZSAtIDEpICogc3VtbWFyeVBhZ2VTaXplCgllbmRLIDo9IHN0YXJ0SyArIHN1bW1hcnlQYWdlU2l6ZQoJaWYgZW5kSyA+IHRvdGFsIHsKCQllbmRLID0gdG90YWwKCX0KCXZhciBsaW5lcyBbXXN0cmluZwoJZm9yIGsgOj0gc3RhcnRLOyBrIDwgZW5kSzsgaysrIHsKCQl0aWQgOj0gbWludGVkSURzW3RvdGFsLTEta10KCQlsaW5lLCBlcnIgOj0gdGh1bWJTdW1tYXJ5KHRpZCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJY29udGludWUKCQl9CgkJbGluZXMgPSBhcHBlbmQobGluZXMsIGxpbmUpCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKGxpbmVzLCAiXG4iKQp9CgovLyB3YWxsZXRTY2FuQ2h1bmsgYm91bmRzIGhvdyBtYW55IGlkcyBvbmUgV2FsbGV0U3VtbWFyeSBjYWxsIHNjYW5zOwovLyB3YWxsZXRSZW5kZXJDYXAgYm91bmRzIGhvdyBtYW55IG9mIHRoZSBjYWxsZXIncyBPV04gdG9rZW5zIGl0IHJlbmRlcnMuCi8vIFRoZSBzZWNvbmQgYm91bmQgaXMgdGhlIG9uZSB0aGF0IG1hdHRlcnM6IGV2ZXJ5IG1hdGNoZWQgdG9rZW4gaXMgYQovLyBmdWxsIFNWRyByZW5kZXIgKFRva2VuU3VtbWFyeSAtPiBjdXJyZW50TWV0YWRhdGEgLT4gZ2Vtc2FydCksIGFuZCBvbmUKLy8gdm0vcWV2YWwgaGFzIGEgZml4ZWQgZ2FzIGJ1ZGdldCAtLSBhIHdhbGxldCBob2xkaW5nIDMwIHBpZWNlcyBtYWRlCi8vIHRoZSB1bmJvdW5kZWQgdmVyc2lvbiBmYWlsIG91dHJpZ2h0IHdpdGggIm91dCBvZiBnYXMgaW4gbG9jYXRpb246Ci8vIENQVUN5Y2xlcyIgb24gUGVhcmwgKDIwMjYtMDktMTYpLCB0YWtpbmcgdGhlIG1pbnQgcGFnZSdzICJZb3VyCi8vIG1pbnRlZCBHZW1zIiBwYW5lbCBkb3duIGZvciBleGFjdGx5IHRoZSBjb2xsZWN0b3JzIHdobyBjYXJlIG1vc3QuCi8vIEEgY2xpZW50IHBhZ2VzIGJ5IGNhbGxpbmcgYWdhaW4gd2l0aCB0aGUgcmV0dXJuZWQgbmV4dElkeCB1bnRpbCBpdAovLyByZWFjaGVzIHRoZSBjb2xsZWN0aW9uIHNpemUsIHNhbWUgcHJvdG9jb2wgYXMgYmVmb3JlOyBpdCBqdXN0IGdldHMKLy8gbW9yZSwgc21hbGxlciBwYWdlcyBmb3IgYSBiaWcgaG9sZGVyLgpjb25zdCAoCgl3YWxsZXRTY2FuQ2h1bmsgPSAxMDAKCXdhbGxldFJlbmRlckNhcCA9IHN1bW1hcnlQYWdlU2l6ZQopCgpmdW5jIFdhbGxldFN1bW1hcnkob3duZXIgYWRkcmVzcywgc3RhcnRJZHggaW50NjQpIChzdW1tYXJ5IHN0cmluZywgbmV4dElkeCBpbnQ2NCkgewoJdG90YWwgOj0gbGVuKG1pbnRlZElEcykKCXN0YXJ0IDo9IGludChzdGFydElkeCkKCWlmIHN0YXJ0IDwgMCB7CgkJc3RhcnQgPSAwCgl9CgllbmQgOj0gc3RhcnQgKyB3YWxsZXRTY2FuQ2h1bmsKCWlmIGVuZCA+IHRvdGFsIHsKCQllbmQgPSB0b3RhbAoJfQoJdmFyIGxpbmVzIFtdc3RyaW5nCglrIDo9IHN0YXJ0Cglmb3IgOyBrIDwgZW5kOyBrKysgewoJCWlmIGxlbihsaW5lcykgPj0gd2FsbGV0UmVuZGVyQ2FwIHsKCQkJYnJlYWsKCQl9CgkJdGlkIDo9IG1pbnRlZElEc1t0b3RhbC0xLWtdCgkJdG9rZW5Pd25lciwgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKQoJCWlmIGVyciAhPSBuaWwgfHwgdG9rZW5Pd25lciAhPSBvd25lciB7CgkJCWNvbnRpbnVlCgkJfQoJCWxpbmUsIGVyciA6PSB0aHVtYlN1bW1hcnkodGlkKQoJCWlmIGVyciAhPSBuaWwgewoJCQljb250aW51ZQoJCX0KCQlsaW5lcyA9IGFwcGVuZChsaW5lcywgbGluZSkKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4obGluZXMsICJcbiIpLCBpbnQ2NChrKQp9CgpmdW5jIEJ1cm5lZFRva2VuU3VtbWFyeSh0aWQgZ3JjNzIxLlRva2VuSUQpIChzdHJpbmcsIGVycm9yKSB7CglyYXcgOj0gYnVybmVkUmVjb3Jkcy5HZXQodGlkLlN0cmluZygpKQoJcmVjLCBvayA6PSByYXcuKGJ1cm5SZWNvcmQpCglpZiAhb2sgewoJCXJldHVybiAiIiwgZ3JjNzIxLkVyckludmFsaWRUb2tlbklkCgl9CgltIDo9IHJlYy5tZXRhZGF0YSgpCgllbmMgOj0gYmFzZTY0LlN0ZEVuY29kaW5nCglmaWVsZHMgOj0gW11zdHJpbmd7CgkJdGlkLlN0cmluZygpLAoJCXJlYy5CdXJuZWRCeS5TdHJpbmcoKSwKCQl1Zm10LlNwcmludGYoIiVkIiwgcmVjLkJ1cm5IZWlnaHQpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobS5OYW1lKSksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShtLkRlc2NyaXB0aW9uKSksCgkJIiIsIC8vIGltYWdlOiBhIGJ1cm4ga2VlcHMgbm9uZQoJCSIiLCAvLyBleHRlcm5hbCBVUkw6IG5vbmUKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHRyYWl0c1RvQ1NWKG0uQXR0cmlidXRlcykpKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKG0uQmFja2dyb3VuZENvbG9yKSksCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKGZpZWxkcywgInwiKSwgbmlsCn0KCmZ1bmMgYmlnVG9rZW5JbWFnZShpbWFnZSBzdHJpbmcpIHN0cmluZyB7Cgljb25zdCBwcmVmaXggPSAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiCglpZiAhc3RyaW5ncy5IYXNQcmVmaXgoaW1hZ2UsIHByZWZpeCkgewoJCXJldHVybiBpbWFnZQoJfQoJcmF3LCBlcnIgOj0gYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZVN0cmluZyhpbWFnZVtsZW4ocHJlZml4KTpdKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGltYWdlCgl9CglzdmcgOj0gc3RyaW5nKHJhdykKCXJlc2l6ZWQgOj0gc3RyaW5ncy5SZXBsYWNlKHN2ZywgYHdpZHRoPSIxNzAuMDAiIGhlaWdodD0iMTcwLjAwImAsIGB3aWR0aD0iYCt0b2tlblBhZ2VJbWFnZVNpemUrYCIgaGVpZ2h0PSJgK3Rva2VuUGFnZUltYWdlU2l6ZStgImAsIDEpCglpZiByZXNpemVkID09IHN2ZyB7CgkJcmVzaXplZCA9IHN0cmluZ3MuUmVwbGFjZShzdmcsIGB3aWR0aD0iMTcwIiBoZWlnaHQ9IjE3MCJgLCBgd2lkdGg9ImArdG9rZW5QYWdlSW1hZ2VTaXplK2AiIGhlaWdodD0iYCt0b2tlblBhZ2VJbWFnZVNpemUrYCJgLCAxKQoJfQoJcmV0dXJuIHByZWZpeCArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUocmVzaXplZCkpCn0KCi8vIHNob3J0QWRkciBpcyBob3cgbGlzdHMgc2hvdyBhbiBhZGRyZXNzOiBnMSArIDQgY2hhcmFjdGVycyDigKYgbGFzdCA0LgpmdW5jIHNob3J0QWRkcihhIHN0cmluZykgc3RyaW5nIHsKCWlmIGxlbihhKSA8PSAxNCB7CgkJcmV0dXJuIGEKCX0KCXJldHVybiBhWzo2XSArICLigKYiICsgYVtsZW4oYSktNDpdCn0KCmZ1bmMgcmVuZGVyTWludGVkTGlzdFBhZ2UoYiAqc3RyaW5ncy5CdWlsZGVyLCBwYWdlIGludCkgewoJdG90YWwgOj0gbGVuKG1pbnRlZElEcykKCWlmIHRvdGFsID09IDAgewoJCXJldHVybgoJfQoJdG90YWxQYWdlcyA6PSAodG90YWwgKyBnbm93ZWJMaXN0TGltaXQgLSAxKSAvIGdub3dlYkxpc3RMaW1pdAoJaWYgcGFnZSA8IDEgewoJCXBhZ2UgPSAxCgl9CglpZiBwYWdlID4gdG90YWxQYWdlcyB7CgkJcGFnZSA9IHRvdGFsUGFnZXMKCX0KCXN0YXJ0SyA6PSAocGFnZSAtIDEpICogZ25vd2ViTGlzdExpbWl0CgllbmRLIDo9IHN0YXJ0SyArIGdub3dlYkxpc3RMaW1pdAoJaWYgZW5kSyA+IHRvdGFsIHsKCQllbmRLID0gdG90YWwKCX0KCgliLldyaXRlU3RyaW5nKCJcbiMjIE1pbnRlZCBzbyBmYXJcblxuIikKCWlmIHRvdGFsUGFnZXMgPiAxIHsKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiX3BhZ2UgJWQgb2YgJWQgLS0gJWQgbWludGVkIHRvdGFsX1xuXG4iLCBwYWdlLCB0b3RhbFBhZ2VzLCB0b3RhbCkpCgl9CgkvLyBJbWFnZSBjb2x1bW4gY2VudHJlZCAoc28gaXMgYSBidXJuZWQgcm93J3MgIkJ1cm5lZCIpLiBPd25lcnMgYXJlCgkvLyBzaG9ydGVuZWQgdG8gZzF4eHh44oCmeHh4eDogdGhlIGZ1bGwgNDAtY2hhcmFjdGVyIGFkZHJlc3MgbWFkZSB0aGUKCS8vIE93bmVyIGNvbHVtbiBzbyB3aWRlIHRoYXQgZ25vd2ViIGJyb2tlICJJbmRleCIgb3ZlciB0d28gbGluZXMuIFRoZQoJLy8gdG9rZW4ncyBvd24gcGFnZSBzdGlsbCBzaG93cyB0aGUgZnVsbCBhZGRyZXNzLgoJYi5Xcml0ZVN0cmluZygifCBJbWFnZSB8IEluZGV4IHwgTmFtZSB8IE93bmVyIHxcbnw6LS0tOnw6LS0tOnwtLS18LS0tfFxuIikKCWZvciBrIDo9IHN0YXJ0SzsgayA8IGVuZEs7IGsrKyB7CgkJdGlkIDo9IG1pbnRlZElEc1t0b3RhbC0xLWtdCgkJbGluayA6PSByZWFsbVJlbFBhdGggKyAiOnRva2VuLyIgKyB0aWQuU3RyaW5nKCkKCQlvd25lciwgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKQoJCWlmIGVyciAhPSBuaWwgewoJCQkvLyBCdXJuZWQgLS0gc3RheXMgaW4gaXRzIG9yaWdpbmFsIGNocm9ub2xvZ2ljYWwgcG9zaXRpb24KCQkJLy8gKG5ldmVyIHNraXBwZWQ6IGEgbGlzdGluZyB0aGF0IHNpbGVudGx5IGRyb3BzIHJvd3MgcmVhZHMKCQkJLy8gYXMgYnJva2VuLCBub3QgYXMgIm5vdGhpbmcgdG8gc2VlIGhlcmUiIC0tIGNvbmZpcm1lZCBsaXZlCgkJCS8vIGFnYWluc3QgdGhlIHJlYWwgZ2VtczYvc3RhYmxlLCB3aGVyZSBhbiBhbGwtYnVybmVkIHBhZ2UKCQkJLy8gcmVuZGVyZWQgYXMgYSBibGFuayB0YWJsZSB3aXRoIG5vIGV4cGxhbmF0aW9uKS4gUHVsbGVkCgkJCS8vIGZyb20gdGhlIHBlcm1hbmVudCBidXJuZWRSZWNvcmRzIGFyY2hpdmUsIGltYWdlIGFsd2F5cwoJCQkvLyBlbXB0eSBieSBkZXNpZ24gKHNlZSBCdXJuJ3Mgb3duIGRvYyBjb21tZW50KSBzbyAiQnVybmVkIgoJCQkvLyBzdGFuZHMgaW4gZm9yIGl0LiBObyB3YWxsLWNsb2NrIGRhdGUgaXMgYXZhaWxhYmxlIGluc2lkZQoJCQkvLyBhIGduby5sYW5kIHJlYWxtIChvbmx5IGJsb2NrIGhlaWdodCkgLS0gc2hvd24gYXMgdGhhdAoJCQkvLyBpbnN0ZWFkIG9mIGEgZmFicmljYXRlZCBkYXRlLgoJCQlyYXcgOj0gYnVybmVkUmVjb3Jkcy5HZXQodGlkLlN0cmluZygpKQoJCQlyZWMsIG9rIDo9IHJhdy4oYnVyblJlY29yZCkKCQkJaWYgIW9rIHsKCQkJCWNvbnRpbnVlIC8vIHNob3VsZG4ndCBoYXBwZW46IGJ1cm5lZCBidXQgbm8gYXJjaGl2ZSByZWNvcmQKCQkJfQoJCQluYW1lIDo9IHJlYy5tZXRhZGF0YSgpLk5hbWUKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgQnVybmVkIHwgWyMlc10oJXMpIHwgJXMgKGJ1cm5lZCBhdCBibG9jayAlZCkgfCAlcyB8XG4iLCB0aWQuU3RyaW5nKCksIGxpbmssIG5hbWUsIHJlYy5CdXJuSGVpZ2h0LCBzaG9ydEFkZHIocmVjLkJ1cm5lZEJ5LlN0cmluZygpKSkpCgkJCWNvbnRpbnVlCgkJfQoJCW5hbWUsIGltYWdlIDo9IGxpc3RSb3codGlkKQoJCWltZ0NlbGwgOj0gIiIKCQlpZiBpbWFnZSAhPSAiIiB7CgkJCWltZ0NlbGwgPSB1Zm10LlNwcmludGYoIlshWyVzXSglcyldKCVzKSIsIG5hbWUsIGltYWdlLCBsaW5rKQoJCX0KCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCAlcyB8IFsjJXNdKCVzKSB8ICVzIHwgJXMgfFxuIiwgaW1nQ2VsbCwgdGlkLlN0cmluZygpLCBsaW5rLCBuYW1lLCBzaG9ydEFkZHIob3duZXIuU3RyaW5nKCkpKSkKCX0KCWIuV3JpdGVTdHJpbmcoIlxuIikKCglyZW5kZXJQYWdlTGlua3MoYiwgcGFnZSwgdG90YWxQYWdlcywgInBhZ2UiKQp9CgpmdW5jIHJlbmRlclBhZ2VMaW5rcyhiICpzdHJpbmdzLkJ1aWxkZXIsIHBhZ2UsIHRvdGFsUGFnZXMgaW50LCBsaW5rQmFzZSBzdHJpbmcpIHsKCWlmIHRvdGFsUGFnZXMgPD0gMSB7CgkJcmV0dXJuCgl9CgliLldyaXRlU3RyaW5nKCJcbiIpCglwYXJ0cyA6PSBbXXN0cmluZ3t9CglpZiBwYWdlID4gMSB7CgkJcGFydHMgPSBhcHBlbmQocGFydHMsIHVmbXQuU3ByaW50ZigiWzw8IEZpcnN0XSglczolcy8xKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UpKQoJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIls8LSBuZXdlcl0oJXM6JXMvJWQpIiwgcmVhbG1SZWxQYXRoLCBsaW5rQmFzZSwgcGFnZS0xKSkKCX0KCWxhc3RTaG93biA6PSAwCglmb3IgcCA6PSAxOyBwIDw9IHRvdGFsUGFnZXM7IHArKyB7CgkJaWYgcCAhPSAxICYmIHAgIT0gdG90YWxQYWdlcyAmJiAocCA8IHBhZ2UtcGFnZVdpbmRvdyB8fCBwID4gcGFnZStwYWdlV2luZG93KSB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGxhc3RTaG93biAhPSAwICYmIHAgIT0gbGFzdFNob3duKzEgewoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgIi4uLiIpCgkJfQoJCWlmIHAgPT0gcGFnZSB7CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIioqJWQqKiIsIHApKQoJCX0gZWxzZSB7CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIlslZF0oJXM6JXMvJWQpIiwgcCwgcmVhbG1SZWxQYXRoLCBsaW5rQmFzZSwgcCkpCgkJfQoJCWxhc3RTaG93biA9IHAKCX0KCWlmIHBhZ2UgPCB0b3RhbFBhZ2VzIHsKCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgdWZtdC5TcHJpbnRmKCJbb2xkZXIgLT5dKCVzOiVzLyVkKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UsIHBhZ2UrMSkpCgkJcGFydHMgPSBhcHBlbmQocGFydHMsIHVmbXQuU3ByaW50ZigiW0xhc3QgPj5dKCVzOiVzLyVkKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UsIHRvdGFsUGFnZXMpKQoJfQoJYi5Xcml0ZVN0cmluZyhzdHJpbmdzLkpvaW4ocGFydHMsICIgLSAiKSkKCWIuV3JpdGVTdHJpbmcoIlxuIikKfQoKZnVuYyByZW5kZXJCdXJuZWRMaXN0UGFnZShiICpzdHJpbmdzLkJ1aWxkZXIsIHBhZ2UgaW50KSB7Cgl0b3RhbCA6PSBsZW4oYnVybmVkSURzKQoJaWYgdG90YWwgPT0gMCB7CgkJcmV0dXJuCgl9Cgl0b3RhbFBhZ2VzIDo9ICh0b3RhbCArIGdub3dlYkxpc3RMaW1pdCAtIDEpIC8gZ25vd2ViTGlzdExpbWl0CglpZiBwYWdlIDwgMSB7CgkJcGFnZSA9IDEKCX0KCWlmIHBhZ2UgPiB0b3RhbFBhZ2VzIHsKCQlwYWdlID0gdG90YWxQYWdlcwoJfQoJc3RhcnRLIDo9IChwYWdlIC0gMSkgKiBnbm93ZWJMaXN0TGltaXQKCWVuZEsgOj0gc3RhcnRLICsgZ25vd2ViTGlzdExpbWl0CglpZiBlbmRLID4gdG90YWwgewoJCWVuZEsgPSB0b3RhbAoJfQoKCWIuV3JpdGVTdHJpbmcoIlxuIyMgQnVybmVkIHRva2Vuc1xuXG4iKQoJaWYgdG90YWxQYWdlcyA+IDEgewoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJfcGFnZSAlZCBvZiAlZCAtLSAlZCBidXJuZWQgdG90YWxfXG5cbiIsIHBhZ2UsIHRvdGFsUGFnZXMsIHRvdGFsKSkKCX0KCWIuV3JpdGVTdHJpbmcoInwgSW5kZXggfCBOYW1lIHwgQnVybmVkIEJ5IHwgQmxvY2sgfFxufDotLS06fC0tLXwtLS18LS0tfFxuIikKCWZvciBrIDo9IHN0YXJ0SzsgayA8IGVuZEs7IGsrKyB7CgkJdGlkIDo9IGJ1cm5lZElEc1t0b3RhbC0xLWtdCgkJcmF3IDo9IGJ1cm5lZFJlY29yZHMuR2V0KHRpZC5TdHJpbmcoKSkKCQlyZWMsIG9rIDo9IHJhdy4oYnVyblJlY29yZCkKCQlpZiAhb2sgewoJCQljb250aW51ZQoJCX0KCQluYW1lIDo9IHJlYy5tZXRhZGF0YSgpLk5hbWUKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCAjJXMgfCAlcyB8ICVzIHwgJWQgfFxuIiwgdGlkLlN0cmluZygpLCBuYW1lLCBzaG9ydEFkZHIocmVjLkJ1cm5lZEJ5LlN0cmluZygpKSwgcmVjLkJ1cm5IZWlnaHQpKQoJfQoJYi5Xcml0ZVN0cmluZygiXG4iKQoKCXJlbmRlclBhZ2VMaW5rcyhiLCBwYWdlLCB0b3RhbFBhZ2VzLCAiYnVybmVkL3BhZ2UiKQp9CgovLyByZW5kZXJCdXJuZWRUb2tlblBhZ2UgaXMgdGhlIHRva2VuIHJvdXRlIGZvciBhbiBpZCB0aGF0IG5vIGxvbmdlcgovLyBleGlzdHMuIElmIGl0IHdhcyBidXJuZWQsIGl0cyBhcmNoaXZlZCByZWNvcmQgLS0gbmFtZSwgdHJhaXRzLCB3aG8KLy8gYnVybmVkIGl0LCBhdCB3aGF0IGJsb2NrIC0tIGlzIHNob3duOiB0aGUgbWludGVkIGxpc3QgbGlua3MgZXZlcnkKLy8gYnVybmVkIHJvdyBoZXJlLCBhbmQgc3RhYmxldjMgYW5zd2VyZWQgdGhhdCBsaW5rIHdpdGggYSA0MDQsIHdoaWNoCi8vIHJlYWQgYXMgYSBicm9rZW4gc2l0ZSAoZm91bmQgaW4gdGhlIDIwMjYtMDktMTUgUGVhcmwgdGVzdCBydW4pLgovLyBBbnl0aGluZyBlbHNlIHJlYWxseSBpcyBhIDQwNC4KZnVuYyByZW5kZXJCdXJuZWRUb2tlblBhZ2UodGlkIGdyYzcyMS5Ub2tlbklEKSBzdHJpbmcgewoJcmF3IDo9IGJ1cm5lZFJlY29yZHMuR2V0KHRpZC5TdHJpbmcoKSkKCXJlYywgb2sgOj0gcmF3LihidXJuUmVjb3JkKQoJaWYgIW9rIHsKCQlyZXR1cm4gcmVuZGVyNDA0KCkKCX0KCW0gOj0gcmVjLm1ldGFkYXRhKCkKCW5hbWUgOj0gbS5OYW1lCgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIjICVzICMlcyAoYnVybmVkKVxuXG5bPC0gYmFjayB0byBjb2xsZWN0aW9uXSglcylcblxuIiwgQ29sbGVjdGlvbk5hbWUsIHRpZC5TdHJpbmcoKSwgcmVhbG1SZWxQYXRoKSkKCWIuV3JpdGVTdHJpbmcoIiMjIERldGFpbHNcblxuIikKCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqQ29sbGVjdGlvbioqOiAlc1xuIiwgQ29sbGVjdGlvbk5hbWUpKQoJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipOYW1lKio6ICVzXG4iLCBuYW1lKSkKCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqSW5kZXgqKjogIyVzXG4iLCB0aWQuU3RyaW5nKCkpKQoJaWYgbS5EZXNjcmlwdGlvbiAhPSAiIiB7CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipEZXNjcmlwdGlvbioqOiAlc1xuIiwgbS5EZXNjcmlwdGlvbikpCgl9CgliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKlN0YXR1cyoqOiBidXJuZWQgYnkgJXMgYXQgYmxvY2sgJWRcbiIsIHJlYy5CdXJuZWRCeSwgcmVjLkJ1cm5IZWlnaHQpKQoJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipBcmNoaXZlKio6IFthbGwgYnVybmVkIHRva2Vuc10oJXM6YnVybmVkKVxuIiwgcmVhbG1SZWxQYXRoKSkKCWlmIGxlbihtLkF0dHJpYnV0ZXMpID4gMCB7CgkJYi5Xcml0ZVN0cmluZygiXG4jIyBUcmFpdHNcblxuIikKCQlmb3IgXywgYXR0ciA6PSByYW5nZSBtLkF0dHJpYnV0ZXMgewoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKiVzKio6ICVzXG4iLCBhdHRyLlRyYWl0VHlwZSwgYXR0ci5WYWx1ZSkpCgkJfQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gZ25vdFN0cmluZzogdWdub3QgYXMgR05PVCwgdHJhaWxpbmcgemVyb3MgdHJpbW1lZCAoMTAwMDAwMDAwIC0+ICIxMDAiLAovLyAxNTAwMDAwIC0+ICIxLjUiKS4KZnVuYyBnbm90U3RyaW5nKHVnbm90IGludDY0KSBzdHJpbmcgewoJd2hvbGUsIGZyYWMgOj0gdWdub3QvMV8wMDBfMDAwLCB1Z25vdCUxXzAwMF8wMDAKCWlmIGZyYWMgPT0gMCB7CgkJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KHdob2xlLCAxMCkKCX0KCWYgOj0gc3RyY29udi5Gb3JtYXRJbnQoZnJhYysxXzAwMF8wMDAsIDEwKVsxOl0KCXJldHVybiBzdHJjb252LkZvcm1hdEludCh3aG9sZSwgMTApICsgIi4iICsgc3RyaW5ncy5UcmltUmlnaHQoZiwgIjAiKQp9CgovLyBicHNQZXJjZW50OiBiYXNpcyBwb2ludHMgYXMgYSBwZXJjZW50YWdlICg1MDAgLT4gIjUlIiwgMjUwIC0+ICIyLjUlIikuCi8vIHVmbXQgaWdub3JlcyB6ZXJvLXBhZGRpbmcsIHNvICIlZC4lMDJkIiBwcmludGVkIDUwMCBhcyAiNS4wJSIuCmZ1bmMgYnBzUGVyY2VudChicHMgaW50NjQpIHN0cmluZyB7CglpZiBicHMlMTAwID09IDAgewoJCXJldHVybiBzdHJjb252LkZvcm1hdEludChicHMvMTAwLCAxMCkgKyAiJSIKCX0KCWYgOj0gc3RyY29udi5Gb3JtYXRJbnQoYnBzJTEwMCsxMDAsIDEwKVsxOl0KCXJldHVybiBzdHJjb252LkZvcm1hdEludChicHMvMTAwLCAxMCkgKyAiLiIgKyBzdHJpbmdzLlRyaW1SaWdodChmLCAiMCIpICsgIiUiCn0KCmZ1bmMgcmVuZGVyNDA0KCkgc3RyaW5nIHsKCXJldHVybiB1Zm10LlNwcmludGYoIiMgNDA0XG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuIiwgcmVhbG1SZWxQYXRoKQp9CgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggPT0gIiIgewoJCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJCWIuV3JpdGVTdHJpbmcodG9rZW4uUmVuZGVySG9tZSgpKQoJCWIuV3JpdGVTdHJpbmcoIlxuIyMgQWJvdXRcblxuIikKCQliLldyaXRlU3RyaW5nKENvbGxlY3Rpb25OYW1lICsgIiBhcmUgZ2Vtc3RvbmVzIGNhcHR1cmVkIGluIGFuIGFudGktZ3Jhdml0eSBmaWVsZC4gRWFjaCBzdG9uZSBmbG9hdHMsIHN1c3BlbmRlZCwgYXQgdGhlIGhlYXJ0IG9mIHRoZSByaW5nIGFyb3VuZCBpdCAtLSBnb2xkLCBwbGF0aW51bSwgc2lsdmVyLCBicm9uemUgb3Igb2JzaWRpYW4gLS0gd2hpY2ggaG9sZHMgaXQgaW4gcGxhY2UgYW5kIHR1cm5zIGl0IGludG8gYSBkaXNwbGF5IHBpZWNlIGZvciB0aGUgY29sbGVjdG9yLlxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIlRoZSBjb2xsZWN0aW9uIGlzIGluc3BpcmVkIGJ5IHRoZSBuYW1lcyBvZiBnbm8ubGFuZCdzIGNoYWlucy4gRXZlcnkgcGllY2UncyBDaGFpbiB0cmFpdCBuYW1lcyBhIGduby5sYW5kIGNoYWluIGdlbmVyYXRpb24sIGFuZCBpdHMgc3RvbmUgaXMgdGhhdCBjaGFpbidzIG93bjogVG9wYXosIFNhcHBoaXJlIGFuZCBQZWFybCBmb3IgdGhlIHRlc3RuZXRzIHRoYXQgY2FycnkgdGhvc2UgbmFtZXMsIERpYW1vbmQgZm9yIG1haW5uZXQsIGFuZCBRdWFydHogZm9yIHRoZSB0ZXN0bmV0cyB3aXRob3V0IG9uZS4gT25seSByZWFsIGN1dHMgYW5kIGNvbG91cnM7IGV2ZXJ5IGltYWdlIGlzIGRyYXduIG9uLWNoYWluLiBEZWxheWVkLXJldmVhbCBtaW50OiBlYWNoIHBpZWNlJ3MgdHJhaXRzIHN0YXkgc2VhbGVkIGZvciBhIGZldyBibG9ja3MgYWZ0ZXIgaXQgaXMgbWludGVkLlxuXG4iKQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqT3duZXIqKjogJXNcbiIsIE93bmVyKCkpKQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqQXNzZW1ibGVkIHRyYWl0IGNvbWJpbmF0aW9ucyBtaW50ZWQqKjogJWRcbiIsIGludDY0KG1pbnRlZFRyYWl0Q29tYm9zLlNpemUoKSkpKQoJCWIuV3JpdGVTdHJpbmcoIiogKipNYXggc3VwcGx5Kio6IHVubGltaXRlZFxuIikKCQlpZiBtaW50aW5nT3Blbk1pcnJvciB7CgkJCWIuV3JpdGVTdHJpbmcoIiogKipNaW50aW5nKio6IG9wZW5cbiIpCgkJfSBlbHNlIHsKCQkJYi5Xcml0ZVN0cmluZygiKiAqKk1pbnRpbmcqKjogY2xvc2VkXG4iKQoJCX0KCQlpZiBtaW50UHJpY2VVZ25vdCA+IDAgewoJCQliLldyaXRlU3RyaW5nKCIqICoqTWludCBwcmljZSoqOiAiICsgZ25vdFN0cmluZyhtaW50UHJpY2VVZ25vdCkgKyAiIEdOT1RcbiIpCgkJfSBlbHNlIHsKCQkJYi5Xcml0ZVN0cmluZygiKiAqKk1pbnQgcHJpY2UqKjogZnJlZVxuIikKCQl9CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipSZXZlYWwgZGVsYXkqKjogJWQgYmxvY2socylcbiIsIFJldmVhbERlbGF5QmxvY2tzKSkKCQlpZiBtYXhNaW50c1BlcldhbGxldE1pcnJvciA+IDAgewoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKk1heCBtaW50cyBwZXIgd2FsbGV0Kio6ICVkXG4iLCBtYXhNaW50c1BlcldhbGxldE1pcnJvcikpCgkJfSBlbHNlIHsKCQkJYi5Xcml0ZVN0cmluZygiKiAqKk1heCBtaW50cyBwZXIgd2FsbGV0Kio6IHVubGltaXRlZFxuIikKCQl9CgkJaWYgcm95YWx0eUJwcyA+IDAgewoJCQliLldyaXRlU3RyaW5nKCIqICoqU2Vjb25kYXJ5IHNhbGUgcm95YWx0eSoqOiAiICsgYnBzUGVyY2VudChyb3lhbHR5QnBzKSArICIgKEVJUC0yOTgxIFJveWFsdHlJbmZvKVxuIikKCQl9CgkJaWYgbGVuKGJ1cm5lZElEcykgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipCdXJuZWQqKjogJWQgLS0gW3ZpZXcgYnVybmVkIHRva2VucyAtPl0oJXM6YnVybmVkKVxuIiwgbGVuKGJ1cm5lZElEcyksIHJlYWxtUmVsUGF0aCkpCgkJfQoKCQlyZW5kZXJNaW50ZWRMaXN0UGFnZSgmYiwgMSkKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoKCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQocGF0aCwgIi8iKQoJaWYgbGVuKHBhcnRzKSA9PSAyICYmIHBhcnRzWzBdID09ICJwYWdlIiB7CgkJcGFnZSwgZXJyIDo9IHN0cmNvbnYuQXRvaShwYXJ0c1sxXSkKCQlpZiBlcnIgIT0gbmlsIHx8IHBhZ2UgPCAxIHsKCQkJcmV0dXJuIHJlbmRlcjQwNCgpCgkJfQoJCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIjICVzIC0tIG1pbnRlZCB0b2tlbnNcblxuWzwtIGJhY2sgdG8gY29sbGVjdGlvbl0oJXMpXG4iLCBDb2xsZWN0aW9uTmFtZSwgcmVhbG1SZWxQYXRoKSkKCQlyZW5kZXJNaW50ZWRMaXN0UGFnZSgmYiwgcGFnZSkKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJaWYgcGFydHNbMF0gPT0gImJ1cm5lZCIgewoJCXBhZ2UgOj0gMQoJCWlmIGxlbihwYXJ0cykgPT0gMyAmJiBwYXJ0c1sxXSA9PSAicGFnZSIgewoJCQlwLCBlcnIgOj0gc3RyY29udi5BdG9pKHBhcnRzWzJdKQoJCQlpZiBlcnIgIT0gbmlsIHx8IHAgPCAxIHsKCQkJCXJldHVybiByZW5kZXI0MDQoKQoJCQl9CgkJCXBhZ2UgPSBwCgkJfSBlbHNlIGlmIGxlbihwYXJ0cykgIT0gMSB7CgkJCXJldHVybiByZW5kZXI0MDQoKQoJCX0KCQl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiIyAlcyAtLSBidXJuZWQgdG9rZW5zXG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuIiwgQ29sbGVjdGlvbk5hbWUsIHJlYWxtUmVsUGF0aCkpCgkJcmVuZGVyQnVybmVkTGlzdFBhZ2UoJmIsIHBhZ2UpCgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCWlmIGxlbihwYXJ0cykgPT0gMiAmJiBwYXJ0c1swXSA9PSAidG9rZW4iIHsKCQl0aWQgOj0gZ3JjNzIxLlRva2VuSUQocGFydHNbMV0pCgkJb3duZXIsIGVyciA6PSB0b2tlbi5Pd25lck9mKHRpZCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIHJlbmRlckJ1cm5lZFRva2VuUGFnZSh0aWQpCgkJfQoJCW1ldGFkYXRhLCBfIDo9IGN1cnJlbnRNZXRhZGF0YSh0aWQpCgkJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiMgJXMgIyVzXG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuXG4iLCBDb2xsZWN0aW9uTmFtZSwgdGlkLlN0cmluZygpLCByZWFsbVJlbFBhdGgpKQoJCWltYWdlIDo9IG1ldGFkYXRhLkltYWdlCgkJbmFtZSA6PSBtZXRhZGF0YS5OYW1lCgkJaWYgbmFtZSA9PSAiIiB7CgkJCW5hbWUgPSAiVW50aXRsZWQiCgkJfQoJCWlmIGltYWdlICE9ICIiIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiFbJXNdKCVzKVxuXG4iLCBuYW1lLCBiaWdUb2tlbkltYWdlKGltYWdlKSkpCgkJfQoKCQliLldyaXRlU3RyaW5nKCIjIyBEZXRhaWxzXG5cbiIpCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipDb2xsZWN0aW9uKio6ICVzXG4iLCBDb2xsZWN0aW9uTmFtZSkpCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipOYW1lKio6ICVzXG4iLCBuYW1lKSkKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkluZGV4Kio6ICMlc1xuIiwgdGlkLlN0cmluZygpKSkKCQlpZiBtZXRhZGF0YS5EZXNjcmlwdGlvbiAhPSAiIiB7CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqRGVzY3JpcHRpb24qKjogJXNcbiIsIG1ldGFkYXRhLkRlc2NyaXB0aW9uKSkKCQl9CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipPd25lcioqOiAlc1xuIiwgb3duZXIpKQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqUmV2ZWFsZWQqKjogJXQgKGFnZSAlZCBibG9jayhzKSlcbiIsIElzUmV2ZWFsZWQodGlkKSwgQWdlKHRpZCkpKQoKCQlpZiBsZW4obWV0YWRhdGEuQXR0cmlidXRlcykgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiXG4jIyBUcmFpdHNcblxuIikKCQkJZm9yIF8sIGF0dHIgOj0gcmFuZ2UgbWV0YWRhdGEuQXR0cmlidXRlcyB7CgkJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKiVzKio6ICVzXG4iLCBhdHRyLlRyYWl0VHlwZSwgYXR0ci5WYWx1ZSkpCgkJCX0KCQl9CgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCglyZXR1cm4gcmVuZGVyNDA0KCkKfQoKZnVuYyBjaGVja0VycihlcnIgZXJyb3IpIHsKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTE3MDAwMDAwdWdub3QSEQiSgKlEEgo3MTY0MHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAsLN3rP6/ecteTp/bfskfetEoJqwu0U4h3+EXMJ3NXY0EkD55Myy80nRbnVPq+wewzOrnuSUBPbX9Az/2X8HZNrGMHewsLG0r0lXfop9Jn1au+P307yGwYgl/85creJmYEVXGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data