Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
7FBAAF1B7121B4BADDA4A1BB65932BDB80ED32551466A80C618CE1953A62B1FB
Transaction overview
Execution summary
TX INDEX
1
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
46,434,354
Gas consumed
FEE
250000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3912000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CpiPAgoML3ZtLm1fYWRkcGtnEoaPAgooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORLJjgIKCHJldnNoYXJlEjxnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvcmV2c2hhcmUaYwoLZ25vbW9kLnRvbWwSVG1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvcmV2c2hhcmUiCmdubyA9ICIwLjkiChqsgwEKDHJldnNoYXJlLmdubxKagwEvLyBQYWNrYWdlIHJldnNoYXJlIGlzIGEgdGVhbSByZXZlbnVlIHJlYWxtIHRoYXQgSVMgYSBzdWJzY3JpcHRpb24KLy8gcHJvdmlkZXIuIFRoZSBsaXZlIHN1YnNjcmlwdGlvbnMgcmVhbG0gc3VwcG9ydHMgcmVhbG0gcHJvdmlkZXJzIGJ1dAovLyB3YXJucywgaW4gaXRzIG93biBmcm96ZW4gaGVhZGVyLCB0aGF0IGEgcmVhbG0gcHJvdmlkZXIgIm11c3QgZXhwb3NlCi8vIGl0cyBvd24gY3Jvc3NpbmcgcGF0aCB0byBDbGFpbSwgb3Igd2hhdCBpdCBlYXJucyBpcyBzdHJhbmRlZC4iCi8vIHJldnNoYXJlIGlzIHRoYXQgY3Jvc3NpbmcgcGF0aCwgcGx1cyB0aGUgb25lIHRoaW5nIGEgdGVhbSBuZWVkcyBvbgovLyB0b3Agb2YgaXQ6IHB1bGxlZCByZXZlbnVlIGlzIHNwbGl0IGFtb25nIHdlaWdodGVkIG1lbWJlcnMgaW50bwovLyBwdWxsLWNsYWltYWJsZSBiYWxhbmNlcy4KLy8KLy8gVEhFIEVDT05PTUlDIENPTVBPU0lUSU9OLCBQUkVDSVNFTFk6Ci8vCi8vCWNvbXBvbmVudHMgICAgICAgICAgICA6IHN1YnNjcmlwdGlvbnMgKGxpdmUgcmVhbG0g4oCUIHRoZSByZXZlbnVlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgYW5kIHRoZSB1cHN0cmVhbSBjdXN0b2RpYW4pLAovLwkgICAgICAgICAgICAgICAgICAgICAgICBmZWVsZWRnZXIgKG1lbWJlciBiYWxhbmNlIGFjY291bnRpbmcsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGZlZSBjYXAgMCksIGNvaW5pbyAocGF5b3V0cywgaGVsZC1iYWxhbmNlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRzLCByZXNlcnZlLXByb3RlY3RlZCBzd2VlcCkuCi8vCXZhbHVlIGJvdW5kYXJpZXMgICAgICA6IEIxIHN1YnNjcmliZXIgRU9BIC0+IHN1YnNjcmlwdGlvbnMgKHBsYW4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2UsIG9yaWdpbiBlbnZlbG9wZTsgZ292ZXJuZWQgYnkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucycgb3duIEggPT0gVSArIEYpLiBCMgovLwkgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zIC0+IHJldnNoYXJlIChiYW5rZXIgc2VuZDoKLy8JICAgICAgICAgICAgICAgICAgICAgICAgQ2xhaW1BbGwgcGF5cyB0aGUgY2FsbGVyLCBhbmQgdGhlIGNhbGxlcgovLwkgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGlzIHJlYWxtKS4gQjMgcmV2c2hhcmUgLT4gbWVtYmVyIEVPQQovLwkgICAgICAgICAgICAgICAgICAgICAgICAoY29pbmlvLlBheW91dCBvbiBDbGFpbS9DbGFpbUFsbCkuCi8vCXdobyBvd25zIHdoaWNoIHN0YXRlICA6IHN1YnNjcmlwdGlvbnMgb3ducyBwbGFucywgc3VicyBhbmQgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UgKHJldnNoYXJlJ3MKLy8JICAgICAgICAgICAgICAgICAgICAgICAgUkVDRUlWQUJMRSk7IHJldnNoYXJlIG93bnMgdGhlIG1lbWJlcgovLwkgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwgd2VpZ2h0cywgYW5kIHRoZSBtZW1iZXIgYmFsYW5jZXMgaW4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgaXRzIG93biBsZWRnZXIuIE5vIHN0YXRlIGlzIHNoYXJlZDsgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgY291cGxpbmcgaXMgdGhlIGNyb3NzaW5nIGNhbGxzIGFuZAovLwkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29pbnMgdGhhdCBtb3ZlIG92ZXIgQjIuCi8vCXdobyBjb250cm9scyBmdW5kcyAgICA6IHVwc3RyZWFtLCBvbmx5IGEgY2xhaW0gYnkgdGhpcyByZWFsbSBjYW4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgbW92ZSBpdHMgcmVjZWl2YWJsZSAocHJvdmlkZXIta2V5ZWQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgbGVkZ2VyKS4gSGVyZSwgbWVtYmVyIGJhbGFuY2VzIG1vdmUgb25seQovLwkgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGVpciBvd25lciAocHVsbCBjbGFpbXMpOyB0aGUgYWRtaW4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgY2FuIE5FVkVSIHRvdWNoIGVhcm5lZCBiYWxhbmNlcyDigJQgc3dlZXAKLy8JICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZXMgdGhlbSwgd2VpZ2h0IGNoYW5nZXMgYWZmZWN0IG9ubHkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgRlVUVVJFIGRpc3RyaWJ1dGlvbnMuCi8vCWlkZW50aXR5IHByb3BhZ2F0aW9uICA6IGRvd25zdHJlYW0gc2VlcyBjdXIuUHJldmlvdXMoKSA9IFRISVMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0gb24gZXZlcnkgY3Jvc3NpbmcgY2FsbCwgc28gdGhlIHBsYW4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgYW5kIHRoZSBjbGFpbSBiZW5lZmljaWFyeSBhcmUgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxtIGFkZHJlc3MgYnkgY29uc3RydWN0aW9uIOKAlCBubyBhZG1pbgovLwkgICAgICAgICAgICAgICAgICAgICAgICBvciBtZW1iZXIgaWRlbnRpdHkgZXZlciByZWFjaGVzIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBkb3duc3RyZWFtIHJlYWxtLgovLwljb25zZXJ2YXRpb24gICAgICAgICAgOiBIZWxkID09IFVzZXJzVG90YWwgKyBTIChzdXJwbHVzIGFib3ZlIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBMaWFiaWxpdGllcygpIHJlc2VydmUsIHJlY292ZXJhYmxlIG9ubHkgYnkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgU3dlZXBEZW5vbSkuIERpc3RyaWJ1dGlvbiBpcyBleGFjdDogc2hhcmVzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBmbG9vcihhbW91bnQqdy9XKSB2aWEgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LWZyZWUgc3BsaXQgKEEvVykqdyArICgoQSVXKSp3KS9XLAovLwkgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHJlbWFpbmRlciBnb2VzIHRvIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBoaWdoZXN0LXdlaWdodCBtZW1iZXIgKHRpZXM6IGxvd2VzdAovLwkgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKSDigJQgZmVlX3NwbGl0J3MgZGV0ZXJtaW5pc3RpYyBkdXN0Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSwgc28gbm8gcmVzaWR1YWwgcG9vbCBleGlzdHMuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzLWJvdW5kYXJ5OiBsaWZldGltZSBQdWxsZWQgZXF1YWxzIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBzdW0gb2YgYWxsIGRpc3RyaWJ1dGlvbnMsIGFuZCB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgZG93bnN0cmVhbSByZWNlaXZhYmxlIGlzIE5PVCBwYXJ0IG9mIEhlbGQuCi8vCW9yZGVyaW5nICAgICAgICAgICAgICA6IFB1bGwgcmVmdXNlcyBCRUZPUkUgdGhlIGRvd25zdHJlYW0gY2FsbAovLwkgICAgICAgICAgICAgICAgICAgICAgICAobm8gbWVtYmVycyBjb25maWd1cmVkID0gcmVmdXNlKSwgY2xhaW1zCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25zdHJlYW0sIE1FQVNVUkVTIHRoZSBhcnJpdmFsIGFzIGEKLy8JICAgICAgICAgICAgICAgICAgICAgICAgaGVsZC1iYWxhbmNlIGRlbHRhLCB0aGVuIGRpc3RyaWJ1dGVzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0bHkgd2hhdCBhcnJpdmVkLiBTdGF0ZS1hZnRlci1jYWxsOgovLwkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb25seSBsb2NhbCBtdXRhdGlvbnMgaGFwcGVuIGFmdGVyIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSwgb24gbWVhc3VyZWQgY29pbnMuCi8vCWRvd25zdHJlYW0gYWJvcnQgICAgICA6ICJub3RoaW5nIHRvIGNsYWltIiAob3IgYW55IGRvd25zdHJlYW0KLy8JICAgICAgICAgICAgICAgICAgICAgICAgcGFuaWMpIGFib3J0cyB0aGUgd2hvbGUgUHVsbCDigJQgbm8gbG9jYWwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgZXhpc3RzIHlldCB0byBjb3JydXB0LCBieSBvcmRlcmluZwovLwkgICAgICAgICAgICAgICAgICAgICAgICBBTkQgYnkgVk0gYXRvbWljaXR5LiBUaGVyZSBpcyBubyByZWNvdmVyCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGFueXdoZXJlIGluIHRoaXMgcmVhbG0sIGFuZCBub25lIG1heSBiZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZC4KLy8JcmVwbGF5ICAgICAgICAgICAgICAgIDogYSBzZWNvbmQgUHVsbCBmaW5kcyBhIHplcm8gZG93bnN0cmVhbQovLwkgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlIGFuZCBhYm9ydHMgdGhlcmUuIERpc3RyaWJ1dGlvbgovLwkgICAgICAgICAgICAgICAgICAgICAgICBjcmVkaXRzIGFyZSBkcml2ZW4gYnkgdGhlIG1lYXN1cmVkIGRlbHRhLAovLwkgICAgICAgICAgICAgICAgICAgICAgICBzbyBhIHJlcGxheWVkIFB1bGwgY2Fubm90IGRvdWJsZS1jb3VudAovLwkgICAgICAgICAgICAgICAgICAgICAgICBldmVuIGluIHByaW5jaXBsZS4KLy8JdHJ1c3QgICAgICAgICAgICAgICAgIDogcmV2c2hhcmUgZG9lcyBub3QgdHJ1c3QgdGhlIGRvd25zdHJlYW0KLy8JICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkgYmV5b25kICJpdCBkaWQgbm90IGFib3J0IiDigJQgaXQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZXMgdGhlIG1lYXN1cmVkIGJhbGFuY2UgZGVsdGEsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhIHJlcG9ydGVkIGFtb3VudC4gRG93bnN0cmVhbQovLwkgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZXMgbm90aGluZyBhYm91dCB0aGlzIGNhbGxlcjsgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyIGxlZGdlciBpcyBrZXllZCBieSBhZGRyZXNzLgovLwl0ZXJtaW5hbCBzdGF0ZXMgICAgICAgOiBwbGFucyByZXRpcmUgZG93bnN0cmVhbSAocHJvdmlkZXItb25seSwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3NlZCBoZXJlIGFkbWluLWdhdGVkKTsgbWVtYmVycyBjYW4gYmUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCAoZWFybmVkIGJhbGFuY2VzIHN1cnZpdmUgcmVtb3ZhbAovLwkgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc3RheSBjbGFpbWFibGUpOyB0aGUgcmVhbG0gaXRzZWxmIGhhcwovLwkgICAgICAgICAgICAgICAgICAgICAgICBubyB0ZXJtaW5hbCBzdGF0ZSDigJQgYSB0ZWFtIHRoYXQgd2Fsa3MgYXdheQovLwkgICAgICAgICAgICAgICAgICAgICAgICBsZWF2ZXMgb25seSBwdWxsLWNsYWltYWJsZSBiYWxhbmNlcy4KLy8JYWR2ZXJzYXJpYWwgY2FsbGVycyAgIDogUHVsbCBpcyBwZXJtaXNzaW9ubGVzcyDigJQgaXQgY2FuIG9ubHkgbW92ZQovLwkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVjZWl2YWJsZSBpbnRvIG1lbWJlciBiYWxhbmNlcyBhdCB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgd2VpZ2h0cywgc28gYSBzdHJhbmdlcidzIFB1bGwgaXMgYQovLwkgICAgICAgICAgICAgICAgICAgICAgICBmcmVlIGZhdm9yLiBQbGFuIGNyZWF0aW9uL3JldGlyZW1lbnQgaXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW4tZ2F0ZWQgKHRoZSBkb3duc3RyZWFtIHBlci1wcm92aWRlcgovLwkgICAgICAgICAgICAgICAgICAgICAgICBwbGFuIHF1b3RhIGlzIGEgZ3JpZWZhYmxlIHJlc291cmNlKS4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVycyB0cnVzdCB0aGUgYWRtaW4gZm9yIEZVVFVSRSB3ZWlnaHRzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIG9ubHksIG5ldmVyIGZvciBlYXJuZWQgYmFsYW5jZXMuIEFsbAovLwkgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeXBvaW50cyByZWZ1c2UgY29pbi1jYXJyeWluZwovLwkgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMgKHRoZSBkb3duc3RyZWFtIGFzc2VydE5vU2VuZAovLwkgICAgICAgICAgICAgICAgICAgICAgICByZWFkcyB0aGUgb3JpZ2luIGVudmVsb3BlOyBvdXJzIG1hdGNoZXMpLgovLwovLyBPbmUgdGVhbSBwZXIgZGVwbG95OiBzdWJzY3JpcHRpb25zIGtlZXBzIE9ORSBjbGFpbWFibGUgYmFsYW5jZSBwZXIKLy8gcHJvdmlkZXIgYWRkcmVzcywgc28gYSBtdWx0aS10ZWFtIHJvdXRlciBiZWhpbmQgb25lIHJlYWxtIGFkZHJlc3MKLy8gY291bGQgbm90IGF0dHJpYnV0ZSByZXZlbnVlIGF0IHRoZSBib3VuZGFyeS4gVGhpcyBpcyBhIG1lYXN1cmVkCi8vIGNvbnN0cmFpbnQgb2YgdGhlIGRvd25zdHJlYW0gQVBJLCBub3QgYSBjaG9pY2UuCnBhY2thZ2UgcmV2c2hhcmUKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2NvaW5pbyIKCSJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvZmVlbGVkZ2VyIgoKCXN1YnMgImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9zdWJzY3JpcHRpb25zIgopCgovLyBEZW5vbSBpcyB0aGUgb25seSBhc3NldCB0aGlzIHJlYWxtIGFjY291bnRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heE1lbWJlcnMgYm91bmRzIHRoZSBkaXN0cmlidXRpb24gbG9vcDsgTWF4V2VpZ2h0IGJvdW5kcyBhIHNpbmdsZQovLyB3ZWlnaHQuIFRvZ2V0aGVyIHRoZXkgY2FwIHRvdGFsV2VpZ2h0IGF0IDIwMCwwMDAsIHdoaWNoIG1ha2VzIHRoZQovLyByZW1haW5kZXIgc3RlcCBvZiB0aGUgc3BsaXQgKChBJVcpKncpIHByb3ZhYmx5IG92ZXJmbG93LWZyZWUgZm9yCi8vIGFueSBpbnQ2NCBjb2luIGFtb3VudCDigJQgdGhlIGNvbnNlcnZhdGlvbiBtYXRoIGNhbm5vdCB0cmFwLgpjb25zdCAoCglNYXhNZW1iZXJzID0gMjAKCU1heFdlaWdodCAgPSBpbnQ2NCgxMDAwMCkKKQoKdHlwZSBtZW1iZXIgc3RydWN0IHsKCWFkZHIgICBhZGRyZXNzCgl3ZWlnaHQgaW50NjQKfQoKdmFyICgKCWFkbWluICAgICAgICBhZGRyZXNzIC8vIG1hbmFnZXMgbWVtYmVycywgcGxhbnM7IHN0YWdlcyBhIHN1Y2Nlc3NvcgoJcGVuZGluZ0FkbWluIGFkZHJlc3MgLy8gc3RhZ2VkIGJ5IFRyYW5zZmVyQWRtaW4sIGNvbXBsZXRlcyB2aWEgQWNjZXB0QWRtaW4KCXN3ZWVwZXIgICAgICBhZGRyZXNzIC8vIG1heSBzd2VlcCBvdXQtb2YtYmFuZCBzdXJwbHVzCgoJc2VsZiBhZGRyZXNzIC8vIHRoaXMgcmVhbG0ncyBhZGRyZXNzLCBjYXB0dXJlZCBhdCBkZXBsb3kKCgltZW1iZXJzICAgICBbXW1lbWJlciAvLyBpbnNlcnRpb24tb3JkZXJlZDsgYm91bmRlZCBieSBNYXhNZW1iZXJzCgl0b3RhbFdlaWdodCBpbnQ2NAoKCWxlZGdlciA9IGZlZWxlZGdlci5NdXN0TmV3KDApCgoJcGxhbklEcyBbXWludDY0IC8vIHBsYW5zIGNyZWF0ZWQgdGhyb3VnaCB0aGlzIHJlYWxtIChvcHMvUmVuZGVyKQoJcHVsbGVkICBpbnQ2NCAgIC8vIGxpZmV0aW1lIHJldmVudWUgcHVsbGVkIG92ZXIgYm91bmRhcnkgQjIKKQoKZnVuYyBpbml0KCkgewoJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCXN3ZWVwZXIgPSBhZG1pbgoJc2VsZiA9IHVuc2FmZS5DdXJyZW50UmVhbG0oKS5BZGRyZXNzKCkKfQoKLy8gLS0tIG1lbWJlcnNoaXAgKGFkbWluLWdhdGVkOyBmdXR1cmUgZGlzdHJpYnV0aW9ucyBvbmx5KSAtLS0KCi8vIEFkZE1lbWJlciBhZGRzIGEgd2VpZ2h0ZWQgbWVtYmVyLiBXZWlnaHQgY2hhbmdlcyBuZXZlciB0b3VjaCBlYXJuZWQKLy8gYmFsYW5jZXM7IHRoZXkgc2hhcGUgZnV0dXJlIHB1bGxzIG9ubHkuCmZ1bmMgQWRkTWVtYmVyKGN1ciByZWFsbSwgYSBhZGRyZXNzLCB3ZWlnaHQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCgl2YXIgemVybyBhZGRyZXNzCglpZiBhID09IHplcm8gewoJCXBhbmljKCJtZW1iZXIgbXVzdCBub3QgYmUgdGhlIHplcm8gYWRkcmVzcyIpCgl9CglpZiB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IE1heFdlaWdodCB7CgkJcGFuaWMoIndlaWdodCBtdXN0IGJlIGluIFsxLCAiICsgaXRvYShNYXhXZWlnaHQpICsgIl0iKQoJfQoJaWYgbGVuKG1lbWJlcnMpID49IE1heE1lbWJlcnMgewoJCXBhbmljKCJtZW1iZXIgdGFibGUgaXMgZnVsbCAoIiArIGl0b2EoaW50NjQoTWF4TWVtYmVycykpICsgIikiKQoJfQoJaWYgaW5kZXhPZihhKSA+PSAwIHsKCQlwYW5pYygiYWxyZWFkeSBhIG1lbWJlciIpCgl9CgltZW1iZXJzID0gYXBwZW5kKG1lbWJlcnMsIG1lbWJlcnthZGRyOiBhLCB3ZWlnaHQ6IHdlaWdodH0pCgl0b3RhbFdlaWdodCArPSB3ZWlnaHQKCWNoYWluLkVtaXQoIk1lbWJlckFkZGVkIiwgImFkZHIiLCBhLlN0cmluZygpLCAid2VpZ2h0IiwgaXRvYSh3ZWlnaHQpKQp9CgovLyBTZXRXZWlnaHQgY2hhbmdlcyBhIG1lbWJlcidzIHdlaWdodCBmb3IgZnV0dXJlIGRpc3RyaWJ1dGlvbnMuCmZ1bmMgU2V0V2VpZ2h0KGN1ciByZWFsbSwgYSBhZGRyZXNzLCB3ZWlnaHQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IE1heFdlaWdodCB7CgkJcGFuaWMoIndlaWdodCBtdXN0IGJlIGluIFsxLCAiICsgaXRvYShNYXhXZWlnaHQpICsgIl0iKQoJfQoJaSA6PSBpbmRleE9mKGEpCglpZiBpIDwgMCB7CgkJcGFuaWMoIm5vdCBhIG1lbWJlciIpCgl9CglvbGQgOj0gbWVtYmVyc1tpXS53ZWlnaHQKCXRvdGFsV2VpZ2h0ICs9IHdlaWdodCAtIG9sZAoJbWVtYmVyc1tpXS53ZWlnaHQgPSB3ZWlnaHQKCWNoYWluLkVtaXQoIldlaWdodFNldCIsICJhZGRyIiwgYS5TdHJpbmcoKSwgIm9sZCIsIGl0b2Eob2xkKSwgIm5ldyIsIGl0b2Eod2VpZ2h0KSkKfQoKLy8gUmVtb3ZlTWVtYmVyIHJlbW92ZXMgYSBtZW1iZXIgZnJvbSBmdXR1cmUgZGlzdHJpYnV0aW9ucy4gVGhlCi8vIG1lbWJlcidzIGVhcm5lZCBiYWxhbmNlIGlzIHVudG91Y2hlZCBhbmQgc3RheXMgY2xhaW1hYmxlIGZvcmV2ZXIuCmZ1bmMgUmVtb3ZlTWVtYmVyKGN1ciByZWFsbSwgYSBhZGRyZXNzKSB7Cglhc3NlcnROb1NlbmQoKQoJYXNzZXJ0QWRtaW4oY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJaSA6PSBpbmRleE9mKGEpCglpZiBpIDwgMCB7CgkJcGFuaWMoIm5vdCBhIG1lbWJlciIpCgl9Cgl0b3RhbFdlaWdodCAtPSBtZW1iZXJzW2ldLndlaWdodAoJbWVtYmVycyA9IGFwcGVuZChtZW1iZXJzWzppXSwgbWVtYmVyc1tpKzE6XS4uLikKCWNoYWluLkVtaXQoIk1lbWJlclJlbW92ZWQiLCAiYWRkciIsIGEuU3RyaW5nKCkpCn0KCi8vIC0tLSB0aGUgcHJvdmlkZXIgc3VyZmFjZTogY3Jvc3NpbmcgcGF0aHMgaW50byBzdWJzY3JpcHRpb25zIC0tLQoKLy8gQ3JlYXRlUGxhbiBjcmVhdGVzIGEgc3Vic2NyaXB0aW9uIHBsYW4gVEhST1VHSCB0aGlzIHJlYWxtLCBtYWtpbmcKLy8gdGhlIHJlYWxtIHRoZSBwbGFuJ3MgcHJvdmlkZXIgZG93bnN0cmVhbS4gQWRtaW4gb25seTogdGhlCi8vIHBlci1wcm92aWRlciBwbGFuIHF1b3RhIGRvd25zdHJlYW0gaXMgYSBncmllZmFibGUgcmVzb3VyY2UuCmZ1bmMgQ3JlYXRlUGxhbihjdXIgcmVhbG0sIHRpdGxlLCBkZXNjcmlwdGlvbiBzdHJpbmcsIHByaWNlLCBwZXJpb2RCbG9ja3MsIG1heEZlZUJwcyBpbnQ2NCkgaW50NjQgewoJYXNzZXJ0Tm9TZW5kKCkKCWFzc2VydEFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCWlkIDo9IHN1YnMuQ3JlYXRlUGxhbihjcm9zcyhjdXIpLCB0aXRsZSwgZGVzY3JpcHRpb24sIHByaWNlLCBwZXJpb2RCbG9ja3MsIG1heEZlZUJwcykKCXBsYW5JRHMgPSBhcHBlbmQocGxhbklEcywgaWQpCgljaGFpbi5FbWl0KCJQbGFuQ3JlYXRlZCIsICJwbGFuSWQiLCBpdG9hKGlkKSwgInByaWNlIiwgaXRvYShwcmljZSksCgkJInBlcmlvZEJsb2NrcyIsIGl0b2EocGVyaW9kQmxvY2tzKSkKCXJldHVybiBpZAp9CgovLyBSZXRpcmVQbGFuIHJldGlyZXMgb25lIG9mIHRoaXMgcmVhbG0ncyBwbGFucyBkb3duc3RyZWFtLiBBZG1pbiBvbmx5LgpmdW5jIFJldGlyZVBsYW4oY3VyIHJlYWxtLCBwbGFuSUQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglzdWJzLlJldGlyZVBsYW4oY3Jvc3MoY3VyKSwgcGxhbklEKQoJY2hhaW4uRW1pdCgiUGxhblJldGlyZWQiLCAicGxhbklkIiwgaXRvYShwbGFuSUQpKQp9CgovLyBQdWxsIGNsYWltcyB0aGlzIHJlYWxtJ3MgZW50aXJlIGFjY3J1ZWQgcHJvdmlkZXIgYmFsYW5jZSBmcm9tIHRoZQovLyBzdWJzY3JpcHRpb25zIHJlYWxtIGFuZCBkaXN0cmlidXRlcyBpdCB0byB0aGUgbWVtYmVycyBieSB3ZWlnaHQuCi8vIFBlcm1pc3Npb25sZXNzOiBwdWxsaW5nIGNhbiBvbmx5IG1vdmUgdGhlIHJlY2VpdmFibGUgaW50byBtZW1iZXIKLy8gYmFsYW5jZXMgYXQgdGhlIGZpeGVkIHdlaWdodHMsIHNvIGFueW9uZSBtYXkgY3JhbmsgaXQuIFJlZnVzZXMKLy8gQkVGT1JFIHRoZSBkb3duc3RyZWFtIGNhbGwgd2hlbiBubyBtZW1iZXIgY291bGQgcmVjZWl2ZSB0aGUgZnVuZHMuCmZ1bmMgUHVsbChjdXIgcmVhbG0pIGludDY0IHsKCWFzc2VydE5vU2VuZCgpCglpZiB0b3RhbFdlaWdodCA9PSAwIHsKCQlwYW5pYygibm8gbWVtYmVycyBjb25maWd1cmVkIHRvIHJlY2VpdmUgcmV2ZW51ZSIpCgl9CgoJYmVmb3JlIDo9IGNvaW5pby5IZWxkQXQoc2VsZiwgRGVub20pCglzdWJzLkNsYWltQWxsKGNyb3NzKGN1cikpCglhbW91bnQgOj0gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgLSBiZWZvcmUKCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiZG93bnN0cmVhbSBjbGFpbSBkZWxpdmVyZWQgbm90aGluZyIpCgl9CgoJZGlzdHJpYnV0ZShhbW91bnQpCglwdWxsZWQgKz0gYW1vdW50CgljaGFpbi5FbWl0KCJQdWxsZWQiLCAiYW1vdW50IiwgaXRvYShhbW91bnQpLCAicHVsbGVkVG90YWwiLCBpdG9hKHB1bGxlZCkpCglyZXR1cm4gYW1vdW50Cn0KCi8vIGRpc3RyaWJ1dGUgc3BsaXRzIGFtb3VudCBieSBtZW1iZXIgd2VpZ2h0LiBTaGFyZXMgYXJlIGNvbXB1dGVkIGFzCi8vIChBL1cpKncgKyAoKEElVykqdykvVyDigJQgZmxvb3IoQSp3L1cpIHdpdGhvdXQgYW55IG11bHRpcGxpY2F0aW9uCi8vIHRoYXQgY2FuIG92ZXJmbG93LiBUaGUgcmVtYWluZGVyICg8IG51bWJlciBvZiBtZW1iZXJzKSBnb2VzIHRvIHRoZQovLyBoaWdoZXN0LXdlaWdodCBtZW1iZXIsIGxvd2VzdCBhZGRyZXNzIG9uIHRpZXM6IGRldGVybWluaXN0aWMsIGFuZAovLyBpdCBsZWF2ZXMgdGhlIHJlYWxtIHdpdGggbm8gdW5kaXN0cmlidXRlZCBwb29sIGF0IHJlc3QuCmZ1bmMgZGlzdHJpYnV0ZShhbW91bnQgaW50NjQpIHsKCXEgOj0gYW1vdW50IC8gdG90YWxXZWlnaHQKCXIgOj0gYW1vdW50ICUgdG90YWxXZWlnaHQKCglkaXN0cmlidXRlZCA6PSBpbnQ2NCgwKQoJZm9yIF8sIG0gOj0gcmFuZ2UgbWVtYmVycyB7CgkJc2hhcmUgOj0gcSptLndlaWdodCArIChyKm0ud2VpZ2h0KS90b3RhbFdlaWdodAoJCWlmIHNoYXJlID4gMCB7CgkJCWxlZGdlci5NdXN0RGVwb3NpdChtLmFkZHIuU3RyaW5nKCksIHNoYXJlLCAwKQoJCQlkaXN0cmlidXRlZCArPSBzaGFyZQoJCX0KCX0KCWlmIGR1c3QgOj0gYW1vdW50IC0gZGlzdHJpYnV0ZWQ7IGR1c3QgPiAwIHsKCQlsZWRnZXIuTXVzdERlcG9zaXQoZHVzdFJlY2lwaWVudCgpLlN0cmluZygpLCBkdXN0LCAwKQoJfQp9CgpmdW5jIGR1c3RSZWNpcGllbnQoKSBhZGRyZXNzIHsKCWJlc3QgOj0gbWVtYmVyc1swXQoJZm9yIF8sIG0gOj0gcmFuZ2UgbWVtYmVyc1sxOl0gewoJCWlmIG0ud2VpZ2h0ID4gYmVzdC53ZWlnaHQgfHwKCQkJKG0ud2VpZ2h0ID09IGJlc3Qud2VpZ2h0ICYmIG0uYWRkci5TdHJpbmcoKSA8IGJlc3QuYWRkci5TdHJpbmcoKSkgewoJCQliZXN0ID0gbQoJCX0KCX0KCXJldHVybiBiZXN0LmFkZHIKfQoKLy8gLS0tIG1lbWJlciBjbGFpbXMgLS0tCgovLyBDbGFpbSBzZW5kcyBhbW91bnQgdWdub3Qgb2YgdGhlIGNhbGxlcidzIGVhcm5lZCBiYWxhbmNlIHRvIHRoZQovLyBjYWxsZXIuCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3KGNhbGxlci5TdHJpbmcoKSwgYW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBDbGFpbUFsbCBzZW5kcyB0aGUgY2FsbGVyJ3MgZW50aXJlIGVhcm5lZCBiYWxhbmNlIHRvIHRoZSBjYWxsZXIuCmZ1bmMgQ2xhaW1BbGwoY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYW1vdW50LCBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3QWxsKGNhbGxlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWlmIGFtb3VudCA9PSAwIHsKCQlwYW5pYygibm90aGluZyB0byBjbGFpbSIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiQ2xhaW0iLCAidG8iLCBjYWxsZXIuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIC0tLSBhZG1pbmlzdHJhdGlvbiAtLS0KCi8vIFN3ZWVwRGVub20gcmVjb3ZlcnMgb3V0LW9mLWJhbmQgY29pbnMgdG8gdGhlIHN3ZWVwZXIuIEZvciB0aGUKLy8gYWNjb3VudGluZyBkZW5vbSB0aGUgcmVzZXJ2ZSBpcyB0aGUgZnVsbCBsZWRnZXIgbGlhYmlsaXR5IOKAlCBtZW1iZXIKLy8gYmFsYW5jZXMgYXJlIHN0cnVjdHVyYWxseSB1bnN3ZWVwYWJsZS4gU3dlZXBlciBvbmx5LgpmdW5jIFN3ZWVwRGVub20oY3VyIHJlYWxtLCBkZW5vbSBzdHJpbmcpIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gc3dlZXBlciB7CgkJcGFuaWMoInN3ZWVwZXIgb25seSIpCgl9CglyZXNlcnZlIDo9IGludDY0KDApCglpZiBkZW5vbSA9PSBEZW5vbSB7CgkJcmVzZXJ2ZSA9IGxlZGdlci5MaWFiaWxpdGllcygpCgl9Cglzd2VwdCA6PSBjb2luaW8uU3dlZXAoMCwgY3VyLCBzd2VlcGVyLCBkZW5vbSwgcmVzZXJ2ZSkKCWNoYWluLkVtaXQoIlN1cnBsdXNTd2VwdCIsICJ0byIsIHN3ZWVwZXIuU3RyaW5nKCksICJjb2lucyIsIGl0b2Eoc3dlcHQpK2Rlbm9tKQp9CgovLyBUcmFuc2ZlckFkbWluIHN0YWdlcyBhIHR3by1zdGVwIGFkbWluIGhhbmRvdmVyLgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCBzdWNjZXNzb3IgYWRkcmVzcykgewoJYXNzZXJ0Tm9TZW5kKCkKCWFzc2VydEFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCXZhciB6ZXJvIGFkZHJlc3MKCWlmIHN1Y2Nlc3NvciA9PSB6ZXJvIHsKCQlwYW5pYygic3VjY2Vzc29yIG11c3Qgbm90IGJlIHRoZSB6ZXJvIGFkZHJlc3MiKQoJfQoJcGVuZGluZ0FkbWluID0gc3VjY2Vzc29yCgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVyU3RhZ2VkIiwgImZyb20iLCBhZG1pbi5TdHJpbmcoKSwgInRvIiwgc3VjY2Vzc29yLlN0cmluZygpKQp9CgovLyBBY2NlcHRBZG1pbiBjb21wbGV0ZXMgdGhlIGhhbmRvdmVyOyBvbmx5IHRoZSBzdGFnZWQgc3VjY2Vzc29yIG1heS4KLy8gVGhlIHN3ZWVwZXIgcm9sZSBtb3ZlcyB3aXRoIHRoZSBhZG1pbi4KZnVuYyBBY2NlcHRBZG1pbihjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBjYWxsZXIgIT0gcGVuZGluZ0FkbWluIHsKCQlwYW5pYygib25seSB0aGUgc3RhZ2VkIHN1Y2Nlc3NvciBtYXkgYWNjZXB0IikKCX0KCW9sZCA6PSBhZG1pbgoJYWRtaW4gPSBjYWxsZXIKCXN3ZWVwZXIgPSBjYWxsZXIKCXZhciB6ZXJvIGFkZHJlc3MKCXBlbmRpbmdBZG1pbiA9IHplcm8KCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJyZWQiLCAiZnJvbSIsIG9sZC5TdHJpbmcoKSwgInRvIiwgYWRtaW4uU3RyaW5nKCkpCn0KCi8vIC0tLSB2aWV3cyAtLS0KCmZ1bmMgQWRtaW4oKSBhZGRyZXNzICAgICAgICB7IHJldHVybiBhZG1pbiB9CmZ1bmMgUGVuZGluZ0FkbWluKCkgYWRkcmVzcyB7IHJldHVybiBwZW5kaW5nQWRtaW4gfQpmdW5jIE1lbWJlckNvdW50KCkgaW50NjQgICAgeyByZXR1cm4gaW50NjQobGVuKG1lbWJlcnMpKSB9CmZ1bmMgVG90YWxXZWlnaHQoKSBpbnQ2NCAgICB7IHJldHVybiB0b3RhbFdlaWdodCB9CmZ1bmMgTWVtYmVyV2VpZ2h0KGEgYWRkcmVzcykgaW50NjQgewoJaSA6PSBpbmRleE9mKGEpCglpZiBpIDwgMCB7CgkJcGFuaWMoIm5vdCBhIG1lbWJlciIpCgl9CglyZXR1cm4gbWVtYmVyc1tpXS53ZWlnaHQKfQpmdW5jIEJhbGFuY2VPZihhIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoYS5TdHJpbmcoKSkgfQpmdW5jIFVzZXJzVG90YWwoKSBpbnQ2NCAgICAgICAgIHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQpmdW5jIFB1bGxlZCgpIGludDY0ICAgICAgICAgICAgIHsgcmV0dXJuIHB1bGxlZCB9CmZ1bmMgTnVtUGxhbnMoKSBpbnQ2NCAgICAgICAgICAgeyByZXR1cm4gaW50NjQobGVuKHBsYW5JRHMpKSB9CmZ1bmMgUGxhbklEKGkgaW50NjQpIGludDY0IHsKCWlmIGkgPCAwIHx8IGkgPj0gaW50NjQobGVuKHBsYW5JRHMpKSB7CgkJcGFuaWMoInBsYW4gaW5kZXggb3V0IG9mIHJhbmdlIikKCX0KCXJldHVybiBwbGFuSURzW2ldCn0KZnVuYyBBZGRyZXNzKCkgYWRkcmVzcyB7IHJldHVybiBzZWxmIH0KZnVuYyBIZWxkKCkgaW50NjQgICAgICB7IHJldHVybiBjb2luaW8uSGVsZEF0KHNlbGYsIERlbm9tKSB9CgovLyBSZWNlaXZhYmxlIHJlYWRzIHRoaXMgcmVhbG0ncyBhY2NydWVkLCBub3QteWV0LXB1bGxlZCBwcm92aWRlcgovLyBiYWxhbmNlIGluc2lkZSB0aGUgc3Vic2NyaXB0aW9ucyByZWFsbSDigJQgdGhlIG90aGVyIHNpZGUgb2YgdmFsdWUKLy8gYm91bmRhcnkgQjIuIEl0IGlzIGRlbGliZXJhdGVseSBOT1QgcGFydCBvZiBIZWxkIG9yIG9mIHRoZSBsb2NhbAovLyBjb25zZXJ2YXRpb24gZXF1YXRpb24uCmZ1bmMgUmVjZWl2YWJsZSgpIGludDY0IHsgcmV0dXJuIHN1YnMuQmFsYW5jZU9mKHNlbGYpIH0KCi8vIC0tLSByZW5kZXIgLS0tCgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggIT0gIiIgewoJCXJldHVybiAidW5rbm93biBwYWdlOyB0cnkgdGhlIHJlYWxtIHJvb3QiCgl9CglvdXQgOj0gIiMgcmV2c2hhcmVcblxuIgoJb3V0ICs9ICJBIHRlYW0gcmV2ZW51ZSByZWFsbTogaXQgaXMgdGhlIFBST1ZJREVSIG9mIGl0cyAiICsKCQkic3Vic2NyaXB0aW9uIHBsYW5zLCBwdWxscyBhY2NydWVkIHJldmVudWUgYWNyb3NzIHRoZSByZWFsbSAiICsKCQkiYm91bmRhcnksIGFuZCBzcGxpdHMgaXQgYW1vbmcgd2VpZ2h0ZWQgbWVtYmVycyBpbnRvICIgKwoJCSJwdWxsLWNsYWltYWJsZSBiYWxhbmNlcy5cblxuIgoJb3V0ICs9ICItIHJlY2VpdmFibGUgKGluIHN1YnNjcmlwdGlvbnMpOiAiICsgaXRvYShSZWNlaXZhYmxlKCkpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gaGVsZCBoZXJlOiAiICsgaXRvYShIZWxkKCkpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gZWFybmVkLCB1bmNsYWltZWQ6ICIgKyBpdG9hKGxlZGdlci5Vc2Vyc1RvdGFsKCkpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gbGlmZXRpbWUgcHVsbGVkOiAiICsgaXRvYShwdWxsZWQpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gcGxhbnMgY3JlYXRlZCBoZXJlOiAiICsgaXRvYShpbnQ2NChsZW4ocGxhbklEcykpKSArICJcblxuIgoJb3V0ICs9ICIjIyBtZW1iZXJzXG5cbiIKCWlmIGxlbihtZW1iZXJzKSA9PSAwIHsKCQlvdXQgKz0gIihub25lIGNvbmZpZ3VyZWQpXG4iCgkJcmV0dXJuIG91dAoJfQoJb3V0ICs9ICJ8IG1lbWJlciB8IHdlaWdodCB8IHVuY2xhaW1lZCB8XG58LS0tfC0tLXwtLS18XG4iCglmb3IgXywgbSA6PSByYW5nZSBtZW1iZXJzIHsKCQlvdXQgKz0gInwgIiArIG0uYWRkci5TdHJpbmcoKSArICIgfCAiICsgaXRvYShtLndlaWdodCkgKyAiIHwgIiArCgkJCWl0b2EobGVkZ2VyLkJhbGFuY2VPZihtLmFkZHIuU3RyaW5nKCkpKSArIERlbm9tICsgIiB8XG4iCgl9CglvdXQgKz0gIlxuKHRvdGFsIHdlaWdodCAiICsgaXRvYSh0b3RhbFdlaWdodCkgKyAiOyByb3VuZGluZyBkdXN0ICIgKwoJCSJnb2VzIHRvIHRoZSBoaWdoZXN0LXdlaWdodCBtZW1iZXIpXG4iCglyZXR1cm4gb3V0Cn0KCi8vIC0tLSBpbnRlcm5hbHMgLS0tCgpmdW5jIGluZGV4T2YoYSBhZGRyZXNzKSBpbnQgewoJZm9yIGksIG0gOj0gcmFuZ2UgbWVtYmVycyB7CgkJaWYgbS5hZGRyID09IGEgewoJCQlyZXR1cm4gaQoJCX0KCX0KCXJldHVybiAtMQp9CgpmdW5jIGFzc2VydE5vU2VuZCgpIHsKCWlmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSAhPSAwIHsKCQlwYW5pYygidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgpmdW5jIGFzc2VydEFkbWluKGNhbGxlciBhZGRyZXNzKSB7CglpZiBjYWxsZXIgIT0gYWRtaW4gewoJCXBhbmljKCJhZG1pbiBvbmx5IikKCX0KfQoKZnVuYyBpdG9hKG4gaW50NjQpIHN0cmluZyB7IHJldHVybiBzdHJjb252LkZvcm1hdEludChuLCAxMCkgfQoaxIkBChFyZXZzaGFyZV90ZXN0LmdubxKtiQFwYWNrYWdlIHJldnNoYXJlCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdGVzdHV0aWxzL3YwIgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKCglzdWJzICJnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6Mzkvc3Vic2NyaXB0aW9ucyIKKQoKdmFyICgKCXRlc3RBZG1pbiA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygicnNhZG1pbiIpCglhbGljZSAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInJzYWxpY2UiKQoJYm9iICAgICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJyc2JvYiIpCglzdWJiZXIgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInJzc3ViYmVyIikKCXN1YmJlcjIgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygicnNzdWJiZXIyIikKCW1hbGxvcnkgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygicnNtYWxsb3J5IikKKQoKLy8gSGFybmVzcyBmYWN0cywgY2FycmllZCBmcm9tIHRoZSBzaWJsaW5nIHN1aXRlczogaW5pdCBydW5zIHdpdGggYW4KLy8gZW1wdHkgb3JpZ2luIChyZWFsIGRlcGxveXMgY2FwdHVyZSB0aGUgc2lnbmVyKTsgcmVhbG0gZ2xvYmFscyBwZXJzaXN0Ci8vIGFjcm9zcyB0ZXN0cyB3aGlsZSB0aGUgYmFua2VyIHJlc2V0czsgU2V0UmVhbG0gYmluZHMgdG8gdGhlIENBTExJTkcKLy8gZnJhbWUgb25seSwgc28gYXJtaW5nIGlzIGlubGluZWQgYXQgZXZlcnkgc2l0ZTsgU2tpcEhlaWdodHMgd2lwZXMgdGhlCi8vIG9yaWdpbiBjb250ZXh0LiBORVcgZm9yIGEgdHdvLXJlYWxtIG1vbmV5IHN1aXRlOiB0aGUgYmFua2VyIHJlc2V0Ci8vIGhpdHMgQk9USCByZWFsbXMsIHNvIGhlbGQtYmFsYW5jZSBzeW5jIG11c3QgcmVzdG9yZSByZXZzaGFyZSdzCi8vIGJhY2tpbmcgQU5EIHRoZSBkb3duc3RyZWFtIHN1YnNjcmlwdGlvbnMgcmVhbG0ncyBiYWNraW5nLCBvciB0aGUKLy8gZmlyc3QgY3Jvc3MtYm91bmRhcnkgYmFua2VyIHNlbmQgbWFjaGluZS1wYW5pY3MgdGhlIHJ1bi4KZnVuYyBpbml0KCkgewoJYWRtaW4gPSB0ZXN0QWRtaW4KCXN3ZWVwZXIgPSB0ZXN0QWRtaW4KCXNlbGYgPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3JldnNoYXJlIikKfQoKZnVuYyB1Z25vdChuIGludDY0KSBjaGFpbi5Db2lucyB7IHJldHVybiBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKERlbm9tLCBuKSkgfQoKZnVuYyBjb2luc09mKGEgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbihhLCBEZW5vbSkgfQoKLy8gY29uc2VydmVkIGFzc2VydHMgdGhlIGxvY2FsIGNvbnNlcnZhdGlvbiBlcXVhdGlvbiBhdCByZXN0OgovLyBldmVyeXRoaW5nIHRoaXMgcmVhbG0gaG9sZHMgaXMgbWVtYmVycycgZWFybmVkLWJ1dC11bmNsYWltZWQgdmFsdWUuCi8vIChPdXQtb2YtYmFuZCBzdXJwbHVzIHRlc3RzIG1hbmFnZSB0aGVpciBvd24gZXhwZWN0YXRpb25zLikKZnVuYyBjb25zZXJ2ZWQodCAqdGVzdGluZy5UKSB7Cgl0LkhlbHBlcigpCglpZiBIZWxkKCkgIT0gVXNlcnNUb3RhbCgpIHsKCQl0LkZhdGFsZigiY29uc2VydmF0aW9uIHZpb2xhdGVkOiBIZWxkPSVkIHVzZXJzPSVkIiwgSGVsZCgpLCBVc2Vyc1RvdGFsKCkpCgl9Cn0KCi8vIHN5bmNIZWxkIHJlc3RvcmVzIEJPVEggcmVhbG1zJyBiYW5rZXIgYmFja2luZyB0byBtYXRjaCB0aGVpcgovLyBwZXJzaXN0ZW50IGxlZGdlcnMgYWZ0ZXIgdGhlIGhhcm5lc3MgYmFua2VyIHJlc2V0LgpmdW5jIHN5bmNIZWxkKCkgewoJaWYgd2FudCwgaGF2ZSA6PSBVc2Vyc1RvdGFsKCksIGNvaW5zT2YoQWRkcmVzcygpKTsgd2FudCA+IGhhdmUgewoJCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KHdhbnQtaGF2ZSkpCgl9CglpZiB3YW50LCBoYXZlIDo9IHN1YnMuTGlhYmlsaXRpZXMoKSwgY29pbnNPZihzdWJzLkFkZHJlc3MoKSk7IHdhbnQgPiBoYXZlIHsKCQl0ZXN0aW5nLklzc3VlQ29pbnMoc3Vicy5BZGRyZXNzKCksIHVnbm90KHdhbnQtaGF2ZSkpCgl9Cn0KCi8vIFNldFJlYWxtIGJpbmRzIHRvIHRoZSBDQUxMSU5HIGZyYW1lIG9ubHksIHNvIGFybWluZyBpcyBpbmxpbmVkIGF0Ci8vIGV2ZXJ5IGNhbGwgc2l0ZSDigJQgYSBoZWxwZXIgdGhhdCBhcm1zIGFuZCByZXR1cm5zIGlzIHNpbGVudGx5Ci8vIGluZWZmZWN0aXZlICh0aGUgc2libGluZyBzdWl0ZXMnIGRvY3VtZW50ZWQgdHJhcCkuCgovLyBzdWJzY3JpYmUgZHJpdmVzIHRoZSBSRUFMIHN1YnNjcmlwdGlvbnMgcmVhbG06IHdobyBwYXlzIGV4YWN0bHkKLy8gcHJpY2UgaW50byBwbGFuSUQuIE5vdGhpbmcgaXMgbW9ja2VkLgpmdW5jIHN1YnNjcmliZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCwgd2hvIGFkZHJlc3MsIHBsYW5JRCwgcHJpY2UgaW50NjQpIGludDY0IHsKCXQuSGVscGVyKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0od2hvKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHdobykKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCgl0ZXN0aW5nLklzc3VlQ29pbnMoc3Vicy5BZGRyZXNzKCksIHVnbm90KHByaWNlKSkKCXJldHVybiBzdWJzLlN1YnNjcmliZShjcm9zcyhjdXIpLCBwbGFuSUQpCn0KCmZ1bmMgVGVzdEluaXRpYWxTdGF0ZSh0ICp0ZXN0aW5nLlQpIHsKCWlmIEFkbWluKCkgIT0gdGVzdEFkbWluIHx8IE1lbWJlckNvdW50KCkgIT0gMCB8fCBUb3RhbFdlaWdodCgpICE9IDAgfHwKCQlQdWxsZWQoKSAhPSAwIHx8IE51bVBsYW5zKCkgIT0gMCB7CgkJdC5GYXRhbCgidW5leHBlY3RlZCBpbml0aWFsIHN0YXRlIikKCX0KCWNvbnNlcnZlZCh0KQp9CgovLyBUaGUgbm8tbWVtYmVycyByZWZ1c2FsIG11c3QgZmlyZSBCRUZPUkUgYW55IGRvd25zdHJlYW0gY2FsbC4KZnVuYyBUZXN0UHVsbE5vTWVtYmVycyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJubyBtZW1iZXJzIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZSByZXZlbnVlIiwgZnVuYygpIHsKCQlQdWxsKGNyb3NzKGN1cikpCgl9KQp9CgpmdW5jIFRlc3RNZW1iZXJzaGlwKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9ubHkiLCBmdW5jKCkgewoJCUFkZE1lbWJlcihjcm9zcyhjdXIpLCBhbGljZSwgMykKCX0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXZhciB6ZXJvIGFkZHJlc3MKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiemVybyBhZGRyZXNzIiwgZnVuYygpIHsKCQlBZGRNZW1iZXIoY3Jvc3MoY3VyKSwgemVybywgMSkKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIndlaWdodCBtdXN0IGJlIGluIiwgZnVuYygpIHsKCQlBZGRNZW1iZXIoY3Jvc3MoY3VyKSwgYWxpY2UsIDApCgl9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJ3ZWlnaHQgbXVzdCBiZSBpbiIsIGZ1bmMoKSB7CgkJQWRkTWVtYmVyKGNyb3NzKGN1ciksIGFsaWNlLCBNYXhXZWlnaHQrMSkKCX0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCUFkZE1lbWJlcihjcm9zcyhjdXIpLCBhbGljZSwgMykKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglBZGRNZW1iZXIoY3Jvc3MoY3VyKSwgYm9iLCAxKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFscmVhZHkgYSBtZW1iZXIiLCBmdW5jKCkgewoJCUFkZE1lbWJlcihjcm9zcyhjdXIpLCBhbGljZSwgNSkKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm5vdCBhIG1lbWJlciIsIGZ1bmMoKSB7CgkJU2V0V2VpZ2h0KGNyb3NzKGN1ciksIG1hbGxvcnksIDIpCgl9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJ3ZWlnaHQgbXVzdCBiZSBpbiIsIGZ1bmMoKSB7CgkJU2V0V2VpZ2h0KGNyb3NzKGN1ciksIGFsaWNlLCAwKQoJfSkKCglpZiBNZW1iZXJDb3VudCgpICE9IDIgfHwgVG90YWxXZWlnaHQoKSAhPSA0IHx8CgkJTWVtYmVyV2VpZ2h0KGFsaWNlKSAhPSAzIHx8IE1lbWJlcldlaWdodChib2IpICE9IDEgewoJCXQuRmF0YWwoIm1lbWJlcnNoaXAgc3RhdGUgd3JvbmciKQoJfQp9CgovLyBUaGUgcHJvdmlkZXIgZmxvdyBhY3Jvc3MgYWxsIHRocmVlIHZhbHVlIGJvdW5kYXJpZXMsIGFnYWluc3QgdGhlCi8vIFJFQUwgc3Vic2NyaXB0aW9ucyByZWFsbS4KZnVuYyBUZXN0UHJvdmlkZXJGbG93QW5kUHVsbChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc3luY0hlbGQoKQoKCS8vIFBsYW4gY3JlYXRpb24gaXMgYWRtaW4tZ2F0ZWQgSEVSRSAocXVvdGEgZ3JpZWZpbmcpIGJlZm9yZSB0aGUKCS8vIGRvd25zdHJlYW0gY2FsbC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gb25seSIsIGZ1bmMoKSB7CgkJQ3JlYXRlUGxhbihjcm9zcyhjdXIpLCAidGVhbSIsICJkIiwgMTAwMCwgMTAsIDEwMDApCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglwbGFuSUQgOj0gQ3JlYXRlUGxhbihjcm9zcyhjdXIpLCAidGVhbSIsICJkIiwgMTAwMCwgMTAsIDEwMDApCglpZiBOdW1QbGFucygpICE9IDEgfHwgUGxhbklEKDApICE9IHBsYW5JRCB7CgkJdC5GYXRhbCgicGxhbiBib29ra2VlcGluZyB3cm9uZyIpCgl9CgoJLy8gRG93bnN0cmVhbSB0cnV0aDogdGhlIFBST1ZJREVSIG9mIHRoZSBwbGFuIGlzIHRoaXMgcmVhbG0uCglwcm92aWRlciwgXywgcHJpY2UsIF8sIF8sIHN0YXR1cywgXyA6PSBzdWJzLlBsYW5JbmZvKHBsYW5JRCkKCWlmIHByb3ZpZGVyICE9IEFkZHJlc3MoKSB8fCBwcmljZSAhPSAxMDAwIHx8IHN0YXR1cyAhPSAiYWN0aXZlIiB7CgkJdC5GYXRhbGYoImRvd25zdHJlYW0gcGxhbiB3cm9uZzogcHJvdmlkZXI9JXYgcHJpY2U9JWQgc3RhdHVzPSVxIiwKCQkJcHJvdmlkZXIsIHByaWNlLCBzdGF0dXMpCgl9CgoJLy8gQm91bmRhcnkgQjE6IHN1YnNjcmliZXIgcGF5cyB0aGUgc3Vic2NyaXB0aW9ucyByZWFsbSBkaXJlY3RseS4KCXN1YklEIDo9IHN1YnNjcmliZShjdXIsIHQsIHN1YmJlciwgcGxhbklELCAxMDAwKQoJaWYgUmVjZWl2YWJsZSgpICE9IDEwMDAgewoJCXQuRmF0YWxmKCJyZWNlaXZhYmxlPSVkLCB3YW50IDEwMDAiLCBSZWNlaXZhYmxlKCkpCgl9CglpZiBIZWxkKCkgIT0gMCB7CgkJdC5GYXRhbCgibm90aGluZyBzaG91bGQgYmUgaGVsZCBoZXJlIGJlZm9yZSBQdWxsIikKCX0KCV8gPSBzdWJJRAoKCS8vIEJvdW5kYXJ5IEIyOiBhbnlvbmUgbWF5IGNyYW5rIHRoZSBwdWxsIChwZXJtaXNzaW9ubGVzcykuCgloZWxkQmVmb3JlIDo9IEhlbGQoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJZ290IDo9IFB1bGwoY3Jvc3MoY3VyKSkKCWlmIGdvdCAhPSAxMDAwIHx8IEhlbGQoKS1oZWxkQmVmb3JlICE9IDEwMDAgfHwgUmVjZWl2YWJsZSgpICE9IDAgewoJCXQuRmF0YWxmKCJwdWxsIG1vdmVkIHdyb25nIHZhbHVlOiBnb3Q9JWQgaGVsZD0lZCByZWNlaXZhYmxlPSVkIiwKCQkJZ290LCBIZWxkKCksIFJlY2VpdmFibGUoKSkKCX0KCS8vIDM6MSBzcGxpdCBvZiAxMDAwIC0+IDc1MCAvIDI1MCwgbm8gZHVzdC4KCWlmIEJhbGFuY2VPZihhbGljZSkgIT0gNzUwIHx8IEJhbGFuY2VPZihib2IpICE9IDI1MCB8fCBCYWxhbmNlT2YobWFsbG9yeSkgIT0gMCB7CgkJdC5GYXRhbGYoInNwbGl0IHdyb25nOiBhbGljZT0lZCBib2I9JWQgbWFsbG9yeT0lZCIsCgkJCUJhbGFuY2VPZihhbGljZSksIEJhbGFuY2VPZihib2IpLCBCYWxhbmNlT2YobWFsbG9yeSkpCgl9CglpZiBQdWxsZWQoKSAhPSAxMDAwIHx8IFVzZXJzVG90YWwoKSAhPSAxMDAwIHsKCQl0LkZhdGFsKCJsaWZldGltZSBhY2NvdW50aW5nIHdyb25nIikKCX0KCWNvbnNlcnZlZCh0KQp9CgovLyBSZXBsYXk6IHRoZSBkb3duc3RyZWFtIHJlYWxtIGhvbGRzIHRoZSByZXBsYXkgZ3VhcmQg4oCUIGFuIGVtcHR5Ci8vIHJlY2VpdmFibGUgYWJvcnRzIHRoZXJlIGFuZCBubyBsb2NhbCBzdGF0ZSBjaGFuZ2VzLgpmdW5jIFRlc3RQdWxsUmVwbGF5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzeW5jSGVsZCgpCgl1c2Vyc0JlZm9yZSwgcHVsbGVkQmVmb3JlIDo9IFVzZXJzVG90YWwoKSwgUHVsbGVkKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibm90aGluZyB0byBjbGFpbSIsIGZ1bmMoKSB7CgkJUHVsbChjcm9zcyhjdXIpKQoJfSkKCWlmIFVzZXJzVG90YWwoKSAhPSB1c2Vyc0JlZm9yZSB8fCBQdWxsZWQoKSAhPSBwdWxsZWRCZWZvcmUgewoJCXQuRmF0YWwoImFib3J0ZWQgcHVsbCBtdXRhdGVkIHN0YXRlIikKCX0KCWNvbnNlcnZlZCh0KQp9CgovLyBSb3VuZGluZzogZHVzdCBnb2VzIHRvIHRoZSBoaWdoZXN0LXdlaWdodCBtZW1iZXIsIGRldGVybWluaXN0aWNhbGx5LAovLyBhbmQgdGhlIHN1bSBhbHdheXMgZXF1YWxzIHRoZSBwdWxsZWQgYW1vdW50IGV4YWN0bHkuCmZ1bmMgVGVzdFJvdW5kaW5nRHVzdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc3luY0hlbGQoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXBsYW5JRCA6PSBDcmVhdGVQbGFuKGNyb3NzKGN1ciksICJvZGQiLCAiZCIsIDEwMDEsIDEwLCAxMDAwKQoJc3Vic2NyaWJlKGN1ciwgdCwgc3ViYmVyMiwgcGxhbklELCAxMDAxKQoKCWEwLCBiMCA6PSBCYWxhbmNlT2YoYWxpY2UpLCBCYWxhbmNlT2YoYm9iKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUHVsbChjcm9zcyhjdXIpKQoJLy8gMTAwMSBhdCAzOjEgLT4gYWxpY2UgZmxvb3IgNzUwICsgZHVzdCAxID0gNzUxLCBib2IgMjUwLgoJaWYgQmFsYW5jZU9mKGFsaWNlKS1hMCAhPSA3NTEgfHwgQmFsYW5jZU9mKGJvYiktYjAgIT0gMjUwIHsKCQl0LkZhdGFsZigiZHVzdCBwb2xpY3kgd3Jvbmc6IGFsaWNlKyVkIGJvYislZCIsCgkJCUJhbGFuY2VPZihhbGljZSktYTAsIEJhbGFuY2VPZihib2IpLWIwKQoJfQoJY29uc2VydmVkKHQpCn0KCi8vIE1pbmltdW0gdmFsdWVzOiBhIDF1Z25vdCBwdWxsIHdoZXJlIGV2ZXJ5IGZsb29yIHNoYXJlIGlzIHplcm8gc3RpbGwKLy8gY29uc2VydmVzIOKAlCB0aGUgd2hvbGUgYW1vdW50IGlzIGR1c3QgdG8gdGhlIGhpZ2hlc3Qgd2VpZ2h0LgpmdW5jIFRlc3RNaW5pbXVtUHVsbChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc3luY0hlbGQoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXBsYW5JRCA6PSBDcmVhdGVQbGFuKGNyb3NzKGN1ciksICJtaW4iLCAiZCIsIDEsIDEwLCAxMDAwKQoJc3Vic2NyaWJlKGN1ciwgdCwgc3ViYmVyLCBwbGFuSUQsIDEpCgoJYTAsIGIwIDo9IEJhbGFuY2VPZihhbGljZSksIEJhbGFuY2VPZihib2IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglnb3QgOj0gUHVsbChjcm9zcyhjdXIpKQoJaWYgZ290ICE9IDEgfHwgQmFsYW5jZU9mKGFsaWNlKS1hMCAhPSAxIHx8IEJhbGFuY2VPZihib2IpLWIwICE9IDAgewoJCXQuRmF0YWwoIm1pbmltdW0gcHVsbCBtaXNoYW5kbGVkIikKCX0KCWNvbnNlcnZlZCh0KQp9CgovLyBXZWlnaHQgY2hhbmdlcyBzaGFwZSBGVVRVUkUgcHVsbHMgb25seTsgZWFybmVkIGJhbGFuY2VzIG5ldmVyIG1vdmUuCmZ1bmMgVGVzdFdlaWdodENoYW5nZUZ1dHVyZU9ubHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXN5bmNIZWxkKCkKCWEwLCBiMCA6PSBCYWxhbmNlT2YoYWxpY2UpLCBCYWxhbmNlT2YoYm9iKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglTZXRXZWlnaHQoY3Jvc3MoY3VyKSwgYm9iLCAzKQoJaWYgQmFsYW5jZU9mKGFsaWNlKSAhPSBhMCB8fCBCYWxhbmNlT2YoYm9iKSAhPSBiMCB7CgkJdC5GYXRhbCgid2VpZ2h0IGNoYW5nZSB0b3VjaGVkIGVhcm5lZCBiYWxhbmNlcyIpCgl9CglpZiBUb3RhbFdlaWdodCgpICE9IDYgewoJCXQuRmF0YWxmKCJ0b3RhbFdlaWdodD0lZCwgd2FudCA2IiwgVG90YWxXZWlnaHQoKSkKCX0KCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJcGxhbklEIDo9IENyZWF0ZVBsYW4oY3Jvc3MoY3VyKSwgImV2ZW4iLCAiZCIsIDYwMCwgMTAsIDEwMDApCglzdWJzY3JpYmUoY3VyLCB0LCBzdWJiZXIyLCBwbGFuSUQsIDYwMCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVB1bGwoY3Jvc3MoY3VyKSkKCS8vIDYwMCBhdCAzOjMgLT4gMzAwIGVhY2guCglpZiBCYWxhbmNlT2YoYWxpY2UpLWEwICE9IDMwMCB8fCBCYWxhbmNlT2YoYm9iKS1iMCAhPSAzMDAgewoJCXQuRmF0YWwoIm5ldyB3ZWlnaHRzIG5vdCBhcHBsaWVkIHRvIG5ldyByZXZlbnVlIikKCX0KCWNvbnNlcnZlZCh0KQp9CgovLyBCb3VuZGFyeSBCMzogbWVtYmVycyBwdWxsIHRoZWlyIGVhcm5pbmdzIG91dDsgc3RyYW5nZXJzIGdldCBub3RoaW5nLgpmdW5jIFRlc3RDbGFpbXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXN5bmNIZWxkKCkKCWVhcm5lZCA6PSBCYWxhbmNlT2YoYWxpY2UpCglpZiBlYXJuZWQgPT0gMCB7CgkJdC5GYXRhbCgiZml4dHVyZTogYWxpY2Ugc2hvdWxkIGhhdmUgZWFybmluZ3MiKQoJfQoJYmVmb3JlIDo9IGNvaW5zT2YoYWxpY2UpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFsaWNlKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCUNsYWltQWxsKGNyb3NzKGN1cikpCglpZiBjb2luc09mKGFsaWNlKS1iZWZvcmUgIT0gZWFybmVkIHx8IEJhbGFuY2VPZihhbGljZSkgIT0gMCB7CgkJdC5GYXRhbCgiY2xhaW0gZGlkIG5vdCBtb3ZlIHRoZSBlYXJuZWQgYmFsYW5jZSIpCgl9CgoJYm9iQmVmb3JlLCBib2JDb2lucyA6PSBCYWxhbmNlT2YoYm9iKSwgY29pbnNPZihib2IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJvYikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihib2IpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQ2xhaW0oY3Jvc3MoY3VyKSwgMTAwKQoJaWYgQmFsYW5jZU9mKGJvYikgIT0gYm9iQmVmb3JlLTEwMCB8fCBjb2luc09mKGJvYiktYm9iQ29pbnMgIT0gMTAwIHsKCQl0LkZhdGFsKCJwYXJ0aWFsIGNsYWltIHdyb25nIikKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJvYikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImluc3VmZmljaWVudCBiYWxhbmNlIiwgZnVuYygpIHsKCQlDbGFpbShjcm9zcyhjdXIpLCBCYWxhbmNlT2YoYm9iKSsxKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm5vdGhpbmcgdG8gY2xhaW0iLCBmdW5jKCkgewoJCUNsYWltQWxsKGNyb3NzKGN1cikpCgl9KQoJY29uc2VydmVkKHQpCn0KCi8vIFJlbW92YWwgbmV2ZXIgdG91Y2hlcyBlYXJuZWQgdmFsdWU6IHRoZSBleC1tZW1iZXIga2VlcHMgY2xhaW1pbmcuCmZ1bmMgVGVzdFJlbW92ZU1lbWJlcktlZXBzQmFsYW5jZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc3luY0hlbGQoKQoJYm9iQmFsIDo9IEJhbGFuY2VPZihib2IpCglpZiBib2JCYWwgPT0gMCB7CgkJdC5GYXRhbCgiZml4dHVyZTogYm9iIHNob3VsZCBzdGlsbCBoYXZlIGEgYmFsYW5jZSIpCgl9Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUmVtb3ZlTWVtYmVyKGNyb3NzKGN1ciksIGJvYikKCWlmIE1lbWJlckNvdW50KCkgIT0gMSB8fCBUb3RhbFdlaWdodCgpICE9IDMgfHwgQmFsYW5jZU9mKGJvYikgIT0gYm9iQmFsIHsKCQl0LkZhdGFsKCJyZW1vdmFsIGNvcnJ1cHRlZCBzdGF0ZSIpCgl9CgoJLy8gRnV0dXJlIHJldmVudWUgZ29lcyBlbnRpcmVseSB0byB0aGUgcmVtYWluaW5nIG1lbWJlci4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglwbGFuSUQgOj0gQ3JlYXRlUGxhbihjcm9zcyhjdXIpLCAic29sbyIsICJkIiwgNTAwLCAxMCwgMTAwMCkKCXN1YnNjcmliZShjdXIsIHQsIHN1YmJlciwgcGxhbklELCA1MDApCglhMCA6PSBCYWxhbmNlT2YoYWxpY2UpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglQdWxsKGNyb3NzKGN1cikpCglpZiBCYWxhbmNlT2YoYWxpY2UpLWEwICE9IDUwMCB8fCBCYWxhbmNlT2YoYm9iKSAhPSBib2JCYWwgewoJCXQuRmF0YWwoInBvc3QtcmVtb3ZhbCBkaXN0cmlidXRpb24gd3JvbmciKQoJfQoKCS8vIFRoZSBleC1tZW1iZXIncyBiYWxhbmNlIHJlbWFpbnMgY2xhaW1hYmxlLgoJYmVmb3JlIDo9IGNvaW5zT2YoYm9iKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYm9iKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCUNsYWltQWxsKGNyb3NzKGN1cikpCglpZiBjb2luc09mKGJvYiktYmVmb3JlICE9IGJvYkJhbCB7CgkJdC5GYXRhbCgiZXgtbWVtYmVyIGNvdWxkIG5vdCBjbGFpbSIpCgl9Cgljb25zZXJ2ZWQodCkKfQoKLy8gUGxhbiByZXRpcmVtZW50IGNyb3NzZXMgdGhlIGJvdW5kYXJ5IGFkbWluLWdhdGVkIGhlcmUsIHByb3ZpZGVyLW9ubHkKLy8gZG93bnN0cmVhbS4KZnVuYyBUZXN0UmV0aXJlUGxhbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc3luY0hlbGQoKQoJcGxhbklEIDo9IFBsYW5JRCgwKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvbmx5IiwgZnVuYygpIHsKCQlSZXRpcmVQbGFuKGNyb3NzKGN1ciksIHBsYW5JRCkKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUmV0aXJlUGxhbihjcm9zcyhjdXIpLCBwbGFuSUQpCglfLCBfLCBfLCBfLCBfLCBzdGF0dXMsIF8gOj0gc3Vicy5QbGFuSW5mbyhwbGFuSUQpCglpZiBzdGF0dXMgIT0gInJldGlyZWQiIHsKCQl0LkZhdGFsZigiZG93bnN0cmVhbSBub3QgcmV0aXJlZDogJXEiLCBzdGF0dXMpCgl9CgkvLyBEb3duc3RyZWFtIHJlZnVzZXMgbmV3IHN1YnNjcmlwdGlvbnMgdG8gYSByZXRpcmVkIHBsYW4uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxMDAwKSkKCXRlc3RpbmcuSXNzdWVDb2lucyhzdWJzLkFkZHJlc3MoKSwgdWdub3QoMTAwMCkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInBsYW4gaXMgbm90IGFjdGl2ZSIsIGZ1bmMoKSB7CgkJc3Vicy5TdWJzY3JpYmUoY3Jvc3MoY3VyKSwgcGxhbklEKQoJfSkKfQoKLy8gRXZlcnkgZW50cnlwb2ludCByZWZ1c2VzIGNvaW4tY2FycnlpbmcgdHJhbnNhY3Rpb25zLgpmdW5jIFRlc3RTdHJheVNlbmQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWZvciBfLCBmIDo9IHJhbmdlIFtdZnVuYygpewoJCWZ1bmMoKSB7IFB1bGwoY3Jvc3MoY3VyKSkgfSwKCQlmdW5jKCkgeyBDbGFpbUFsbChjcm9zcyhjdXIpKSB9LAoJCWZ1bmMoKSB7IEFkZE1lbWJlcihjcm9zcyhjdXIpLCBtYWxsb3J5LCAxKSB9LAoJCWZ1bmMoKSB7IENyZWF0ZVBsYW4oY3Jvc3MoY3VyKSwgIngiLCAiZCIsIDEwMDAsIDEwLCAxMDAwKSB9LAoJCWZ1bmMoKSB7IFN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pIH0sCgl9IHsKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCg1KSkKCQl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIiwgZikKCX0KfQoKLy8gT3V0LW9mLWJhbmQgdmFsdWU6IHRoZSByZXNlcnZlIHByb3RlY3RzIG1lbWJlciBiYWxhbmNlczsgZm9yZWlnbgovLyBkZW5vbWluYXRpb25zIHN3ZWVwIGluIGZ1bGwuCmZ1bmMgVGVzdFN3ZWVwUmVzZXJ2ZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc3luY0hlbGQoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibm8gc3VycGx1cyB0byBzd2VlcCIsIGZ1bmMoKSB7CgkJU3dlZXBEZW5vbShjcm9zcyhjdXIpLCBEZW5vbSkKCX0pCgoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoNzcpKQoJcmVzZXJ2ZUJlZm9yZSA6PSBVc2Vyc1RvdGFsKCkKCWdvdCA6PSBjb2luc09mKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglTd2VlcERlbm9tKGNyb3NzKGN1ciksIERlbm9tKQoJaWYgY29pbnNPZih0ZXN0QWRtaW4pLWdvdCAhPSA3NyB8fCBVc2Vyc1RvdGFsKCkgIT0gcmVzZXJ2ZUJlZm9yZSB7CgkJdC5GYXRhbCgic3dlZXAgd3Jvbmcgb3IgdG91Y2hlZCB0aGUgcmVzZXJ2ZSIpCgl9CgoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbigiZm9vIiwgOSkpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgImZvbyIpCglpZiBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2luKHRlc3RBZG1pbiwgImZvbyIpICE9IDkgewoJCXQuRmF0YWwoImZvcmVpZ24gZGVub20gbm90IHN3ZXB0IGluIGZ1bGwiKQoJfQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAic3dlZXBlciBvbmx5IiwgZnVuYygpIHsKCQlTd2VlcERlbm9tKGNyb3NzKGN1ciksIERlbm9tKQoJfSkKCWNvbnNlcnZlZCh0KQp9CgpmdW5jIFRlc3RBZG1pbkhhbmRvdmVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCBhbGljZSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib25seSB0aGUgc3RhZ2VkIHN1Y2Nlc3NvciBtYXkgYWNjZXB0IiwgZnVuYygpIHsKCQlBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYWxpY2UpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCWlmIEFkbWluKCkgIT0gYWxpY2UgewoJCXQuRmF0YWwoImF1dGhvcml0eSBkaWQgbm90IG1vdmUiKQoJfQoJLy8gRm9ybWVyIGFkbWluIGxvY2tlZCBvdXQgb2YgbWVtYmVycywgcGxhbnMgYW5kIHN3ZWVwLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gb25seSIsIGZ1bmMoKSB7CgkJQWRkTWVtYmVyKGNyb3NzKGN1ciksIG1hbGxvcnksIDEpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzd2VlcGVyIG9ubHkiLCBmdW5jKCkgewoJCVN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pCgl9KQoJLy8gSGFuZCBiYWNrLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhbGljZSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQp9CgpmdW5jIFRlc3RNZW1iZXJUYWJsZUJvdW5kcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCWZvciBpIDo9IE1lbWJlckNvdW50KCk7IGkgPCBpbnQ2NChNYXhNZW1iZXJzKTsgaSsrIHsKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgkJQWRkTWVtYmVyKGNyb3NzKGN1ciksIHRlc3R1dGlscy5UZXN0QWRkcmVzcygicnNmaWxsIitzdHJpbmcocnVuZSgnYScraSkpKSwgMSkKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm1lbWJlciB0YWJsZSBpcyBmdWxsIiwgZnVuYygpIHsKCQlBZGRNZW1iZXIoY3Jvc3MoY3VyKSwgdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJyc292ZXJmbG93IiksIDEpCgl9KQp9CgpmdW5jIFRlc3RSZW5kZXIodCAqdGVzdGluZy5UKSB7CglvdXQgOj0gUmVuZGVyKCIiKQoJaWYgIXN0cmluZ3MuQ29udGFpbnMob3V0LCAicmVjZWl2YWJsZSIpIHx8ICFzdHJpbmdzLkNvbnRhaW5zKG91dCwgInwgbWVtYmVyIHwiKSB7CgkJdC5GYXRhbCgicmVuZGVyIG1pc3Npbmcgc2VjdGlvbnMiKQoJfQoJaWYgUmVuZGVyKCJ4IikgPT0gUmVuZGVyKCIiKSB7CgkJdC5GYXRhbCgidW5rbm93biBwYXRoIGZlbGwgdGhyb3VnaCIpCgl9Cn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0xMjAwMDAwMHVnbm90EhMIgMq17gESCzI1MDAwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAj4X/dIPjgvMl3lBceHW8X9BwKjoqeJcJw9owPgnlFWnEkDgHadSs4WWIQx5D5ro8q3ttN8etTf6mSbgwKVBkdI55TX99ttblN6W/6Y8VHDge7vzNFWMk245fdZkRYcU+2GfGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl