Transaction executed successfully

Transaction Details

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

Transaction hash
7C58599E01E58EBD9F2568AC2FC1BFE3AB6F0C7625159E2ADD360AFA923646FF

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
99,033,400
Requested gas limit
GAS USED
36,813,209
Gas consumed
FEE
297100ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf56000000ugnot
Message #2
m_addpkg
Caller
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf56000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cv11Cgwvdm0ubV9hZGRwa2cS7HUKKGcxbWFuZnJlZDQ3a3pkdWVjOTIwejg4d2ZyNjR5bGtzbWRjZWRsZjUSsXUKCGRldnRvb2xzEiZnbm8ubGFuZC9yL21vdWwveC9hbGxpbm9uZS9kZXZ0b29scy92MBruFQoJUkVBRE1FLm1kEuAVIyBgZ25vLmxhbmQvci9tb3VsL3gvYWxsaW5vbmUvZGV2dG9vbHNgCgpUaGUgd29ya2VkIGV4YW1wbGUgb2Ygd2lyaW5nIG1vdWwncyBkZXZlbG9wZXIgcGFja2FnZXMgaW50byBvbmUgcmVhbG06IHdoYXQgYQpuZXcgcmVhbG0gc2hvdWxkIGNvcHkuCgpFaWdodCBwYWNrYWdlcywgZWFjaCBlYXJuaW5nIGl0cyBwbGFjZSBpbiB0aGUgb3V0cHV0OgoKfCBwYWNrYWdlIHwgd2hhdCBpdCBjb250cmlidXRlcyB8CnwtLS18LS0tfAp8IFtgci9tb3VsL2NvbmZpZ2BdKC4uLy4uLy4uL2NvbmZpZykgfCB0aGUgbm90aWNlIGJsb2NrLCB0aGUgcGF1c2UgZ3VhcmQsIHdoaWNoIGV4cGxvcmVyIHRvIGxpbmsgfAp8IFtgcC9tb3VsL215Z25vc2NhbmBdKC4uLy4uLy4uLy4uL3AvbW91bC9teWdub3NjYW4pIHwgdGhlIGV4cGxvcmVyIHJvdXRlcyB8CnwgW2BwL21vdWwvZGVidWdgXSguLi8uLi8uLi8uLi9wL21vdWwvZGVidWcpIHwgdGhlIGA/ZGVidWc9MWAgcGFuZWwgfAp8IFtgcC9tb3VsL3JlYWxtcGF0aGBdKC4uLy4uLy4uLy4uL3AvbW91bC9yZWFsbXBhdGgpIHwgcmVhZGluZyB0aGUgcmVuZGVyIHBhdGggfAp8IFtgcC9tb3VsL2tpdC91aWBdKC4uLy4uLy4uLy4uL3AvbW91bC9raXQvdWkpIHwgZXNjYXBpbmcgY2FsbGVyIGlucHV0LCBhbmQgdGhlIHRhYmxlcyB8CnwgW2BwL21vdWwvbWRgXSguLi8uLi8uLi8uLi9wL21vdWwvbWQpIHwgdGhlIG1hcmtkb3duIHwKfCBbYHAvbW91bC90eGxpbmtgXSguLi8uLi8uLi8uLi9wL21vdWwvdHhsaW5rKSB8IHRoZSBjYWxsIGxpbmtzIHwKfCBbYHAvbW91bC9maWZvYF0oLi4vLi4vLi4vLi4vcC9tb3VsL2ZpZm8pIHwgdGhlIGJvdW5kZWQgbm90ZSBsaXN0IHwKCiMjIFRoZSB0aHJlZSBsaW5lcyB3b3J0aCBjb3B5aW5nCgpgYGBnbwpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBjb25maWcuVG9wQmxvY2tGb3IocmVhbG1QYXRoKSArIGJvZHkgKyBjb25maWcuQm90dG9tQmxvY2tGb3IocmVhbG1QYXRoKQp9CgpmdW5jIEFkZChjdXIgcmVhbG0sIGJvZHkgc3RyaW5nKSB7Cgljb25maWcuQXNzZXJ0V3JpdGFibGVGb3IocmVhbG1QYXRoKSAgLy8gaG9ub3VycyB0aGUgcGF1c2Ugc3dpdGNoCglub3Rlcy5BcHBlbmQodWkuSW5saW5lKGJvZHkpKSAgICAgICAgLy8gZXNjYXBlcyB3aGF0IGEgY2FsbGVyIHR5cGVkCn0KYGBgCgpUaGUgZmlyc3QgZ2l2ZXMgdGhlIHJlYWxtIGEgcGxhY2UgZm9yIGEgd2FybmluZyBhbmQgYSBwYXVzZSBiYW5uZXIgd2l0aG91dApzaGlwcGluZyBhbnkgYmFubmVyIGNvZGUsIGFuZCByZXR1cm5zIGAiImAgd2hpbGUgbm90aGluZyBpcyBzZXQsIHNvIGEgcGFnZSB0aGF0CmNvbmNhdGVuYXRlcyBpdCB1bmNvbmRpdGlvbmFsbHkgaXMgdW5jaGFuZ2VkIGJ5IGRlZmF1bHQuCgpUaGUgc2Vjb25kIGlzIHR3byBzZXBhcmF0ZSBndWFyZHMgYW5kIGJvdGggaGF2ZSB0byBiZSB0aGVyZTogdGhlIHBhdXNlIG9uZSBzbwphbiBpbmNpZGVudCBjYW4gc3RvcCB3cml0ZXMgZnJvbSBvdXRzaWRlIHRoaXMgcmVhbG0gYW5kIHdpdGhvdXQgYSByZWRlcGxveSwgYW5kCnRoZSBlc2NhcGluZyBvbmUgYmVjYXVzZSBhIHN0cmluZyBhIGNhbGxlciB0eXBlZCBpcyB0aGUgb2xkZXN0IHdheSB0byBicmVhayBhCnBhZ2UuCgojIyBUd28gdmlld3MKCmBSZW5kZXIoIiIpYCBpcyB0aGUgcm9vdCBhbmQgaXMgZnJlZSBvZiBhbnl0aGluZyB0aGF0IG1vdmVzLCBzbyBhbiBleGFtcGxlIHRlc3QKY2FuIHBpbiBpdC4gRXZlcnl0aGluZyBsaXZlICh0aGUgaGVpZ2h0LCB0aGUgY2hhaW4gaWQsIHRoZSBsaW5rcyBidWlsdCBmcm9tCnRoZW0pIGlzIHVuZGVyIGA6Y2hhaW5gLCB3aGljaCBpcyBhbHNvIHdoYXQga2VlcHMgdGhlIHBpbm5lZCBvdXRwdXQgc3RhYmxlLgoKU3RhdGUgaXMgZGlzcG9zYWJsZTogdGhlIG5vdGUgbGlzdCBpcyBib3VuZGVkIGJ5IGBmaWZvYCBhdCAxMCBlbnRyaWVzIGFuZCB0aGlzCnJlYWxtIGlzIGBwcml2YXRlID0gdHJ1ZWAsIHNvIGEgcmVkZXBsb3kgd2lwZXMgaXQgb24gcHVycG9zZS4KCjwhLS0gQkVHSU4gR05PQ09OVFJBQ1RTIEZPT1RFUiAoZ2VuZXJhdGVkIGJ5IGBtYWtlIHJlYWRtZXNgOyBkbyBub3QgZWRpdCBiZWxvdykgLS0+CgotLS0KClBhcnQgb2YgKipbbW91bC9nbm8tY29udHJhY3RzXShodHRwczovL2dpdGh1Yi5jb20vbW91bC9nbm8tY29udHJhY3RzKSoqIOKAlCBtb3VsJ3MgdmVyc2lvbmVkIGduby5sYW5kIGNvbnRyYWN0cy4gU2VlIHRoZSByZXBvc2l0b3J5IGZvciB0aGUgZnVsbCBjYXRhbG9nLCBidWlsZC90ZXN0IHRvb2xpbmcsIGFuZCB1c2FnZS4KCioqRGVwZW5kZW5jeSBncmFwaDoqKgoKIVtnbm8ubGFuZC9yL21vdWwveC9hbGxpbm9uZS9kZXZ0b29scy92MCBkZXBlbmRlbmN5IGdyYXBoXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW91bC9nbm8tY29udHJhY3RzL21haW4vX2Fzc2V0cy9nbm8ubGFuZC9yL21vdWwveC9hbGxpbm9uZS9kZXZ0b29scy92MC9kZXBzLnBuZykKCj4g8J+nqiAqKkhpZ2hseSBleHBlcmltZW50YWwg4oCUIHBvdGVudGlhbGx5IHZpYmUtY29kZWQuKiogTm90IGF1ZGl0ZWQ7IG1heSBicmVhaywgY2hhbmdlLCBvciBiZSByZW1vdmVkIGF0IGFueSB0aW1lLiBEbyBub3QgdXNlIHdpdGggYW55dGhpbmcgb2YgdmFsdWUuIEZ1bGwgZGlzY2xhaW1lcjogW0RJU0NMQUlNRVJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VsL2duby1jb250cmFjdHMvYmxvYi9tYWluL0RJU0NMQUlNRVIubWQpLgoKPCEtLSBFTkQgR05PQ09OVFJBQ1RTIEZPT1RFUiAtLT4KGtY7CgxkZXZ0b29scy5nbm8SxTsvLyBQYWNrYWdlIGRldnRvb2xzIGlzIHRoZSB3b3JrZWQgZXhhbXBsZSBvZiB3aXJpbmcgbW91bCdzIGRldmVsb3BlciBwYWNrYWdlcwovLyBpbnRvIG9uZSByZWFsbTogd2hhdCBhIG5ldyByZWFsbSBzaG91bGQgY29weS4KLy8KLy8gRXZlcnl0aGluZyBoZXJlIGlzIGEgQ09NQklOQVRJT04uIEFueSBvbmUgb2YgdGhlc2UgcGFja2FnZXMgaGFzIGl0cyBvd24gZGVtbwovLyBzaG93aW5nIGl0IGFsb25lOyB0aGUgdGhpbmcgdGhhdCBpcyBoYXJkIHRvIGZpbmQgaXMgd2hhdCB0aGV5IGxvb2sgbGlrZSB1c2VkCi8vIHRvZ2V0aGVyLCB3aGljaCBpcyB0aGUgb25seSBmb3JtIGEgcmVhbCByZWFsbSBldmVyIG1lZXRzIHRoZW0gaW4uIFNvIHRoaXMKLy8gcmVhbG0gaW1wb3J0cyBlaWdodCBvZiB0aGVtIGFuZCBldmVyeSBvbmUgZWFybnMgaXRzIHBsYWNlIGluIHRoZSBvdXRwdXQ6Ci8vCi8vCXIvbW91bC9jb25maWcgICAgIHRoZSBub3RpY2UgYmxvY2ssIHRoZSBwYXVzZSBzd2l0Y2gsIHRoZSBleHBsb3JlciB0byBsaW5rCi8vCXAvbW91bC9teWdub3NjYW4gIHRoZSBleHBsb3JlciByb3V0ZXMgdGhlbXNlbHZlcwovLwlwL21vdWwvZGVidWcgICAgICBhIG1ldGFkYXRhIHBhbmVsIGJlaGluZCA/ZGVidWc9MQovLwlwL21vdWwvcmVhbG1wYXRoICByZWFkaW5nIHRoZSBxdWVyeSBzdHJpbmcgUmVuZGVyIHdhcyBoYW5kZWQKLy8JcC9tb3VsL2tpdC91aSAgICAgZXNjYXBpbmcgd2hhdCBhIGNhbGxlciB0eXBlZCwgYW5kIHRoZSB0YWJsZXMKLy8JcC9tb3VsL21kICAgICAgICAgdGhlIG1hcmtkb3duLCB3aXRob3V0IGhhbmQtcm9sbGVkIHN0cmluZ3MKLy8JcC9tb3VsL3R4bGluayAgICAgdGhlICJjYWxsIHRoaXMgZnVuY3Rpb24iIGxpbmsKLy8JcC9tb3VsL2ZpZm8gICAgICAgdGhlIGJvdW5kZWQgbm90ZSBsaXN0LCBzbyB0aGUgc3RhdGUgY2Fubm90IGdyb3cgZm9yZXZlcgovLwovLyAjIFRoZSB0aHJlZSBsaW5lcyB3b3J0aCBjb3B5aW5nCi8vCi8vIEEgcmVhbG0gdGhhdCBkb2VzIG5vdGhpbmcgZWxzZSBzaG91bGQgc3RpbGwgZG8gdGhlc2U6Ci8vCi8vCWZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewovLwkJcmV0dXJuIGNvbmZpZy5Ub3BCbG9ja0ZvcihyZWFsbVBhdGgpICsgYm9keSArIGNvbmZpZy5Cb3R0b21CbG9ja0ZvcihyZWFsbVBhdGgpCi8vCX0KLy8KLy8JZnVuYyBNdXRhdGUoY3VyIHJlYWxtLCBzIHN0cmluZykgewovLwkJY29uZmlnLkFzc2VydFdyaXRhYmxlRm9yKHJlYWxtUGF0aCkgIC8vIGhvbm91cnMgdGhlIHBhdXNlIHN3aXRjaAovLwkJbm90ZXMuQXBwZW5kKHVpLklubGluZShzKSkgICAgICAgICAgIC8vIGVzY2FwZXMgd2hhdCBhIGNhbGxlciB0eXBlZAovLwl9Ci8vCi8vIFRoZSBmaXJzdCBnaXZlcyBldmVyeSByZWFsbSBhIHBsYWNlIHRvIHB1dCBhIHdhcm5pbmcgYW5kIGEgcGF1c2UgYmFubmVyCi8vIHdpdGhvdXQgc2hpcHBpbmcgYmFubmVyIGNvZGUuIFRoZSBzZWNvbmQgaXMgdHdvIHNlcGFyYXRlIGd1YXJkcyB0aGF0IGJvdGgKLy8gaGF2ZSB0byBiZSB0aGVyZTogdGhlIHBhdXNlIG9uZSBzbyBhbiBpbmNpZGVudCBjYW4gc3RvcCB3cml0ZXMgZnJvbSBvdXRzaWRlCi8vIHRoZSByZWFsbSwgYW5kIHRoZSBlc2NhcGluZyBvbmUgYmVjYXVzZSBhIHN0cmluZyBhIGNhbGxlciB0eXBlZCBpcyB0aGUKLy8gb2xkZXN0IHdheSB0byBicmVhayBhIHBhZ2UuCnBhY2thZ2UgZGV2dG9vbHMKCmltcG9ydCAoCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJjaGFpbi9ydW50aW1lIgoKCSJnbm8ubGFuZC9wL21vdWwvZGVidWcvdjAiCgkiZ25vLmxhbmQvcC9tb3VsL2ZpZm8vdjAiCgkiZ25vLmxhbmQvcC9tb3VsL2tpdC91aS92MCIKCSJnbm8ubGFuZC9wL21vdWwvbWQvdjAiCgkiZ25vLmxhbmQvcC9tb3VsL215Z25vc2Nhbi92MCIKCSJnbm8ubGFuZC9wL21vdWwvcmVhbG1wYXRoL3YwIgoJImduby5sYW5kL3AvbW91bC90eGxpbmsvdjAiCgkiZ25vLmxhbmQvci9tb3VsL2NvbmZpZy92MSIKKQoKLy8gcmVhbG1QYXRoIGlzIHRoaXMgcmVhbG0ncyBvd24gcGF0aC4KLy8KLy8gUGFzc2VkIGV4cGxpY2l0bHkgdG8gY29uZmlnIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gaXRzIHplcm8tYXJndW1lbnQgaGVscGVycy4KLy8gQm90aCB3b3JrIChhIHBsYWluIHJlYWQgaXMgYm9ycm93ZWQsIHNvIGNvbmZpZyBzZWVzIHRoaXMgcmVhbG0gYXMgdGhlCi8vIGNhbGxlciksIGJ1dCBhIGNvbnN0YW50IGNhbm5vdCBiZSB3cm9uZywgYW5kIHNwZWxsaW5nIGl0IG91dCBpcyB3aGF0IGEgcmVhZGVyCi8vIGNvcHlpbmcgdGhpcyBmaWxlIG5lZWRzIHRvIHNlZS4KY29uc3QgcmVhbG1QYXRoID0gImduby5sYW5kL3IvbW91bC94L2FsbGlub25lL2RldnRvb2xzL3YwIgoKLy8gbWF4Tm90ZXMgYm91bmRzIHRoZSBndWVzdCBsaXN0LiBmaWZvIGRyb3BzIHRoZSBvbGRlc3QgcmF0aGVyIHRoYW4gZ3Jvd2luZywKLy8gYmVjYXVzZSBzdG9yYWdlIG9uIGNoYWluIGlzIHBhaWQgZm9yIGFuZCBuZXZlciByZWZ1bmRlZDogYW4gdW5ib3VuZGVkIGxpc3QgaW4KLy8gYSBkZW1vIGFueW9uZSBjYW4gd3JpdGUgdG8gaXMgYSBiaWxsIHdpdGggbm8gY2VpbGluZy4KY29uc3QgbWF4Tm90ZXMgPSAxMAoKdmFyIG5vdGVzID0gZmlmby5OZXcobWF4Tm90ZXMpCgovLyBBZGQgYXBwZW5kcyBhIG5vdGUuIEl0IGlzIHRoZSBvbmx5IG11dGF0aW5nIGZ1bmN0aW9uIGhlcmUsIGFuZCBpdCBjYXJyaWVzCi8vIGJvdGggZ3VhcmRzIGEgcmVhbCBvbmUgc2hvdWxkLgpmdW5jIEFkZChjdXIgcmVhbG0sIGJvZHkgc3RyaW5nKSB7CgkvLyAxLiBUaGUgcGF1c2Ugc3dpdGNoLiBTZXQgYHBhdXNlQHIvbW91bC94L2FsbGlub25lL2RldnRvb2xzYCBvbgoJLy8gICAgci9tb3VsL2NvbmZpZyBhbmQgdGhpcyBhYm9ydHMsIHdpdGggdGhlIHJlYXNvbiwgZnJvbSBvdXRzaWRlIHRoaXMKCS8vICAgIHJlYWxtIGFuZCB3aXRob3V0IGEgcmVkZXBsb3kuCgljb25maWcuQXNzZXJ0V3JpdGFibGVGb3IocmVhbG1QYXRoKQoKCWJvZHkgPSBzdHJpbmdzLlRyaW1TcGFjZShib2R5KQoJaWYgYm9keSA9PSAiIiB7CgkJcGFuaWMoImVtcHR5IG5vdGUiKQoJfQoJaWYgbGVuKGJvZHkpID4gMjAwIHsKCQlwYW5pYygibm90ZSB0b28gbG9uZzogbWF4IDIwMCBieXRlcywgZ290ICIgKyBzdHJjb252Lkl0b2EobGVuKGJvZHkpKSkKCX0KCgkvLyAyLiBFc2NhcGluZy4gYm9keSBpcyBhIHN0cmluZyBhIGNhbGxlciB0eXBlZCwgYW5kIGl0IGlzIGFib3V0IHRvIGxhbmQgaW4KCS8vICAgIGEgbWFya2Rvd24gbGlzdC4gdWkuSW5saW5lIGlzIHRoZSByZXBvJ3Mgc3RhbmRhcmQgZm9yIGV4YWN0bHkgdGhpcy4KCW5vdGVzLkFwcGVuZCh1aS5JbmxpbmUoYm9keSkpCn0KCi8vIFJlc2V0IGVtcHRpZXMgdGhlIGxpc3QsIHNvIHRoZSByZWFsbSBjYW4gYmUgcHV0IGJhY2sgdG8gYSBrbm93biBzdGF0ZQovLyB3aXRob3V0IGEgcmVkZXBsb3kuIE5vdCBnYXRlZCBieSB0aGUgcGF1c2Ugc3dpdGNoOiBjbGVhcmluZyB1cCBpcyB0aGUgdGhpbmcKLy8geW91IHN0aWxsIHdhbnQgdG8gZG8gd2hpbGUgcGF1c2VkLgpmdW5jIFJlc2V0KGN1ciByZWFsbSkgewoJbm90ZXMgPSBmaWZvLk5ldyhtYXhOb3RlcykKfQoKLy8gUmVuZGVyIHNob3dzIGV2ZXJ5IHBhY2thZ2UgYXQgd29yay4gVGhlIHJvb3QgdmlldyBpcyBkZWxpYmVyYXRlbHkgZnJlZSBvZgovLyBhbnl0aGluZyB0aGF0IG1vdmVzIG9uIGl0cyBvd24sIHNvIGFuIGV4YW1wbGUgdGVzdCBjYW4gcGluIGl0OyB0aGUgbGl2ZQovLyBudW1iZXJzIGxpdmUgdW5kZXIgImNoYWluIi4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglyZXEgOj0gcmVhbG1wYXRoLlBhcnNlKHBhdGgpCgoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGNvbmZpZy5Ub3BCbG9ja0ZvcihyZWFsbVBhdGgpKQoJYi5Xcml0ZVN0cmluZyhtZC5IMSgiYWxsaW5vbmU6IGRldnRvb2xzIikpCgliLldyaXRlU3RyaW5nKCJcbkVpZ2h0IHBhY2thZ2VzLCB1c2VkIHRvZ2V0aGVyIHJhdGhlciB0aGFuIG9uZSBhdCBhIHRpbWUuICIpCgliLldyaXRlU3RyaW5nKG1kLkxpbmsoInNvdXJjZSIsIGNvbmZpZy5NeWdub3NjYW5Gb3IocmVhbG1QYXRoKSkpCgliLldyaXRlU3RyaW5nKCJcblxuIikKCglzd2l0Y2ggcmVxLlBhdGhQYXJ0KDApIHsKCWNhc2UgImNoYWluIjoKCQliLldyaXRlU3RyaW5nKHJlbmRlckNoYWluKCkpCglkZWZhdWx0OgoJCWIuV3JpdGVTdHJpbmcocmVuZGVySG9tZShwYXRoKSkKCX0KCgkvLyBkZWJ1ZyBwcmludHMgaXRzIG93biBwYW5lbCBvbmx5IHdoZW4gP2RlYnVnPTEgaXMgc2V0LCBhbmQgdGhlIGVtcHR5CgkvLyBzdHJpbmcgb3RoZXJ3aXNlLCBzbyB0aGlzIGxpbmUgaXMgc2FmZSB0byBsZWF2ZSBpbiBhIGRlcGxveWVkIHJlYWxtLgoJYi5Xcml0ZVN0cmluZyhkZWJ1Zy5SZW5kZXIocGF0aCkpCgliLldyaXRlU3RyaW5nKGNvbmZpZy5Cb3R0b21CbG9ja0ZvcihyZWFsbVBhdGgpKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJIb21lKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgoJYi5Xcml0ZVN0cmluZyhtZC5IMigiTm90ZXMiKSkKCWIuV3JpdGVTdHJpbmcoIlxuIikKCS8vIHJlbmRlck5vdGVzIHJldHVybnMgbm8gdHJhaWxpbmcgbmV3bGluZSBvZiBpdHMgb3duOiBtZC5CdWxsZXRMaXN0IGFuZAoJLy8gdWkuRW1wdHkgYWxyZWFkeSBlbmQgaW4gb25lLCBhbmQgYWRkaW5nIGEgc2Vjb25kIGhlcmUgcHJvZHVjZWQgdHdvCgkvLyBjb25zZWN1dGl2ZSBibGFuayBsaW5lcywgd2hpY2ggZ25vIGNvbGxhcHNlcyBpbnNpZGUgYW4gLy8gT3V0cHV0OiBibG9jawoJLy8gYW5kIHdoaWNoIHRoZXJlZm9yZSBubyBleGFtcGxlIHRlc3QgY2FuIGV2ZXIgcGluLgoJYi5Xcml0ZVN0cmluZyhyZW5kZXJOb3RlcygpKQoJYi5Xcml0ZVN0cmluZygiXG4iKQoKCS8vIHR4bGluayBidWlsZHMgdGhlICJjYWxsIHRoaXMgZnVuY3Rpb24iIFVSTCBmb3IgdGhlIENVUlJFTlQgcmVhbG0sIHNvIGl0CgkvLyBrZWVwcyB3b3JraW5nIGFmdGVyIGEgdmVyc2lvbiBidW1wIHdpdGhvdXQgYW55dGhpbmcgaGVyZSBjaGFuZ2luZy4KCWIuV3JpdGVTdHJpbmcobWQuQnVsbGV0TGlzdChbXXN0cmluZ3sKCQltZC5MaW5rKCJhZGQgYSBub3RlIiwgdHhsaW5rLk5ld0xpbmsoIkFkZCIpLkFkZEFyZ3MoImJvZHkiLCAiaGVsbG8iKS5VUkwoKSksCgkJbWQuTGluaygiY2xlYXIgdGhlbSIsIHR4bGluay5DYWxsKCJSZXNldCIpKSwKCQltZC5MaW5rKCJsaXZlIGNoYWluIHZhbHVlcyIsICIvci9tb3VsL3gvYWxsaW5vbmUvZGV2dG9vbHMvdjA6Y2hhaW4iKSwKCQltZC5MaW5rKCJ0b2dnbGUgdGhlIGRlYnVnIHBhbmVsIiwgZGVidWcuVG9nZ2xlVVJMKHBhdGgpKSwKCX0pKQoJYi5Xcml0ZVN0cmluZygiXG4iKQoKCWIuV3JpdGVTdHJpbmcobWQuSDIoIldoYXQgZWFjaCBwYWNrYWdlIGRvZXMgaGVyZSIpKQoJYi5Xcml0ZVN0cmluZygiXG4iKQoJdCA6PSB1aS5OZXdUYWJsZSgicGFja2FnZSIsICJ3aGF0IGl0IGNvbnRyaWJ1dGVkIikKCXQuUm93KCJgci9tb3VsL2NvbmZpZ2AiLCAidGhlIG5vdGljZSBibG9jayBhYm92ZSwgdGhlIHBhdXNlIGd1YXJkIG9uIGBBZGRgLCBhbmQgd2hpY2ggZXhwbG9yZXIgdG8gbGluayIpCgl0LlJvdygiYHAvbW91bC9teWdub3NjYW5gIiwgInRoZSBleHBsb3JlciByb3V0ZXMsIHNvIGEgbGluayBzdXJ2aXZlcyBhIHJvdXRlIGNoYW5nZSIpCgl0LlJvdygiYHAvbW91bC9kZWJ1Z2AiLCAidGhlIGA/ZGVidWc9MWAgcGFuZWwsIGVtcHR5IG90aGVyd2lzZSIpCgl0LlJvdygiYHAvbW91bC9yZWFsbXBhdGhgIiwgInNwbGl0dGluZyB0aGUgcmVuZGVyIHBhdGggaW50byBhIHZpZXcgYW5kIGEgcXVlcnkiKQoJdC5Sb3coImBwL21vdWwva2l0L3VpYCIsICJlc2NhcGluZyBhIGNhbGxlcidzIG5vdGUsIGFuZCB0aGlzIHRhYmxlIikKCXQuUm93KCJgcC9tb3VsL21kYCIsICJldmVyeSBoZWFkaW5nLCBsaW5rIGFuZCBsaXN0IG9uIHRoZSBwYWdlIikKCXQuUm93KCJgcC9tb3VsL3R4bGlua2AiLCAidGhlIGNhbGwgbGlua3MgYWJvdmUsIHJlbGF0aXZlIHRvIHRoaXMgcmVhbG0iKQoJdC5Sb3coImBwL21vdWwvZmlmb2AiLCAidGhlIG5vdGUgbGlzdCwgYm91bmRlZCBzbyBzdG9yYWdlIGNhbm5vdCBncm93IGZvcmV2ZXIiKQoJYi5Xcml0ZVN0cmluZyh0LlN0cmluZygpKQoKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIHJlbmRlckNoYWluIGlzIGV2ZXJ5dGhpbmcgdGhhdCBtb3ZlczogdGhlIGhlaWdodCwgYW5kIHRoZSBsaW5rcyBidWlsdCBmcm9tCi8vIGl0LiBLZXB0IG9mZiB0aGUgcm9vdCB2aWV3IHNvIHRoZSByb290IGNhbiBiZSBwaW5uZWQgYnkgYW4gZXhhbXBsZS4KZnVuYyByZW5kZXJDaGFpbigpIHN0cmluZyB7CglzIDo9IGNvbmZpZy5TY2FubmVyKCkKCWggOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKG1kLkgyKCJMaXZlIikpCgliLldyaXRlU3RyaW5nKCJcbiIpCgoJdCA6PSB1aS5OZXdUYWJsZSgid2hhdCIsICJ2YWx1ZSIpCgl0LlJvdygiY2hhaW4gaWQiLCB1aS5DZWxsKHJ1bnRpbWUuQ2hhaW5JRCgpKSkKCXQuUm93KCJoZWlnaHQiLCBzdHJjb252LkZvcm1hdEludChoLCAxMCkpCgl0LlJvdygiZXhwbG9yZXIiLCB1aS5DZWxsKHMuQmFzZSgpKSkKCXQuUm93KCJuZXR3b3JrIiwgdWkuQ2VsbChzLk5ldHdvcmsoKSkpCgliLldyaXRlU3RyaW5nKHQuU3RyaW5nKCkpCgliLldyaXRlU3RyaW5nKCJcbiIpCgoJLy8gbXlnbm9zY2FuLkxpbmsgdXNlZCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdGhyb3VnaCBjb25maWcsIHRvIHNob3cgdGhhdAoJLy8gdGhlIGJ1aWxkZXIgaXMgYW4gb3JkaW5hcnkgdmFsdWU6IGNvbmZpZyBvbmx5IGRlY2lkZXMgd2hlcmUgaXQgcG9pbnRzLgoJYi5Xcml0ZVN0cmluZyhtZC5CdWxsZXRMaXN0KFtdc3RyaW5newoJCW15Z25vc2Nhbi5MaW5rKCJ0aGlzIGJsb2NrIiwgcy5CbG9jayhoKSksCgkJbXlnbm9zY2FuLkxpbmsoInRoaXMgcmVhbG0ncyB0cmFuc2FjdGlvbnMiLCBzLlJlYWxtKHJlYWxtUGF0aCwgbXlnbm9zY2FuLlRhYkNhbGxzKSksCgkJbXlnbm9zY2FuLkxpbmsoIml0cyBkZXBlbmRlbmN5IGdyYXBoIiwgcy5SZWFsbShyZWFsbVBhdGgsIG15Z25vc2Nhbi5UYWJEZXBzKSksCgkJbXlnbm9zY2FuLkxpbmsoInRoZSBwYXJrZWQgZGVwbG95IHF1ZXVlIiwgcy5QYWNrYWdlcyhteWdub3NjYW4uUGFja2FnZXNJbmVydCkpLAoJfSkpCgliLldyaXRlU3RyaW5nKCJcbiIpCgliLldyaXRlU3RyaW5nKG1kLkxpbmsoImJhY2siLCAiL3IvbW91bC94L2FsbGlub25lL2RldnRvb2xzL3YwIikpCgliLldyaXRlU3RyaW5nKCJcbiIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlck5vdGVzKCkgc3RyaW5nIHsKCWlmIG5vdGVzLlNpemUoKSA9PSAwIHsKCQlyZXR1cm4gdWkuRW1wdHkoIm5vIG5vdGVzIHlldCIpCgl9CglpdGVtcyA6PSBbXXN0cmluZ3t9Cglmb3IgXywgZSA6PSByYW5nZSBub3Rlcy5FbnRyaWVzKCkgewoJCWl0ZW1zID0gYXBwZW5kKGl0ZW1zLCBlLihzdHJpbmcpKQoJfQoJcmV0dXJuIG1kLkJ1bGxldExpc3QoaXRlbXMpCn0KGuUgChFkZXZ0b29sc190ZXN0LmdubxLPIHBhY2thZ2UgZGV2dG9vbHMKCmltcG9ydCAoCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9tb3VsL2ZpZm8vdjAiCgkiZ25vLmxhbmQvci9tb3VsL2NvbmZpZy92MSIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCi8vIHJlc2V0IHB1dHMgdGhlIHJlYWxtIGJhY2sgdG8gYSBqdXN0LWRlcGxveWVkIHN0YXRlLiBSZWFsbSBnbG9iYWxzIGxpdmUgZm9yCi8vIHRoZSB3aG9sZSB0ZXN0IGJpbmFyeSBhbmQgZ25vIHJ1bnMgZXZlcnkgRXhhbXBsZSBBRlRFUiBldmVyeSBUZXN0LCBzbyB3aXRob3V0Ci8vIHRoaXMgdGhlIHBpbm5lZCBvdXRwdXQgd291bGQgZGVwZW5kIG9uIHdoaWNoIHRlc3RzIHJhbiBiZWZvcmUgaXQuCmZ1bmMgcmVzZXQoKSB7IG5vdGVzID0gZmlmby5OZXcobWF4Tm90ZXMpIH0KCmZ1bmMgVGVzdEFkZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXQoKQoKCUFkZChjcm9zcyhjdXIpLCAiaGVsbG8iKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBub3Rlcy5TaXplKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICJoZWxsbyIsIG5vdGVzLkdldCgwKS4oc3RyaW5nKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImVtcHR5IG5vdGUiLCBmdW5jKCkgeyBBZGQoY3Jvc3MoY3VyKSwgIiAgICIpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vdGUgdG9vIGxvbmciLCBmdW5jKCkgewoJCWxvbmcgOj0gIiIKCQlmb3IgaSA6PSAwOyBpIDwgMjAxOyBpKysgewoJCQlsb25nICs9ICJ4IgoJCX0KCQlBZGQoY3Jvc3MoY3VyKSwgbG9uZykKCX0pCn0KCi8vIFRlc3RBZGRFc2NhcGVzIGlzIHRoZSBndWFyZCB0aGF0IG1hdHRlcnMgbW9zdCBpbiBhIHJlYWxtIGFueW9uZSBjYW4gd3JpdGUgdG86Ci8vIGEgbm90ZSBpcyBhIHN0cmluZyBhIGNhbGxlciB0eXBlZCwgYW5kIGl0IGxhbmRzIGluIGEgbWFya2Rvd24gbGlzdC4gV2l0aG91dAovLyB1aS5JbmxpbmUgdGhlIGZpcnN0IGxpbmUgYmVsb3cgd291bGQgY2xvc2UgdGhlIGxpc3QgaXRlbSBhbmQgcmVuZGVyIGFzIGEKLy8gaGVhZGluZywgYW5kIHRoZSBzZWNvbmQgd291bGQgYmVjb21lIGEgbGluay4KZnVuYyBUZXN0QWRkRXNjYXBlcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXQoKQoKCUFkZChjcm9zcyhjdXIpLCAiIyBub3QgYSBoZWFkaW5nIikKCUFkZChjcm9zcyhjdXIpLCAiW25vdF0oaHR0cHM6Ly9ldmlsLmV4YW1wbGUuY29tKSIpCgoJZm9yIF8sIGdvdCA6PSByYW5nZSBbXXN0cmluZ3tub3Rlcy5HZXQoMCkuKHN0cmluZyksIG5vdGVzLkdldCgxKS4oc3RyaW5nKX0gewoJCXVhc3NlcnQuRmFsc2UodCwgZ290ID09ICIjIG5vdCBhIGhlYWRpbmciLCAibWFya2Rvd24gc3Vydml2ZWQgdW5lc2NhcGVkIikKCQl1YXNzZXJ0LkZhbHNlKHQsIGdvdCA9PSAiW25vdF0oaHR0cHM6Ly9ldmlsLmV4YW1wbGUuY29tKSIsICJhIGxpbmsgc3Vydml2ZWQgdW5lc2NhcGVkIikKCX0KCXVhc3NlcnQuVHJ1ZSh0LCBsZW4obm90ZXMuR2V0KDApLihzdHJpbmcpKSA+IGxlbigiIyBub3QgYSBoZWFkaW5nIiksCgkJImVzY2FwaW5nIHNob3VsZCBoYXZlIGFkZGVkIGNoYXJhY3RlcnMiKQp9CgovLyBUZXN0Tm90ZXNBcmVCb3VuZGVkIHBpbnMgdGhlIHJlYXNvbiBmaWZvIGlzIGhlcmUgcmF0aGVyIHRoYW4gYSBzbGljZTogc3RvcmFnZQovLyBpcyBwYWlkIGZvciBhbmQgbmV2ZXIgcmVmdW5kZWQsIHNvIGEgbGlzdCBhbnlvbmUgY2FuIGFwcGVuZCB0byBuZWVkcyBhCi8vIGNlaWxpbmcgaW4gdGhlIHR5cGUsIG5vdCBpbiBhIGNvbW1lbnQuCmZ1bmMgVGVzdE5vdGVzQXJlQm91bmRlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXQoKQoKCWZvciBpIDo9IDA7IGkgPCBtYXhOb3Rlcys1OyBpKysgewoJCUFkZChjcm9zcyhjdXIpLCAibm90ZSAiK3N0cmluZyhydW5lKCdhJytpKSkpCgl9Cgl1YXNzZXJ0LkVxdWFsKHQsIG1heE5vdGVzLCBub3Rlcy5TaXplKCksICJ0aGUgbGlzdCBzdG9wcyBncm93aW5nIGF0IG1heE5vdGVzIikKCXVhc3NlcnQuRXF1YWwodCwgbWF4Tm90ZXMsIG5vdGVzLk1heFNpemUoKSkKfQoKLy8gVGVzdEFkZEhvbm91cnNUaGVQYXVzZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgaW1wb3J0aW5nIHIvbW91bC9jb25maWc6IHRoaXMKLy8gcmVhbG0gY2FuIGJlIHN0b3BwZWQgZnJvbSBvdXRzaWRlLCBieSBhIHRyYW5zYWN0aW9uIGFnYWluc3QgYW5vdGhlciByZWFsbSwKLy8gd2l0aCBubyByZWRlcGxveSBoZXJlLiBJdCBjYW5ub3Qgc2V0IHRoYXQgZnJvbSB0aGlzIHBhY2thZ2UgKGNvbmZpZyBoYXMgaXRzCi8vIG93biBhdXRob3JpdHkpLCBzbyBpdCBhc3NlcnRzIHRoZSB3aXJpbmc6IEFkZCBnb2VzIHRocm91Z2ggdGhlIHBhdXNlIGNoZWNrCi8vIGFuZCBwYXNzZXMgd2hpbGUgbm90aGluZyBpcyBzZXQuCmZ1bmMgVGVzdEFkZEhvbm91cnNUaGVQYXVzZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXQoKQoJdWFzc2VydC5GYWxzZSh0LCBjb25maWcuSXNQYXVzZWRGb3IocmVhbG1QYXRoKSwgIm5vdGhpbmcgY29uZmlndXJlZCBtZWFucyBydW5uaW5nIikKCUFkZChjcm9zcyhjdXIpLCAiYWxsb3dlZCB3aGlsZSBydW5uaW5nIikKCXVhc3NlcnQuRXF1YWwodCwgMSwgbm90ZXMuU2l6ZSgpKQp9CgpmdW5jIFRlc3RSZXNldChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXQoKQoJQWRkKGNyb3NzKGN1ciksICJvbmUiKQoJUmVzZXQoY3Jvc3MoY3VyKSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgbm90ZXMuU2l6ZSgpKQp9CgovLyBFeGFtcGxlUmVuZGVyIHBpbnMgdGhlIHJvb3Qgdmlldy4gSXQgaXMgZnJlZSBvZiB0aGUgaGVpZ2h0IGFuZCB0aGUgY2hhaW4gaWQKLy8gb24gcHVycG9zZTogdGhvc2UgbGl2ZSB1bmRlciA6Y2hhaW4sIHNvIHRoaXMgb25lIGlzIHN0YWJsZS4KZnVuYyBFeGFtcGxlUmVuZGVyKCkgewoJcmVzZXQoKQoJcHJpbnQoUmVuZGVyKCIiKSkKCS8vIE91dHB1dDoKCS8vICMgYWxsaW5vbmU6IGRldnRvb2xzCgkvLwoJLy8gRWlnaHQgcGFja2FnZXMsIHVzZWQgdG9nZXRoZXIgcmF0aGVyIHRoYW4gb25lIGF0IGEgdGltZS4gW3NvdXJjZV0oaHR0cHM6Ly9teWdub3NjYW4ubW91bC5wMnAudGVhbS9yZWFsbS9yL21vdWwveC9hbGxpbm9uZS9kZXZ0b29scy92MCkKCS8vCgkvLyAjIyBOb3RlcwoJLy8KCS8vICpubyBub3RlcyB5ZXQqCgkvLwoJLy8gLSBbYWRkIGEgbm90ZV0oL3IvbW91bC94L2FsbGlub25lL2RldnRvb2xzL3YwJGhlbHAmZnVuYz1BZGQmYm9keT1oZWxsbykKCS8vIC0gW2NsZWFyIHRoZW1dKC9yL21vdWwveC9hbGxpbm9uZS9kZXZ0b29scy92MCRoZWxwJmZ1bmM9UmVzZXQpCgkvLyAtIFtsaXZlIGNoYWluIHZhbHVlc10oL3IvbW91bC94L2FsbGlub25lL2RldnRvb2xzL3YwOmNoYWluKQoJLy8gLSBbdG9nZ2xlIHRoZSBkZWJ1ZyBwYW5lbF0oL3IvbW91bC94L2FsbGlub25lL2RldnRvb2xzL3YwOj9kZWJ1Zz0xKQoJLy8KCS8vICMjIFdoYXQgZWFjaCBwYWNrYWdlIGRvZXMgaGVyZQoJLy8KCS8vIHwgcGFja2FnZSB8IHdoYXQgaXQgY29udHJpYnV0ZWQgfAoJLy8gfCAtLS0gfCAtLS0gfAoJLy8gfCBgci9tb3VsL2NvbmZpZ2AgfCB0aGUgbm90aWNlIGJsb2NrIGFib3ZlLCB0aGUgcGF1c2UgZ3VhcmQgb24gYEFkZGAsIGFuZCB3aGljaCBleHBsb3JlciB0byBsaW5rIHwKCS8vIHwgYHAvbW91bC9teWdub3NjYW5gIHwgdGhlIGV4cGxvcmVyIHJvdXRlcywgc28gYSBsaW5rIHN1cnZpdmVzIGEgcm91dGUgY2hhbmdlIHwKCS8vIHwgYHAvbW91bC9kZWJ1Z2AgfCB0aGUgYD9kZWJ1Zz0xYCBwYW5lbCwgZW1wdHkgb3RoZXJ3aXNlIHwKCS8vIHwgYHAvbW91bC9yZWFsbXBhdGhgIHwgc3BsaXR0aW5nIHRoZSByZW5kZXIgcGF0aCBpbnRvIGEgdmlldyBhbmQgYSBxdWVyeSB8CgkvLyB8IGBwL21vdWwva2l0L3VpYCB8IGVzY2FwaW5nIGEgY2FsbGVyJ3Mgbm90ZSwgYW5kIHRoaXMgdGFibGUgfAoJLy8gfCBgcC9tb3VsL21kYCB8IGV2ZXJ5IGhlYWRpbmcsIGxpbmsgYW5kIGxpc3Qgb24gdGhlIHBhZ2UgfAoJLy8gfCBgcC9tb3VsL3R4bGlua2AgfCB0aGUgY2FsbCBsaW5rcyBhYm92ZSwgcmVsYXRpdmUgdG8gdGhpcyByZWFsbSB8CgkvLyB8IGBwL21vdWwvZmlmb2AgfCB0aGUgbm90ZSBsaXN0LCBib3VuZGVkIHNvIHN0b3JhZ2UgY2Fubm90IGdyb3cgZm9yZXZlciB8Cn0KGsoCCgtnbm9tb2QudG9tbBK6Am1vZHVsZSA9ICJnbm8ubGFuZC9yL21vdWwveC9hbGxpbm9uZS9kZXZ0b29scy92MCIKZ25vID0gIjAuOSIKCiMgUmVkZXBsb3lhYmxlIGJ5IGl0cyBjcmVhdG9yLiBBIGRlbW8ncyBzdGF0ZSBpcyBkaXNwb3NhYmxlIGJ5IGRlc2lnbjogaXRzIHdob2xlCiMgam9iIGlzIHRvIGJlIHJlZGVwbG95ZWQgd2hlbmV2ZXIgb25lIG9mIHRoZSBwYWNrYWdlcyBpdCBzaG93cyBvZmYgY2hhbmdlcywgc28KIyBsb3NpbmcgdGhlIG5vdGVzIHBlb3BsZSBsZWZ0IGlzIHRoZSBpbnRlbmRlZCB0cmFkZSByYXRoZXIgdGhhbiBhIHJlZ3JldC4KcHJpdmF0ZSA9IHRydWUKIgw2MDAwMDAwdWdub3QK+G0KDC92bS5tX2FkZHBrZxLnbQooZzFtYW5mcmVkNDdremR1ZWM5MjB6ODh3ZnI2NHlsa3NtZGNlZGxmNRKsbQoHdGV4dGxhYhIlZ25vLmxhbmQvci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYi92MBrEEwoJUkVBRE1FLm1kErYTIyBgZ25vLmxhbmQvci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYmAKCkV2ZXJ5IHN0cmluZyBhbGdvcml0aG0gaW4gYHAvbW91bGAgb3ZlciBvbmUgaW5wdXQgYXQgb25jZSwgc28gdGhleSBjYW4gYmUKY29tcGFyZWQgaW5zdGVhZCBvZiByZWFkIGFib3V0IG9uZSBhdCBhIHRpbWUuCgpgYGAKL3IvbW91bC94L2FsbGlub25lL3RleHRsYWIvdjA6a25pZ2h0ICAgICAgICBvbmUgd29yZAovci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYi92MDprbmlnaHQvbmlnaHQgIGNvbXBhcmVkIHdpdGggYW5vdGhlcgovci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYi92MDoxOTg3ICAgICAgICAgIHJlYWQgYXMgYSByb21hbiBudW1lcmFsCmBgYAoKRWlnaHQgcGFja2FnZXM6IGBzb3VuZGV4YCwgYGxldmVuc2h0ZWluYCwgYHJvdDEzYCwgYHBpZ2xhdGluYCwgYHJvbWFubnVtYCwKcGx1cyBga2l0L3VpYCwgYG1kYCwgYHJlYWxtcGF0aGAgYW5kIGByL21vdWwvY29uZmlnYC4KCiMjIFdoYXQgdGhlIGNvbWJpbmF0aW9uIHNob3dzCgpzb3VuZGV4IGFuZCBsZXZlbnNodGVpbiBib3RoIGNsYWltIHRvIHRlbGwgeW91IHdoZXRoZXIgdHdvIHdvcmRzIGFyZSBhbGlrZSwgYW5kCnRoZXkgYXJlIG1lYXN1cmluZyBkaWZmZXJlbnQgdGhpbmdzLiBzb3VuZGV4IGtleXMgb24gdGhlICoqZmlyc3QgbGV0dGVyKiogYW5kCnRoZW4gb24gY29uc29uYW50IGNsYXNzZXMsIHNvIGl0IGlzIGJsaW5kIHRvIGhvdyB0aGUgcmVzdCBpcyBzcGVsbGVkLgpsZXZlbnNodGVpbiBjb3VudHMgZWRpdHMgYW5kIGlzIGJsaW5kIHRvIGhvdyBpdCBzb3VuZHMuCgp8IHBhaXIgfCBzb3VuZGV4IHwgbGV2ZW5zaHRlaW4gfAp8LS0tfC0tLXwtLS18CnwgYGtuaWdodGAgLyBgbmlnaHRgIHwgSzUyMyB2cyBOMjMwLCAqKnVucmVsYXRlZCoqIHwgMSBlZGl0LCA4MyUgc2ltaWxhciB8CnwgYHJvYmVydGAgLyBgcnVwZXJ0YCB8IFIxNjMgdnMgUjE2MywgKippZGVudGljYWwqKiB8IDIgZWRpdHMsIDY3JSBzaW1pbGFyIHwKClRoZSBmaXJzdCBpcyB0aGUgY2xlYW4gY2FzZTogb25lIGVkaXQgYXBhcnQsIGFuZCB5ZXQgc291bmRleCBzYXlzIG5vLCBiZWNhdXNlCnRoZSBzaWxlbnQgSyBjaGFuZ2VzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGNvZGUuIE1lYXN1cmVkIDIwMjYtMDktMjMKYWdhaW5zdCB0aGUgcGFja2FnZXMgaW4gdGhpcyB0cmVlIGFuZCBwaW5uZWQgYnkgYFRlc3RUaGVEaXNhZ3JlZW1lbnRgLCBzbyB0aGUKcGFnZSBjYW5ub3Qgc3RhcnQgc2F5aW5nIHNvbWV0aGluZyBmYWxzZSB3aXRob3V0IHRoZSBzdWl0ZSBnb2luZyByZWQuCgojIyBPbmUgZGVmZWN0IHdvcnRoIGtlZXBpbmcgaW4gbWluZAoKYHJvbWFubnVtLkZyb21Sb21hbmAgKipwYW5pY3MqKiBvbiBhIHN0cmluZyB0aGF0IGlzIG5vdCBhIHJvbWFuIG51bWVyYWwgcmF0aGVyCnRoYW4gcmV0dXJuaW5nIHplcm8uIFRoZSBpbnB1dCBoZXJlIGNvbWVzIG91dCBvZiBhIFVSTCwgc28gaXQgaXMgc2NyZWVuZWQgYnkKYGlzUm9tYW5OdW1lcmFsYCBmaXJzdC4gV2l0aG91dCB0aGF0IHNjcmVlbiB0aGUgZGVmYXVsdCB2aWV3IGFib3J0ZWQsIGJlY2F1c2UKYGtuaWdodGAgaXMgbm90IGEgcm9tYW4gbnVtZXJhbCBhbmQgbmVpdGhlciBpcyBtb3N0IG9mIHdoYXQgYW55b25lIHdvdWxkIHR5cGUuCgpObyBzdGF0ZSBhdCBhbGw6IHRoZSBpbnB1dCBjb21lcyBmcm9tIHRoZSByZW5kZXIgcGF0aCBhbmQgbm90aGluZyBpcyBzdG9yZWQuCgo8IS0tIEJFR0lOIEdOT0NPTlRSQUNUUyBGT09URVIgKGdlbmVyYXRlZCBieSBgbWFrZSByZWFkbWVzYDsgZG8gbm90IGVkaXQgYmVsb3cpIC0tPgoKLS0tCgpQYXJ0IG9mICoqW21vdWwvZ25vLWNvbnRyYWN0c10oaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cykqKiDigJQgbW91bCdzIHZlcnNpb25lZCBnbm8ubGFuZCBjb250cmFjdHMuIFNlZSB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIGZ1bGwgY2F0YWxvZywgYnVpbGQvdGVzdCB0b29saW5nLCBhbmQgdXNhZ2UuCgoqKkRlcGVuZGVuY3kgZ3JhcGg6KioKCiFbZ25vLmxhbmQvci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYi92MCBkZXBlbmRlbmN5IGdyYXBoXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW91bC9nbm8tY29udHJhY3RzL21haW4vX2Fzc2V0cy9nbm8ubGFuZC9yL21vdWwveC9hbGxpbm9uZS90ZXh0bGFiL3YwL2RlcHMucG5nKQoKPiDwn6eqICoqSGlnaGx5IGV4cGVyaW1lbnRhbCDigJQgcG90ZW50aWFsbHkgdmliZS1jb2RlZC4qKiBOb3QgYXVkaXRlZDsgbWF5IGJyZWFrLCBjaGFuZ2UsIG9yIGJlIHJlbW92ZWQgYXQgYW55IHRpbWUuIERvIG5vdCB1c2Ugd2l0aCBhbnl0aGluZyBvZiB2YWx1ZS4gRnVsbCBkaXNjbGFpbWVyOiBbRElTQ0xBSU1FUl0oaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9ibG9iL21haW4vRElTQ0xBSU1FUi5tZCkuCgo8IS0tIEVORCBHTk9DT05UUkFDVFMgRk9PVEVSIC0tPgoa+QEKC2dub21vZC50b21sEukBbW9kdWxlID0gImduby5sYW5kL3IvbW91bC94L2FsbGlub25lL3RleHRsYWIvdjAiCmdubyA9ICIwLjkiCgojIFJlZGVwbG95YWJsZSBieSBpdHMgY3JlYXRvci4gVGhpcyByZWFsbSBob2xkcyBubyBzdGF0ZSB3b3J0aCBrZWVwaW5nOiBpdCBydW5zCiMgYWxnb3JpdGhtcyBvdmVyIGEgc3RyaW5nIGluIHRoZSByZW5kZXIgcGF0aCwgc28gYSByZWRlcGxveSBsb3NlcyBub3RoaW5nLgpwcml2YXRlID0gdHJ1ZQoaiDAKC3RleHRsYWIuZ25vEvgvLy8gUGFja2FnZSB0ZXh0bGFiIHJ1bnMgZXZlcnkgc3RyaW5nIGFsZ29yaXRobSBpbiBwL21vdWwgb3ZlciBvbmUgaW5wdXQgYXQKLy8gb25jZSwgc28gdGhleSBjYW4gYmUgY29tcGFyZWQgcmF0aGVyIHRoYW4gcmVhZCBhYm91dCBvbmUgYXQgYSB0aW1lLgovLwovLyBFYWNoIG9mIHRoZXNlIGhhcyBpdHMgb3duIGRlbW8gcmVhbG0gc2hvd2luZyBpdCBhbG9uZS4gV2hhdCBub25lIG9mIHRob3NlIGNhbgovLyBzaG93IGlzIGhvdyB0aGUgYW5zd2VycyBkaWZmZXIgZm9yIHRoZSBTQU1FIHdvcmQsIHdoaWNoIGlzIHRoZSBvbmx5IHF1ZXN0aW9uCi8vIGEgcmVhZGVyIGFjdHVhbGx5IGhhczogc291bmRleCBhbmQgbGV2ZW5zaHRlaW4gYm90aCBjbGFpbSB0byB0ZWxsIHlvdSB3aGV0aGVyCi8vIHR3byB3b3JkcyBhcmUgYWxpa2UsIGFuZCB0aGV5IGFyZSBtZWFzdXJpbmcgZGlmZmVyZW50IHRoaW5ncy4KLy8KLy8gc291bmRleCBrZXlzIG9uIHRoZSBGSVJTVCBMRVRURVIgYW5kIHRoZW4gb24gY29uc29uYW50IGNsYXNzZXMsIHNvIGl0IGlzCi8vIGJsaW5kIHRvIGhvdyB0aGUgcmVzdCBpcyBzcGVsbGVkLiBsZXZlbnNodGVpbiBjb3VudHMgZWRpdHMgYW5kIGlzIGJsaW5kIHRvCi8vIGhvdyBpdCBzb3VuZHMuICJrbmlnaHQiIGFuZCAibmlnaHQiIGFyZSB0aGUgY2xlYW4gY2FzZTogb25lIGVkaXQgYXBhcnQgKDgzJQovLyBzaW1pbGFyKSBhbmQgeWV0IHNvdW5kZXggY2FsbHMgdGhlbSB1bnJlbGF0ZWQsIEs1MjMgYWdhaW5zdCBOMjMwLCBiZWNhdXNlCi8vIHRoZSBzaWxlbnQgSyBjaGFuZ2VzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGNvZGUuICJyb2JlcnQiIGFuZCAicnVwZXJ0IgovLyBnbyB0aGUgb3RoZXIgd2F5LCBpZGVudGljYWwgY29kZXMgYXQgdHdvIGVkaXRzIGFwYXJ0LiBNZWFzdXJlZCAyMDI2LTA5LTIzCi8vIGFnYWluc3QgdGhlIHBhY2thZ2VzIGluIHRoaXMgdHJlZSwgbm90IHF1b3RlZCBmcm9tIGEgdGV4dGJvb2suCi8vCi8vCS9yL21vdWwveC9hbGxpbm9uZS90ZXh0bGFiL3YwOmtuaWdodAovLwkvci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYi92MDprbmlnaHQvbmlnaHQgICBjb21wYXJlcyB0d28KLy8KLy8gRWlnaHQgcGFja2FnZXMsIG5vIHN0YXRlLCBub3RoaW5nIHRvIHJlZGVwbG95IGNhcmVmdWxseTogdGhlIGlucHV0IGNvbWVzIG91dAovLyBvZiB0aGUgcmVuZGVyIHBhdGggYW5kIG5vdGhpbmcgaXMgc3RvcmVkLgpwYWNrYWdlIHRleHRsYWIKCmltcG9ydCAoCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL21vdWwva2l0L3VpL3YwIgoJImduby5sYW5kL3AvbW91bC9tZC92MCIKCSJnbm8ubGFuZC9wL21vdWwvcmVhbG1wYXRoL3YwIgoJImduby5sYW5kL3AvbW91bC94L2RhaWx5L2xldmVuc2h0ZWluL3YwIgoJImduby5sYW5kL3AvbW91bC94L2RhaWx5L3BpZ2xhdGluL3YwIgoJImduby5sYW5kL3AvbW91bC94L2RhaWx5L3JvbWFubnVtL3YwIgoJImduby5sYW5kL3AvbW91bC94L2RhaWx5L3JvdDEzL3YwIgoJImduby5sYW5kL3AvbW91bC94L2RhaWx5L3NvdW5kZXgvdjAiCgkiZ25vLmxhbmQvci9tb3VsL2NvbmZpZy92MSIKKQoKY29uc3QgcmVhbG1QYXRoID0gImduby5sYW5kL3IvbW91bC94L2FsbGlub25lL3RleHRsYWIvdjAiCgovLyBtYXhJbnB1dCBib3VuZHMgd2hhdCBhIHJlbmRlciBwYXRoIGNhbiBjYXJyeSBpbnRvIHRoZSBhbGdvcml0aG1zIGJlbG93LgovLyBsZXZlbnNodGVpbi5NYXRyaXggaXMgTyhsZW4oYSkgKiBsZW4oYikpLCBzbyBhbiB1bmJvdW5kZWQgcGFpciBvZiBpbnB1dHMgaXMKLy8gYSB3YXkgdG8gbWFrZSBhIHF1ZXJ5IGV4cGVuc2l2ZSBmb3Igd2hvZXZlciBzZXJ2ZXMgaXQuCmNvbnN0IG1heElucHV0ID0gNjQKCi8vIGRlZmF1bHRXb3JkIGlzIHdoYXQgdGhlIHJvb3QgdmlldyBkZW1vbnN0cmF0ZXMsIGNob3NlbiBiZWNhdXNlIGl0IGlzIHRoZQovLyB0ZXh0Ym9vayBjYXNlIHdoZXJlIHRoZSB0d28gc2ltaWxhcml0eSBtZWFzdXJlcyBkaXNhZ3JlZTogImtuaWdodCIgYW5kCi8vICJuaWdodCIgc291bmQgaWRlbnRpY2FsIHRvIHNvdW5kZXggYW5kIGFyZSBvbmUgZWRpdCBhcGFydC4KY29uc3QgZGVmYXVsdFdvcmQgPSAia25pZ2h0IgoKLy8gUmVuZGVyIHRha2VzIGl0cyBpbnB1dCBmcm9tIHRoZSBwYXRoOiBvbmUgd29yZCwgb3IgdHdvIHNlcGFyYXRlZCBieSAiLyIuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcmVxIDo9IHJlYWxtcGF0aC5QYXJzZShwYXRoKQoKCWEgOj0gc3RyaW5ncy5UcmltU3BhY2UocmVxLlBhdGhQYXJ0KDApKQoJYiA6PSBzdHJpbmdzLlRyaW1TcGFjZShyZXEuUGF0aFBhcnQoMSkpCglpZiBhID09ICIiIHsKCQlhID0gZGVmYXVsdFdvcmQKCX0KCgl2YXIgb3V0IHN0cmluZ3MuQnVpbGRlcgoJb3V0LldyaXRlU3RyaW5nKGNvbmZpZy5Ub3BCbG9ja0ZvcihyZWFsbVBhdGgpKQoJb3V0LldyaXRlU3RyaW5nKG1kLkgxKCJhbGxpbm9uZTogdGV4dGxhYiIpKQoJb3V0LldyaXRlU3RyaW5nKCJcbkVpZ2h0IHBhY2thZ2VzIG92ZXIgb25lIGlucHV0LiAiKQoJb3V0LldyaXRlU3RyaW5nKG1kLkxpbmsoInNvdXJjZSIsIGNvbmZpZy5NeWdub3NjYW5Gb3IocmVhbG1QYXRoKSkpCglvdXQuV3JpdGVTdHJpbmcoIlxuXG4iKQoKCWlmIHRvb0xvbmcoYSkgfHwgdG9vTG9uZyhiKSB7CgkJb3V0LldyaXRlU3RyaW5nKHVpLkVtcHR5KCJpbnB1dCB0b28gbG9uZzogbWF4ICIgKyBzdHJjb252Lkl0b2EobWF4SW5wdXQpICsgIiBieXRlcyIpKQoJCW91dC5Xcml0ZVN0cmluZygiXG4iKQoJCW91dC5Xcml0ZVN0cmluZyhjb25maWcuQm90dG9tQmxvY2tGb3IocmVhbG1QYXRoKSkKCQlyZXR1cm4gb3V0LlN0cmluZygpCgl9CgoJb3V0LldyaXRlU3RyaW5nKHJlbmRlck9uZShhKSkKCWlmIGIgIT0gIiIgewoJCW91dC5Xcml0ZVN0cmluZygiXG4iKQoJCW91dC5Xcml0ZVN0cmluZyhyZW5kZXJQYWlyKGEsIGIpKQoJfSBlbHNlIHsKCQlvdXQuV3JpdGVTdHJpbmcoIlxuIikKCQlvdXQuV3JpdGVTdHJpbmcocmVuZGVyVHJ5KCkpCgl9CgoJb3V0LldyaXRlU3RyaW5nKGNvbmZpZy5Cb3R0b21CbG9ja0ZvcihyZWFsbVBhdGgpKQoJcmV0dXJuIG91dC5TdHJpbmcoKQp9CgpmdW5jIHRvb0xvbmcocyBzdHJpbmcpIGJvb2wgeyByZXR1cm4gbGVuKHMpID4gbWF4SW5wdXQgfQoKLy8gcmVuZGVyT25lIGlzIGV2ZXJ5IHNpbmdsZS1pbnB1dCBhbGdvcml0aG0sIG9uZSByb3cgZWFjaC4KLy8KLy8gdWkuQ2VsbCwgbm90IHVpLklubGluZTogdGhlc2UgbGFuZCBpbiB0YWJsZSBjZWxscywgd2hlcmUgYW4gdW5lc2NhcGVkIHBpcGUKLy8gd291bGQgc2lsZW50bHkgZWF0IGEgY29sdW1uLiBUaGUgaW5wdXQgaXMgd2hhdGV2ZXIgc29tZW9uZSBwdXQgaW4gYSBVUkwuCmZ1bmMgcmVuZGVyT25lKHdvcmQgc3RyaW5nKSBzdHJpbmcgewoJdCA6PSB1aS5OZXdUYWJsZSgicGFja2FnZSIsICJhbnN3ZXIiKQoJdC5Sb3coImB4L2RhaWx5L3NvdW5kZXhgIiwgdWkuQ2VsbChzb3VuZGV4LkVuY29kZSh3b3JkKSkpCgl0LlJvdygiYHgvZGFpbHkvcm90MTNgIiwgdWkuQ2VsbChyb3QxMy5Sb3QxMyh3b3JkKSkpCgl0LlJvdygiYHgvZGFpbHkvcGlnbGF0aW5gIiwgdWkuQ2VsbChwaWdsYXRpbi5UcmFuc2xhdGUod29yZCkpKQoJdC5Sb3coImB4L2RhaWx5L3JvbWFubnVtYCIsIHVpLkNlbGwocm9tYW5PZih3b3JkKSkpCgoJcmV0dXJuIG1kLkgyKCJJbnB1dDogIit1aS5JbmxpbmUod29yZCkpICsgIlxuIiArIHQuU3RyaW5nKCkKfQoKLy8gcm9tYW5PZiBzaG93cyB0aGUgcm91bmQgdHJpcCBib3RoIHdheXMsIGJlY2F1c2Ugcm9tYW5udW0gaXMgdGhlIG9uZSBwYWNrYWdlCi8vIGhlcmUgd2hvc2UgaW5wdXQgaXMgYSBudW1iZXIgcmF0aGVyIHRoYW4gYSB3b3JkLgovLwovLyBGcm9tUm9tYW4gUEFOSUNTIG9uIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgcm9tYW4gbnVtZXJhbCByYXRoZXIgdGhhbgovLyByZXR1cm5pbmcgemVybywgYW5kIHRoZSBpbnB1dCBoZXJlIGNvbWVzIG91dCBvZiBhIFVSTCwgc28gaXQgaXMgc2NyZWVuZWQKLy8gZmlyc3QuIFdpdGhvdXQgdGhhdCBzY3JlZW4gdGhlIERFRkFVTFQgdmlldyBhYm9ydHM6ICJrbmlnaHQiIGlzIG5vdCBhIHJvbWFuCi8vIG51bWVyYWwsIGFuZCBuZWl0aGVyIGlzIG1vc3Qgb2Ygd2hhdCBhbnlvbmUgd291bGQgdHlwZS4KZnVuYyByb21hbk9mKHdvcmQgc3RyaW5nKSBzdHJpbmcgewoJaWYgbiwgZXJyIDo9IHN0cmNvbnYuQXRvaSh3b3JkKTsgZXJyID09IG5pbCB7CgkJaWYgbiA8PSAwIHx8IG4gPiAzOTk5IHsKCQkJcmV0dXJuICJvdXQgb2YgcmFuZ2UgKDEuLjM5OTkpIgoJCX0KCQlyZXR1cm4gcm9tYW5udW0uVG9Sb21hbihuKQoJfQoJdXBwZXIgOj0gc3RyaW5ncy5Ub1VwcGVyKHdvcmQpCglpZiAhaXNSb21hbk51bWVyYWwodXBwZXIpIHsKCQlyZXR1cm4gIm5vdCBhIG51bWJlciIKCX0KCWlmIG4gOj0gcm9tYW5udW0uRnJvbVJvbWFuKHVwcGVyKTsgbiA+IDAgewoJCXJldHVybiBzdHJjb252Lkl0b2EobikgKyAiIChyZWFkIGFzIHJvbWFuKSIKCX0KCXJldHVybiAibm90IGEgbnVtYmVyIgp9CgovLyBpc1JvbWFuTnVtZXJhbCByZXBvcnRzIHdoZXRoZXIgZXZlcnkgYnl0ZSBpcyBhIHJvbWFuIGRpZ2l0LiBJdCBpcyBhIHNjcmVlbgovLyBmb3Igcm9tYW5PZiwgbm90IGEgdmFsaWRpdHkgY2hlY2s6ICJJSUlJIiBwYXNzZXMgaGVyZSBhbmQgRnJvbVJvbWFuIGRlY2lkZXMuCmZ1bmMgaXNSb21hbk51bWVyYWwocyBzdHJpbmcpIGJvb2wgewoJaWYgcyA9PSAiIiB7CgkJcmV0dXJuIGZhbHNlCgl9Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHMpOyBpKysgewoJCXN3aXRjaCBzW2ldIHsKCQljYXNlICdJJywgJ1YnLCAnWCcsICdMJywgJ0MnLCAnRCcsICdNJzoKCQlkZWZhdWx0OgoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgovLyByZW5kZXJQYWlyIGlzIHRoZSBjb21wYXJpc29uLCBhbmQgdGhlIHJlYXNvbiB0aGlzIHJlYWxtIGV4aXN0czogdGhlIHR3bwovLyBzaW1pbGFyaXR5IG1lYXN1cmVzIGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zLCBhbmQgYSByZWFkZXIgc2hvdWxkIHdhdGNoCi8vIHRoZW0gZGlzYWdyZWUgcmF0aGVyIHRoYW4gYmUgdG9sZCB0aGV5IG1pZ2h0LgpmdW5jIHJlbmRlclBhaXIoYSwgYiBzdHJpbmcpIHN0cmluZyB7CglzYSwgc2IgOj0gc291bmRleC5FbmNvZGUoYSksIHNvdW5kZXguRW5jb2RlKGIpCgoJdCA6PSB1aS5OZXdUYWJsZSgibWVhc3VyZSIsICJhbnN3ZXIiKQoJdC5Sb3coImBzb3VuZGV4YCBvZiAiK3VpLkNlbGwoYSksIHVpLkNlbGwoc2EpKQoJdC5Sb3coImBzb3VuZGV4YCBvZiAiK3VpLkNlbGwoYiksIHVpLkNlbGwoc2IpKQoJdC5Sb3coInNvdW5kIGFsaWtlIiwgeWVzTm8oc291bmRleC5NYXRjaChhLCBiKSkpCgl0LlJvdygiYGxldmVuc2h0ZWluYCBkaXN0YW5jZSIsIHN0cmNvbnYuSXRvYShsZXZlbnNodGVpbi5EaXN0YW5jZShhLCBiKSkpCgl0LlJvdygiYGxldmVuc2h0ZWluYCBzaW1pbGFyaXR5Iiwgc3RyY29udi5JdG9hKGxldmVuc2h0ZWluLlNpbWlsYXJpdHkoYSwgYikpKyIlIikKCglyZXR1cm4gbWQuSDIoIkNvbXBhcmVkIHdpdGggIit1aS5JbmxpbmUoYikpICsgIlxuIiArIHQuU3RyaW5nKCkKfQoKZnVuYyB5ZXNObyhiIGJvb2wpIHN0cmluZyB7CglpZiBiIHsKCQlyZXR1cm4gInllcyIKCX0KCXJldHVybiAibm8iCn0KCmZ1bmMgcmVuZGVyVHJ5KCkgc3RyaW5nIHsKCXJldHVybiBtZC5IMigiVHJ5IHR3byIpICsgIlxuIiArCgkJbWQuQnVsbGV0TGlzdChbXXN0cmluZ3sKCQkJbWQuTGluaygia25pZ2h0IHZzIG5pZ2h0IiwgIi9yL21vdWwveC9hbGxpbm9uZS90ZXh0bGFiL3YwOmtuaWdodC9uaWdodCIpICsKCQkJCSIgKG9uZSBlZGl0IGFwYXJ0LCB5ZXQgc291bmRleCBzYXlzIHVucmVsYXRlZCkiLAoJCQltZC5MaW5rKCJyb2JlcnQgdnMgcnVwZXJ0IiwgIi9yL21vdWwveC9hbGxpbm9uZS90ZXh0bGFiL3YwOnJvYmVydC9ydXBlcnQiKSArCgkJCQkiICh0d28gZWRpdHMgYXBhcnQsIHlldCBzb3VuZGV4IHNheXMgaWRlbnRpY2FsKSIsCgkJCW1kLkxpbmsoIjE5ODcgYXMgYSByb21hbiBudW1lcmFsIiwgIi9yL21vdWwveC9hbGxpbm9uZS90ZXh0bGFiL3YwOjE5ODciKSwKCQl9KQp9ChqrJwoQdGV4dGxhYl90ZXN0LmdubxKWJ3BhY2thZ2UgdGV4dGxhYgoKaW1wb3J0ICgKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL21vdWwveC9kYWlseS9sZXZlbnNodGVpbi92MCIKCSJnbm8ubGFuZC9wL21vdWwveC9kYWlseS9zb3VuZGV4L3YwIgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKLy8gVGVzdFJvbWFuT2YgY292ZXJzIHRoZSBvbmUgcGFja2FnZSBoZXJlIHdob3NlIGlucHV0IGlzIGEgbnVtYmVyIHJhdGhlciB0aGFuCi8vIGEgd29yZCwgaW4gYm90aCBkaXJlY3Rpb25zIHBsdXMgdGhlIHR3byB3YXlzIGl0IGNhbiBiZSBuZWl0aGVyLgpmdW5jIFRlc3RSb21hbk9mKHQgKnRlc3RpbmcuVCkgewoJdGVzdHMgOj0gW11zdHJ1Y3R7IGluLCB3YW50IHN0cmluZyB9ewoJCXsiMTk4NyIsICJNQ01MWFhYVklJIn0sCgkJeyIxIiwgIkkifSwKCQl7IjM5OTkiLCAiTU1NQ01YQ0lYIn0sCgkJeyIwIiwgIm91dCBvZiByYW5nZSAoMS4uMzk5OSkifSwKCQl7Ii01IiwgIm91dCBvZiByYW5nZSAoMS4uMzk5OSkifSwKCQl7IjQwMDAiLCAib3V0IG9mIHJhbmdlICgxLi4zOTk5KSJ9LAoJCXsiTUNNTFhYWFZJSSIsICIxOTg3IChyZWFkIGFzIHJvbWFuKSJ9LAoJCXsibWNtbHh4eHZpaSIsICIxOTg3IChyZWFkIGFzIHJvbWFuKSJ9LAoJCXsia25pZ2h0IiwgIm5vdCBhIG51bWJlciJ9LAoJfQoJZm9yIF8sIHR0IDo9IHJhbmdlIHRlc3RzIHsKCQl1YXNzZXJ0LkVxdWFsKHQsIHR0LndhbnQsIHJvbWFuT2YodHQuaW4pLCAicm9tYW5PZigiK3R0LmluKyIpIikKCX0KfQoKLy8gVGVzdFRoZURpc2FncmVlbWVudCBpcyB0aGUgY2xhaW0gdGhlIHJlYWxtIGlzIGJ1aWx0IHRvIHNob3csIHBpbm5lZCBpbiBib3RoCi8vIGRpcmVjdGlvbnMuIE1lYXN1cmVkIDIwMjYtMDktMjM7IHRoZSBudW1iZXJzIGluIHRoZSBwYWNrYWdlIGRvYyBhbmQgb24gdGhlCi8vIHBhZ2UgY29tZSBmcm9tIGhlcmUsIHNvIGlmIGVpdGhlciBwYWNrYWdlIGNoYW5nZXMgaXRzIG1pbmQgdGhpcyBmYWlscyByYXRoZXIKLy8gdGhhbiB0aGUgcGFnZSBxdWlldGx5IHN0YXRpbmcgc29tZXRoaW5nIGZhbHNlLgpmdW5jIFRlc3RUaGVEaXNhZ3JlZW1lbnQodCAqdGVzdGluZy5UKSB7CgkvLyBPbmUgZWRpdCBhcGFydCwgYW5kIHlldCBzb3VuZGV4IHNheXMgdW5yZWxhdGVkOiBpdCBrZXlzIG9uIHRoZSBmaXJzdAoJLy8gbGV0dGVyLCBhbmQgdGhlIHNpbGVudCBLIGNoYW5nZXMgaXQuCgl1YXNzZXJ0LkVxdWFsKHQsICJLNTIzIiwgc291bmRleC5FbmNvZGUoImtuaWdodCIpKQoJdWFzc2VydC5FcXVhbCh0LCAiTjIzMCIsIHNvdW5kZXguRW5jb2RlKCJuaWdodCIpKQoJdWFzc2VydC5GYWxzZSh0LCBzb3VuZGV4Lk1hdGNoKCJrbmlnaHQiLCAibmlnaHQiKSwgImRpZmZlcmVudCBzb3VuZGV4IGNvZGVzIikKCXVhc3NlcnQuRXF1YWwodCwgMSwgbGV2ZW5zaHRlaW4uRGlzdGFuY2UoImtuaWdodCIsICJuaWdodCIpKQoJdWFzc2VydC5FcXVhbCh0LCA4MywgbGV2ZW5zaHRlaW4uU2ltaWxhcml0eSgia25pZ2h0IiwgIm5pZ2h0IikpCgoJLy8gQW5kIHRoZSBvdGhlciB3YXk6IHR3byBlZGl0cyBhcGFydCwgaWRlbnRpY2FsIGNvZGVzLgoJdWFzc2VydC5FcXVhbCh0LCAiUjE2MyIsIHNvdW5kZXguRW5jb2RlKCJyb2JlcnQiKSkKCXVhc3NlcnQuRXF1YWwodCwgIlIxNjMiLCBzb3VuZGV4LkVuY29kZSgicnVwZXJ0IikpCgl1YXNzZXJ0LlRydWUodCwgc291bmRleC5NYXRjaCgicm9iZXJ0IiwgInJ1cGVydCIpLCAic2FtZSBzb3VuZGV4IGNvZGUiKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBsZXZlbnNodGVpbi5EaXN0YW5jZSgicm9iZXJ0IiwgInJ1cGVydCIpKQp9CgovLyBUZXN0Um9tYW5PZkRvZXNOb3RBYm9ydE9uT3JkaW5hcnlXb3JkcyBpcyB0aGUgZGVmZWN0IHRoaXMgcmVhbG0gc2hpcHBlZCB3aXRoCi8vIHVudGlsIGEgdGVzdCBmb3VuZCBpdDogcm9tYW5udW0uRnJvbVJvbWFuIFBBTklDUyBvbiBhIG5vbi1udW1lcmFsIGluc3RlYWQgb2YKLy8gcmV0dXJuaW5nIHplcm8sIHNvIHRoZSBERUZBVUxUIHZpZXcgYWJvcnRlZC4gImtuaWdodCIgaXMgbm90IGEgcm9tYW4gbnVtZXJhbCwKLy8gYW5kIG5laXRoZXIgaXMgbW9zdCBvZiB3aGF0IGFueW9uZSB3b3VsZCBwdXQgaW4gdGhlIFVSTC4KZnVuYyBUZXN0Um9tYW5PZkRvZXNOb3RBYm9ydE9uT3JkaW5hcnlXb3Jkcyh0ICp0ZXN0aW5nLlQpIHsKCWZvciBfLCB3IDo9IHJhbmdlIFtdc3RyaW5neyJrbmlnaHQiLCAibmlnaHQiLCAiYXxiIiwgIiIsICJoZWxsbyB3b3JsZCIsICJNTU0hIn0gewoJCXVhc3NlcnQuRXF1YWwodCwgIm5vdCBhIG51bWJlciIsIHJvbWFuT2YodyksICJyb21hbk9mKCIrdysiKSIpCgl9Cgl1YXNzZXJ0LlRydWUodCwgaXNSb21hbk51bWVyYWwoIk1DTUxYWFhWSUkiKSkKCXVhc3NlcnQuRmFsc2UodCwgaXNSb21hbk51bWVyYWwoIktOSUdIVCIpKQoJdWFzc2VydC5GYWxzZSh0LCBpc1JvbWFuTnVtZXJhbCgiIikpCn0KCi8vIFRlc3RJbnB1dElzQm91bmRlZCBwaW5zIHRoZSBjZWlsaW5nLiBsZXZlbnNodGVpbi5NYXRyaXggaXMgTyhsZW4oYSkqbGVuKGIpKSwKLy8gc28gYW4gdW5ib3VuZGVkIHBhaXIgb3V0IG9mIGEgVVJMIGlzIGEgd2F5IHRvIG1ha2UgYSBxdWVyeSBleHBlbnNpdmUgZm9yCi8vIHdob2V2ZXIgc2VydmVzIGl0LgpmdW5jIFRlc3RJbnB1dElzQm91bmRlZCh0ICp0ZXN0aW5nLlQpIHsKCWxvbmcgOj0gIiIKCWZvciBpIDo9IDA7IGkgPCBtYXhJbnB1dCsxOyBpKysgewoJCWxvbmcgKz0gIngiCgl9Cgl1YXNzZXJ0LlRydWUodCwgdG9vTG9uZyhsb25nKSkKCXVhc3NlcnQuRmFsc2UodCwgdG9vTG9uZygia25pZ2h0IikpCgoJb3V0IDo9IFJlbmRlcihsb25nKQoJdWFzc2VydC5UcnVlKHQsIGxlbihvdXQpIDwgNjAwLCAiYW4gb3Zlci1sb25nIGlucHV0IHJlbmRlcnMgYSByZWZ1c2FsLCBub3QgYSBtYXRyaXgiKQp9CgovLyBUZXN0VGFibGVDZWxsc0FyZUVzY2FwZWQ6IHRoZSBpbnB1dCBjb21lcyBvdXQgb2YgYSBVUkwgYW5kIGxhbmRzIGluIGEgdGFibGUKLy8gY2VsbCwgd2hlcmUgYW4gdW5lc2NhcGVkIHBpcGUgZWF0cyBhIGNvbHVtbi4KZnVuYyBUZXN0VGFibGVDZWxsc0FyZUVzY2FwZWQodCAqdGVzdGluZy5UKSB7CglvdXQgOj0gUmVuZGVyKCJhfGIiKQoJdWFzc2VydC5GYWxzZSh0LCBjb250YWlucyhvdXQsICJ8IGF8YiB8IiksICJhIHJhdyBwaXBlIHJlYWNoZWQgYSB0YWJsZSBjZWxsIikKfQoKZnVuYyBjb250YWlucyhoLCBuIHN0cmluZykgYm9vbCB7Cglmb3IgaSA6PSAwOyBpK2xlbihuKSA8PSBsZW4oaCk7IGkrKyB7CgkJaWYgaFtpOmkrbGVuKG4pXSA9PSBuIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gRXhhbXBsZVJlbmRlciBwaW5zIHRoZSByb290IHZpZXcsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHdvcmQgYW5kIHRoZSAidHJ5Ci8vIHR3byIgbGlzdC4gTm90aGluZyBoZXJlIG1vdmVzIHdpdGggdGhlIGNoYWluLgpmdW5jIEV4YW1wbGVSZW5kZXIoKSB7CglwcmludChSZW5kZXIoIiIpKQoJLy8gT3V0cHV0OgoJLy8gIyBhbGxpbm9uZTogdGV4dGxhYgoJLy8KCS8vIEVpZ2h0IHBhY2thZ2VzIG92ZXIgb25lIGlucHV0LiBbc291cmNlXShodHRwczovL215Z25vc2Nhbi5tb3VsLnAycC50ZWFtL3JlYWxtL3IvbW91bC94L2FsbGlub25lL3RleHRsYWIvdjApCgkvLwoJLy8gIyMgSW5wdXQ6IGtuaWdodAoJLy8KCS8vIHwgcGFja2FnZSB8IGFuc3dlciB8CgkvLyB8IC0tLSB8IC0tLSB8CgkvLyB8IGB4L2RhaWx5L3NvdW5kZXhgIHwgSzUyMyB8CgkvLyB8IGB4L2RhaWx5L3JvdDEzYCB8IHhhdnR1ZyB8CgkvLyB8IGB4L2RhaWx5L3BpZ2xhdGluYCB8IGlnaHRrbmF5IHwKCS8vIHwgYHgvZGFpbHkvcm9tYW5udW1gIHwgbm90IGEgbnVtYmVyIHwKCS8vCgkvLyAjIyBUcnkgdHdvCgkvLwoJLy8gLSBba25pZ2h0IHZzIG5pZ2h0XSgvci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYi92MDprbmlnaHQvbmlnaHQpIChvbmUgZWRpdCBhcGFydCwgeWV0IHNvdW5kZXggc2F5cyB1bnJlbGF0ZWQpCgkvLyAtIFtyb2JlcnQgdnMgcnVwZXJ0XSgvci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYi92MDpyb2JlcnQvcnVwZXJ0KSAodHdvIGVkaXRzIGFwYXJ0LCB5ZXQgc291bmRleCBzYXlzIGlkZW50aWNhbCkKCS8vIC0gWzE5ODcgYXMgYSByb21hbiBudW1lcmFsXSgvci9tb3VsL3gvYWxsaW5vbmUvdGV4dGxhYi92MDoxOTg3KQp9CgovLyBFeGFtcGxlUmVuZGVyX3BhaXIgcGlucyB0aGUgY29tcGFyaXNvbiB2aWV3LCB3aGljaCBpcyB0aGUgcmVhbG0ncyB3aG9sZQovLyBhcmd1bWVudDogdGhlIHNhbWUgcGFpciwganVkZ2VkIG9wcG9zaXRlIHdheXMgYnkgdGhlIHR3byBtZWFzdXJlcy4KZnVuYyBFeGFtcGxlUmVuZGVyX3BhaXIoKSB7CglwcmludChSZW5kZXIoImtuaWdodC9uaWdodCIpKQoJLy8gT3V0cHV0OgoJLy8gIyBhbGxpbm9uZTogdGV4dGxhYgoJLy8KCS8vIEVpZ2h0IHBhY2thZ2VzIG92ZXIgb25lIGlucHV0LiBbc291cmNlXShodHRwczovL215Z25vc2Nhbi5tb3VsLnAycC50ZWFtL3JlYWxtL3IvbW91bC94L2FsbGlub25lL3RleHRsYWIvdjApCgkvLwoJLy8gIyMgSW5wdXQ6IGtuaWdodAoJLy8KCS8vIHwgcGFja2FnZSB8IGFuc3dlciB8CgkvLyB8IC0tLSB8IC0tLSB8CgkvLyB8IGB4L2RhaWx5L3NvdW5kZXhgIHwgSzUyMyB8CgkvLyB8IGB4L2RhaWx5L3JvdDEzYCB8IHhhdnR1ZyB8CgkvLyB8IGB4L2RhaWx5L3BpZ2xhdGluYCB8IGlnaHRrbmF5IHwKCS8vIHwgYHgvZGFpbHkvcm9tYW5udW1gIHwgbm90IGEgbnVtYmVyIHwKCS8vCgkvLyAjIyBDb21wYXJlZCB3aXRoIG5pZ2h0CgkvLwoJLy8gfCBtZWFzdXJlIHwgYW5zd2VyIHwKCS8vIHwgLS0tIHwgLS0tIHwKCS8vIHwgYHNvdW5kZXhgIG9mIGtuaWdodCB8IEs1MjMgfAoJLy8gfCBgc291bmRleGAgb2YgbmlnaHQgfCBOMjMwIHwKCS8vIHwgc291bmQgYWxpa2UgfCBubyB8CgkvLyB8IGBsZXZlbnNodGVpbmAgZGlzdGFuY2UgfCAxIHwKCS8vIHwgYGxldmVuc2h0ZWluYCBzaW1pbGFyaXR5IHwgODMlIHwKfQoiDDYwMDAwMDB1Z25vdBISCPCEuV4SCzI5NzEwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAgBSSj+NLAA6icQ/Rf6vbrjtRbbjo197vms7Sf+eLYPIEkA3OsnUMh52B6t7LziQyCK5VMJBjukuDH3LtDspiEmXwhaNz56tYrh6eGQy/pgFC3vbn6KWVuAYxo300r+NwUOZGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data