Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
C137B4BF81EE7C25E2B9C764053C92A1F1FF41ABEF403D53EE684F45256D8D16
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
23,215,755
Requested gas limit
GAS USED
19,346,492
Gas consumed
FEE
23216ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CqGQAQoML3ZtLm1fYWRkcGtnEo+QAQooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLhjwEKBmFjY2VzcxIcZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MRqxPAoJUkVBRE1FLm1kEqM8IyBBY2Nlc3MKCkNlbnRyYWxpemVkIHJvbGUtYmFzZWQgYWNjZXNzIGNvbnRyb2wgc3lzdGVtIGZvciBHbm9Td2FwIHByb3RvY29sIGNvbnRyYWN0cy4KCiMjIE92ZXJ2aWV3CgpUaGUgQWNjZXNzIHBhY2thZ2UgcHJvdmlkZXMgYSB1bmlmaWVkIHBlcm1pc3Npb24gbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGFsbCBHbm9Td2FwIHByb3RvY29sIGNvbnRyYWN0cy4gSXQgbWFuYWdlcyByb2xlLXRvLWFkZHJlc3MgbWFwcGluZ3MgYW5kIHByb3ZpZGVzIGNvbnZlbmllbnQgYXNzZXJ0aW9uIGZ1bmN0aW9ucyBmb3IgYXV0aG9yaXphdGlvbiBjaGVja3MgdGhyb3VnaG91dCB0aGUgcHJvdG9jb2wuCgpUaGlzIHBhY2thZ2UgYWN0cyBhcyBhIGNlbnRyYWxpemVkIHJlZ2lzdHJ5IHdoZXJlIHByb3RvY29sIGNvbXBvbmVudHMgYW5kIHVzZXItY29udHJvbGxlZCBhY2NvdW50cyBjYW4gYmUgYXNzaWduZWQgcm9sZSBhZGRyZXNzZXMuIE90aGVyIGNvbnRyYWN0cyBjYW4gdGhlbiBxdWVyeSB0aGlzIHJlZ2lzdHJ5IHRvIHZlcmlmeSBwZXJtaXNzaW9ucyBiZWZvcmUgZXhlY3V0aW5nIHByaXZpbGVnZWQgb3BlcmF0aW9ucy4KQWRtaW4gcm9sZSBvd25lcnNoaXAgaXMgbWFuYWdlZCBieSB0aGUgUkJBQyByZWFsbSBhbmQgaXMgdXBkYXRlZCBvbiBvd25lcnNoaXAgdHJhbnNmZXI7IHRoaXMgcGFja2FnZSBvbmx5IHN0b3JlcyB0aGUgbGF0ZXN0IHJvbGUgYWRkcmVzcy4KVGhlIGBhZG1pbmAgYW5kIGBkZXZvcHNgIHJvbGVzIGFyZSBpbml0aWFsaXplZCB3aXRoIHVzZXItY29udHJvbGxlZCBhZGRyZXNzZXMuIE1vc3Qgb3RoZXIgc3lzdGVtIHJvbGVzIHVzZSBkZXRlcm1pbmlzdGljIHBhY2thZ2UgYWRkcmVzc2VzLCB3aGlsZSBjdXN0b20gcm9sZXMgbWF5IHVzZSBhbnkgdmFsaWQgYWRkcmVzcy4KCiMjIEFyY2hpdGVjdHVyZQoKVGhlIGFjY2VzcyBjb250cm9sIHN5c3RlbSBjb25zaXN0cyBvZjoKCjEuICoqUm9sZSBSZWdpc3RyeSoqOiBNYXBzIHJvbGUgbmFtZXMgKHN0cmluZ3MpIHRvIHJvbGUgYWRkcmVzc2VzIChjb250cmFjdHMgb3IgYWNjb3VudHMpCjIuICoqUm9sZSBNYW5hZ2VtZW50Kio6IEZ1bmN0aW9ucyB0byBzZXQvcmVtb3ZlIHJvbGVzIChSQkFDLW9ubHkpCjMuICoqQXV0aG9yaXphdGlvbiBDaGVja3MqKjogRnVuY3Rpb25zIHRvIHZlcmlmeSBpZiBhbiBhZGRyZXNzIGhhcyBhIHNwZWNpZmljIHJvbGUKNC4gKipBc3NlcnQgSGVscGVycyoqOiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdGhhdCBwYW5pYyBvbiBhdXRob3JpemF0aW9uIGZhaWx1cmUKCiMjIFN5c3RlbSBSb2xlcwoKVGhlIGZvbGxvd2luZyByb2xlcyBhcmUgdXNlZCBhY3Jvc3MgdGhlIEdub1N3YXAgcHJvdG9jb2w6CgotICoqYWRtaW4qKjogUHJvdG9jb2wgYWRtaW5pc3RyYXRvciB3aXRoIGVsZXZhdGVkIHByaXZpbGVnZXMKLSAqKmRldm9wcyoqOiBEZXZPcHMgb3BlcmF0aW9ucyBmb3Igc3lzdGVtIG1haW50ZW5hbmNlCi0gKipnb3Zlcm5hbmNlKio6IEdvdmVybmFuY2UgY29udHJhY3QgZm9yIHByb3RvY29sIGRlY2lzaW9ucwotICoqcm91dGVyKio6IFN3YXAgcm91dGVyIGZvciB0b2tlbiBleGNoYW5nZXMKLSAqKnBvb2wqKjogUG9vbCBtYW5hZ2VtZW50IGNvbnRyYWN0Ci0gKipwb3NpdGlvbioqOiBQb3NpdGlvbiBORlQgbWFuYWdlbWVudAotICoqc3Rha2VyKio6IExpcXVpZGl0eSBzdGFraW5nIGNvbnRyYWN0Ci0gKiplbWlzc2lvbioqOiBHTlMgdG9rZW4gZW1pc3Npb24gY29udHJvbGxlcgotICoqcHJvdG9jb2xfZmVlKio6IFByb3RvY29sIGZlZSBjb2xsZWN0aW9uIGFuZCBkaXN0cmlidXRpb24KLSAqKmNvbW11bml0eV9wb29sKio6IENvbW11bml0eSB0cmVhc3VyeSBtYW5hZ2VtZW50Ci0gKipsYXVuY2hwYWQqKjogVG9rZW4gbGF1bmNocGFkIGZvciBuZXcgcHJvamVjdHMKLSAqKmdvdl9zdGFrZXIqKjogR292ZXJuYW5jZSBzdGFraW5nIGNvbnRyYWN0Ci0gKip4Z25zKio6IHhHTlMgdG9rZW4gY29udHJhY3QgZm9yIGdvdmVybmFuY2UKCiMjIEtleSBGdW5jdGlvbnMKCiMjIyBSb2xlIE1hbmFnZW1lbnQgKFJCQUMgT25seSkKCiMjIyMgYFNldFJvbGVBZGRyZXNzYAoKU2V0cyBvciB1cGRhdGVzIGEgcm9sZSdzIGFkZHJlc3MuIENyZWF0ZXMgbmV3IHJvbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KVGhlIGBhZG1pbmAgcm9sZSBpcyB1cGRhdGVkIGJ5IFJCQUMgb3duZXJzaGlwIHRyYW5zZmVycyBhbmQgc2hvdWxkIG5vdCBiZSBtYW5hZ2VkIGRpcmVjdGx5IGJ5IG90aGVyIGNvbnRyYWN0cy4KCmBgYGdvCi8vIE9ubHkgY2FsbGFibGUgYnkgUkJBQyBjb250cmFjdAphY2Nlc3MuU2V0Um9sZUFkZHJlc3MoY3Jvc3MoY3VyKSwgInJvdXRlciIsIHJvdXRlckFkZHJlc3MpCmBgYAoKIyMjIyBgUmVtb3ZlUm9sZWAKClJlbW92ZXMgYSByb2xlIGZyb20gdGhlIHN5c3RlbS4KCmBgYGdvCi8vIE9ubHkgY2FsbGFibGUgYnkgUkJBQyBjb250cmFjdAphY2Nlc3MuUmVtb3ZlUm9sZShjcm9zcyhjdXIpLCAib2xkX3JvbGUiKQpgYGAKCiMjIyBSb2xlIFF1ZXJ5IEZ1bmN0aW9ucwoKIyMjIyBgR2V0QWRkcmVzc2AKClJldHVybnMgdGhlIGFkZHJlc3MgZm9yIGEgcm9sZSBhbmQgd2hldGhlciBpdCBleGlzdHMuCgpgYGBnbwphZGRyLCBleGlzdHMgOj0gYWNjZXNzLkdldEFkZHJlc3MoInJvdXRlciIpCmlmICFleGlzdHMgewogICAgLy8gSGFuZGxlIG1pc3Npbmcgcm9sZQp9CmBgYAoKIyMjIyBgTXVzdEdldEFkZHJlc3NgCgpSZXR1cm5zIHRoZSBhZGRyZXNzIGZvciBhIHJvbGUgb3IgcGFuaWNzIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCgpgYGBnbwovLyBQYW5pY3MgaWYgcm9sZSBkb2Vzbid0IGV4aXN0CnJvdXRlckFkZHIgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKCJyb3V0ZXIiKQpgYGAKCiMjIyMgYEdldFJvbGVBZGRyZXNzZXNgCgpSZXR1cm5zIGEgY29weSBvZiBhbGwgcm9sZS10by1hZGRyZXNzIG1hcHBpbmdzLgoKYGBgZ28KYWxsUm9sZXMgOj0gYWNjZXNzLkdldFJvbGVBZGRyZXNzZXMoKQpmb3Igcm9sZU5hbWUsIGFkZHIgOj0gcmFuZ2UgYWxsUm9sZXMgewogICAgcHJpbnRsbihyb2xlTmFtZSwgIi0+IiwgYWRkcikKfQpgYGAKCiMjIyBBdXRob3JpemF0aW9uIEZ1bmN0aW9ucwoKIyMjIyBgSXNBdXRob3JpemVkYAoKQ2hlY2tzIGlmIGFuIGFkZHJlc3MgaGFzIGEgc3BlY2lmaWMgcm9sZSAobm9uLXBhbmlja2luZykuCgpgYGBnbwppZiBhY2Nlc3MuSXNBdXRob3JpemVkKCJhZG1pbiIsIGNhbGxlcikgewogICAgLy8gQ2FsbGVyIGlzIGFkbWluCn0KYGBgCgojIyMgQXNzZXJ0IEZ1bmN0aW9ucyAoUGFuaWMgb24gRmFpbHVyZSkKClRoZXNlIGZ1bmN0aW9ucyBwYW5pYyB3aXRoIGEgZGVzY3JpcHRpdmUgZXJyb3IgaWYgYXV0aG9yaXphdGlvbiBmYWlsczoKCiMjIyMgYEFzc2VydElzQWRtaW5gCgpSZXF1aXJlcyBhZG1pbiByb2xlLgoKYGBgZ28KYWNjZXNzLkFzc2VydElzQWRtaW4oY2FsbGVyKQpgYGAKCiMjIyMgYEFzc2VydElzR292ZXJuYW5jZWAKClJlcXVpcmVzIGdvdmVybmFuY2Ugcm9sZS4KCmBgYGdvCmFjY2Vzcy5Bc3NlcnRJc0dvdmVybmFuY2UoY2FsbGVyKQpgYGAKCiMjIyMgYEFzc2VydElzQWRtaW5PckdvdmVybmFuY2VgCgpSZXF1aXJlcyBlaXRoZXIgYWRtaW4gb3IgZ292ZXJuYW5jZSByb2xlLgoKYGBgZ28KYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UoY2FsbGVyKQpgYGAKCiMjIyMgUm9sZS1TcGVjaWZpYyBBc3NlcnRpb25zCgpgYGBnbwphY2Nlc3MuQXNzZXJ0SXNSb3V0ZXIoY2FsbGVyKQphY2Nlc3MuQXNzZXJ0SXNQb29sKGNhbGxlcikKYWNjZXNzLkFzc2VydElzUG9zaXRpb24oY2FsbGVyKQphY2Nlc3MuQXNzZXJ0SXNTdGFrZXIoY2FsbGVyKQphY2Nlc3MuQXNzZXJ0SXNFbWlzc2lvbihjYWxsZXIpCmFjY2Vzcy5Bc3NlcnRJc1Byb3RvY29sRmVlKGNhbGxlcikKYWNjZXNzLkFzc2VydElzTGF1bmNocGFkKGNhbGxlcikKYWNjZXNzLkFzc2VydElzR292U3Rha2VyKGNhbGxlcikKYWNjZXNzLkFzc2VydElzR292WEdOUyhjYWxsZXIpCmBgYAoKIyMjIyBgQXNzZXJ0SXNBdXRob3JpemVkYAoKR2VuZXJpYyBhdXRob3JpemF0aW9uIGNoZWNrIGZvciBhbnkgcm9sZS4KCmBgYGdvCmFjY2Vzcy5Bc3NlcnRJc0F1dGhvcml6ZWQoImN1c3RvbV9yb2xlIiwgY2FsbGVyKQpgYGAKCiMjIyMgYEFzc2VydEhhc0FueVJvbGVgCgpSZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgcm9sZXMuCgpgYGBnbwphY2Nlc3MuQXNzZXJ0SGFzQW55Um9sZShjYWxsZXIsICJhZG1pbiIsICJnb3Zlcm5hbmNlIiwgImRldm9wcyIpCmBgYAoKIyMjIFZhbGlkYXRpb24gRnVuY3Rpb25zCgojIyMjIGBBc3NlcnRJc1ZhbGlkQWRkcmVzc2AKClBhbmljcyBpZiB0aGUgYWRkcmVzcyBpcyBpbnZhbGlkLgoKYGBgZ28KYWNjZXNzLkFzc2VydElzVmFsaWRBZGRyZXNzKGFkZHIpCmBgYAoKIyMgVXNhZ2UgRXhhbXBsZXMKCiMjIyBFeGFtcGxlIDE6IFByb3RlY3RpbmcgQWRtaW4gRnVuY3Rpb25zCgpgYGBnbwpwYWNrYWdlIHBvb2wKCmltcG9ydCAiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCmZ1bmMgU2V0UG9vbEZlZVJhdGUoY3VyIHJlYWxtLCByYXRlIHVpbnQ2NCkgewogICAgY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQogICAgYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UoY2FsbGVyKQoKICAgIC8vIEFkbWluL2dvdmVybmFuY2UgYXV0aG9yaXplZCwgcHJvY2VlZAogICAgc2V0RmVlUmF0ZShyYXRlKQp9CmBgYAoKIyMjIEV4YW1wbGUgMjogUm9sZS1CYXNlZCBGdW5jdGlvbiBBY2Nlc3MKCmBgYGdvCnBhY2thZ2Ugc3Rha2VyCgppbXBvcnQgImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCgpmdW5jIERpc3RyaWJ1dGVSZXdhcmRzKGN1ciByZWFsbSwgYW1vdW50IHVpbnQ2NCkgewogICAgY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQogICAgYWNjZXNzLkFzc2VydElzRW1pc3Npb24oY2FsbGVyKQoKICAgIC8vIE9ubHkgZW1pc3Npb24gY29udHJhY3QgY2FuIGRpc3RyaWJ1dGUKICAgIGRpc3RyaWJ1dGVUb1N0YWtlcnMoYW1vdW50KQp9CmBgYAoKIyMjIEV4YW1wbGUgMzogTXVsdGktUm9sZSBBdXRob3JpemF0aW9uCgpgYGBnbwpwYWNrYWdlIGNvbW1vbgoKaW1wb3J0ICJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoKZnVuYyBFbWVyZ2VuY3lQYXVzZShjdXIgcmVhbG0pIHsKICAgIGNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKICAgIGFjY2Vzcy5Bc3NlcnRIYXNBbnlSb2xlKGNhbGxlciwgImFkbWluIiwgImRldm9wcyIsICJnb3Zlcm5hbmNlIikKCiAgICAvLyBBbnkgb2YgdGhlIGF1dGhvcml6ZWQgcm9sZXMgY2FuIHBhdXNlCiAgICBwYXVzZVByb3RvY29sKCkKfQpgYGAKCiMjIyBFeGFtcGxlIDQ6IE5vbi1QYW5pY2tpbmcgQXV0aG9yaXphdGlvbiBDaGVjawoKYGBgZ28KcGFja2FnZSByb3V0ZXIKCmltcG9ydCAiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKCmZ1bmMgR2V0U3dhcEZlZShjYWxsZXIgYWRkcmVzcykgdWludDY0IHsKICAgIC8vIExvd2VyIGZlZSBmb3IgYWRtaW4KICAgIGlmIGFjY2Vzcy5Jc0F1dGhvcml6ZWQoImFkbWluIiwgY2FsbGVyKSB7CiAgICAgICAgcmV0dXJuIDAgLy8gQWRtaW4gZ2V0cyBmcmVlIHN3YXBzCiAgICB9CgogICAgcmV0dXJuIHN0YW5kYXJkRmVlCn0KYGBgCgojIyBTZWN1cml0eSBNb2RlbAoKIyMjIENlbnRyYWxpemVkIE1hbmFnZW1lbnQKCi0gQWxsIHJvbGUgYXNzaWdubWVudHMgYXJlIG1hbmFnZWQgdGhyb3VnaCB0aGlzIHNpbmdsZSBjb250cmFjdAotIFByb3ZpZGVzIGEgdW5pZmllZCB2aWV3IG9mIHBlcm1pc3Npb25zIGFjcm9zcyB0aGUgZW50aXJlIHByb3RvY29sCi0gUHJldmVudHMgaW5jb25zaXN0ZW5jaWVzIGluIGF1dGhvcml6YXRpb24gbG9naWMKCiMjIyBSQkFDLU9ubHkgVXBkYXRlcwoKLSBPbmx5IHRoZSBSQkFDIGNvbnRyYWN0IGNhbiBtb2RpZnkgcm9sZSBhc3NpZ25tZW50cwotIFVzZXMgcGFja2FnZSBhZGRyZXNzIHZlcmlmaWNhdGlvbiB0byBlbmZvcmNlIHRoaXMgcmVzdHJpY3Rpb24KLSBQcmV2ZW50cyB1bmF1dGhvcml6ZWQgcm9sZSBtYW5pcHVsYXRpb24KCiMjIyBFeHBsaWNpdCBBdXRob3JpemF0aW9uCgotIEFsbCBhdXRob3JpemF0aW9uIGNoZWNrcyBhcmUgZXhwbGljaXQgYW5kIGF1ZGl0YWJsZQotIFBhbmljLWJhc2VkIGFzc2VydGlvbnMgbWFrZSBhdXRob3JpemF0aW9uIGZhaWx1cmVzIG9idmlvdXMKLSBObyBpbXBsaWNpdCBvciBkZWZhdWx0IHBlcm1pc3Npb25zCgojIyBJbnRlZ3JhdGlvbiB3aXRoIFJCQUMKClRoZSBBY2Nlc3MgY29udHJhY3Qgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUkJBQyAoUm9sZS1CYXNlZCBBY2Nlc3MgQ29udHJvbCkgcGFja2FnZToKCjEuICoqUkJBQyoqOiBNYW5hZ2VzIHJvbGUgZGVmaW5pdGlvbnMgYW5kIG93bmVyc2hpcCB0cmFuc2ZlcgoyLiAqKkFjY2VzcyoqOiBQcm92aWRlcyBjZW50cmFsaXplZCByb2xlLXRvLWFkZHJlc3MgcmVnaXN0cnkgYW5kIGF1dGhvcml6YXRpb24gY2hlY2tzCgpSb2xlIHVwZGF0ZXMgZmxvdzogYFJCQUMuVXBkYXRlUm9sZUFkZHJlc3MoKWAg4oaSIGBBY2Nlc3MuU2V0Um9sZUFkZHJlc3MoKWAKCiMjIEJlc3QgUHJhY3RpY2VzCgoxLiAqKlVzZSBBc3NlcnRpb25zIGZvciBDcml0aWNhbCBGdW5jdGlvbnMqKjogQWx3YXlzIHVzZSBhc3NlcnQgZnVuY3Rpb25zIGZvciBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG9ubHkgcHJvY2VlZCB3aXRoIHByb3BlciBhdXRob3JpemF0aW9uCjIuICoqQ2hlY2sgRXhpc3RlbmNlIEJlZm9yZSBVc2UqKjogVXNlIGBHZXRBZGRyZXNzYCB3aGVuIHlvdSBuZWVkIHRvIGhhbmRsZSBtaXNzaW5nIHJvbGVzIGdyYWNlZnVsbHkKMy4gKipEb2N1bWVudCBSb2xlIFJlcXVpcmVtZW50cyoqOiBDbGVhcmx5IGRvY3VtZW50IHdoaWNoIHJvbGVzIGFyZSByZXF1aXJlZCBmb3IgZWFjaCBmdW5jdGlvbgo0LiAqKkF2b2lkIEhhcmRjb2RpbmcgQWRkcmVzc2VzKio6IEFsd2F5cyB1c2Ugcm9sZS1iYXNlZCBjaGVja3MgaW5zdGVhZCBvZiBoYXJkY29kaW5nIGFkZHJlc3Nlcwo1LiAqKlRlc3QgQXV0aG9yaXphdGlvbioqOiBUaG9yb3VnaGx5IHRlc3QgYWxsIGF1dGhvcml6YXRpb24gcGF0aHMgaW4geW91ciBjb250cmFjdHMKCiMjIEVycm9yIEhhbmRsaW5nCgpBdXRob3JpemF0aW9uIGZhaWx1cmVzIHJlc3VsdCBpbiBwYW5pY3Mgd2l0aCBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlczoKCi0gYCJ1bmF1dGhvcml6ZWQ6IGNhbGxlciBYIGlzIG5vdCBZImAgLSBDYWxsZXIgZG9lc24ndCBoYXZlIHJlcXVpcmVkIHJvbGUKLSBgInJvbGUgWCBub3QgZm91bmQiYCAtIFJvbGUgbG9va3VwIGZhaWxlZCBiZWNhdXNlIHRoZSByb2xlIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkCi0gYCJyb2xlIFggZG9lcyBub3QgZXhpc3QiYCAtIGBSZW1vdmVSb2xlYCB3YXMgYXNrZWQgdG8gcmVtb3ZlIGFuIHVua25vd24gcm9sZQotIGAiaW52YWxpZCBhZGRyZXNzOiBYImAgLSBBZGRyZXNzIHZhbGlkYXRpb24gZmFpbGVkCgojIyBMaW1pdGF0aW9ucwoKLSBSb2xlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZSBzdHJpbmdzCi0gRWFjaCByb2xlIGNhbiBvbmx5IG1hcCB0byBvbmUgYWRkcmVzcyBhdCBhIHRpbWUKLSBSb2xlIGNoYW5nZXMgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkgKG5vIHRpbWVsb2NrKQoaoyAKCmFjY2Vzcy5nbm8SlCBwYWNrYWdlIGFjY2VzcwoKaW1wb3J0ICgKCSJjaGFpbiIKCSJzdHJpbmdzIgoKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKdmFyIHJvbGVBZGRyZXNzZXMgbWFwW3N0cmluZ11hZGRyZXNzCgpmdW5jIGluaXQoKSB7Cglyb2xlQWRkcmVzc2VzID0gbWFrZShtYXBbc3RyaW5nXWFkZHJlc3MpCn0KCi8vIFNldFJvbGVBZGRyZXNzIHNldHMgb3IgdXBkYXRlcyBhIHJvbGUncyBhZGRyZXNzLgovLyBJdCB0cmltcyBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlIGZyb20gcm9sZU5hbWUsIGNyZWF0ZXMgbWlzc2luZyByb2xlcywgYW5kCi8vIHJlcGxhY2VzIHRoZSBhZGRyZXNzIGZvciBhbiBleGlzdGluZyByb2xlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0KLy8gICAtIHJvbGVOYW1lOiByb2xlIGlkZW50aWZpZXI7IHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBhbmQgYW4gZW1wdHkgbmFtZSBwYW5pY3MKLy8gICAtIHJvbGVBZGRyZXNzOiBub24tZW1wdHksIHZhbGlkIGFkZHJlc3MgdG8gYXNzb2NpYXRlIHdpdGggcm9sZU5hbWUKLy8KLy8gT25seSBjYWxsYWJsZSBieSB0aGUgUkJBQyBjb250cmFjdC4KZnVuYyBTZXRSb2xlQWRkcmVzcyhjdXIgcmVhbG0sIHJvbGVOYW1lIHN0cmluZywgcm9sZUFkZHJlc3MgYWRkcmVzcykgewoJcHJldiA6PSBjdXIuUHJldmlvdXMoKQoJYXNzZXJ0SXNSQkFDKHByZXYuQWRkcmVzcygpKQoKCS8vIGNhcHR1cmUgb2xkIHZhbHVlIGZvciBldmVudAoJb2xkQWRkciwgXyA6PSByb2xlQWRkcmVzc2VzW3N0cmluZ3MuVHJpbVNwYWNlKHJvbGVOYW1lKV0KCglpZiBlcnIgOj0gc2V0Um9sZUFkZHJlc3Mocm9sZU5hbWUsIHJvbGVBZGRyZXNzKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWNoYWluLkVtaXQoCgkJIlNldFJvbGVBZGRyZXNzIiwKCQkicHJldkFkZHIiLCBwcmV2LkFkZHJlc3MoKS5TdHJpbmcoKSwKCQkicm9sZSIsIHJvbGVOYW1lLAoJCSJwcmV2Um9sZUFkZHIiLCBvbGRBZGRyLlN0cmluZygpLAoJCSJyb2xlQWRkcmVzcyIsIHJvbGVBZGRyZXNzLlN0cmluZygpLAoJKQp9CgovLyBzZXRSb2xlQWRkcmVzcyBpcyB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgU2V0Um9sZUFkZHJlc3MuCi8vIFNlcGFyYXRlZCBmb3IgdGVzdGFiaWxpdHkuCmZ1bmMgc2V0Um9sZUFkZHJlc3Mocm9sZU5hbWUgc3RyaW5nLCByb2xlQWRkcmVzcyBhZGRyZXNzKSBlcnJvciB7Cglyb2xlTmFtZSA9IHN0cmluZ3MuVHJpbVNwYWNlKHJvbGVOYW1lKQoJaWYgcm9sZU5hbWUgPT0gIiIgewoJCXBhbmljKCJyb2xlIG5hbWUgY2Fubm90IGJlIGVtcHR5IikKCX0KCgkvLyBWYWxpZGF0ZSBhZGRyZXNzCglpZiAhcm9sZUFkZHJlc3MuSXNWYWxpZCgpIHx8IHJvbGVBZGRyZXNzID09IGFkZHJlc3MoIiIpIHsKCQlyZXR1cm4gdWZtdC5FcnJvcmYoZXJySW52YWxpZEFkZHJlc3MsIHJvbGVOYW1lLCByb2xlQWRkcmVzcykKCX0KCglyb2xlQWRkcmVzc2VzW3JvbGVOYW1lXSA9IHJvbGVBZGRyZXNzCglyZXR1cm4gbmlsCn0KCi8vIFJlbW92ZVJvbGUgcmVtb3ZlcyBhIHJvbGUgZnJvbSB0aGUgc3lzdGVtIGFmdGVyIHRyaW1taW5nIGl0cyBuYW1lLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0KLy8gICAtIHJvbGVOYW1lOiByb2xlIGlkZW50aWZpZXIgdG8gdHJpbSBhbmQgcmVtb3ZlOyBhbiBlbXB0eSBvciB1bmtub3duIG5hbWUgcGFuaWNzCi8vCi8vIE9ubHkgY2FsbGFibGUgYnkgdGhlIFJCQUMgY29udHJhY3QuCmZ1bmMgUmVtb3ZlUm9sZShjdXIgcmVhbG0sIHJvbGVOYW1lIHN0cmluZykgewoJcHJldiA6PSBjdXIuUHJldmlvdXMoKQoJYXNzZXJ0SXNSQkFDKHByZXYuQWRkcmVzcygpKQoKCS8vIFZhbGlkYXRlIHJvbGUgbmFtZQoJcm9sZU5hbWUgPSBzdHJpbmdzLlRyaW1TcGFjZShyb2xlTmFtZSkKCWlmIHJvbGVOYW1lID09ICIiIHsKCQlwYW5pYygicm9sZSBuYW1lIGNhbm5vdCBiZSBlbXB0eSIpCgl9CgoJaWYgXywgb2sgOj0gcm9sZUFkZHJlc3Nlc1tyb2xlTmFtZV07ICFvayB7CgkJcGFuaWModWZtdC5FcnJvcmYoInJvbGUgJXMgZG9lcyBub3QgZXhpc3QiLCByb2xlTmFtZSkpCgl9CgoJZGVsZXRlKHJvbGVBZGRyZXNzZXMsIHJvbGVOYW1lKQoKCWNoYWluLkVtaXQoCgkJIlJlbW92ZVJvbGUiLAoJCSJwcmV2QWRkciIsIHByZXYuQWRkcmVzcygpLlN0cmluZygpLAoJCSJyb2xlIiwgcm9sZU5hbWUsCgkpCn0KCi8vIElzQXV0aG9yaXplZCByZXBvcnRzIHdoZXRoZXIgY2FsbGVyIGlzIHRoZSBhZGRyZXNzIGN1cnJlbnRseSBtYXBwZWQgdG8gcm9sZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJvbGU6IHJvbGUgbmFtZSB0byB0cmltIGFuZCBsb29rIHVwCi8vICAgLSBjYWxsZXI6IGFkZHJlc3MgdG8gY29tcGFyZSB3aXRoIHRoZSBtYXBwZWQgcm9sZSBhZGRyZXNzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhdXRob3JpemVkOiB0cnVlIHdoZW4gcm9sZSBleGlzdHMgYW5kIGNhbGxlciBtYXRjaGVzIGl0cyBhZGRyZXNzOyBmYWxzZSB3aGVuIHRoZSByb2xlIGlzIGFic2VudCBvciBkb2VzIG5vdCBtYXRjaApmdW5jIElzQXV0aG9yaXplZChyb2xlIHN0cmluZywgY2FsbGVyIGFkZHJlc3MpIGJvb2wgewoJYWRkciwgb2sgOj0gR2V0QWRkcmVzcyhyb2xlKQoJaWYgIW9rIHsKCQlyZXR1cm4gZmFsc2UKCX0KCglyZXR1cm4gY2FsbGVyID09IGFkZHIKfQoKLy8gR2V0QWRkcmVzcyByZXR1cm5zIHRoZSBhZGRyZXNzIG1hcHBlZCB0byBhIHJvbGUgYW5kIHdoZXRoZXIgdGhhdCBtYXBwaW5nIGV4aXN0cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJvbGU6IHJvbGUgbmFtZSB0byB0cmltIGJlZm9yZSBsb29rdXAKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFkZHI6IG1hcHBlZCBhZGRyZXNzLCBvciB0aGUgemVybyBhZGRyZXNzIHdoZW4gcm9sZSBpcyBub3QgcHJlc2VudAovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gcm9sZSBoYXMgYSBzdG9yZWQgYWRkcmVzczsgZmFsc2Ugb3RoZXJ3aXNlCmZ1bmMgR2V0QWRkcmVzcyhyb2xlIHN0cmluZykgKGFkZHJlc3MsIGJvb2wpIHsKCXJvbGUgPSBzdHJpbmdzLlRyaW1TcGFjZShyb2xlKQoJYWRkciwgb2sgOj0gcm9sZUFkZHJlc3Nlc1tyb2xlXQoJcmV0dXJuIGFkZHIsIG9rCn0KCi8vIEdldFJvbGVBZGRyZXNzZXMgcmV0dXJucyBhbiBpbmRlcGVuZGVudCBtYXAgY29weSBvZiBhbGwgc3RvcmVkIHJvbGUgYWRkcmVzc2VzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcm9sZUFkZHJlc3NlczogbWFwIGZyb20gbm9ybWFsaXplZCByb2xlIG5hbWVzIHRvIHRoZWlyIGNvbmZpZ3VyZWQgYWRkcmVzc2VzCmZ1bmMgR2V0Um9sZUFkZHJlc3NlcygpIG1hcFtzdHJpbmddYWRkcmVzcyB7CglhZGRyZXNzZXMgOj0gbWFrZShtYXBbc3RyaW5nXWFkZHJlc3MpCgoJZm9yIHJvbGUsIGRhdGEgOj0gcmFuZ2Ugcm9sZUFkZHJlc3NlcyB7CgkJYWRkcmVzc2VzW3JvbGVdID0gZGF0YQoJfQoKCXJldHVybiBhZGRyZXNzZXMKfQoKLy8gTXVzdEdldEFkZHJlc3MgcmV0dXJucyB0aGUgYWRkcmVzcyBtYXBwZWQgdG8gYSByb2xlIG9yIHBhbmljcyBpZiBpdCBpcyBhYnNlbnQuCi8vIFN1cnJvdW5kaW5nIHdoaXRlc3BhY2UgaXMgaWdub3JlZDsgYW4gZW1wdHkgb3IgdW5rbm93biByb2xlIGlzIGNvbnNpZGVyZWQgYWJzZW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm9sZTogcm9sZSBuYW1lIHRvIHRyaW0gYW5kIHJlcXVpcmUgaW4gdGhlIHJvbGUgbWFwcGluZwovLwovLyBSZXR1cm5zOgovLyAgIC0gYWRkcjogY29uZmlndXJlZCBhZGRyZXNzIGZvciByb2xlCmZ1bmMgTXVzdEdldEFkZHJlc3Mocm9sZSBzdHJpbmcpIGFkZHJlc3MgewoJcm9sZSA9IHN0cmluZ3MuVHJpbVNwYWNlKHJvbGUpCglhZGRyLCBvayA6PSBHZXRBZGRyZXNzKHJvbGUpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuRXJyb3JmKGVyclJvbGVOb3RGb3VuZCwgcm9sZSkpCgl9CgoJcmV0dXJuIGFkZHIKfQoasS0KCmFzc2VydC5nbm8Soi1wYWNrYWdlIGFjY2VzcwoKaW1wb3J0ICgKCSJjaGFpbiIKCglwcmJhYyAiZ25vLmxhbmQvcC9nbm9zd2FwL3JiYWMvdjEiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIHJiYWNQYWNrYWdlUGF0aCBpcyB0aGUgcGFja2FnZSBwYXRoIG9mIHRoZSBSQkFDIGNvbnRyYWN0Ci8vIFVzZWQgdG8gdmVyaWZ5IHRoYXQgcm9sZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBhcmUgY2FsbGVkIG9ubHkgYnkgUkJBQwpjb25zdCByYmFjUGFja2FnZVBhdGggPSAiZ25vLmxhbmQvci9nbm9zd2FwL3JiYWMvdjEiCgovLyBBc3NlcnRJc1JsbUN1cnJlbnQgcGFuaWNzIGlmIHRoZSByZWFsbSB0b2tlbiBpcyBub3QgdGhlIGN1cnJlbnQgY3Jvc3NpbmcgZnJhbWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKLy8gICAtIHJsbTogcmVhbG0gY29udGV4dCB0b2tlbiB0aGF0IG11c3QgcmVwcmVzZW50IHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lCmZ1bmMgQXNzZXJ0SXNSbG1DdXJyZW50KF8gaW50LCBybG0gcmVhbG0pIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXBhbmljKGVyclNwb29mZWRSZWFsbSkKCX0KfQoKLy8gQXNzZXJ0SXNBZG1pbk9yR292ZXJuYW5jZSBwYW5pY3MgdW5sZXNzIGNhbGxlciBpcyB0aGUgY29uZmlndXJlZCBhZG1pbiBvciBnb3Zlcm5hbmNlIGFkZHJlc3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjYWxsZXI6IGFkZHJlc3Mgd2hvc2UgYXV0aG9yaXphdGlvbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGFkbWluIGFuZCBnb3Zlcm5hbmNlIHJvbGVzCmZ1bmMgQXNzZXJ0SXNBZG1pbk9yR292ZXJuYW5jZShjYWxsZXIgYWRkcmVzcykgewoJaWYgSXNBdXRob3JpemVkKHByYmFjLlJPTEVfQURNSU4uU3RyaW5nKCksIGNhbGxlcikgfHwgSXNBdXRob3JpemVkKHByYmFjLlJPTEVfR09WRVJOQU5DRS5TdHJpbmcoKSwgY2FsbGVyKSB7CgkJcmV0dXJuCgl9CgoJcGFuaWModWZtdC5FcnJvcmYoZXJyVW5hdXRob3JpemVkQWRtaW5PckdvdiwgY2FsbGVyKSkKfQoKLy8gQXNzZXJ0SXNBZG1pbiBwYW5pY3MgdW5sZXNzIGNhbGxlciBpcyB0aGUgY29uZmlndXJlZCBhZG1pbiBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2FsbGVyOiBhZGRyZXNzIHdob3NlIGF1dGhvcml6YXRpb24gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBhZG1pbiByb2xlCmZ1bmMgQXNzZXJ0SXNBZG1pbihjYWxsZXIgYWRkcmVzcykgewoJQXNzZXJ0SXNBdXRob3JpemVkKHByYmFjLlJPTEVfQURNSU4uU3RyaW5nKCksIGNhbGxlcikKfQoKLy8gQXNzZXJ0SXNHb3Zlcm5hbmNlIHBhbmljcyB1bmxlc3MgY2FsbGVyIGlzIHRoZSBjb25maWd1cmVkIGdvdmVybmFuY2UgYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNhbGxlcjogYWRkcmVzcyB3aG9zZSBhdXRob3JpemF0aW9uIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgZ292ZXJuYW5jZSByb2xlCmZ1bmMgQXNzZXJ0SXNHb3Zlcm5hbmNlKGNhbGxlciBhZGRyZXNzKSB7CglBc3NlcnRJc0F1dGhvcml6ZWQocHJiYWMuUk9MRV9HT1ZFUk5BTkNFLlN0cmluZygpLCBjYWxsZXIpCn0KCi8vIEFzc2VydElzR292U3Rha2VyIHBhbmljcyB1bmxlc3MgY2FsbGVyIGlzIHRoZSBjb25maWd1cmVkIGdvdmVybmFuY2Utc3Rha2VyIGFkZHJlc3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjYWxsZXI6IGFkZHJlc3Mgd2hvc2UgYXV0aG9yaXphdGlvbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGdvdmVybmFuY2Utc3Rha2VyIHJvbGUKZnVuYyBBc3NlcnRJc0dvdlN0YWtlcihjYWxsZXIgYWRkcmVzcykgewoJQXNzZXJ0SXNBdXRob3JpemVkKHByYmFjLlJPTEVfR09WX1NUQUtFUi5TdHJpbmcoKSwgY2FsbGVyKQp9CgovLyBBc3NlcnRJc1JvdXRlciBwYW5pY3MgdW5sZXNzIGNhbGxlciBpcyB0aGUgY29uZmlndXJlZCByb3V0ZXIgYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNhbGxlcjogYWRkcmVzcyB3aG9zZSBhdXRob3JpemF0aW9uIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgcm91dGVyIHJvbGUKZnVuYyBBc3NlcnRJc1JvdXRlcihjYWxsZXIgYWRkcmVzcykgewoJQXNzZXJ0SXNBdXRob3JpemVkKHByYmFjLlJPTEVfUk9VVEVSLlN0cmluZygpLCBjYWxsZXIpCn0KCi8vIEFzc2VydElzUG9vbCBwYW5pY3MgdW5sZXNzIGNhbGxlciBpcyB0aGUgY29uZmlndXJlZCBwb29sIGFkZHJlc3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjYWxsZXI6IGFkZHJlc3Mgd2hvc2UgYXV0aG9yaXphdGlvbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIHBvb2wgcm9sZQpmdW5jIEFzc2VydElzUG9vbChjYWxsZXIgYWRkcmVzcykgewoJQXNzZXJ0SXNBdXRob3JpemVkKHByYmFjLlJPTEVfUE9PTC5TdHJpbmcoKSwgY2FsbGVyKQp9CgovLyBBc3NlcnRJc1Bvc2l0aW9uIHBhbmljcyB1bmxlc3MgY2FsbGVyIGlzIHRoZSBjb25maWd1cmVkIHBvc2l0aW9uIGFkZHJlc3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjYWxsZXI6IGFkZHJlc3Mgd2hvc2UgYXV0aG9yaXphdGlvbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIHBvc2l0aW9uIHJvbGUKZnVuYyBBc3NlcnRJc1Bvc2l0aW9uKGNhbGxlciBhZGRyZXNzKSB7CglBc3NlcnRJc0F1dGhvcml6ZWQocHJiYWMuUk9MRV9QT1NJVElPTi5TdHJpbmcoKSwgY2FsbGVyKQp9CgovLyBBc3NlcnRJc1N0YWtlciBwYW5pY3MgdW5sZXNzIGNhbGxlciBpcyB0aGUgY29uZmlndXJlZCBzdGFrZXIgYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNhbGxlcjogYWRkcmVzcyB3aG9zZSBhdXRob3JpemF0aW9uIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgc3Rha2VyIHJvbGUKZnVuYyBBc3NlcnRJc1N0YWtlcihjYWxsZXIgYWRkcmVzcykgewoJQXNzZXJ0SXNBdXRob3JpemVkKHByYmFjLlJPTEVfU1RBS0VSLlN0cmluZygpLCBjYWxsZXIpCn0KCi8vIEFzc2VydElzTGF1bmNocGFkIHBhbmljcyB1bmxlc3MgY2FsbGVyIGlzIHRoZSBjb25maWd1cmVkIGxhdW5jaHBhZCBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2FsbGVyOiBhZGRyZXNzIHdob3NlIGF1dGhvcml6YXRpb24gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBsYXVuY2hwYWQgcm9sZQpmdW5jIEFzc2VydElzTGF1bmNocGFkKGNhbGxlciBhZGRyZXNzKSB7CglBc3NlcnRJc0F1dGhvcml6ZWQocHJiYWMuUk9MRV9MQVVOQ0hQQUQuU3RyaW5nKCksIGNhbGxlcikKfQoKLy8gQXNzZXJ0SXNFbWlzc2lvbiBwYW5pY3MgdW5sZXNzIGNhbGxlciBpcyB0aGUgY29uZmlndXJlZCBlbWlzc2lvbiBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2FsbGVyOiBhZGRyZXNzIHdob3NlIGF1dGhvcml6YXRpb24gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBlbWlzc2lvbiByb2xlCmZ1bmMgQXNzZXJ0SXNFbWlzc2lvbihjYWxsZXIgYWRkcmVzcykgewoJQXNzZXJ0SXNBdXRob3JpemVkKHByYmFjLlJPTEVfRU1JU1NJT04uU3RyaW5nKCksIGNhbGxlcikKfQoKLy8gQXNzZXJ0SXNQcm90b2NvbEZlZSBwYW5pY3MgdW5sZXNzIGNhbGxlciBpcyB0aGUgY29uZmlndXJlZCBwcm90b2NvbC1mZWUgYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNhbGxlcjogYWRkcmVzcyB3aG9zZSBhdXRob3JpemF0aW9uIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJvdG9jb2wtZmVlIHJvbGUKZnVuYyBBc3NlcnRJc1Byb3RvY29sRmVlKGNhbGxlciBhZGRyZXNzKSB7CglBc3NlcnRJc0F1dGhvcml6ZWQocHJiYWMuUk9MRV9QUk9UT0NPTF9GRUUuU3RyaW5nKCksIGNhbGxlcikKfQoKLy8gQXNzZXJ0SXNHb3ZYR05TIHBhbmljcyB1bmxlc3MgY2FsbGVyIGlzIHRoZSBjb25maWd1cmVkIHhHTlMgZ292ZXJuYW5jZSBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2FsbGVyOiBhZGRyZXNzIHdob3NlIGF1dGhvcml6YXRpb24gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSB4R05TIGdvdmVybmFuY2Ugcm9sZQpmdW5jIEFzc2VydElzR292WEdOUyhjYWxsZXIgYWRkcmVzcykgewoJQXNzZXJ0SXNBdXRob3JpemVkKHByYmFjLlJPTEVfWEdOUy5TdHJpbmcoKSwgY2FsbGVyKQp9CgovLyBBc3NlcnRJc0F1dGhvcml6ZWQgcGFuaWNzIGlmIGNhbGxlciBkb2VzIG5vdCBoYXZlIHRoZSBzcGVjaWZpZWQgcm9sZSBvciBpZiB0aGUgcm9sZSBpcyBhYnNlbnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByb2xlTmFtZTogcm9sZSBpZGVudGlmaWVyIHdob3NlIGNvbmZpZ3VyZWQgYWRkcmVzcyBpcyByZXF1aXJlZAovLyAgIC0gY2FsbGVyOiBhZGRyZXNzIHRoYXQgbXVzdCBtYXRjaCB0aGUgY29uZmlndXJlZCBhZGRyZXNzIGZvciByb2xlTmFtZQpmdW5jIEFzc2VydElzQXV0aG9yaXplZChyb2xlTmFtZSBzdHJpbmcsIGNhbGxlciBhZGRyZXNzKSB7CglhZGRyLCBvayA6PSBHZXRBZGRyZXNzKHJvbGVOYW1lKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LkVycm9yZihlcnJSb2xlTm90Rm91bmQsIHJvbGVOYW1lKSkKCX0KCglpZiBjYWxsZXIgIT0gYWRkciB7CgkJcGFuaWModWZtdC5FcnJvcmYoZXJyVW5hdXRob3JpemVkLCBjYWxsZXIsIHJvbGVOYW1lKSkKCX0KfQoKLy8gQXNzZXJ0SGFzQW55Um9sZSBjaGVja3Mgcm9sZU5hbWVzIGluIG9yZGVyIGFuZCBwYW5pY3MgdW5sZXNzIGNhbGxlciBtYXRjaGVzIG9uZS4KLy8gSXQgcGFuaWNzIGltbWVkaWF0ZWx5IGlmIGEgY2hlY2tlZCByb2xlIGlzIGFic2VudCwgZXZlbiBpZiBhIGxhdGVyIHJvbGUgbWlnaHQgbWF0Y2guCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjYWxsZXI6IGFkZHJlc3MgY29tcGFyZWQgYWdhaW5zdCBlYWNoIGNvbmZpZ3VyZWQgcm9sZSBhZGRyZXNzCi8vICAgLSByb2xlTmFtZXM6IG9yZGVyZWQgcm9sZSBpZGVudGlmaWVycyB0byBjaGVjazsgZWFjaCBtaXNzaW5nIHJvbGUgY2F1c2VzIGEgcGFuaWMKZnVuYyBBc3NlcnRIYXNBbnlSb2xlKGNhbGxlciBhZGRyZXNzLCByb2xlTmFtZXMgLi4uc3RyaW5nKSB7Cglmb3IgXywgcm9sZU5hbWUgOj0gcmFuZ2Ugcm9sZU5hbWVzIHsKCQlhZGRyLCBvayA6PSBHZXRBZGRyZXNzKHJvbGVOYW1lKQoJCWlmICFvayB7CgkJCXBhbmljKHVmbXQuRXJyb3JmKGVyclJvbGVOb3RGb3VuZCwgcm9sZU5hbWUpKQoJCX0KCgkJaWYgY2FsbGVyID09IGFkZHIgewoJCQlyZXR1cm4KCQl9Cgl9CgoJcGFuaWModWZtdC5FcnJvcmYoZXJyVW5hdXRob3JpemVkQW55Um9sZSwgY2FsbGVyLCByb2xlTmFtZXMpKQp9CgovLyBBc3NlcnRJc1ZhbGlkQWRkcmVzcyBwYW5pY3MgaWYgYWRkciBpcyBub3QgYSB2YWxpZCBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYWRkcjogYWRkcmVzcyB2YWx1ZSB0byB2YWxpZGF0ZQpmdW5jIEFzc2VydElzVmFsaWRBZGRyZXNzKGFkZHIgYWRkcmVzcykgewoJaWYgIWFkZHIuSXNWYWxpZCgpIHsKCQlwYW5pYyh1Zm10LkVycm9yZihlcnJJbnZhbGlkQWRkcmVzc1Nob3J0LCBhZGRyKSkKCX0KfQoKLy8gYXNzZXJ0SXNSQkFDIHBhbmljcyBpZiB0aGUgY2FsbGVyIGlzIG5vdCB0aGUgUkJBQyBjb250cmFjdC4KLy8gVXNlZCBpbnRlcm5hbGx5IHRvIHByb3RlY3Qgcm9sZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KZnVuYyBhc3NlcnRJc1JCQUMoY2FsbGVyIGFkZHJlc3MpIHsKCXJiYWNBZGRyZXNzIDo9IGNoYWluLlBhY2thZ2VBZGRyZXNzKHJiYWNQYWNrYWdlUGF0aCkKCglpZiBjYWxsZXIgIT0gcmJhY0FkZHJlc3MgewoJCXBhbmljKHVmbXQuRXJyb3JmKGVyclVuYXV0aG9yaXplZFJCQUMsIGNhbGxlcikpCgl9Cn0KGsEECgplcnJvcnMuZ25vErIEcGFja2FnZSBhY2Nlc3MKCmNvbnN0ICgKCWVyclNwb29mZWRSZWFsbSAgICAgICAgICAgPSAicmxtIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IGNyb3NzaW5nIGZyYW1lIgoJZXJySW52YWxpZEFkZHJlc3MgICAgICAgICA9ICJpbnZhbGlkIGFkZHJlc3MgZm9yIHJvbGUgJXM6ICVzIgoJZXJyUm9sZU5vdEZvdW5kICAgICAgICAgICA9ICJyb2xlICVzIG5vdCBmb3VuZCIKCWVyclVuYXV0aG9yaXplZCAgICAgICAgICAgPSAidW5hdXRob3JpemVkOiBjYWxsZXIgJXMgaXMgbm90ICVzIgoJZXJyVW5hdXRob3JpemVkQWRtaW5PckdvdiA9ICJ1bmF1dGhvcml6ZWQ6IGNhbGxlciAlcyBpcyBub3QgYWRtaW4gb3IgZ292ZXJuYW5jZSIKCWVyclVuYXV0aG9yaXplZEFueVJvbGUgICAgPSAidW5hdXRob3JpemVkOiBjYWxsZXIgJXMgaXMgbm90IGFueSBvZiB0aGUgcm9sZXMgJXYiCgllcnJVbmF1dGhvcml6ZWRSQkFDICAgICAgID0gInVuYXV0aG9yaXplZDogY2FsbGVyICVzIGlzIG5vdCByYmFjIgoJZXJySW52YWxpZEFkZHJlc3NTaG9ydCAgICA9ICJpbnZhbGlkIGFkZHJlc3M6ICVzIgopChpDCgtnbm9tb2QudG9tbBI0bW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCmdubyA9ICIwLjkiCiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCJb6kRYSCjIzMjE2dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQACZptuBIxF2f5W7OIO+H0zN3qZntOnEU92QoxZnV9t3FkrnK38vG1CzYuYF/kNMwLl7mq5UiIRxLrgAn3lX6iMaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=