Transaction executed successfully

Transaction Details

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

Transaction hash
92052B544ECF3D932FDB29C6E85051247D5673F1D9607DF1CDF4DE38D9E2D192

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
98,665,579
Gas consumed
FEE
250000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3912000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CvXOBAoML3ZtLm1fYWRkcGtnEuPOBAooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORKmzgQKDnNlcnZpY2VfbWFya2V0EkJnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6Mzkvc2VydmljZV9tYXJrZXQaaQoLZ25vbW9kLnRvbWwSWm1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6Mzkvc2VydmljZV9tYXJrZXQiCmdubyA9ICIwLjkiChqFhQIKEnNlcnZpY2VfbWFya2V0LmdubxLthAIvLyBSZWFsbSBzZXJ2aWNlX21hcmtldCBpcyBhIGN1c3RvZGlhbCBHTk9UIG1hcmtldHBsYWNlIGZvciBTRVJWSUNFUzoKLy8gcHJvdmlkZXJzIHB1Ymxpc2ggYSBzdGFuZGluZyBvZmZlciAodGl0bGUsIGRlc2NyaXB0aW9uLCBwcmljZSwKLy8gZGVsaXZlcnkgd2luZG93KSwgYSBjdXN0b21lciBwdXJjaGFzZXMgaXQgYnkgcGF5aW5nIHRoZSBleGFjdCBwcmljZQovLyBpbnRvIGVzY3JvdywgdGhlIHByb3ZpZGVyIG1hcmtzIHRoZSB3b3JrIGRlbGl2ZXJlZCwgYW5kIHRoZSBlc2Nyb3cgaXMKLy8gcmVsZWFzZWQgdG8gdGhlIHByb3ZpZGVyIG9ubHkgb25jZSB0aGUgY3VzdG9tZXIgYWNjZXB0cyDigJQgb3Igb25jZSB0aGUKLy8gYWNjZXB0YW5jZSB3aW5kb3cgbGFwc2VzLgovLwovLyBDT01QT1NJVElPTiAocGVyIHRoZSByZWNvcmRlZCBESVNDT1ZFUlkgLyBSRVVTRSBBTkFMWVNJUyBpbgovLyBESVNDT1ZFUlkubWQpOiBiYWxhbmNlIGFjY291bnRpbmcgaXMgZmVlbGVkZ2VyLCBjb2luIG1vdmVtZW50IGlzCi8vIGNvaW5pbywgZnJlZS10ZXh0IHJlbmRlciBzYWZldHkgaXMgcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MC4gVGhpcwovLyByZWFsbSBvd25zIG9ubHkgdGhlIHR3by1sZXZlbCBvZmZlci9vcmRlciBzdGF0ZSBtYWNoaW5lLCB3aGljaCB0aGUKLy8gZGlzY292ZXJ5IGdhdGUgZm91bmQgbm93aGVyZSBlbHNlOiBldmVyeSBlc2Nyb3cgcmVhbG0gaW4gdGhlIHNlYXJjaGVkCi8vIHNvdXJjZXMgZXNjcm93cyBGVU5ERVItRklSU1QgKHRoZSBwYXJ0eSB3aG8gd2lsbCBsYXRlciBkZWNpZGUgZXNjcm93cwovLyBmaXJzdCwgdGhlbiBzb2xpY2l0cyB3b3JrKSwgd2hpbGUgYSBzZXJ2aWNlIG1hcmtldHBsYWNlIG11c3QgZXNjcm93Ci8vIENVU1RPTUVSLUZJUlNUIGFnYWluc3QgYSBzdGFuZGluZyBvZmZlci4KLy8KLy8gTElGRUNZQ0xFLiBBIHNlcnZpY2UgaXMgYSByZXVzYWJsZSBvZmZlcjsgYW4gb3JkZXIgaXMgb25lIHB1cmNoYXNlIG9mCi8vIGl0LiBPcmRlciB0ZXJtaW5hbCBzdGF0ZXMgYXJlIGZyb3plbiBhbmQgcmVhY2hlZCBleGFjdGx5IG9uY2UuCi8vCi8vCVJlZ2lzdGVyU2VydmljZSAoYW55b25lLCBubyBjb2lucykgOiBzdGF0dXMgQWN0aXZlLiBUaGUgZmVlIGJwcyBpcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05BUFNIT1RURUQgdW5kZXIgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcidzIG93biBtYXhGZWVCcHMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlaWxpbmcuCi8vCVJldGlyZVNlcnZpY2UgKHByb3ZpZGVyIG9ubHkpICAgICAgOiBBY3RpdmUgLT4gUmV0aXJlZC4gQmxvY2tzIE5FVwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJzIG9ubHk7IG9yZGVycyBhbHJlYWR5IGluCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlnaHQgYXJlIHVudG91Y2hlZC4KLy8JUHVyY2hhc2VTZXJ2aWNlIChFT0EgKyAtc2VuZCkgICAgICA6IG9yZGVyIFB1cmNoYXNlZCwgYW1vdW50IGludG8KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY3Jvdy4gU2V0cyB0aGUgZGVsaXZlcnkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRsaW5lLgovLwlNYXJrRGVsaXZlcmVkIChwcm92aWRlciBvbmx5KSAgICAgIDogUHVyY2hhc2VkIC0+IERlbGl2ZXJlZC4gU3RhcnRzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWNjZXB0YW5jZSB3aW5kb3cuCi8vCUFjY2VwdERlbGl2ZXJ5IChjdXN0b21lciBvbmx5KSAgICAgOiBEZWxpdmVyZWQgLT4gUmVsZWFzZWQuIFRIRQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTT0xVVElPTi4gRXNjcm93IGJlY29tZXMgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcidzIGNsYWltYWJsZSBiYWxhbmNlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51cyB0aGUgc25hcHNob3R0ZWQgZmVlLgovLwlSZWxlYXNlVGltZW91dCAoYW55b25lKSAgICAgICAgICAgIDogRGVsaXZlcmVkIC0+IFJlbGVhc2VkIGFmdGVyCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhbmNlQmxvY2tzLiBEZWVtZWQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGFuY2UuCi8vCURlY2xpbmVPcmRlciAocHJvdmlkZXIgb25seSkgICAgICAgOiBQdXJjaGFzZWQgLT4gUmVmdW5kZWQsIGZlZS1mcmVlLgovLwlDbGFpbVJlZnVuZCAoYW55b25lKSAgICAgICAgICAgICAgIDogUHVyY2hhc2VkIC0+IFJlZnVuZGVkIGFmdGVyIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnkgZGVhZGxpbmUsIGZlZS1mcmVlLgovLwlDbGFpbSAvIENsYWltQWxsIChhbnlvbmUpICAgICAgICAgIDogcGF5cyBvdXQgdGhlIGNhbGxlcidzIG93bgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhaW1hYmxlIGJhbGFuY2UuCi8vCi8vIEVWRVJZIFZBTFVFIEVYSVQgSVMgQSBQVUxMLiBSZWxlYXNlIGFuZCByZWZ1bmQgb25seSBtb3ZlIG51bWJlcnMKLy8gYmV0d2VlbiB0aGUgZXNjcm93IHBvb2wgYW5kIGEgY2xhaW1hYmxlIGJhbGFuY2U7IHRoZSBiZW5lZmljaWFyeQovLyBsYXRlciBjYWxscyBDbGFpbS4gTm90aGluZyBpbiB0aGlzIHJlYWxtIGV2ZXIgcHVzaGVzIGNvaW5zIHRvIGEgdGhpcmQKLy8gcGFydHksIHdoaWNoIGlzIHdoYXQgbGV0cyBib3RoIHRpbWVvdXQgdmFsdmVzIHN0YXkgcGVybWlzc2lvbmxlc3M6IGEKLy8gc3RyYW5nZXIgdHJpZ2dlcmluZyBSZWxlYXNlVGltZW91dCBvciBDbGFpbVJlZnVuZCBwZXJmb3JtcyBubyBzZW5kLCBzbwovLyBhIGJlbmVmaWNpYXJ5IHRoYXQgY2Fubm90IHJlY2VpdmUgYSBzZW5kIGNhbiBuZXZlciBicmljayB0aGUgdmFsdmUuCi8vCi8vIFRIRSBUSFJFRSBSRVFVSVJFRCBQUk9URUNUSU9OUy4KLy8KLy8gVW5hdXRob3JpemVkIHNldHRsZW1lbnQ6IGV2ZXJ5IGlkZW50aXR5IGRlcml2ZXMgZnJvbSB0aGUgY3Jvc3NpbmcKLy8gZW50cnlwb2ludCdzIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKTsgbm8gZnVuY3Rpb24gdGFrZXMgYSBjYWxsZXIKLy8gaWRlbnRpdHkgYXMgYSBwYXJhbWV0ZXIgKHRoZSBkZXNpZ25hdGlvbi1mb3JnZXJ5IHNoYXBlIHRoYXQKLy8gZGlzcXVhbGlmaWVkIG1vc3Qgb2YgdGhlIGVzY3JvdyByZWFsbXMgZm91bmQgaW4gZGlzY292ZXJ5KS4gVGhlIHBheWVlCi8vIGlzIENPUElFRCBJTlRPIFRIRSBPUkRFUiBhdCBwdXJjaGFzZSwgc28gbmVpdGhlciByZXRpcmluZyB0aGUgc2VydmljZQovLyBub3IgYW55IGxhdGVyIGVkaXQgY2FuIHJlZGlyZWN0IGFuIGluLWZsaWdodCBvcmRlcidzIHBheW1lbnQuIFRoZXJlIGlzCi8vIG5vIGFkbWluIHBhdGggdG8gYW55IG9yZGVyJ3MgZXNjcm93OiB0aGUgYWRtaW4gc2V0cyB0aGUgZmVlIGZvciBGVVRVUkUKLy8gcmVnaXN0cmF0aW9ucyBhbmQgbm90aGluZyBlbHNlLgovLwovLyBEb3VibGUgcGF5bWVudDogYW4gb3JkZXIncyBzdGF0dXMgaXMgY2hlY2tlZCBhbmQgZHJpdmVuIHRlcm1pbmFsIGluCi8vIHRoZSBzYW1lIHRyYW5zYWN0aW9uIHRoYXQgbW92ZXMgaXRzIHZhbHVlLCBhbmQgZXNjcm93VG90YWwgaXMKLy8gZGVjcmVtZW50ZWQgaW4gbG9ja3N0ZXAgd2l0aCB0aGUgY3JlZGl0LiBSZWxlYXNlIGFuZCByZWZ1bmQgYm90aAovLyByZXF1aXJlIGEgbm9uLXRlcm1pbmFsIHN0YXR1cywgc28gYXQgbW9zdCBvbmUgb2YgdGhlbSBjYW4gZXZlcgovLyBzdWNjZWVkIGZvciBhIGdpdmVuIG9yZGVyLCBhbmQgbmVpdGhlciBjYW4gc3VjY2VlZCB0d2ljZS4KLy8KLy8gU3R1Y2sgZnVuZHM6IGJvdGggY291bnRlcnBhcnRpZXMgaGF2ZSBhIHBlcm1pc3Npb25sZXNzIHZhbHZlIGFnYWluc3QKLy8gdGhlIG90aGVyJ3MgaW5hY3Rpb24uIEEgcHJvdmlkZXIgd2hvIG5ldmVyIGRlbGl2ZXJzIGxvc2VzIHRoZSBlc2Nyb3cKLy8gYmFjayB0byB0aGUgY3VzdG9tZXIgYXQgdGhlIGRlbGl2ZXJ5IGRlYWRsaW5lIChDbGFpbVJlZnVuZCk7IGEKLy8gY3VzdG9tZXIgd2hvIG5ldmVyIGFjY2VwdHMgbG9zZXMgaXQgdG8gdGhlIHByb3ZpZGVyIGF0IHRoZSBhY2NlcHRhbmNlCi8vIGRlYWRsaW5lIChSZWxlYXNlVGltZW91dCkuIE5laXRoZXIgdmFsdmUgdHJ1c3RzIGl0cyBjYWxsZXIuCi8vCi8vIEFDQ0VQVEFOQ0UgSVMgQSBQUk9UT0NPTCBDT05TVEFOVCwgTk9UIEEgUFJPVklERVIgU0VUVElORy4gVGhlCi8vIHByb3ZpZGVyIGNob29zZXMgdGhlIGRlbGl2ZXJ5IHdpbmRvdyAodGhlaXIgb3duIGNvbW1pdG1lbnQsIGFuZCB0aGVpcgovLyBvd24gcmlzayksIGJ1dCBBY2NlcHRhbmNlQmxvY2tzIGlzIGZpeGVkLiBXZXJlIGl0IHByb3ZpZGVyLWNob3NlbiwgYQovLyBwcm92aWRlciB3b3VsZCBzZXQgaXQgdG8gemVybywgbWFyayB3b3JrIGRlbGl2ZXJlZCwgYW5kIGF1dG8tcmVsZWFzZQovLyBpbiB0aGUgc2FtZSBibG9jayDigJQgc2V0dGxlbWVudCB3aXRob3V0IHJlc29sdXRpb24sIHdlYXJpbmcgdGhlCi8vIGNvc3R1bWUgb2YgYSB0aW1lb3V0LgovLwovLyBNT05FVEFSWSBJTlZBUklBTlQgKGNvbnNlcnZhdGlvbikuIFdpdGggSCA9IHVnbm90IGhlbGQgYXQgdGhlIHJlYWxtCi8vIGFkZHJlc3MsIEUgPSBlc2Nyb3dUb3RhbCAozqMgYW1vdW50IG92ZXIgUHVyY2hhc2VkIGFuZCBEZWxpdmVyZWQKLy8gb3JkZXJzKSwgVSA9IGNsYWltYWJsZSBiYWxhbmNlcywgRiA9IHRoZSBmZWUgcG90LCBTID49IDAgb3V0LW9mLWJhbmQKLy8gc3VycGx1czoKLy8KLy8JSCA9PSBFICsgVSArIEYgKyBTCi8vCi8vIFB1cmNoYXNlU2VydmljZSByYWlzZXMgSCBhbmQgRSBieSBleGFjdGx5IHRoZSBwcmljZS4gUmVsZWFzZSBtb3ZlcwovLyBhbW91bnQgZnJvbSBFIHRvIFUrRiAoZmVlbGVkZ2VyIGd1YXJhbnRlZXMgY3JlZGl0ZWQgKyBmZWUgPT0gYW1vdW50KTsKLy8gcmVmdW5kIG1vdmVzIGFtb3VudCBmcm9tIEUgdG8gVSBhdCB6ZXJvIGZlZS4gQ2xhaW0qL1dpdGhkcmF3RmVlcyBkZWJpdAovLyB0aGUgbGVkZ2VyIGJlZm9yZSBjb2luaW8uUGF5b3V0IG1vdmVzIHRoZSBpZGVudGljYWwgYW1vdW50IG91dC4gQW55Ci8vIHBhbmljIGFib3J0cyB0aGUgd2hvbGUgdHJhbnNhY3Rpb247IHRoaXMgcmVhbG0gbmV2ZXIgaXNzdWVzIG9yIHJlbW92ZXMKLy8gY29pbnMuIFN1cnBsdXMgaXMgcmVjb3ZlcmFibGUgb25seSB2aWEgU3dlZXBEZW5vbSAoZmVlIHJlY2lwaWVudCksCi8vIHdoaWNoIHJlc2VydmVzIExpYWJpbGl0aWVzKCkgPSBFICsgVSArIEYuCi8vCi8vIExJTUlUQVRJT04g4oCUIE5PIERJU1BVVEUgQVJCSVRSQVRJT04sIERFTElCRVJBVEVMWS4gVGhpcyByZWFsbSByZXNvbHZlcwovLyBvbiBhY2NlcHRhbmNlIG9yIG9uIHRoZSBhY2NlcHRhbmNlIHRpbWVvdXQuIEl0IGRvZXMgTk9UIGFkanVkaWNhdGUKLy8gd2hldGhlciBkZWxpdmVyZWQgd29yayB3YXMgZ29vZC4gQSBjdXN0b21lciB3aG8gY29uc2lkZXJzIHRoZSB3b3JrCi8vIGluYWRlcXVhdGUgaGFzIG5vIGxldmVyIGhlcmUgYmV5b25kIGRlY2xpbmluZyB0byBhY2NlcHQsIGFuZCB0aGUKLy8gdGltZW91dCB3aWxsIHN0aWxsIHBheSB0aGUgcHJvdmlkZXIuIFRoYXQgaXMgYSByZWFsIGxpbWl0YXRpb24gYW5kIGl0Ci8vIGlzIHRoZSBkZWxpYmVyYXRlIHByaWNlIG9mIHRoZSBwcm9wZXJ0eSBhYm92ZTogYW4gYXJiaXRlciBlbXBvd2VyZWQgdG8KLy8gcmVkaXJlY3QgZXNjcm93IGlzIGEgcGFydHkgd2hvIGNhbiBzZWl6ZSBmdW5kcywgYW5kIHRoZSBjbG9zZXN0IHJlYWxtCi8vIGZvdW5kIGluIGRpc2NvdmVyeSAoci9zYW1jcmV3L2VzY3Jvd192MykgY2FycmllcyBleGFjdGx5IHRoYXQgc2hhcGUg4oCUCi8vIGEgc2luZ2xlIGhhcmRjb2RlZCBhZG1pbiBrZXksIHdpdGggbm8gcm90YXRpb24gZnVuY3Rpb24sIHRoYXQgaXMKLy8gc2ltdWx0YW5lb3VzbHkgc29sZSBhcmJpdGVyLCBhIHVuaWxhdGVyYWwgcmVsZWFzZSBwYXRoLCBhbmQgYQovLyBwZXJtYW5lbnQgcGF1c2Ugc3dpdGNoIG92ZXIgZXZlcnkgZnVuZCBwYXRoLiBBZGRpbmcgYXJiaXRyYXRpb24gaGVyZQovLyB3b3VsZCBjaGFuZ2Ugd2hhdCB0aGlzIGFwcGxpY2F0aW9uIElTIGFuZCBleHBhbmQgaXRzIHNlY3VyaXR5IG1vZGVsLAovLyBzbyBpdCBpcyByZWZ1c2VkIHJhdGhlciB0aGFuIHNtdWdnbGVkIGluLiBBIGRlcGxveW1lbnQgdGhhdCBuZWVkcwovLyBhZGp1ZGljYXRlZCBkaXNwdXRlcyBuZWVkcyB0aGF0IGRlc2lnbmVkLCBhdWRpdGVkIGFuZCBhdXRob3JpemVkIGFzCi8vIGl0cyBvd24gYXBwbGljYXRpb24uCi8vCi8vIFJFQUxNLUNBTExFUiBDQVZFQVQ6IGFzc2VydE5vU2VuZCByZWFkcyB0aGUgT1JJR0lOIHRyYW5zYWN0aW9uJ3Mgc2VuZAovLyBlbnZlbG9wZSwgbm90IHRoaXMgcmVhbG0ncyByZWNlaXB0LCBzbyBhIHJlYWxtIGNhbGxlciBpcyByZWZ1c2VkIGJ5Ci8vIGV2ZXJ5IG5vbi1wYXlhYmxlIGZ1bmN0aW9uIHdoZW5ldmVyIHRoZSBTQU1FIHRyYW5zYWN0aW9uIGF0dGFjaGVkIGEKLy8gLXNlbmQgYW55d2hlcmUg4oCUIGV2ZW4gdGhvdWdoIHRoaXMgcmVhbG0gcmVjZWl2ZWQgbm90aGluZy4gSXQgZmFpbHMKLy8gY2xvc2VkLCBpdCBpcyBub3QgdGhpcmQtcGFydHkgdHJpZ2dlcmFibGUsIGFuZCB0aGUgd29ya2Fyb3VuZCBpcyB0bwovLyBpc29sYXRlIHRoZSBjYWxsIGluIGl0cyBvd24gLXNlbmQtZnJlZSB0cmFuc2FjdGlvbi4KLy8KLy8gTmFtZWQgY29uY3JldGVseSwgYmVjYXVzZSB0aGUgZ2VuZXJpYyBwaHJhc2luZyB1bmRlcnN0YXRlcyB3aGVyZSBpdAovLyBsYW5kcy4gSXQgYXBwbGllcyB0byBldmVyeSBleHBvcnRlZCBmdW5jdGlvbiBleGNlcHQgUHVyY2hhc2VTZXJ2aWNlLAovLyB0aGUgb25seSBwYXlhYmxlIG9uZSwgYnV0IGZvdXIgb2YgdGhlbSBjYXJyeSB0aGUgd2VpZ2h0OgovLyBNYXJrRGVsaXZlcmVkLCB3aXRob3V0IHdoaWNoIG5vIG9yZGVyIGFnYWluc3QgYSByZWFsbSBwcm92aWRlciBjYW4KLy8gZXZlciByZWFjaCBhIHJlbGVhc2U7IFJlbGVhc2VUaW1lb3V0IGFuZCBDbGFpbVJlZnVuZCwgdGhlIHR3byB2YWx2ZXMKLy8gdGhpcyBkZXNpZ24gZGVsaWJlcmF0ZWx5IGxlYXZlcyBwZXJtaXNzaW9ubGVzczsgYW5kIENsYWltIC8gQ2xhaW1BbGwsCi8vIHRoZSBvbmx5IHBhdGhzIHRoYXQgZXh0cmFjdCBhIGNyZWRpdGVkIGJhbGFuY2UuIEEgcmVhbG0tYmFzZWQga2VlcGVyCi8vIGJvdCB0aGF0IGJhdGNoZXMgYSB2YWx2ZSBjYWxsIGludG8gYSB0cmFuc2FjdGlvbiBjYXJyeWluZyBjb2lucyBmb3IKLy8gc29tZSBvdGhlciBwdXJwb3NlIGlzIHRoZXJlZm9yZSBzaWxlbnRseSB1bnVzYWJsZSwgYW5kIGEgcmVhbG0KLy8gcHJvdmlkZXIgbXVzdCBidWRnZXQgYSBkZWRpY2F0ZWQgdHJhbnNhY3Rpb24gYm90aCB0byBkZWxpdmVyIGFuZCB0bwovLyBjb2xsZWN0LgovLyBSZXF1aXJlbWVudCAzIChubyBzdHVjayBmdW5kcykgc3Vydml2ZXMgdGhpczogYm90aCB2YWx2ZXMgYXJlCi8vIHBlcm1pc3Npb25sZXNzIGFuZCBhbnkgRU9BIGNhbiBwdWxsIHRoZW0sIHNvIG5vIG9yZGVyIGRlcGVuZHMgb24gYQovLyByZWFsbSBjYWxsZXIgdG8gdW5zdGljay4KcGFja2FnZSBzZXJ2aWNlX21hcmtldAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9jb2luaW8iCgkiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2ZlZWxlZGdlciIKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplL3YwIgopCgovLyBEZW5vbSBpcyB0aGUgb25seSBhc3NldCB0aGlzIHJlYWxtIGFjY2VwdHMuCmNvbnN0IERlbm9tID0gInVnbm90IgoKLy8gTWF4RmVlQnBzIGlzIHRoZSBoYXJkIHByb3RvY29sLWZlZSBjYXA6IDEwMDAgYnBzID0gMTAlLgpjb25zdCBNYXhGZWVCcHMgPSBpbnQ2NCgxMDAwKQoKLy8gQWNjZXB0YW5jZUJsb2NrcyBpcyBob3cgbG9uZyBhIGN1c3RvbWVyIGhhcyB0byBhY2NlcHQgYSBkZWxpdmVyeQovLyBiZWZvcmUgYW55b25lIG1heSByZWxlYXNlIGl0IHRvIHRoZSBwcm92aWRlci4gSXQgaXMgYSBQUk9UT0NPTAovLyBjb25zdGFudCBvbiBwdXJwb3NlIOKAlCBzZWUgdGhlIGhlYWRlci4gfjcgZGF5cyBhdCBwZWFybCdzIG9ic2VydmVkCi8vIH40LjJzIGJsb2Nrcy4KY29uc3QgQWNjZXB0YW5jZUJsb2NrcyA9IGludDY0KDE0MDAwMCkKCi8vIFNlcnZpY2Ugc3RhdHVzIHZhbHVlcy4KY29uc3QgKAoJU2VydmljZUFjdGl2ZSAgPSAiYWN0aXZlIgoJU2VydmljZVJldGlyZWQgPSAicmV0aXJlZCIKKQoKLy8gT3JkZXIgc3RhdHVzIHZhbHVlcy4gUmVsZWFzZWQgYW5kIFJlZnVuZGVkIGFyZSB0ZXJtaW5hbC4KY29uc3QgKAoJT3JkZXJQdXJjaGFzZWQgPSAicHVyY2hhc2VkIgoJT3JkZXJEZWxpdmVyZWQgPSAiZGVsaXZlcmVkIgoJT3JkZXJSZWxlYXNlZCAgPSAicmVsZWFzZWQiCglPcmRlclJlZnVuZGVkICA9ICJyZWZ1bmRlZCIKKQoKLy8gSW5wdXQgYm91bmRzLgpjb25zdCAoCglNYXhUaXRsZUxlbiA9IDgwCglNYXhEZXNjTGVuICA9IDIwMDAKCU1heFVSSUxlbiAgID0gNDAwCglNaW5QcmljZSAgICA9IGludDY0KDEpCgoJLy8gTWluRGVsaXZlcnlCbG9ja3MvTWF4RGVsaXZlcnlCbG9ja3MgYm91bmQgdGhlIHByb3ZpZGVyJ3Mgb3duCgkvLyB0dXJuYXJvdW5kIGNvbW1pdG1lbnQ6IH4xIGhvdXIgdG8gfjYwIGRheXMuCglNaW5EZWxpdmVyeUJsb2NrcyA9IGludDY0KDg1MCkKCU1heERlbGl2ZXJ5QmxvY2tzID0gaW50NjQoMTIwMDAwMCkKCgkvLyBNYXhTZXJ2aWNlc1BlclByb3ZpZGVyIGJvdW5kcyBjYXRhbG9nIG1vbm9wb2xpemF0aW9uIGJ5IGEgc2luZ2xlCgkvLyBhZGRyZXNzLiBUaGUgc2FtZSBmaW5kaW5nIHdhcyBSRUQgaW4gYm90aCBwZXJtaXNzaW9uX3JlZ2lzdHJ5IGFuZAoJLy8gc2VydmljZV9yZWdpc3RyeTsgaXQgaXMgY2hlYXBlciB0byBjYXJyeSB0aGUgY291bnRlciBmcm9tIHRoZQoJLy8gc3RhcnQgdGhhbiB0byBkaXNjb3ZlciBpdCBpbiBhbiBhdWRpdC4KCU1heFNlcnZpY2VzUGVyUHJvdmlkZXIgPSAyMAoKCS8vIFJlbmRlckxpbWl0IGJvdW5kcyB0aGUgaG9tZSBwYWdlLiBBbiB1bmJvdW5kZWQgUmVuZGVyIHdhcyBZRUxMT1cKCS8vIGluIHRocmVlIHByaW9yIGF1ZGl0cy4KCVJlbmRlckxpbWl0ID0gMjAKKQoKdHlwZSBzZXJ2aWNlIHN0cnVjdCB7CglpZCAgICAgICAgICAgICBpbnQ2NAoJcHJvdmlkZXIgICAgICAgYWRkcmVzcwoJdGl0bGUgICAgICAgICAgc3RyaW5nCglkZXNjcmlwdGlvbiAgICBzdHJpbmcKCXByaWNlICAgICAgICAgIGludDY0CglkZWxpdmVyeUJsb2NrcyBpbnQ2NAoJZmVlQnBzICAgICAgICAgaW50NjQgLy8gc25hcHNob3R0ZWQgYXQgcmVnaXN0cmF0aW9uLCBjaGFyZ2VkIGF0IHJlbGVhc2UKCXN0YXR1cyAgICAgICAgIHN0cmluZwoJb3JkZXJzICAgICAgICAgaW50NjQgLy8gbGlmZXRpbWUgY291bnQsIG5ldmVyIGRlY3JlbWVudGVkCn0KCnR5cGUgb3JkZXIgc3RydWN0IHsKCWlkICAgICAgICBpbnQ2NAoJc2VydmljZUlEIGludDY0CgljdXN0b21lciAgYWRkcmVzcwoJcHJvdmlkZXIgIGFkZHJlc3MgLy8gY29waWVkIGF0IHB1cmNoYXNlOyBuZXZlciByZS1yZWFkIGZyb20gdGhlIHNlcnZpY2UKCWFtb3VudCAgICBpbnQ2NAoJZmVlQnBzICAgIGludDY0IC8vIGNvcGllZCBhdCBwdXJjaGFzZSBmcm9tIHRoZSBzZXJ2aWNlJ3Mgc25hcHNob3QKCXN0YXR1cyAgICBzdHJpbmcKCglkZWxpdmVyeURlYWRsaW5lICAgaW50NjQgLy8gYWJzb2x1dGUgaGVpZ2h0OyBtZWFuaW5nZnVsIHdoaWxlIFB1cmNoYXNlZAoJYWNjZXB0YW5jZURlYWRsaW5lIGludDY0IC8vIGFic29sdXRlIGhlaWdodDsgc2V0IGF0IE1hcmtEZWxpdmVyZWQKCWRlbGl2ZXJ5VVJJICAgICAgICBzdHJpbmcKfQoKdmFyICgKCWFkbWluICAgICAgICBhZGRyZXNzIC8vIG1heSBzZXQgZmVlLCBmZWUgcmVjaXBpZW50LCBzdGFnZSBzdWNjZXNzb3IKCXBlbmRpbmdBZG1pbiBhZGRyZXNzIC8vIHN0YWdlZCBieSBUcmFuc2ZlckFkbWluLCBjb21wbGV0ZXMgdmlhIEFjY2VwdEFkbWluCglmZWVSZWNpcGllbnQgYWRkcmVzcyAvLyBtYXkgd2l0aGRyYXcgZmVlcyBhbmQgc3dlZXAgc3VycGx1cwoJZmVlQnBzICAgICAgIGludDY0ICAgLy8gZmVlIHNuYXBzaG90dGVkIGludG8gTkVXIHNlcnZpY2VzCgoJc2VsZiAgICAgICAgYWRkcmVzcyAvLyB0aGlzIHJlYWxtJ3MgYWRkcmVzcywgY2FwdHVyZWQgYXQgZGVwbG95CgluZXh0U2VydmljZSBpbnQ2NAoJbmV4dE9yZGVyICAgaW50NjQKCWVzY3Jvd1RvdGFsIGludDY0IC8vID09IM6jIGFtb3VudCBvdmVyIFB1cmNoYXNlZCBhbmQgRGVsaXZlcmVkIG9yZGVycwoKCXNlcnZpY2VzICAgID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRJRChpZCkgICAtPiAqc2VydmljZQoJb3JkZXJzICAgICAgPSBhdmwuTmV3VHJlZSgpIC8vIHBhZElEKGlkKSAgIC0+ICpvcmRlcgoJcHJvdmlkZXJOdW0gPSBhdmwuTmV3VHJlZSgpIC8vIGFkZHJlc3MgICAgIC0+ICppbnQ2NCwgc2VydmljZXMgcGVyIHByb3ZpZGVyCglsZWRnZXIgICAgICA9IGZlZWxlZGdlci5NdXN0TmV3KE1heEZlZUJwcykKKQoKZnVuYyBpbml0KCkgewoJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCWZlZVJlY2lwaWVudCA9IGFkbWluCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyAtLS0gcHJvdmlkZXIgc2lkZSAtLS0KCi8vIFJlZ2lzdGVyU2VydmljZSBwdWJsaXNoZXMgYSBzdGFuZGluZyBvZmZlciBhbmQgcmV0dXJucyBpdHMgaWQuIE5vCi8vIGNvaW5zIGFyZSBhY2NlcHRlZDsgdGhlIHN0b3JhZ2UgZGVwb3NpdCB0aGUgY2FsbGVyIHBheXMgaXMgdGhlCi8vIGFudGktc3BhbS4gVGhlIGN1cnJlbnQgcHJvdG9jb2wgZmVlIGlzIHNuYXBzaG90dGVkIGludG8gdGhlIHNlcnZpY2UKLy8gYW5kIG11c3Qgbm90IGV4Y2VlZCBtYXhGZWVCcHMsIHRoZSBjZWlsaW5nIHRoZSBwcm92aWRlciBzaWduZWQgZm9yIOKAlAovLyBwYXNzIE1heEZlZUJwcyB0byBhY2NlcHQgYW55IGxlZ2FsIGZlZS4KLy8KLy8gUHJvdmlkZXJzIG1heSBiZSBFT0FzIG9yIHJlYWxtcywgYnV0IGEgcmVhbG0gcHJvdmlkZXIgdGFrZXMgb24gdGhyZWUKLy8gb2JsaWdhdGlvbnMgdGhhdCB0aGlzIHJlYWxtIGNhbm5vdCBjaGVjayBmb3IgaXQuIFJlYWxtIGJ5dGVzIGFyZQovLyBpbW11dGFibGUgYWZ0ZXIgYWRkcGtnLCBzbyBhIHJlYWxtIGRlcGxveWVkIHdpdGhvdXQgdGhlbSBjYW5ub3QKLy8gYWNxdWlyZSB0aGVtIGxhdGVyOiBmYWlsaW5nICgxKSBtZWFucyBpdCBuZXZlciBlYXJucywgZmFpbGluZyAoMikgb3IKLy8gKDMpIG1lYW5zIHdoYXQgaXQgZWFybmVkIGlzIHBlcm1hbmVudGx5IHN0cmFuZGVkLgovLwovLyAgMS4gSXQgbXVzdCBhbHJlYWR5IGV4cG9zZSBhIGNyb3NzaW5nIGVudHJ5cG9pbnQgdGhhdCBjYWxscwovLyAgICAgTWFya0RlbGl2ZXJlZC4gVGhhdCBpcyB0aGUgb25seSB0cmFuc2l0aW9uIHRvIE9yZGVyRGVsaXZlcmVkLCBhbmQKLy8gICAgIGJvdGggcmVsZWFzZSBwYXRocyByZXF1aXJlIGl0LCBzbyBhIHByb3ZpZGVyIHJlYWxtIHRoYXQgY2Fubm90Ci8vICAgICBjYWxsIGl0IG5ldmVyIGVhcm5zIGEgY3JlZGl0IGF0IGFsbCDigJQgZXZlcnkgb3JkZXIgYWdhaW5zdCBpdCBydW5zCi8vICAgICB0byBDbGFpbVJlZnVuZCBpbnN0ZWFkLiBUaGlzIG9ibGlnYXRpb24gYmluZHMgYmVmb3JlIHRoZSBuZXh0IG9uZS4KLy8gIDIuIEl0IG11c3QgYWxyZWFkeSBleHBvc2UgYSBjcm9zc2luZyBlbnRyeXBvaW50IHRoYXQgY2FsbHMgQ2xhaW0gb3IKLy8gICAgIENsYWltQWxsIG9uIHRoaXMgcmVhbG0uIEEgY3JlZGl0ZWQgYmFsYW5jZSBpcyBhIHB1bGwsIG5ldmVyIGEKLy8gICAgIHB1c2g7IG5vdGhpbmcgaGVyZSBjYW4gcmVhY2ggaW50byBhIHByb3ZpZGVyIHJlYWxtIHRvIGRlbGl2ZXIgaXQuCi8vICAzLiBJdCBtdXN0IG1ha2UgYm90aCBjYWxscyBpbiB0cmFuc2FjdGlvbnMgd2hvc2UgT1JJR0lOIGNhcnJpZWQgbm8KLy8gICAgIC1zZW5kLCBwZXIgdGhlIFJFQUxNLUNBTExFUiBDQVZFQVQgaW4gdGhlIHBhY2thZ2UgaGVhZGVyLgovLwovLyBUaGUgY3VzdG9tZXIgc2lkZSBpcyBub3Qgc3ltbWV0cmljOiBQdXJjaGFzZVNlcnZpY2UgaXMgcGF5YWJsZSBhbmQKLy8gcm91dGVzIHRocm91Z2ggY29pbmlvLlJlY2VpdmUsIHdoaWNoIHJlcXVpcmVzIGFuIEVPQSBjYWxsaW5nIGRpcmVjdGx5Ci8vIHZpYSBNc2dDYWxsLiBBIHJlYWxtIGNhbiB0aGVyZWZvcmUgc2VsbCBhIHNlcnZpY2UgaGVyZSBidXQgY2Fubm90IGJ1eQovLyBvbmUg4oCUIGFuZCAiY2FuIHNlbGwiIGlzIGV4YWN0bHkgYXMgc3Ryb25nIGFzIHRoZSB0aHJlZSBvYmxpZ2F0aW9ucwovLyBhYm92ZSwgbm8gc3Ryb25nZXIuIEEgY3VzdG9tZXIgaXMgc3RydWN0dXJhbGx5IGFsd2F5cyBhbiBFT0EsIHdoaWNoCi8vIGlzIHdoeSB0aGUgcGVybWlzc2lvbmxlc3MgdmFsdmVzIGFyZSBhbHdheXMgcHVsbGFibGUuCmZ1bmMgUmVnaXN0ZXJTZXJ2aWNlKGN1ciByZWFsbSwgdGl0bGUsIGRlc2NyaXB0aW9uIHN0cmluZywgcHJpY2UsIGRlbGl2ZXJ5QmxvY2tzLCBtYXhGZWVCcHMgaW50NjQpIGludDY0IHsKCWFzc2VydE5vU2VuZCgpCglwcm92aWRlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCglhc3NlcnRWYWxpZFRpdGxlKHRpdGxlKQoJaWYgbGVuKGRlc2NyaXB0aW9uKSA+IE1heERlc2NMZW4gewoJCXBhbmljKCJkZXNjcmlwdGlvbiBtdXN0IGJlIGF0IG1vc3QgIiArIHN0cmNvbnYuSXRvYShNYXhEZXNjTGVuKSArICIgY2hhcmFjdGVycyIpCgl9CglpZiBwcmljZSA8IE1pblByaWNlIHsKCQlwYW5pYygicHJpY2UgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QcmljZSkgKyBEZW5vbSkKCX0KCWlmIGRlbGl2ZXJ5QmxvY2tzIDwgTWluRGVsaXZlcnlCbG9ja3MgfHwgZGVsaXZlcnlCbG9ja3MgPiBNYXhEZWxpdmVyeUJsb2NrcyB7CgkJcGFuaWMoImRlbGl2ZXJ5QmxvY2tzIG11c3QgYmUgIiArIGl0b2EoTWluRGVsaXZlcnlCbG9ja3MpICsgIi0iICsgaXRvYShNYXhEZWxpdmVyeUJsb2NrcykpCgl9CglpZiBtYXhGZWVCcHMgPCAwIHx8IG1heEZlZUJwcyA+IE1heEZlZUJwcyB7CgkJcGFuaWMoIm1heEZlZUJwcyBtdXN0IGJlIDAtIiArIGl0b2EoTWF4RmVlQnBzKSkKCX0KCWlmIGZlZUJwcyA+IG1heEZlZUJwcyB7CgkJcGFuaWMoImN1cnJlbnQgZmVlICIgKyBpdG9hKGZlZUJwcykgKyAiIGJwcyBleGNlZWRzIHlvdXIgY2VpbGluZyBvZiAiICsgaXRvYShtYXhGZWVCcHMpICsgIiBicHMiKQoJfQoJaWYgY291bnRGb3IocHJvdmlkZXIpID49IE1heFNlcnZpY2VzUGVyUHJvdmlkZXIgewoJCXBhbmljKCJhdCBtb3N0ICIgKyBzdHJjb252Lkl0b2EoTWF4U2VydmljZXNQZXJQcm92aWRlcikgKyAiIHNlcnZpY2VzIHBlciBwcm92aWRlciIpCgl9CgoJaWQgOj0gbmV4dFNlcnZpY2UKCW5leHRTZXJ2aWNlKysKCXNlcnZpY2VzLlNldChwYWRJRChpZCksICZzZXJ2aWNlewoJCWlkOiAgICAgICAgICAgICBpZCwKCQlwcm92aWRlcjogICAgICAgcHJvdmlkZXIsCgkJdGl0bGU6ICAgICAgICAgIHRpdGxlLAoJCWRlc2NyaXB0aW9uOiAgICBkZXNjcmlwdGlvbiwKCQlwcmljZTogICAgICAgICAgcHJpY2UsCgkJZGVsaXZlcnlCbG9ja3M6IGRlbGl2ZXJ5QmxvY2tzLAoJCWZlZUJwczogICAgICAgICBmZWVCcHMsCgkJc3RhdHVzOiAgICAgICAgIFNlcnZpY2VBY3RpdmUsCgl9KQoJYnVtcEZvcihwcm92aWRlciwgMSkKCgljaGFpbi5FbWl0KCJTZXJ2aWNlUmVnaXN0ZXJlZCIsCgkJImlkIiwgaXRvYShpZCksCgkJInByb3ZpZGVyIiwgcHJvdmlkZXIuU3RyaW5nKCksCgkJInByaWNlIiwgaXRvYShwcmljZSksCgkJImZlZUJwcyIsIGl0b2EoZmVlQnBzKSwKCSkKCXJldHVybiBpZAp9CgovLyBSZXRpcmVTZXJ2aWNlIHN0b3BzIGEgc2VydmljZSBhY2NlcHRpbmcgTkVXIG9yZGVycy4gT3JkZXJzIGFscmVhZHkgaW4KLy8gZmxpZ2h0IGtlZXAgdGhlaXIgb3duIGNvcGllcyBvZiBwcm92aWRlciwgYW1vdW50IGFuZCBmZWUsIGFuZCBydW4gdG8KLy8gdGhlaXIgb3duIHRlcm1pbmFsIHN0YXRlcyB1bmFmZmVjdGVkLiBQcm92aWRlciBvbmx5LCBhbmQgdGVybWluYWwg4oCUCi8vIHRoZXJlIGlzIG5vIHVuLXJldGlyZSwgc28gYSBjdXN0b21lciByZWFkaW5nICJhY3RpdmUiIGNhbm5vdCBoYXZlIGl0Ci8vIGZsaWNrZXIgdW5kZXJuZWF0aCB0aGVtLgpmdW5jIFJldGlyZVNlcnZpY2UoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCXMgOj0gbXVzdEdldFNlcnZpY2UoaWQpCglpZiBjYWxsZXIgIT0gcy5wcm92aWRlciB7CgkJcGFuaWMoIm9ubHkgdGhlIHByb3ZpZGVyIG1heSByZXRpcmUgdGhpcyBzZXJ2aWNlIikKCX0KCWlmIHMuc3RhdHVzICE9IFNlcnZpY2VBY3RpdmUgewoJCXBhbmljKCJzZXJ2aWNlIGlzIG5vdCBhY3RpdmUiKQoJfQoJcy5zdGF0dXMgPSBTZXJ2aWNlUmV0aXJlZAoJYnVtcEZvcihzLnByb3ZpZGVyLCAtMSkKCgljaGFpbi5FbWl0KCJTZXJ2aWNlUmV0aXJlZCIsICJpZCIsIGl0b2EoaWQpLCAicHJvdmlkZXIiLCBzLnByb3ZpZGVyLlN0cmluZygpKQp9CgovLyAtLS0gY3VzdG9tZXIgc2lkZSAtLS0KCi8vIFB1cmNoYXNlU2VydmljZSBlc2Nyb3dzIEVYQUNUTFkgdGhlIGxpc3RlZCBwcmljZSBhbmQgb3BlbnMgYW4gb3JkZXIuCi8vIFRoZSBjYWxsZXIgbXVzdCBiZSBhbiBFT0EgKGNvaW5pby5SZWNlaXZlIGlzIHRoZSByZWNlaXB0LWd1YXJhbnRlZWQKLy8gc2hhcGUpIGFuZCBtdXN0IGF0dGFjaCBleGFjdGx5IHRoZSBwcmljZSBpbiB1Z25vdDsgYW55IG1pc21hdGNoIGFib3J0cwovLyBhbmQgdGhlIGNvaW5zIHJldmVydCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU2VsZi1wdXJjaGFzZSBpcyByZWplY3RlZC4KZnVuYyBQdXJjaGFzZVNlcnZpY2UoY3VyIHJlYWxtLCBzZXJ2aWNlSUQgaW50NjQpIGludDY0IHsKCWN1c3RvbWVyLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCXMgOj0gbXVzdEdldFNlcnZpY2Uoc2VydmljZUlEKQoJaWYgcy5zdGF0dXMgIT0gU2VydmljZUFjdGl2ZSB7CgkJcGFuaWMoInNlcnZpY2UgaXMgbm90IGFjdGl2ZSIpCgl9CglpZiBjdXN0b21lciA9PSBzLnByb3ZpZGVyIHsKCQlwYW5pYygidGhlIHByb3ZpZGVyIGNhbm5vdCBwdXJjaGFzZSB0aGVpciBvd24gc2VydmljZSIpCgl9CglpZiBhbW91bnQgIT0gcy5wcmljZSB7CgkJcGFuaWMoInNlbmQgZXhhY3RseSB0aGUgbGlzdGVkIHByaWNlOiAiICsgaXRvYShzLnByaWNlKSArIERlbm9tKQoJfQoKCW5ld0VzY3Jvdywgb2sgOj0gY2hlY2tlZEFkZChlc2Nyb3dUb3RhbCwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygiZXNjcm93IHRvdGFsIHdvdWxkIG92ZXJmbG93IikKCX0KCglpZCA6PSBuZXh0T3JkZXIKCW5leHRPcmRlcisrCglvcmRlcnMuU2V0KHBhZElEKGlkKSwgJm9yZGVyewoJCWlkOiAgICAgICAgICAgICAgIGlkLAoJCXNlcnZpY2VJRDogICAgICAgIHNlcnZpY2VJRCwKCQljdXN0b21lcjogICAgICAgICBjdXN0b21lciwKCQlwcm92aWRlcjogICAgICAgICBzLnByb3ZpZGVyLAoJCWFtb3VudDogICAgICAgICAgIGFtb3VudCwKCQlmZWVCcHM6ICAgICAgICAgICBzLmZlZUJwcywKCQlzdGF0dXM6ICAgICAgICAgICBPcmRlclB1cmNoYXNlZCwKCQlkZWxpdmVyeURlYWRsaW5lOiBydW50aW1lLkNoYWluSGVpZ2h0KCkgKyBzLmRlbGl2ZXJ5QmxvY2tzLAoJfSkKCWVzY3Jvd1RvdGFsID0gbmV3RXNjcm93CglzLm9yZGVycysrCgoJY2hhaW4uRW1pdCgiU2VydmljZVB1cmNoYXNlZCIsCgkJIm9yZGVySWQiLCBpdG9hKGlkKSwKCQkic2VydmljZUlkIiwgaXRvYShzZXJ2aWNlSUQpLAoJCSJjdXN0b21lciIsIGN1c3RvbWVyLlN0cmluZygpLAoJCSJwcm92aWRlciIsIHMucHJvdmlkZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCSkKCXJldHVybiBpZAp9CgovLyBNYXJrRGVsaXZlcmVkIHJlY29yZHMgdGhhdCB0aGUgd29yayBpcyBkb25lIGFuZCBzdGFydHMgdGhlIGFjY2VwdGFuY2UKLy8gd2luZG93LiBQcm92aWRlciBvbmx5LiBUaGUgdXJpIGlzIGFuIG9wYXF1ZSByZWZlcmVuY2UgdG8gdGhlCi8vIGRlbGl2ZXJhYmxlOyB0aGlzIHJlYWxtIG5laXRoZXIgZmV0Y2hlcyBub3IgaW50ZXJwcmV0cyBpdCwgYW5kIGl0IGlzCi8vIHNhbml0aXplZCBvbiB0aGUgd2F5IG91dCB0byBSZW5kZXIuCi8vCi8vIERlbGl2ZXJpbmcgQUZURVIgdGhlIGRlbGl2ZXJ5IGRlYWRsaW5lIGlzIGFsbG93ZWQgYXMgbG9uZyBhcyBub2JvZHkKLy8gaGFzIHlldCBjYWxsZWQgQ2xhaW1SZWZ1bmQg4oCUIGxhdGUgd29yayB0aGUgY3VzdG9tZXIgc3RpbGwgd2FudHMgc2hvdWxkCi8vIG5vdCBiZSBkZXN0cm95ZWQgYnkgYSBkZWFkbGluZSB0aGF0IGV4aXN0cyB0byBwcm90ZWN0IHRoZSBjdXN0b21lci4KLy8gVGhlIGN1c3RvbWVyJ3MgcmVtZWR5IGlzIHVuY2hhbmdlZDogdGhleSBzaW1wbHkgZG8gbm90IGFjY2VwdCwgYW5kIHRoZQovLyByZWZ1bmQgdmFsdmUgc3RheXMgb3BlbiByaWdodCB1cCB1bnRpbCB0aGlzIHRyYW5zaXRpb24gbGFuZHMuCmZ1bmMgTWFya0RlbGl2ZXJlZChjdXIgcmVhbG0sIG9yZGVySUQgaW50NjQsIHVyaSBzdHJpbmcpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglvIDo9IG11c3RHZXRPcmRlcihvcmRlcklEKQoJaWYgY2FsbGVyICE9IG8ucHJvdmlkZXIgewoJCXBhbmljKCJvbmx5IHRoZSBwcm92aWRlciBtYXkgbWFyayB0aGlzIG9yZGVyIGRlbGl2ZXJlZCIpCgl9CglpZiBvLnN0YXR1cyAhPSBPcmRlclB1cmNoYXNlZCB7CgkJcGFuaWMoIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBkZWxpdmVyeSIpCgl9CglpZiBsZW4odXJpKSA+IE1heFVSSUxlbiB7CgkJcGFuaWMoInVyaSBtdXN0IGJlIGF0IG1vc3QgIiArIHN0cmNvbnYuSXRvYShNYXhVUklMZW4pICsgIiBjaGFyYWN0ZXJzIikKCX0KCglvLnN0YXR1cyA9IE9yZGVyRGVsaXZlcmVkCglvLmRlbGl2ZXJ5VVJJID0gdXJpCglvLmFjY2VwdGFuY2VEZWFkbGluZSA9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSArIEFjY2VwdGFuY2VCbG9ja3MKCgljaGFpbi5FbWl0KCJPcmRlckRlbGl2ZXJlZCIsCgkJIm9yZGVySWQiLCBpdG9hKG9yZGVySUQpLAoJCSJwcm92aWRlciIsIG8ucHJvdmlkZXIuU3RyaW5nKCksCgkJImFjY2VwdGFuY2VEZWFkbGluZSIsIGl0b2Eoby5hY2NlcHRhbmNlRGVhZGxpbmUpLAoJKQp9CgovLyBBY2NlcHREZWxpdmVyeSBpcyBUSEUgUkVTT0xVVElPTjogdGhlIGN1c3RvbWVyIGFjY2VwdHMgdGhlIGRlbGl2ZXJlZAovLyB3b3JrIGFuZCB0aGUgZXNjcm93IGJlY29tZXMgdGhlIHByb3ZpZGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UsIG1pbnVzCi8vIHRoZSBmZWUgc25hcHNob3R0ZWQgaW50byB0aGUgb3JkZXIgYXQgcHVyY2hhc2UuIEN1c3RvbWVyIG9ubHkuCmZ1bmMgQWNjZXB0RGVsaXZlcnkoY3VyIHJlYWxtLCBvcmRlcklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJbyA6PSBtdXN0R2V0T3JkZXIob3JkZXJJRCkKCWlmIGNhbGxlciAhPSBvLmN1c3RvbWVyIHsKCQlwYW5pYygib25seSB0aGUgY3VzdG9tZXIgbWF5IGFjY2VwdCB0aGlzIGRlbGl2ZXJ5IikKCX0KCWlmIG8uc3RhdHVzICE9IE9yZGVyRGVsaXZlcmVkIHsKCQlwYW5pYygib3JkZXIgaXMgbm90IGF3YWl0aW5nIGFjY2VwdGFuY2UiKQoJfQoJcmVsZWFzZShvLCAiYWNjZXB0ZWQiKQp9CgovLyBSZWxlYXNlVGltZW91dCByZWxlYXNlcyBhIGRlbGl2ZXJlZCBvcmRlciB0byB0aGUgcHJvdmlkZXIgb25jZSB0aGUKLy8gYWNjZXB0YW5jZSB3aW5kb3cgaGFzIGxhcHNlZC4gUGVybWlzc2lvbmxlc3M6IGEgY3VzdG9tZXIgd2hvIHN0b3BzCi8vIHJlc3BvbmRpbmcgbXVzdCBub3QgYmUgYWJsZSB0byBzdHJhbmQgYSBwcm92aWRlcidzIGNvbXBsZXRlZCB3b3JrLgovLyBUaGlzIGlzIGRlZW1lZCBhY2NlcHRhbmNlLCBhbmQgaXQgaXMgdGhlIG9ubHkgcGF0aCBieSB3aGljaCBlc2Nyb3cKLy8gcmVhY2hlcyBhIHByb3ZpZGVyIHdpdGhvdXQgdGhlIGN1c3RvbWVyJ3MgZXhwbGljaXQgYWN0LgpmdW5jIFJlbGVhc2VUaW1lb3V0KGN1ciByZWFsbSwgb3JkZXJJRCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCW8gOj0gbXVzdEdldE9yZGVyKG9yZGVySUQpCglpZiBvLnN0YXR1cyAhPSBPcmRlckRlbGl2ZXJlZCB7CgkJcGFuaWMoIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBhY2NlcHRhbmNlIikKCX0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8IG8uYWNjZXB0YW5jZURlYWRsaW5lIHsKCQlwYW5pYygiYWNjZXB0YW5jZSB3aW5kb3cgaGFzIG5vdCBsYXBzZWQ6ICIgKwoJCQlpdG9hKG8uYWNjZXB0YW5jZURlYWRsaW5lLXJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkgKyAiIGJsb2NrcyByZW1haW4iKQoJfQoJcmVsZWFzZShvLCAidGltZW91dCIpCn0KCi8vIERlY2xpbmVPcmRlciByZXR1cm5zIHRoZSBlc2Nyb3cgdG8gdGhlIGN1c3RvbWVyIGJlZm9yZSBkZWxpdmVyeS4KLy8gUHJvdmlkZXIgb25seSwgZmVlLWZyZWUg4oCUIGEgcHJvdmlkZXIgd2hvIGNhbm5vdCBmdWxmaWwgc2hvdWxkIGJlIGFibGUKLy8gdG8gaGFuZCB0aGUgbW9uZXkgc3RyYWlnaHQgYmFjayByYXRoZXIgdGhhbiB3YWl0IG91dCBhIGRlYWRsaW5lLiBTYWZlCi8vIHRvIGFsbG93IHVuaWxhdGVyYWxseSBiZWNhdXNlIGl0IG9ubHkgZXZlciBtb3ZlcyB2YWx1ZSBBV0FZIGZyb20gdGhlCi8vIGNhbGxlci4KZnVuYyBEZWNsaW5lT3JkZXIoY3VyIHJlYWxtLCBvcmRlcklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJbyA6PSBtdXN0R2V0T3JkZXIob3JkZXJJRCkKCWlmIGNhbGxlciAhPSBvLnByb3ZpZGVyIHsKCQlwYW5pYygib25seSB0aGUgcHJvdmlkZXIgbWF5IGRlY2xpbmUgdGhpcyBvcmRlciIpCgl9CglpZiBvLnN0YXR1cyAhPSBPcmRlclB1cmNoYXNlZCB7CgkJcGFuaWMoIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBkZWxpdmVyeSIpCgl9CglyZWZ1bmQobywgImRlY2xpbmVkIikKfQoKLy8gQ2xhaW1SZWZ1bmQgcmV0dXJucyB0aGUgZXNjcm93IHRvIHRoZSBjdXN0b21lciBvbmNlIHRoZSBwcm92aWRlciBoYXMKLy8gbWlzc2VkIHRoZSBkZWxpdmVyeSBkZWFkbGluZS4gUGVybWlzc2lvbmxlc3M6IGEgcHJvdmlkZXIgd2hvIGFiYW5kb25zCi8vIGFuIG9yZGVyIG11c3Qgbm90IGJlIGFibGUgdG8gc3RyYW5kIHRoZSBjdXN0b21lcidzIG1vbmV5LgovLwovLyBJdCBpcyBmZWUtZnJlZS4gQ2hhcmdpbmcgYSBwcm90b2NvbCBmZWUgb24gYSByZWZ1bmQgd291bGQgbWVhbiB0aGUKLy8gbWFya2V0cGxhY2UgcHJvZml0cyBmcm9tIHByb3ZpZGVyIG5vbi1wZXJmb3JtYW5jZS4KZnVuYyBDbGFpbVJlZnVuZChjdXIgcmVhbG0sIG9yZGVySUQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglvIDo9IG11c3RHZXRPcmRlcihvcmRlcklEKQoJaWYgby5zdGF0dXMgIT0gT3JkZXJQdXJjaGFzZWQgewoJCXBhbmljKCJvcmRlciBpcyBub3QgYXdhaXRpbmcgZGVsaXZlcnkiKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgby5kZWxpdmVyeURlYWRsaW5lIHsKCQlwYW5pYygiZGVsaXZlcnkgd2luZG93IGhhcyBub3QgbGFwc2VkOiAiICsKCQkJaXRvYShvLmRlbGl2ZXJ5RGVhZGxpbmUtcnVudGltZS5DaGFpbkhlaWdodCgpKSArICIgYmxvY2tzIHJlbWFpbiIpCgl9CglyZWZ1bmQobywgImV4cGlyZWQiKQp9CgovLyAtLS0gcGF5b3V0cyAtLS0KCi8vIENsYWltIHNlbmRzIGFtb3VudCB1Z25vdCBvZiB0aGUgY2FsbGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UgYmFjayB0byB0aGUKLy8gY2FsbGVyLgpmdW5jIENsYWltKGN1ciByZWFsbSwgYW1vdW50IGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgZXJyIDo9IGxlZGdlci5XaXRoZHJhdyhjYWxsZXIuU3RyaW5nKCksIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gQ2xhaW1BbGwgc2VuZHMgdGhlIGNhbGxlcidzIGVudGlyZSBjbGFpbWFibGUgYmFsYW5jZSBiYWNrIHRvIHRoZQovLyBjYWxsZXIuIEZhaWxzIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2xhaW0uCmZ1bmMgQ2xhaW1BbGwoY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYW1vdW50LCBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3QWxsKGNhbGxlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWlmIGFtb3VudCA9PSAwIHsKCQlwYW5pYygibm90aGluZyB0byBjbGFpbSIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiQ2xhaW0iLCAidG8iLCBjYWxsZXIuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIFdpdGhkcmF3RmVlcyBzZW5kcyB0aGUgYWNjcnVlZCBmZWUgcG90IHRvIHRoZSBmZWUgcmVjaXBpZW50LiBPbmx5IHRoZQovLyBmZWUgcmVjaXBpZW50IG1heSBjYWxsIGl0LgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBjYWxsZXIgIT0gZmVlUmVjaXBpZW50IHsKCQlwYW5pYygib25seSB0aGUgZmVlIHJlY2lwaWVudCBtYXkgd2l0aGRyYXcgZmVlcyIpCgl9CglpZiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWFtb3VudCA6PSBsZWRnZXIuV2l0aGRyYXdGZWVzKCkKCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBmZWVSZWNpcGllbnQsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJGZWVzV2l0aGRyYXduIiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBTd2VlcERlbm9tIHNlbmRzIHRoZSBzdXJwbHVzIG9mIGEgc2luZ2xlIGRlbm9taW5hdGlvbiB0byB0aGUgZmVlCi8vIHJlY2lwaWVudC4gRm9yIHVnbm90IG9ubHkgdGhlIGV4Y2VzcyBvdmVyIExpYWJpbGl0aWVzKCkgbW92ZXMg4oCUIHdoaWNoCi8vIHJlc2VydmVzIGxpdmUgZXNjcm93IGFzIHdlbGwgYXMgY2xhaW1hYmxlIGJhbGFuY2VzIGFuZCB0aGUgZmVlIHBvdCDigJQKLy8gYW5kIG90aGVyIGRlbm9tcyBtb3ZlIHdob2xseS4gT25seSB0aGUgZmVlIHJlY2lwaWVudCBtYXkgY2FsbCBpdC4KZnVuYyBTd2VlcERlbm9tKGN1ciByZWFsbSwgZGVub20gc3RyaW5nKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgY2FsbGVyICE9IGZlZVJlY2lwaWVudCB7CgkJcGFuaWMoIm9ubHkgdGhlIGZlZSByZWNpcGllbnQgbWF5IHN3ZWVwIHN1cnBsdXMiKQoJfQoJcmVzZXJ2ZSA6PSBpbnQ2NCgwKQoJaWYgZGVub20gPT0gRGVub20gewoJCXJlc2VydmUgPSBMaWFiaWxpdGllcygpCgl9Cglzd2VwdCA6PSBjb2luaW8uU3dlZXAoMCwgY3VyLCBmZWVSZWNpcGllbnQsIGRlbm9tLCByZXNlcnZlKQoJY2hhaW4uRW1pdCgiU3VycGx1c1N3ZXB0IiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiY29pbnMiLCBpdG9hKHN3ZXB0KStkZW5vbSkKfQoKLy8gLS0tIGFkbWluaXN0cmF0aW9uIC0tLQoKLy8gU2V0RmVlQnBzIHNldHMgdGhlIHByb3RvY29sIGZlZSBzbmFwc2hvdHRlZCBpbnRvIEZVVFVSRSBzZXJ2aWNlcy4KLy8gRXhpc3Rpbmcgc2VydmljZXMsIGFuZCBldmVyeSBvcmRlciBhbHJlYWR5IHBsYWNlZCBhZ2FpbnN0IHRoZW0sIGtlZXAKLy8gdGhlIGZlZSB0aGV5IHdlcmUgY3JlYXRlZCB1bmRlci4gQWRtaW4gb25seTsgYm91bmRlZCBieSBbMCwgTWF4RmVlQnBzXS4KZnVuYyBTZXRGZWVCcHMoY3VyIHJlYWxtLCBicHMgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiBicHMgPCAwIHx8IGJwcyA+IE1heEZlZUJwcyB7CgkJcGFuaWMoImZlZSBtdXN0IGJlIDAtIiArIGl0b2EoTWF4RmVlQnBzKSArICIgYnBzIikKCX0KCWZlZUJwcyA9IGJwcwoJY2hhaW4uRW1pdCgiRmVlQ2hhbmdlZCIsICJicHMiLCBpdG9hKGJwcykpCn0KCi8vIFNldEZlZVJlY2lwaWVudCBzZXRzIHRoZSBhZGRyZXNzIHRoYXQgbWF5IHdpdGhkcmF3IGZlZXMgYW5kIHN3ZWVwCi8vIHN1cnBsdXMuIEFkbWluIG9ubHkuCmZ1bmMgU2V0RmVlUmVjaXBpZW50KGN1ciByZWFsbSwgbmV4dCBhZGRyZXNzKSB7Cglhc3NlcnROb1NlbmQoKQoJYXNzZXJ0QWRtaW4oY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJaWYgIW5leHQuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBmZWUgcmVjaXBpZW50IGFkZHJlc3MiKQoJfQoJZmVlUmVjaXBpZW50ID0gbmV4dAoJY2hhaW4uRW1pdCgiRmVlUmVjaXBpZW50Q2hhbmdlZCIsICJ0byIsIG5leHQuU3RyaW5nKCkpCn0KCi8vIFRyYW5zZmVyQWRtaW4gc3RhZ2VzIGEgc3VjY2Vzc29yLiBUd28tc3RlcDogdGhlIHN1Y2Nlc3NvciBtdXN0IGNhbGwKLy8gQWNjZXB0QWRtaW4sIHNvIGEgdHlwbyBjYW5ub3Qgb3JwaGFuIHRoZSByZWFsbS4gQWRtaW4gb25seS4gUGFzc2luZwovLyB0aGUgemVybyBhZGRyZXNzIGNhbmNlbHMgYSBwZW5kaW5nIG5vbWluYXRpb247IGFueSBvdGhlciB2YWx1ZSBtdXN0IGJlCi8vIGEgd2VsbC1mb3JtZWQgYWRkcmVzcywgZm9yIHBhcml0eSB3aXRoIFNldEZlZVJlY2lwaWVudC4gVGhlIHR3by1zdGVwCi8vIGhhbmRvdmVyIGFscmVhZHkgbWFkZSBhIG1hbGZvcm1lZCBub21pbmVlIGhhcm1sZXNzIOKAlCBpdCBjb3VsZCBuZXZlcgovLyBjYWxsIEFjY2VwdEFkbWluIOKAlCBzbyB0aGlzIGNoZWNrIHJlamVjdHMgdGhlIHR5cG8gYXQgdGhlIHBvaW50IGl0IGlzCi8vIG1hZGUgcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBzdGFnZWQgYW5kIHJlYWRhYmxlIGFzIGEgcmVhbCBub21pbmF0aW9uLgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCBuZXh0IGFkZHJlc3MpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiBuZXh0ICE9ICIiICYmICFuZXh0LklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgYWRtaW4gYWRkcmVzcyIpCgl9CglwZW5kaW5nQWRtaW4gPSBuZXh0CgljaGFpbi5FbWl0KCJBZG1pbk5vbWluYXRlZCIsICJ0byIsIG5leHQuU3RyaW5nKCkpCn0KCi8vIEFjY2VwdEFkbWluIGNvbXBsZXRlcyBhIHN0YWdlZCBoYW5kb3Zlci4gT25seSB0aGUgbm9taW5lZSBtYXkgY2FsbCBpdC4KZnVuYyBBY2NlcHRBZG1pbihjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBwZW5kaW5nQWRtaW4gPT0gIiIgfHwgY2FsbGVyICE9IHBlbmRpbmdBZG1pbiB7CgkJcGFuaWMoIm9ubHkgdGhlIG5vbWluYXRlZCBhZG1pbiBtYXkgYWNjZXB0IikKCX0KCWFkbWluID0gY2FsbGVyCglwZW5kaW5nQWRtaW4gPSAiIgoJY2hhaW4uRW1pdCgiQWRtaW5UcmFuc2ZlcnJlZCIsICJ0byIsIGFkbWluLlN0cmluZygpKQp9CgovLyAtLS0gdmlld3MgLS0tCgpmdW5jIFNlcnZpY2VJbmZvKGlkIGludDY0KSAocHJvdmlkZXIgYWRkcmVzcywgdGl0bGUgc3RyaW5nLCBwcmljZSwgZGVsaXZlcnlCbG9ja3MsIGZlZUJwcyBpbnQ2NCwgc3RhdHVzIHN0cmluZywgb3JkZXJDb3VudCBpbnQ2NCkgewoJcyA6PSBtdXN0R2V0U2VydmljZShpZCkKCXJldHVybiBzLnByb3ZpZGVyLCBzLnRpdGxlLCBzLnByaWNlLCBzLmRlbGl2ZXJ5QmxvY2tzLCBzLmZlZUJwcywgcy5zdGF0dXMsIHMub3JkZXJzCn0KCmZ1bmMgU2VydmljZURlc2NyaXB0aW9uKGlkIGludDY0KSBzdHJpbmcgeyByZXR1cm4gbXVzdEdldFNlcnZpY2UoaWQpLmRlc2NyaXB0aW9uIH0KCmZ1bmMgT3JkZXJJbmZvKGlkIGludDY0KSAoc2VydmljZUlEIGludDY0LCBjdXN0b21lciwgcHJvdmlkZXIgYWRkcmVzcywgYW1vdW50LCBmZWVCcHMgaW50NjQsIHN0YXR1cyBzdHJpbmcpIHsKCW8gOj0gbXVzdEdldE9yZGVyKGlkKQoJcmV0dXJuIG8uc2VydmljZUlELCBvLmN1c3RvbWVyLCBvLnByb3ZpZGVyLCBvLmFtb3VudCwgby5mZWVCcHMsIG8uc3RhdHVzCn0KCi8vIE9yZGVyRGVhZGxpbmVzIHJldHVybnMgdGhlIHR3byBhYnNvbHV0ZSBoZWlnaHRzIHRoYXQgZ292ZXJuIGFuIG9yZGVyLgovLyBhY2NlcHRhbmNlRGVhZGxpbmUgaXMgMCB1bnRpbCB0aGUgb3JkZXIgaXMgZGVsaXZlcmVkLgpmdW5jIE9yZGVyRGVhZGxpbmVzKGlkIGludDY0KSAoZGVsaXZlcnlEZWFkbGluZSwgYWNjZXB0YW5jZURlYWRsaW5lIGludDY0KSB7CglvIDo9IG11c3RHZXRPcmRlcihpZCkKCXJldHVybiBvLmRlbGl2ZXJ5RGVhZGxpbmUsIG8uYWNjZXB0YW5jZURlYWRsaW5lCn0KCmZ1bmMgT3JkZXJVUkkoaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0R2V0T3JkZXIoaWQpLmRlbGl2ZXJ5VVJJIH0KCi8vIFF1b3RlIHJlcG9ydHMgd2hhdCBhIHB1cmNoYXNlIG9mIHRoaXMgc2VydmljZSB3b3VsZCBjb3N0IGFuZCB3aGF0IHRoZQovLyBwcm92aWRlciB3b3VsZCByZWNlaXZlIG9uIHJlc29sdXRpb24sIGF0IHRoZSBzZXJ2aWNlJ3Mgc25hcHNob3R0ZWQgZmVlLgpmdW5jIFF1b3RlKGlkIGludDY0KSAocHJpY2UsIGZlZSwgdG9Qcm92aWRlciBpbnQ2NCkgewoJcyA6PSBtdXN0R2V0U2VydmljZShpZCkKCWYsIGVyciA6PSBmZWVsZWRnZXIuRmVlRm9yKHMucHJpY2UsIHMuZmVlQnBzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIHMucHJpY2UsIGYsIHMucHJpY2UgLSBmCn0KCmZ1bmMgQWRtaW4oKSBhZGRyZXNzICAgICAgICAgICAgIHsgcmV0dXJuIGFkbWluIH0KZnVuYyBQZW5kaW5nQWRtaW4oKSBhZGRyZXNzICAgICAgeyByZXR1cm4gcGVuZGluZ0FkbWluIH0KZnVuYyBGZWVSZWNpcGllbnQoKSBhZGRyZXNzICAgICAgeyByZXR1cm4gZmVlUmVjaXBpZW50IH0KZnVuYyBGZWVCcHMoKSBpbnQ2NCAgICAgICAgICAgICAgeyByZXR1cm4gZmVlQnBzIH0KZnVuYyBOdW1TZXJ2aWNlcygpIGludDY0ICAgICAgICAgeyByZXR1cm4gbmV4dFNlcnZpY2UgfQpmdW5jIE51bU9yZGVycygpIGludDY0ICAgICAgICAgICB7IHJldHVybiBuZXh0T3JkZXIgfQpmdW5jIFNlcnZpY2VzT2YoYSBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBjb3VudEZvcihhKSB9CgpmdW5jIEJhbGFuY2VPZihhZGRyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoYWRkci5TdHJpbmcoKSkgfQpmdW5jIFVzZXJzVG90YWwoKSBpbnQ2NCAgICAgICAgICAgIHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgICAgICAgICAgIHsgcmV0dXJuIGxlZGdlci5GZWVzQWNjcnVlZCgpIH0KCi8vIEVzY3Jvd1RvdGFsIGlzIHRoZSBsaXZlIGVzY3JvdyBwb29sIEU6IHRoZSBzdW0gb2YgZXZlcnkgb3JkZXIgc3RpbGwgaW4KLy8gUHVyY2hhc2VkIG9yIERlbGl2ZXJlZC4KZnVuYyBFc2Nyb3dUb3RhbCgpIGludDY0IHsgcmV0dXJuIGVzY3Jvd1RvdGFsIH0KCi8vIExpYWJpbGl0aWVzIGlzIGV2ZXJ5dGhpbmcgdGhpcyByZWFsbSBvd2VzOiBsaXZlIGVzY3JvdywgY2xhaW1hYmxlCi8vIGJhbGFuY2VzIGFuZCB0aGUgZmVlIHBvdC4gU3dlZXBEZW5vbSByZXNlcnZlcyBleGFjdGx5IHRoaXMuCmZ1bmMgTGlhYmlsaXRpZXMoKSBpbnQ2NCB7IHJldHVybiBlc2Nyb3dUb3RhbCArIGxlZGdlci5MaWFiaWxpdGllcygpIH0KCmZ1bmMgSGVsZCgpIGludDY0ICAgICAgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQpmdW5jIFN1cnBsdXMoKSBpbnQ2NCAgIHsgcmV0dXJuIEhlbGQoKSAtIExpYWJpbGl0aWVzKCkgfQpmdW5jIEFkZHJlc3MoKSBhZGRyZXNzIHsgcmV0dXJuIHNlbGYgfQpmdW5jIEhlaWdodCgpIGludDY0ICAgIHsgcmV0dXJuIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSB9CgovLyAtLS0gcmVuZGVyIC0tLQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBsZW4ocGF0aCkgPiAyICYmIHBhdGhbOjJdID09ICJzLyIgewoJCXJldHVybiByZW5kZXJTZXJ2aWNlKHBhdGhbMjpdKQoJfQoJaWYgbGVuKHBhdGgpID4gMiAmJiBwYXRoWzoyXSA9PSAiby8iIHsKCQlyZXR1cm4gcmVuZGVyT3JkZXIocGF0aFsyOl0pCgl9CgloZWxkIDo9IEhlbGQoKQoJbGlhYiA6PSBMaWFiaWxpdGllcygpCglzdGF0dXMgOj0gIk9LIgoJaWYgaGVsZCA8IGxpYWIgewoJCXN0YXR1cyA9ICJWSU9MQVRFRCIKCX0KCW91dCA6PSAiIyBTZXJ2aWNlIG1hcmtldHBsYWNlXG5cbiIKCW91dCArPSAiUHJvdmlkZXJzIHB1Ymxpc2ggc2VydmljZXM7IGN1c3RvbWVycyBwdXJjaGFzZSBpbnRvIGVzY3JvdzsgcGF5bWVudCBpc1xuIgoJb3V0ICs9ICJyZWxlYXNlZCBvbmx5IG9uIGFjY2VwdGFuY2UsIG9yIHdoZW4gdGhlIGFjY2VwdGFuY2Ugd2luZG93IGxhcHNlcy5cblxuIgoJb3V0ICs9ICIjIyBDb25maWd1cmF0aW9uXG5cbiIKCW91dCArPSAiLSBmZWUgZm9yIG5ldyBzZXJ2aWNlczogIiArIGl0b2EoZmVlQnBzKSArICIgYnBzIChjYXAgIiArIGl0b2EoTWF4RmVlQnBzKSArCgkJIiBicHM7IGVhY2ggc2VydmljZSBrZWVwcyB0aGUgZmVlIHNuYXBzaG90dGVkIGF0IHJlZ2lzdHJhdGlvbilcbiIKCW91dCArPSAiLSBhY2NlcHRhbmNlIHdpbmRvdzogIiArIGl0b2EoQWNjZXB0YW5jZUJsb2NrcykgKyAiIGJsb2Nrc1xuIgoJb3V0ICs9ICItIGZlZSByZWNpcGllbnQ6ICIgKyBmZWVSZWNpcGllbnQuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gYWRtaW46ICIgKyBhZG1pbi5TdHJpbmcoKSArICJcblxuIgoJb3V0ICs9ICIjIyBBY2NvdW50aW5nIChIID09IEUgKyBVICsgRiArIFMpXG5cbiIKCW91dCArPSAiLSBlc2Nyb3cgaGVsZCBmb3Igb3BlbiBvcmRlcnMgKEUpOiAiICsgaXRvYShlc2Nyb3dUb3RhbCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBjbGFpbWFibGUgYmFsYW5jZXMgKFUpOiAiICsgaXRvYShsZWRnZXIuVXNlcnNUb3RhbCgpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGZlZXMgYWNjcnVlZCAoRik6ICIgKyBpdG9hKGxlZGdlci5GZWVzQWNjcnVlZCgpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGhlbGQgKEgpOiAiICsgaXRvYShoZWxkKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGNvbnNlcnZhdGlvbjogIiArIHN0YXR1cyArICJcblxuIgoJb3V0ICs9ICIjIyBMYXRlc3Qgc2VydmljZXNcblxuIgoJaWYgbmV4dFNlcnZpY2UgPT0gMCB7CgkJb3V0ICs9ICJObyBzZXJ2aWNlcyB5ZXQuXG4iCgkJcmV0dXJuIG91dAoJfQoJc2hvd24gOj0gMAoJc2VydmljZXMuUmV2ZXJzZUl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJcyA6PSB2Ligqc2VydmljZSkKCQlvdXQgKz0gIi0gWyMiICsgaXRvYShzLmlkKSArICJdKCIgKyByZWFsbVBhdGggKyAiOnMvIiArIGl0b2Eocy5pZCkgKyAiKSBbIiArCgkJCXMuc3RhdHVzICsgIl0gIiArIHMudGl0bGUgKyAiIOKAlCAiICsgaXRvYShzLnByaWNlKSArIERlbm9tICsgIlxuIgoJCXNob3duKysKCQlyZXR1cm4gc2hvd24gPj0gUmVuZGVyTGltaXQKCX0pCglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyU2VydmljZShhcmcgc3RyaW5nKSBzdHJpbmcgewoJaWQsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KGFyZywgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gaW52YWxpZCBzZXJ2aWNlIGlkXG4iCgl9Cgl2IDo9IHNlcnZpY2VzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gdW5rbm93biBzZXJ2aWNlIGlkXG4iCgl9CglzIDo9IHYuKCpzZXJ2aWNlKQoJb3V0IDo9ICIjIFNlcnZpY2UgIyIgKyBpdG9hKHMuaWQpICsgIjogIiArIHMudGl0bGUgKyAiXG5cbiIKCW91dCArPSAiLSBzdGF0dXM6ICIgKyBzLnN0YXR1cyArICJcbiIKCW91dCArPSAiLSBwcm92aWRlcjogIiArIHMucHJvdmlkZXIuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gcHJpY2U6ICIgKyBpdG9hKHMucHJpY2UpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gZGVsaXZlcnkgd2luZG93OiAiICsgaXRvYShzLmRlbGl2ZXJ5QmxvY2tzKSArICIgYmxvY2tzXG4iCglvdXQgKz0gIi0gZmVlIChzbmFwc2hvdCk6ICIgKyBpdG9hKHMuZmVlQnBzKSArICIgYnBzXG4iCglvdXQgKz0gIi0gb3JkZXJzIHBsYWNlZDogIiArIGl0b2Eocy5vcmRlcnMpICsgIlxuIgoJb3V0ICs9ICJcbiMjIERlc2NyaXB0aW9uXG5cbiIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KHMuZGVzY3JpcHRpb24pICsgIlxuIgoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlck9yZGVyKGFyZyBzdHJpbmcpIHN0cmluZyB7CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoYXJnLCAxMCwgNjQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIj4gWyFXQVJOSU5HXVxuPiBpbnZhbGlkIG9yZGVyIGlkXG4iCgl9Cgl2IDo9IG9yZGVycy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAiPiBbIVdBUk5JTkddXG4+IHVua25vd24gb3JkZXIgaWRcbiIKCX0KCW8gOj0gdi4oKm9yZGVyKQoJb3V0IDo9ICIjIE9yZGVyICMiICsgaXRvYShvLmlkKSArICJcblxuIgoJb3V0ICs9ICItIHN0YXR1czogIiArIG8uc3RhdHVzICsgIlxuIgoJb3V0ICs9ICItIHNlcnZpY2U6IFsjIiArIGl0b2Eoby5zZXJ2aWNlSUQpICsgIl0oIiArIHJlYWxtUGF0aCArICI6cy8iICsgaXRvYShvLnNlcnZpY2VJRCkgKyAiKVxuIgoJb3V0ICs9ICItIGN1c3RvbWVyOiAiICsgby5jdXN0b21lci5TdHJpbmcoKSArICJcbiIKCW91dCArPSAiLSBwcm92aWRlcjogIiArIG8ucHJvdmlkZXIuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gYW1vdW50OiAiICsgaXRvYShvLmFtb3VudCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWUgKHNuYXBzaG90KTogIiArIGl0b2Eoby5mZWVCcHMpICsgIiBicHNcbiIKCW91dCArPSAiLSBkZWxpdmVyeSBkZWFkbGluZTogaGVpZ2h0ICIgKyBpdG9hKG8uZGVsaXZlcnlEZWFkbGluZSkgKyAiXG4iCglpZiBvLmFjY2VwdGFuY2VEZWFkbGluZSAhPSAwIHsKCQlvdXQgKz0gIi0gYWNjZXB0YW5jZSBkZWFkbGluZTogaGVpZ2h0ICIgKyBpdG9hKG8uYWNjZXB0YW5jZURlYWRsaW5lKSArICJcbiIKCX0KCWlmIG8uZGVsaXZlcnlVUkkgIT0gIiIgewoJCW91dCArPSAiXG4jIyBEZWxpdmVyeVxuXG4iICsgc2FuaXRpemUuSW5saW5lVGV4dChvLmRlbGl2ZXJ5VVJJKSArICJcbiIKCX0KCXJldHVybiBvdXQKfQoKLy8gLS0tIGludGVybmFscyAtLS0KCmNvbnN0IHJlYWxtUGF0aCA9ICIvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3NlcnZpY2VfbWFya2V0IgoKLy8gcmVsZWFzZSBtb3ZlcyBhbiBvcmRlcidzIGVzY3JvdyBpbnRvIHRoZSBwcm92aWRlcidzIGNsYWltYWJsZSBiYWxhbmNlCi8vIGF0IHRoZSBvcmRlcidzIHNuYXBzaG90dGVkIGZlZSwgYW5kIGRyaXZlcyB0aGUgb3JkZXIgdGVybWluYWwuIFRoZQovLyBzdGF0dXMgd3JpdGUgYW5kIHRoZSBlc2Nyb3cgZGVjcmVtZW50IGhhcHBlbiB0b2dldGhlciB3aXRoIHRoZSBjcmVkaXQsCi8vIHNvIG5vIG9yZGVyIGNhbiBiZSByZWxlYXNlZCB0d2ljZSBhbmQgRSBzdGF5cyBleGFjdGx5IM6jIG9wZW4gYW1vdW50cy4KZnVuYyByZWxlYXNlKG8gKm9yZGVyLCByZWFzb24gc3RyaW5nKSB7CgljcmVkaXRlZCwgZmVlLCBlcnIgOj0gbGVkZ2VyLkRlcG9zaXQoby5wcm92aWRlci5TdHJpbmcoKSwgby5hbW91bnQsIG8uZmVlQnBzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJby5zdGF0dXMgPSBPcmRlclJlbGVhc2VkCgllc2Nyb3dUb3RhbCAtPSBvLmFtb3VudCAvLyA+PSAwOiBlc2Nyb3dUb3RhbCA9PSDOoyBvcGVuIGFtb3VudHMgPj0gby5hbW91bnQKCgljaGFpbi5FbWl0KCJPcmRlclJlbGVhc2VkIiwKCQkib3JkZXJJZCIsIGl0b2Eoby5pZCksCgkJInByb3ZpZGVyIiwgby5wcm92aWRlci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShvLmFtb3VudCksCgkJImNyZWRpdGVkIiwgaXRvYShjcmVkaXRlZCksCgkJImZlZSIsIGl0b2EoZmVlKSwKCQkicmVhc29uIiwgcmVhc29uLAoJKQp9CgovLyByZWZ1bmQgbW92ZXMgYW4gb3JkZXIncyBlc2Nyb3cgaW50byB0aGUgY3VzdG9tZXIncyBjbGFpbWFibGUgYmFsYW5jZQovLyBhdCBaRVJPIGZlZSBhbmQgZHJpdmVzIHRoZSBvcmRlciB0ZXJtaW5hbC4KZnVuYyByZWZ1bmQobyAqb3JkZXIsIHJlYXNvbiBzdHJpbmcpIHsKCWNyZWRpdGVkLCBfLCBlcnIgOj0gbGVkZ2VyLkRlcG9zaXQoby5jdXN0b21lci5TdHJpbmcoKSwgby5hbW91bnQsIDApCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglvLnN0YXR1cyA9IE9yZGVyUmVmdW5kZWQKCWVzY3Jvd1RvdGFsIC09IG8uYW1vdW50CgoJY2hhaW4uRW1pdCgiT3JkZXJSZWZ1bmRlZCIsCgkJIm9yZGVySWQiLCBpdG9hKG8uaWQpLAoJCSJjdXN0b21lciIsIG8uY3VzdG9tZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoY3JlZGl0ZWQpLAoJCSJyZWFzb24iLCByZWFzb24sCgkpCn0KCi8vIGFzc2VydE5vU2VuZCByZWZ1c2VzIGNvaW5zIG9uIG5vbi1wYXlhYmxlIGVudHJ5cG9pbnRzOiBhbiBhY2NpZGVudGFsCi8vIC1zZW5kIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgYXQgdGhlIHJlYWxtIGFzIHN3ZWVwLW9ubHkgc3VycGx1cy4KLy8gUHVyY2hhc2VTZXJ2aWNlIGlzIHRoZSBvbmx5IHBheWFibGUgZnVuY3Rpb24uIE5PVEU6IHRoaXMgcmVhZHMgdGhlCi8vIE9SSUdJTiBlbnZlbG9wZSDigJQgc2VlIHRoZSByZWFsbS1wcm92aWRlciBjYXZlYXQgaW4gdGhlIGhlYWRlci4KZnVuYyBhc3NlcnROb1NlbmQoKSB7CglpZiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgIT0gMCB7CgkJcGFuaWMoInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKZnVuYyBhc3NlcnRBZG1pbihjYWxsZXIgYWRkcmVzcykgewoJaWYgY2FsbGVyICE9IGFkbWluIHsKCQlwYW5pYygiYWRtaW4gb25seSIpCgl9Cn0KCmZ1bmMgbXVzdEdldFNlcnZpY2UoaWQgaW50NjQpICpzZXJ2aWNlIHsKCXYgOj0gc2VydmljZXMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biBzZXJ2aWNlIGlkIikKCX0KCXJldHVybiB2Ligqc2VydmljZSkKfQoKZnVuYyBtdXN0R2V0T3JkZXIoaWQgaW50NjQpICpvcmRlciB7Cgl2IDo9IG9yZGVycy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIG9yZGVyIGlkIikKCX0KCXJldHVybiB2Ligqb3JkZXIpCn0KCi8vIGNvdW50Rm9yIHJlcG9ydHMgaG93IG1hbnkgQUNUSVZFIHNlcnZpY2VzIGFuIGFkZHJlc3MgaG9sZHMuCmZ1bmMgY291bnRGb3IoYSBhZGRyZXNzKSBpbnQ2NCB7Cgl2IDo9IHByb3ZpZGVyTnVtLkdldChhLlN0cmluZygpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gKih2LigqaW50NjQpKQp9CgovLyBidW1wRm9yIGFkanVzdHMgdGhlIGFjdGl2ZS1zZXJ2aWNlIGNvdW50ZXIsIHJlbW92aW5nIHRoZSBlbnRyeSBhdCB6ZXJvCi8vIHNvIGEgcHJvdmlkZXIgd2hvIHJldGlyZXMgZXZlcnl0aGluZyBzdG9wcyBwYXlpbmcgZm9yIHRoZSBzbG90LgpmdW5jIGJ1bXBGb3IoYSBhZGRyZXNzLCBkZWx0YSBpbnQ2NCkgewoJa2V5IDo9IGEuU3RyaW5nKCkKCXYgOj0gcHJvdmlkZXJOdW0uR2V0KGtleSkKCWlmIHYgPT0gbmlsIHsKCQlpZiBkZWx0YSA8PSAwIHsKCQkJcmV0dXJuCgkJfQoJCW4gOj0gZGVsdGEKCQlwcm92aWRlck51bS5TZXQoa2V5LCAmbikKCQlyZXR1cm4KCX0KCXAgOj0gdi4oKmludDY0KQoJKnAgKz0gZGVsdGEKCWlmICpwIDw9IDAgewoJCXByb3ZpZGVyTnVtLlJlbW92ZShrZXkpCgl9Cn0KCi8vIGFzc2VydFZhbGlkVGl0bGUgYm91bmRzIGxlbmd0aCBhbmQgcmVzdHJpY3RzIHRoZSBjaGFyc2V0IHNvIHRpdGxlcyBhcmUKLy8gbGlzdC1zYWZlIGluIFJlbmRlciB3aXRob3V0IGVzY2FwaW5nLgpmdW5jIGFzc2VydFZhbGlkVGl0bGUodGl0bGUgc3RyaW5nKSB7CglpZiBsZW4odGl0bGUpID09IDAgfHwgbGVuKHRpdGxlKSA+IE1heFRpdGxlTGVuIHsKCQlwYW5pYygidGl0bGUgbXVzdCBiZSAxLSIgKyBzdHJjb252Lkl0b2EoTWF4VGl0bGVMZW4pICsgIiBjaGFyYWN0ZXJzIikKCX0KCWZvciBpIDo9IDA7IGkgPCBsZW4odGl0bGUpOyBpKysgewoJCWMgOj0gdGl0bGVbaV0KCQlzd2l0Y2ggewoJCWNhc2UgYyA+PSAnYScgJiYgYyA8PSAneic6CgkJY2FzZSBjID49ICdBJyAmJiBjIDw9ICdaJzoKCQljYXNlIGMgPj0gJzAnICYmIGMgPD0gJzknOgoJCWNhc2UgYyA9PSAnICcgfHwgYyA9PSAnXycgfHwgYyA9PSAnLSc6CgkJZGVmYXVsdDoKCQkJcGFuaWMoInRpdGxlIG1heSBvbmx5IGNvbnRhaW4gbGV0dGVycywgZGlnaXRzLCBzcGFjZSwgXyBhbmQgLSIpCgkJfQoJfQp9CgovLyBwYWRJRCByZW5kZXJzIGFuIGlkIGFzIGEgZml4ZWQtd2lkdGgga2V5IHNvIGF2bCBpdGVyYXRpb24gb3JkZXIgaXMKLy8gbnVtZXJpYyBvcmRlci4KZnVuYyBwYWRJRChpZCBpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRJbnQoaWQsIDEwKQoJZm9yIGxlbihzKSA8IDEyIHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIHMKfQoKZnVuYyBjaGVja2VkQWRkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJYyA6PSBhICsgYgoJaWYgKGIgPiAwICYmIGMgPCBhKSB8fCAoYiA8IDAgJiYgYyA+IGEpIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBjLCB0cnVlCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgewoJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKQp9Chq2xwIKF3NlcnZpY2VfbWFya2V0X3Rlc3QuZ25vEpnHAnBhY2thZ2Ugc2VydmljZV9tYXJrZXQKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgp2YXIgKAoJdGVzdEFkbWluID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJzbWFkbWluIikKCXByb3YxICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygic21wcm92MSIpCglwcm92MiAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInNtcHJvdjIiKQoJY3VzdDEgICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJzbWN1c3QxIikKCWN1c3QyICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygic21jdXN0MiIpCgltYWxsb3J5ICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInNtbWFsbG9yeSIpCikKCi8vIEVzdGFibGlzaGVkIGhhcm5lc3MgZmFjdHMsIGNhcnJpZWQgZnJvbSB0aGUgc2libGluZyByZWFsbXMnIHN1aXRlczoKLy8gaW5pdCBydW5zIHdpdGggYW4gZW1wdHkgb3JpZ2luIGNvbnRleHQgKHRoZSByZWFsIGRlcGxveSBjYXB0dXJlcyB0aGUKLy8gb3JpZ2luIGNhbGxlcik7IHRoZSBiYW5rZXIgcmVzZXRzIGJldHdlZW4gdGVzdHMgd2hpbGUgcmVhbG0gZ2xvYmFscwovLyBwZXJzaXN0LCBzbyBjb25zZXJ2YXRpb24gaXMgYXNzZXJ0ZWQgaW4gREVMVEEgZm9ybSBhZnRlciByZS1zZWVkaW5nCi8vIGNhcnJpZWQgbGlhYmlsaXRpZXM7IHRlc3RpbmcuU2V0UmVhbG0gYWZmZWN0cyBvbmx5IHRoZSBmcmFtZSB0aGF0Ci8vIGNhbGxzIGl0OyBhbmQgdGVzdGluZy5Ta2lwSGVpZ2h0cyBXSVBFUyB0aGUgb3JpZ2luL3JlYWxtIGNvbnRleHQsIHNvCi8vIGV2ZXJ5IGNhbGxlciBpcyByZS1hcm1lZCBhZnRlciBhIHNraXAuCmZ1bmMgaW5pdCgpIHsKCWFkbWluID0gdGVzdEFkbWluCglmZWVSZWNpcGllbnQgPSB0ZXN0QWRtaW4KCXNlbGYgPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3NlcnZpY2VfbWFya2V0IikKfQoKdHlwZSBiYXNlbGluZSBzdHJ1Y3R7IGhlbGQsIGVzY3JvdywgdXNlcnMsIGZlZXMgaW50NjQgfQoKZnVuYyBiZWdpbigpIGJhc2VsaW5lIHsKCWlmIGwgOj0gTGlhYmlsaXRpZXMoKTsgbCA+IDAgewoJCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KGwpKQoJfQoJcmV0dXJuIHNuYXAoKQp9CgpmdW5jIHNuYXAoKSBiYXNlbGluZSB7CglyZXR1cm4gYmFzZWxpbmV7aGVsZDogSGVsZCgpLCBlc2Nyb3c6IEVzY3Jvd1RvdGFsKCksIHVzZXJzOiBVc2Vyc1RvdGFsKCksIGZlZXM6IEZlZXNBY2NydWVkKCl9Cn0KCi8vIGNvbnNlcnZlZCBhc3NlcnRzIM6USCA9PSDOlEUgKyDOlFUgKyDOlEYgKyBleHRyYVN1cnBsdXMsIHRoZSByZWFsbSdzCi8vIHN0YXRlZCBtb25ldGFyeSBpbnZhcmlhbnQgaW4gZGVsdGEgZm9ybS4KZnVuYyAoYiBiYXNlbGluZSkgY29uc2VydmVkKHQgKnRlc3RpbmcuVCwgZXh0cmFTdXJwbHVzIGludDY0KSB7Cgl0LkhlbHBlcigpCglkSCA6PSBIZWxkKCkgLSBiLmhlbGQKCWRFIDo9IEVzY3Jvd1RvdGFsKCkgLSBiLmVzY3JvdwoJZFUgOj0gVXNlcnNUb3RhbCgpIC0gYi51c2VycwoJZEYgOj0gRmVlc0FjY3J1ZWQoKSAtIGIuZmVlcwoJaWYgZEggIT0gZEUrZFUrZEYrZXh0cmFTdXJwbHVzIHsKCQl0LkZhdGFsZigiY29uc2VydmF0aW9uIHZpb2xhdGVkOiDOlEg9JWQgzpRFPSVkIM6UVT0lZCDOlEY9JWQgzpRTPSVkIiwgZEgsIGRFLCBkVSwgZEYsIGV4dHJhU3VycGx1cykKCX0KCWlmIExpYWJpbGl0aWVzKCkgIT0gRXNjcm93VG90YWwoKStVc2Vyc1RvdGFsKCkrRmVlc0FjY3J1ZWQoKSB7CgkJdC5GYXRhbGYoIkxpYWJpbGl0aWVzKCkgPSAlZCwgd2FudCBFK1UrRiIsIExpYWJpbGl0aWVzKCkpCgl9Cn0KCi8vIGFwcEludmFyaWFudCByZS1kZXJpdmVzIHRoZSBlc2Nyb3cgcG9vbCBmcm9tIHRoZSBvcmRlcnMgdGhlbXNlbHZlcy4KLy8gRXNjcm93VG90YWwgaXMgYSBydW5uaW5nIGNvdW50ZXI7IHRoaXMgcHJvdmVzIGl0IHN0aWxsIGVxdWFscyDOoyBhbW91bnQKLy8gb3ZlciBub24tdGVybWluYWwgb3JkZXJzLCB3aGljaCBpcyB0aGUgY2xhaW0gU3dlZXBEZW5vbSdzIHJlc2VydmUKLy8gcmVzdHMgb24uCmZ1bmMgYXBwSW52YXJpYW50KHQgKnRlc3RpbmcuVCkgewoJdC5IZWxwZXIoKQoJdmFyIHN1bSBpbnQ2NAoJZm9yIGlkIDo9IGludDY0KDApOyBpZCA8IE51bU9yZGVycygpOyBpZCsrIHsKCQlfLCBfLCBfLCBhbW91bnQsIF8sIHN0YXR1cyA6PSBPcmRlckluZm8oaWQpCgkJc3dpdGNoIHN0YXR1cyB7CgkJY2FzZSBPcmRlclB1cmNoYXNlZCwgT3JkZXJEZWxpdmVyZWQ6CgkJCXN1bSArPSBhbW91bnQKCQljYXNlIE9yZGVyUmVsZWFzZWQsIE9yZGVyUmVmdW5kZWQ6CgkJZGVmYXVsdDoKCQkJdC5GYXRhbGYoIm9yZGVyICVkIGhhcyB1bmtub3duIHN0YXR1cyAlcSIsIGlkLCBzdGF0dXMpCgkJfQoJfQoJaWYgc3VtICE9IEVzY3Jvd1RvdGFsKCkgewoJCXQuRmF0YWxmKCJFc2Nyb3dUb3RhbCgpID0gJWQsIGJ1dCDOoyBvcGVuIG9yZGVycyA9ICVkIiwgRXNjcm93VG90YWwoKSwgc3VtKQoJfQp9CgpmdW5jIGNvaW5zT2YoYWRkciBhZGRyZXNzKSBpbnQ2NCB7CglyZXR1cm4gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbihhZGRyLCBEZW5vbSkKfQoKZnVuYyB1Z25vdChuIGludDY0KSBjaGFpbi5Db2lucyB7CglyZXR1cm4gY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbihEZW5vbSwgbikpCn0KCi8vIE5PVEUgT04gVEhFIEhBUk5FU1MuIHRlc3RpbmcuU2V0UmVhbG0gYXBwbGllcyB0byB0aGUgZnJhbWUgdGhhdCBDQUxMUwovLyBpdCwgc28gdGhlIGNhbGxlciBpZGVudGl0eSBtdXN0IGJlIGFybWVkIGluIHRoZSBTQU1FIGZyYW1lIGFzIHRoZQovLyBlbnRyeXBvaW50IGludm9jYXRpb24uIEEgbmVzdGVkIGBhcyhmcm9tKWAgaGVscGVyIGlzIHNpbGVudGx5Ci8vIGluZWZmZWN0aXZlOiB0aGUgcmVhbG0gcmV2ZXJ0cyB3aGVuIHRoYXQgaGVscGVyIHJldHVybnMsIGFuZCB0aGUgY2FsbAovLyBsYW5kcyBhcyB0aGUgZGVmYXVsdCB0ZXN0IGNhbGxlciBpbnN0ZWFkIG9mIGBmcm9tYCDigJQgd2hpY2ggaXMgYSB0ZXN0Ci8vIHRoYXQgcXVpZXRseSBzdG9wcyB0ZXN0aW5nIHdoYXQgaXQgbmFtZXMuIEhlbmNlIHRoZSB0aHJlZSBsaW5lcwovLyBpbmxpbmUgYXQgZXZlcnkgc2l0ZSwgbWF0Y2hpbmcgdGhlIHNpYmxpbmcgc3VpdGVzLgoKLy8gcmVnaXN0ZXJBcyBwdWJsaXNoZXMgYSBzZXJ2aWNlIChub24tcGF5YWJsZTogZW52ZWxvcGUgZXhwbGljaXRseSBjbGVhcmVkKS4KZnVuYyByZWdpc3RlckFzKGN1ciByZWFsbSwgZnJvbSBhZGRyZXNzLCB0aXRsZSwgZGVzYyBzdHJpbmcsIHByaWNlLCBkZWxpdmVyeSBpbnQ2NCkgaW50NjQgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmcm9tKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGZyb20pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJcmV0dXJuIFJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCB0aXRsZSwgZGVzYywgcHJpY2UsIGRlbGl2ZXJ5LCBNYXhGZWVCcHMpCn0KCi8vIHB1cmNoYXNlQXMgcGVyZm9ybXMgYSBjaGFpbi1mYWl0aGZ1bCBwdXJjaGFzZTogZW52ZWxvcGUgc3RhZ2VkIEFORCBsYW5kZWQuCmZ1bmMgcHVyY2hhc2VBcyhjdXIgcmVhbG0sIGZyb20gYWRkcmVzcywgc2VydmljZUlELCBwYXkgaW50NjQpIGludDY0IHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmcm9tKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KHBheSkpCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdChwYXkpKQoJcmV0dXJuIFB1cmNoYXNlU2VydmljZShjcm9zcyhjdXIpLCBzZXJ2aWNlSUQpCn0KCmZ1bmMgVGVzdEluaXRpYWxDb25maWcodCAqdGVzdGluZy5UKSB7CglpZiBBZG1pbigpICE9IHRlc3RBZG1pbiB8fCBGZWVSZWNpcGllbnQoKSAhPSB0ZXN0QWRtaW4gewoJCXQuRmF0YWwoInNlZWRlZCByb2xlcyBtaXNtYXRjaCIpCgl9Cgl2YXIgemVybyBhZGRyZXNzCglpZiBQZW5kaW5nQWRtaW4oKSAhPSB6ZXJvIHsKCQl0LkZhdGFsKCJwZW5kaW5nIGFkbWluIG5vdCB6ZXJvIikKCX0KCWlmIEZlZUJwcygpICE9IDAgfHwgTnVtU2VydmljZXMoKSAhPSAwIHx8IE51bU9yZGVycygpICE9IDAgewoJCXQuRmF0YWwoImluaXRpYWwgY291bnRlcnMgbm90IHplcm8iKQoJfQoJaWYgSGVsZCgpICE9IDAgfHwgTGlhYmlsaXRpZXMoKSAhPSAwIHx8IEVzY3Jvd1RvdGFsKCkgIT0gMCB7CgkJdC5GYXRhbCgiaW5pdGlhbCBhY2NvdW50aW5nIG5vdCB6ZXJvIikKCX0KCWlmIEFkZHJlc3MoKSA9PSB6ZXJvIHsKCQl0LkZhdGFsKCJyZWFsbSBhZGRyZXNzIGlzIHplcm8iKQoJfQp9CgpmdW5jIFRlc3RSZWdpc3RlclNlcnZpY2UoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJaWQgOj0gcmVnaXN0ZXJBcyhjdXIsIHByb3YxLCAibG9nbyBkZXNpZ24iLCAidHdvIGNvbmNlcHRzIGFuZCByZXZpc2lvbnMiLCA1MDAwMDAsIDIwMDAwKQoKCXByb3ZpZGVyLCB0aXRsZSwgcHJpY2UsIGRlbGl2ZXJ5LCBzbmFwQnBzLCBzdGF0dXMsIG9yZGVyQ291bnQgOj0gU2VydmljZUluZm8oaWQpCglpZiBwcm92aWRlciAhPSBwcm92MSB8fCB0aXRsZSAhPSAibG9nbyBkZXNpZ24iIHx8IHByaWNlICE9IDUwMDAwMCB8fAoJCWRlbGl2ZXJ5ICE9IDIwMDAwIHx8IHNuYXBCcHMgIT0gMCB8fCBzdGF0dXMgIT0gU2VydmljZUFjdGl2ZSB8fCBvcmRlckNvdW50ICE9IDAgewoJCXQuRmF0YWxmKCJmaWVsZHMgd3Jvbmc6ICV2ICVxICVkICVkICVkICVzICVkIiwKCQkJcHJvdmlkZXIsIHRpdGxlLCBwcmljZSwgZGVsaXZlcnksIHNuYXBCcHMsIHN0YXR1cywgb3JkZXJDb3VudCkKCX0KCWlmIFNlcnZpY2VEZXNjcmlwdGlvbihpZCkgIT0gInR3byBjb25jZXB0cyBhbmQgcmV2aXNpb25zIiB7CgkJdC5GYXRhbCgiZGVzY3JpcHRpb24gbWlzbWF0Y2giKQoJfQoJaWYgU2VydmljZXNPZihwcm92MSkgIT0gMSB7CgkJdC5GYXRhbGYoIlNlcnZpY2VzT2YgPSAlZCwgd2FudCAxIiwgU2VydmljZXNPZihwcm92MSkpCgl9CglwLCBmZWUsIHRvUHJvdmlkZXIgOj0gUXVvdGUoaWQpCglpZiBwICE9IDUwMDAwMCB8fCBmZWUgIT0gMCB8fCB0b1Byb3ZpZGVyICE9IDUwMDAwMCB7CgkJdC5GYXRhbGYoIlF1b3RlID0gJWQvJWQvJWQiLCBwLCBmZWUsIHRvUHJvdmlkZXIpCgl9CglhcHBJbnZhcmlhbnQodCkKCWIuY29uc2VydmVkKHQsIDApCn0KCmZ1bmMgVGVzdFJlZ2lzdGVyUmVqZWN0cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCgoJLy8gTm9uLXBheWFibGU6IGFuIGF0dGFjaGVkIGVudmVsb3BlIGlzIHJlZnVzZWQsIG5vdCBzdHJhbmRlZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMTAwKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnMiLCBmdW5jKCkgewoJCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAieCIsICJ5IiwgMSwgTWluRGVsaXZlcnlCbG9ja3MsIE1heEZlZUJwcykKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInRpdGxlIG11c3QgYmUiLCBmdW5jKCkgewoJCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAiIiwgImQiLCAxLCBNaW5EZWxpdmVyeUJsb2NrcywgTWF4RmVlQnBzKQoJfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAidGl0bGUgbWF5IG9ubHkgY29udGFpbiIsIGZ1bmMoKSB7CgkJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJiYWQqdGl0bGUiLCAiZCIsIDEsIE1pbkRlbGl2ZXJ5QmxvY2tzLCBNYXhGZWVCcHMpCgl9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJkZXNjcmlwdGlvbiBtdXN0IGJlIiwgZnVuYygpIHsKCQlSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgIm9rIiwgc3RyaW5ncy5SZXBlYXQoIngiLCBNYXhEZXNjTGVuKzEpLCAxLCBNaW5EZWxpdmVyeUJsb2NrcywgTWF4RmVlQnBzKQoJfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicHJpY2UgbXVzdCBiZSBhdCBsZWFzdCIsIGZ1bmMoKSB7CgkJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJvayIsICJkIiwgMCwgTWluRGVsaXZlcnlCbG9ja3MsIE1heEZlZUJwcykKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImRlbGl2ZXJ5QmxvY2tzIG11c3QgYmUiLCBmdW5jKCkgewoJCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAib2siLCAiZCIsIDEsIE1pbkRlbGl2ZXJ5QmxvY2tzLTEsIE1heEZlZUJwcykKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImRlbGl2ZXJ5QmxvY2tzIG11c3QgYmUiLCBmdW5jKCkgewoJCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAib2siLCAiZCIsIDEsIE1heERlbGl2ZXJ5QmxvY2tzKzEsIE1heEZlZUJwcykKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm1heEZlZUJwcyBtdXN0IGJlIiwgZnVuYygpIHsKCQlSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgIm9rIiwgImQiLCAxLCBNaW5EZWxpdmVyeUJsb2NrcywgTWF4RmVlQnBzKzEpCgl9KQoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgovLyBUaGUgcHJvdmlkZXIncyBwdWJsaXNoZWQgdGVybXMgY2Fubm90IGJlIGRldmFsdWVkIGJ5IGFuIGFkbWluIGZlZQovLyBjaGFuZ2UgYmV0d2VlbiByZWdpc3RyYXRpb24gYW5kIHB1cmNoYXNlOiByZWdpc3RyYXRpb24gaXRzZWxmIHJlZnVzZXMKLy8gYSBmZWUgYWJvdmUgdGhlIGNlaWxpbmcgdGhlIHByb3ZpZGVyIHNpZ25lZCBmb3IuIFRoaXMgaXMgdGhlIGdyYW50cyBZMQovLyBwYXR0ZXJuLCBhcHBsaWVkIGF0IHRoZSBvZmZlciByYXRoZXIgdGhhbiB0aGUgZ3JhbnQuCmZ1bmMgVGVzdEZlZUNlaWxpbmdBbmRTbmFwc2hvdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVNldEZlZUJwcyhjcm9zcyhjdXIpLCA1MDApCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImV4Y2VlZHMgeW91ciBjZWlsaW5nIiwgZnVuYygpIHsKCQlSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgImNoZWFwIG9ubHkiLCAiZCIsIDEwMDAsIE1pbkRlbGl2ZXJ5QmxvY2tzLCAxMDApCgl9KQoKCS8vIFJlZ2lzdGVyZWQgYXQgNTAwIGJwcy4KCWlkIDo9IHJlZ2lzdGVyQXMoY3VyLCBwcm92MSwgImNvcHl3cml0aW5nIiwgIjgwMCB3b3JkcyIsIDEwMDAwMDAsIDIwMDAwKQoJXywgXywgXywgXywgc25hcEJwcywgXywgXyA6PSBTZXJ2aWNlSW5mbyhpZCkKCWlmIHNuYXBCcHMgIT0gNTAwIHsKCQl0LkZhdGFsZigic25hcHNob3QgYnBzID0gJWQsIHdhbnQgNTAwIiwgc25hcEJwcykKCX0KCgkvLyBBZG1pbiByYWlzZXMgdGhlIGZlZSBhZnRlcndhcmRzOyB0aGUgZXhpc3Rpbmcgc2VydmljZSBrZWVwcyA1MDAuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJU2V0RmVlQnBzKGNyb3NzKGN1ciksIE1heEZlZUJwcykKCV8sIF8sIF8sIF8sIHNuYXBCcHMsIF8sIF8gPSBTZXJ2aWNlSW5mbyhpZCkKCWlmIHNuYXBCcHMgIT0gNTAwIHsKCQl0LkZhdGFsZigic25hcHNob3QgYnBzIGNoYW5nZWQgdG8gJWQiLCBzbmFwQnBzKQoJfQoKCS8vIEFuZCBhbiBvcmRlciBwbGFjZWQgbm93IGNhcnJpZXMgdGhlIFNFUlZJQ0UncyA1MDAsIG5vdCB0aGUgbGl2ZSBjYXAuCglvaWQgOj0gcHVyY2hhc2VBcyhjdXIsIGN1c3QxLCBpZCwgMTAwMDAwMCkKCV8sIF8sIF8sIF8sIG9yZGVyQnBzLCBfIDo9IE9yZGVySW5mbyhvaWQpCglpZiBvcmRlckJwcyAhPSA1MDAgewoJCXQuRmF0YWxmKCJvcmRlciBicHMgPSAlZCwgd2FudCA1MDAiLCBvcmRlckJwcykKCX0KCgkvLyBDbGVhbiB1cDogcmVsZWFzZSBzbyBsYXRlciB0ZXN0cyBzdGFydCBmcm9tIGEgc2V0dGxlZCBwb29sLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglNYXJrRGVsaXZlcmVkKGNyb3NzKGN1ciksIG9pZCwgImlwZnM6Ly9jb3B5IikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3VzdDEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3VzdDEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQWNjZXB0RGVsaXZlcnkoY3Jvc3MoY3VyKSwgb2lkKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMCkKCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKZnVuYyBUZXN0UHVyY2hhc2VFc2Nyb3dzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCXAwIDo9IEJhbGFuY2VPZihwcm92MSkKCXNpZCA6PSByZWdpc3RlckFzKGN1ciwgcHJvdjEsICJ0cmFuc2xhdGlvbiIsICJlbiB0byBmciIsIDMwMDAwMCwgMjAwMDApCgoJb2lkIDo9IHB1cmNoYXNlQXMoY3VyLCBjdXN0MSwgc2lkLCAzMDAwMDApCglzZXJ2aWNlSUQsIGN1c3RvbWVyLCBwcm92aWRlciwgYW1vdW50LCBfLCBzdGF0dXMgOj0gT3JkZXJJbmZvKG9pZCkKCWlmIHNlcnZpY2VJRCAhPSBzaWQgfHwgY3VzdG9tZXIgIT0gY3VzdDEgfHwgcHJvdmlkZXIgIT0gcHJvdjEgfHwKCQlhbW91bnQgIT0gMzAwMDAwIHx8IHN0YXR1cyAhPSBPcmRlclB1cmNoYXNlZCB7CgkJdC5GYXRhbGYoIm9yZGVyIHdyb25nOiAlZCAldiAldiAlZCAlcyIsIHNlcnZpY2VJRCwgY3VzdG9tZXIsIHByb3ZpZGVyLCBhbW91bnQsIHN0YXR1cykKCX0KCS8vIFRoZSBtb25leSBpcyBpbiBlc2Nyb3csIE5PVCB5ZXQgaW4gYW55b25lJ3MgY2xhaW1hYmxlIGJhbGFuY2UuCglpZiBFc2Nyb3dUb3RhbCgpLWIuZXNjcm93ICE9IDMwMDAwMCB7CgkJdC5GYXRhbGYoIs6URSA9ICVkLCB3YW50IDMwMDAwMCIsIEVzY3Jvd1RvdGFsKCktYi5lc2Nyb3cpCgl9CglpZiBCYWxhbmNlT2YocHJvdjEpICE9IHAwIHsKCQl0LkZhdGFsZigicHJvdmlkZXIgY3JlZGl0ZWQgYmVmb3JlIHJlc29sdXRpb246ICVkIC0+ICVkIiwgcDAsIEJhbGFuY2VPZihwcm92MSkpCgl9CglkZWxpdmVyeURlYWRsaW5lLCBhY2NlcHRhbmNlRGVhZGxpbmUgOj0gT3JkZXJEZWFkbGluZXMob2lkKQoJaWYgZGVsaXZlcnlEZWFkbGluZSAhPSBIZWlnaHQoKSsyMDAwMCB7CgkJdC5GYXRhbGYoImRlbGl2ZXJ5IGRlYWRsaW5lID0gJWQiLCBkZWxpdmVyeURlYWRsaW5lKQoJfQoJaWYgYWNjZXB0YW5jZURlYWRsaW5lICE9IDAgewoJCXQuRmF0YWxmKCJhY2NlcHRhbmNlIGRlYWRsaW5lIHNldCBiZWZvcmUgZGVsaXZlcnk6ICVkIiwgYWNjZXB0YW5jZURlYWRsaW5lKQoJfQoJXywgXywgXywgXywgXywgXywgb3JkZXJDb3VudCA6PSBTZXJ2aWNlSW5mbyhzaWQpCglpZiBvcmRlckNvdW50ICE9IDEgewoJCXQuRmF0YWxmKCJzZXJ2aWNlIG9yZGVyIGNvdW50ID0gJWQiLCBvcmRlckNvdW50KQoJfQoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgpmdW5jIFRlc3RQdXJjaGFzZVJlamVjdHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJc2lkIDo9IHJlZ2lzdGVyQXMoY3VyLCBwcm92MSwgImVkaXRpbmciLCAibGluZSBlZGl0IiwgMjUwMDAwLCAyMDAwMCkKCgkvLyBXcm9uZyBhbW91bnQsIGluIGJvdGggZGlyZWN0aW9ucy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3VzdDEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3VzdDEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMjQ5OTk5KSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KDI0OTk5OSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInNlbmQgZXhhY3RseSB0aGUgbGlzdGVkIHByaWNlIiwgZnVuYygpIHsKCQlQdXJjaGFzZVNlcnZpY2UoY3Jvc3MoY3VyKSwgc2lkKQoJfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgyNTAwMDEpKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoMjUwMDAxKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAic2VuZCBleGFjdGx5IHRoZSBsaXN0ZWQgcHJpY2UiLCBmdW5jKCkgewoJCVB1cmNoYXNlU2VydmljZShjcm9zcyhjdXIpLCBzaWQpCgl9KQoKCS8vIFNlbGYtcHVyY2hhc2UuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDI1MDAwMCkpCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCgyNTAwMDApKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ0aGUgcHJvdmlkZXIgY2Fubm90IHB1cmNoYXNlIHRoZWlyIG93biBzZXJ2aWNlIiwgZnVuYygpIHsKCQlQdXJjaGFzZVNlcnZpY2UoY3Jvc3MoY3VyKSwgc2lkKQoJfSkKCgkvLyBVbmtub3duIHNlcnZpY2UuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGN1c3QxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGN1c3QxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDI1MDAwMCkpCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCgyNTAwMDApKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIHNlcnZpY2UgaWQiLCBmdW5jKCkgewoJCVB1cmNoYXNlU2VydmljZShjcm9zcyhjdXIpLCA5OTk5KQoJfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3VzdDEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3VzdDEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoKCS8vIFRob3NlIGFib3J0cyBlYWNoIGxhbmRlZCBjb2lucyBhdCB0aGUgcmVhbG0gdGhhdCB0aGUgdHJhbnNhY3Rpb24KCS8vIHRoZW4gcmV2ZXJ0ZWQuIEluIHRoZSBoYXJuZXNzIHRoZSBzZW5kIGlzIHNpbXVsYXRlZCByYXRoZXIgdGhhbgoJLy8gcm9sbGVkIGJhY2ssIHNvIHRoZSBleGNlc3Mgc2hvd3MgdXAgYXMgc3VycGx1czsgYXNzZXJ0IGl0IGlzCgkvLyBFWEFDVExZIHN1cnBsdXMgYW5kIGhhcyBub3QgbGVha2VkIGludG8gZXNjcm93IG9yIGEgYmFsYW5jZS4KCWFwcEludmFyaWFudCh0KQoJaWYgRXNjcm93VG90YWwoKSAhPSBiLmVzY3JvdyB7CgkJdC5GYXRhbGYoImEgcmVqZWN0ZWQgcHVyY2hhc2UgbW92ZWQgZXNjcm93OiAlZCAtPiAlZCIsIGIuZXNjcm93LCBFc2Nyb3dUb3RhbCgpKQoJfQoJaWYgVXNlcnNUb3RhbCgpICE9IGIudXNlcnMgewoJCXQuRmF0YWxmKCJhIHJlamVjdGVkIHB1cmNoYXNlIGNyZWRpdGVkIGEgYmFsYW5jZSIpCgl9Cn0KCi8vIFJldGlyaW5nIHN0b3BzIE5FVyBvcmRlcnMgYW5kIG5vdGhpbmcgZWxzZS4gQW4gb3JkZXIgYWxyZWFkeSBpbgovLyBmbGlnaHQga2VlcHMgaXRzIG93biBjb3B5IG9mIHByb3ZpZGVyLCBhbW91bnQgYW5kIGZlZS4KZnVuYyBUZXN0UmV0aXJlU2VydmljZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCgluMCA6PSBTZXJ2aWNlc09mKHByb3YxKQoJcDAgOj0gQmFsYW5jZU9mKHByb3YxKQoJc2lkIDo9IHJlZ2lzdGVyQXMoY3VyLCBwcm92MSwgImNvbnN1bHRpbmciLCAib25lIGhvdXIiLCA0MDAwMDAsIDIwMDAwKQoJb2lkIDo9IHB1cmNoYXNlQXMoY3VyLCBjdXN0MSwgc2lkLCA0MDAwMDApCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBwcm92aWRlciBtYXkgcmV0aXJlIHRoaXMgc2VydmljZSIsIGZ1bmMoKSB7CgkJUmV0aXJlU2VydmljZShjcm9zcyhjdXIpLCBzaWQpCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUmV0aXJlU2VydmljZShjcm9zcyhjdXIpLCBzaWQpCglfLCBfLCBfLCBfLCBfLCBzdGF0dXMsIF8gOj0gU2VydmljZUluZm8oc2lkKQoJaWYgc3RhdHVzICE9IFNlcnZpY2VSZXRpcmVkIHsKCQl0LkZhdGFsZigic3RhdHVzID0gJXMiLCBzdGF0dXMpCgl9CglpZiBTZXJ2aWNlc09mKHByb3YxKSAhPSBuMCB7CgkJdC5GYXRhbGYoInJldGlyZSBkaWQgbm90IGZyZWUgdGhlIHByb3ZpZGVyIHNsb3Q6ICVkIC0+ICVkIiwgbjAsIFNlcnZpY2VzT2YocHJvdjEpKQoJfQoKCS8vIFRlcm1pbmFsOiBubyB1bi1yZXRpcmUsIGFuZCBubyBzZWNvbmQgcmV0aXJlLgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzZXJ2aWNlIGlzIG5vdCBhY3RpdmUiLCBmdW5jKCkgewoJCVJldGlyZVNlcnZpY2UoY3Jvc3MoY3VyKSwgc2lkKQoJfSkKCgkvLyBOZXcgb3JkZXJzIHJlZnVzZWQuLi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3VzdDIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3VzdDIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoNDAwMDAwKSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KDQwMDAwMCkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInNlcnZpY2UgaXMgbm90IGFjdGl2ZSIsIGZ1bmMoKSB7CgkJUHVyY2hhc2VTZXJ2aWNlKGNyb3NzKGN1ciksIHNpZCkKCX0pCgoJLy8gLi4uYnV0IHRoZSBpbi1mbGlnaHQgb3JkZXIgc3RpbGwgY29tcGxldGVzIG5vcm1hbGx5LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglNYXJrRGVsaXZlcmVkKGNyb3NzKGN1ciksIG9pZCwgIm5vdGVzLnBkZiIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGN1c3QxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGN1c3QxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCUFjY2VwdERlbGl2ZXJ5KGNyb3NzKGN1ciksIG9pZCkKCV8sIF8sIF8sIF8sIF8sIG9zdGF0dXMgOj0gT3JkZXJJbmZvKG9pZCkKCWlmIG9zdGF0dXMgIT0gT3JkZXJSZWxlYXNlZCB7CgkJdC5GYXRhbGYoImluLWZsaWdodCBvcmRlciBicm9rZSBvbiByZXRpcmU6ICVzIiwgb3N0YXR1cykKCX0KCWlmIEJhbGFuY2VPZihwcm92MSkgIT0gcDArNDAwMDAwIHsKCQl0LkZhdGFsZigicHJvdmlkZXIgY3JlZGl0ZWQgJWQsIHdhbnQgJWQiLCBCYWxhbmNlT2YocHJvdjEpLXAwLCA0MDAwMDApCgl9CglhcHBJbnZhcmlhbnQodCkKCS8vIFRoZSByZWZ1c2VkIGN1c3QyIHB1cmNoYXNlIGxhbmRlZCBpdHMgNDAwMDAwIGF0IHRoZSByZWFsbTsgb24gY2hhaW4KCS8vIHRoZSBhYm9ydCByZXZlcnRzIHRoYXQgc2VuZCwgYnV0IHRoZSBoYXJuZXNzIHNpbXVsYXRlcyBpdCByYXRoZXIKCS8vIHRoYW4gcm9sbGluZyBpdCBiYWNrLCBzbyBpdCBzdXJmYWNlcyBhcyBvdXQtb2YtYmFuZCBzdXJwbHVzLiBJdCBpcwoJLy8gYXNzZXJ0ZWQgYXMgc3VycGx1cyBwcmVjaXNlbHkgdG8gcHJvdmUgaXQgZGlkIE5PVCByZWFjaCBlc2Nyb3cgb3IgYQoJLy8gYmFsYW5jZS4KCWIuY29uc2VydmVkKHQsIDQwMDAwMCkKfQoKZnVuYyBUZXN0U2VydmljZUNhcFBlclByb3ZpZGVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCWlkcyA6PSBtYWtlKFtdaW50NjQsIDAsIE1heFNlcnZpY2VzUGVyUHJvdmlkZXIpCglmb3IgaSA6PSAwOyBpIDwgTWF4U2VydmljZXNQZXJQcm92aWRlcjsgaSsrIHsKCQlpZHMgPSBhcHBlbmQoaWRzLCByZWdpc3RlckFzKGN1ciwgcHJvdjIsICJzdmMiLCAiZCIsIDEwMDAsIE1pbkRlbGl2ZXJ5QmxvY2tzKSkKCX0KCWlmIFNlcnZpY2VzT2YocHJvdjIpICE9IE1heFNlcnZpY2VzUGVyUHJvdmlkZXIgewoJCXQuRmF0YWxmKCJTZXJ2aWNlc09mID0gJWQiLCBTZXJ2aWNlc09mKHByb3YyKSkKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJzZXJ2aWNlcyBwZXIgcHJvdmlkZXIiLCBmdW5jKCkgewoJCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAib25lIHRvbyBtYW55IiwgImQiLCAxMDAwLCBNaW5EZWxpdmVyeUJsb2NrcywgTWF4RmVlQnBzKQoJfSkKCgkvLyBSZXRpcmluZyBmcmVlcyBleGFjdGx5IG9uZSBzbG90LgoJUmV0aXJlU2VydmljZShjcm9zcyhjdXIpLCBpZHNbMF0pCglpZHMgPSBhcHBlbmQoaWRzLCByZWdpc3RlckFzKGN1ciwgcHJvdjIsICJyZXBsYWNlbWVudCIsICJkIiwgMTAwMCwgTWluRGVsaXZlcnlCbG9ja3MpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInNlcnZpY2VzIHBlciBwcm92aWRlciIsIGZ1bmMoKSB7CgkJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJzdGlsbCB0b28gbWFueSIsICJkIiwgMTAwMCwgTWluRGVsaXZlcnlCbG9ja3MsIE1heEZlZUJwcykKCX0pCgoJLy8gVGhlIGNhcCBpcyBwZXIgcHJvdmlkZXIsIG5vdCBnbG9iYWwuCglyZWdpc3RlckFzKGN1ciwgcHJvdjEsICJ1bmFmZmVjdGVkIiwgImQiLCAxMDAwLCBNaW5EZWxpdmVyeUJsb2NrcykKCgkvLyBUZWFyZG93bjogcmVhbG0gZ2xvYmFscyBwZXJzaXN0IGJldHdlZW4gdGVzdHMgaW4gdGhpcyBoYXJuZXNzLCBzbwoJLy8gbGVhdmluZyBwcm92MiBwaW5uZWQgYXQgdGhlIGNhcCB3b3VsZCBzaWxlbnRseSBicmVhayBldmVyeSBsYXRlcgoJLy8gdGVzdCB0aGF0IHJlZ2lzdGVycyBhcyBwcm92Mi4gUmV0aXJlIGV2ZXJ5dGhpbmcgdGhpcyB0ZXN0IG9wZW5lZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJZm9yIF8sIGlkIDo9IHJhbmdlIGlkc1sxOl0gewoJCVJldGlyZVNlcnZpY2UoY3Jvc3MoY3VyKSwgaWQpCgl9CglpZiBTZXJ2aWNlc09mKHByb3YyKSAhPSAwIHsKCQl0LkZhdGFsZigidGVhcmRvd24gbGVmdCAlZCBzZXJ2aWNlcyBvbiBwcm92MiIsIFNlcnZpY2VzT2YocHJvdjIpKQoJfQoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgovLyAtLS0tIHRoZSB0aHJlZSByZXF1aXJlZCBwcm90ZWN0aW9ucyAtLS0tCgovLyBVTkFVVEhPUklaRUQgU0VUVExFTUVOVC4gTm9ib2R5IGJ1dCB0aGUgY3VzdG9tZXIgY2FuIHJlc29sdmUgYQovLyBkZWxpdmVyZWQgb3JkZXIgZWFybHkg4oCUIG5vdCB0aGUgcHJvdmlkZXIgd2hvIGRpZCB0aGUgd29yaywgbm90IHRoZQovLyBhZG1pbiwgbm90IHRoZSBmZWUgcmVjaXBpZW50LCBub3QgYSBzdHJhbmdlciwgbm90IGFub3RoZXIgcmVhbG0uCmZ1bmMgVGVzdFVuYXV0aG9yaXplZFNldHRsZW1lbnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJcDAgOj0gQmFsYW5jZU9mKHByb3YxKQoJc2lkIDo9IHJlZ2lzdGVyQXMoY3VyLCBwcm92MSwgImF1ZGl0IHdvcmsiLCAicmV2aWV3IHRoZSB0aGluZyIsIDEwMDAwMDAsIDIwMDAwKQoJb2lkIDo9IHB1cmNoYXNlQXMoY3VyLCBjdXN0MSwgc2lkLCAxMDAwMDAwKQoKCS8vIE9ubHkgdGhlIHByb3ZpZGVyIG1heSBtYXJrIGRlbGl2ZXJlZC4KCWZvciBfLCBiYWQgOj0gcmFuZ2UgW11hZGRyZXNze2N1c3QxLCB0ZXN0QWRtaW4sIG1hbGxvcnksIHByb3YyfSB7CgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShiYWQpKQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJhZCkKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib25seSB0aGUgcHJvdmlkZXIgbWF5IG1hcmsgdGhpcyBvcmRlciBkZWxpdmVyZWQiLCBmdW5jKCkgewoJCQlNYXJrRGVsaXZlcmVkKGNyb3NzKGN1ciksIG9pZCwgIngiKQoJCX0pCgl9CgkvLyBOb3QgZXZlbiBmcm9tIGFub3RoZXIgY29kZSByZWFsbS4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZGVtby9hdHRhY2tlciIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib25seSB0aGUgcHJvdmlkZXIgbWF5IG1hcmsgdGhpcyBvcmRlciBkZWxpdmVyZWQiLCBmdW5jKCkgewoJCU1hcmtEZWxpdmVyZWQoY3Jvc3MoY3VyKSwgb2lkLCAieCIpCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJTWFya0RlbGl2ZXJlZChjcm9zcyhjdXIpLCBvaWQsICJpcGZzOi8vcmVwb3J0IikKCgkvLyBPbmx5IHRoZSBjdXN0b21lciBtYXkgYWNjZXB0LiBUSEUga2V5IGF1dGhvcml6YXRpb24uCglmb3IgXywgYmFkIDo9IHJhbmdlIFtdYWRkcmVzc3twcm92MSwgdGVzdEFkbWluLCBtYWxsb3J5LCBjdXN0Mn0gewoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYmFkKSkKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihiYWQpCgkJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCQl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9ubHkgdGhlIGN1c3RvbWVyIG1heSBhY2NlcHQgdGhpcyBkZWxpdmVyeSIsIGZ1bmMoKSB7CgkJCUFjY2VwdERlbGl2ZXJ5KGNyb3NzKGN1ciksIG9pZCkKCQl9KQoJfQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9kZW1vL2F0dGFja2VyIikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBjdXN0b21lciBtYXkgYWNjZXB0IHRoaXMgZGVsaXZlcnkiLCBmdW5jKCkgewoJCUFjY2VwdERlbGl2ZXJ5KGNyb3NzKGN1ciksIG9pZCkKCX0pCgoJLy8gVGhlIHRpbWVvdXQgdmFsdmUgaXMgcGVybWlzc2lvbmxlc3MgYnV0IE5PVCBlYXJseTogZXZlbiB0aGUKCS8vIHByb3ZpZGVyIGNhbm5vdCBwdWxsIGl0IGJlZm9yZSB0aGUgd2luZG93IGxhcHNlcy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJhY2NlcHRhbmNlIHdpbmRvdyBoYXMgbm90IGxhcHNlZCIsIGZ1bmMoKSB7CgkJUmVsZWFzZVRpbWVvdXQoY3Jvc3MoY3VyKSwgb2lkKQoJfSkKCgkvLyBOb3RoaW5nIGhhcyBtb3ZlZC4KCWlmIEJhbGFuY2VPZihwcm92MSkgIT0gcDAgewoJCXQuRmF0YWxmKCJwcm92aWRlciBjcmVkaXRlZCB3aXRob3V0IHJlc29sdXRpb246ICVkIC0+ICVkIiwgcDAsIEJhbGFuY2VPZihwcm92MSkpCgl9CglpZiBFc2Nyb3dUb3RhbCgpLWIuZXNjcm93ICE9IDEwMDAwMDAgewoJCXQuRmF0YWxmKCJlc2Nyb3cgbW92ZWQ6IM6URT0lZCIsIEVzY3Jvd1RvdGFsKCktYi5lc2Nyb3cpCgl9CgoJLy8gVGhlIGN1c3RvbWVyLCBhbmQgb25seSB0aGUgY3VzdG9tZXIsIHJlc29sdmVzIGl0LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjdXN0MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjdXN0MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglBY2NlcHREZWxpdmVyeShjcm9zcyhjdXIpLCBvaWQpCglpZiBCYWxhbmNlT2YocHJvdjEpLXAwICE9IDEwMDAwMDAgewoJCXQuRmF0YWxmKCJwcm92aWRlciBjcmVkaXRlZCAlZCwgd2FudCAxMDAwMDAwIGF0IDAgYnBzIiwgQmFsYW5jZU9mKHByb3YxKS1wMCkKCX0KCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKLy8gVGhlcmUgaXMgbm8gYWRtaW4gcGF0aCB0byBlc2Nyb3cgYXQgYWxsLiBUaGUgYWRtaW4ncyBvbmx5IHBvd2VycyBhcmUKLy8gdGhlIGZlZSBmb3IgRlVUVVJFIHNlcnZpY2VzLCB0aGUgZmVlIHJlY2lwaWVudCwgYW5kIHN1Y2Nlc3Npb24uCmZ1bmMgVGVzdEFkbWluQ2Fubm90VG91Y2hFc2Nyb3coY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJc2lkIDo9IHJlZ2lzdGVyQXMoY3VyLCBwcm92MSwgImhlbGQgd29yayIsICJkIiwgNzAwMDAwLCAyMDAwMCkKCW9pZCA6PSBwdXJjaGFzZUFzKGN1ciwgY3VzdDEsIHNpZCwgNzAwMDAwKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9ubHkgdGhlIHByb3ZpZGVyIG1heSBtYXJrIHRoaXMgb3JkZXIgZGVsaXZlcmVkIiwgZnVuYygpIHsKCQlNYXJrRGVsaXZlcmVkKGNyb3NzKGN1ciksIG9pZCwgIngiKQoJfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib25seSB0aGUgcHJvdmlkZXIgbWF5IGRlY2xpbmUgdGhpcyBvcmRlciIsIGZ1bmMoKSB7CgkJRGVjbGluZU9yZGVyKGNyb3NzKGN1ciksIG9pZCkKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImRlbGl2ZXJ5IHdpbmRvdyBoYXMgbm90IGxhcHNlZCIsIGZ1bmMoKSB7CgkJQ2xhaW1SZWZ1bmQoY3Jvc3MoY3VyKSwgb2lkKQoJfSkKCgkvLyBBbmQgc3dlZXAgY2Fubm90IHJlYWNoIGxpdmUgZXNjcm93OiB0aGUgcmVzZXJ2ZSBjb3ZlcnMgRSB0b28uCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCgxMjM0NSkpIC8vIGdlbnVpbmUgb3V0LW9mLWJhbmQgc3VycGx1cwoJYmVmb3JlIDo9IGNvaW5zT2YodGVzdEFkbWluKQoJU3dlZXBEZW5vbShjcm9zcyhjdXIpLCBEZW5vbSkKCWlmIGdvdCA6PSBjb2luc09mKHRlc3RBZG1pbikgLSBiZWZvcmU7IGdvdCAhPSAxMjM0NSB7CgkJdC5GYXRhbGYoInN3ZXB0ICVkLCB3YW50IGV4YWN0bHkgdGhlIDEyMzQ1IHN1cnBsdXMiLCBnb3QpCgl9CglpZiBFc2Nyb3dUb3RhbCgpICE9IGIuZXNjcm93KzcwMDAwMCB7CgkJdC5GYXRhbGYoInN3ZWVwIHJlYWNoZWQgZXNjcm93OiAlZCIsIEVzY3Jvd1RvdGFsKCkpCgl9CglhcHBJbnZhcmlhbnQodCkKfQoKLy8gRE9VQkxFIFBBWU1FTlQuIEV2ZXJ5IHRlcm1pbmFsIHRyYW5zaXRpb24gaXMgcmVhY2hhYmxlIGF0IG1vc3Qgb25jZSwKLy8gYW5kIHRoZSB0d28gdGVybWluYWwgb3V0Y29tZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KZnVuYyBUZXN0Tm9Eb3VibGVQYXltZW50KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCXNpZCA6PSByZWdpc3RlckFzKGN1ciwgcHJvdjEsICJkb3VibGUgY2hlY2siLCAiZCIsIDYwMDAwMCwgMjAwMDApCgoJLy8gQWNjZXB0IHR3aWNlLgoJb2lkIDo9IHB1cmNoYXNlQXMoY3VyLCBjdXN0MSwgc2lkLCA2MDAwMDApCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCU1hcmtEZWxpdmVyZWQoY3Jvc3MoY3VyKSwgb2lkLCAidjEiKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjdXN0MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjdXN0MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglBY2NlcHREZWxpdmVyeShjcm9zcyhjdXIpLCBvaWQpCgljcmVkaXRlZCA6PSBCYWxhbmNlT2YocHJvdjEpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBhY2NlcHRhbmNlIiwgZnVuYygpIHsKCQlBY2NlcHREZWxpdmVyeShjcm9zcyhjdXIpLCBvaWQpCgl9KQoJaWYgQmFsYW5jZU9mKHByb3YxKSAhPSBjcmVkaXRlZCB7CgkJdC5GYXRhbGYoInNlY29uZCBhY2NlcHQgcGFpZCBhZ2FpbjogJWQgLT4gJWQiLCBjcmVkaXRlZCwgQmFsYW5jZU9mKHByb3YxKSkKCX0KCgkvLyBSZWxlYXNlZCBvcmRlcnMgY2Fubm90IHRoZW4gYmUgcmVmdW5kZWQsIHRpbWVkIG91dCwgb3IgcmUtZGVsaXZlcmVkLgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvcmRlciBpcyBub3QgYXdhaXRpbmcgYWNjZXB0YW5jZSIsIGZ1bmMoKSB7CgkJUmVsZWFzZVRpbWVvdXQoY3Jvc3MoY3VyKSwgb2lkKQoJfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3JkZXIgaXMgbm90IGF3YWl0aW5nIGRlbGl2ZXJ5IiwgZnVuYygpIHsKCQlDbGFpbVJlZnVuZChjcm9zcyhjdXIpLCBvaWQpCgl9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBkZWxpdmVyeSIsIGZ1bmMoKSB7CgkJRGVjbGluZU9yZGVyKGNyb3NzKGN1ciksIG9pZCkKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBkZWxpdmVyeSIsIGZ1bmMoKSB7CgkJTWFya0RlbGl2ZXJlZChjcm9zcyhjdXIpLCBvaWQsICJ2MiIpCgl9KQoKCS8vIERlY2xpbmUgdHdpY2UsIGFuZCBhIGRlY2xpbmVkIG9yZGVyIGNhbm5vdCB0aGVuIGJlIHJlbGVhc2VkLgoJb2lkMiA6PSBwdXJjaGFzZUFzKGN1ciwgY3VzdDIsIHNpZCwgNjAwMDAwKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglEZWNsaW5lT3JkZXIoY3Jvc3MoY3VyKSwgb2lkMikKCXJlZnVuZGVkIDo9IEJhbGFuY2VPZihjdXN0MikKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3JkZXIgaXMgbm90IGF3YWl0aW5nIGRlbGl2ZXJ5IiwgZnVuYygpIHsKCQlEZWNsaW5lT3JkZXIoY3Jvc3MoY3VyKSwgb2lkMikKCX0pCglpZiBCYWxhbmNlT2YoY3VzdDIpICE9IHJlZnVuZGVkIHsKCQl0LkZhdGFsZigic2Vjb25kIGRlY2xpbmUgcmVmdW5kZWQgYWdhaW4iKQoJfQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjdXN0MikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjdXN0MikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBhY2NlcHRhbmNlIiwgZnVuYygpIHsKCQlBY2NlcHREZWxpdmVyeShjcm9zcyhjdXIpLCBvaWQyKQoJfSkKCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKLy8gQSBjbGFpbSBwYXlzIG91dCBvbmNlOyB0aGUgbGVkZ2VyIGlzIGRlYml0ZWQgYmVmb3JlIGNvaW5zIG1vdmUuCmZ1bmMgVGVzdE5vRG91YmxlQ2xhaW0oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJcDAgOj0gQmFsYW5jZU9mKHByb3YxKSAvLyBjYXJyaWVkIGluIGZyb20gZWFybGllciB0ZXN0czsgQ2xhaW1BbGwgZHJhaW5zIGl0IHRvbwoJc2lkIDo9IHJlZ2lzdGVyQXMoY3VyLCBwcm92MSwgImNsYWltIG9uY2UiLCAiZCIsIDgwMDAwMCwgMjAwMDApCglvaWQgOj0gcHVyY2hhc2VBcyhjdXIsIGN1c3QxLCBzaWQsIDgwMDAwMCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJTWFya0RlbGl2ZXJlZChjcm9zcyhjdXIpLCBvaWQsICJkb25lIikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3VzdDEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3VzdDEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQWNjZXB0RGVsaXZlcnkoY3Jvc3MoY3VyKSwgb2lkKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJYmVmb3JlIDo9IGNvaW5zT2YocHJvdjEpCglDbGFpbUFsbChjcm9zcyhjdXIpKQoJaWYgZ290IDo9IGNvaW5zT2YocHJvdjEpIC0gYmVmb3JlOyBnb3QgIT0gcDArODAwMDAwIHsKCQl0LkZhdGFsZigiY2xhaW1lZCAlZCwgd2FudCAlZCIsIGdvdCwgcDArODAwMDAwKQoJfQoJaWYgQmFsYW5jZU9mKHByb3YxKSAhPSAwIHsKCQl0LkZhdGFsKCJiYWxhbmNlIG5vdCB6ZXJvZWQiKQoJfQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJub3RoaW5nIHRvIGNsYWltIiwgZnVuYygpIHsKCQlDbGFpbUFsbChjcm9zcyhjdXIpKQoJfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiaW5zdWZmaWNpZW50IiwgZnVuYygpIHsKCQlDbGFpbShjcm9zcyhjdXIpLCAxKQoJfSkKCWlmIGdvdCA6PSBjb2luc09mKHByb3YxKSAtIGJlZm9yZTsgZ290ICE9IHAwKzgwMDAwMCB7CgkJdC5GYXRhbGYoImEgc2Vjb25kIGNsYWltIHBhaWQgb3V0OiB0b3RhbCAlZCIsIGdvdCkKCX0KCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKLy8gU1RVQ0sgRlVORFMsIGFybSAxOiB0aGUgcHJvdmlkZXIgYWJhbmRvbnMgdGhlIG9yZGVyLiBBbnlvbmUgbWF5Ci8vIHJldHVybiB0aGUgZXNjcm93IHRvIHRoZSBjdXN0b21lciBvbmNlIHRoZSBkZWxpdmVyeSB3aW5kb3cgbGFwc2VzLgpmdW5jIFRlc3RTdHVja0Z1bmRzUHJvdmlkZXJBYmFuZG9ucyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYiA6PSBiZWdpbigpCglzaWQgOj0gcmVnaXN0ZXJBcyhjdXIsIHByb3YxLCAibmV2ZXIgZGVsaXZlcmVkIiwgImQiLCA5MDAwMDAsIE1pbkRlbGl2ZXJ5QmxvY2tzKQoJb2lkIDo9IHB1cmNoYXNlQXMoY3VyLCBjdXN0MSwgc2lkLCA5MDAwMDApCgoJLy8gVG9vIGVhcmx5LCBldmVuIGZvciB0aGUgY3VzdG9tZXIuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGN1c3QxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGN1c3QxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiZGVsaXZlcnkgd2luZG93IGhhcyBub3QgbGFwc2VkIiwgZnVuYygpIHsKCQlDbGFpbVJlZnVuZChjcm9zcyhjdXIpLCBvaWQpCgl9KQoKCXRlc3RpbmcuU2tpcEhlaWdodHMoTWluRGVsaXZlcnlCbG9ja3MpCgoJLy8gQSB0b3RhbCBzdHJhbmdlciBwdWxscyB0aGUgdmFsdmU7IHRoZSBtb25leSBnb2VzIHRvIHRoZSBDVVNUT01FUiwKCS8vIG5vdCB0byB0aGUgY2FsbGVyLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJbUJlZm9yZSA6PSBCYWxhbmNlT2YobWFsbG9yeSkKCUNsYWltUmVmdW5kKGNyb3NzKGN1ciksIG9pZCkKCWlmIEJhbGFuY2VPZihtYWxsb3J5KSAhPSBtQmVmb3JlIHsKCQl0LkZhdGFsKCJ0aGUgdmFsdmUgcGFpZCBpdHMgY2FsbGVyIikKCX0KCWlmIEJhbGFuY2VPZihjdXN0MSkgIT0gOTAwMDAwIHsKCQl0LkZhdGFsZigiY3VzdG9tZXIgcmVmdW5kID0gJWQsIHdhbnQgOTAwMDAwIiwgQmFsYW5jZU9mKGN1c3QxKSkKCX0KCWlmIEZlZXNBY2NydWVkKCkgIT0gYi5mZWVzIHsKCQl0LkZhdGFsKCJhIHJlZnVuZCBhY2NydWVkIGEgcHJvdG9jb2wgZmVlIikKCX0KCV8sIF8sIF8sIF8sIF8sIHN0YXR1cyA6PSBPcmRlckluZm8ob2lkKQoJaWYgc3RhdHVzICE9IE9yZGVyUmVmdW5kZWQgewoJCXQuRmF0YWxmKCJzdGF0dXMgPSAlcyIsIHN0YXR1cykKCX0KCS8vIEFuZCB0aGUgY3VzdG9tZXIgY2FuIGFjdHVhbGx5IGdldCB0aGUgY29pbnMgb3V0LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjdXN0MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjdXN0MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgliZWZvcmUgOj0gY29pbnNPZihjdXN0MSkKCUNsYWltQWxsKGNyb3NzKGN1cikpCglpZiBnb3QgOj0gY29pbnNPZihjdXN0MSkgLSBiZWZvcmU7IGdvdCAhPSA5MDAwMDAgewoJCXQuRmF0YWxmKCJjdXN0b21lciB3aXRoZHJldyAlZCIsIGdvdCkKCX0KCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKLy8gU1RVQ0sgRlVORFMsIGFybSAyOiB0aGUgY3VzdG9tZXIgZ29lcyBzaWxlbnQgYWZ0ZXIgZGVsaXZlcnkuIEFueW9uZQovLyBtYXkgcmVsZWFzZSB0aGUgZXNjcm93IHRvIHRoZSBwcm92aWRlciBvbmNlIGFjY2VwdGFuY2UgbGFwc2VzLiBUaGlzCi8vIGlzIHRoZSB2YWx2ZSB3aG9zZSBwb2xhcml0eSBpcyBJTlZFUlRFRCBmcm9tIGV2ZXJ5IHNpYmxpbmcgcmVhbG0ncywKLy8gYW5kIGdldHRpbmcgaXQgd3Jvbmcgd291bGQgc3RyYW5kIGNvbXBsZXRlZCB3b3JrLgpmdW5jIFRlc3RTdHVja0Z1bmRzQ3VzdG9tZXJHb2VzU2lsZW50KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCXNpZCA6PSByZWdpc3RlckFzKGN1ciwgcHJvdjEsICJkZWxpdmVyZWQgaWdub3JlZCIsICJkIiwgMTAwMDAwMCwgTWF4RGVsaXZlcnlCbG9ja3MpCglvaWQgOj0gcHVyY2hhc2VBcyhjdXIsIGN1c3QxLCBzaWQsIDEwMDAwMDApCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCU1hcmtEZWxpdmVyZWQoY3Jvc3MoY3VyKSwgb2lkLCAiaXBmczovL2ZpbmFsIikKCglfLCBhY2NlcHRhbmNlRGVhZGxpbmUgOj0gT3JkZXJEZWFkbGluZXMob2lkKQoJaWYgYWNjZXB0YW5jZURlYWRsaW5lICE9IEhlaWdodCgpK0FjY2VwdGFuY2VCbG9ja3MgewoJCXQuRmF0YWxmKCJhY2NlcHRhbmNlIGRlYWRsaW5lID0gJWQsIHdhbnQgaGVpZ2h0KyVkIiwgYWNjZXB0YW5jZURlYWRsaW5lLCBBY2NlcHRhbmNlQmxvY2tzKQoJfQoKCXRlc3RpbmcuU2tpcEhlaWdodHMoQWNjZXB0YW5jZUJsb2NrcykKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgltQmVmb3JlIDo9IEJhbGFuY2VPZihtYWxsb3J5KQoJUmVsZWFzZVRpbWVvdXQoY3Jvc3MoY3VyKSwgb2lkKQoJaWYgQmFsYW5jZU9mKG1hbGxvcnkpICE9IG1CZWZvcmUgewoJCXQuRmF0YWwoInRoZSB2YWx2ZSBwYWlkIGl0cyBjYWxsZXIiKQoJfQoJaWYgQmFsYW5jZU9mKHByb3YxKSAhPSAxMDAwMDAwIHsKCQl0LkZhdGFsZigicHJvdmlkZXIgPSAlZCwgd2FudCAxMDAwMDAwIiwgQmFsYW5jZU9mKHByb3YxKSkKCX0KCV8sIF8sIF8sIF8sIF8sIHN0YXR1cyA6PSBPcmRlckluZm8ob2lkKQoJaWYgc3RhdHVzICE9IE9yZGVyUmVsZWFzZWQgewoJCXQuRmF0YWxmKCJzdGF0dXMgPSAlcyIsIHN0YXR1cykKCX0KCWFwcEludmFyaWFudCh0KQoJYi5jb25zZXJ2ZWQodCwgMCkKfQoKLy8gVGhlIGRlbGl2ZXJ5IGRlYWRsaW5lIHByb3RlY3RzIHRoZSBjdXN0b21lciwgc28gbGF0ZSBkZWxpdmVyeSBpcwovLyBhbGxvd2VkIHdoaWxlIHRoZSByZWZ1bmQgdmFsdmUgaXMgc3RpbGwgdW4tcHVsbGVkIOKAlCBidXQgdGhlIHJlZnVuZAovLyB2YWx2ZSBjbG9zZXMgdGhlIGluc3RhbnQgZGVsaXZlcnkgbGFuZHMsIGFuZCByZW9wZW5pbmcgaXQgaXMgbm90Ci8vIHBvc3NpYmxlLgpmdW5jIFRlc3RMYXRlRGVsaXZlcnlSYWNlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IGJlZ2luKCkKCXAwIDo9IEJhbGFuY2VPZihwcm92MSkKCXNpZCA6PSByZWdpc3RlckFzKGN1ciwgcHJvdjEsICJsYXRlIGJ1dCB3YW50ZWQiLCAiZCIsIDUwMDAwMCwgTWluRGVsaXZlcnlCbG9ja3MpCglvaWQgOj0gcHVyY2hhc2VBcyhjdXIsIGN1c3QxLCBzaWQsIDUwMDAwMCkKCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pbkRlbGl2ZXJ5QmxvY2tzICsgMTApCgoJLy8gUHJvdmlkZXIgZGVsaXZlcnMgbGF0ZTsgcGVybWl0dGVkLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglNYXJrRGVsaXZlcmVkKGNyb3NzKGN1ciksIG9pZCwgImxhdGUuemlwIikKCgkvLyBUaGUgcmVmdW5kIHZhbHZlIGlzIG5vdyBjbG9zZWQ6IHRoZSBvcmRlciBpcyBubyBsb25nZXIgYXdhaXRpbmcKCS8vIGRlbGl2ZXJ5LCBzbyB0aGUgbGFwc2VkIGRlbGl2ZXJ5IGRlYWRsaW5lIGlzIGlycmVsZXZhbnQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBkZWxpdmVyeSIsIGZ1bmMoKSB7CgkJQ2xhaW1SZWZ1bmQoY3Jvc3MoY3VyKSwgb2lkKQoJfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3VzdDEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3VzdDEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvcmRlciBpcyBub3QgYXdhaXRpbmcgZGVsaXZlcnkiLCBmdW5jKCkgewoJCUNsYWltUmVmdW5kKGNyb3NzKGN1ciksIG9pZCkKCX0pCgoJLy8gVGhlIGN1c3RvbWVyIHN0aWxsIGhvbGRzIHRoZSByZWFsIGxldmVyOiBhY2NlcHQsIG9yIHdhaXQgb3V0IHRoZQoJLy8gYWNjZXB0YW5jZSB3aW5kb3cuCglBY2NlcHREZWxpdmVyeShjcm9zcyhjdXIpLCBvaWQpCglpZiBCYWxhbmNlT2YocHJvdjEpLXAwICE9IDUwMDAwMCB7CgkJdC5GYXRhbGYoInByb3ZpZGVyIGNyZWRpdGVkICVkLCB3YW50IDUwMDAwMCIsIEJhbGFuY2VPZihwcm92MSktcDApCgl9CglhcHBJbnZhcmlhbnQodCkKCWIuY29uc2VydmVkKHQsIDApCn0KCi8vIC0tLS0gZmVlcywgc3dlZXAsIGFkbWluaXN0cmF0aW9uIC0tLS0KCmZ1bmMgVGVzdEZlZVNwbGl0QW5kV2l0aGRyYXcoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJcDAgOj0gQmFsYW5jZU9mKHByb3YxKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVNldEZlZUJwcyhjcm9zcyhjdXIpLCAyNTApIC8vIDIuNSUKCglzaWQgOj0gcmVnaXN0ZXJBcyhjdXIsIHByb3YxLCAiZmVlIGJlYXJpbmciLCAiZCIsIDEwMDAwMDAsIDIwMDAwKQoJcCwgZmVlLCB0b1Byb3ZpZGVyIDo9IFF1b3RlKHNpZCkKCWlmIHAgIT0gMTAwMDAwMCB8fCBmZWUgIT0gMjUwMDAgfHwgdG9Qcm92aWRlciAhPSA5NzUwMDAgewoJCXQuRmF0YWxmKCJRdW90ZSA9ICVkLyVkLyVkIiwgcCwgZmVlLCB0b1Byb3ZpZGVyKQoJfQoKCW9pZCA6PSBwdXJjaGFzZUFzKGN1ciwgY3VzdDEsIHNpZCwgMTAwMDAwMCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJTWFya0RlbGl2ZXJlZChjcm9zcyhjdXIpLCBvaWQsICJ4IikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3VzdDEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3VzdDEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQWNjZXB0RGVsaXZlcnkoY3Jvc3MoY3VyKSwgb2lkKQoKCWlmIEJhbGFuY2VPZihwcm92MSktcDAgIT0gOTc1MDAwIHsKCQl0LkZhdGFsZigicHJvdmlkZXIgY3JlZGl0ZWQgJWQsIHdhbnQgOTc1MDAwIiwgQmFsYW5jZU9mKHByb3YxKS1wMCkKCX0KCWlmIEZlZXNBY2NydWVkKCktYi5mZWVzICE9IDI1MDAwIHsKCQl0LkZhdGFsZigiZmVlIHBvdCDOlEYgPSAlZCIsIEZlZXNBY2NydWVkKCktYi5mZWVzKQoJfQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib25seSB0aGUgZmVlIHJlY2lwaWVudCBtYXkgd2l0aGRyYXcgZmVlcyIsIGZ1bmMoKSB7CgkJV2l0aGRyYXdGZWVzKGNyb3NzKGN1cikpCgl9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCWJlZm9yZSA6PSBjb2luc09mKHRlc3RBZG1pbikKCVdpdGhkcmF3RmVlcyhjcm9zcyhjdXIpKQoJaWYgZ290IDo9IGNvaW5zT2YodGVzdEFkbWluKSAtIGJlZm9yZTsgZ290ICE9IGIuZmVlcysyNTAwMCB7CgkJdC5GYXRhbGYoIndpdGhkcmV3ICVkIiwgZ290KQoJfQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJubyBmZWVzIGFjY3J1ZWQiLCBmdW5jKCkgewoJCVdpdGhkcmF3RmVlcyhjcm9zcyhjdXIpKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJU2V0RmVlQnBzKGNyb3NzKGN1ciksIDApCglhcHBJbnZhcmlhbnQodCkKCWIuY29uc2VydmVkKHQsIDApCn0KCmZ1bmMgVGVzdFN3ZWVwUmVzZXJ2ZXNFc2Nyb3coY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJc2lkIDo9IHJlZ2lzdGVyQXMoY3VyLCBwcm92MSwgInN3ZWVwIGd1YXJkIiwgImQiLCA0MDAwMDAsIDIwMDAwKQoJcHVyY2hhc2VBcyhjdXIsIGN1c3QxLCBzaWQsIDQwMDAwMCkKCgkvLyBObyBzdXJwbHVzIHlldC4gY29pbmlvLlN3ZWVwIGFib3J0cyByYXRoZXIgdGhhbiBzZW5kaW5nIHplcm8sIHNvCgkvLyB0aGUgZXNjcm93IGlzIHVucmVhY2hhYmxlIGJ5IFJFVkVSVCwgbm90IG1lcmVseSBieSBhcml0aG1ldGljIOKAlAoJLy8gd2hpY2ggaXMgdGhlIHN0cm9uZ2VyIG9mIHRoZSB0d28uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJYmVmb3JlIDo9IGNvaW5zT2YodGVzdEFkbWluKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJubyBzdXJwbHVzIHRvIHN3ZWVwIiwgZnVuYygpIHsKCQlTd2VlcERlbm9tKGNyb3NzKGN1ciksIERlbm9tKQoJfSkKCWlmIGNvaW5zT2YodGVzdEFkbWluKSAhPSBiZWZvcmUgewoJCXQuRmF0YWwoInN3ZXB0IG91dCBvZiBhIHplcm8tc3VycGx1cyByZWFsbSIpCgl9CglpZiBFc2Nyb3dUb3RhbCgpICE9IGIuZXNjcm93KzQwMDAwMCB7CgkJdC5GYXRhbCgic3dlZXAgcmVhY2hlZCBlc2Nyb3ciKQoJfQoKCS8vIEEgZm9yZWlnbiBkZW5vbSBtb3ZlcyB3aG9sbHkuCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKCJnanVuayIsIDc3KSkpCglTd2VlcERlbm9tKGNyb3NzKGN1ciksICJnanVuayIpCglpZiBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2luKHRlc3RBZG1pbiwgImdqdW5rIikgIT0gNzcgewoJCXQuRmF0YWwoImZvcmVpZ24gZGVub20gbm90IHN3ZXB0IikKCX0KCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9ubHkgdGhlIGZlZSByZWNpcGllbnQgbWF5IHN3ZWVwIHN1cnBsdXMiLCBmdW5jKCkgewoJCVN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pCgl9KQoJYXBwSW52YXJpYW50KHQpCn0KCmZ1bmMgVGVzdEFkbWluSGFuZG92ZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvbmx5IiwgZnVuYygpIHsKCQlUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIG1hbGxvcnkpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvbmx5IiwgZnVuYygpIHsKCQlTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMTApCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvbmx5IiwgZnVuYygpIHsKCQlTZXRGZWVSZWNpcGllbnQoY3Jvc3MoY3VyKSwgbWFsbG9yeSkKCX0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCS8vIEEgbWFsZm9ybWVkIG5vbWluZWUgaXMgcmVqZWN0ZWQgd2hlcmUgdGhlIHR5cG8gaXMgbWFkZSwgZm9yIHBhcml0eQoJLy8gd2l0aCBTZXRGZWVSZWNpcGllbnQuIFRoZSB6ZXJvIGFkZHJlc3Mga2VlcHMgaXRzIGRvY3VtZW50ZWQgbWVhbmluZwoJLy8gYXMgdGhlIGNhbmNlbCBzZW50aW5lbCBhbmQgbXVzdCBOT1QgYmUgY2F1Z2h0IGJ5IHRoYXQgY2hlY2suCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgYWRtaW4gYWRkcmVzcyIsIGZ1bmMoKSB7CgkJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCBhZGRyZXNzKCJnMW5vdGFuYWRkcmVzcyIpKQoJfSkKCVRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgcHJvdjIpCglpZiBBZG1pbigpICE9IHRlc3RBZG1pbiB7CgkJdC5GYXRhbCgibm9taW5hdGlvbiB0b29rIGVmZmVjdCBpbW1lZGlhdGVseSIpCgl9CglpZiBQZW5kaW5nQWRtaW4oKSAhPSBwcm92MiB7CgkJdC5GYXRhbGYoInBlbmRpbmcgPSAldiIsIFBlbmRpbmdBZG1pbigpKQoJfQoJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCAiIikKCWlmIFBlbmRpbmdBZG1pbigpICE9ICIiIHsKCQl0LkZhdGFsZigiemVybyBhZGRyZXNzIGRpZCBub3QgY2FuY2VsOiAldiIsIFBlbmRpbmdBZG1pbigpKQoJfQoJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCBwcm92MikKCgkvLyBXcm9uZyBhY2NlcHRvci4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib25seSB0aGUgbm9taW5hdGVkIGFkbWluIG1heSBhY2NlcHQiLCBmdW5jKCkgewoJCUFjY2VwdEFkbWluKGNyb3NzKGN1cikpCgl9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJaWYgQWRtaW4oKSAhPSBwcm92MiB7CgkJdC5GYXRhbGYoImFkbWluID0gJXYiLCBBZG1pbigpKQoJfQoJdmFyIHplcm8gYWRkcmVzcwoJaWYgUGVuZGluZ0FkbWluKCkgIT0gemVybyB7CgkJdC5GYXRhbCgicGVuZGluZyBub3QgY2xlYXJlZCIpCgl9CgoJLy8gQXV0aG9yaXR5IE1PVkVEOiB0aGUgZm9ybWVyIGFkbWluIGlzIG5vdyBwb3dlcmxlc3MuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvbmx5IiwgZnVuYygpIHsKCQlTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMTApCgl9KQoKCS8vIEhhbmQgaXQgYmFjayBzbyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUga2VlcHMgaXRzIHNlZWRlZCByb2xlcy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCWlmIEFkbWluKCkgIT0gdGVzdEFkbWluIHsKCQl0LkZhdGFsKCJoYW5kYmFjayBmYWlsZWQiKQoJfQoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQp9CgovLyAtLS0tIHJlbmRlciBzYWZldHkgLS0tLQoKZnVuYyBUZXN0UmVuZGVyU2FuaXRpemVzVW50cnVzdGVkVGV4dChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJZXZpbCA6PSAiW2NsaWNrXShodHRwczovL2V2aWwuZXhhbXBsZSkgIVt4XShodHRwczovL2V2aWwuZXhhbXBsZS94LnBuZykiCglzaWQgOj0gcmVnaXN0ZXJBcyhjdXIsIHByb3YxLCAicmVuZGVyIHByb2JlIiwgZXZpbCwgMTAwMDAwLCAyMDAwMCkKCW9pZCA6PSBwdXJjaGFzZUFzKGN1ciwgY3VzdDEsIHNpZCwgMTAwMDAwKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglNYXJrRGVsaXZlcmVkKGNyb3NzKGN1ciksIG9pZCwgZXZpbCkKCglzT3V0IDo9IFJlbmRlcigicy8iICsgaXRvYShzaWQpKQoJaWYgc3RyaW5ncy5Db250YWlucyhzT3V0LCAiXShodHRwczovL2V2aWwuZXhhbXBsZSkiKSB7CgkJdC5GYXRhbCgic2VydmljZSBkZXNjcmlwdGlvbiByZW5kZXJlZCBhbiB1bmVzY2FwZWQgbWFya2Rvd24gbGluayIpCgl9CglvT3V0IDo9IFJlbmRlcigiby8iICsgaXRvYShvaWQpKQoJaWYgc3RyaW5ncy5Db250YWlucyhvT3V0LCAiXShodHRwczovL2V2aWwuZXhhbXBsZS94LnBuZykiKSB7CgkJdC5GYXRhbCgiZGVsaXZlcnkgdXJpIHJlbmRlcmVkIGFuIHVuZXNjYXBlZCBtYXJrZG93biBpbWFnZSIpCgl9CgoJLy8gVW5rbm93biBhbmQgbWFsZm9ybWVkIGlkcyBkZWdyYWRlIHRvIGEgd2FybmluZywgbmV2ZXIgYSBwYW5pYy4KCWZvciBfLCBwIDo9IHJhbmdlIFtdc3RyaW5neyJzL2FiYyIsICJvL2FiYyIsICJzLzk5OTk5OSIsICJvLzk5OTk5OSJ9IHsKCQlpZiAhc3RyaW5ncy5Db250YWlucyhSZW5kZXIocCksICJbIVdBUk5JTkddIikgewoJCQl0LkZhdGFsZigiUmVuZGVyKCVxKSBkaWQgbm90IHdhcm4iLCBwKQoJCX0KCX0KCWlmICFzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigiIiksICJTZXJ2aWNlIG1hcmtldHBsYWNlIikgewoJCXQuRmF0YWwoImhvbWUgcmVuZGVyIGJyb2tlbiIpCgl9CglhcHBJbnZhcmlhbnQodCkKfQoKLy8gVGhlIGhvbWUgcGFnZSBpcyBib3VuZGVkIHJlZ2FyZGxlc3Mgb2YgY2F0YWxvZyBzaXplLgpmdW5jIFRlc3RSZW5kZXJJc0JvdW5kZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZvciBpIDo9IDA7IGkgPCBSZW5kZXJMaW1pdCs1OyBpKysgewoJCXJlZ2lzdGVyQXMoY3VyLCBwcm92MiwgImJ1bGsgc3ZjIiwgImQiLCAxMDAwLCBNaW5EZWxpdmVyeUJsb2NrcykKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YyKSkKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MikKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJCS8vIFJldGlyZSBpbW1lZGlhdGVseSBzbyB0aGUgcGVyLXByb3ZpZGVyIGNhcCBpcyBub3QgdGhlIHRoaW5nCgkJLy8gdW5kZXIgdGVzdCBoZXJlLgoJCVJldGlyZVNlcnZpY2UoY3Jvc3MoY3VyKSwgTnVtU2VydmljZXMoKS0xKQoJfQoJb3V0IDo9IFJlbmRlcigiIikKCWlmIGdvdCA6PSBzdHJpbmdzLkNvdW50KG91dCwgIlxuLSBbIyIpOyBnb3QgPiBSZW5kZXJMaW1pdCB7CgkJdC5GYXRhbGYoImhvbWUgbGlzdGVkICVkIHNlcnZpY2VzLCBjYXAgaXMgJWQiLCBnb3QsIFJlbmRlckxpbWl0KQoJfQoJYXBwSW52YXJpYW50KHQpCn0KCi8vIC0tLS0gZ3VhcmRzIG9uIGV2ZXJ5IG5vbi1wYXlhYmxlIGVudHJ5cG9pbnQgLS0tLQoKZnVuYyBUZXN0Tm9uUGF5YWJsZUVudHJ5cG9pbnRzUmVmdXNlQ29pbnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJc2lkIDo9IHJlZ2lzdGVyQXMoY3VyLCBwcm92MSwgInNlbmQgZ3VhcmQiLCAiZCIsIDEwMDAwMCwgMjAwMDApCglvaWQgOj0gcHVyY2hhc2VBcyhjdXIsIGN1c3QxLCBzaWQsIDEwMDAwMCkKCglzdGFnZSA6PSBmdW5jKGZyb20gYWRkcmVzcykgewoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnJvbSkKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMSkpCgl9Cgltc2cgOj0gInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIgoKCXN0YWdlKHByb3YxKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywgZnVuYygpIHsgTWFya0RlbGl2ZXJlZChjcm9zcyhjdXIpLCBvaWQsICJ4IikgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IERlY2xpbmVPcmRlcihjcm9zcyhjdXIpLCBvaWQpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBSZXRpcmVTZXJ2aWNlKGNyb3NzKGN1ciksIHNpZCkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IENsYWltQWxsKGNyb3NzKGN1cikpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBDbGFpbShjcm9zcyhjdXIpLCAxKSB9KQoJc3RhZ2UoY3VzdDEpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBBY2NlcHREZWxpdmVyeShjcm9zcyhjdXIpLCBvaWQpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBDbGFpbVJlZnVuZChjcm9zcyhjdXIpLCBvaWQpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBSZWxlYXNlVGltZW91dChjcm9zcyhjdXIpLCBvaWQpIH0pCglzdGFnZSh0ZXN0QWRtaW4pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMSkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IFNldEZlZVJlY2lwaWVudChjcm9zcyhjdXIpLCBwcm92MSkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IFRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgcHJvdjEpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBBY2NlcHRBZG1pbihjcm9zcyhjdXIpKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywgZnVuYygpIHsgV2l0aGRyYXdGZWVzKGNyb3NzKGN1cikpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBTd2VlcERlbm9tKGNyb3NzKGN1ciksIERlbm9tKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJYXBwSW52YXJpYW50KHQpCglpZiBFc2Nyb3dUb3RhbCgpICE9IGIuZXNjcm93KzEwMDAwMCB7CgkJdC5GYXRhbCgiYSByZWZ1c2VkIGNhbGwgbW92ZWQgZXNjcm93IikKCX0KfQoKZnVuYyBUZXN0VW5rbm93bklkc0Fib3J0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInVua25vd24gc2VydmljZSBpZCIsIGZ1bmMoKSB7CgkJUmV0aXJlU2VydmljZShjcm9zcyhjdXIpLCA5OTk5OTkpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIG9yZGVyIGlkIiwgZnVuYygpIHsKCQlBY2NlcHREZWxpdmVyeShjcm9zcyhjdXIpLCA5OTk5OTkpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIG9yZGVyIGlkIiwgZnVuYygpIHsKCQlDbGFpbVJlZnVuZChjcm9zcyhjdXIpLCA5OTk5OTkpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIG9yZGVyIGlkIiwgZnVuYygpIHsKCQlSZWxlYXNlVGltZW91dChjcm9zcyhjdXIpLCA5OTk5OTkpCgl9KQoJLy8gQSB2aWV3IGlzIG5vdCBhIGNyb3NzaW5nIGNhbGwsIHNvIGl0cyBmYWlsdXJlIGlzIGEgcGxhaW4gcGFuaWMKCS8vIHJhdGhlciB0aGFuIGFuIGFib3J0IOKAlCBhIGRpZmZlcmVudCBhc3NlcnRpb24sIG5vdCBhIHdlYWtlciBvbmUuCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInVua25vd24gc2VydmljZSBpZCIsIGZ1bmMoKSB7CgkJU2VydmljZURlc2NyaXB0aW9uKDk5OTk5OSkKCX0pCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInVua25vd24gb3JkZXIgaWQiLCBmdW5jKCkgewoJCU9yZGVySW5mbyg5OTk5OTkpCgl9KQp9CgpmdW5jIFRlc3RNYXJrRGVsaXZlcmVkQm91bmRzVVJJKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglzaWQgOj0gcmVnaXN0ZXJBcyhjdXIsIHByb3YxLCAidXJpIGJvdW5kIiwgImQiLCAxMDAwMDAsIDIwMDAwKQoJb2lkIDo9IHB1cmNoYXNlQXMoY3VyLCBjdXN0MSwgc2lkLCAxMDAwMDApCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAidXJpIG11c3QgYmUgYXQgbW9zdCIsIGZ1bmMoKSB7CgkJTWFya0RlbGl2ZXJlZChjcm9zcyhjdXIpLCBvaWQsIHN0cmluZ3MuUmVwZWF0KCJ1IiwgTWF4VVJJTGVuKzEpKQoJfSkKCU1hcmtEZWxpdmVyZWQoY3Jvc3MoY3VyKSwgb2lkLCBzdHJpbmdzLlJlcGVhdCgidSIsIE1heFVSSUxlbikpCglpZiBsZW4oT3JkZXJVUkkob2lkKSkgIT0gTWF4VVJJTGVuIHsKCQl0LkZhdGFsKCJ1cmkgbm90IHN0b3JlZCBhdCB0aGUgYm91bmRhcnkiKQoJfQoJYXBwSW52YXJpYW50KHQpCn0KCmZ1bmMgVGVzdENoZWNrZWRBZGRPdmVyZmxvdyh0ICp0ZXN0aW5nLlQpIHsKCWNvbnN0IG1heEludDY0IGludDY0ID0gMTw8NjMgLSAxCglpZiBfLCBvayA6PSBjaGVja2VkQWRkKG1heEludDY0LCAxKTsgb2sgewoJCXQuRmF0YWwoIm92ZXJmbG93IG5vdCBkZXRlY3RlZCIpCgl9CglpZiB2LCBvayA6PSBjaGVja2VkQWRkKG1heEludDY0LTEsIDEpOyAhb2sgfHwgdiAhPSBtYXhJbnQ2NCB7CgkJdC5GYXRhbCgiYm91bmRhcnkgYWRkIHJlamVjdGVkIikKCX0KCWlmIHYsIG9rIDo9IGNoZWNrZWRBZGQoNSwgLTMpOyAhb2sgfHwgdiAhPSAyIHsKCQl0LkZhdGFsKCJuZWdhdGl2ZSBkZWx0YSBicm9rZW4iKQoJfQp9CgovLyBBIGZ1bGwgbXVsdGktcGFydHkgcnVuLCBhc3NlcnRpbmcgY29uc2VydmF0aW9uIGF0IGV2ZXJ5IGNoZWNrcG9pbnQg4oCUCi8vIHRoZSBwcm9wZXJ0eSB0aGF0IGFsbCB0aHJlZSBwcm90ZWN0aW9ucyB1bHRpbWF0ZWx5IHJlc3Qgb24uCmZ1bmMgVGVzdEZ1bGxMaWZlY3ljbGVDb25zZXJ2YXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVNldEZlZUJwcyhjcm9zcyhjdXIpLCAxMDApIC8vIDElCgoJczEgOj0gcmVnaXN0ZXJBcyhjdXIsIHByb3YxLCAiYWxwaGEiLCAiZCIsIDEwMDAwMDAsIE1pbkRlbGl2ZXJ5QmxvY2tzKQoJczIgOj0gcmVnaXN0ZXJBcyhjdXIsIHByb3YyLCAiYmV0YSIsICJkIiwgMjAwMDAwMCwgTWF4RGVsaXZlcnlCbG9ja3MpCgliLmNvbnNlcnZlZCh0LCAwKQoKCS8vIEFjY2VwdGVkLgoJbzEgOj0gcHVyY2hhc2VBcyhjdXIsIGN1c3QxLCBzMSwgMTAwMDAwMCkKCWIuY29uc2VydmVkKHQsIDApCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCU1hcmtEZWxpdmVyZWQoY3Jvc3MoY3VyKSwgbzEsICJhIikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3VzdDEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3VzdDEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQWNjZXB0RGVsaXZlcnkoY3Jvc3MoY3VyKSwgbzEpCgliLmNvbnNlcnZlZCh0LCAwKQoKCS8vIERlY2xpbmVkLgoJbzIgOj0gcHVyY2hhc2VBcyhjdXIsIGN1c3QyLCBzMiwgMjAwMDAwMCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJRGVjbGluZU9yZGVyKGNyb3NzKGN1ciksIG8yKQoJYi5jb25zZXJ2ZWQodCwgMCkKCgkvLyBFeHBpcmVkIHRvIGEgcmVmdW5kLgoJbzMgOj0gcHVyY2hhc2VBcyhjdXIsIGN1c3QxLCBzMSwgMTAwMDAwMCkKCXRlc3RpbmcuU2tpcEhlaWdodHMoTWluRGVsaXZlcnlCbG9ja3MpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglDbGFpbVJlZnVuZChjcm9zcyhjdXIpLCBvMykKCWIuY29uc2VydmVkKHQsIDApCgoJLy8gVGltZWQgb3V0IHRvIGEgcmVsZWFzZS4KCW80IDo9IHB1cmNoYXNlQXMoY3VyLCBjdXN0MiwgczIsIDIwMDAwMDApCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YyKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCU1hcmtEZWxpdmVyZWQoY3Jvc3MoY3VyKSwgbzQsICJiIikKCXRlc3RpbmcuU2tpcEhlaWdodHMoQWNjZXB0YW5jZUJsb2NrcykKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVJlbGVhc2VUaW1lb3V0KGNyb3NzKGN1ciksIG80KQoJYi5jb25zZXJ2ZWQodCwgMCkKCglpZiBFc2Nyb3dUb3RhbCgpICE9IGIuZXNjcm93IHsKCQl0LkZhdGFsZigiZXNjcm93IG5vdCBkcmFpbmVkOiAlZCAtPiAlZCIsIGIuZXNjcm93LCBFc2Nyb3dUb3RhbCgpKQoJfQoKCS8vIEV2ZXJ5b25lIHdpdGhkcmF3czsgdGhlIHJlYWxtIGVuZHMgaG9sZGluZyBvbmx5IHdoYXQgaXQgc3RhcnRlZAoJLy8gd2l0aCBwbHVzIHRoZSBmZWUgcG90IGl0IHN0aWxsIG93ZXMuCglmb3IgXywgd2hvIDo9IHJhbmdlIFtdYWRkcmVzc3twcm92MSwgcHJvdjIsIGN1c3QxLCBjdXN0MiwgdGVzdEFkbWluLCBtYWxsb3J5fSB7CgkJaWYgQmFsYW5jZU9mKHdobykgPT0gMCB7CgkJCWNvbnRpbnVlCgkJfQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0od2hvKSkKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih3aG8pCgkJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCQlDbGFpbUFsbChjcm9zcyhjdXIpKQoJfQoJLy8gRXZlcnkgY291bnRlcnBhcnR5IHRoaXMgc3VpdGUgaGFzIGV2ZXIgdXNlZCBpcyBpbiB0aGF0IGxpc3QsIHNvCgkvLyBkcmFpbmluZyB0aGVtIG11c3QgdGFrZSBVIHRvIGV4YWN0bHkgemVybyDigJQgbm90IGJhY2sgdG8gdGhlCgkvLyBiYXNlbGluZSwgd2hpY2ggc3RpbGwgY2FycmllZCBlYXJsaWVyIHRlc3RzJyB1bmNsYWltZWQgY3JlZGl0cy4KCWlmIFVzZXJzVG90YWwoKSAhPSAwIHsKCQl0LkZhdGFsZigiY2xhaW1hYmxlIHJlc2lkdWU6ICVkIiwgVXNlcnNUb3RhbCgpKQoJfQoJYXBwSW52YXJpYW50KHQpCgliLmNvbnNlcnZlZCh0LCAwKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMCkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEyMDAwMDAwdWdub3QSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQIWh26RGz8iCK336BKQR1rW/ZCKj29gulCC1dzjcaca3aRuHNJP+TVPaF6x+737wVtHcWLQnnuA6dCfbXlKgN2IaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data