Transaction executed successfully

Transaction Details

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

Transaction hash
695EF724877452A8A8D5F5ADDD42FC51D1530EB5EF0C638DFD62AC78DEF663C8

Transaction overview

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

Execution summary

TX INDEX
1
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
56,194,465
Gas consumed
FEE
250000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3915000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CvPKAgoML3ZtLm1fYWRkcGtnEuHKAgooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORKkygIKCHBlcm1ib29rEjxnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvcGVybWJvb2saYwoLZ25vbW9kLnRvbWwSVG1vZHVsZSA9ICJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvcGVybWJvb2siCmdubyA9ICIwLjkiChqyjgEKDHBlcm1ib29rLmdubxKgjgEvLyBQYWNrYWdlIHBlcm1ib29rIGlzIGEgYm91bmRlZCwgYXV0aG9yaXphdGlvbi1jYXJyeWluZyBmYWNhZGUgb3ZlcgovLyBnbm8ubGFuZC9wL250L2dyb3Vwcy92MC4gSXQgbGV0cyBhIHJlYWxtIGRlZmluZSBuYW1lZCBwZXJtaXNzaW9ucywgZ3JhbnQKLy8gdGhlbSB0byBhZGRyZXNzZXMsIHJldm9rZSB0aGVtLCBhbmQgYXNrICJkb2VzIHRoaXMgYWRkcmVzcyBjdXJyZW50bHkgaG9sZAovLyB0aGlzIHBlcm1pc3Npb24iIHdpdGhvdXQgaXRlcmF0aW5nIGFueXRoaW5nLgovLwovLyBJdCBob2xkcyBubyBjb2lucywgaW1wb3J0cyBubyBiYW5rZXIsIHN0b3JlcyBubyBjYWxsYmFja3MsIGFuZCBvd25zIG5vCi8vIHBhY2thZ2UtbGV2ZWwgc3RhdGUuIFRoZSBpbXBvcnRpbmcgcmVhbG0gYWxsb2NhdGVzIGEgKkJvb2sgYW5kIGtlZXBzIGl0Ci8vIHByaXZhdGUuCi8vCi8vICMgV2hhdCB0aGlzIHBhY2thZ2UgYWRkcywgYW5kIHdoYXQgaXQgZG9lcyBub3QKLy8KLy8gSXQgYWRkcyBleGFjdGx5IGZvdXIgdGhpbmdzIHRvIGdyb3VwcywgYW5kIGRlbGliZXJhdGVseSBub3RoaW5nIGVsc2U6Ci8vCi8vICAxLiBhbiBBRE1JTiBib3VuZCB0byB0aGUgYm9vaywgd2l0aCBhIHR3by1zdGVwIGhhbmRvZmY7Ci8vICAyLiBCT1VORFMgb24gcGVybWlzc2lvbiBjb3VudCwgaG9sZGVycyBwZXIgcGVybWlzc2lvbiwgYW5kIG5hbWUgc2hhcGU7Ci8vICAzLiBwZXJtaXNzaW9uIHNlbWFudGljcyBpbnN0ZWFkIG9mIG1lbWJlcnNoaXAgc2VtYW50aWNzIOKAlCBubyBiYXNlIHNldCwgbm8KLy8gICAgIG1ldGFkYXRhIHNsb3QsIGFuZCBhbiBlbXB0eSBwZXJtaXNzaW9uIGlzIHBydW5lZCByYXRoZXIgdGhhbiBrZXB0OwovLyAgNC4gYSBjcm9zcy1yZWFsbSBzdXJmYWNlIHRoYXQgaXMgc2FmZSBieSBDT05TVFJVQ1RJT04g4oCUIHRoZSAqZ3JvdXBzLkdyb3VwCi8vICAgICBpcyB1bmV4cG9ydGVkIGFuZCBubyBtZXRob2QgcmV0dXJucyBhIG11dGFibGUgaGFuZGxlIHRvIGl0LgovLwovLyBFdmVyeXRoaW5nIGVsc2Ug4oCUIHRoZSBCKy10cmVlIHJlZ2lzdHJ5LCB0aGUgbWVtYmVyIHNldHMsIG9yZGVyZWQKLy8gaXRlcmF0aW9uLCB0aGUgcmVhZG9ubHkgdmlld3Mg4oCUIGNvbWVzIGZyb20gZ3JvdXBzLiBUaGlzIHBhY2thZ2Ugd3JpdGVzIG5vCi8vIGRhdGEtc3RydWN0dXJlIGNvZGUuCi8vCi8vICMgVGhlIHF1ZXJ5Ci8vCi8vCWlmICFib29rLkhhcygid2l0aGRyYXciLCB3aG8pIHsKLy8JCXBhbmljKCJub3QgYXV0aG9yaXplZCIpCi8vCX0KLy8KLy8gSGFzIGNvc3RzIHR3byBpbmRlcGVuZGVudCBCKy10cmVlIGRlc2NlbnRzOiBPKGxvZyBQKSB0byBmaW5kIHRoZQovLyBwZXJtaXNzaW9uLCBPKGxvZyBIKSB0byBmaW5kIHRoZSBob2xkZXIuIEl0IGlzIE5PVCBhIGZ1bmN0aW9uIG9mIGhvdyBtYW55Ci8vIHBlcm1pc3Npb25zIGB3aG9gIGFscmVhZHkgaG9sZHMuIFRoYXQgbWF0dGVyczogZXZlcnkgb3RoZXIgbmFtZWQtcGVybWlzc2lvbgovLyBpbXBsZW1lbnRhdGlvbiBzdXJ2ZXllZCBhbnN3ZXJzIHRoaXMgYnkgaXRlcmF0aW5nIHRoZSBzdWJqZWN0J3MKLy8gcGVybWlzc2lvbnMsIHdoaWNoIG1ha2VzIHRoZSBtb3N0LXByaXZpbGVnZWQgYWRkcmVzcyB0aGUgbW9zdCBleHBlbnNpdmUgdG8KLy8gY2hlY2sg4oCUIHRoZSB3cm9uZyBhc3ltcHRvdGljIGZvciBhbiBhdXRob3JpemF0aW9uIGNoZWNrIG9uIGEgaG90IHBhdGguCi8vCi8vICMgQXV0aG9yaXphdGlvbgovLwovLyBNdXRhdG9ycyB0YWtlIChfIGludCwgcmxtIHJlYWxtKSBhbmQgaWRlbnRpZnkgdGhlIHByaW5jaXBhbCBhcwovLyBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCksIGFmdGVyIGFzc2VydGluZyBybG0uSXNDdXJyZW50KCkuIFRoZSBjb25zdW1pbmcKLy8gcmVhbG0gdGhyZWFkcyBpdHMgb3duIGN1cjoKLy8KLy8JZnVuYyBHcmFudChjdXIgcmVhbG0sIHBlcm0gc3RyaW5nLCBhZGRyIGFkZHJlc3MpIHsKLy8JCWlmIGVyciA6PSBib29rLkdyYW50KDAsIGN1ciwgcGVybSwgYWRkcik7IGVyciAhPSBuaWwgewovLwkJCXBhbmljKGVycikKLy8JCX0KLy8JfQovLwovLyBJc0N1cnJlbnQoKSByZWplY3RzIGEgc3RhbGUgb3Igc3Rhc2hlZCByZWFsbSB2YWx1ZSwgc28gYSBob3N0aWxlIHJlYWxtCi8vIGNhbm5vdCByZXBsYXkgYW4gb2xkIGN1ciB0byBpbXBlcnNvbmF0ZSB0aGUgYWRtaW4uIFRoaXMgaXMgdGhlIHNhbWUgc2hhcGUKLy8gYXMgcC9udC9vd25hYmxlL3YwIGFuZCBwL250L293bmFibGUvdjAvZXh0cy9hdXRob3JpemFibGUuCi8vCi8vICMgTGlmZWN5Y2xlIG9mIGEgcGVybWlzc2lvbgovLwovLyBBIHBlcm1pc3Npb24gY29tZXMgaW50byBleGlzdGVuY2Ugb24gaXRzIGZpcnN0IGdyYW50IGFuZCBjZWFzZXMgdG8gZXhpc3QKLy8gd2hlbiBpdHMgbGFzdCBob2xkZXIgaXMgcmV2b2tlZC4gVGhlcmUgaXMgbm8gY3JlYXRlIHN0ZXAgYW5kIG5vIHJlc2VydmVkCi8vIG5hbWUuIEhhcyByZXR1cm5zIGZhbHNlIGVpdGhlciB3YXksIHNvIHRoZSBkaXN0aW5jdGlvbiBpcyBpbnZpc2libGUgdG8gYQovLyBjYWxsZXIgYW5kIHRoZSBib29rIGRvZXMgbm90IGFjY3VtdWxhdGUgZW1wdHkgYnVja2V0cy4KLy8KLy8JKGFic2VudCkg4pSA4pSAR3JhbnTilIDilIA+IGhlbGQgYnkgMS4uTWF4SG9sZGVyc1BlclBlcm1pc3Npb24g4pSA4pSAUmV2b2tlIGxhc3TilIDilIA+IChhYnNlbnQpCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUggovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilJTilIDilIAgRHJvcFBlcm1pc3Npb24g4pSA4pSAPiAoYWJzZW50KQovLwovLyAjIEFkbWluIGhhbmRvZmYgaXMgdHdvLXN0ZXAKLy8KLy8gTm9taW5hdGVBZG1pbiByZWNvcmRzIGEgbm9taW5lZTsgb25seSBBY2NlcHRBZG1pbiwgY2FsbGVkIGJ5IHRoYXQgbm9taW5lZSwKLy8gbW92ZXMgdGhlIGFkbWluLiBBIG9uZS1zdGVwIHRyYW5zZmVyIHRvIGEgd2VsbC1mb3JtZWQtYnV0LXVub3duZWQgYWRkcmVzcwovLyBpcyBwZXJtYW5lbnRseSBmYXRhbCDigJQgYWRkcmVzcy5Jc1ZhbGlkIG9ubHkgY2hlY2tzIGJlY2gzMiBmb3JtLCBzbyBhCi8vIG1pc3R5cGVkIGFkZHJlc3MgcGFzc2VzIHZhbGlkYXRpb24gYW5kIGxlYXZlcyBhIGJvb2sgbm9ib2R5IGNhbiBldmVyIGdyYW50Ci8vIG9yIHJldm9rZSBvbiBhZ2Fpbi4gVGhpcyBpcyB0aGUgWTQgZmluZGluZyBmcm9tIHRoZSBhdWRpdCBvZiBDb3NtaWMgQnVsbCdzCi8vIG93biByL3Blcm1pc3Npb25fcmVnaXN0cnksIGNhcnJpZWQgZm9yd2FyZC4KLy8KLy8gIyBDb25zdW1lciBjb250cmFjdCDigJQgdGhlIHBhcnRzIHRoaXMgcGFja2FnZSBDQU5OT1QgZW5mb3JjZQovLwovLyAgMS4gVEhSRUFEIEEgTElWRSBjdXIuIHJsbS5Jc0N1cnJlbnQoKSBwcm92ZXMgdGhlIHJlYWxtIHZhbHVlIGNhbWUgZnJvbSBhCi8vICAgICBsaXZlIGNyb3NzaW5nIGZyYW1lLCBhbmQgcmxtLlByZXZpb3VzKCkuQWRkcmVzcygpIGlzIHRoZW4gdGhlIHByaW5jaXBhbAovLyAgICAgdGhhdCBjcm9zc2VkIGludG8geW91ciByZWFsbS4gQSBjb25zdW1lciB0aGF0IHdyYXBzIGEgcGVybWJvb2sgbXV0YXRvcgovLyAgICAgaW4gYSBOT04tY3Jvc3NpbmcgZXhwb3J0ZWQgaGVscGVyIHJlc29sdmVzIGl0cyBpbXBvcnRlcidzIGNhbGxlcgovLyAgICAgaW5zdGVhZCBvZiBpdHMgaW1wb3J0ZXIg4oCUIENsYXNzLTIgZGVzaWduYXRpb24gZm9yZ2VyeSwgaW4gdGhlIGNvbnN1bWVyLgovLyAgICAgQ2FsbCBwZXJtYm9vayBtdXRhdG9ycyBmcm9tIHlvdXIgb3duIGNyb3NzaW5nIGVudHJ5cG9pbnRzLCBwYXNzaW5nIHRoYXQKLy8gICAgIGVudHJ5cG9pbnQncyBvd24gY3VyLgovLwovLyAgMi4gRE8gTk9UIExFQUsgVEhFICpCb29rLiBObyBtZXRob2QgaGVyZSByZXR1cm5zIGEgbXV0YWJsZSBoYW5kbGUsIGJ1dCBhCi8vICAgICBjb25zdW1lciB0aGF0IGV4cG9ydHMgaXRzICpCb29rIOKAlCBvciByZXR1cm5zIGl0IGZyb20gYSBmdW5jdGlvbgovLyAgICAgcmVhY2hhYmxlIGJ5IGFub3RoZXIgcmVhbG0g4oCUIGhhbmRzIG91dCBldmVyeSBtdXRhdG9yIG9uIGl0LCBhbmQKLy8gICAgIGJvcnJvdyBydWxlICMyIGNvbW1pdHMgdGhvc2Ugd3JpdGVzIHVuZGVyIFlPVVIgcmVhbG0ncyBhdXRob3JpdHkuIEtlZXAKLy8gICAgIGl0IGluIGFuIHVuZXhwb3J0ZWQgcGFja2FnZS1sZXZlbCB2YXJpYWJsZS4KLy8KLy8gIDMuIEhhcyBBTlNXRVJTIEFCT1VUIEFOIEFERFJFU1MsIE5PVCBBQk9VVCBZT1VSIENBTExFUi4gSXQgcGVyZm9ybXMgbm8KLy8gICAgIGF1dGhlbnRpY2F0aW9uLiBEZXJpdmUgdGhlIGFkZHJlc3MgZnJvbSB5b3VyIG93biBjcm9zc2luZyBlbnRyeXBvaW50J3MKLy8gICAgIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSBhbmQgcGFzcyBpdCBpbi4KLy8KLy8gIDQuIENIT09TRSBMSU1JVFMgREVMSUJFUkFURUxZLiBUaGV5IGFyZSBmaXhlZCBmb3IgdGhlIGxpZmUgb2YgYSBCb29rLiBBCi8vICAgICBjb25zdW1lciB0aGF0IG5lZWRzIGRpZmZlcmVudCBib3VuZHMgbGF0ZXIgbXVzdCBhbGxvY2F0ZSBhIHNlY29uZCBCb29rOwovLyAgICAgbm90aGluZyBoZXJlIG1pZ3JhdGVzIHN0YXRlIGJldHdlZW4gdGhlbS4KLy8KLy8gIyBOb3RlIG9uIHRoZSBncm91cHMgYmFzZSBzZXQKLy8KLy8gQSBncm91cHMuR3JvdXAgY2FycmllcyBhIGJhc2UgYWRkcmVzcyBzZXQgYWxvbmdzaWRlIGl0cyBuYW1lZCByb2xlcy4gVGhpcwovLyBwYWNrYWdlIG5ldmVyIHdyaXRlcyB0byBpdCwgc28gaXQgaXMgcHJvdmFibHkgZW1wdHkgZm9yIGFueSBCb29rLCBhbmQKLy8gImluIHRoZSBiYXNlIHNldCIgY2FuIG5ldmVyIG1lYW4gImhvbGRzIGEgcGVybWlzc2lvbiIuCnBhY2thZ2UgcGVybWJvb2sKCmltcG9ydCAoCgkiZXJyb3JzIgoKCSJnbm8ubGFuZC9wL250L2dyb3Vwcy92MCIKKQoKLy8gQ2VpbGluZ3Mgb24gd2hhdCBMaW1pdHMgbWF5IGJlIGNvbmZpZ3VyZWQgdG8uIFRoZXkgYm91bmQgd29yc3QtY2FzZSBnYXMKLy8gYW5kIHN0b3JhZ2UgZm9yIGFueSBCb29rLCBob3dldmVyIHRoZSBjb25zdW1lciBjb25maWd1cmVzIGl0LgovLwovLyBNYXhQZXJtaXNzaW9uc0NlaWxpbmcgaXMgdGhlIG9uZSB0aGF0IGJvdW5kcyBHQVMgcmF0aGVyIHRoYW4gbWVyZWx5Ci8vIHN0b3JhZ2UuIFRocmVlIG9wZXJhdGlvbnMgd2FsayBldmVyeSBwZXJtaXNzaW9uIGluIHRoZSBib29rIGF0IE8oUCBsb2cgSCkKLy8g4oCUIFBlcm1pc3Npb25zLCBIYXNBbnksIGFuZCBSZXZva2VBbGwg4oCUIGFuZCB0aGlzIGNlaWxpbmcgaXMgd2hhdCBib3VuZHMKLy8gdGhlbS4gRXZlcnl0aGluZyBlbHNlIGlzIGxvZ2FyaXRobWljIG9yIHBhZ2luYXRlZDsgc2VlIGVhY2ggbWV0aG9kJ3Mgb3duCi8vIGRvYyBmb3IgaXRzIGNvc3QsIHdoaWNoIGlzIGF1dGhvcml0YXRpdmUuCi8vCi8vIEluIHBhcnRpY3VsYXIgSGFzQW55IGlzIE5PVCBhIGNoZWFwIHZhcmlhbnQgb2YgSGFzLiBIYXMgaXMgdHdvIHRyZWUKLy8gZGVzY2VudHM7IEhhc0FueSBpcyBhIGZ1bGwgd2FsayBvZiB0aGUgcmVnaXN0cnkuIERvIG5vdCBwdXQgSGFzQW55IG9uIGEKLy8gaG90IGF1dGhvcml6YXRpb24gcGF0aCBvciBpbnNpZGUgYSBwZXItaXRlbSByZW5kZXIgbG9vcC4KLy8KLy8gVGhlc2UgY2VpbGluZ3MgYXJlIG5vdCB0aGUgb2JqZWN0aW9uIHRoaXMgcGFja2FnZSByYWlzZXMgYWdhaW5zdCBhIHNoYXJlZAovLyByZWdpc3RyeS4gQSBzaGFyZWQgcmVnaXN0cnkncyBjYXBzIGFyZSByaXZhbHJvdXMgYW5kIHVucmFpc2FibGUgYmVjYXVzZQovLyBvbmUgaW1tdXRhYmxlIHJlYWxtIGhvbGRzIGV2ZXJ5IHRlbmFudCdzIHN0YXRlOyBoZXJlIGEgY29uc3VtZXIgdGhhdCBuZWVkcwovLyBtb3JlIHNpbXBseSBhbGxvY2F0ZXMgYW5vdGhlciBCb29rIGluIGl0cyBvd24gcmVhbG0sIGF0IG5vIGNvc3QgdG8gYW55b25lCi8vIGVsc2UuCmNvbnN0ICgKCU1heFBlcm1pc3Npb25zQ2VpbGluZyA9IDI1NgoJTWF4SG9sZGVyc0NlaWxpbmcgICAgID0gMTAwMDAKCU1heE5hbWVMZW5DZWlsaW5nICAgICA9IDY0CikKCi8vIERlZmF1bHQgbGltaXRzLCB1c2VkIGJ5IE5ld0RlZmF1bHQuCmNvbnN0ICgKCURlZmF1bHRNYXhQZXJtaXNzaW9ucyAgICAgICAgICA9IDY0CglEZWZhdWx0TWF4SG9sZGVyc1BlclBlcm1pc3Npb24gPSAxMDI0CglEZWZhdWx0TWF4TmFtZUxlbiAgICAgICAgICAgICAgPSAzMgopCgp2YXIgKAoJRXJyVW5hdXRob3JpemVkICAgICAgPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogY2FsbGVyIGlzIG5vdCB0aGUgYWRtaW4iKQoJRXJyTm90TGl2ZVJlYWxtICAgICAgPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogcmxtIGlzIG5vdCB0aGUgY2FsbGVyJ3MgbGl2ZSBjdXIiKQoJRXJySW52YWxpZEFkZHJlc3MgICAgPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogaW52YWxpZCBhZGRyZXNzIikKCUVyckludmFsaWROYW1lICAgICAgID0gZXJyb3JzLk5ldygicGVybWJvb2s6IHBlcm1pc3Npb24gbmFtZSBtdXN0IGJlIDEuLk1heE5hbWVMZW4gY2hhcnMsIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgYW5kIHVuZGVyc2NvcmUgb25seSIpCglFcnJJbnZhbGlkTGltaXRzICAgICA9IGVycm9ycy5OZXcoInBlcm1ib29rOiBsaW1pdHMgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgd2l0aGluIHRoZSBwYWNrYWdlIGNlaWxpbmdzIikKCUVyckFscmVhZHlHcmFudGVkICAgID0gZXJyb3JzLk5ldygicGVybWJvb2s6IGFkZHJlc3MgYWxyZWFkeSBob2xkcyB0aGlzIHBlcm1pc3Npb24iKQoJRXJyTm90R3JhbnRlZCAgICAgICAgPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogYWRkcmVzcyBkb2VzIG5vdCBob2xkIHRoaXMgcGVybWlzc2lvbiIpCglFcnJQZXJtaXNzaW9uTGltaXQgICA9IGVycm9ycy5OZXcoInBlcm1ib29rOiBwZXJtaXNzaW9uIGxpbWl0IHJlYWNoZWQgZm9yIHRoaXMgYm9vayIpCglFcnJIb2xkZXJMaW1pdCAgICAgICA9IGVycm9ycy5OZXcoInBlcm1ib29rOiBob2xkZXIgbGltaXQgcmVhY2hlZCBmb3IgdGhpcyBwZXJtaXNzaW9uIikKCUVyck5vUGVuZGluZ0FkbWluICAgID0gZXJyb3JzLk5ldygicGVybWJvb2s6IG5vIHBlbmRpbmcgYWRtaW4gbm9taW5hdGlvbiIpCglFcnJOb3RQZW5kaW5nQWRtaW4gICA9IGVycm9ycy5OZXcoInBlcm1ib29rOiBjYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIGFkbWluIikKCUVyclNhbWVBZG1pbiAgICAgICAgID0gZXJyb3JzLk5ldygicGVybWJvb2s6IG5vbWluZWUgaXMgYWxyZWFkeSB0aGUgYWRtaW4iKQoJRXJyVW5rbm93blBlcm1pc3Npb24gPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogbm8gc3VjaCBwZXJtaXNzaW9uIikKKQoKLy8gTGltaXRzIGFyZSBmaXhlZCBhdCBjb25zdHJ1Y3Rpb24gYW5kIG5ldmVyIGNoYW5nZSBmb3IgdGhlIGxpZmUgb2YgYSBCb29rLgp0eXBlIExpbWl0cyBzdHJ1Y3QgewoJLy8gTWF4UGVybWlzc2lvbnMgYm91bmRzIGhvdyBtYW55IGRpc3RpbmN0IHBlcm1pc3Npb24gbmFtZXMgbWF5IGV4aXN0IGF0CgkvLyBvbmNlLiBCZWNhdXNlIFBlcm1pc3Npb25zIGFuZCBSZXZva2VBbGwgd2FsayBhbGwgb2YgdGhlbSwgdGhpcyBib3VuZHMKCS8vIGdhcywgbm90IGp1c3Qgc3RvcmFnZS4KCU1heFBlcm1pc3Npb25zIGludAoKCS8vIE1heEhvbGRlcnNQZXJQZXJtaXNzaW9uIGJvdW5kcyBob3cgbWFueSBhZGRyZXNzZXMgbWF5IGhvbGQgYW55IG9uZQoJLy8gcGVybWlzc2lvbi4gTm8gb3BlcmF0aW9uIGl0ZXJhdGVzIGhvbGRlcnMgdW5wYWdpbmF0ZWQsIHNvIHRoaXMgYm91bmRzCgkvLyBzdG9yYWdlIHJhdGhlciB0aGFuIGdhcy4KCU1heEhvbGRlcnNQZXJQZXJtaXNzaW9uIGludAoKCS8vIE1heE5hbWVMZW4gYm91bmRzIHBlcm1pc3Npb24tbmFtZSBsZW5ndGguCglNYXhOYW1lTGVuIGludAp9CgovLyBEZWZhdWx0TGltaXRzIHJldHVybnMgdGhlIGxpbWl0cyB1c2VkIGJ5IE5ld0RlZmF1bHQuCmZ1bmMgRGVmYXVsdExpbWl0cygpIExpbWl0cyB7CglyZXR1cm4gTGltaXRzewoJCU1heFBlcm1pc3Npb25zOiAgICAgICAgICBEZWZhdWx0TWF4UGVybWlzc2lvbnMsCgkJTWF4SG9sZGVyc1BlclBlcm1pc3Npb246IERlZmF1bHRNYXhIb2xkZXJzUGVyUGVybWlzc2lvbiwKCQlNYXhOYW1lTGVuOiAgICAgICAgICAgICAgRGVmYXVsdE1heE5hbWVMZW4sCgl9Cn0KCmZ1bmMgKGwgTGltaXRzKSB2YWxpZCgpIGJvb2wgewoJcmV0dXJuIGwuTWF4UGVybWlzc2lvbnMgPiAwICYmIGwuTWF4UGVybWlzc2lvbnMgPD0gTWF4UGVybWlzc2lvbnNDZWlsaW5nICYmCgkJbC5NYXhIb2xkZXJzUGVyUGVybWlzc2lvbiA+IDAgJiYgbC5NYXhIb2xkZXJzUGVyUGVybWlzc2lvbiA8PSBNYXhIb2xkZXJzQ2VpbGluZyAmJgoJCWwuTWF4TmFtZUxlbiA+IDAgJiYgbC5NYXhOYW1lTGVuIDw9IE1heE5hbWVMZW5DZWlsaW5nCn0KCi8vIEJvb2sgaXMgYSBib3VuZGVkIHNldCBvZiBuYW1lZCBwZXJtaXNzaW9ucyB3aXRoIGFuIGFkbWluLiBUaGUgemVybyB2YWx1ZQovLyBpcyBub3QgdXNhYmxlOyBjb25zdHJ1Y3Qgd2l0aCBOZXcgb3IgTmV3RGVmYXVsdC4KLy8KLy8gU0VDVVJJVFk6IGtlZXAgYSAqQm9vayBpbiBhbiB1bmV4cG9ydGVkIHZhcmlhYmxlLiBJdCBpcyB0aGUgY2FwYWJpbGl0eS4KLy8gRXZlcnkgbXV0YXRvciBvbiBpdCBpcyBnYXRlZCBvbiB0aGUgYWRtaW4sIGJ1dCBhIHJlYWxtIHRoYXQgcmVjZWl2ZXMgdGhlCi8vIHBvaW50ZXIgaXRzZWxmIGNhbiBpbnZva2UgdGhvc2UgbXV0YXRvcnMsIGFuZCBib3Jyb3cgcnVsZSAjMiBjb21taXRzIHRoZQovLyB3cml0ZXMgdW5kZXIgdGhlIEFMTE9DQVRJTkcgcmVhbG0ncyBhdXRob3JpdHkuCnR5cGUgQm9vayBzdHJ1Y3QgewoJZyAgICAgICAgICAgICpncm91cHMuR3JvdXAKCWFkbWluICAgICAgICBhZGRyZXNzCglwZW5kaW5nQWRtaW4gYWRkcmVzcwoJbGltICAgICAgICAgIExpbWl0cwp9CgovLyBOZXcgY29uc3RydWN0cyBhbiBlbXB0eSBCb29rIG93bmVkIGJ5IGFkbWluLCB3aXRoIGV4cGxpY2l0IGxpbWl0cy4KZnVuYyBOZXcoYWRtaW4gYWRkcmVzcywgbGltIExpbWl0cykgKCpCb29rLCBlcnJvcikgewoJaWYgIWFkbWluLklzVmFsaWQoKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZEFkZHJlc3MKCX0KCWlmICFsaW0udmFsaWQoKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZExpbWl0cwoJfQoJcmV0dXJuICZCb29rewoJCWc6ICAgICBncm91cHMuTmV3R3JvdXAoKSwKCQlhZG1pbjogYWRtaW4sCgkJbGltOiAgIGxpbSwKCX0sIG5pbAp9CgovLyBOZXdEZWZhdWx0IGNvbnN0cnVjdHMgYW4gZW1wdHkgQm9vayBvd25lZCBieSBhZG1pbiwgd2l0aCBEZWZhdWx0TGltaXRzLgpmdW5jIE5ld0RlZmF1bHQoYWRtaW4gYWRkcmVzcykgKCpCb29rLCBlcnJvcikgewoJcmV0dXJuIE5ldyhhZG1pbiwgRGVmYXVsdExpbWl0cygpKQp9CgovLyAtLS0gYXV0aG9yaXphdGlvbiAtLS0KCi8vIHByaW5jaXBhbCByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgY3Jvc3NlZCBpbnRvIHRoZSBjYWxsZXIncyByZWFsbSwgYWZ0ZXIKLy8gcHJvdmluZyBybG0gaXMgYSBsaXZlIGNyb3NzaW5nIGZyYW1lIHJhdGhlciB0aGFuIGEgc3Rhc2hlZCB2YWx1ZS4KZnVuYyBwcmluY2lwYWwoXyBpbnQsIHJsbSByZWFsbSkgKGFkZHJlc3MsIGVycm9yKSB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gYWRkcmVzcygiIiksIEVyck5vdExpdmVSZWFsbQoJfQoJcmV0dXJuIHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKSwgbmlsCn0KCi8vIGFzc2VydEFkbWluIHJlc29sdmVzIHRoZSBwcmluY2lwYWwgZnJvbSBybG0gYW5kIHJlcXVpcmVzIGl0IHRvIGJlIHRoZQovLyBib29rJ3MgYWRtaW4uCmZ1bmMgKGIgKkJvb2spIGFzc2VydEFkbWluKF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCXdobywgZXJyIDo9IHByaW5jaXBhbCgwLCBybG0pCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiB3aG8gIT0gYi5hZG1pbiB7CgkJcmV0dXJuIEVyclVuYXV0aG9yaXplZAoJfQoJcmV0dXJuIG5pbAp9CgovLyAtLS0gZ3JhbnQgYW5kIHJldm9rZSAtLS0KCi8vIEdyYW50IGdpdmVzIGFkZHIgdGhlIG5hbWVkIHBlcm1pc3Npb24uIEFkbWluIG9ubHkuCi8vCi8vIFRoZSBwZXJtaXNzaW9uIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuIEdyYW50aW5nIGEgcGVybWlzc2lvbiB0aGUKLy8gYWRkcmVzcyBhbHJlYWR5IGhvbGRzIHJldHVybnMgRXJyQWxyZWFkeUdyYW50ZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkKLy8gc3VjY2VlZGluZywgc28gYSBjb25zdW1lciBjYW5ub3QgbWlzdGFrZSBhIG5vLW9wIGZvciBhIHN0YXRlIGNoYW5nZS4KZnVuYyAoYiAqQm9vaykgR3JhbnQoXyBpbnQsIHJsbSByZWFsbSwgcGVybSBzdHJpbmcsIGFkZHIgYWRkcmVzcykgZXJyb3IgewoJaWYgZXJyIDo9IGIuYXNzZXJ0QWRtaW4oMCwgcmxtKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJaWYgIWIudmFsaWROYW1lKHBlcm0pIHsKCQlyZXR1cm4gRXJySW52YWxpZE5hbWUKCX0KCWlmICFhZGRyLklzVmFsaWQoKSB7CgkJcmV0dXJuIEVyckludmFsaWRBZGRyZXNzCgl9CgoJciwgZm91bmQgOj0gYi5nLkdldFJvbGUocGVybSkKCWlmICFmb3VuZCB7CgkJaWYgYi5nLlJvbGVDb3VudCgpID49IGIubGltLk1heFBlcm1pc3Npb25zIHsKCQkJcmV0dXJuIEVyclBlcm1pc3Npb25MaW1pdAoJCX0KCQl2YXIgZXJyIGVycm9yCgkJciwgZXJyID0gYi5nLkFkZFJvbGUocGVybSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCgltZW1iZXJzIDo9IHIuTWVtYmVycygpCglpZiBtZW1iZXJzLkhhcyhhZGRyKSB7CgkJcmV0dXJuIEVyckFscmVhZHlHcmFudGVkCgl9CglpZiBtZW1iZXJzLlNpemUoKSA+PSBiLmxpbS5NYXhIb2xkZXJzUGVyUGVybWlzc2lvbiB7CgkJLy8gTm8gcm9sbGJhY2sgaXMgbmVlZGVkIGhlcmUsIGFuZCBhZGRpbmcgb25lIHdvdWxkIGJlIGRlYWQgY29kZS4KCQkvLwoJCS8vIFJlYWNoaW5nIHRoaXMgYnJhbmNoIHJlcXVpcmVzIFNpemUoKSA+PSBNYXhIb2xkZXJzUGVyUGVybWlzc2lvbiwKCQkvLyBhbmQgTGltaXRzLnZhbGlkIGd1YXJhbnRlZXMgTWF4SG9sZGVyc1BlclBlcm1pc3Npb24gPj0gMSwgc28KCQkvLyBTaXplKCkgPj0gMS4gQSBwZXJtaXNzaW9uIGNyZWF0ZWQgbW9tZW50cyBhZ28gYWJvdmUgaGFzIFNpemUoKSAwCgkJLy8gYW5kIHRoZXJlZm9yZSBjYW5ub3QgcmVhY2ggdGhpcyBicmFuY2ggYXQgYWxsLiBTbyB0aGUgcGVybWlzc2lvbgoJCS8vIHRoaXMgcmVqZWN0cyBhbHdheXMgcHJlLWV4aXN0ZWQgd2l0aCBob2xkZXJzLCBhbmQgcmV0dXJuaW5nIGxlYXZlcwoJCS8vIG5vIG9ycGhhbiBlbXB0eSBidWNrZXQgb2NjdXB5aW5nIGEgTWF4UGVybWlzc2lvbnMgc2xvdC4KCQkvLwoJCS8vIFRoYXQgYXJndW1lbnQgZGVwZW5kcyBvbiBMaW1pdHMudmFsaWQgcmVqZWN0aW5nIGEgemVybyBob2xkZXIKCQkvLyBsaW1pdC4gSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgYnJhbmNoIG5lZWRzIGFuIHVuZG8uCgkJcmV0dXJuIEVyckhvbGRlckxpbWl0Cgl9CgoJbWVtYmVycy5BZGQoYWRkcikKCXJldHVybiBuaWwKfQoKLy8gUmV2b2tlIHJlbW92ZXMgdGhlIG5hbWVkIHBlcm1pc3Npb24gZnJvbSBhZGRyLiBBZG1pbiBvbmx5LgovLwovLyBSZXZva2luZyB0aGUgbGFzdCBob2xkZXIgcmVtb3ZlcyB0aGUgcGVybWlzc2lvbiBpdHNlbGYsIGZyZWVpbmcgaXRzIHNsb3QKLy8gYWdhaW5zdCBNYXhQZXJtaXNzaW9ucy4gSGFzIHJlcG9ydHMgZmFsc2UgZWl0aGVyIHdheSwgc28gdGhpcyBpcyBpbnZpc2libGUKLy8gdG8gYSBjYWxsZXIgYW5kIGtlZXBzIHRoZSBib29rIGZyb20gYWNjdW11bGF0aW5nIGVtcHR5IGJ1Y2tldHMuCmZ1bmMgKGIgKkJvb2spIFJldm9rZShfIGludCwgcmxtIHJlYWxtLCBwZXJtIHN0cmluZywgYWRkciBhZGRyZXNzKSBlcnJvciB7CglpZiBlcnIgOj0gYi5hc3NlcnRBZG1pbigwLCBybG0pOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiAhYi5yZXZva2VPbmUocGVybSwgYWRkcikgewoJCXJldHVybiBFcnJOb3RHcmFudGVkCgl9CglyZXR1cm4gbmlsCn0KCi8vIHJldm9rZU9uZSByZW1vdmVzIGFkZHIgZnJvbSBwZXJtIGFuZCBwcnVuZXMgdGhlIHBlcm1pc3Npb24gaWYgaXQgaXMgbGVmdAovLyBlbXB0eS4gUmVwb3J0cyB3aGV0aGVyIGFkZHIgYWN0dWFsbHkgaGVsZCBpdC4gTm8gYXV0aG9yaXphdGlvbjogZXZlcnkKLy8gY2FsbGVyIGlzIGluc2lkZSB0aGlzIHBhY2thZ2UgYW5kIGhhcyBhbHJlYWR5IGdhdGVkIG9uIHRoZSBhZG1pbi4KZnVuYyAoYiAqQm9vaykgcmV2b2tlT25lKHBlcm0gc3RyaW5nLCBhZGRyIGFkZHJlc3MpIGJvb2wgewoJciwgZm91bmQgOj0gYi5nLkdldFJvbGUocGVybSkKCWlmICFmb3VuZCB7CgkJcmV0dXJuIGZhbHNlCgl9CgltZW1iZXJzIDo9IHIuTWVtYmVycygpCglpZiAhbWVtYmVycy5SZW1vdmUoYWRkcikgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgbWVtYmVycy5TaXplKCkgPT0gMCB7CgkJYi5nLlJlbW92ZVJvbGUocGVybSkKCX0KCXJldHVybiB0cnVlCn0KCi8vIFJldm9rZUFsbCByZW1vdmVzIGFkZHIgZnJvbSBldmVyeSBwZXJtaXNzaW9uIGluIHRoZSBib29rIGFuZCByZXBvcnRzIGhvdwovLyBtYW55IHdlcmUgcmVtb3ZlZC4gQWRtaW4gb25seS4KLy8KLy8gQ29zdCBpcyBPKFAgbG9nIEgpIGluIHRoZSBib29rJ3MgcGVybWlzc2lvbiBjb3VudCDigJQgYm91bmRlZCBieQovLyBNYXhQZXJtaXNzaW9ucywgd2hpY2ggaXMgd2h5IHRoYXQgbGltaXQgaGFzIGEgY2VpbGluZy4KLy8KLy8gSW1wbGVtZW50YXRpb24gbm90ZTogdGhlIHBlcm1pc3Npb24gbmFtZXMgYXJlIGNvbGxlY3RlZCBGSVJTVCwgaW50byBhCi8vIHZhbHVlIHNsaWNlLCBhbmQgdGhlIHJlZ2lzdHJ5IGlzIG11dGF0ZWQgb25seSBhZnRlciB0aGF0IHdhbGsgcmV0dXJucy4KLy8gZ3JvdXBzIGRvY3VtZW50cyB0aGF0IG11dGF0aW5nIHRoZSByb2xlIHJlZ2lzdHJ5IG1pZC1pdGVyYXRpb24gY2FuIHBhbmljCi8vIGFuZCBhYm9ydCB0aGUgdHJhbnNhY3Rpb24uCmZ1bmMgKGIgKkJvb2spIFJldm9rZUFsbChfIGludCwgcmxtIHJlYWxtLCBhZGRyIGFkZHJlc3MpIChpbnQsIGVycm9yKSB7CglpZiBlcnIgOj0gYi5hc3NlcnRBZG1pbigwLCBybG0pOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgluYW1lcyA6PSBiLmcuUm9sZXNDb250YWluaW5nKGFkZHIpCgluIDo9IDAKCWZvciBfLCBwZXJtIDo9IHJhbmdlIG5hbWVzIHsKCQlpZiBiLnJldm9rZU9uZShwZXJtLCBhZGRyKSB7CgkJCW4rKwoJCX0KCX0KCXJldHVybiBuLCBuaWwKfQoKLy8gRHJvcFBlcm1pc3Npb24gcmVtb3ZlcyBhIHBlcm1pc3Npb24gYW5kIGV2ZXJ5IGdyYW50IG9mIGl0LiBBZG1pbiBvbmx5LgovLwovLyBDb3N0IGlzIE8obG9nIFApOiBncm91cHMgZGlzY2FyZHMgdGhlIHdob2xlIG1lbWJlciBzZXQgd2l0aCB0aGUgcm9sZSBhbmQKLy8gZG9lcyBub3Qgd2FsayBpdCwgc28gdGhpcyBpcyBzYWZlIGZvciBhIHBlcm1pc3Npb24gd2l0aCBtYW55IGhvbGRlcnMuCmZ1bmMgKGIgKkJvb2spIERyb3BQZXJtaXNzaW9uKF8gaW50LCBybG0gcmVhbG0sIHBlcm0gc3RyaW5nKSBlcnJvciB7CglpZiBlcnIgOj0gYi5hc3NlcnRBZG1pbigwLCBybG0pOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiAhYi5nLlJlbW92ZVJvbGUocGVybSkgewoJCXJldHVybiBFcnJVbmtub3duUGVybWlzc2lvbgoJfQoJcmV0dXJuIG5pbAp9CgovLyAtLS0gYWRtaW4gaGFuZG9mZiAtLS0KCi8vIE5vbWluYXRlQWRtaW4gcmVjb3JkcyBhIG5vbWluZWUgZm9yIHRoZSBhZG1pbiByb2xlLiBBZG1pbiBvbmx5LiBUaGUKLy8gaGFuZG9mZiBkb2VzIE5PVCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbm9taW5lZSBjYWxscyBBY2NlcHRBZG1pbiwgYW5kIGEKLy8gbm9taW5hdGlvbiBtYXkgYmUgd2l0aGRyYXduIHdpdGggQ2FuY2VsTm9taW5hdGlvbiB1bnRpbCB0aGVuLgpmdW5jIChiICpCb29rKSBOb21pbmF0ZUFkbWluKF8gaW50LCBybG0gcmVhbG0sIG5vbWluZWUgYWRkcmVzcykgZXJyb3IgewoJaWYgZXJyIDo9IGIuYXNzZXJ0QWRtaW4oMCwgcmxtKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJaWYgIW5vbWluZWUuSXNWYWxpZCgpIHsKCQlyZXR1cm4gRXJySW52YWxpZEFkZHJlc3MKCX0KCWlmIG5vbWluZWUgPT0gYi5hZG1pbiB7CgkJcmV0dXJuIEVyclNhbWVBZG1pbgoJfQoJYi5wZW5kaW5nQWRtaW4gPSBub21pbmVlCglyZXR1cm4gbmlsCn0KCi8vIENhbmNlbE5vbWluYXRpb24gd2l0aGRyYXdzIGEgcGVuZGluZyBub21pbmF0aW9uLiBBZG1pbiBvbmx5LgpmdW5jIChiICpCb29rKSBDYW5jZWxOb21pbmF0aW9uKF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCWlmIGVyciA6PSBiLmFzc2VydEFkbWluKDAsIHJsbSk7IGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCWlmIGIucGVuZGluZ0FkbWluID09IGFkZHJlc3MoIiIpIHsKCQlyZXR1cm4gRXJyTm9QZW5kaW5nQWRtaW4KCX0KCWIucGVuZGluZ0FkbWluID0gYWRkcmVzcygiIikKCXJldHVybiBuaWwKfQoKLy8gQWNjZXB0QWRtaW4gY29tcGxldGVzIGEgcGVuZGluZyBoYW5kb2ZmLiBPbmx5IHRoZSBub21pbmVlIG1heSBjYWxsIGl0LgpmdW5jIChiICpCb29rKSBBY2NlcHRBZG1pbihfIGludCwgcmxtIHJlYWxtKSBlcnJvciB7Cgl3aG8sIGVyciA6PSBwcmluY2lwYWwoMCwgcmxtKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJaWYgYi5wZW5kaW5nQWRtaW4gPT0gYWRkcmVzcygiIikgewoJCXJldHVybiBFcnJOb1BlbmRpbmdBZG1pbgoJfQoJaWYgd2hvICE9IGIucGVuZGluZ0FkbWluIHsKCQlyZXR1cm4gRXJyTm90UGVuZGluZ0FkbWluCgl9CgliLmFkbWluID0gd2hvCgliLnBlbmRpbmdBZG1pbiA9IGFkZHJlc3MoIiIpCglyZXR1cm4gbmlsCn0KCi8vIC0tLSBxdWVyaWVzIC0tLQovLwovLyBRdWVyaWVzIHBlcmZvcm0gTk8gY2FsbGVyIGF1dGhlbnRpY2F0aW9uLiBUaGV5IGFuc3dlciBxdWVzdGlvbnMgYWJvdXQgYW4KLy8gYWRkcmVzcywgbm90IGFib3V0IHlvdXIgY2FsbGVyLiBTZWUgY29uc3VtZXItY29udHJhY3QgY2xhdXNlIDMuCgovLyBIYXMgcmVwb3J0cyB3aGV0aGVyIGFkZHIgY3VycmVudGx5IGhvbGRzIHRoZSBuYW1lZCBwZXJtaXNzaW9uLgovLwovLyBUd28gQistdHJlZSBkZXNjZW50cywgTyhsb2cgUCArIGxvZyBIKS4gSW5kZXBlbmRlbnQgb2YgaG93IG1hbnkgb3RoZXIKLy8gcGVybWlzc2lvbnMgYWRkciBob2xkcy4gTmV2ZXIgcGFuaWNzOyB1bmtub3duIHBlcm1pc3Npb25zIHJlcG9ydCBmYWxzZS4KZnVuYyAoYiAqQm9vaykgSGFzKHBlcm0gc3RyaW5nLCBhZGRyIGFkZHJlc3MpIGJvb2wgewoJciwgZm91bmQgOj0gYi5nLkdldFJvbGUocGVybSkKCWlmICFmb3VuZCB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gci5NZW1iZXJzKCkuSGFzKGFkZHIpCn0KCi8vIEhhc0FueSByZXBvcnRzIHdoZXRoZXIgYWRkciBob2xkcyBhbnkgcGVybWlzc2lvbiBhdCBhbGwuIE8oUCBsb2cgSCkuCmZ1bmMgKGIgKkJvb2spIEhhc0FueShhZGRyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIGIuZy5IYXNBbnkoYWRkcikKfQoKLy8gUGVybWlzc2lvbnMgcmV0dXJucyB0aGUgbmFtZXMgYWRkciBob2xkcywgaW4gbGV4aWNvZ3JhcGhpYyBvcmRlciwgb3IgbmlsLgovLyBPKFAgbG9nIEgpIOKAlCBib3VuZGVkIGJ5IE1heFBlcm1pc3Npb25zLgpmdW5jIChiICpCb29rKSBQZXJtaXNzaW9ucyhhZGRyIGFkZHJlc3MpIFtdc3RyaW5nIHsKCXJldHVybiBiLmcuUm9sZXNDb250YWluaW5nKGFkZHIpCn0KCi8vIFBlcm1pc3Npb25Db3VudCByZXR1cm5zIGhvdyBtYW55IGRpc3RpbmN0IHBlcm1pc3Npb25zIGN1cnJlbnRseSBleGlzdC4KZnVuYyAoYiAqQm9vaykgUGVybWlzc2lvbkNvdW50KCkgaW50IHsKCXJldHVybiBiLmcuUm9sZUNvdW50KCkKfQoKLy8gUGVybWlzc2lvbk5hbWVzIHJldHVybnMgdXAgdG8gY291bnQgcGVybWlzc2lvbiBuYW1lcyBpbiBsZXhpY29ncmFwaGljCi8vIG9yZGVyLCBzdGFydGluZyBhdCBvZmZzZXQuIFBhZ2luYXRlZCBzbyB0aGUgY2FsbGVyLCBub3QgdGhlIGJvb2ssIGNob29zZXMKLy8gaG93IG11Y2ggd29yayBhIHNpbmdsZSBjYWxsIGRvZXMuCmZ1bmMgKGIgKkJvb2spIFBlcm1pc3Npb25OYW1lcyhvZmZzZXQsIGNvdW50IGludCkgW11zdHJpbmcgewoJaWYgY291bnQgPD0gMCB7CgkJcmV0dXJuIG5pbAoJfQoJdmFyIG91dCBbXXN0cmluZwoJYi5nLkl0ZXJhdGVSb2xlcyhvZmZzZXQsIGNvdW50LCBmdW5jKHJyICpncm91cHMuUmVhZG9ubHlSb2xlKSBib29sIHsKCQlvdXQgPSBhcHBlbmQob3V0LCByci5OYW1lKCkpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG91dAp9CgovLyBIb2xkZXJDb3VudCByZXR1cm5zIGhvdyBtYW55IGFkZHJlc3NlcyBob2xkIHRoZSBuYW1lZCBwZXJtaXNzaW9uLCBvciAwIGlmCi8vIGl0IGRvZXMgbm90IGV4aXN0LgpmdW5jIChiICpCb29rKSBIb2xkZXJDb3VudChwZXJtIHN0cmluZykgaW50IHsKCXIsIGZvdW5kIDo9IGIuZy5HZXRSb2xlKHBlcm0pCglpZiAhZm91bmQgewoJCXJldHVybiAwCgl9CglyZXR1cm4gci5NZW1iZXJzKCkuU2l6ZSgpCn0KCi8vIEhvbGRlcnMgcmV0dXJucyB1cCB0byBjb3VudCBob2xkZXJzIG9mIHRoZSBuYW1lZCBwZXJtaXNzaW9uLCBpbiBzb3J0ZWQKLy8gb3JkZXIsIHN0YXJ0aW5nIGF0IG9mZnNldC4gUGFnaW5hdGVkIGZvciB0aGUgc2FtZSByZWFzb24gYXMKLy8gUGVybWlzc2lvbk5hbWVzLiBSZXR1cm5zIG5pbCBmb3IgYW4gdW5rbm93biBwZXJtaXNzaW9uLgpmdW5jIChiICpCb29rKSBIb2xkZXJzKHBlcm0gc3RyaW5nLCBvZmZzZXQsIGNvdW50IGludCkgW11hZGRyZXNzIHsKCWlmIGNvdW50IDw9IDAgewoJCXJldHVybiBuaWwKCX0KCXIsIGZvdW5kIDo9IGIuZy5HZXRSb2xlKHBlcm0pCglpZiAhZm91bmQgewoJCXJldHVybiBuaWwKCX0KCXZhciBvdXQgW11hZGRyZXNzCglyLk1lbWJlcnMoKS5JdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhhIGFkZHJlc3MpIGJvb2wgewoJCW91dCA9IGFwcGVuZChvdXQsIGEpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG91dAp9CgovLyBBZG1pbiByZXR1cm5zIHRoZSBib29rJ3MgY3VycmVudCBhZG1pbi4KZnVuYyAoYiAqQm9vaykgQWRtaW4oKSBhZGRyZXNzIHsKCXJldHVybiBiLmFkbWluCn0KCi8vIFBlbmRpbmdBZG1pbiByZXR1cm5zIHRoZSBub21pbmF0ZWQtYnV0LW5vdC15ZXQtYWNjZXB0ZWQgYWRtaW4sIG9yIHRoZQovLyBlbXB0eSBhZGRyZXNzIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgbm9taW5hdGlvbi4KZnVuYyAoYiAqQm9vaykgUGVuZGluZ0FkbWluKCkgYWRkcmVzcyB7CglyZXR1cm4gYi5wZW5kaW5nQWRtaW4KfQoKLy8gSXNBZG1pbiByZXBvcnRzIHdoZXRoZXIgYWRkciBpcyB0aGUgYm9vaydzIGFkbWluLgpmdW5jIChiICpCb29rKSBJc0FkbWluKGFkZHIgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gYWRkciA9PSBiLmFkbWluCn0KCi8vIExpbWl0cyByZXR1cm5zIHRoZSBib29rJ3MgZml4ZWQgbGltaXRzLgpmdW5jIChiICpCb29rKSBMaW1pdHMoKSBMaW1pdHMgewoJcmV0dXJuIGIubGltCn0KCi8vIC0tLSBuYW1lcyAtLS0KCi8vIHZhbGlkTmFtZSByZXN0cmljdHMgcGVybWlzc2lvbiBuYW1lcyB0byBsb3dlcmNhc2UgYWxwaGFudW1lcmljcyBhbmQKLy8gdW5kZXJzY29yZXMsIHdpdGhpbiB0aGUgYm9vaydzIE1heE5hbWVMZW4uCi8vCi8vIEJleW9uZCBoeWdpZW5lIHRoaXMgaXMgYSBzZWN1cml0eSBwcm9wZXJ0eTogcGVybWlzc2lvbiBuYW1lcyBlbmQgdXAgaW4KLy8gY29tcG9zaXRlIHRydXN0IGRlY2lzaW9ucyBhbmQgaW4gcmVuZGVyZWQgb3V0cHV0LCBzbyBubyBkZWxpbWl0ZXIsCi8vIHdoaXRlc3BhY2UsIG9yIG1hcmtkb3duIGNoYXJhY3RlciBtYXkgZW50ZXIgb25lLgpmdW5jIChiICpCb29rKSB2YWxpZE5hbWUobmFtZSBzdHJpbmcpIGJvb2wgewoJaWYgbmFtZSA9PSAiIiB8fCBsZW4obmFtZSkgPiBiLmxpbS5NYXhOYW1lTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBjIDo9IHJhbmdlIG5hbWUgewoJCWlmICEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJ18nKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KGpm6AQoRcGVybWJvb2tfdGVzdC5nbm8SgroBcGFja2FnZSBwZXJtYm9vawoKaW1wb3J0ICgKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCnZhciAoCglhZG1pbiAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJwZXJtYWRtaW4iKQoJbm9taW5lZSA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygibm9taW5lZSIpCglhbGljZSAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhbGljZSIpCglib2IgICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJib2IiKQoJbWFsbG9yeSA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygibWFsbG9yeSIpCikKCi8vIC0tLSB0ZXN0IGhhcm5lc3MgLS0tCi8vCi8vIHBlcm1ib29rJ3MgbXV0YXRvcnMgaWRlbnRpZnkgdGhlaXIgcHJpbmNpcGFsIGFzIHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKQovLyBhZnRlciBwcm92aW5nIHJsbS5Jc0N1cnJlbnQoKS4gQSB0ZXN0IGZ1bmN0aW9uJ3Mgb3duIGBjdXJgIGlzIGN1cnJlbnQgYnV0Ci8vIGhhcyBubyBwcmV2aW91cyBmcmFtZSDigJQgUHJldmlvdXMoKSBwYW5pY3Mgd2l0aCAiY2Fubm90IHNlZWsgYmV5b25kIG9yaWdpbgovLyBjYWxsZXIgb3ZlcnJpZGUiLiBTbyBldmVyeSBtdXRhdGluZyBjYWxsIGlzIG1hZGUgZnJvbSBpbnNpZGUgYSByZWFsCi8vIGNyb3NzaW5nIGZyYW1lLCBlbnRlcmVkIHdpdGggY3Jvc3MoY3VyKSwgZXhhY3RseSBhcyBwL250L293bmFibGUvdjAncyBvd24KLy8gdGVzdHMgZG8uCi8vCi8vIHRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRkcikpIHNldHMgdGhlIGN1cnJlbnQgcmVhbG0gdG8gYQovLyB1c2VyIHJlYWxtIGZvciBhZGRyLCBzbyB0aGUgbmV4dCBjcm9zc2luZyBmcmFtZSBoYXMKLy8gUHJldmlvdXMoKS5BZGRyZXNzKCkgPT0gYWRkciDigJQgdGhlIHByaW5jaXBhbCB0aGUgbXV0YXRvciBhdXRob3JpemVzCi8vIGFnYWluc3QuIEl0IGlzIHdyaXR0ZW4gb3V0IGF0IGV2ZXJ5IGNhbGwgc2l0ZSBvbiBwdXJwb3NlOiB0aGUgb3ZlcnJpZGUgaXMKLy8gc2NvcGVkIHRvIHRoZSBmcmFtZSB0aGF0IGluc3RhbGxzIGl0LCBzbyB3cmFwcGluZyBpdCBpbiBhIGhlbHBlciBtYWtlcyBpdAovLyBwb3AgdGhlIG1vbWVudCB0aGUgaGVscGVyIHJldHVybnMgYW5kIHRoZSBwcmluY2lwYWwgY29tZXMgYmFjayBlbXB0eS4KCmZ1bmMgZ3JhbnQoY3VyIHJlYWxtLCBiICpCb29rLCBwZXJtIHN0cmluZywgYWRkciBhZGRyZXNzKSBlcnJvciB7Cgl2YXIgZXJyIGVycm9yCglmdW5jKGN1ciByZWFsbSkgeyBlcnIgPSBiLkdyYW50KDAsIGN1ciwgcGVybSwgYWRkcikgfShjcm9zcyhjdXIpKQoJcmV0dXJuIGVycgp9CgpmdW5jIHJldm9rZShjdXIgcmVhbG0sIGIgKkJvb2ssIHBlcm0gc3RyaW5nLCBhZGRyIGFkZHJlc3MpIGVycm9yIHsKCXZhciBlcnIgZXJyb3IKCWZ1bmMoY3VyIHJlYWxtKSB7IGVyciA9IGIuUmV2b2tlKDAsIGN1ciwgcGVybSwgYWRkcikgfShjcm9zcyhjdXIpKQoJcmV0dXJuIGVycgp9CgpmdW5jIHJldm9rZUFsbChjdXIgcmVhbG0sIGIgKkJvb2ssIGFkZHIgYWRkcmVzcykgKGludCwgZXJyb3IpIHsKCXZhciAoCgkJbiAgIGludAoJCWVyciBlcnJvcgoJKQoJZnVuYyhjdXIgcmVhbG0pIHsgbiwgZXJyID0gYi5SZXZva2VBbGwoMCwgY3VyLCBhZGRyKSB9KGNyb3NzKGN1cikpCglyZXR1cm4gbiwgZXJyCn0KCmZ1bmMgZHJvcFBlcm0oY3VyIHJlYWxtLCBiICpCb29rLCBwZXJtIHN0cmluZykgZXJyb3IgewoJdmFyIGVyciBlcnJvcgoJZnVuYyhjdXIgcmVhbG0pIHsgZXJyID0gYi5Ecm9wUGVybWlzc2lvbigwLCBjdXIsIHBlcm0pIH0oY3Jvc3MoY3VyKSkKCXJldHVybiBlcnIKfQoKZnVuYyBub21pbmF0ZShjdXIgcmVhbG0sIGIgKkJvb2ssIGFkZHIgYWRkcmVzcykgZXJyb3IgewoJdmFyIGVyciBlcnJvcgoJZnVuYyhjdXIgcmVhbG0pIHsgZXJyID0gYi5Ob21pbmF0ZUFkbWluKDAsIGN1ciwgYWRkcikgfShjcm9zcyhjdXIpKQoJcmV0dXJuIGVycgp9CgpmdW5jIGNhbmNlbE5vbShjdXIgcmVhbG0sIGIgKkJvb2spIGVycm9yIHsKCXZhciBlcnIgZXJyb3IKCWZ1bmMoY3VyIHJlYWxtKSB7IGVyciA9IGIuQ2FuY2VsTm9taW5hdGlvbigwLCBjdXIpIH0oY3Jvc3MoY3VyKSkKCXJldHVybiBlcnIKfQoKZnVuYyBhY2NlcHRBZG1pbihjdXIgcmVhbG0sIGIgKkJvb2spIGVycm9yIHsKCXZhciBlcnIgZXJyb3IKCWZ1bmMoY3VyIHJlYWxtKSB7IGVyciA9IGIuQWNjZXB0QWRtaW4oMCwgY3VyKSB9KGNyb3NzKGN1cikpCglyZXR1cm4gZXJyCn0KCi8vIG5ld0Jvb2sgYnVpbGRzIGEgYm9vayBmb3IgdGVzdHMuCmZ1bmMgbmV3Qm9vayh0ICp0ZXN0aW5nLlQsIG93bmVyIGFkZHJlc3MpICpCb29rIHsKCXQuSGVscGVyKCkKCWIsIGVyciA6PSBOZXdEZWZhdWx0KG93bmVyKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGVycikKCWlmIGIgPT0gbmlsIHsKCQl0LkZhdGFsKCJOZXdEZWZhdWx0IHJldHVybmVkIG5pbCBib29rIikKCX0KCXJldHVybiBiCn0KCi8vIC0tLSBjb25zdHJ1Y3Rpb24gLS0tCgpmdW5jIFRlc3ROZXdEZWZhdWx0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgl1YXNzZXJ0LkVxdWFsKHQsIGFkbWluLlN0cmluZygpLCBiLkFkbWluKCkuU3RyaW5nKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBiLlBlbmRpbmdBZG1pbigpLlN0cmluZygpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBiLlBlcm1pc3Npb25Db3VudCgpKQoJdWFzc2VydC5UcnVlKHQsIGIuSXNBZG1pbihhZG1pbikpCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSXNBZG1pbihhbGljZSkpCgoJbCA6PSBiLkxpbWl0cygpCgl1YXNzZXJ0LkVxdWFsKHQsIERlZmF1bHRNYXhQZXJtaXNzaW9ucywgbC5NYXhQZXJtaXNzaW9ucykKCXVhc3NlcnQuRXF1YWwodCwgRGVmYXVsdE1heEhvbGRlcnNQZXJQZXJtaXNzaW9uLCBsLk1heEhvbGRlcnNQZXJQZXJtaXNzaW9uKQoJdWFzc2VydC5FcXVhbCh0LCBEZWZhdWx0TWF4TmFtZUxlbiwgbC5NYXhOYW1lTGVuKQp9CgpmdW5jIFRlc3ROZXdSZWplY3RzSW52YWxpZEFkbWluKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliLCBlcnIgOj0gTmV3RGVmYXVsdChhZGRyZXNzKCIiKSkKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRBZGRyZXNzKQoJdWFzc2VydC5UcnVlKHQsIGIgPT0gbmlsKQoKCWIsIGVyciA9IE5ld0RlZmF1bHQoYWRkcmVzcygibm90LWEtYmVjaDMyLWFkZHJlc3MiKSkKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRBZGRyZXNzKQoJdWFzc2VydC5UcnVlKHQsIGIgPT0gbmlsKQp9CgpmdW5jIFRlc3ROZXdSZWplY3RzSW52YWxpZExpbWl0cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJY2FzZXMgOj0gW11MaW1pdHN7CgkJe01heFBlcm1pc3Npb25zOiAwLCBNYXhIb2xkZXJzUGVyUGVybWlzc2lvbjogMTAsIE1heE5hbWVMZW46IDEwfSwKCQl7TWF4UGVybWlzc2lvbnM6IDEwLCBNYXhIb2xkZXJzUGVyUGVybWlzc2lvbjogMCwgTWF4TmFtZUxlbjogMTB9LAoJCXtNYXhQZXJtaXNzaW9uczogMTAsIE1heEhvbGRlcnNQZXJQZXJtaXNzaW9uOiAxMCwgTWF4TmFtZUxlbjogMH0sCgkJe01heFBlcm1pc3Npb25zOiAtMSwgTWF4SG9sZGVyc1BlclBlcm1pc3Npb246IDEwLCBNYXhOYW1lTGVuOiAxMH0sCgkJe01heFBlcm1pc3Npb25zOiBNYXhQZXJtaXNzaW9uc0NlaWxpbmcgKyAxLCBNYXhIb2xkZXJzUGVyUGVybWlzc2lvbjogMTAsIE1heE5hbWVMZW46IDEwfSwKCQl7TWF4UGVybWlzc2lvbnM6IDEwLCBNYXhIb2xkZXJzUGVyUGVybWlzc2lvbjogTWF4SG9sZGVyc0NlaWxpbmcgKyAxLCBNYXhOYW1lTGVuOiAxMH0sCgkJe01heFBlcm1pc3Npb25zOiAxMCwgTWF4SG9sZGVyc1BlclBlcm1pc3Npb246IDEwLCBNYXhOYW1lTGVuOiBNYXhOYW1lTGVuQ2VpbGluZyArIDF9LAoJfQoJZm9yIGksIGxpbSA6PSByYW5nZSBjYXNlcyB7CgkJYiwgZXJyIDo9IE5ldyhhZG1pbiwgbGltKQoJCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRMaW1pdHMpCgkJaWYgYiAhPSBuaWwgewoJCQl0LkVycm9yZigiY2FzZSAlZDogZXhwZWN0ZWQgbmlsIGJvb2siLCBpKQoJCX0KCX0KfQoKZnVuYyBUZXN0TmV3QWNjZXB0c0NlaWxpbmdMaW1pdHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIsIGVyciA6PSBOZXcoYWRtaW4sIExpbWl0c3sKCQlNYXhQZXJtaXNzaW9uczogICAgICAgICAgTWF4UGVybWlzc2lvbnNDZWlsaW5nLAoJCU1heEhvbGRlcnNQZXJQZXJtaXNzaW9uOiBNYXhIb2xkZXJzQ2VpbGluZywKCQlNYXhOYW1lTGVuOiAgICAgICAgICAgICAgTWF4TmFtZUxlbkNlaWxpbmcsCgl9KQoJdWFzc2VydC5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgTWF4UGVybWlzc2lvbnNDZWlsaW5nLCBiLkxpbWl0cygpLk1heFBlcm1pc3Npb25zKQp9CgovLyAtLS0gZ3JhbnQgLyBxdWVyeSAvIHJldm9rZSwgdGhlIGNvcmUgb2JqZWN0aXZlIC0tLQoKZnVuYyBUZXN0R3JhbnRUaGVuSGFzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluKSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzKCJ3aXRoZHJhdyIsIGFsaWNlKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJ3aXRoZHJhdyIsIGFsaWNlKSkKCXVhc3NlcnQuVHJ1ZSh0LCBiLkhhcygid2l0aGRyYXciLCBhbGljZSkpCgoJLy8gZ3JhbnRpbmcgdG8gYWxpY2UgZG9lcyBub3QgZ3JhbnQgdG8gYm9iCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzKCJ3aXRoZHJhdyIsIGJvYikpCgkvLyBub3IgZG9lcyBpdCBjcmVhdGUgYW55IG90aGVyIHBlcm1pc3Npb24KCXVhc3NlcnQuRmFsc2UodCwgYi5IYXMoImRlcG9zaXQiLCBhbGljZSkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGIuUGVybWlzc2lvbkNvdW50KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGIuSG9sZGVyQ291bnQoIndpdGhkcmF3IikpCn0KCmZ1bmMgVGVzdFJldm9rZVJlbW92ZXNUaGVHcmFudChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYm9iKSkKCXVhc3NlcnQuVHJ1ZSh0LCBiLkhhcygid2l0aGRyYXciLCBhbGljZSkpCgoJdWFzc2VydC5Ob0Vycm9yKHQsIHJldm9rZShjdXIsIGIsICJ3aXRoZHJhdyIsIGFsaWNlKSkKCXVhc3NlcnQuRmFsc2UodCwgYi5IYXMoIndpdGhkcmF3IiwgYWxpY2UpKQoJLy8gYm9iIGlzIHVudG91Y2hlZAoJdWFzc2VydC5UcnVlKHQsIGIuSGFzKCJ3aXRoZHJhdyIsIGJvYikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGIuSG9sZGVyQ291bnQoIndpdGhkcmF3IikpCgkvLyB0aGUgcGVybWlzc2lvbiBzdGlsbCBleGlzdHMgYmVjYXVzZSBib2IgaG9sZHMgaXQKCXVhc3NlcnQuRXF1YWwodCwgMSwgYi5QZXJtaXNzaW9uQ291bnQoKSkKfQoKZnVuYyBUZXN0UmV2b2tpbmdMYXN0SG9sZGVyUHJ1bmVzVGhlUGVybWlzc2lvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBiLlBlcm1pc3Npb25Db3VudCgpKQoKCXVhc3NlcnQuTm9FcnJvcih0LCByZXZva2UoY3VyLCBiLCAid2l0aGRyYXciLCBhbGljZSkpCgkvLyB0aGUgZW1wdHkgYnVja2V0IGlzIGdvbmUsIHNvIGl0IGRvZXMgbm90IGNvbnN1bWUgYSBNYXhQZXJtaXNzaW9ucyBzbG90Cgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGIuUGVybWlzc2lvbkNvdW50KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGIuSG9sZGVyQ291bnQoIndpdGhkcmF3IikpCgkvLyBhbmQgdGhlIHF1ZXJ5IGlzIHN0aWxsIHdlbGwtZGVmaW5lZAoJdWFzc2VydC5GYWxzZSh0LCBiLkhhcygid2l0aGRyYXciLCBhbGljZSkpCn0KCmZ1bmMgVGVzdEdyYW50QWZ0ZXJQcnVuZVdvcmtzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluKSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAid2l0aGRyYXciLCBhbGljZSkpCgl1YXNzZXJ0Lk5vRXJyb3IodCwgcmV2b2tlKGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpKQoJLy8gcmUtY3JlYXRpbmcgYSBwcnVuZWQgcGVybWlzc2lvbiBtdXN0IG5vdCBjb2xsaWRlIHdpdGggYSBzdGFsZSBidWNrZXQKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJ3aXRoZHJhdyIsIGJvYikpCgl1YXNzZXJ0LlRydWUodCwgYi5IYXMoIndpdGhkcmF3IiwgYm9iKSkKCXVhc3NlcnQuRmFsc2UodCwgYi5IYXMoIndpdGhkcmF3IiwgYWxpY2UpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBiLlBlcm1pc3Npb25Db3VudCgpKQp9CgpmdW5jIFRlc3REdXBsaWNhdGVHcmFudElzQW5FcnJvcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpKQoJdWFzc2VydC5FcnJvcklzKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpLCBFcnJBbHJlYWR5R3JhbnRlZCkKCS8vIHRoZSBmYWlsZWQgZHVwbGljYXRlIGRpZCBub3QgZ3JvdyBzdGF0ZQoJdWFzc2VydC5FcXVhbCh0LCAxLCBiLkhvbGRlckNvdW50KCJ3aXRoZHJhdyIpKQp9CgpmdW5jIFRlc3RSZXZva2VXaGF0SXNOb3RIZWxkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluKSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCgkvLyB1bmtub3duIHBlcm1pc3Npb24KCXVhc3NlcnQuRXJyb3JJcyh0LCByZXZva2UoY3VyLCBiLCAibm9wZSIsIGFsaWNlKSwgRXJyTm90R3JhbnRlZCkKCS8vIGtub3duIHBlcm1pc3Npb24sIHdyb25nIGhvbGRlcgoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpKQoJdWFzc2VydC5FcnJvcklzKHQsIHJldm9rZShjdXIsIGIsICJ3aXRoZHJhdyIsIGJvYiksIEVyck5vdEdyYW50ZWQpCgl1YXNzZXJ0LlRydWUodCwgYi5IYXMoIndpdGhkcmF3IiwgYWxpY2UpKQp9CgpmdW5jIFRlc3RNdWx0aXBsZVBlcm1pc3Npb25zQXJlSW5kZXBlbmRlbnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiA6PSBuZXdCb29rKHQsIGFkbWluKQoKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJyZWFkIiwgYWxpY2UpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndyaXRlIiwgYWxpY2UpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndyaXRlIiwgYm9iKSkKCgl1YXNzZXJ0LlRydWUodCwgYi5IYXMoInJlYWQiLCBhbGljZSkpCgl1YXNzZXJ0LlRydWUodCwgYi5IYXMoIndyaXRlIiwgYWxpY2UpKQoJdWFzc2VydC5GYWxzZSh0LCBiLkhhcygicmVhZCIsIGJvYikpCgl1YXNzZXJ0LlRydWUodCwgYi5IYXMoIndyaXRlIiwgYm9iKSkKCXVhc3NlcnQuRXF1YWwodCwgMiwgYi5QZXJtaXNzaW9uQ291bnQoKSkKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgcmV2b2tlKGN1ciwgYiwgIndyaXRlIiwgYWxpY2UpKQoJLy8gcmV2b2tpbmcgb25lIHBlcm1pc3Npb24gbGVhdmVzIHRoZSBvdGhlciBpbnRhY3QKCXVhc3NlcnQuVHJ1ZSh0LCBiLkhhcygicmVhZCIsIGFsaWNlKSkKCXVhc3NlcnQuRmFsc2UodCwgYi5IYXMoIndyaXRlIiwgYWxpY2UpKQoJdWFzc2VydC5UcnVlKHQsIGIuSGFzKCJ3cml0ZSIsIGJvYikpCn0KCi8vIC0tLSBhdXRob3JpemF0aW9uIC0tLQoKZnVuYyBUZXN0Tm9uQWRtaW5DYW5ub3RHcmFudChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCgl1YXNzZXJ0LkVycm9ySXModCwgZ3JhbnQoY3VyLCBiLCAid2l0aGRyYXciLCBtYWxsb3J5KSwgRXJyVW5hdXRob3JpemVkKQoJdWFzc2VydC5GYWxzZSh0LCBiLkhhcygid2l0aGRyYXciLCBtYWxsb3J5KSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgYi5QZXJtaXNzaW9uQ291bnQoKSkKfQoKZnVuYyBUZXN0Tm9uQWRtaW5DYW5ub3RSZXZva2UoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiA6PSBuZXdCb29rKHQsIGFkbWluKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkVycm9ySXModCwgcmV2b2tlKGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpLCBFcnJVbmF1dGhvcml6ZWQpCgl1YXNzZXJ0LlRydWUodCwgYi5IYXMoIndpdGhkcmF3IiwgYWxpY2UpKQp9CgovLyBBIGhvbGRlciBvZiBhIHBlcm1pc3Npb24gaGFzIG5vIGF1dGhvcml0eSBvdmVyIHRoZSBib29rLiBUaGlzIGlzIHRoZQovLyBwcm9wZXJ0eSB0aGF0IHAvdGhveC9hY2Nlc3Njb250cm9sIGxvc2VzIGJ5IGV4cG9ydGluZyBSb2xlLkhvbGRlcnMgYW5kCi8vIHJldHVybmluZyAqUm9sZTogdGhlcmUsIGFueSBob2xkZXIgY2FuIHNlbGYtZ3JhbnQuCmZ1bmMgVGVzdEhvbGRlcklzTm90QWRtaW4oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiA6PSBuZXdCb29rKHQsIGFkbWluKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYWxpY2UpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdWFzc2VydC5FcnJvcklzKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgbWFsbG9yeSksIEVyclVuYXV0aG9yaXplZCkKCXVhc3NlcnQuRXJyb3JJcyh0LCByZXZva2UoY3VyLCBiLCAid2l0aGRyYXciLCBhbGljZSksIEVyclVuYXV0aG9yaXplZCkKCXVhc3NlcnQuRXJyb3JJcyh0LCBkcm9wUGVybShjdXIsIGIsICJ3aXRoZHJhdyIpLCBFcnJVbmF1dGhvcml6ZWQpCgl1YXNzZXJ0LkVycm9ySXModCwgbm9taW5hdGUoY3VyLCBiLCBhbGljZSksIEVyclVuYXV0aG9yaXplZCkKCV8sIGVyciA6PSByZXZva2VBbGwoY3VyLCBiLCBhbGljZSkKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclVuYXV0aG9yaXplZCkKCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzKCJ3aXRoZHJhdyIsIG1hbGxvcnkpKQoJdWFzc2VydC5UcnVlKHQsIGIuSGFzKCJ3aXRoZHJhdyIsIGFsaWNlKSkKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW4uU3RyaW5nKCksIGIuQWRtaW4oKS5TdHJpbmcoKSkKfQoKZnVuYyBUZXN0Tm9uQWRtaW5DYW5ub3REcm9wT3JSZXZva2VBbGwoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiA6PSBuZXdCb29rKHQsIGFkbWluKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgImEiLCBhbGljZSkpCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAiYiIsIGFsaWNlKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5FcnJvcklzKHQsIGRyb3BQZXJtKGN1ciwgYiwgImEiKSwgRXJyVW5hdXRob3JpemVkKQoJbiwgZXJyIDo9IHJldm9rZUFsbChjdXIsIGIsIGFsaWNlKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyVW5hdXRob3JpemVkKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBuKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBiLlBlcm1pc3Npb25Db3VudCgpKQp9CgovLyAtLS0gbmFtZSB2YWxpZGF0aW9uIC0tLQoKZnVuYyBUZXN0SW52YWxpZFBlcm1pc3Npb25OYW1lcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgoJYmFkIDo9IFtdc3RyaW5newoJCSIiLCAgICAgICAgICAgLy8gZW1wdHkKCQkiV2l0aGRyYXciLCAgIC8vIHVwcGVyY2FzZQoJCSJ3aXRoIGRyYXciLCAgLy8gc3BhY2UKCQkid2l0aC1kcmF3IiwgIC8vIGh5cGhlbgoJCSJ3aXRoLmRyYXciLCAgLy8gZG90CgkJIndpdGgvZHJhdyIsICAvLyBwYXRoIHNlcGFyYXRvcgoJCSJ3aXRoLGRyYXciLCAgLy8gY29tbWEg4oCUIGEgZGVsaW1pdGVyIGluIHJlbmRlcmVkIGxpc3RzCgkJIltsaW5rXSh4KSIsICAvLyBtYXJrZG93bgoJCSJ3aXRoXG5kcmF3IiwgLy8gbmV3bGluZQoJCSJ3aXRoZHJhdyEiLCAgLy8gcHVuY3R1YXRpb24KCQkid8OtdGhkcmF3IiwgICAvLyBub24tYXNjaWkKCX0KCWZvciBfLCBuYW1lIDo9IHJhbmdlIGJhZCB7CgkJdWFzc2VydC5FcnJvcklzKHQsIGdyYW50KGN1ciwgYiwgbmFtZSwgYWxpY2UpLCBFcnJJbnZhbGlkTmFtZSkKCX0KCXVhc3NlcnQuRXF1YWwodCwgMCwgYi5QZXJtaXNzaW9uQ291bnQoKSkKCglnb29kIDo9IFtdc3RyaW5neyJhIiwgIndpdGhkcmF3IiwgIndpdGhfZHJhdyIsICJwZXJtMiIsICJfbGVhZGluZyIsICJ0cmFpbGluZ18ifQoJZm9yIF8sIG5hbWUgOj0gcmFuZ2UgZ29vZCB7CgkJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgbmFtZSwgYWxpY2UpKQoJfQoJdWFzc2VydC5FcXVhbCh0LCBsZW4oZ29vZCksIGIuUGVybWlzc2lvbkNvdW50KCkpCn0KCmZ1bmMgVGVzdE5hbWVMZW5ndGhCb3VuZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliLCBlcnIgOj0gTmV3KGFkbWluLCBMaW1pdHN7TWF4UGVybWlzc2lvbnM6IDgsIE1heEhvbGRlcnNQZXJQZXJtaXNzaW9uOiA4LCBNYXhOYW1lTGVuOiA0fSkKCXVhc3NlcnQuTm9FcnJvcih0LCBlcnIpCgoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgImFiY2QiLCBhbGljZSkpCgl1YXNzZXJ0LkVycm9ySXModCwgZ3JhbnQoY3VyLCBiLCAiYWJjZGUiLCBhbGljZSksIEVyckludmFsaWROYW1lKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBiLlBlcm1pc3Npb25Db3VudCgpKQp9CgpmdW5jIFRlc3RHcmFudFJlamVjdHNJbnZhbGlkQWRkcmVzcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgoJdWFzc2VydC5FcnJvcklzKHQsIGdyYW50KGN1ciwgYiwgIndpdGhkcmF3IiwgYWRkcmVzcygiIikpLCBFcnJJbnZhbGlkQWRkcmVzcykKCXVhc3NlcnQuRXJyb3JJcyh0LCBncmFudChjdXIsIGIsICJ3aXRoZHJhdyIsIGFkZHJlc3MoImcxbm9uc2Vuc2UiKSksIEVyckludmFsaWRBZGRyZXNzKQoJLy8gYSByZWplY3RlZCBncmFudCBtdXN0IG5vdCBoYXZlIGNyZWF0ZWQgdGhlIHBlcm1pc3Npb24gYnVja2V0Cgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGIuUGVybWlzc2lvbkNvdW50KCkpCn0KCi8vIC0tLSBib3VuZHMgLS0tCgpmdW5jIFRlc3RQZXJtaXNzaW9uTGltaXQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiwgZXJyIDo9IE5ldyhhZG1pbiwgTGltaXRze01heFBlcm1pc3Npb25zOiAzLCBNYXhIb2xkZXJzUGVyUGVybWlzc2lvbjogOCwgTWF4TmFtZUxlbjogMTZ9KQoJdWFzc2VydC5Ob0Vycm9yKHQsIGVycikKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicDEiLCBhbGljZSkpCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicDIiLCBhbGljZSkpCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicDMiLCBhbGljZSkpCgl1YXNzZXJ0LkVycm9ySXModCwgZ3JhbnQoY3VyLCBiLCAicDQiLCBhbGljZSksIEVyclBlcm1pc3Npb25MaW1pdCkKCXVhc3NlcnQuRXF1YWwodCwgMywgYi5QZXJtaXNzaW9uQ291bnQoKSkKCgkvLyBncmFudGluZyBhbiBFWElTVElORyBwZXJtaXNzaW9uIHRvIGEgbmV3IGFkZHJlc3MgaXMgbm90IGJsb2NrZWQgYnkgdGhlCgkvLyBwZXJtaXNzaW9uIGxpbWl0Cgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicDEiLCBib2IpKQoKCS8vIGZyZWVpbmcgYSBzbG90IHJlLW9wZW5zIGl0Cgl1YXNzZXJ0Lk5vRXJyb3IodCwgZHJvcFBlcm0oY3VyLCBiLCAicDMiKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJwNCIsIGFsaWNlKSkKCXVhc3NlcnQuRXF1YWwodCwgMywgYi5QZXJtaXNzaW9uQ291bnQoKSkKfQoKZnVuYyBUZXN0SG9sZGVyTGltaXQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiwgZXJyIDo9IE5ldyhhZG1pbiwgTGltaXRze01heFBlcm1pc3Npb25zOiA0LCBNYXhIb2xkZXJzUGVyUGVybWlzc2lvbjogMiwgTWF4TmFtZUxlbjogMTZ9KQoJdWFzc2VydC5Ob0Vycm9yKHQsIGVycikKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicCIsIGFsaWNlKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJwIiwgYm9iKSkKCXVhc3NlcnQuRXJyb3JJcyh0LCBncmFudChjdXIsIGIsICJwIiwgbWFsbG9yeSksIEVyckhvbGRlckxpbWl0KQoJdWFzc2VydC5FcXVhbCh0LCAyLCBiLkhvbGRlckNvdW50KCJwIikpCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzKCJwIiwgbWFsbG9yeSkpCgoJLy8gYSByZXZva2UgZnJlZXMgYSBzbG90Cgl1YXNzZXJ0Lk5vRXJyb3IodCwgcmV2b2tlKGN1ciwgYiwgInAiLCBhbGljZSkpCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicCIsIG1hbGxvcnkpKQoJdWFzc2VydC5UcnVlKHQsIGIuSGFzKCJwIiwgbWFsbG9yeSkpCn0KCi8vIEEgcmVqZWN0ZWQgZ3JhbnQgbXVzdCBsZWF2ZSBubyBidWNrZXQgYmVoaW5kIHRoYXQgb2NjdXBpZXMgYQovLyBNYXhQZXJtaXNzaW9ucyBzbG90IHdpdGhvdXQgaG9sZGluZyBhbnl0aGluZy4KLy8KLy8gVHdvIHJlamVjdGlvbiByb3V0ZXMgZXhpc3QgYW5kIHRoZXkgYXJlIE5PVCB0aGUgc2FtZSBjYXNlLiBBIGhvbGRlci1saW1pdAovLyByZWplY3Rpb24gY2FuIG9ubHkgaGFwcGVuIG9uIGEgcGVybWlzc2lvbiB0aGF0IGFscmVhZHkgaGFkIGhvbGRlcnMsIHNvCi8vIG5vdGhpbmcgd2FzIGNyZWF0ZWQgdG8gY2xlYW4gdXAg4oCUIEdyYW50IGRvY3VtZW50cyB0aGF0IGFyZ3VtZW50IHdoZXJlIGl0Ci8vIHJldHVybnMgRXJySG9sZGVyTGltaXQuIEFuIGludmFsaWQtbmFtZSBvciBpbnZhbGlkLWFkZHJlc3MgcmVqZWN0aW9uCi8vIGhhcHBlbnMgYmVmb3JlIGFueSBidWNrZXQgaXMgY3JlYXRlZC4gVGhpcyBhc3NlcnRzIHRoZSBpbnZhcmlhbnQgb24gYm90aAovLyByb3V0ZXMgcmF0aGVyIHRoYW4gb24gYSBicmFuY2guCmZ1bmMgVGVzdEZhaWxlZEdyYW50TGVhdmVzTm9FbXB0eUJ1Y2tldChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliLCBlcnIgOj0gTmV3KGFkbWluLCBMaW1pdHN7TWF4UGVybWlzc2lvbnM6IDIsIE1heEhvbGRlcnNQZXJQZXJtaXNzaW9uOiAxLCBNYXhOYW1lTGVuOiAxNn0pCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZXJyKQoKCS8vIHJvdXRlIDE6IGhvbGRlciBsaW1pdCwgb24gYSBwZXJtaXNzaW9uIHRoYXQgYWxyZWFkeSBoYXMgaXRzIGhvbGRlcgoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgInAxIiwgYWxpY2UpKQoJdWFzc2VydC5FcnJvcklzKHQsIGdyYW50KGN1ciwgYiwgInAxIiwgYm9iKSwgRXJySG9sZGVyTGltaXQpCgkvLyBwMSBzdGlsbCBoYXMgZXhhY3RseSBpdHMgb25lIGhvbGRlciBhbmQgbm8gc2Vjb25kIGJ1Y2tldCBhcHBlYXJlZAoJdWFzc2VydC5FcXVhbCh0LCAxLCBiLlBlcm1pc3Npb25Db3VudCgpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBiLkhvbGRlckNvdW50KCJwMSIpKQoJdWFzc2VydC5UcnVlKHQsIGIuSGFzKCJwMSIsIGFsaWNlKSkKCXVhc3NlcnQuRmFsc2UodCwgYi5IYXMoInAxIiwgYm9iKSkKCgkvLyByb3V0ZSAyOiBhIHJlamVjdGlvbiB0aGF0IGhhcHBlbnMgYmVmb3JlIGNyZWF0aW9uLiBUaGUgb25lIGZyZWUgc2xvdAoJLy8gaXMgc3RpbGwgZnJlZSBhZnRlcndhcmRzLCB3aGljaCBpcyB3aGF0IHByb3ZlcyBub3RoaW5nIHdhcyBjb25zdW1lZC4KCXVhc3NlcnQuRXJyb3JJcyh0LCBncmFudChjdXIsIGIsICJCQUQiLCBhbGljZSksIEVyckludmFsaWROYW1lKQoJdWFzc2VydC5FcnJvcklzKHQsIGdyYW50KGN1ciwgYiwgInAyIiwgYWRkcmVzcygiIikpLCBFcnJJbnZhbGlkQWRkcmVzcykKCXVhc3NlcnQuRXF1YWwodCwgMSwgYi5QZXJtaXNzaW9uQ291bnQoKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJwMiIsIGFsaWNlKSkKCXVhc3NlcnQuRXF1YWwodCwgMiwgYi5QZXJtaXNzaW9uQ291bnQoKSkKfQoKLy8gLS0tIFJldm9rZUFsbCBhbmQgRHJvcFBlcm1pc3Npb24gLS0tCgpmdW5jIFRlc3RSZXZva2VBbGwoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiA6PSBuZXdCb29rKHQsIGFkbWluKQoKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJyZWFkIiwgYWxpY2UpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgIndyaXRlIiwgYWxpY2UpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgImFkbWluX3BhbmVsIiwgYWxpY2UpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgInJlYWQiLCBib2IpKQoKCW4sIGVyciA6PSByZXZva2VBbGwoY3VyLCBiLCBhbGljZSkKCXVhc3NlcnQuTm9FcnJvcih0LCBlcnIpCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIG4pCgoJdWFzc2VydC5GYWxzZSh0LCBiLkhhc0FueShhbGljZSkpCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzKCJyZWFkIiwgYWxpY2UpKQoJdWFzc2VydC5GYWxzZSh0LCBiLkhhcygid3JpdGUiLCBhbGljZSkpCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzKCJhZG1pbl9wYW5lbCIsIGFsaWNlKSkKCgkvLyBib2IgaXMgdW50b3VjaGVkLCBhbmQgInJlYWQiIHN1cnZpdmVzIGJlY2F1c2UgaGUgc3RpbGwgaG9sZHMgaXQKCXVhc3NlcnQuVHJ1ZSh0LCBiLkhhcygicmVhZCIsIGJvYikpCgkvLyAid3JpdGUiIGFuZCAiYWRtaW5fcGFuZWwiIHdlcmUgZW1wdGllZCBhbmQgdGhlcmVmb3JlIHBydW5lZAoJdWFzc2VydC5FcXVhbCh0LCAxLCBiLlBlcm1pc3Npb25Db3VudCgpKQp9CgpmdW5jIFRlc3RSZXZva2VBbGxPbkFkZHJlc3NXaXRoTm90aGluZyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicmVhZCIsIGJvYikpCgoJbiwgZXJyIDo9IHJldm9rZUFsbChjdXIsIGIsIGFsaWNlKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgMCwgbikKCXVhc3NlcnQuVHJ1ZSh0LCBiLkhhcygicmVhZCIsIGJvYikpCn0KCmZ1bmMgVGVzdERyb3BQZXJtaXNzaW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluKSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicmVhZCIsIGFsaWNlKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJyZWFkIiwgYm9iKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJ3cml0ZSIsIGFsaWNlKSkKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZHJvcFBlcm0oY3VyLCBiLCAicmVhZCIpKQoJdWFzc2VydC5GYWxzZSh0LCBiLkhhcygicmVhZCIsIGFsaWNlKSkKCXVhc3NlcnQuRmFsc2UodCwgYi5IYXMoInJlYWQiLCBib2IpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBiLkhvbGRlckNvdW50KCJyZWFkIikpCgkvLyB0aGUgb3RoZXIgcGVybWlzc2lvbiBzdXJ2aXZlcwoJdWFzc2VydC5UcnVlKHQsIGIuSGFzKCJ3cml0ZSIsIGFsaWNlKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgYi5QZXJtaXNzaW9uQ291bnQoKSkKCgl1YXNzZXJ0LkVycm9ySXModCwgZHJvcFBlcm0oY3VyLCBiLCAicmVhZCIpLCBFcnJVbmtub3duUGVybWlzc2lvbikKCXVhc3NlcnQuRXJyb3JJcyh0LCBkcm9wUGVybShjdXIsIGIsICJuZXZlcl9leGlzdGVkIiksIEVyclVua25vd25QZXJtaXNzaW9uKQp9CgovLyAtLS0gYWRtaW4gaGFuZG9mZiAtLS0KCmZ1bmMgVGVzdFR3b1N0ZXBBZG1pbkhhbmRvZmYoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiA6PSBuZXdCb29rKHQsIGFkbWluKQoKCXVhc3NlcnQuTm9FcnJvcih0LCBub21pbmF0ZShjdXIsIGIsIG5vbWluZWUpKQoJLy8gbm9taW5hdGlvbiBhbG9uZSBkb2VzIE5PVCBtb3ZlIHRoZSBhZG1pbgoJdWFzc2VydC5FcXVhbCh0LCBhZG1pbi5TdHJpbmcoKSwgYi5BZG1pbigpLlN0cmluZygpKQoJdWFzc2VydC5FcXVhbCh0LCBub21pbmVlLlN0cmluZygpLCBiLlBlbmRpbmdBZG1pbigpLlN0cmluZygpKQoJLy8gYW5kIHRoZSBpbmN1bWJlbnQgc3RpbGwgaGFzIGF1dGhvcml0eQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgInJlYWQiLCBhbGljZSkpCgoJLy8gdGhlIG5vbWluZWUgY2Fubm90IHlldCBhY3QKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obm9taW5lZSkpCgl1YXNzZXJ0LkVycm9ySXModCwgZ3JhbnQoY3VyLCBiLCAid3JpdGUiLCBhbGljZSksIEVyclVuYXV0aG9yaXplZCkKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgYWNjZXB0QWRtaW4oY3VyLCBiKSkKCXVhc3NlcnQuRXF1YWwodCwgbm9taW5lZS5TdHJpbmcoKSwgYi5BZG1pbigpLlN0cmluZygpKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgYi5QZW5kaW5nQWRtaW4oKS5TdHJpbmcoKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJ3cml0ZSIsIGFsaWNlKSkKCgkvLyB0aGUgZm9ybWVyIGFkbWluIGhhcyBsb3N0IGF1dGhvcml0eQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgl1YXNzZXJ0LkVycm9ySXModCwgZ3JhbnQoY3VyLCBiLCAib3RoZXIiLCBhbGljZSksIEVyclVuYXV0aG9yaXplZCkKCgkvLyBncmFudHMgbWFkZSB1bmRlciB0aGUgcHJldmlvdXMgYWRtaW4gc3Vydml2ZSB0aGUgaGFuZG9mZgoJdWFzc2VydC5UcnVlKHQsIGIuSGFzKCJyZWFkIiwgYWxpY2UpKQp9CgpmdW5jIFRlc3RPbmx5Tm9taW5lZUNhbkFjY2VwdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgl1YXNzZXJ0Lk5vRXJyb3IodCwgbm9taW5hdGUoY3VyLCBiLCBub21pbmVlKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5FcnJvcklzKHQsIGFjY2VwdEFkbWluKGN1ciwgYiksIEVyck5vdFBlbmRpbmdBZG1pbikKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW4uU3RyaW5nKCksIGIuQWRtaW4oKS5TdHJpbmcoKSkKCgkvLyBub3QgZXZlbiB0aGUgaW5jdW1iZW50IGFkbWluIGNhbiBhY2NlcHQgb24gdGhlIG5vbWluZWUncyBiZWhhbGYKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJdWFzc2VydC5FcnJvcklzKHQsIGFjY2VwdEFkbWluKGN1ciwgYiksIEVyck5vdFBlbmRpbmdBZG1pbikKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW4uU3RyaW5nKCksIGIuQWRtaW4oKS5TdHJpbmcoKSkKfQoKZnVuYyBUZXN0QWNjZXB0V2l0aG91dE5vbWluYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obm9taW5lZSkpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgl1YXNzZXJ0LkVycm9ySXModCwgYWNjZXB0QWRtaW4oY3VyLCBiKSwgRXJyTm9QZW5kaW5nQWRtaW4pCgl1YXNzZXJ0LkVxdWFsKHQsIGFkbWluLlN0cmluZygpLCBiLkFkbWluKCkuU3RyaW5nKCkpCn0KCmZ1bmMgVGVzdENhbmNlbE5vbWluYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiA6PSBuZXdCb29rKHQsIGFkbWluKQoKCXVhc3NlcnQuRXJyb3JJcyh0LCBjYW5jZWxOb20oY3VyLCBiKSwgRXJyTm9QZW5kaW5nQWRtaW4pCgoJdWFzc2VydC5Ob0Vycm9yKHQsIG5vbWluYXRlKGN1ciwgYiwgbm9taW5lZSkpCgl1YXNzZXJ0Lk5vRXJyb3IodCwgY2FuY2VsTm9tKGN1ciwgYikpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBiLlBlbmRpbmdBZG1pbigpLlN0cmluZygpKQoKCS8vIHRoZSB3aXRoZHJhd24gbm9taW5lZSBjYW4gbm8gbG9uZ2VyIGFjY2VwdAoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShub21pbmVlKSkKCXVhc3NlcnQuRXJyb3JJcyh0LCBhY2NlcHRBZG1pbihjdXIsIGIpLCBFcnJOb1BlbmRpbmdBZG1pbikKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW4uU3RyaW5nKCksIGIuQWRtaW4oKS5TdHJpbmcoKSkKfQoKZnVuYyBUZXN0UmVub21pbmF0aW9uUmVwbGFjZXNQZW5kaW5nKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluKSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgbm9taW5hdGUoY3VyLCBiLCBub21pbmVlKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBub21pbmF0ZShjdXIsIGIsIGJvYikpCgl1YXNzZXJ0LkVxdWFsKHQsIGJvYi5TdHJpbmcoKSwgYi5QZW5kaW5nQWRtaW4oKS5TdHJpbmcoKSkKCgkvLyB0aGUgc3VwZXJzZWRlZCBub21pbmVlIGNhbm5vdCBhY2NlcHQKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obm9taW5lZSkpCgl1YXNzZXJ0LkVycm9ySXModCwgYWNjZXB0QWRtaW4oY3VyLCBiKSwgRXJyTm90UGVuZGluZ0FkbWluKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBhY2NlcHRBZG1pbihjdXIsIGIpKQoJdWFzc2VydC5FcXVhbCh0LCBib2IuU3RyaW5nKCksIGIuQWRtaW4oKS5TdHJpbmcoKSkKfQoKZnVuYyBUZXN0Tm9taW5hdGVSZWplY3RzQmFkQWRkcmVzcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgoJdWFzc2VydC5FcnJvcklzKHQsIG5vbWluYXRlKGN1ciwgYiwgYWRkcmVzcygiIikpLCBFcnJJbnZhbGlkQWRkcmVzcykKCXVhc3NlcnQuRXJyb3JJcyh0LCBub21pbmF0ZShjdXIsIGIsIGFkZHJlc3MoImcxYm9ndXMiKSksIEVyckludmFsaWRBZGRyZXNzKQoJdWFzc2VydC5FcnJvcklzKHQsIG5vbWluYXRlKGN1ciwgYiwgYWRtaW4pLCBFcnJTYW1lQWRtaW4pCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBiLlBlbmRpbmdBZG1pbigpLlN0cmluZygpKQp9CgovLyAtLS0gcmVhZC1zaWRlIHF1ZXJpZXMgLS0tCgpmdW5jIFRlc3RQZXJtaXNzaW9uc09mQWRkcmVzcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgoJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4oYi5QZXJtaXNzaW9ucyhhbGljZSkpKQoKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJ3cml0ZSIsIGFsaWNlKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJhdWRpdCIsIGFsaWNlKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJyZWFkIiwgYWxpY2UpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgInJlYWQiLCBib2IpKQoKCWdvdCA6PSBiLlBlcm1pc3Npb25zKGFsaWNlKQoJdWFzc2VydC5FcXVhbCh0LCAzLCBsZW4oZ290KSkKCS8vIGxleGljb2dyYXBoaWMgb3JkZXIsIHdoaWNoIGlzIHdoYXQgbWFrZXMgcmVuZGVyZWQgb3V0cHV0IGRldGVybWluaXN0aWMKCXVhc3NlcnQuRXF1YWwodCwgImF1ZGl0IiwgZ290WzBdKQoJdWFzc2VydC5FcXVhbCh0LCAicmVhZCIsIGdvdFsxXSkKCXVhc3NlcnQuRXF1YWwodCwgIndyaXRlIiwgZ290WzJdKQoKCXVhc3NlcnQuRXF1YWwodCwgMSwgbGVuKGIuUGVybWlzc2lvbnMoYm9iKSkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGxlbihiLlBlcm1pc3Npb25zKG1hbGxvcnkpKSkKfQoKZnVuYyBUZXN0SGFzQW55KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluKSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzQW55KGFsaWNlKSkKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJyZWFkIiwgYWxpY2UpKQoJdWFzc2VydC5UcnVlKHQsIGIuSGFzQW55KGFsaWNlKSkKCXVhc3NlcnQuRmFsc2UodCwgYi5IYXNBbnkoYm9iKSkKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgcmV2b2tlKGN1ciwgYiwgInJlYWQiLCBhbGljZSkpCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzQW55KGFsaWNlKSkKfQoKZnVuYyBUZXN0UGVybWlzc2lvbk5hbWVzUGFnaW5hdGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhZG1pbikpCgliIDo9IG5ld0Jvb2sodCwgYWRtaW4pCgoJZm9yIF8sIHAgOj0gcmFuZ2UgW11zdHJpbmd7ImUiLCAiYSIsICJkIiwgImIiLCAiYyJ9IHsKCQl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCBwLCBhbGljZSkpCgl9CgoJYWxsIDo9IGIuUGVybWlzc2lvbk5hbWVzKDAsIDEwKQoJdWFzc2VydC5FcXVhbCh0LCA1LCBsZW4oYWxsKSkKCXVhc3NlcnQuRXF1YWwodCwgImEiLCBhbGxbMF0pCgl1YXNzZXJ0LkVxdWFsKHQsICJlIiwgYWxsWzRdKQoKCXBhZ2UgOj0gYi5QZXJtaXNzaW9uTmFtZXMoMSwgMikKCXVhc3NlcnQuRXF1YWwodCwgMiwgbGVuKHBhZ2UpKQoJdWFzc2VydC5FcXVhbCh0LCAiYiIsIHBhZ2VbMF0pCgl1YXNzZXJ0LkVxdWFsKHQsICJjIiwgcGFnZVsxXSkKCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGxlbihiLlBlcm1pc3Npb25OYW1lcygwLCAwKSkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGxlbihiLlBlcm1pc3Npb25OYW1lcygwLCAtMSkpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4oYi5QZXJtaXNzaW9uTmFtZXMoOTksIDUpKSkKfQoKZnVuYyBUZXN0SG9sZGVyc1BhZ2luYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4pKQoJYiA6PSBuZXdCb29rKHQsIGFkbWluKQoKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJyZWFkIiwgYWxpY2UpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgInJlYWQiLCBib2IpKQoJdWFzc2VydC5Ob0Vycm9yKHQsIGdyYW50KGN1ciwgYiwgInJlYWQiLCBtYWxsb3J5KSkKCglhbGwgOj0gYi5Ib2xkZXJzKCJyZWFkIiwgMCwgMTApCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIGxlbihhbGwpKQoKCXBhZ2UgOj0gYi5Ib2xkZXJzKCJyZWFkIiwgMCwgMikKCXVhc3NlcnQuRXF1YWwodCwgMiwgbGVuKHBhZ2UpKQoJLy8gc29ydGVkIG9yZGVyLCBzbyBwYWdlcyBkbyBub3Qgb3ZlcmxhcCBvciBza2lwCgl1YXNzZXJ0LlRydWUodCwgcGFnZVswXS5TdHJpbmcoKSA8IHBhZ2VbMV0uU3RyaW5nKCkpCgoJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4oYi5Ib2xkZXJzKCJyZWFkIiwgMCwgMCkpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4oYi5Ib2xkZXJzKCJub3BlIiwgMCwgMTApKSkKfQoKLy8gUXVlcmllcyBwZXJmb3JtIG5vIGF1dGhlbnRpY2F0aW9uIGF0IGFsbCDigJQgY29uc3VtZXItY29udHJhY3QgY2xhdXNlIDMuCi8vIEFueW9uZSBtYXkgcmVhZDsgdGhhdCBpcyBkZWxpYmVyYXRlIGFuZCBpcyBhc3NlcnRlZCBzbyBhIGZ1dHVyZSBjaGFuZ2UKLy8gdGhhdCBhZGRzIGEgZ2F0ZSBpcyBjYXVnaHQgYXMgYSBiZWhhdmlvcmFsIGJyZWFrLgpmdW5jIFRlc3RRdWVyaWVzQXJlVW5hdXRoZW50aWNhdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluKSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCXVhc3NlcnQuTm9FcnJvcih0LCBncmFudChjdXIsIGIsICJyZWFkIiwgYWxpY2UpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LlRydWUodCwgYi5IYXMoInJlYWQiLCBhbGljZSkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGIuSG9sZGVyQ291bnQoInJlYWQiKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgbGVuKGIuUGVybWlzc2lvbnMoYWxpY2UpKSkKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW4uU3RyaW5nKCksIGIuQWRtaW4oKS5TdHJpbmcoKSkKfQoKLy8gLS0tIHRoZSBncm91cHMgYmFzZSBzZXQgaXMgbmV2ZXIgdXNlZCAtLS0KCi8vIHBlcm1ib29rIG5ldmVyIHdyaXRlcyB0byB0aGUgR3JvdXAncyBiYXNlIGFkZHJlc3Mgc2V0LCBzbyAiaW4gdGhlIGJhc2UKLy8gc2V0IiBjYW4gbmV2ZXIgYmUgY29uZnVzZWQgd2l0aCAiaG9sZHMgYSBwZXJtaXNzaW9uIi4gSGFzQW55IGNvbnN1bHRzCi8vIGJhc2UgT1Igcm9sZXM7IGlmIGJhc2Ugd2VyZSBldmVyIHdyaXR0ZW4sIHRoaXMgd291bGQgcmVwb3J0IHRydWUuCmZ1bmMgVGVzdEJhc2VTZXRTdGF5c0VtcHR5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluKSkKCWIgOj0gbmV3Qm9vayh0LCBhZG1pbikKCgl1YXNzZXJ0Lk5vRXJyb3IodCwgZ3JhbnQoY3VyLCBiLCAicmVhZCIsIGFsaWNlKSkKCXVhc3NlcnQuTm9FcnJvcih0LCByZXZva2UoY3VyLCBiLCAicmVhZCIsIGFsaWNlKSkKCgkvLyB3aXRoIGV2ZXJ5IHJvbGUgZ29uZSwgSGFzQW55IGNhbiBvbmx5IGJlIHRydWUgdmlhIHRoZSBiYXNlIHNldAoJdWFzc2VydC5FcXVhbCh0LCAwLCBiLlBlcm1pc3Npb25Db3VudCgpKQoJdWFzc2VydC5GYWxzZSh0LCBiLkhhc0FueShhbGljZSkpCgl1YXNzZXJ0LkZhbHNlKHQsIGIuSGFzQW55KGFkbWluKSkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTE1MDAwMDAwdWdub3QSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQAjr0+8kUWZEJijPICGKpCYShr48zddDWXpTrTGXELzkCf0jmeNVLqbH8rl/+DQuDqaVq8gsGZA5hjbEa7+OUGoaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data