Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
A1EFDC02A46E132BF37311845360E0D62C5A898ADB246CBB1834513C720399C2
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
200,000,000
Requested gas limit
GAS USED
40,723,095
Gas consumed
FEE
200000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1t2kg2vtr3fukg43eujkn6x53gfdyakhngt4sfd25000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CsDtAQoML3ZtLm1fYWRkcGtnEq7tAQooZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZBLx7AEKBGdhbWUSQmduby5sYW5kL3IvZzF0MmtnMnZ0cjNmdWtnNDNldWprbjZ4NTNnZmR5YWtobmd0NHNmZC9nbm9mbHkvZ2FtZS92MBqEIgoJYWRtaW4uZ25vEvYhcGFja2FnZSBnYW1lCgppbXBvcnQgImNoYWluIgoKLy8gUm9sZXM6IG9uZSBvd25lciwgYSBzZXQgb2YgYWRtaW5zLCBhIHNldCBvZiByZWZlcmVlcy4KLy8KLy8gICAtIFRoZSBvd25lciBtYW5hZ2VzIHRoZSBhZG1pbnMgYW5kIHRoZSB0cmVhc3VyeSwgYW5kIGNhbiBoYW5kIHRoZSByZWFsbQovLyAgICAgb3Zlci4gVGhlIG93bmVyIGlzIGFsd2F5cyBhbiBhZG1pbi4KLy8gICAtIEFkbWlucyB0dW5lIHRoZSBnYW1lIGFuZCBtYW5hZ2UgdGhlIHJlZmVyZWVzLgovLyAgIC0gUmVmZXJlZXMgYXJlIHRoZSBnYW1lIHNlcnZlcnMuIFRoZXkgcmVjb3JkIGtpbGxzIGFuZCBub3RoaW5nIGVsc2UuCgovLyBjYWxsZXJPZiByZXR1cm5zIHRoZSB2ZXJpZmllZCBjYWxsZXIgb2YgYSBjcm9zc2luZyBmdW5jdGlvbi4gcmxtIG11c3QgYmUKLy8gdGhlIGN1ciBvZiB0aGUgY3Jvc3NpbmcgZnVuY3Rpb24gY2FsbGluZyB0aGlzIGhlbHBlcjogYSBzdGFsZSBvciBmb3JnZWQKLy8gcmVhbG0gdmFsdWUgZmFpbHMgSXNDdXJyZW50LCBhbmQgUHJldmlvdXMgaXMgb25seSBtZWFuaW5nZnVsIG9uIGEgbGl2ZSBvbmUuCi8vCi8vIEl0IHRha2VzIHRoZSByZWFsbSBpbiBzZWNvbmQgcG9zaXRpb24gb24gcHVycG9zZSwgbGlrZSBwL250L293bmFibGUgZG9lczoKLy8gYSBmdW5jdGlvbiB3aG9zZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSByZWFsbSBpcyBhIGNyb3NzaW5nIGZ1bmN0aW9uLgpmdW5jIGNhbGxlck9mKF8gaW50LCBybG0gcmVhbG0pIGFkZHJlc3MgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoJcmV0dXJuIHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKQp9CgovLyBhc3NlcnRPd25lciBwYW5pY3MgdW5sZXNzIHRoZSBjYWxsZXIgaXMgdGhlIG93bmVyLCBhbmQgcmV0dXJucyB0aGUgY2FsbGVyLgpmdW5jIGFzc2VydE93bmVyKF8gaW50LCBybG0gcmVhbG0pIGFkZHJlc3MgewoJY2FsbGVyIDo9IGNhbGxlck9mKDAsIHJsbSkKCWlmICFvd25lci5Pd25lZEJ5KGNhbGxlcikgewoJCXBhbmljKGVyck5vdE93bmVyKQoJfQoJcmV0dXJuIGNhbGxlcgp9CgovLyBhc3NlcnRBZG1pbiBwYW5pY3MgdW5sZXNzIHRoZSBjYWxsZXIgaXMgYW4gYWRtaW4sIGFuZCByZXR1cm5zIHRoZSBjYWxsZXIuCmZ1bmMgYXNzZXJ0QWRtaW4oXyBpbnQsIHJsbSByZWFsbSkgYWRkcmVzcyB7CgljYWxsZXIgOj0gY2FsbGVyT2YoMCwgcmxtKQoJaWYgIUlzQWRtaW4oY2FsbGVyKSB7CgkJcGFuaWMoZXJyTm90QWRtaW4pCgl9CglyZXR1cm4gY2FsbGVyCn0KCi8vIGFzc2VydFJlZmVyZWUgcGFuaWNzIHVubGVzcyB0aGUgY2FsbGVyIGlzIGEgcmVmZXJlZSwgYW5kIHJldHVybnMgdGhlIGNhbGxlci4KZnVuYyBhc3NlcnRSZWZlcmVlKF8gaW50LCBybG0gcmVhbG0pIGFkZHJlc3MgewoJY2FsbGVyIDo9IGNhbGxlck9mKDAsIHJsbSkKCWlmICFJc1JlZmVyZWUoY2FsbGVyKSB7CgkJcGFuaWMoZXJyTm90UmVmZXJlZSkKCX0KCXJldHVybiBjYWxsZXIKfQoKLy8gVHJhbnNmZXJPd25lcnNoaXAgaGFuZHMgdGhlIHJlYWxtIG92ZXIgdG8gbmV3T3duZXIuIE93bmVyIG9ubHkuCi8vCi8vIFRoZSBwcmV2aW91cyBvd25lciBrZWVwcyBubyBwcml2aWxlZ2UsIHVubGVzcyBpdCB3YXMgYWxzbyBhZGRlZCB0byB0aGUKLy8gYWRtaW4gb3IgcmVmZXJlZSBsaXN0cy4KZnVuYyBUcmFuc2Zlck93bmVyc2hpcChjdXIgcmVhbG0sIG5ld093bmVyIGFkZHJlc3MpIHsKCS8vIG93bmFibGUgY2hlY2tzIHRoZSBjYWxsZXIgYW5kIHRoZSBhZGRyZXNzLiBJdCB3b3VsZCB0YWtlIHRoZSBhZGRyZXNzCgkvLyB3cml0dGVuIGluIGNhcGl0YWxzIHRob3VnaCwgYW5kIGFuIG93bmVyIHVuZGVyIHRoYXQga2V5IGNvdWxkIG5ldmVyIGJlCgkvLyBtYXRjaGVkIHRvIGEgY2FsbGVyIGFnYWluOiBzZWUgdmFsaWRBZGRyZXNzLgoJaWYgbmV3T3duZXIuSXNWYWxpZCgpICYmICF2YWxpZEFkZHJlc3MobmV3T3duZXIpIHsKCQlwYW5pYyhlcnJJbnZhbGlkQWRkcmVzcykKCX0KCWlmIGVyciA6PSBvd25lci5UcmFuc2Zlck93bmVyc2hpcCgwLCBjdXIsIG5ld093bmVyKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJYnVtcCgpCn0KCi8vIEFkZEFkbWluIGFkZHMgYWRkciB0byB0aGUgYWRtaW4gbGlzdC4gT3duZXIgb25seS4KZnVuYyBBZGRBZG1pbihjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcykgewoJYXNzZXJ0T3duZXIoMCwgY3VyKQoJaWYgIXZhbGlkQWRkcmVzcyhhZGRyKSB7CgkJcGFuaWMoZXJySW52YWxpZEFkZHJlc3MpCgl9CglpZiBhZG1pbnMuU2V0KGFkZHIuU3RyaW5nKCksIG5pbCkgewoJCXBhbmljKGVyckFscmVhZHlBZG1pbikKCX0KCWJ1bXAoKQoJY2hhaW4uRW1pdCgiQWRtaW5BZGRlZCIsICJhZGRyZXNzIiwgYWRkci5TdHJpbmcoKSkKfQoKLy8gUmVtb3ZlQWRtaW4gcmVtb3ZlcyBhZGRyIGZyb20gdGhlIGFkbWluIGxpc3QuIE93bmVyIG9ubHkuCi8vCi8vIFRoZSBvd25lciBpcyBhbiBhZG1pbiBieSBkZWZpbml0aW9uIGFuZCBjYW5ub3QgYmUgZGVtb3RlZCB0aGlzIHdheSwgdXNlCi8vIFRyYW5zZmVyT3duZXJzaGlwLgpmdW5jIFJlbW92ZUFkbWluKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzKSB7Cglhc3NlcnRPd25lcigwLCBjdXIpCglpZiBfLCByZW1vdmVkIDo9IGFkbWlucy5SZW1vdmUoYWRkci5TdHJpbmcoKSk7ICFyZW1vdmVkIHsKCQlwYW5pYyhlcnJOb1N1Y2hBZG1pbikKCX0KCWJ1bXAoKQoJY2hhaW4uRW1pdCgiQWRtaW5SZW1vdmVkIiwgImFkZHJlc3MiLCBhZGRyLlN0cmluZygpKQp9CgovLyBTZXRUcmVhc3VyeSBzZXRzIHRoZSBhZGRyZXNzIHRoZSBzYWxlcyBvZiBza2lucyBhbmQgcGxhbmVzIGFyZSBmb3J3YXJkZWQKLy8gdG8uIE93bmVyIG9ubHkuCmZ1bmMgU2V0VHJlYXN1cnkoY3VyIHJlYWxtLCBhZGRyIGFkZHJlc3MpIHsKCWFzc2VydE93bmVyKDAsIGN1cikKCWlmICF2YWxpZEFkZHJlc3MoYWRkcikgewoJCXBhbmljKGVyckludmFsaWRBZGRyZXNzKQoJfQoJLy8gQ29pbnMgc2VudCB0byB0aGUgcmVhbG0ncyBvd24gYWRkcmVzcyB3b3VsZCBiZSBzdHVjazogbm90aGluZyBoZXJlCgkvLyBldmVyIHNwZW5kcyB0aGUgcmVhbG0gYmFsYW5jZS4KCWlmIGFkZHIgPT0gY3VyLkFkZHJlc3MoKSB7CgkJcGFuaWMoZXJyVHJlYXN1cnlTZWxmKQoJfQoJdHJlYXN1cnkgPSBhZGRyCglidW1wKCkKCWNoYWluLkVtaXQoIlRyZWFzdXJ5U2V0IiwgImFkZHJlc3MiLCBhZGRyLlN0cmluZygpKQp9CgovLyBBZGRSZWZlcmVlIGFsbG93cyBhZGRyIHRvIHN1Ym1pdCBraWxscy4gQWRtaW4gb25seS4KZnVuYyBBZGRSZWZlcmVlKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzKSB7Cglhc3NlcnRBZG1pbigwLCBjdXIpCglpZiAhdmFsaWRBZGRyZXNzKGFkZHIpIHsKCQlwYW5pYyhlcnJJbnZhbGlkQWRkcmVzcykKCX0KCWlmIHJlZmVyZWVzLlNldChhZGRyLlN0cmluZygpLCBuaWwpIHsKCQlwYW5pYyhlcnJBbHJlYWR5UmVmZXJlZSkKCX0KCWJ1bXAoKQoJY2hhaW4uRW1pdCgiUmVmZXJlZUFkZGVkIiwgImFkZHJlc3MiLCBhZGRyLlN0cmluZygpKQp9CgovLyBSZW1vdmVSZWZlcmVlIHN0b3BzIGFkZHIgZnJvbSBzdWJtaXR0aW5nIGtpbGxzLiBBZG1pbiBvbmx5LgpmdW5jIFJlbW92ZVJlZmVyZWUoY3VyIHJlYWxtLCBhZGRyIGFkZHJlc3MpIHsKCWFzc2VydEFkbWluKDAsIGN1cikKCWlmIF8sIHJlbW92ZWQgOj0gcmVmZXJlZXMuUmVtb3ZlKGFkZHIuU3RyaW5nKCkpOyAhcmVtb3ZlZCB7CgkJcGFuaWMoZXJyTm9TdWNoUmVmZXJlZSkKCX0KCWJ1bXAoKQoJY2hhaW4uRW1pdCgiUmVmZXJlZVJlbW92ZWQiLCAiYWRkcmVzcyIsIGFkZHIuU3RyaW5nKCkpCn0KCi8vIE93bmVyIHJldHVybnMgdGhlIG93bmVyIG9mIHRoZSByZWFsbS4KZnVuYyBPd25lcigpIGFkZHJlc3MgewoJcmV0dXJuIG93bmVyLk93bmVyKCkKfQoKLy8gVHJlYXN1cnkgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGUgc2FsZXMgb2Ygc2tpbnMgYW5kIHBsYW5lcyBhcmUgZm9yd2FyZGVkCi8vIHRvLgpmdW5jIFRyZWFzdXJ5KCkgYWRkcmVzcyB7CglyZXR1cm4gdHJlYXN1cnkKfQoKLy8gSXNBZG1pbiByZXBvcnRzIHdoZXRoZXIgYWRkciBpcyBhbiBhZG1pbi4gVGhlIG93bmVyIGFsd2F5cyBpcy4KZnVuYyBJc0FkbWluKGFkZHIgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gb3duZXIuT3duZWRCeShhZGRyKSB8fCBhZG1pbnMuSGFzKGFkZHIuU3RyaW5nKCkpCn0KCi8vIElzUmVmZXJlZSByZXBvcnRzIHdoZXRoZXIgYWRkciBtYXkgc3VibWl0IGtpbGxzLgpmdW5jIElzUmVmZXJlZShhZGRyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIHJlZmVyZWVzLkhhcyhhZGRyLlN0cmluZygpKQp9Chq6CQoHZG9jLmdubxKuCS8vIHYwIC0gVW5hdWRpdGVkOiBUaGlzIGlzIGFuIGluaXRpYWwgdmVyc2lvbiB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZm9ybWFsbHkgYXVkaXRlZC4KLy8gVXNlIGluIHByb2R1Y3Rpb24gYXQgeW91ciBvd24gcmlzay4KLy8KLy8gUGFja2FnZSBnYW1lIGlzIHRoZSBvbi1jaGFpbiBwYXJ0IG9mIGdub2ZseSwgYSBtdWx0aXBsYXllciBwbGFuZSBnYW1lLiBJdCBpcwovLyB0aGUgc291cmNlIG9mIHRydXRoIGZvciBldmVyeXRoaW5nIGFuIGFkbWluIGNhbiB0dW5lOiB0aGUgZ2FtZSBwYXJhbWV0ZXJzLAovLyB0aGUgcm9sZXMgYW5kIHRoZSB0cmVhc3VyeS4gSXQgYWxzbyBrZWVwcyB3aGF0IHRoZSByZWZlcmVlIGF0dGVzdHMgYW5kIHdoYXQKLy8gaGFzIGxhc3RpbmcgdmFsdWU6IHRoZSBraWxscywgb24gdGhlIGtpbGwgbGVhZGVyYm9hcmQuIFNraW5zIGFuZCBwbGFuZXMgYXJlCi8vIHRva2VucyBvZiB0aGVpciBvd24gcmVhbG1zLCBnbm9mbHkvbmZ0cy9za2lucyBhbmQgZ25vZmx5L25mdHMvcGxhbmVzLCB3aGljaAovLyBhc2sgdGhpcyBvbmUgd2hvIHRoZSBhZG1pbnMgYXJlIGFuZCB3aGVyZSB0aGUgdHJlYXN1cnkgaXMuCi8vCi8vIFRocmVlIGtpbmRzIG9mIGNhbGxlcnMgd3JpdGUgdG8gaXQ6Ci8vCi8vICAgLSB0aGUgb3duZXIgYW5kIHRoZSBhZG1pbnMgdHVuZSB0aGUgZ2FtZSAoU2V0UGFyYW0sIC4uLikuIEV2ZXJ5IHN1Y2gKLy8gICAgIHdyaXRlIGJ1bXBzIFZlcnNpb24sIHdoaWNoIGlzIGhvdyB0aGUgZ2FtZSBzZXJ2ZXIga25vd3MgaXQgaGFzIHRvIHJlYWQKLy8gICAgIFN0YXRlSlNPTiBhZ2FpbjsKLy8gICAtIHJlZmVyZWVzLCB0aGUgZ2FtZSBzZXJ2ZXJzLCByZWNvcmQga2lsbHMgKFN1Ym1pdEtpbGxzKS4KLy8KLy8gQ2hhbGxlbmdlIHJ1bnMgbmV2ZXIgcmVhY2ggdGhlIGNoYWluOiB0aGUgZ2FtZSBzZXJ2ZXIgZGVmaW5lcyB0aGUKLy8gY2hhbGxlbmdlcywgc2NvcmVzIHRoZSBydW5zIGFuZCBrZWVwcyB0aGUgc2Vzc2lvbiBib2FyZHMuCi8vCi8vIFJlYWRzIGFyZSBwbGFpbiBmdW5jdGlvbnMgbWVhbnQgZm9yIHZtL3FldmFsLiBUaGUgb25lcyBlbmRpbmcgaW4gSlNPTgovLyByZXR1cm4gYSBzaW5nbGUgc3RyaW5nIGhvbGRpbmcgYSBKU09OIGRvY3VtZW50LiBSZW5kZXIgZXhwb3NlcyB0aGUgc2FtZQovLyBkYXRhIGFzIG1hcmtkb3duIGZvciBnbm93ZWIuCnBhY2thZ2UgZ2FtZQoarQgKCmVycm9ycy5nbm8SnghwYWNrYWdlIGdhbWUKCmltcG9ydCAiZXJyb3JzIgoKdmFyICgKCWVyclNwb29mZWRSZWFsbSAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiBzcG9vZmVkIHJlYWxtIikKCWVyck5vdE93bmVyICAgICAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiBjYWxsZXIgaXMgbm90IHRoZSBvd25lciIpCgllcnJOb3RBZG1pbiAgICAgICA9IGVycm9ycy5OZXcoImdub2ZseTogY2FsbGVyIGlzIG5vdCBhbiBhZG1pbiIpCgllcnJOb3RSZWZlcmVlICAgICA9IGVycm9ycy5OZXcoImdub2ZseTogY2FsbGVyIGlzIG5vdCBhIHJlZmVyZWUiKQoJZXJySW52YWxpZEFkZHJlc3MgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IGludmFsaWQgYWRkcmVzcyIpCgllcnJBbHJlYWR5QWRtaW4gICA9IGVycm9ycy5OZXcoImdub2ZseTogYWRkcmVzcyBpcyBhbHJlYWR5IGFuIGFkbWluIikKCWVyck5vU3VjaEFkbWluICAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiBhZGRyZXNzIGlzIG5vdCBpbiB0aGUgYWRtaW4gbGlzdCIpCgllcnJBbHJlYWR5UmVmZXJlZSA9IGVycm9ycy5OZXcoImdub2ZseTogYWRkcmVzcyBpcyBhbHJlYWR5IGEgcmVmZXJlZSIpCgllcnJOb1N1Y2hSZWZlcmVlICA9IGVycm9ycy5OZXcoImdub2ZseTogYWRkcmVzcyBpcyBub3QgYSByZWZlcmVlIikKCWVyclRyZWFzdXJ5U2VsZiAgID0gZXJyb3JzLk5ldygiZ25vZmx5OiB0aGUgdHJlYXN1cnkgY2Fubm90IGJlIHRoZSByZWFsbSBpdHNlbGYiKQoKCWVyclVua25vd25QYXJhbSAgICAgPSBlcnJvcnMuTmV3KCJnbm9mbHk6IHVua25vd24gcGFyYW0iKQoJZXJySW52YWxpZEJvdW5kcyAgICA9IGVycm9ycy5OZXcoImdub2ZseTogYm91bmRzIG11c3Qgc2F0aXNmeSAwIDw9IG1pbiA8PSBtYXgiKQoJZXJyVmFsdWVPdXRPZkJvdW5kcyA9IGVycm9ycy5OZXcoImdub2ZseTogdGhlIGN1cnJlbnQgdmFsdWUgaXMgb3V0c2lkZSB0aGVzZSBib3VuZHMsIHNldCB0aGUgdmFsdWUgZmlyc3QiKQoJZXJyTGVhZGVyYm9hcmRNaW4gICA9IGVycm9ycy5OZXcoImdub2ZseTogbGVhZGVyYm9hcmRfc2l6ZSBjYW5ub3QgZ28gYmVsb3cgMSIpCikKGvwTCghnYW1lLmdubxLvE3BhY2thZ2UgZ2FtZQoKaW1wb3J0ICgKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCSJnbm8ubGFuZC9wL250L293bmFibGUvdjAiCikKCi8vIFRoZSB3aG9sZSBzdGF0ZSBvZiB0aGUgcmVhbG0uIEV2ZXJ5dGhpbmcgaXMgdW5leHBvcnRlZCBhbmQgbm90aGluZyBiZWxvdyBpcwovLyBldmVyIHJldHVybmVkIGJ5IHJlZmVyZW5jZTogdGhlIHRyZWVzIGFuZCB0aGUgb3duYWJsZSBhcmUgL3AvIHR5cGVzIHdpdGgKLy8gbXV0YXRvciBtZXRob2RzLCBzbyBoYW5kaW5nIG9uZSBvdXQgd291bGQgYmUgaGFuZGluZyBvdXQgd3JpdGUgYWNjZXNzIHRvCi8vIHRoZSByZWFsbS4KdmFyICgKCW93bmVyICAgICpvd25hYmxlLk93bmFibGUgLy8gdGhlIHNpbmdsZSBvd25lciwgYWx3YXlzIGFuIGFkbWluCglhZG1pbnMgICBicHRyZWUuQlBUcmVlICAgIC8vIGV4dHJhIGFkbWlucywgbWFuYWdlZCBieSB0aGUgb3duZXI6IGFkZHJlc3MgLT4gbmlsCglyZWZlcmVlcyBicHRyZWUuQlBUcmVlICAgIC8vIGdhbWUgc2VydmVycyBhbGxvd2VkIHRvIHN1Ym1pdCBraWxsczogYWRkcmVzcyAtPiBuaWwKCXRyZWFzdXJ5IGFkZHJlc3MgICAgICAgICAgLy8gd2hlcmUgdGhlIHNhbGVzIG9mIHRoZSBza2lucyBhbmQgcGxhbmVzIHJlYWxtcyBnbwoKCXZlcnNpb24gaW50NjQgLy8gYnVtcHMgb24gZXZlcnkgYWRtaW4gd3JpdGUsIHNlZSBWZXJzaW9uCgoJcGFyYW1zIFtdKnBhcmFtICAgICAgLy8gZml4ZWQgcmVnaXN0cnksIGluIGRpc3BsYXkgb3JkZXIKCXBpbG90cyBicHRyZWUuQlBUcmVlIC8vIHBsYXllciBhZGRyZXNzIC0+IGludDY0IGtpbGxzLCBhbGxvY2F0ZWQgYXQgdGhlIGZpcnN0IGtpbGwKCglraWxsZXJzIHJhbmtpbmcgLy8gdGhlIHRvcCBwbGF5ZXJzIGJ5IGtpbGxzIHJlY29yZGVkIG9uLWNoYWluLCBzZWUgcmFua2luZ3MuZ25vCgoJd2ViUGF0aCBzdHJpbmcgLy8gIi9yL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L2dhbWUvdjAiLCB1c2VkIHRvIGJ1aWxkIGxpbmtzIGluIFJlbmRlcgopCgovLyBpbml0IHJ1bnMgb25jZSwgd2hlbiB0aGUgcGFja2FnZSBpcyBhZGRlZCB0byB0aGUgY2hhaW4uIFRoaXMgaXMgdGhlIG9ubHkKLy8gbW9tZW50IGN1ci5QcmV2aW91cygpIGlzIHRoZSBkZXBsb3llciwgc28gaXQgaXMgcmVjb3JkZWQgaGVyZTogdGhlIGRlcGxveWVyCi8vIHN0YXJ0cyBhcyBvd25lciwgcmVmZXJlZSBhbmQgdHJlYXN1cnkuCi8vCi8vIFVuZGVyIGBnbm8gdGVzdGAgdGhlcmUgaXMgbm8gZGVwbG95ZXIgYW5kIHRoZSBhZGRyZXNzIGlzIGVtcHR5LiBUaGUgdGVzdHMKLy8gY2FsbCBib290c3RyYXAgdGhlbXNlbHZlcyB3aXRoIGEgcmVhbCBhZGRyZXNzLgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7Cglib290c3RyYXAoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLCBjdXIuUGtnUGF0aCgpKQp9CgovLyBib290c3RyYXAgKHJlKWNyZWF0ZXMgdGhlIGluaXRpYWwgc3RhdGU6IHJvbGVzIGFuZCBwYXJhbXMuCmZ1bmMgYm9vdHN0cmFwKGRlcGxveWVyIGFkZHJlc3MsIHBrZ1BhdGggc3RyaW5nKSB7Cglvd25lciA9IG93bmFibGUuTmV3V2l0aEFkZHJlc3MoZGVwbG95ZXIpCglhZG1pbnMgPSBicHRyZWUuQlBUcmVle30KCXJlZmVyZWVzID0gYnB0cmVlLkJQVHJlZXt9CglyZWZlcmVlcy5TZXQoZGVwbG95ZXIuU3RyaW5nKCksIG5pbCkKCXRyZWFzdXJ5ID0gZGVwbG95ZXIKCglwYXJhbXMgPSBkZWZhdWx0UGFyYW1zKCkKCXBpbG90cyA9IGJwdHJlZS5CUFRyZWV7fQoJa2lsbGVycyA9IHJhbmtpbmd7fQoJd2ViUGF0aCA9IHdlYlBhdGhPZihwa2dQYXRoKQoKCXZlcnNpb24gPSAxCn0KCi8vIFZlcnNpb24gcmV0dXJucyBhIGNvdW50ZXIgdGhhdCBidW1wcyBvbiBldmVyeSBhZG1pbiB3cml0ZTogcGFyYW1zLAovLyB0cmVhc3VyeSBhbmQgcm9sZXMuIFJlZmVyZWUgYWN0aW9ucyAoa2lsbHMpIGRvIG5vdCBidW1wIGl0LiBBIHJlYWRlciB0aGF0IGNhY2hlZCBTdGF0ZUpTT04gb25seSBoYXMgdG8gcmVhZCBpdAovLyBhZ2FpbiB3aGVuIFZlcnNpb24gY2hhbmdlZC4KZnVuYyBWZXJzaW9uKCkgaW50NjQgewoJcmV0dXJuIHZlcnNpb24KfQoKLy8gYnVtcCBtYXJrcyB0aGUgYWRtaW4tdHVuYWJsZSBzdGF0ZSBhcyBjaGFuZ2VkLgpmdW5jIGJ1bXAoKSB7Cgl2ZXJzaW9uKysKfQoKLy8gd2ViUGF0aE9mIHR1cm5zICJnbm8ubGFuZC9yL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L2dhbWUvdjAiIGludG8gIi9yL2cxdDJrZzJ2dHIzZnVrZzQzZXVqa242eDUzZ2ZkeWFraG5ndDRzZmQvZ25vZmx5L2dhbWUvdjAiLgpmdW5jIHdlYlBhdGhPZihwa2dQYXRoIHN0cmluZykgc3RyaW5nIHsKCWZvciBpIDo9IDA7IGkgPCBsZW4ocGtnUGF0aCk7IGkrKyB7CgkJaWYgcGtnUGF0aFtpXSA9PSAnLycgewoJCQlyZXR1cm4gcGtnUGF0aFtpOl0KCQl9Cgl9CglyZXR1cm4gIiIKfQoKZnVuYyBpdG9hKG4gaW50NjQpIHN0cmluZyB7CglyZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQobiwgMTApCn0KGmkKC2dub21vZC50b21sElptb2R1bGUgPSAiZ25vLmxhbmQvci9nMXQya2cydnRyM2Z1a2c0M2V1amtuNng1M2dmZHlha2huZ3Q0c2ZkL2dub2ZseS9nYW1lL3YwIgpnbm8gPSAiMC45IgoapxUKCGpzb24uZ25vEpoVcGFja2FnZSBnYW1lCgppbXBvcnQgInN0cmluZ3MiCgovLyBUaGUgSlNPTiBkb2N1bWVudHMgYXJlIGJ1aWx0IGJ5IGhhbmQuIFRoYXQgaXMgc2FmZSBiZWNhdXNlIGV2ZXJ5IHN0cmluZwovLyB0aGF0IHJlYWNoZXMgdGhlbSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgYSBKU09OLXNhZmUgY2hhcnNldCB3aGVuIGl0IHdhcwovLyB3cml0dGVuIChzZWUgdmFsaWRhdGUuZ25vKTogaWRzLCBuYW1lcywgbW9kZWxzLCBjb2xvcnMgYW5kIGJlY2gzMiBhZGRyZXNzZXMKLy8gbmVlZCBubyBlc2NhcGluZy4gVGhlIG9uZSBzdHJpbmcgdGhhdCBpcyBub3QgdW5kZXIgdGhlIHJlYWxtJ3MgY29udHJvbCwgYW4KLy8gYWRkcmVzcyB0eXBlZCBpbnRvIGEgcXVlcnksIGdvZXMgdGhyb3VnaCBxdW90ZS4KLy8KLy8gT3JkZXJpbmcgaXMgZGV0ZXJtaW5pc3RpYyBldmVyeXdoZXJlOiBwYXJhbXMgZm9sbG93IHRoZSByZWdpc3RyeSBhbmQgdGhlCi8vIGxlYWRlcmJvYXJkIGlzIGJlc3QgZmlyc3QuCgovLyBTdGF0ZUpTT04gcmV0dXJucyBldmVyeXRoaW5nIHRoZSBnYW1lIG5lZWRzIGZyb20gdGhlIGNoYWluLCBhcyBvbmUgSlNPTgovLyBvYmplY3Q6Ci8vCi8vCXsKLy8JICAidmVyc2lvbiI6IDEyLAovLwkgICJ0cmVhc3VyeSI6ICJnMS4uLiIsCi8vCSAgInBhcmFtcyI6IHsgInBsYW5lX3NwZWVkIjogNzAsICJib29zdF9zcGVlZCI6IDEzMCB9Ci8vCX0KLy8KLy8gVGhlIG91dHB1dCBoYXMgbm8gd2hpdGVzcGFjZS4gSXQgb25seSBjaGFuZ2VzIHdoZW4gVmVyc2lvbiBkb2VzLiBUaGUgc2tpbnMKLy8gYXJlIGluIHRoZWlyIG93biByZWFsbSwgZ25vZmx5L25mdHMvc2tpbnMuCmZ1bmMgU3RhdGVKU09OKCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoKCWIuV3JpdGVTdHJpbmcoYHsidmVyc2lvbiI6YCkKCWIuV3JpdGVTdHJpbmcoaXRvYSh2ZXJzaW9uKSkKCWIuV3JpdGVTdHJpbmcoYCwidHJlYXN1cnkiOiJgKQoJYi5Xcml0ZVN0cmluZyh0cmVhc3VyeS5TdHJpbmcoKSkKCgliLldyaXRlU3RyaW5nKGAiLCJwYXJhbXMiOntgKQoJZm9yIGksIHAgOj0gcmFuZ2UgcGFyYW1zIHsKCQlpZiBpID4gMCB7CgkJCWIuV3JpdGVCeXRlKCcsJykKCQl9CgkJYi5Xcml0ZUJ5dGUoJyInKQoJCWIuV3JpdGVTdHJpbmcocC5rZXkpCgkJYi5Xcml0ZVN0cmluZyhgIjpgKQoJCWIuV3JpdGVTdHJpbmcoaXRvYShwLnZhbHVlKSkKCX0KCgliLldyaXRlU3RyaW5nKGB9fWApCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBQbGF5ZXJKU09OIHJldHVybnMgb25lIHBsYXllciBhcyBhIEpTT04gb2JqZWN0OgovLwovLwl7ICJhZGRyZXNzIjogImcxLi4uIiwgImtpbGxzIjogMTcgfQovLwovLyBUaGUgb3V0cHV0IGhhcyBubyB3aGl0ZXNwYWNlLiBBbiB1bmtub3duIGFkZHJlc3MgaGFzIHplcm8ga2lsbHMuIFRoZSBza2lucwovLyBhbmQgcGxhbmVzIGEgcGxheWVyIG93bnMgYXJlIHJlYWQgZnJvbSB0aGVpciByZWFsbXMgKFNraW5zT2YsIFBsYW5lc09mKS4KZnVuYyBQbGF5ZXJKU09OKGFkZHIgYWRkcmVzcykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZyhgeyJhZGRyZXNzIjpgKQoJYi5Xcml0ZVN0cmluZyhxdW90ZShhZGRyLlN0cmluZygpKSkKCWIuV3JpdGVTdHJpbmcoYCwia2lsbHMiOmApCgliLldyaXRlU3RyaW5nKGl0b2EocmVjb3JkZWRLaWxscyhhZGRyKSkpCgliLldyaXRlQnl0ZSgnfScpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBLaWxsTGVhZGVyYm9hcmRKU09OIHJldHVybnMgdGhlIHRvcCBwbGF5ZXJzIGJ5IGtpbGxzIHJlY29yZGVkIG9uLWNoYWluIGFzCi8vIGEgSlNPTiBhcnJheSwgYmVzdCBmaXJzdCwgYXQgbW9zdCBsZWFkZXJib2FyZF9zaXplIGVudHJpZXM6Ci8vCi8vCVsgeyAiYWRkcmVzcyI6ICJnMS4uLiIsICJraWxscyI6IDE3IH0gXQovLwovLyBUaGUgb3V0cHV0IGhhcyBubyB3aGl0ZXNwYWNlLiBXaXRoIGVxdWFsIGtpbGxzLCB0aGUgcGxheWVyIHdobyBnb3QgdGhlcmUKLy8gZmlyc3Qgc3RheXMgYWhlYWQuCmZ1bmMgS2lsbExlYWRlcmJvYXJkSlNPTigpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCXdyaXRlUmFua2luZygmYiwga2lsbGVycywgImtpbGxzIikKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIHF1b3RlIHJldHVybnMgcyBhcyBhIEpTT04gc3RyaW5nIGxpdGVyYWwsIHF1b3RlcyBpbmNsdWRlZC4gSXQgaXMgZm9yIHRoZQovLyBzdHJpbmdzIHRoZSByZWFsbSBkaWQgbm90IHZhbGlkYXRlLiBRdW90ZXMgYW5kIGJhY2tzbGFzaGVzIGFyZSBlc2NhcGVkIGFuZAovLyBhbnl0aGluZyBvdXRzaWRlIHByaW50YWJsZSBBU0NJSSBpcyByZXBsYWNlZCBieSAiPyIsIHNvIHRoZSByZXN1bHQgaXMKLy8gdmFsaWQgSlNPTiB3aGF0ZXZlciBzIGhvbGRzLgpmdW5jIHF1b3RlKHMgc3RyaW5nKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlQnl0ZSgnIicpCglmb3IgaSA6PSAwOyBpIDwgbGVuKHMpOyBpKysgewoJCWMgOj0gc1tpXQoJCXN3aXRjaCB7CgkJY2FzZSBjID09ICciJyB8fCBjID09ICdcXCc6CgkJCWIuV3JpdGVCeXRlKCdcXCcpCgkJCWIuV3JpdGVCeXRlKGMpCgkJY2FzZSBjIDwgMHgyMCB8fCBjID4gMHg3ZToKCQkJYi5Xcml0ZUJ5dGUoJz8nKQoJCWRlZmF1bHQ6CgkJCWIuV3JpdGVCeXRlKGMpCgkJfQoJfQoJYi5Xcml0ZUJ5dGUoJyInKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoa0xgKCWtpbGxzLmdubxLFGHBhY2thZ2UgZ2FtZQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJlcnJvcnMiCikKCmNvbnN0ICgKCW1heEtpbGxFbnRyaWVzID0gMzIgICAvLyBwbGF5ZXJzIHBlciBTdWJtaXRLaWxscyBjYWxsCgltYXhLaWxsQ291bnQgICA9IDEwMDAgLy8ga2lsbHMgcGVyIHBsYXllciBwZXIgY2FsbAoKCS8vIG1heEtpbGxzTGVuIGJvdW5kcyBhIGtpbGxzIHN0cmluZywgc28gdGhhdCBhbiBvdmVyc2l6ZWQgaW5wdXQgaXMKCS8vIHJlZnVzZWQgYmVmb3JlIGl0IGlzIHJlYWQuIEFuIGFkZHJlc3MgaXMgNDAgY2hhcmFjdGVycywgYSBjb3VudCA0IGF0CgkvLyBtb3N0LCBwbHVzIHRoZSB0d28gc2VwYXJhdG9yczogNjQgYSBwbGF5ZXIgbGVhdmVzIHJvb20gdG8gc3BhcmUuCgltYXhLaWxsc0xlbiA9IG1heEtpbGxFbnRyaWVzICogNjQKKQoKdmFyIGVycktpbGxzRm9ybWF0ID0gZXJyb3JzLk5ldyhgZ25vZmx5OiBraWxscyBtdXN0IGJlIDEgdG8gMzIgZW50cmllcyAiYWRkcmVzczpjb3VudCIgc2VwYXJhdGVkIGJ5ICI7ImApCgovLyBTdWJtaXRLaWxscyBhZGRzIGtpbGxzIHRvIHBsYXllcnMnIG9uLWNoYWluIGNvdW50cy4gUmVmZXJlZSBvbmx5LgovLwovLyBraWxscyBpcyAxIHRvIDMyIGVudHJpZXMgImFkZHJlc3M6Y291bnQiIHNlcGFyYXRlZCBieSAiOyIsIGZvciBleGFtcGxlCi8vCi8vCWcxYWJjLi4uOjM7ZzFkZWYuLi46MQovLwovLyBFYWNoIGFkZHJlc3MgbXVzdCBiZSB2YWxpZCBhbmQgbGlzdGVkIG9uY2UsIGVhY2ggY291bnQgZnJvbSAxIHRvIDEwMDAuCi8vIEFueXRoaW5nIGVsc2UgYWJvcnRzIHRoZSB0cmFuc2FjdGlvbiBhbmQgbm90aGluZyBpcyByZWNvcmRlZC4gVGhlIGNvdW50cwovLyBhcmUgYWRkZWQgdG8gd2hhdCB0aGUgcGxheWVycyBhbHJlYWR5IGhhdmUsIGFuZCB0aGUga2lsbCBsZWFkZXJib2FyZCBpcwovLyB1cGRhdGVkLiBLaWxscyBhcmUgcGxheWVyIGFjdGlvbnM6IFZlcnNpb24gZG9lcyBub3QgbW92ZS4KZnVuYyBTdWJtaXRLaWxscyhjdXIgcmVhbG0sIGtpbGxzIHN0cmluZykgewoJcmVmZXJlZSA6PSBhc3NlcnRSZWZlcmVlKDAsIGN1cikKCWFkZHJzLCBjb3VudHMsIGVyciA6PSBwYXJzZUtpbGxzKGtpbGxzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXNpemUgOj0gbGVhZGVyYm9hcmRTaXplKCkKCWFkZGVkIDo9IGludDY0KDApCglmb3IgaSwgYWRkciA6PSByYW5nZSBhZGRycyB7CgkJdG90YWwgOj0gcmVjb3JkZWRLaWxscyhhZGRyKSArIGNvdW50c1tpXQoJCXBpbG90cy5TZXQoYWRkci5TdHJpbmcoKSwgdG90YWwpCgoJCWlmIG5leHQsIGNoYW5nZWQgOj0ga2lsbGVycy5yYWlzZShhZGRyLCB0b3RhbC1jb3VudHNbaV0sIHRvdGFsLCBzaXplKTsgY2hhbmdlZCB7CgkJCWtpbGxlcnMgPSBuZXh0CgkJfQoJCWFkZGVkICs9IGNvdW50c1tpXQoJfQoJY2hhaW4uRW1pdCgiS2lsbHNTdWJtaXR0ZWQiLAoJCSJyZWZlcmVlIiwgcmVmZXJlZS5TdHJpbmcoKSwKCQkicGxheWVycyIsIGl0b2EoaW50NjQobGVuKGFkZHJzKSkpLAoJCSJraWxscyIsIGl0b2EoYWRkZWQpLAoJKQp9CgovLyBwYXJzZUtpbGxzIHBhcnNlcyBhbmQgdmFsaWRhdGVzIGEga2lsbHMgc3RyaW5nIGluIGEgc2luZ2xlIHBhc3MuIEl0Ci8vIHJldHVybnMgdGhlIHBsYXllcnMgYW5kIHRoZWlyIGNvdW50cywgaW4gdGhlIG9yZGVyIG9mIHRoZSBzdHJpbmcuCmZ1bmMgcGFyc2VLaWxscyhzIHN0cmluZykgKFtdYWRkcmVzcywgW11pbnQ2NCwgZXJyb3IpIHsKCWlmIHMgPT0gIiIgfHwgbGVuKHMpID4gbWF4S2lsbHNMZW4gewoJCXJldHVybiBuaWwsIG5pbCwgZXJyS2lsbHNGb3JtYXQKCX0KCXZhciBhZGRycyBbXWFkZHJlc3MKCXZhciBjb3VudHMgW11pbnQ2NAoJc2VlbiA6PSBtYWtlKG1hcFthZGRyZXNzXWJvb2wpIC8vIGxvb2t1cHMgb25seSwgbmV2ZXIgaXRlcmF0ZWQKCWkgOj0gMAoJZm9yIHsKCQlpbmRleCA6PSBsZW4oYWRkcnMpCgkJaWYgaW5kZXggPT0gbWF4S2lsbEVudHJpZXMgewoJCQlyZXR1cm4gbmlsLCBuaWwsIGVycktpbGxzRm9ybWF0CgkJfQoJCWNvbG9uIDo9IGluZGV4RnJvbShzLCBpLCAnOicpCgkJaWYgY29sb24gPT0gbGVuKHMpIHsKCQkJcmV0dXJuIG5pbCwgbmlsLCBlcnJLaWxsc0Zvcm1hdAoJCX0KCQllbmQgOj0gaW5kZXhGcm9tKHMsIGNvbG9uKzEsICc7JykKCgkJYWRkciA6PSBhZGRyZXNzKHNbaTpjb2xvbl0pCgkJaWYgIXZhbGlkQWRkcmVzcyhhZGRyKSB7CgkJCXJldHVybiBuaWwsIG5pbCwga2lsbHNFbnRyeUVycm9yKGluZGV4LCAiaW52YWxpZCBhZGRyZXNzIikKCQl9CgkJaWYgc2VlblthZGRyXSB7CgkJCXJldHVybiBuaWwsIG5pbCwga2lsbHNFbnRyeUVycm9yKGluZGV4LCAiYWRkcmVzcyBsaXN0ZWQgdHdpY2UiKQoJCX0KCQkvLyBBdCBtb3N0IDQgZGlnaXRzOiAxMDAwIGlzIHRoZSBoaWdoZXN0IGNvdW50LCBhbmQgYSBib3VuZGVkIGxlbmd0aAoJCS8vIGtlZXBzIHRoZSBudW1iZXIgZnJvbSBvdmVyZmxvd2luZy4KCQlpZiBlbmQtY29sb24tMSA+IDQgewoJCQlyZXR1cm4gbmlsLCBuaWwsIGtpbGxzRW50cnlFcnJvcihpbmRleCwgImNvdW50IG11c3QgYmUgYSBudW1iZXIgZnJvbSAxIHRvIDEwMDAiKQoJCX0KCQljb3VudCwgb2sgOj0gZGlnaXRzKHNbY29sb24rMSA6IGVuZF0pCgkJaWYgIW9rIHx8IGNvdW50IDwgMSB8fCBjb3VudCA+IG1heEtpbGxDb3VudCB7CgkJCXJldHVybiBuaWwsIG5pbCwga2lsbHNFbnRyeUVycm9yKGluZGV4LCAiY291bnQgbXVzdCBiZSBhIG51bWJlciBmcm9tIDEgdG8gMTAwMCIpCgkJfQoJCXNlZW5bYWRkcl0gPSB0cnVlCgkJYWRkcnMgPSBhcHBlbmQoYWRkcnMsIGFkZHIpCgkJY291bnRzID0gYXBwZW5kKGNvdW50cywgY291bnQpCgoJCWlmIGVuZCA9PSBsZW4ocykgewoJCQlyZXR1cm4gYWRkcnMsIGNvdW50cywgbmlsCgkJfQoJCWkgPSBlbmQgKyAxCgkJaWYgaSA9PSBsZW4ocykgewoJCQlyZXR1cm4gbmlsLCBuaWwsIGVycktpbGxzRm9ybWF0IC8vIGEgdHJhaWxpbmcgIjsiCgkJfQoJfQp9CgpmdW5jIGtpbGxzRW50cnlFcnJvcihpbmRleCBpbnQsIHJlYXNvbiBzdHJpbmcpIGVycm9yIHsKCXJldHVybiBlcnJvcnMuTmV3KCJnbm9mbHk6IGtpbGxzIGVudHJ5ICIgKyBpdG9hKGludDY0KGluZGV4KSkgKyAiOiAiICsgcmVhc29uKQp9ChrpHgoKcGFyYW1zLmdubxLaHnBhY2thZ2UgZ2FtZQoKaW1wb3J0ICJjaGFpbiIKCi8vIHBhcmFtIGlzIG9uZSB0dW5hYmxlIG51bWJlciBvZiB0aGUgZ2FtZSwgd2l0aCB0aGUgYm91bmRzIGFuIGFkbWluIGhhcyB0bwovLyBzdGF5IHdpdGhpbi4KdHlwZSBwYXJhbSBzdHJ1Y3QgewoJa2V5ICAgc3RyaW5nCgl2YWx1ZSBpbnQ2NAoJbWluICAgaW50NjQKCW1heCAgIGludDY0Cglkb2MgICBzdHJpbmcKfQoKLy8gcGFyYW1MZWFkZXJib2FyZFNpemUgaXMgdGhlIG9uZSBwYXJhbSB0aGUgcmVhbG0gaXRzZWxmIGNvbnN1bWVzLiBFdmVyeQovLyBvdGhlciBwYXJhbSBpcyBvbmx5IHN0b3JlZCBoZXJlIGFuZCBhcHBsaWVkIGJ5IHRoZSBnYW1lIHNlcnZlci4KY29uc3QgcGFyYW1MZWFkZXJib2FyZFNpemUgPSAibGVhZGVyYm9hcmRfc2l6ZSIKCi8vIGRlZmF1bHRQYXJhbXMgcmV0dXJucyB0aGUgcmVnaXN0cnkgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZXMuIFRoZSBvcmRlciBpcwovLyB0aGUgZGlzcGxheSBvcmRlciwgaW4gU3RhdGVKU09OIGFzIHdlbGwgYXMgaW4gUmVuZGVyLgpmdW5jIGRlZmF1bHRQYXJhbXMoKSBbXSpwYXJhbSB7CglyZXR1cm4gW10qcGFyYW17CgkJeyJwbGFuZV9zcGVlZCIsIDcwLCAyMCwgMzAwLCAiY3J1aXNlIHNwZWVkLCBtL3MifSwKCQl7ImJvb3N0X3NwZWVkIiwgMTMwLCAyMCwgNjAwLCAic3BlZWQgd2hpbGUgYm9vc3RpbmcsIG0vcyJ9LAoJCXsiYm9vc3RfY2FwYWNpdHlfbXMiLCA0MDAwLCAwLCA2MDAwMCwgImhvdyBsb25nIGEgZnVsbCBib29zdCB0YW5rIGxhc3RzLCAwIGRpc2FibGVzIGJvb3N0In0sCgkJeyJib29zdF9yZWNoYXJnZV9tcyIsIDEwMDAwLCAxMDAsIDYwMDAwMCwgInRpbWUgdG8gcmVmaWxsIGFuIGVtcHR5IHRhbmsgd2hpbGUgbm90IGJvb3N0aW5nIn0sCgkJeyJ0dXJuX3JhdGUiLCA4MCwgMjAsIDM2MCwgInBpdGNoIGFuZCB0dXJuIHJlc3BvbnNpdmVuZXNzLCBkZWcvcyJ9LAoJCXsicGxhbmVfaGVhbHRoIiwgMTAwLCAxLCAxMDAwLCAiaGl0IHBvaW50cyJ9LAoJCXsiZmlyZV9jb29sZG93bl9tcyIsIDE2MCwgNTAsIDUwMDAsICJtaW5pbXVtIHRpbWUgYmV0d2VlbiBzaG90cyJ9LAoJCXsiYnVsbGV0X3NwZWVkIiwgNDAwLCAxMDAsIDIwMDAsICJtL3MifSwKCQl7ImJ1bGxldF90dGxfbXMiLCAxNTAwLCAxMDAsIDEwMDAwLCAiYnVsbGV0IGxpZmV0aW1lIn0sCgkJeyJidWxsZXRfZGFtYWdlIiwgMjAsIDEsIDEwMDAsICJoaXQgcG9pbnRzIHJlbW92ZWQgcGVyIGJ1bGxldCJ9LAoJCXsicmVzcGF3bl9tcyIsIDMwMDAsIDAsIDYwMDAwLCAiZGVsYXkgYmVmb3JlIGEgZGVzdHJveWVkIHBsYW5lIHJlc3Bhd25zIn0sCgkJeyJiYWxsb29uX3Jlc3Bhd25fbXMiLCA2MDAwLCAwLCA2MDAwMDAsICJkZWxheSBiZWZvcmUgYSBwb3BwZWQgYmFsbG9vbiBjb21lcyBiYWNrIn0sCgkJe3BhcmFtTGVhZGVyYm9hcmRTaXplLCAxMCwgMSwgMTAwLCAiZW50cmllcyBhIGxlYWRlcmJvYXJkIGtlZXBzLCBvbi1jaGFpbiBhbmQgb24gdGhlIHNlcnZlciJ9LAoJCXsibWF4X3BsYXllcnMiLCA2NCwgMSwgMTAwMCwgInNlcnZlciBjYXBhY2l0eSJ9LAoJCXsiYm90X21heCIsIDIsIDAsIDE2LCAiYm90cyBmbHlpbmcgd2l0aCBhIGxvbmUgcGlsb3QsIDAgZm9yIG5vIGJvdHMifSwKCQl7ImJvdF9vZmZfcGxheWVycyIsIDUsIDEsIDY0LCAiZnJvbSB0aGlzIG1hbnkgcGlsb3RzIHRoZXJlIGFyZSBubyBib3RzIn0sCgkJeyJib3RfYWltX2Vycm9yIiwgOCwgMCwgNDUsICJob3cgZmFyIGEgYm90J3Mgc2hvdCBjYW4gc3RyYXkgZnJvbSBpdHMgYWltLCBkZWdyZWVzIn0sCgkJeyJib3RfZmlyZV9pbnRlcnZhbF9tcyIsIDkwMCwgMTAwLCAxMDAwMCwgIm1pbmltdW0gdGltZSBiZXR3ZWVuIGEgYm90J3Mgc2hvdHMifSwKCX0KfQoKLy8gZmluZFBhcmFtIHJldHVybnMgdGhlIHBhcmFtIHJlZ2lzdGVyZWQgdW5kZXIga2V5LCBvciBuaWwuIFRoZSByZWdpc3RyeSBpcwovLyBhIGRvemVuIGVudHJpZXMsIGEgbGluZWFyIHNjYW4gaXMgY2hlYXBlciB0aGFuIGFueSBpbmRleC4KZnVuYyBmaW5kUGFyYW0oa2V5IHN0cmluZykgKnBhcmFtIHsKCWZvciBfLCBwIDo9IHJhbmdlIHBhcmFtcyB7CgkJaWYgcC5rZXkgPT0ga2V5IHsKCQkJcmV0dXJuIHAKCQl9Cgl9CglyZXR1cm4gbmlsCn0KCi8vIFNldFBhcmFtIGNoYW5nZXMgYSBnYW1lIHBhcmFtZXRlci4gQWRtaW4gb25seS4KLy8KLy8gVGhlIGtleSBtdXN0IGV4aXN0IGFuZCB0aGUgdmFsdWUgbXVzdCBiZSB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGF0IGtleSwKLy8gc2VlIFJlbmRlcigicGFyYW1zIikuIExvd2VyaW5nIGxlYWRlcmJvYXJkX3NpemUgdHJ1bmNhdGVzIHRoZSBraWxsCi8vIGxlYWRlcmJvYXJkIHJpZ2h0IGF3YXkuIFJhaXNpbmcgaXQgZG9lcyBub3QgYnJpbmcgYmFjayB0aGUgbGluZXMgdGhhdCB3ZXJlCi8vIGRyb3BwZWQ6IHRoZSBsaXN0IGZpbGxzIHVwIGFnYWluIGFzIGtpbGxzIGNvbWUgaW4uCmZ1bmMgU2V0UGFyYW0oY3VyIHJlYWxtLCBrZXkgc3RyaW5nLCB2YWx1ZSBpbnQ2NCkgewoJYXNzZXJ0QWRtaW4oMCwgY3VyKQoJcCA6PSBmaW5kUGFyYW0oa2V5KQoJaWYgcCA9PSBuaWwgewoJCXBhbmljKGVyclVua25vd25QYXJhbSkKCX0KCWlmIHZhbHVlIDwgcC5taW4gfHwgdmFsdWUgPiBwLm1heCB7CgkJcGFuaWMoImdub2ZseTogIiArIGtleSArICIgbXVzdCBiZSBiZXR3ZWVuICIgKyBpdG9hKHAubWluKSArICIgYW5kICIgKyBpdG9hKHAubWF4KSkKCX0KCXAudmFsdWUgPSB2YWx1ZQoJaWYga2V5ID09IHBhcmFtTGVhZGVyYm9hcmRTaXplIHsKCQl0cmltUmFua2luZ3MoKQoJfQoJYnVtcCgpCgljaGFpbi5FbWl0KCJQYXJhbVNldCIsICJrZXkiLCBrZXksICJ2YWx1ZSIsIGl0b2EodmFsdWUpKQp9CgovLyBTZXRQYXJhbUJvdW5kcyBjaGFuZ2VzIHRoZSByYW5nZSBTZXRQYXJhbSBhY2NlcHRzIGZvciBhIGtleS4gT3duZXIgb25seS4KLy8KLy8gVGhlIGJvdW5kcyBhcmUgdGhlIGd1YXJkIHJhaWwgYmV0d2VlbiB0aGUgb3duZXIgYW5kIHRoZSBhZG1pbnM6IGFkbWlucyB0dW5lCi8vIHZhbHVlcyB3aXRoaW4gdGhlbSwgdGhlIG93bmVyIGRlY2lkZXMgaG93IGZhciB0dW5pbmcgbWF5IGdvLiBUaGUgY3VycmVudAovLyB2YWx1ZSBoYXMgdG8gZml0IHRoZSBuZXcgYm91bmRzLCBzbyB0aGF0IHRoZSByZWdpc3RyeSBuZXZlciBob2xkcyBhIHZhbHVlCi8vIFNldFBhcmFtIHdvdWxkIHJlZnVzZS4KZnVuYyBTZXRQYXJhbUJvdW5kcyhjdXIgcmVhbG0sIGtleSBzdHJpbmcsIG1pbiwgbWF4IGludDY0KSB7Cglhc3NlcnRPd25lcigwLCBjdXIpCglwIDo9IGZpbmRQYXJhbShrZXkpCglpZiBwID09IG5pbCB7CgkJcGFuaWMoZXJyVW5rbm93blBhcmFtKQoJfQoJaWYgbWluIDwgMCB8fCBtaW4gPiBtYXggewoJCXBhbmljKGVyckludmFsaWRCb3VuZHMpCgl9CgkvLyBBbiBlbXB0eSBsZWFkZXJib2FyZCBoYXMgbm8gbGFzdCBsaW5lIHRvIGNvbXBhcmUgYSBuZXcgdG90YWwgd2l0aC4KCWlmIGtleSA9PSBwYXJhbUxlYWRlcmJvYXJkU2l6ZSAmJiBtaW4gPCAxIHsKCQlwYW5pYyhlcnJMZWFkZXJib2FyZE1pbikKCX0KCWlmIHAudmFsdWUgPCBtaW4gfHwgcC52YWx1ZSA+IG1heCB7CgkJcGFuaWMoZXJyVmFsdWVPdXRPZkJvdW5kcykKCX0KCXAubWluLCBwLm1heCA9IG1pbiwgbWF4CglidW1wKCkKCWNoYWluLkVtaXQoIlBhcmFtQm91bmRzU2V0IiwgImtleSIsIGtleSwgIm1pbiIsIGl0b2EobWluKSwgIm1heCIsIGl0b2EobWF4KSkKfQoKLy8gUGFyYW0gcmV0dXJucyB0aGUgdmFsdWUgb2YgYSBnYW1lIHBhcmFtZXRlci4gSXQgcGFuaWNzIG9uIGFuIHVua25vd24ga2V5LgpmdW5jIFBhcmFtKGtleSBzdHJpbmcpIGludDY0IHsKCXAgOj0gZmluZFBhcmFtKGtleSkKCWlmIHAgPT0gbmlsIHsKCQlwYW5pYyhlcnJVbmtub3duUGFyYW0pCgl9CglyZXR1cm4gcC52YWx1ZQp9ChrABAoJcGFyc2UuZ25vErIEcGFja2FnZSBnYW1lCgovLyBpbmRleEZyb20gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGMgaW4gcyBhdCBvciBhZnRlciBpLCBvciBsZW4ocykKLy8gd2hlbiB0aGVyZSBpcyBub25lLgpmdW5jIGluZGV4RnJvbShzIHN0cmluZywgaSBpbnQsIGMgYnl0ZSkgaW50IHsKCWZvciBpIDwgbGVuKHMpICYmIHNbaV0gIT0gYyB7CgkJaSsrCgl9CglyZXR1cm4gaQp9CgovLyBkaWdpdHMgcGFyc2VzIGEgbm9uLWVtcHR5IHN0cmluZyBvZiBkZWNpbWFsIGRpZ2l0cy4gS2lsbCBjb3VudHMgYXJlIG5ldmVyCi8vIG5lZ2F0aXZlLCBzbyB0aGVyZSBpcyBubyBzaWduIHRvIHJlYWQuCmZ1bmMgZGlnaXRzKHMgc3RyaW5nKSAoaW50NjQsIGJvb2wpIHsKCWlmIGxlbihzKSA9PSAwIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCW4gOj0gaW50NjQoMCkKCWZvciBpIDo9IDA7IGkgPCBsZW4ocyk7IGkrKyB7CgkJYyA6PSBzW2ldCgkJaWYgYyA8ICcwJyB8fCBjID4gJzknIHsKCQkJcmV0dXJuIDAsIGZhbHNlCgkJfQoJCW4gPSBuKjEwICsgaW50NjQoYy0nMCcpCgl9CglyZXR1cm4gbiwgdHJ1ZQp9ChrkAwoKcGlsb3RzLmdubxLVA3BhY2thZ2UgZ2FtZQoKLy8gV2hhdCB0aGUgcmVhbG0gcmVtZW1iZXJzIGFib3V0IGEgcGxheWVyIGlzIHRoZWlyIGtpbGxzLCByZWNvcmRlZCBieSB0aGUKLy8gcmVmZXJlZXM6IHBpbG90cyBtYXBzIGFuIGFkZHJlc3MgdG8gYW4gaW50NjQsIGFsbG9jYXRlZCBhdCB0aGUgZmlyc3Qga2lsbC4KLy8gQSBwbGF5ZXIgd2l0aG91dCBhIHJlY29yZCBoYXMgbm9uZS4gU2tpbnMgYW5kIHBsYW5lcyBhcmUgdG9rZW5zIG9mIHRoZWlyCi8vIG93biByZWFsbXMgKGdub2ZseS9uZnRzL3NraW5zLCBnbm9mbHkvbmZ0cy9wbGFuZXMpLgoKLy8ga2lsbHNPZiByZXR1cm5zIHRoZSBraWxscyByZWNvcmRlZCBmb3IgYWRkci4KZnVuYyByZWNvcmRlZEtpbGxzKGFkZHIgYWRkcmVzcykgaW50NjQgewoJdiA6PSBwaWxvdHMuR2V0KGFkZHIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB2LihpbnQ2NCkKfQoajSkKDHJhbmtpbmdzLmdubxL8KHBhY2thZ2UgZ2FtZQoKaW1wb3J0ICJzdHJpbmdzIgoKLy8gcmFua2luZyBpcyBhIGxlYWRlcmJvYXJkIG9uIGEgc2luZ2xlIG51bWJlciB0aGF0IG9ubHkgZ29lcyB1cCwgdGhlIGNvdW50IG9mCi8vIGtpbGxzOiB0aGUgdG9wIHBsYXllcnMsIGJlc3QgZmlyc3QsIGF0IG1vc3QgbGVhZGVyYm9hcmRfc2l6ZSBsaW5lcyBhbmQgb25lCi8vIGxpbmUgcGVyIHBsYXllci4gV2l0aCBlcXVhbCBzY29yZXMsIHRoZSBwbGF5ZXIgd2hvIGdvdCB0aGVyZSBmaXJzdCBzdGF5cwovLyBhaGVhZC4KLy8KLy8gSXQgaXMga2VwdCBzb3J0ZWQgYXQgd3JpdGUgdGltZSwgc28gcmVhZGluZyBpdCBuZXZlciBoYXMgdG8gbG9vayBhdCBldmVyeQovLyBwbGF5ZXIuIFNjb3JlcyBvbmx5IGdvaW5nIHVwIGlzIHdoYXQgbWFrZXMgdGhhdCBleGFjdDogYSBwbGF5ZXIgb3V0c2lkZQovLyB0aGUgbGlzdCBjYW4gb25seSBlbnRlciBpdCB0aHJvdWdoIHJhaXNlLgovLwovLyBUaGUgdHdvIHNsaWNlcyBhcmUgcGFyYWxsZWw6IHNsaWNlcyBvZiBwbGFpbiB2YWx1ZXMgYXJlIG9uZSBzdG9yZWQgb2JqZWN0Ci8vIGVhY2gsIHdoZXJlIGEgc2xpY2Ugb2Ygc3RydWN0cyB3b3VsZCBiZSBvbmUgb2JqZWN0IHBlciBsaW5lLiBNZWFzdXJlZCBvbgovLyBnbm9kZXYsIGEgbGluZSBjb3N0cyBhYm91dCAxOTAgYnl0ZXMgdGhpcyB3YXkuCnR5cGUgcmFua2luZyBzdHJ1Y3QgewoJYWRkcnMgIFtdYWRkcmVzcwoJc2NvcmVzIFtdaW50NjQKfQoKLy8gbGVhZGVyYm9hcmRTaXplIHJldHVybnMgaG93IG1hbnkgbGluZXMgYSBsZWFkZXJib2FyZCBtYXkgaG9sZC4KZnVuYyBsZWFkZXJib2FyZFNpemUoKSBpbnQgewoJcmV0dXJuIGludChmaW5kUGFyYW0ocGFyYW1MZWFkZXJib2FyZFNpemUpLnZhbHVlKQp9CgovLyByYWlzZSBwdXRzIGEgcGxheWVyIGF0IHRoZWlyIHBsYWNlIGFmdGVyIHRoZWlyIHNjb3JlIHdlbnQgdXAgZnJvbSBvbGQgdG8KLy8gc2NvcmUuIEl0IHJldHVybnMgdGhlIHJhbmtpbmcgdG8gc3RvcmUsIGFuZCBjaGFuZ2VkID09IGZhbHNlIHdoZW4gaXQgaXMKLy8gbGVmdCBhcyBpdCBpczogdGhlIHBsYXllciBpcyBub3Qgb24gYSBmdWxsIGxpc3QgYW5kIHN0aWxsIG5vdCBnb29kIGVub3VnaAovLyB0byBnZXQgb24uCmZ1bmMgKHIgcmFua2luZykgcmFpc2UoYWRkciBhZGRyZXNzLCBvbGQsIHNjb3JlIGludDY0LCBzaXplIGludCkgKG5leHQgcmFua2luZywgY2hhbmdlZCBib29sKSB7Cglmcm9tIDo9IHIubGluZU9mKGFkZHIsIG9sZCkKCXRvIDo9IHIuc2VhcmNoKHNjb3JlIC0gMSkgLy8gYWZ0ZXIgZXZlcnkgbGluZSB3aXRoIHRoaXMgc2NvcmUgb3IgbW9yZQoJaWYgZnJvbSA8IDAgJiYgdG8gPj0gc2l6ZSB7CgkJcmV0dXJuIHIsIGZhbHNlCgl9CglpZiBmcm9tID49IDAgJiYgdG8gPiBmcm9tIHsKCQl0byA9IGZyb20gLy8gY2Fubm90IGhhcHBlbjogYSBzY29yZSBvbmx5IGdvZXMgdXAKCX0KCW5leHQgPSByYW5raW5newoJCWFkZHJzOiAgc3BsaWNlQWRkcnMoci5hZGRycywgZnJvbSwgdG8sIGFkZHIsIHNpemUpLAoJCXNjb3Jlczogc3BsaWNlSW50cyhyLnNjb3JlcywgZnJvbSwgdG8sIHNjb3JlLCBzaXplKSwKCX0KCXJldHVybiBuZXh0LCB0cnVlCn0KCi8vIHNlYXJjaCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbGluZSB3aXRoIGEgc2NvcmUgb2YgbGltaXQgb3IgbGVzcywKLy8gdGhlIG51bWJlciBvZiBsaW5lcyB3aGVuIHRoZXJlIGlzIG5vbmUuIFRoZSBsaXN0IGlzIHNvcnRlZCwgc28gdGhpcyBpcyBhCi8vIGJpbmFyeSBzZWFyY2guCmZ1bmMgKHIgcmFua2luZykgc2VhcmNoKGxpbWl0IGludDY0KSBpbnQgewoJbG8sIGhpIDo9IDAsIGxlbihyLnNjb3JlcykKCWZvciBsbyA8IGhpIHsKCQltaWQgOj0gKGxvICsgaGkpIC8gMgoJCWlmIHIuc2NvcmVzW21pZF0gPD0gbGltaXQgewoJCQloaSA9IG1pZAoJCX0gZWxzZSB7CgkJCWxvID0gbWlkICsgMQoJCX0KCX0KCXJldHVybiBsbwp9CgovLyBsaW5lT2YgcmV0dXJucyB0aGUgaW5kZXggb2YgYSBwbGF5ZXIncyBsaW5lLCAtMSB3aGVuIHRoZXkgaGF2ZSBub25lLiBvbGQKLy8gaXMgdGhlIHBsYXllcidzIHNjb3JlIGJlZm9yZSB0aGUgY2hhbmdlIGJlaW5nIGFwcGxpZWQuCi8vCi8vIEEgbGluZSBhbHdheXMgY2FycmllcyB0aGUgY3VycmVudCBzY29yZSBvZiBpdHMgcGxheWVyLCBiZWNhdXNlIGV2ZXJ5Ci8vIGNoYW5nZSBvZiBhIHNjb3JlIGdvZXMgdGhyb3VnaCByYWlzZS4gU28gdGhlIGxpbmUgY2FuIG9ubHkgYmUgYW1vbmcgdGhvc2UKLy8gd2l0aCBleGFjdGx5IG9sZCwgd2hpY2ggdGhlIGJpbmFyeSBzZWFyY2ggZmluZHMgd2l0aG91dCByZWFkaW5nIHRoZSB3aG9sZQovLyBsaXN0OiB3aXRoIDMyIHBsYXllcnMgY3JlZGl0ZWQgaW4gb25lIGNhbGwgb24gYSAxMDAgbGluZSBsaXN0LCBjb21wYXJpbmcKLy8gZXZlcnkgYWRkcmVzcyB3b3VsZCBjb3N0IG1pbGxpb25zIG9mIGdhcy4gQSBwbGF5ZXIgd2hvc2Ugc2NvcmUgd2FzIHplcm8KLy8gaGFzIG5ldmVyIGJlZW4gdGhyb3VnaCByYWlzZSBhbmQgaGFzIG5vIGxpbmUuCmZ1bmMgKHIgcmFua2luZykgbGluZU9mKGFkZHIgYWRkcmVzcywgb2xkIGludDY0KSBpbnQgewoJaWYgb2xkIDw9IDAgewoJCXJldHVybiAtMQoJfQoJZm9yIGkgOj0gci5zZWFyY2gob2xkKTsgaSA8IGxlbihyLnNjb3JlcykgJiYgci5zY29yZXNbaV0gPT0gb2xkOyBpKysgewoJCWlmIHIuYWRkcnNbaV0gPT0gYWRkciB7CgkJCXJldHVybiBpCgkJfQoJfQoJcmV0dXJuIC0xCn0KCi8vIHNwbGljZUFkZHJzIHJldHVybnMgYSBjb3B5IG9mIGEgbGVhZGVyYm9hcmQgY29sdW1uIHdpdGggdiBpbnNlcnRlZCBhdCBpbmRleAovLyB0by4gV2l0aCBmcm9tID49IDAgdGhlIGVsZW1lbnQgYXQgdGhhdCBpbmRleCwgdGhlIHBsYXllcidzIHByZXZpb3VzIGxpbmUsCi8vIGlzIGxlZnQgb3V0OyB0byBtdXN0IG5vdCBiZSBwYXN0IGl0LiBXaXRoIGZyb20gPCAwIHRoZSByZXN1bHQgaXMga2VwdCB0bwovLyBzaXplIGVsZW1lbnRzIGJ5IGRyb3BwaW5nIHRoZSB0YWlsOyB0byBtdXN0IGJlIGJlbG93IHNpemUuCi8vCi8vIFRoZSBjb3B5IGhhcyBleGFjdGx5IHRoZSBsZW5ndGggb2YgaXRzIGNvbnRlbnQsIHNvIHRoYXQgbm90aGluZyBlbHNlIHN0YXlzCi8vIGluIHN0b3JhZ2UsIGFuZCBpdCBpcyBidWlsdCB3aXRoIHRoZSBhcHBlbmQgYnVpbHRpbjogb24gYSAxMDAgbGluZSBib2FyZCBhCi8vIGxvb3Agb3ZlciB0aGUgbGluZXMgY29zdHMgc2V2ZXJhbCB0aW1lcyBtb3JlIGdhcy4KZnVuYyBzcGxpY2VBZGRycyhsaXN0IFtdYWRkcmVzcywgZnJvbSwgdG8gaW50LCB2IGFkZHJlc3MsIHNpemUgaW50KSBbXWFkZHJlc3MgewoJaWYgZnJvbSA8IDAgewoJCWlmIGxlbihsaXN0KSA+PSBzaXplIHsKCQkJbGlzdCA9IGxpc3RbOnNpemUtMV0KCQl9CgkJb3V0IDo9IG1ha2UoW11hZGRyZXNzLCAwLCBsZW4obGlzdCkrMSkKCQlvdXQgPSBhcHBlbmQob3V0LCBsaXN0Wzp0b10uLi4pCgkJb3V0ID0gYXBwZW5kKG91dCwgdikKCQlyZXR1cm4gYXBwZW5kKG91dCwgbGlzdFt0bzpdLi4uKQoJfQoJb3V0IDo9IG1ha2UoW11hZGRyZXNzLCAwLCBsZW4obGlzdCkpCglvdXQgPSBhcHBlbmQob3V0LCBsaXN0Wzp0b10uLi4pCglvdXQgPSBhcHBlbmQob3V0LCB2KQoJb3V0ID0gYXBwZW5kKG91dCwgbGlzdFt0bzpmcm9tXS4uLikKCXJldHVybiBhcHBlbmQob3V0LCBsaXN0W2Zyb20rMTpdLi4uKQp9CgovLyBzcGxpY2VJbnRzIGlzIHNwbGljZUFkZHJzIGZvciBhIGNvbHVtbiBvZiBudW1iZXJzLgpmdW5jIHNwbGljZUludHMobGlzdCBbXWludDY0LCBmcm9tLCB0byBpbnQsIHYgaW50NjQsIHNpemUgaW50KSBbXWludDY0IHsKCWlmIGZyb20gPCAwIHsKCQlpZiBsZW4obGlzdCkgPj0gc2l6ZSB7CgkJCWxpc3QgPSBsaXN0WzpzaXplLTFdCgkJfQoJCW91dCA6PSBtYWtlKFtdaW50NjQsIDAsIGxlbihsaXN0KSsxKQoJCW91dCA9IGFwcGVuZChvdXQsIGxpc3RbOnRvXS4uLikKCQlvdXQgPSBhcHBlbmQob3V0LCB2KQoJCXJldHVybiBhcHBlbmQob3V0LCBsaXN0W3RvOl0uLi4pCgl9CglvdXQgOj0gbWFrZShbXWludDY0LCAwLCBsZW4obGlzdCkpCglvdXQgPSBhcHBlbmQob3V0LCBsaXN0Wzp0b10uLi4pCglvdXQgPSBhcHBlbmQob3V0LCB2KQoJb3V0ID0gYXBwZW5kKG91dCwgbGlzdFt0bzpmcm9tXS4uLikKCXJldHVybiBhcHBlbmQob3V0LCBsaXN0W2Zyb20rMTpdLi4uKQp9CgovLyBjdXQgcmV0dXJucyB0aGUgZmlyc3Qgc2l6ZSBsaW5lcyBvZiB0aGUgcmFua2luZywgaW4gc2xpY2VzIG9mIGV4YWN0bHkgdGhhdAovLyBsZW5ndGgsIHNvIHRoYXQgbm90aGluZyBiZXlvbmQgdGhlIGtlcHQgbGluZXMgc3RheXMgaW4gc3RvcmFnZS4KZnVuYyAociByYW5raW5nKSBjdXQoc2l6ZSBpbnQpIHJhbmtpbmcgewoJbiA6PSBsZW4oci5hZGRycykKCWlmIG4gPiBzaXplIHsKCQluID0gc2l6ZQoJfQoJb3V0IDo9IHJhbmtpbmd7YWRkcnM6IG1ha2UoW11hZGRyZXNzLCBuKSwgc2NvcmVzOiBtYWtlKFtdaW50NjQsIG4pfQoJY29weShvdXQuYWRkcnMsIHIuYWRkcnMpCgljb3B5KG91dC5zY29yZXMsIHIuc2NvcmVzKQoJcmV0dXJuIG91dAp9CgovLyB0cmltUmFua2luZ3MgY3V0cyB0aGUga2lsbCBsZWFkZXJib2FyZCBkb3duIHRvIGxlYWRlcmJvYXJkX3NpemUuCmZ1bmMgdHJpbVJhbmtpbmdzKCkgewoJaWYgc2l6ZSA6PSBsZWFkZXJib2FyZFNpemUoKTsgbGVuKGtpbGxlcnMuYWRkcnMpID4gc2l6ZSB7CgkJa2lsbGVycyA9IGtpbGxlcnMuY3V0KHNpemUpCgl9Cn0KCi8vIHdyaXRlUmFua2luZyB3cml0ZXMgYSByYW5raW5nIGFzIGEgSlNPTiBhcnJheSBvZgovLyB7ImFkZHJlc3MiOiJnMS4uLiIsIjxrZXk+Ijo8c2NvcmU+fSBvYmplY3RzLCBiZXN0IGZpcnN0LgpmdW5jIHdyaXRlUmFua2luZyhiICpzdHJpbmdzLkJ1aWxkZXIsIHIgcmFua2luZywga2V5IHN0cmluZykgewoJYi5Xcml0ZUJ5dGUoJ1snKQoJZm9yIGksIGFkZHIgOj0gcmFuZ2Ugci5hZGRycyB7CgkJaWYgaSA+IDAgewoJCQliLldyaXRlQnl0ZSgnLCcpCgkJfQoJCWIuV3JpdGVTdHJpbmcoYHsiYWRkcmVzcyI6ImApCgkJYi5Xcml0ZVN0cmluZyhhZGRyLlN0cmluZygpKQoJCWIuV3JpdGVTdHJpbmcoYCIsImApCgkJYi5Xcml0ZVN0cmluZyhrZXkpCgkJYi5Xcml0ZVN0cmluZyhgIjpgKQoJCWIuV3JpdGVTdHJpbmcoaXRvYShyLnNjb3Jlc1tpXSkpCgkJYi5Xcml0ZUJ5dGUoJ30nKQoJfQoJYi5Xcml0ZUJ5dGUoJ10nKQp9ChqQHwoKcmVuZGVyLmdubxKBH3BhY2thZ2UgZ2FtZQoKaW1wb3J0ICJzdHJpbmdzIgoKLy8gUmVuZGVyIHJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBnYW1lIGFzIG1hcmtkb3duLCBmb3IgZ25vd2ViOgovLwovLwkiIiAgICAgICAgICAgICAgIG92ZXJ2aWV3Ci8vCSJsZWFkZXJib2FyZCIgICAgdGhlIHRvcCBwbGF5ZXJzIGJ5IGtpbGxzCi8vCSJwYXJhbXMiICAgICAgICAgdGhlIGdhbWUgcGFyYW1ldGVycyBhbmQgdGhlaXIgYm91bmRzCi8vCSJwbGF5ZXIvPGFkZHI+IiAgb25lIHBsYXllcgovLwovLyBFdmVyeXRoaW5nIHByaW50ZWQgaGVyZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgYSBuYXJyb3cgY2hhcnNldCB3aGVuIGl0IHdhcwovLyB3cml0dGVuIChzZWUgdmFsaWRhdGUuZ25vKSwgYW5kIHRoZSBvbmx5IGNhbGxlci1zdXBwbGllZCB2YWx1ZSwgdGhlIGFkZHJlc3MKLy8gb2YgYSBwbGF5ZXIgcGFnZSwgaXMgcHJpbnRlZCBvbmx5IGlmIGl0IGlzIGEgdmFsaWQgYWRkcmVzcy4gTm90aGluZyBuZWVkcwovLyBtYXJrZG93biBlc2NhcGluZy4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggewoJY2FzZSBwYXRoID09ICIiOgoJCXJldHVybiByZW5kZXJIb21lKCkKCWNhc2UgcGF0aCA9PSAibGVhZGVyYm9hcmQiOgoJCXJldHVybiByZW5kZXJMZWFkZXJib2FyZCgpCgljYXNlIHBhdGggPT0gInBhcmFtcyI6CgkJcmV0dXJuIHJlbmRlclBhcmFtcygpCgljYXNlIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJwbGF5ZXIvIik6CgkJcmV0dXJuIHJlbmRlclBsYXllcihhZGRyZXNzKHN0cmluZ3MuVHJpbVByZWZpeChwYXRoLCAicGxheWVyLyIpKSkKCX0KCXJldHVybiAiIyBnbm9mbHlcblxuUGFnZSBub3QgZm91bmQuIEdvIGJhY2sgdG8gdGhlIFtvdmVydmlld10oIiArIGxpbmsoIiIpICsgIikuXG4iCn0KCi8vIGxpbmsgcmV0dXJucyB0aGUgZ25vd2ViIFVSTCBvZiBhIFJlbmRlciBwYXRoIG9mIHRoaXMgcmVhbG0uCmZ1bmMgbGluayhwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggPT0gIiIgewoJCXJldHVybiB3ZWJQYXRoCgl9CglyZXR1cm4gd2ViUGF0aCArICI6IiArIHBhdGgKfQoKZnVuYyByZW5kZXJIb21lKCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBnbm9mbHlcblxuIikKCWIuV3JpdGVTdHJpbmcoIkEgbXVsdGlwbGF5ZXIgcGxhbmUgZ2FtZS4gRmx5IHRocm91Z2ggcmluZ3MsIHBvcCBiYWxsb29ucywgc2hvb3QgZG93biB0aGUgb3RoZXIgcGlsb3RzLlxuIikKCWIuV3JpdGVTdHJpbmcoIlRoaXMgcmVhbG0gaG9sZHMgdGhlIHJ1bGVzIG9mIHRoZSBnYW1lOiBwYXJhbWV0ZXJzLCByb2xlcyBhbmQgdGhlIGtpbGxzIHRoYXQgY291bnQuXG5cbiIpCgoJYi5Xcml0ZVN0cmluZygiLSBbTGVhZGVyYm9hcmRdKCIgKyBsaW5rKCJsZWFkZXJib2FyZCIpICsgIik6ICIgKyBpdG9hKGludDY0KGxlbihraWxsZXJzLmFkZHJzKSkpICsgIiByYW5rZWQgcGlsb3RzXG4iKQoJYi5Xcml0ZVN0cmluZygiLSBbUGFyYW1ldGVyc10oIiArIGxpbmsoInBhcmFtcyIpICsgIik6ICIgKyBpdG9hKGludDY0KGxlbihwYXJhbXMpKSkgKyAiXG5cbiIpCgoJYi5Xcml0ZVN0cmluZygifCB8IHxcbnwtLS18LS0tfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgVmVyc2lvbiB8ICIgKyBpdG9hKHZlcnNpb24pICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBPd25lciB8ICIgKyBvd25lci5Pd25lcigpLlN0cmluZygpICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBUcmVhc3VyeSB8ICIgKyB0cmVhc3VyeS5TdHJpbmcoKSArICIgfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgQWRtaW5zIHwgIiArIGl0b2EoaW50NjQoYWRtaW5zLlNpemUoKSkpICsgIiBiZXNpZGVzIHRoZSBvd25lciB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBSZWZlcmVlcyB8ICIgKyBpdG9hKGludDY0KHJlZmVyZWVzLlNpemUoKSkpICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBQaWxvdHMgb24gcmVjb3JkIHwgIiArIGl0b2EoaW50NjQocGlsb3RzLlNpemUoKSkpICsgIiB8XG4iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJMZWFkZXJib2FyZCgpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgZ25vZmx5IGxlYWRlcmJvYXJkXG5cbiIpCgliLldyaXRlU3RyaW5nKCIjIyBNb3N0IGtpbGxzXG5cbiIpCgliLldyaXRlU3RyaW5nKCJLaWxscyByZWNvcmRlZCBvbi1jaGFpbiBieSB0aGUgZ2FtZSBzZXJ2ZXJzLiBUaGUgdGFibGUga2VlcHMgaXRzIHRvcCAiICsKCQlpdG9hKGludDY0KGxlYWRlcmJvYXJkU2l6ZSgpKSkgKyAiIHBpbG90cy5cblxuIikKCWlmIGxlbihraWxsZXJzLmFkZHJzKSA9PSAwIHsKCQliLldyaXRlU3RyaW5nKCJObyBraWxsIHdhcyByZWNvcmRlZCB5ZXQuXG4iKQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKCJ8IFJhbmsgfCBQaWxvdCB8IEtpbGxzIHxcbnwtLS18LS0tfC0tLXxcbiIpCgkJZm9yIGksIGEgOj0gcmFuZ2Uga2lsbGVycy5hZGRycyB7CgkJCWIuV3JpdGVTdHJpbmcoInwgIiArIGl0b2EoaW50NjQoaSsxKSkgKyAiIHwgIiArIHBpbG90TGluayhhKSArICIgfCAiICsgaXRvYShraWxsZXJzLnNjb3Jlc1tpXSkgKyAiIHxcbiIpCgkJfQoJfQoJYi5Xcml0ZVN0cmluZygiXG5bQmFjayB0byB0aGUgb3ZlcnZpZXddKCIgKyBsaW5rKCIiKSArICIpXG4iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gcGlsb3RMaW5rIHJldHVybnMgYSBtYXJrZG93biBsaW5rIHRvIHRoZSBwYWdlIG9mIGEgcGxheWVyLgpmdW5jIHBpbG90TGluayhhZGRyIGFkZHJlc3MpIHN0cmluZyB7CglhIDo9IGFkZHIuU3RyaW5nKCkKCXJldHVybiAiWyIgKyBhICsgIl0oIiArIGxpbmsoInBsYXllci8iK2EpICsgIikiCn0KCmZ1bmMgcmVuZGVyUGFyYW1zKCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBnbm9mbHkgcGFyYW1ldGVyc1xuXG4iKQoJYi5Xcml0ZVN0cmluZygiQWRtaW5zIGNoYW5nZSBhIHZhbHVlIHdpdGggYFNldFBhcmFtYCwgd2l0aGluIGl0cyBib3VuZHMuXG5cbiIpCgliLldyaXRlU3RyaW5nKCJ8IEtleSB8IFZhbHVlIHwgTWluIHwgTWF4IHwgTWVhbmluZyB8XG58LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCglmb3IgXywgcCA6PSByYW5nZSBwYXJhbXMgewoJCWIuV3JpdGVTdHJpbmcoInwgIiArIHAua2V5ICsgIiB8ICIgKyBpdG9hKHAudmFsdWUpICsgIiB8ICIgKyBpdG9hKHAubWluKSArICIgfCAiICsgaXRvYShwLm1heCkgKyAiIHwgIiArIHAuZG9jICsgIiB8XG4iKQoJfQoJYi5Xcml0ZVN0cmluZygiXG5bQmFjayB0byB0aGUgb3ZlcnZpZXddKCIgKyBsaW5rKCIiKSArICIpXG4iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJQbGF5ZXIoYWRkciBhZGRyZXNzKSBzdHJpbmcgewoJLy8gVGhlIGFkZHJlc3MgY29tZXMgZnJvbSB0aGUgVVJMOiBuZXZlciBwcmludCBpdCB1bmxlc3MgaXQgaXMgb25lLgoJaWYgIXZhbGlkQWRkcmVzcyhhZGRyKSB7CgkJcmV0dXJuICIjIGdub2ZseSBwaWxvdFxuXG5UaGlzIGlzIG5vdCBhIHZhbGlkIGFkZHJlc3MuIEdvIGJhY2sgdG8gdGhlIFtvdmVydmlld10oIiArIGxpbmsoIiIpICsgIikuXG4iCgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgZ25vZmx5IHBpbG90XG5cbiIpCgliLldyaXRlU3RyaW5nKCJ8IHwgfFxufC0tLXwtLS18XG4iKQoJYi5Xcml0ZVN0cmluZygifCBBZGRyZXNzIHwgIiArIGFkZHIuU3RyaW5nKCkgKyAiIHxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IEtpbGxzIHwgIiArIGl0b2EocmVjb3JkZWRLaWxscyhhZGRyKSkgKyAiIHxcbiIpCgliLldyaXRlU3RyaW5nKCJcbltMZWFkZXJib2FyZF0oIiArIGxpbmsoImxlYWRlcmJvYXJkIikgKyAiKSB8IFtPdmVydmlld10oIiArIGxpbmsoIiIpICsgIilcbiIpCglyZXR1cm4gYi5TdHJpbmcoKQp9ChrpBQoMdmFsaWRhdGUuZ25vEtgFcGFja2FnZSBnYW1lCgovLyB2YWxpZEFkZHJlc3MgaXMgdGhlIG9uZSBzdHJpbmcgcnVsZSBvZiB0aGlzIHJlYWxtOiB0aGUgYWRkcmVzc2VzIGl0IGtleXMKLy8gb24uIEV2ZXJ5dGhpbmcgZWxzZSBpdCBwcmludHMgaXMgYSBudW1iZXIsIGEgcGFyYW0ga2V5IGZyb20gaXRzIG93bgovLyByZWdpc3RyeSBvciBhbiBhZGRyZXNzIGNoZWNrZWQgaGVyZS4KCi8vIHZhbGlkQWRkcmVzcyByZXBvcnRzIHdoZXRoZXIgYWRkciBpcyBhIHZhbGlkIGFkZHJlc3MgaW4gaXRzIGNhbm9uaWNhbCwKLy8gbG93ZXJjYXNlIGZvcm0uCi8vCi8vIEJlY2gzMiBjYW4gYWxzbyBiZSB3cml0dGVuIGluIGFsbCBjYXBpdGFscywgYW5kIGFkZHJlc3MuSXNWYWxpZCBhY2NlcHRzCi8vIHRoYXQuIFRvIHRoaXMgcmVhbG0gdGhlIGNhcGl0YWxzIHdvdWxkIGJlIGEgc2Vjb25kIGtleSBmb3IgdGhlIHNhbWUKLy8gYWNjb3VudDogYSBzZWNvbmQgcGxheWVyIHJlY29yZCwgYSBzZWNvbmQgbGluZSBvbiBhIGxlYWRlcmJvYXJkLCBhbiBhZG1pbgovLyB3aG8gY2FuIG5ldmVyIGJlIG1hdGNoZWQgdG8gYSBjYWxsZXIuIEJlY2gzMiBkb2VzIG5vdCBhbGxvdyBtaXhpbmcgY2FzZXMsCi8vIHNvIGxvb2tpbmcgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBlbm91Z2guCmZ1bmMgdmFsaWRBZGRyZXNzKGFkZHIgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gYWRkci5Jc1ZhbGlkKCkgJiYgYWRkclswXSA9PSAnZycKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTI1MDAwMDAwdWdub3QSEwiAiN6+ARILMjAwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDXlza6HJnll26sYZ1geJSpU+/Irp3yZsxPPd706nF1scSQFRGnPutO59TpPSlj7Fu9X62jvym2eK7+PzWJZl1J79VRQ6DKzK0YNXYNoUhkdkm0CpZQ5KlS3/bGUfVXK+GgEQaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=