Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
4F681A22D8C4AC4BA2E07847E7772BDD7DB6924178DC894BF6A1CB6BDC0108EC
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
42,587,252
Requested gas limit
GAS USED
35,489,406
Gas consumed
FEE
42588ugnot
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
Cp3OAQoML3ZtLm1fYWRkcGtnEovOAQooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLdzQEKBHJiYWMSGmduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxGrsWCglSRUFETUUubWQSrRYjIFJCQUMKClJvbGUtQmFzZWQgQWNjZXNzIENvbnRyb2wgcGFja2FnZSBmb3IgR25vIHNtYXJ0IGNvbnRyYWN0cy4KCiMjIE92ZXJ2aWV3CgpSQkFDIHN5c3RlbSBlbmFibGluZyBkeW5hbWljIHJvbGUgbWFuYWdlbWVudCB3aXRoIGFkZHJlc3MtYmFzZWQgYXV0aG9yaXphdGlvbiBhbmQgdHdvLXN0ZXAgb3duZXJzaGlwIHRyYW5zZmVyLgoKIyMgRmVhdHVyZXMKCi0gRHluYW1pYyByb2xlIHJlZ2lzdHJhdGlvbiB3aXRoIGFkZHJlc3MgYXNzaWdubWVudAotIEFkZHJlc3MtYmFzZWQgYXV0aG9yaXphdGlvbiBjaGVja3MKLSBUd28tc3RlcCBvd25lcnNoaXAgdHJhbnNmZXIgKE93bmFibGUyU3RlcCBwYXR0ZXJuKQotIFN5c3RlbSByb2xlIHByb3RlY3Rpb24gKGNhbm5vdCBiZSByZW1vdmVkKQotIFJ1bnRpbWUgcm9sZSBhZGRyZXNzIHVwZGF0ZXMKCiMjIENvcmUgQVBJCgpgYGBnbwovLyBDcmVhdGUgUkJBQyBtYW5hZ2VyIHdpdGggYW4gZXhwbGljaXQgb3duZXIgYWRkcmVzcy4KZnVuYyBOZXdSQkFDV2l0aEFkZHJlc3MoYWRkciBhZGRyZXNzKSAqUkJBQwoKLy8gUm9sZSBtYW5hZ2VtZW50CmZ1bmMgKHJiICpSQkFDKSBSZWdpc3RlclJvbGUocm9sZU5hbWUgc3RyaW5nLCBhZGRyIGFkZHJlc3MpIGVycm9yCmZ1bmMgKHJiICpSQkFDKSBVcGRhdGVSb2xlQWRkcmVzcyhyb2xlTmFtZSBzdHJpbmcsIGFkZHIgYWRkcmVzcykgZXJyb3IKZnVuYyAocmIgKlJCQUMpIFJlbW92ZVJvbGUocm9sZU5hbWUgc3RyaW5nKSBlcnJvcgoKLy8gQXV0aG9yaXphdGlvbgpmdW5jIChyYiAqUkJBQykgSXNBdXRob3JpemVkKHJvbGVOYW1lIHN0cmluZywgYWRkciBhZGRyZXNzKSBib29sCgovLyBSb2xlIHF1ZXJpZXMKZnVuYyAocmIgKlJCQUMpIEdldFJvbGVBZGRyZXNzKHJvbGVOYW1lIHN0cmluZykgKGFkZHJlc3MsIGVycm9yKQpmdW5jIChyYiAqUkJBQykgR2V0QWxsUm9sZUFkZHJlc3NlcygpIG1hcFtzdHJpbmddYWRkcmVzcwoKLy8gT3duZXJzaGlwIG1hbmFnZW1lbnQKZnVuYyAocmIgKlJCQUMpIE93bmVyKCkgYWRkcmVzcwpmdW5jIChyYiAqUkJBQykgUGVuZGluZ093bmVyKCkgYWRkcmVzcwpmdW5jIChyYiAqUkJBQykgVHJhbnNmZXJPd25lcnNoaXBCeShuZXdPd25lciwgY2FsbGVyIGFkZHJlc3MpIGVycm9yCmZ1bmMgKHJiICpSQkFDKSBBY2NlcHRPd25lcnNoaXBCeShhZGRyIGFkZHJlc3MpIGVycm9yCmZ1bmMgKHJiICpSQkFDKSBEcm9wT3duZXJzaGlwQnkoYWRkciBhZGRyZXNzKSBlcnJvcgpgYGAKCiMjIFVzYWdlCgpgYGBnbwovLyBDcmVhdGUgbWFuYWdlciB3aXRoIG93bmVyCm1hbmFnZXIgOj0gcmJhYy5OZXdSQkFDV2l0aEFkZHJlc3MoYWRtaW5BZGRyKQoKLy8gUmVnaXN0ZXIgcm9sZSB3aXRoIGFkZHJlc3MKZXJyIDo9IG1hbmFnZXIuUmVnaXN0ZXJSb2xlKCJlZGl0b3IiLCBlZGl0b3JBZGRyKQppZiBlcnIgIT0gbmlsIHsKICAgIC8vIGhhbmRsZSBlcnJvcgp9CgovLyBDaGVjayBhdXRob3JpemF0aW9uCmlmIG1hbmFnZXIuSXNBdXRob3JpemVkKCJlZGl0b3IiLCBjYWxsZXJBZGRyKSB7CiAgICAvLyBjYWxsZXIgaXMgYXV0aG9yaXplZCBhcyBlZGl0b3IKfQoKLy8gVXBkYXRlIHJvbGUgYWRkcmVzcwplcnIgPSBtYW5hZ2VyLlVwZGF0ZVJvbGVBZGRyZXNzKCJlZGl0b3IiLCBuZXdFZGl0b3JBZGRyKQoKLy8gR2V0IHJvbGUgYWRkcmVzcwphZGRyLCBlcnIgOj0gbWFuYWdlci5HZXRSb2xlQWRkcmVzcygiZWRpdG9yIikKYGBgCgojIyBTeXN0ZW0gUm9sZXMKClJlc2VydmVkIHN5c3RlbS1yb2xlIG5hbWVzIGNhbm5vdCBiZSByZW1vdmVkIGFmdGVyIHRoZXkgYXJlIHJlZ2lzdGVyZWQuIEEgbmV3ClJCQUMgbWFuYWdlciBzdGFydHMgd2l0aCBubyByb2xlIGVudHJpZXM7IHJlZ2lzdGVyIGVhY2ggc3lzdGVtIHJvbGUgZXhwbGljaXRseQp3aXRoIGl0cyBhZGRyZXNzLgoKLSBgYWRtaW5gLCBgZ292ZXJuYW5jZWAsIGBkZXZvcHNgCi0gYHBvb2xgLCBgcG9zaXRpb25gLCBgcm91dGVyYCwgYHN0YWtlcmAKLSBgZW1pc3Npb25gLCBgbGF1bmNocGFkYCwgYHByb3RvY29sX2ZlZWAKLSBgZ292X3N0YWtlcmAsIGB4Z25zYCwgYGNvbW11bml0eV9wb29sYAoKIyMgRXJyb3JzCgp8IEVycm9yIHwgRGVzY3JpcHRpb24gfAp8LS0tLS0tLXwtLS0tLS0tLS0tLS0tfAp8IGBFcnJJbnZhbGlkUm9sZU5hbWVgIHwgUm9sZSBuYW1lIGlzIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSB8CnwgYEVyclJvbGVBbHJlYWR5RXhpc3RzYCB8IFJvbGUgYWxyZWFkeSByZWdpc3RlcmVkIHwKfCBgRXJyUm9sZURvZXNOb3RFeGlzdGAgfCBSb2xlIG5vdCBmb3VuZCB8CnwgYEVyckNhbm5vdFJlbW92ZVN5c3RlbVJvbGVgIHwgQ2Fubm90IHJlbW92ZSBhIHJlZ2lzdGVyZWQgc3lzdGVtIHJvbGUgfAp8IGBFcnJJbnZhbGlkQWRkcmVzc2AgfCBJbnZhbGlkIGFkZHJlc3MgZm9yIGBVcGRhdGVSb2xlQWRkcmVzc2Agb3Igb3duZXJzaGlwIHRyYW5zZmVyOyBgUmVnaXN0ZXJSb2xlYCBzdG9yZXMgaXRzIHN1cHBsaWVkIGFkZHJlc3Mgd2l0aG91dCB2YWxpZGF0aW9uIHwKfCBgRXJyVW5hdXRob3JpemVkYCB8IENhbGxlciBpcyBub3Qgb3duZXIgfAp8IGBFcnJOb1BlbmRpbmdPd25lcmAgfCBObyBwZW5kaW5nIG93bmVyIHwKfCBgRXJyUGVuZGluZ1VuYXV0aG9yaXplZGAgfCBDYWxsZXIgaXMgbm90IHBlbmRpbmcgb3duZXIgfAoKIyMgU2VjdXJpdHkKCi0gQWRkcmVzcy1iYXNlZCByb2xlIGF1dGhvcml6YXRpb24KLSBUd28tc3RlcCBvd25lcnNoaXAgdHJhbnNmZXIgcHJldmVudHMgYWNjaWRlbnRhbCB0cmFuc2ZlcnMKLSBTeXN0ZW0gcm9sZXMgcHJvdGVjdGVkIGZyb20gcmVtb3ZhbAotIFJvbGUgbmFtZSB2YWxpZGF0aW9uIChubyBlbXB0eS93aGl0ZXNwYWNlIG5hbWVzKRr1MAoHZG9jLmdubxLpMC8vIFBhY2thZ2UgcmJhYyBwcm92aWRlcyBhIHNpbXBsZSBhZGRyZXNzLWJhc2VkIFJvbGUtQmFzZWQgQWNjZXNzIENvbnRyb2wgKFJCQUMpCi8vIHN5c3RlbSBmb3IgR25vIHNtYXJ0IGNvbnRyYWN0cy4gSXQgZW5hYmxlcyBkeW5hbWljIHJlZ2lzdHJhdGlvbiwgdXBkYXRlLCBhbmQgcmVtb3ZhbAovLyBvZiByb2xlcyB3aXRoIGFzc2lnbmVkIGFkZHJlc3Nlcy4KLy8KLy8gIyMgT3ZlcnZpZXcKLy8KLy8gVGhlIFJCQUMgcGFja2FnZSBwcm92aWRlcyBhIG1hbmFnZXIgdGhhdCBtYWludGFpbnMgYW4gaW50ZXJuYWwgcmVnaXN0cnkgb2Ygcm9sZXMuCi8vIEVhY2ggcm9sZSBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBhZGRyZXNzLgovLyBBdXRob3JpemF0aW9uIGlzIHBlcmZvcm1lZCBieSBjaGVja2luZyBpZiBhIGdpdmVuIGFkZHJlc3MgbWF0Y2hlcyB0aGUgcm9sZSdzIGFzc2lnbmVkIGFkZHJlc3MuCi8vCi8vIEtleSBjb21wb25lbnRzIG9mIHRoaXMgcGFja2FnZSBpbmNsdWRlOgovLwovLyAgMS4gKipSb2xlKio6IFJlcHJlc2VudHMgYSByb2xlIHdpdGggYSBuYW1lIGFuZCBhbiBhc3NpZ25lZCBhZGRyZXNzLgovLyAgMi4gKipSQkFDIE1hbmFnZXIqKjogVGhlIGNvcmUgdHlwZSAoUkJBQykgdGhhdCBtYW5hZ2VzIHJvbGUgcmVnaXN0cmF0aW9uLCBhZGRyZXNzCi8vICAgICBhc3NpZ25tZW50LCBhdXRob3JpemF0aW9uIHZlcmlmaWNhdGlvbiwgYW5kIHJvbGUgcmVtb3ZhbC4KLy8gIDMuICoqT3duYWJsZTJTdGVwKio6IFByb3ZpZGVzIHR3by1zdGVwIG93bmVyc2hpcCB0cmFuc2ZlciBmdW5jdGlvbmFsaXR5IGludGVncmF0ZWQKLy8gICAgIGludG8gdGhlIFJCQUMgbWFuYWdlci4KLy8KLy8gIyMgS2V5IEZlYXR1cmVzCi8vCi8vICAgLSAqKkR5bmFtaWMgUm9sZSBNYW5hZ2VtZW50Kio6IFJvbGVzIGNhbiBiZSByZWdpc3RlcmVkLCB1cGRhdGVkLCBhbmQgcmVtb3ZlZCBhdCBydW50aW1lCi8vICAgICB3aXRob3V0IHJlcXVpcmluZyBjb250cmFjdCByZWRlcGxveW1lbnQuCi8vICAgLSAqKkFkZHJlc3MtQmFzZWQgQXV0aG9yaXphdGlvbioqOiBFYWNoIHJvbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIGFkZHJlc3MsCi8vICAgLSAqKlN5c3RlbSBSb2xlcyoqOiBSZXNlcnZlZCBzeXN0ZW0tcm9sZSBuYW1lcyAoYWRtaW4sIGRldm9wcywgcG9vbCwgZXRjLikKLy8gICAgIGNhbm5vdCBiZSByZW1vdmVkIG9uY2UgcmVnaXN0ZXJlZC4gVGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IHByZS1wb3B1bGF0ZQovLyAgICAgdGhlc2Ugcm9sZSBlbnRyaWVzOyBjYWxsZXJzIHJlZ2lzdGVyIHRoZWlyIGFkZHJlc3NlcyBleHBsaWNpdGx5LgovLyAgIC0gKipUd28tU3RlcCBPd25lcnNoaXAgVHJhbnNmZXIqKjogQnVpbHQtaW4gc2VjdXJlIG93bmVyc2hpcCB0cmFuc2ZlciBtZWNoYW5pc20KLy8gICAgIHJlcXVpcmluZyBleHBsaWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBuZXcgb3duZXIuCi8vICAgLSAqKkVuY2Fwc3VsYXRpb24qKjogSW50ZXJuYWwgc3RhdGUgKHJvbGVzIHJlZ2lzdHJ5KSBpcyBlbmNhcHN1bGF0ZWQgd2l0aGluIHRoZSBSQkFDCi8vICAgICBtYW5hZ2VyLCBwcmV2ZW50aW5nIHVuaW50ZW5kZWQgZXh0ZXJuYWwgbW9kaWZpY2F0aW9ucy4KLy8KLy8gIyMgV29ya2Zsb3cKLy8KLy8gVHlwaWNhbCB1c2FnZSBvZiB0aGUgUkJBQyBwYWNrYWdlIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci8vCi8vICAxLiAqKkluaXRpYWxpemF0aW9uKio6IENyZWF0ZSBhIG5ldyBSQkFDIG1hbmFnZXIgd2l0aAovLyAgICAgYE5ld1JCQUNXaXRoQWRkcmVzcyhhZGRyKWAsIHBhc3NpbmcgdGhlIGludGVuZGVkIG93bmVyIGV4cGxpY2l0bHkuCi8vICAyLiAqKlJvbGUgUmVnaXN0cmF0aW9uKio6IFJlZ2lzdGVyIHJvbGVzIHVzaW5nIGBSZWdpc3RlclJvbGUocm9sZU5hbWUsIGFkZHJlc3MpYC4KLy8gIDMuICoqQXV0aG9yaXphdGlvbiBDaGVjayoqOiBWZXJpZnkgaWYgYW4gYWRkcmVzcyBpcyBhdXRob3JpemVkIGZvciBhIHJvbGUgdXNpbmcKLy8gICAgIGBJc0F1dGhvcml6ZWQocm9sZU5hbWUsIGFkZHJlc3MpYC4KLy8gIDQuICoqUm9sZSBNYW5hZ2VtZW50Kio6IFVwZGF0ZSByb2xlIGFkZHJlc3NlcyB3aXRoIGBVcGRhdGVSb2xlQWRkcmVzc2Agb3IgcmVtb3ZlCi8vICAgICBub24tc3lzdGVtIHJvbGVzIHdpdGggYFJlbW92ZVJvbGVgLgovLwovLyAjIyBFeGFtcGxlIFVzYWdlCi8vCi8vIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgUkJBQyBwYWNrYWdlOgovLwovLyBgYGBnbm8KLy8gcGFja2FnZSBtYWluCi8vCi8vIGltcG9ydCAoCi8vCi8vCSJnbm8ubGFuZC9wL2dub3N3YXAvcmJhYy92MSIKLy8KLy8gKQovLwovLwlmdW5jIG1haW4oKSB7Ci8vCSAgICAvLyBUaGUgb3duZXIgaXMgc3VwcGxpZWQgZXhwbGljaXRseTsgbm8gY29uc3RydWN0b3IgZGVyaXZlcyBpdCBmcm9tCi8vCSAgICAvLyBhbiBpbXBsaWNpdCBvcmlnaW4gY2FsbGVyLgovLwkgICAgb3duZXJBZGRyIDo9IGFkZHJlc3MoImcxLi4uIikKLy8JICAgIG1hbmFnZXIgOj0gcmJhYy5OZXdSQkFDV2l0aEFkZHJlc3Mob3duZXJBZGRyKQovLwovLwkgICAgLy8gRGVmaW5lIGV4YW1wbGUgYWRkcmVzc2VzCi8vCSAgICBhZG1pbkFkZHIgOj0gYWRkcmVzcygiZzEuLi4iKQovLwkgICAgdXNlckFkZHIgIDo9IGFkZHJlc3MoImcxLi4uIikKLy8KLy8JICAgIC8vIFJlZ2lzdGVyIGFuICJhZG1pbiIgcm9sZSB3aXRoIGFkbWluQWRkcgovLwkgICAgaWYgZXJyIDo9IG1hbmFnZXIuUmVnaXN0ZXJSb2xlKCJhZG1pbiIsIGFkbWluQWRkcik7IGVyciAhPSBuaWwgewovLwkgICAgICAgIHBhbmljKGVycikKLy8JICAgIH0KLy8KLy8JICAgIC8vIFJlZ2lzdGVyIGEgY3VzdG9tICJlZGl0b3IiIHJvbGUgd2l0aCB1c2VyQWRkcgovLwkgICAgaWYgZXJyIDo9IG1hbmFnZXIuUmVnaXN0ZXJSb2xlKCJlZGl0b3IiLCB1c2VyQWRkcik7IGVyciAhPSBuaWwgewovLwkgICAgICAgIHBhbmljKGVycikKLy8JICAgIH0KLy8KLy8JICAgIC8vIENoZWNrIGlmIGFkbWluQWRkciBpcyBhdXRob3JpemVkIGZvciB0aGUgImFkbWluIiByb2xlCi8vCSAgICBpZiBtYW5hZ2VyLklzQXV0aG9yaXplZCgiYWRtaW4iLCBhZG1pbkFkZHIpIHsKLy8JICAgICAgICBwcmludGxuKCJBZG1pbiBhY2Nlc3MgZ3JhbnRlZCIpCi8vCSAgICB9Ci8vCi8vCSAgICAvLyBDaGVjayBpZiB1c2VyQWRkciBpcyBhdXRob3JpemVkIGZvciB0aGUgImFkbWluIiByb2xlCi8vCSAgICBpZiAhbWFuYWdlci5Jc0F1dGhvcml6ZWQoImFkbWluIiwgdXNlckFkZHIpIHsKLy8JICAgICAgICBwcmludGxuKCJVc2VyIGRvZXMgbm90IGhhdmUgYWRtaW4gYWNjZXNzIikKLy8JICAgIH0KLy8KLy8JICAgIC8vIFVwZGF0ZSB0aGUgZWRpdG9yIHJvbGUgdG8gYSBkaWZmZXJlbnQgYWRkcmVzcwovLwkgICAgbmV3RWRpdG9yQWRkciA6PSBhZGRyZXNzKCJnMS4uLiIpCi8vCSAgICBpZiBlcnIgOj0gbWFuYWdlci5VcGRhdGVSb2xlQWRkcmVzcygiZWRpdG9yIiwgbmV3RWRpdG9yQWRkcik7IGVyciAhPSBuaWwgewovLwkgICAgICAgIHBhbmljKGVycikKLy8JICAgIH0KLy8KLy8JICAgIC8vIEdldCBhbGwgcm9sZSBhZGRyZXNzZXMKLy8JICAgIGFsbFJvbGVzIDo9IG1hbmFnZXIuR2V0QWxsUm9sZUFkZHJlc3NlcygpCi8vCSAgICBmb3Igcm9sZU5hbWUsIGFkZHIgOj0gcmFuZ2UgYWxsUm9sZXMgewovLwkgICAgICAgIHByaW50bG4ocm9sZU5hbWUsICItPiIsIGFkZHIuU3RyaW5nKCkpCi8vCSAgICB9Ci8vCX0KLy8KLy8gYGBgCi8vCi8vICMjIFN5c3RlbSBSb2xlcwovLwovLyBUaGUgcGFja2FnZSByZXNlcnZlcyB0aGUgZm9sbG93aW5nIHN5c3RlbS1yb2xlIG5hbWVzLiBBIG5ldyBSQkFDIG1hbmFnZXIKLy8gc3RhcnRzIHdpdGggbm8gcm9sZSBlbnRyaWVzLCBzbyBjYWxsZXJzIG11c3QgcmVnaXN0ZXIgZWFjaCByb2xlIGFuZCBhZGRyZXNzCi8vIGV4cGxpY2l0bHkuIE9uY2UgcmVnaXN0ZXJlZCwgYSBzeXN0ZW0gcm9sZSBjYW5ub3QgYmUgcmVtb3ZlZDoKLy8KLy8gICAtIGFkbWluOiBTeXN0ZW0gYWRtaW5pc3RyYXRvciByb2xlCi8vICAgLSBkZXZvcHM6IERldk9wcyBvcGVyYXRpb25zIHJvbGUKLy8gICAtIGNvbW11bml0eV9wb29sOiBDb21tdW5pdHkgcG9vbCBtYW5hZ2VtZW50IHJvbGUKLy8gICAtIGdvdmVybmFuY2U6IEdvdmVybmFuY2Ugc3lzdGVtIHJvbGUKLy8gICAtIGdvdl9zdGFrZXI6IEdvdmVybmFuY2Ugc3Rha2VyIHJvbGUKLy8gICAtIHhnbnM6IHhHTlMgdG9rZW4gcm9sZQovLyAgIC0gcG9vbDogUG9vbCBtYW5hZ2VtZW50IHJvbGUKLy8gICAtIHBvc2l0aW9uOiBQb3NpdGlvbiBtYW5hZ2VtZW50IHJvbGUKLy8gICAtIHJvdXRlcjogUm91dGVyIHJvbGUKLy8gICAtIHN0YWtlcjogU3Rha2VyIHJvbGUKLy8gICAtIGVtaXNzaW9uOiBFbWlzc2lvbiBtYW5hZ2VtZW50IHJvbGUKLy8gICAtIGxhdW5jaHBhZDogTGF1bmNocGFkIHJvbGUKLy8gICAtIHByb3RvY29sX2ZlZTogUHJvdG9jb2wgZmVlIG1hbmFnZW1lbnQgcm9sZQovLwovLyAjIyBFcnJvciBIYW5kbGluZwovLwovLyBUaGUgcGFja2FnZSBkZWZpbmVzIHNldmVyYWwgZXJyb3IgdHlwZXM6Ci8vCi8vICAgLSBFcnJSb2xlQWxyZWFkeUV4aXN0czogQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHJvbGUgdGhhdCBhbHJlYWR5IGV4aXN0cy4KLy8gICAtIEVyclJvbGVEb2VzTm90RXhpc3Q6IEF0dGVtcHRpbmcgdG8gYWNjZXNzIG9yIG1vZGlmeSBhIG5vbi1leGlzdGVudCByb2xlLgovLyAgIC0gRXJyQ2Fubm90UmVtb3ZlU3lzdGVtUm9sZTogQXR0ZW1wdGluZyB0byByZW1vdmUgYSByZWdpc3RlcmVkIHN5c3RlbSByb2xlLgovLyAgIC0gRXJySW52YWxpZEFkZHJlc3M6IFByb3ZpZGluZyBhbiBpbnZhbGlkIGFkZHJlc3MgdG8gVXBkYXRlUm9sZUFkZHJlc3Mgb3IKLy8gICAgIGFuIG93bmVyc2hpcC10cmFuc2ZlciBtZXRob2QuIFJlZ2lzdGVyUm9sZSBzdG9yZXMgaXRzIHN1cHBsaWVkIGFkZHJlc3MKLy8gICAgIHdpdGhvdXQgdmFsaWRhdGluZyBpdC4KLy8gICAtIEVyclVuYXV0aG9yaXplZDogQ2FsbGVyIGlzIG5vdCB0aGUgb3duZXIgd2hlbiBvd25lciBwZXJtaXNzaW9uIGlzIHJlcXVpcmVkLgovLyAgIC0gRXJyTm9QZW5kaW5nT3duZXI6IEF0dGVtcHRpbmcgdG8gYWNjZXB0IG93bmVyc2hpcCB3aGVuIG5vIHRyYW5zZmVyIGlzIHBlbmRpbmcuCi8vICAgLSBFcnJQZW5kaW5nVW5hdXRob3JpemVkOiBDYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIG93bmVyIHdoZW4gYWNjZXB0aW5nIG93bmVyc2hpcC4KLy8KLy8gIyMgT3duZXJzaGlwIE1hbmFnZW1lbnQKLy8KLy8gVGhlIFJCQUMgbWFuYWdlciBpbmNsdWRlcyBidWlsdC1pbiB0d28tc3RlcCBvd25lcnNoaXAgdHJhbnNmZXIgZnVuY3Rpb25hbGl0eToKLy8KLy8gIDEuIEN1cnJlbnQgb3duZXIgY2FsbHMgVHJhbnNmZXJPd25lcnNoaXBCeSB0byBpbml0aWF0ZSB0cmFuc2Zlci4KLy8gIDIuIE5ldyBvd25lciBjYWxscyBBY2NlcHRPd25lcnNoaXBCeSB0byBjb21wbGV0ZSB0aGUgdHJhbnNmZXIuCi8vICAzLiBPd25lciBjYW4gZHJvcCBvd25lcnNoaXAgZW50aXJlbHkgdXNpbmcgRHJvcE93bmVyc2hpcEJ5LgovLwovLyAjIyBMaW1pdGF0aW9ucyBhbmQgQ29uc2lkZXJhdGlvbnMKLy8KLy8gICAtIEVhY2ggcm9sZSBjYW4gb25seSBoYXZlIG9uZSBhc3NpZ25lZCBhZGRyZXNzLiBGb3IgbXVsdGktYWRkcmVzcyBhdXRob3JpemF0aW9uLAovLyAgICAgY29uc2lkZXIgY3JlYXRpbmcgbXVsdGlwbGUgcm9sZXMgb3IgaW1wbGVtZW50aW5nIGEgd3JhcHBlci4KLy8gICAtIFN5c3RlbSByb2xlcyBhcmUgcHJvdGVjdGVkIGFuZCBjYW5ub3QgYmUgcmVtb3ZlZCB0byBlbnN1cmUgc3lzdGVtIHN0YWJpbGl0eS4KLy8gICAtIGBSZWdpc3RlclJvbGVgIGRvZXMgbm90IHZhbGlkYXRlIHRoZSBzdXBwbGllZCBhZGRyZXNzLiBBZGRyZXNzIHZhbGlkYXRpb24KLy8gICAgIGlzIHBlcmZvcm1lZCBieSBgVXBkYXRlUm9sZUFkZHJlc3NgIGFuZCBvd25lcnNoaXAtdHJhbnNmZXIgbWV0aG9kcy4KLy8KLy8gUGFja2FnZSByYmFjIGlzIGludGVuZGVkIGZvciB1c2UgaW4gR25vIHNtYXJ0IGNvbnRyYWN0cyByZXF1aXJpbmcgc2ltcGxlLAovLyBhZGRyZXNzLWJhc2VkIGFjY2VzcyBjb250cm9sIHdpdGggcm9sZSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcy4KcGFja2FnZSByYmFjChq5AwoKZXJyb3JzLmdubxKqA3BhY2thZ2UgcmJhYwoKY29uc3QgKAoJRXJyTm9QZW5kaW5nT3duZXIgICAgICA9ICJubyBwZW5kaW5nIG93bmVyIgoJRXJyVW5hdXRob3JpemVkICAgICAgICA9ICJjYWxsZXIgaXMgbm90IG93bmVyIgoJRXJyUGVuZGluZ1VuYXV0aG9yaXplZCA9ICJjYWxsZXIgaXMgbm90IHBlbmRpbmcgb3duZXIiCglFcnJJbnZhbGlkQWRkcmVzcyAgICAgID0gImludmFsaWQgYWRkcmVzcyIKCglFcnJJbnZhbGlkUm9sZU5hbWUgICAgICAgID0gImludmFsaWQgcm9sZSBuYW1lIgoJRXJyUm9sZURvZXNOb3RFeGlzdCAgICAgICA9ICJyb2xlIGRvZXMgbm90IGV4aXN0IgoJRXJyUm9sZUFscmVhZHlFeGlzdHMgICAgICA9ICJyb2xlIGFscmVhZHkgZXhpc3RzIgoJRXJyQ2Fubm90UmVtb3ZlU3lzdGVtUm9sZSA9ICJjYW5ub3QgcmVtb3ZlIHN5c3RlbSByb2xlIgopChpBCgtnbm9tb2QudG9tbBIybW9kdWxlID0gImduby5sYW5kL3AvZ25vc3dhcC9yYmFjL3YxIgpnbm8gPSAiMC45IgoamCUKC293bmFibGUuZ25vEoglcGFja2FnZSByYmFjCgppbXBvcnQgKAoJImNoYWluIgoJImVycm9ycyIKKQoKY29uc3QgKAoJT3duZXJzaGlwVHJhbnNmZXJFdmVudCAgICAgICAgPSAiT3duZXJzaGlwVHJhbnNmZXIiCglPd25lcnNoaXBUcmFuc2ZlclN0YXJ0ZWRFdmVudCA9ICJPd25lcnNoaXBUcmFuc2ZlclN0YXJ0ZWQiCikKCi8vIE93bmFibGUyU3RlcCBpbXBsZW1lbnRzIGEgdHdvLXN0ZXAgb3duZXJzaGlwIHRyYW5zZmVyIG1lY2hhbmlzbS4KLy8gSXQgcmVxdWlyZXMgdGhlIG5ldyBvd25lciB0byBleHBsaWNpdGx5IGFjY2VwdCBvd25lcnNoaXAgYmVmb3JlIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQsCi8vIHByZXZlbnRpbmcgYWNjaWRlbnRhbCB0cmFuc2ZlcnMgdG8gaW5jb3JyZWN0IGFkZHJlc3Nlcy4KLy8KLy8gTm90ZTogVGhpcyBwYWNrYWdlIGRvZXMgbm90IHZlcmlmeSBjYWxsZXJzLiBDb25zdW1pbmcgcmVhbG1zIG11c3QgZXh0cmFjdCB0aGUgYWN0dWFsCi8vIGNhbGxlciBmcm9tIHRoZSBsaXZlIHJlYWxtIGNvbnRleHQgYW5kIHBhc3MgaXQgdG8gdGhlc2UgbWV0aG9kcy4KdHlwZSBPd25hYmxlMlN0ZXAgc3RydWN0IHsKCW93bmVyICAgICAgICBhZGRyZXNzCglwZW5kaW5nT3duZXIgYWRkcmVzcwp9CgovLyBuZXdPd25hYmxlMlN0ZXBXaXRoQWRkcmVzcyBjcmVhdGVzIGEgbmV3IE93bmFibGUyU3RlcCBpbnN0YW5jZSB3aXRoIGFkZHIgYXMgb3duZXIuCmZ1bmMgbmV3T3duYWJsZTJTdGVwV2l0aEFkZHJlc3MoYWRkciBhZGRyZXNzKSAqT3duYWJsZTJTdGVwIHsKCXJldHVybiAmT3duYWJsZTJTdGVwewoJCW93bmVyOiAgICAgICAgYWRkciwKCQlwZW5kaW5nT3duZXI6ICIiLAoJfQp9CgovLyBUcmFuc2Zlck93bmVyc2hpcEJ5IGluaXRpYXRlcyBvd25lcnNoaXAgdHJhbnNmZXIgYnkgc2V0dGluZyBuZXdPd25lciBhcyBwZW5kaW5nIG93bmVyLgovLyBUaGUgbmV3T3duZXIgbXVzdCBjYWxsIEFjY2VwdE93bmVyc2hpcEJ5IHRvIGNvbXBsZXRlIHRoZSB0cmFuc2Zlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG5ld093bmVyOiBOb24temVybywgc3ludGFjdGljYWxseSB2YWxpZCBhZGRyZXNzIHRvIHJlY29yZCBhcyB0aGUgcGVuZGluZyBvd25lci4KLy8gICAtIGNhbGxlcjogQWRkcmVzcyBhdXRob3JpemVkIHRvIGluaXRpYXRlIHRoZSB0cmFuc2ZlcjsgaXQgbXVzdCBlcXVhbCB0aGUgY3VycmVudCBvd25lci4KLy8KLy8gRXJyb3JzOgovLyAgIC0gRXJyVW5hdXRob3JpemVkOiBjYWxsZXIgaXMgbm90IHRoZSBjdXJyZW50IG93bmVyCi8vICAgLSBFcnJJbnZhbGlkQWRkcmVzczogbmV3T3duZXIgaXMgZW1wdHkgb3IgaGFzIGFuIGludmFsaWQgZm9ybWF0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIHdoZW4gdGhlIHBlbmRpbmcgb3duZXIgaXMgc2V0OyBvdGhlcndpc2UgRXJyVW5hdXRob3JpemVkIG9yIEVyckludmFsaWRBZGRyZXNzLgpmdW5jIChvICpPd25hYmxlMlN0ZXApIFRyYW5zZmVyT3duZXJzaGlwQnkobmV3T3duZXIsIGNhbGxlciBhZGRyZXNzKSBlcnJvciB7CglpZiAhby5Jc093bmVyKGNhbGxlcikgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclVuYXV0aG9yaXplZCkKCX0KCglpZiBuZXdPd25lciA9PSB6ZXJvQWRkcmVzcyB8fCAhbmV3T3duZXIuSXNWYWxpZCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJJbnZhbGlkQWRkcmVzcykKCX0KCglvLnBlbmRpbmdPd25lciA9IG5ld093bmVyCgoJY2hhaW4uRW1pdCgKCQlPd25lcnNoaXBUcmFuc2ZlclN0YXJ0ZWRFdmVudCwKCQkiZnJvbSIsIG8ub3duZXIuU3RyaW5nKCksCgkJInRvIiwgbmV3T3duZXIuU3RyaW5nKCksCgkpCgoJcmV0dXJuIG5pbAp9CgovLyBBY2NlcHRPd25lcnNoaXBCeSBjb21wbGV0ZXMgdGhlIG93bmVyc2hpcCB0cmFuc2Zlci4KLy8gTXVzdCBiZSBjYWxsZWQgYnkgdGhlIHBlbmRpbmcgb3duZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjYWxsZXI6IEFkZHJlc3MgYXR0ZW1wdGluZyB0byBhY2NlcHQgb3duZXJzaGlwOyBpdCBtdXN0IGVxdWFsIHRoZSByZWNvcmRlZCBwZW5kaW5nIG93bmVyLgovLwovLyBFcnJvcnM6Ci8vICAgLSBFcnJOb1BlbmRpbmdPd25lcjogbm8gb3duZXJzaGlwIHRyYW5zZmVyIGlzIHBlbmRpbmcKLy8gICAtIEVyclBlbmRpbmdVbmF1dGhvcml6ZWQ6IGNhbGxlciBpcyBub3QgdGhlIHBlbmRpbmcgb3duZXIKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiBvd25lcnNoaXAgaXMgdHJhbnNmZXJyZWQgdG8gY2FsbGVyOyBvdGhlcndpc2UgRXJyTm9QZW5kaW5nT3duZXIgb3IgRXJyUGVuZGluZ1VuYXV0aG9yaXplZC4KZnVuYyAobyAqT3duYWJsZTJTdGVwKSBBY2NlcHRPd25lcnNoaXBCeShjYWxsZXIgYWRkcmVzcykgZXJyb3IgewoJaWYgby5wZW5kaW5nT3duZXIgPT0gemVyb0FkZHJlc3MgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyck5vUGVuZGluZ093bmVyKQoJfQoKCWlmICFvLklzUGVuZGluZ093bmVyKGNhbGxlcikgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclBlbmRpbmdVbmF1dGhvcml6ZWQpCgl9CgoJcHJldk93bmVyIDo9IG8ub3duZXIKCW8ub3duZXIgPSBvLnBlbmRpbmdPd25lcgoJby5wZW5kaW5nT3duZXIgPSAiIgoKCWNoYWluLkVtaXQoCgkJT3duZXJzaGlwVHJhbnNmZXJFdmVudCwKCQkiZnJvbSIsIHByZXZPd25lci5TdHJpbmcoKSwKCQkidG8iLCBvLm93bmVyLlN0cmluZygpLAoJKQoKCXJldHVybiBuaWwKfQoKLy8gRHJvcE93bmVyc2hpcEJ5IHJlbW92ZXMgdGhlIG93bmVyLCBkaXNhYmxpbmcgYWxsIG93bmVyLW9ubHkgYWN0aW9ucy4KLy8gVGhpcyBpcyBpcnJldmVyc2libGUgLSB3aGVuIG93bmVyc2hpcCBpcyBkcm9wcGVkLCBubyBmdXR1cmUgb3duZXItb25seSBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjYWxsZXI6IEFkZHJlc3MgcmVxdWVzdGluZyB0aGUgZHJvcDsgaXQgbXVzdCBlcXVhbCB0aGUgY3VycmVudCBvd25lci4KLy8KLy8gRXJyb3JzOgovLyAgIC0gRXJyVW5hdXRob3JpemVkOiBjYWxsZXIgaXMgbm90IHRoZSBjdXJyZW50IG93bmVyCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIHdoZW4gb3duZXIgYW5kIHBlbmRpbmcgb3duZXIgYXJlIGNsZWFyZWQ7IG90aGVyd2lzZSBFcnJVbmF1dGhvcml6ZWQuCmZ1bmMgKG8gKk93bmFibGUyU3RlcCkgRHJvcE93bmVyc2hpcEJ5KGNhbGxlciBhZGRyZXNzKSBlcnJvciB7CglpZiAhby5Jc093bmVyKGNhbGxlcikgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclVuYXV0aG9yaXplZCkKCX0KCglwcmV2T3duZXIgOj0gby5vd25lcgoJby5vd25lciA9ICIiCglvLnBlbmRpbmdPd25lciA9ICIiCgoJY2hhaW4uRW1pdCgKCQlPd25lcnNoaXBUcmFuc2ZlckV2ZW50LAoJCSJmcm9tIiwgcHJldk93bmVyLlN0cmluZygpLAoJCSJ0byIsICIiLAoJKQoKCXJldHVybiBuaWwKfQoKLy8gT3duZXIgcmV0dXJucyB0aGUgY3VycmVudCBvd25lciBhZGRyZXNzLiBSZXR1cm5zIGVtcHR5IGFkZHJlc3MgaWYgb3duZXJzaGlwIGhhcyBiZWVuIGRyb3BwZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBDdXJyZW50IG93bmVyIGFkZHJlc3MsIG9yIHRoZSBlbXB0eSBhZGRyZXNzIGFmdGVyIG93bmVyc2hpcCBpcyBkcm9wcGVkLgpmdW5jIChvICpPd25hYmxlMlN0ZXApIE93bmVyKCkgYWRkcmVzcyB7CglyZXR1cm4gby5vd25lcgp9CgovLyBQZW5kaW5nT3duZXIgcmV0dXJucyB0aGUgcGVuZGluZyBvd25lciBhZGRyZXNzIGR1cmluZyBvd25lcnNoaXAgdHJhbnNmZXIuIFJldHVybnMgZW1wdHkgYWRkcmVzcyBpZiBubyB0cmFuc2ZlciBpcyBwZW5kaW5nLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYWRkcmVzczogUGVuZGluZyBvd25lciBhZGRyZXNzLCBvciB0aGUgZW1wdHkgYWRkcmVzcyB3aGVuIG5vIHRyYW5zZmVyIGlzIHBlbmRpbmcuCmZ1bmMgKG8gKk93bmFibGUyU3RlcCkgUGVuZGluZ093bmVyKCkgYWRkcmVzcyB7CglyZXR1cm4gby5wZW5kaW5nT3duZXIKfQoKLy8gSXNPd25lciByZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIGNhbGxlciBhZGRyZXNzIGlzIHRoZSBjdXJyZW50IG93bmVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2FsbGVyOiBBZGRyZXNzIHRvIGNvbXBhcmUgd2l0aCB0aGUgc3RvcmVkIGN1cnJlbnQgb3duZXIgYWRkcmVzcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiBjYWxsZXIgZXhhY3RseSBlcXVhbHMgdGhlIGN1cnJlbnQgb3duZXIgYWRkcmVzczsgZmFsc2Ugb3RoZXJ3aXNlLgpmdW5jIChvICpPd25hYmxlMlN0ZXApIElzT3duZXIoY2FsbGVyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIG8ub3duZXIgPT0gY2FsbGVyCn0KCi8vIElzUGVuZGluZ093bmVyIHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgY2FsbGVyIGFkZHJlc3MgaXMgdGhlIHBlbmRpbmcgb3duZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjYWxsZXI6IEFkZHJlc3MgdG8gY29tcGFyZSB3aXRoIHRoZSBzdG9yZWQgcGVuZGluZyBvd25lciBhZGRyZXNzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGNhbGxlciBleGFjdGx5IGVxdWFscyB0aGUgcGVuZGluZyBvd25lciBhZGRyZXNzOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgKG8gKk93bmFibGUyU3RlcCkgSXNQZW5kaW5nT3duZXIoY2FsbGVyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIG8ucGVuZGluZ093bmVyID09IGNhbGxlcgp9ChqrPgoIcmJhYy5nbm8Snj5wYWNrYWdlIHJiYWMKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmluZ3MiCikKCi8vIFJCQUMgZW5jYXBzdWxhdGVzIGFuZCBtYW5hZ2VzIHJvbGVzIGFuZCB0aGVpciBwZXJtaXNzaW9ucy4KLy8gSXQgY29tYmluZXMgcm9sZSBtYW5hZ2VtZW50IHdpdGggdHdvLXN0ZXAgb3duZXJzaGlwIHRyYW5zZmVyIGZ1bmN0aW9uYWxpdHkuCnR5cGUgUkJBQyBzdHJ1Y3QgewoJb3duYWJsZSAqT3duYWJsZTJTdGVwCgkvLyByb2xlcyBtYXBzIHJvbGUgbmFtZXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBgUm9sZWAgb2JqZWN0cwoJcm9sZXMgbWFwW3N0cmluZ10qUm9sZQp9CgovLyBOZXdSQkFDV2l0aEFkZHJlc3MgY3JlYXRlcyBhIG5ldyBSQkFDIGluc3RhbmNlIHdpdGggYWRkciBhcyBvd25lci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFkZHI6IEFkZHJlc3Mgc3RvcmVkIGFzIHRoZSBpbml0aWFsIG93bmVyIG9mIHRoZSBSQkFDIGluc3RhbmNlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlJCQUM6IE5ldyBSQkFDIG1hbmFnZXIgd2l0aCBhbiBlbXB0eSByb2xlIHJlZ2lzdHJ5IGFuZCBhZGRyIGFzIG93bmVyLgpmdW5jIE5ld1JCQUNXaXRoQWRkcmVzcyhhZGRyIGFkZHJlc3MpICpSQkFDIHsKCXJldHVybiAmUkJBQ3sKCQlvd25hYmxlOiBuZXdPd25hYmxlMlN0ZXBXaXRoQWRkcmVzcyhhZGRyKSwKCQlyb2xlczogICBtYWtlKG1hcFtzdHJpbmddKlJvbGUpLAoJfQp9CgovLyBJc0F1dGhvcml6ZWQgY2hlY2tzIGlmIGFkZHIgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZU5hbWUuIFJldHVybnMgZmFsc2UgaWYgdGhlIHJvbGUgZG9lcyBub3QgZXhpc3QuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByb2xlTmFtZTogRXhhY3Qgcm9sZSBuYW1lIHRvIGxvb2sgdXAgaW4gdGhlIHJvbGUgcmVnaXN0cnkuCi8vICAgLSBhZGRyOiBBZGRyZXNzIHRvIGNvbXBhcmUgd2l0aCB0aGUgYWRkcmVzcyBhc3NpZ25lZCB0byByb2xlTmFtZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiByb2xlTmFtZSBleGlzdHMgYW5kIGl0cyBhc3NpZ25lZCBhZGRyZXNzIGVxdWFscyBhZGRyOyBmYWxzZSB3aGVuIGl0IGRvZXMgbm90LgpmdW5jIChyYiAqUkJBQykgSXNBdXRob3JpemVkKHJvbGVOYW1lIHN0cmluZywgYWRkciBhZGRyZXNzKSBib29sIHsKCXJvbGUsIGV4aXN0cyA6PSByYi5yb2xlc1tyb2xlTmFtZV0KCWlmICFleGlzdHMgewoJCXJldHVybiBmYWxzZQoJfQoKCXJldHVybiByb2xlLklzQXV0aG9yaXplZChhZGRyKQp9CgovLyBSZWdpc3RlclJvbGUgcmVnaXN0ZXJzIGEgbmV3IHJvbGUgd2l0aCBnaXZlbiByb2xlIG5hbWUgYW5kIGFkZHJlc3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByb2xlTmFtZTogUm9sZSBpZGVudGlmaWVyOyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQgYmVmb3JlIHZhbGlkYXRpb24gYW5kIHN0b3JhZ2UuCi8vICAgLSBhZGRyOiBBZGRyZXNzIGluaXRpYWxseSBhc3NpZ25lZCB0byB0aGUgcm9sZTsgdGhpcyBtZXRob2Qgc3RvcmVzIGl0IHdpdGhvdXQgYWRkcmVzcyB2YWxpZGF0aW9uLgovLwovLyBFcnJvcnM6Ci8vIGBSZWdpc3RlclJvbGVgIHJldHVybnMgYW4gZXJyb3IgaW4gdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgovLyAgIC0gYEVyckludmFsaWRSb2xlTmFtZWA6IHJvbGUgbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlCi8vICAgLSBgRXJyUm9sZUFscmVhZHlFeGlzdHNgOiB0aGUgcm9sZSB0byBiZSByZWdpc3RlcmVkIGFscmVhZHkgZXhpc3RzIGluIFJCQUMuCi8vICAgLSBBIHN5c3RlbS1yb2xlIG5hbWUgbWF5IGJlIHJlZ2lzdGVyZWQgd2hlbiBhYnNlbnQsIGJ1dCByZW1haW5zIHByb3RlY3RlZAovLyAgICAgZnJvbSByZW1vdmFsOyB0aGlzIHBhY2thZ2UgZG9lcyBub3QgcHJlLXJlZ2lzdGVyIHN5c3RlbSByb2xlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgdHJpbW1lZCByb2xlIGlzIHJlZ2lzdGVyZWQ7IG90aGVyd2lzZSBFcnJJbnZhbGlkUm9sZU5hbWUgb3IgRXJyUm9sZUFscmVhZHlFeGlzdHMuCmZ1bmMgKHJiICpSQkFDKSBSZWdpc3RlclJvbGUocm9sZU5hbWUgc3RyaW5nLCBhZGRyIGFkZHJlc3MpIGVycm9yIHsKCXJvbGVOYW1lID0gc3RyaW5ncy5UcmltU3BhY2Uocm9sZU5hbWUpCglpZiByb2xlTmFtZSA9PSAiIiB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJySW52YWxpZFJvbGVOYW1lKQoJfQoKCWlmIHJiLmV4aXN0c1JvbGUocm9sZU5hbWUpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJSb2xlQWxyZWFkeUV4aXN0cykKCX0KCglyYi5yb2xlc1tyb2xlTmFtZV0gPSBOZXdSb2xlKHJvbGVOYW1lLCBhZGRyKQoKCXJldHVybiBuaWwKfQoKLy8gVXBkYXRlUm9sZUFkZHJlc3MgYXNzaWducyBhZGRyIHRvIHJvbGVOYW1lLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm9sZU5hbWU6IEV4aXN0aW5nIHJvbGUgaWRlbnRpZmllcjsgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIGJlZm9yZSBsb29rdXAuCi8vICAgLSBhZGRyOiBOb24temVybywgc3ludGFjdGljYWxseSB2YWxpZCBhZGRyZXNzIHRvIGFzc2lnbiB0byB0aGUgcm9sZS4KLy8KLy8gRXJyb3JzOgovLyAgIC0gYEVyckludmFsaWRSb2xlTmFtZWA6IHJvbGUgbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlCi8vICAgLSBgRXJyUm9sZURvZXNOb3RFeGlzdGA6IHRoZSBzcGVjaWZpZWQgcm9sZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgUkJBQyBzeXN0ZW0KLy8gICAtIGBFcnJJbnZhbGlkQWRkcmVzc2A6IGFkZHIgaXMgZW1wdHkgb3IgaGFzIGFuIGludmFsaWQgZm9ybWF0Ci8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIHdoZW4gdGhlIGV4aXN0aW5nIHJvbGUgaXMgdXBkYXRlZDsgb3RoZXJ3aXNlIGFuIGVycm9yIGlkZW50aWZ5aW5nIGludmFsaWQgaW5wdXQgb3IgYSBtaXNzaW5nIHJvbGUuCmZ1bmMgKHJiICpSQkFDKSBVcGRhdGVSb2xlQWRkcmVzcyhyb2xlTmFtZSBzdHJpbmcsIGFkZHIgYWRkcmVzcykgZXJyb3IgewoJcm9sZU5hbWUgPSBzdHJpbmdzLlRyaW1TcGFjZShyb2xlTmFtZSkKCWlmIHJvbGVOYW1lID09ICIiIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJJbnZhbGlkUm9sZU5hbWUpCgl9CgoJcm9sZSwgZXhpc3RzIDo9IHJiLnJvbGVzW3JvbGVOYW1lXQoJaWYgIWV4aXN0cyB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyUm9sZURvZXNOb3RFeGlzdCkKCX0KCglpZiBhZGRyID09IHplcm9BZGRyZXNzIHx8ICFhZGRyLklzVmFsaWQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJySW52YWxpZEFkZHJlc3MpCgl9CgoJcm9sZS5zZXRBZGRyZXNzKGFkZHIpCgoJcmV0dXJuIG5pbAp9CgovLyBSZW1vdmVSb2xlIHJlbW92ZXMgcm9sZU5hbWUgZnJvbSB0aGUgUkJBQyBzeXN0ZW0uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByb2xlTmFtZTogUm9sZSBpZGVudGlmaWVyIHRvIHJlbW92ZTsgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIGJlZm9yZSBsb29rdXAuCi8vCi8vIEVycm9yczoKLy8gICAtIGBFcnJJbnZhbGlkUm9sZU5hbWVgOiByb2xlIG5hbWUgaXMgYW4gZW1wdHkgc3RyaW5nIG9yIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQovLyAgIC0gYEVyclJvbGVEb2VzTm90RXhpc3RgOiB0aGUgc3BlY2lmaWVkIHJvbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIFJCQUMgc3lzdGVtCi8vICAgLSBgRXJyQ2Fubm90UmVtb3ZlU3lzdGVtUm9sZWA6IGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGEgc3lzdGVtIHJvbGUgKGUuZy4sIGFkbWluLCBnb3Zlcm5hbmNlLCBwb29sLCBldGMuKQovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCB3aGVuIGEgbm9uLXN5c3RlbSByb2xlIGlzIHJlbW92ZWQ7IG90aGVyd2lzZSBhbiBlcnJvciBmb3IgaW52YWxpZCwgbWlzc2luZywgb3IgcHJvdGVjdGVkIHJvbGVzLgpmdW5jIChyYiAqUkJBQykgUmVtb3ZlUm9sZShyb2xlTmFtZSBzdHJpbmcpIGVycm9yIHsKCXJvbGVOYW1lID0gc3RyaW5ncy5UcmltU3BhY2Uocm9sZU5hbWUpCglpZiByb2xlTmFtZSA9PSAiIiB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJySW52YWxpZFJvbGVOYW1lKQoJfQoKCWlmICFyYi5leGlzdHNSb2xlKHJvbGVOYW1lKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyUm9sZURvZXNOb3RFeGlzdCkKCX0KCgkvLyBDaGVjayBpZiBpdCdzIGEgc3lzdGVtIHJvbGUKCWlmIElzU3lzdGVtUm9sZShyb2xlTmFtZSkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyckNhbm5vdFJlbW92ZVN5c3RlbVJvbGUpCgl9CgoJLy8gU2ltcGx5IGRlbGV0ZSB0aGUgcm9sZSBzaW5jZSBwZXJtaXNzaW9ucyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQgaGVyZQoJZGVsZXRlKHJiLnJvbGVzLCByb2xlTmFtZSkKCglyZXR1cm4gbmlsCn0KCi8vIEdldEFsbFJvbGVBZGRyZXNzZXMgcmV0dXJucyBhIG1hcCBvZiBhbGwgcm9sZSBuYW1lcyB0byB0aGVpciBhc3NpZ25lZCBhZGRyZXNzZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBtYXBbc3RyaW5nXWFkZHJlc3M6IE5ld2x5IGFsbG9jYXRlZCBtYXAgY29udGFpbmluZyBlYWNoIHJlZ2lzdGVyZWQgcm9sZSBuYW1lIGFuZCBpdHMgYXNzaWduZWQgYWRkcmVzcy4KZnVuYyAocmIgKlJCQUMpIEdldEFsbFJvbGVBZGRyZXNzZXMoKSBtYXBbc3RyaW5nXWFkZHJlc3MgewoJYWRkcmVzc2VzIDo9IG1ha2UobWFwW3N0cmluZ11hZGRyZXNzKQoKCWZvciByb2xlTmFtZSwgcm9sZSA6PSByYW5nZSByYi5yb2xlcyB7CgkJYWRkcmVzc2VzW3JvbGVOYW1lXSA9IHJvbGUuQWRkcmVzcygpCgl9CgoJcmV0dXJuIGFkZHJlc3Nlcwp9CgovLyBHZXRSb2xlQWRkcmVzcyByZXR1cm5zIHRoZSBhZGRyZXNzIGFzc2lnbmVkIHRvIHJvbGVOYW1lLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm9sZU5hbWU6IEV4YWN0IHJvbGUgbmFtZSB0byBsb29rIHVwOyB0aGlzIG1ldGhvZCBkb2VzIG5vdCB0cmltIHdoaXRlc3BhY2UuCi8vCi8vIEVycm9yczoKLy8gICAtIGBFcnJSb2xlRG9lc05vdEV4aXN0YDogdGhlIHNwZWNpZmllZCByb2xlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBSQkFDIHN5c3RlbQovLwovLyBSZXR1cm5zOgovLyAgIC0gYWRkcmVzczogQWRkcmVzcyBhc3NpZ25lZCB0byByb2xlTmFtZSwgb3IgdGhlIGVtcHR5IGFkZHJlc3Mgd2hlbiB0aGUgcm9sZSBpcyBhYnNlbnQuCi8vICAgLSBlcnJvcjogbmlsIHdoZW4gcm9sZU5hbWUgZXhpc3RzOyBvdGhlcndpc2UgRXJyUm9sZURvZXNOb3RFeGlzdC4KZnVuYyAocmIgKlJCQUMpIEdldFJvbGVBZGRyZXNzKHJvbGVOYW1lIHN0cmluZykgKGFkZHJlc3MsIGVycm9yKSB7Cglyb2xlLCBleGlzdHMgOj0gcmIucm9sZXNbcm9sZU5hbWVdCglpZiAhZXhpc3RzIHsKCQlyZXR1cm4gIiIsIGVycm9ycy5OZXcoRXJyUm9sZURvZXNOb3RFeGlzdCkKCX0KCglyZXR1cm4gcm9sZS5BZGRyZXNzKCksIG5pbAp9CgovLyBPd25lciByZXR1cm5zIHRoZSBjdXJyZW50IG93bmVyIGFkZHJlc3MuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBDdXJyZW50IFJCQUMgb3duZXIgYWRkcmVzcywgb3IgdGhlIGVtcHR5IGFkZHJlc3MgaWYgb3duZXJzaGlwIGhhcyBiZWVuIGRyb3BwZWQuCmZ1bmMgKHJiICpSQkFDKSBPd25lcigpIGFkZHJlc3MgewoJcmV0dXJuIHJiLm93bmFibGUuT3duZXIoKQp9CgovLyBQZW5kaW5nT3duZXIgcmV0dXJucyB0aGUgcGVuZGluZyBvd25lciBhZGRyZXNzIGR1cmluZyBvd25lcnNoaXAgdHJhbnNmZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBQZW5kaW5nIG93bmVyIGFkZHJlc3MsIG9yIHRoZSBlbXB0eSBhZGRyZXNzIHdoZW4gbm8gdHJhbnNmZXIgaXMgcGVuZGluZy4KZnVuYyAocmIgKlJCQUMpIFBlbmRpbmdPd25lcigpIGFkZHJlc3MgewoJcmV0dXJuIHJiLm93bmFibGUuUGVuZGluZ093bmVyKCkKfQoKLy8gQWNjZXB0T3duZXJzaGlwQnkgY29tcGxldGVzIHRoZSBvd25lcnNoaXAgdHJhbnNmZXIgcHJvY2Vzcy4KLy8gTXVzdCBiZSBjYWxsZWQgYnkgdGhlIHBlbmRpbmcgb3duZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhZGRyOiBBZGRyZXNzIGF0dGVtcHRpbmcgdG8gYWNjZXB0IG93bmVyc2hpcDsgaXQgbXVzdCBlcXVhbCB0aGUgcmVjb3JkZWQgcGVuZGluZyBvd25lci4KLy8KLy8gRXJyb3JzOgovLyAgIC0gYEVyck5vUGVuZGluZ093bmVyYDogbm8gb3duZXJzaGlwIHRyYW5zZmVyIGlzIHBlbmRpbmcKLy8gICAtIGBFcnJQZW5kaW5nVW5hdXRob3JpemVkYDogYWRkciBpcyBub3QgdGhlIHBlbmRpbmcgb3duZXIKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgd2hlbiBvd25lcnNoaXAgaXMgdHJhbnNmZXJyZWQgdG8gYWRkcjsgb3RoZXJ3aXNlIEVyck5vUGVuZGluZ093bmVyIG9yIEVyclBlbmRpbmdVbmF1dGhvcml6ZWQuCmZ1bmMgKHJiICpSQkFDKSBBY2NlcHRPd25lcnNoaXBCeShhZGRyIGFkZHJlc3MpIGVycm9yIHsKCXJldHVybiByYi5vd25hYmxlLkFjY2VwdE93bmVyc2hpcEJ5KGFkZHIpCn0KCi8vIERyb3BPd25lcnNoaXBCeSByZW1vdmVzIHRoZSBvd25lciwgZWZmZWN0aXZlbHkgZGlzYWJsaW5nIG93bmVyLW9ubHkgYWN0aW9ucy4KLy8gVGhpcyBpcyBpcnJldmVyc2libGUgYW5kIHdpbGwgcHJldmVudCBhbnkgZnV0dXJlIG93bmVyLW9ubHkgb3BlcmF0aW9ucy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFkZHI6IEFkZHJlc3MgcmVxdWVzdGluZyB0aGUgZHJvcDsgaXQgbXVzdCBlcXVhbCB0aGUgY3VycmVudCBvd25lci4KLy8KLy8gRXJyb3JzOgovLyAgIC0gYEVyclVuYXV0aG9yaXplZGA6IGFkZHIgaXMgbm90IHRoZSBjdXJyZW50IG93bmVyCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIHdoZW4gb3duZXIgYW5kIHBlbmRpbmcgb3duZXIgYXJlIGNsZWFyZWQ7IG90aGVyd2lzZSBFcnJVbmF1dGhvcml6ZWQuCmZ1bmMgKHJiICpSQkFDKSBEcm9wT3duZXJzaGlwQnkoYWRkciBhZGRyZXNzKSBlcnJvciB7CglyZXR1cm4gcmIub3duYWJsZS5Ecm9wT3duZXJzaGlwQnkoYWRkcikKfQoKLy8gVHJhbnNmZXJPd25lcnNoaXBCeSBpbml0aWF0ZXMgdGhlIHR3by1zdGVwIG93bmVyc2hpcCB0cmFuc2ZlciBwcm9jZXNzLgovLyBUaGUgbmV3T3duZXIgbXVzdCBjYWxsIEFjY2VwdE93bmVyc2hpcEJ5IHRvIGNvbXBsZXRlIHRoZSB0cmFuc2Zlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG5ld093bmVyOiBOb24temVybywgc3ludGFjdGljYWxseSB2YWxpZCBhZGRyZXNzIHRvIHJlY29yZCBhcyB0aGUgcGVuZGluZyBvd25lci4KLy8gICAtIGNhbGxlcjogQWRkcmVzcyBhdXRob3JpemVkIHRvIGluaXRpYXRlIHRoZSB0cmFuc2ZlcjsgaXQgbXVzdCBlcXVhbCB0aGUgY3VycmVudCBvd25lci4KLy8KLy8gRXJyb3JzOgovLyAgIC0gYEVyclVuYXV0aG9yaXplZGA6IGNhbGxlciBpcyBub3QgdGhlIGN1cnJlbnQgb3duZXIKLy8gICAtIGBFcnJJbnZhbGlkQWRkcmVzc2A6IG5ld093bmVyIGlzIGVtcHR5IG9yIGhhcyBhbiBpbnZhbGlkIGZvcm1hdAovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHRoZSBwZW5kaW5nIG93bmVyIGlzIHNldDsgb3RoZXJ3aXNlIEVyclVuYXV0aG9yaXplZCBvciBFcnJJbnZhbGlkQWRkcmVzcy4KZnVuYyAocmIgKlJCQUMpIFRyYW5zZmVyT3duZXJzaGlwQnkobmV3T3duZXIsIGNhbGxlciBhZGRyZXNzKSBlcnJvciB7CglyZXR1cm4gcmIub3duYWJsZS5UcmFuc2Zlck93bmVyc2hpcEJ5KG5ld093bmVyLCBjYWxsZXIpCn0KCi8vIGV4aXN0c1JvbGUgY2hlY2tzIGlmIG5hbWUgZXhpc3RzIGluIHRoZSBSQkFDIHN5c3RlbS4KZnVuYyAocmIgKlJCQUMpIGV4aXN0c1JvbGUobmFtZSBzdHJpbmcpIGJvb2wgewoJXywgZXhpc3RzIDo9IHJiLnJvbGVzW25hbWVdCglyZXR1cm4gZXhpc3RzCn0KGuUNCghyb2xlLmdubxLYDXBhY2thZ2UgcmJhYwoKY29uc3QgemVyb0FkZHJlc3MgPSBhZGRyZXNzKCIiKQoKLy8gUm9sZSByZXByZXNlbnRzIGEgcm9sZSB3aXRoIGEgbmFtZSBhbmQgYW4gYXNzaWduZWQgYWRkcmVzcy4KdHlwZSBSb2xlIHN0cnVjdCB7CgkvLyBuYW1lIHJlcHJlc2VudHMgdGhlIHJvbGUncyBpZGVudGlmaWVyCgluYW1lICAgIHN0cmluZwoJYWRkcmVzcyBhZGRyZXNzCn0KCi8vIE5ld1JvbGUgY3JlYXRlcyBhIG5ldyBSb2xlIGluc3RhbmNlIHdpdGggcm9sZU5hbWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByb2xlTmFtZTogUm9sZSBpZGVudGlmaWVyIHN0b3JlZCBpbiB0aGUgbmV3IFJvbGUgd2l0aG91dCBub3JtYWxpemF0aW9uLgovLyAgIC0gYWRkcjogQWRkcmVzcyBzdG9yZWQgYXMgdGhlIHJvbGUncyBpbml0aWFsIGFzc2lnbm1lbnQgd2l0aG91dCB2YWxpZGF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlJvbGU6IE5ldyByb2xlIGNvbnRhaW5pbmcgcm9sZU5hbWUgYW5kIGl0cyBpbml0aWFsbHkgYXNzaWduZWQgYWRkci4KZnVuYyBOZXdSb2xlKHJvbGVOYW1lIHN0cmluZywgYWRkciBhZGRyZXNzKSAqUm9sZSB7CglyZXR1cm4gJlJvbGV7CgkJbmFtZTogICAgcm9sZU5hbWUsCgkJYWRkcmVzczogYWRkciwKCX0KfQoKLy8gTmFtZSByZXR1cm5zIHRoZSByb2xlJ3MgbmFtZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogUm9sZSBpZGVudGlmaWVyIHN0b3JlZCBpbiB0aGUgUm9sZS4KZnVuYyAociAqUm9sZSkgTmFtZSgpIHN0cmluZyB7IHJldHVybiByLm5hbWUgfQoKLy8gQWRkcmVzcyByZXR1cm5zIHRoZSBhZGRyZXNzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZS4gUmV0dXJucyBlbXB0eSBhZGRyZXNzIGlmIG5vIGFkZHJlc3MgaXMgYXNzaWduZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBBZGRyZXNzIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgcm9sZSwgb3IgdGhlIGVtcHR5IGFkZHJlc3Mgd2hlbiB1bmFzc2lnbmVkLgpmdW5jIChyICpSb2xlKSBBZGRyZXNzKCkgYWRkcmVzcyB7CglyZXR1cm4gci5hZGRyZXNzCn0KCi8vIElzRW1wdHkgcmV0dXJucyB0cnVlIGlmIG5vIGFkZHJlc3MgaXMgYXNzaWduZWQgdG8gdGhpcyByb2xlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBzdG9yZWQgcm9sZSBhZGRyZXNzIGVxdWFscyB0aGUgZW1wdHkgYWRkcmVzczsgZmFsc2Ugd2hlbiBhbiBhZGRyZXNzIGlzIGFzc2lnbmVkLgpmdW5jIChyICpSb2xlKSBJc0VtcHR5KCkgYm9vbCB7CglyZXR1cm4gci5BZGRyZXNzKCkgPT0gemVyb0FkZHJlc3MKfQoKLy8gSXNBdXRob3JpemVkIHJldHVybnMgdHJ1ZSBpZiBhZGRyIG1hdGNoZXMgdGhlIHJvbGUncyBhc3NpZ25lZCBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYWRkcjogQWRkcmVzcyB0byBjb21wYXJlIHdpdGggdGhlIHJvbGUncyBzdG9yZWQgYXNzaWdubWVudC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhZGRyIGV4YWN0bHkgZXF1YWxzIHRoZSBhc3NpZ25lZCBhZGRyZXNzOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgKHIgKlJvbGUpIElzQXV0aG9yaXplZChhZGRyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIHIuQWRkcmVzcygpID09IGFkZHIKfQoKLy8gc2V0QWRkcmVzcyBhc3NpZ25zIGFkZHIgdG8gdGhpcyByb2xlLgpmdW5jIChyICpSb2xlKSBzZXRBZGRyZXNzKGFkZHIgYWRkcmVzcykgewoJci5hZGRyZXNzID0gYWRkcgp9ChquEAoJdHlwZXMuZ25vEqAQcGFja2FnZSByYmFjCgovLyBTeXN0ZW1Sb2xlIHJlcHJlc2VudHMgYSByZXNlcnZlZCBzeXN0ZW0tcm9sZSBuYW1lIHRoYXQgY2Fubm90IGJlIHJlbW92ZWQgb25jZSByZWdpc3RlcmVkLgp0eXBlIFN5c3RlbVJvbGUgc3RyaW5nCgpjb25zdCAoCglST0xFX0FETUlOICAgICAgICAgIFN5c3RlbVJvbGUgPSAiYWRtaW4iCglST0xFX0RFVk9QUyAgICAgICAgIFN5c3RlbVJvbGUgPSAiZGV2b3BzIgoJUk9MRV9DT01NVU5JVFlfUE9PTCBTeXN0ZW1Sb2xlID0gImNvbW11bml0eV9wb29sIgoJUk9MRV9HT1ZFUk5BTkNFICAgICBTeXN0ZW1Sb2xlID0gImdvdmVybmFuY2UiCglST0xFX0dPVl9TVEFLRVIgICAgIFN5c3RlbVJvbGUgPSAiZ292X3N0YWtlciIKCVJPTEVfWEdOUyAgICAgICAgICAgU3lzdGVtUm9sZSA9ICJ4Z25zIgoJUk9MRV9QT09MICAgICAgICAgICBTeXN0ZW1Sb2xlID0gInBvb2wiCglST0xFX1BPU0lUSU9OICAgICAgIFN5c3RlbVJvbGUgPSAicG9zaXRpb24iCglST0xFX1JPVVRFUiAgICAgICAgIFN5c3RlbVJvbGUgPSAicm91dGVyIgoJUk9MRV9TVEFLRVIgICAgICAgICBTeXN0ZW1Sb2xlID0gInN0YWtlciIKCVJPTEVfRU1JU1NJT04gICAgICAgU3lzdGVtUm9sZSA9ICJlbWlzc2lvbiIKCVJPTEVfTEFVTkNIUEFEICAgICAgU3lzdGVtUm9sZSA9ICJsYXVuY2hwYWQiCglST0xFX1BST1RPQ09MX0ZFRSAgIFN5c3RlbVJvbGUgPSAicHJvdG9jb2xfZmVlIgopCgovLyBNVVNUIEJFIElNTVVUQUJMRSwgRE8gTk9UIE1PRElGWS4KLy8gX3N5c3RlbVJvbGVOYW1lcyBpcyBhIG1hcCBvZiBzeXN0ZW0gcm9sZSBuYW1lcyB0byBTeXN0ZW1Sb2xlIHZhbHVlcyBieSBwZXJmb3JtYW5jZS4KdmFyIF9zeXN0ZW1Sb2xlTmFtZXMgPSBtYXBbc3RyaW5nXVN5c3RlbVJvbGV7CgkiYWRtaW4iOiAgICAgICAgICBST0xFX0FETUlOLAoJImRldm9wcyI6ICAgICAgICAgUk9MRV9ERVZPUFMsCgkiY29tbXVuaXR5X3Bvb2wiOiBST0xFX0NPTU1VTklUWV9QT09MLAoJImdvdmVybmFuY2UiOiAgICAgUk9MRV9HT1ZFUk5BTkNFLAoJImdvdl9zdGFrZXIiOiAgICAgUk9MRV9HT1ZfU1RBS0VSLAoJInhnbnMiOiAgICAgICAgICAgUk9MRV9YR05TLAoJInBvb2wiOiAgICAgICAgICAgUk9MRV9QT09MLAoJInBvc2l0aW9uIjogICAgICAgUk9MRV9QT1NJVElPTiwKCSJyb3V0ZXIiOiAgICAgICAgIFJPTEVfUk9VVEVSLAoJInN0YWtlciI6ICAgICAgICAgUk9MRV9TVEFLRVIsCgkiZW1pc3Npb24iOiAgICAgICBST0xFX0VNSVNTSU9OLAoJImxhdW5jaHBhZCI6ICAgICAgUk9MRV9MQVVOQ0hQQUQsCgkicHJvdG9jb2xfZmVlIjogICBST0xFX1BST1RPQ09MX0ZFRSwKfQoKLy8gU3RyaW5nIHJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgU3lzdGVtUm9sZS4KLy8gUmV0dXJucyAiVW5rbm93biIgaWYgdGhlIHJvbGUgaXMgbm90IGEgdmFsaWQgc3lzdGVtIHJvbGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFJlZ2lzdGVyZWQgc3lzdGVtLXJvbGUgbmFtZSwgb3IgIlVua25vd24iIHdoZW4gciBpcyBub3QgaW4gdGhlIHN5c3RlbS1yb2xlIHJlZ2lzdHJ5LgpmdW5jIChyIFN5c3RlbVJvbGUpIFN0cmluZygpIHN0cmluZyB7Cglyb2xlTmFtZSA6PSBzdHJpbmcocikKCWlmIF8sIG9rIDo9IF9zeXN0ZW1Sb2xlTmFtZXNbcm9sZU5hbWVdOyAhb2sgewoJCXJldHVybiAiVW5rbm93biIKCX0KCglyZXR1cm4gcm9sZU5hbWUKfQoKLy8gSXNTeXN0ZW1Sb2xlIHJldHVybnMgdHJ1ZSBpZiByb2xlTmFtZSBpcyBhIHN5c3RlbSByb2xlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcm9sZU5hbWU6IEV4YWN0IHN0cmluZyBrZXkgdG8gY2hlY2sgYWdhaW5zdCB0aGUgcmVzZXJ2ZWQgc3lzdGVtLXJvbGUgcmVnaXN0cnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gcm9sZU5hbWUgbmFtZXMgYSByZWdpc3RlcmVkIHN5c3RlbSByb2xlOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgSXNTeXN0ZW1Sb2xlKHJvbGVOYW1lIHN0cmluZykgYm9vbCB7CglfLCBvayA6PSBfc3lzdGVtUm9sZU5hbWVzW3JvbGVOYW1lXQoKCXJldHVybiBvawp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCOjRzigSCjQyNTg4dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQC7+dwHOhyAZkTHGMpDRMSQOvoL+7v0iSve3z8xyE+dRab1a9oW0AY/CkdIHbk+ZXGwPH6solrZc7NkSQkDurhYaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=