Transaction executed successfully

Transaction Details

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

Transaction hash
816FB20032088C70F185EB2FEE0D9A08B98AB2D704EAFEE7E57EEABB4AE3C34B

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
120,000,000
Requested gas limit
GAS USED
55,066,574
Gas consumed
FEE
240000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm20000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CsbPAgoML3ZtLm1fYWRkcGtnErTPAgooZzFsbmt5dGZxY2p3bGx3czYzZ3ZmMG12OXl0MDRhc3d5NHk5YW1obRL3zgIKBGhvbWUSOGduby5sYW5kL3IvZzFsbmt5dGZxY2p3bGx3czYzZ3ZmMG12OXl0MDRhc3d5NHk5YW1obS9ob21lGrgLCglSRUFETUUubWQSqgsjIGhvbWUKClRoZSByZWFsbSBiZWhpbmQgdGhlIHByb2ZpbGUgcGFnZSBhdCBgL3UvPG5hbWVzcGFjZT5gLiBnbm93ZWIgY2FsbHMKYFJlbmRlcigiIilgIG9uIHRoZSByZWFsbSBhdCBleGFjdGx5IGAvci88bmFtZXNwYWNlPi9ob21lYCwgc28gdGhpcyBwYXRoIGlzCnBlcm1hbmVudCBhbmQgZXZlcnl0aGluZyB0aGF0IG1heSBjaGFuZ2UgbGl2ZXMgYmVoaW5kIGl0OgoKLSAqKkNvbnRlbnQqKiBpcyBzbG90czogbmFtZWQgbWFya2Rvd24gZnJhZ21lbnRzLCBvbmUgYFNldGAgdHJhbnNhY3Rpb24gZWFjaC4KLSAqKkxheW91dCoqIGlzIHRoZSBzbG90IG5hbWVkIGBsYXlvdXRgLCBhIHRlbXBsYXRlIGZpbGxlZCBmcm9tIGA6c2x1ZzpgCiAgcGxhY2Vob2xkZXJzLgotICoqU3R5bGUqKiBpcyBzbG90cyB1bmRlciBgc3R5bGUuYCB0aGF0IHRoZSB0aGVtZSByZWFkcy4KLSAqKlJlbmRlcmluZyoqIGlzIGEgdGhlbWU6IGEgcmVhbG0gdW5kZXIgYGhvbWUvdGhlbWUvdk5gIHRoYXQgcmVnaXN0ZXJzIGl0c2VsZgogIHdoZW4gZGVwbG95ZWQgYW5kIGdvZXMgbGl2ZSB3aGVuIHRoZSBhdXRob3JpdHkgcnVucyBgQWNjZXB0YC4gYFJvbGxiYWNrYAogIHJldmVydHMuIFRoZSBzbG90cyBuZXZlciBtb3ZlLgoKVGhlIHVwZ3JhZGUgbWFjaGluZXJ5IGlzIGBwLzxuYW1lc3BhY2U+L3VwZ3JhZGVhYmxlL3YwYC4KCiMjIFZpZXdzCgp8IHBhdGggfCB3aGF0IHwKfCAtLS0gfCAtLS0gfAp8IGA6c2xvdHNgIHwgc2xvdCBpbmRleCB8CnwgYDpzbG90cy88c2x1Zz5gIHwgb25lIHNsb3QsIHJhdyB8CnwgYDplZGl0YCwgYDplZGl0LzxzbHVnPmAgfCBmb3JtcyB0aGF0IGJ1aWxkIHRoZSBgU2V0YCBhbmQgYERlbGV0ZWAgY29tbWFuZHMgfAp8IGA6c3lzdGVtYCB8IGF1dGhvcml0eSwgbGl2ZSB0aGVtZSwgY2FuZGlkYXRlcywgaGlzdG9yeSwgb3BlcmF0aW9ucyB8CnwgYDptYW5pZmVzdGAgfCBgc2x1Z+KHpXJlduKHpWJ5dGVz4oelc2hhMjU2YCBwZXIgc2xvdCwgZm9yIHRvb2xpbmcgfAoKVGhlc2UgZm91ciBhcmUgc2VydmVkIGJ5IHRoaXMgcmVhbG0gZGlyZWN0bHkgYW5kIG5ldmVyIGdvIHRocm91Z2ggYSB0aGVtZSwgc28KYSB0aGVtZSB0aGF0IHBhbmljcyBjYW4gYmUgcm9sbGVkIGJhY2sgZnJvbSBgOnN5c3RlbWAuIEV2ZXJ5IG90aGVyIHBhdGggaXMgdGhlCnRoZW1lJ3MuCgojIyBXcml0ZXMKClJlc3RyaWN0ZWQgdG8gdGhlIGF1dGhvcml0eTogYFNldGAsIGBBcHBlbmRgLCBgRGVsZXRlYDsgYEFjY2VwdGAsIGBXaXRoZHJhd2AsCmBSb2xsYmFja2AsIGBGb3JnZXRgLCBgRnJlZXplYCwgYFRyYW5zZmVyQXV0aG9yaXR5YC4gQSBzbHVnIGlzIDEgdG8gNjQgYnl0ZXMKb2YgYFthLXowLTkuXy1dYDsgdGhlIGNvbXB1dGVkIHBsYWNlaG9sZGVycyBgY2hhaW5pZCBoZWlnaHQgb3duZXIgcmVhbG0gcmV2CnNsb3RzIHRoZW1lIHVwZGF0ZWRgIGFyZSByZXNlcnZlZC4KGukFCg9leHBvcnRfdGVzdC5nbm8S1QVwYWNrYWdlIGhvbWUKCmltcG9ydCAoCgkiZ25vLmxhbmQvcC9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL3VwZ3JhZGVhYmxlL3YwIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgopCgovLyBUZXN0IGhvb2tzLiBSZWFsbSBnbG9iYWxzIGxpdmUgZm9yIHRoZSB3aG9sZSB0ZXN0IGJpbmFyeSwgc28gZXZlcnkgdGVzdAovLyB0aGF0IHJlYWRzIFJlbmRlciBvciBNYW5pZmVzdCBzdGFydHMgZnJvbSBhIGtub3duIHRyZWUgYW5kIGEgZnJlc2ggcHJveHkuCgovLyBSZXNldEZvclRlc3QgY2xlYXJzIGFsbCByZWFsbSBzdGF0ZS4KZnVuYyBSZXNldEZvclRlc3QoKSB7CglzbG90cyA9IGF2bC5OZXdUcmVlKCkKCXJldiA9IDAKCWxhc3RIZWlnaHQgPSAwCglwcm94eSA9IHVwZ3JhZGVhYmxlLk5ldyh1cGdyYWRlYWJsZS5OZXdBZGRyQXV0aG9yaXR5KEFkbWluKSkKfQoKLy8gU2VlZEZvclRlc3Qgd3JpdGVzIGEgc2xvdCB3aXRob3V0IHRoZSBhdXRob3JpdHkgY2hlY2suCmZ1bmMgU2VlZEZvclRlc3Qoc2x1ZywgYm9keSBzdHJpbmcpIHsKCXJldisrCglzbG90cy5TZXQoc2x1ZywgJlNsb3R7Qm9keTogYm9keSwgUmV2OiByZXYsIEhlaWdodDogMH0pCn0KCi8vIFJlc2VydmVkU2x1Z3NGb3JUZXN0IGV4cG9zZXMgdGhlIHJlc2VydmVkIG5hbWVzLgpmdW5jIFJlc2VydmVkU2x1Z3NGb3JUZXN0KCkgW11zdHJpbmcgeyByZXR1cm4gcmVzZXJ2ZWRTbHVncyB9ChpfCgtnbm9tb2QudG9tbBJQbW9kdWxlID0gImduby5sYW5kL3IvZzFsbmt5dGZxY2p3bGx3czYzZ3ZmMG12OXl0MDRhc3d5NHk5YW1obS9ob21lIgpnbm8gPSAiMC45IgoaumIKCGhvbWUuZ25vEq1iLy8gUGFja2FnZSBob21lIGlzIHRoZSByZWFsbSBiZWhpbmQgaHR0cHM6Ly9nbm8ubGFuZC91L2Nsb2Nrd29yay4KLy8KLy8gZ25vd2ViIGJ1aWxkcyBhIHVzZXIgcHJvZmlsZSBwYWdlIGJ5IGNhbGxpbmcgUmVuZGVyKCIiKSBvbiB0aGUgcmVhbG0gYXQgdGhlCi8vIGV4YWN0IHBhdGggL3IvPHVzZXJuYW1lPi9ob21lIChnbm8ubGFuZC9wa2cvZ25vd2ViL2hhbmRsZXJfaHR0cC5nbywKLy8gR2V0VXNlclZpZXcpLiBUaGF0IGxvb2t1cCBkb2VzIG5vIHZlcnNpb24gcmVzb2x1dGlvbiwgc28gdGhpcyBwYXRoIGlzIHRoZQovLyBpbnRlcmZhY2Ugd2l0aCBnbm93ZWIgYW5kIGNhbiBuZXZlciBjYXJyeSBhIC92TiBzdWZmaXguIEV2ZXJ5dGhpbmcgdGhhdAovLyBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGVyZWZvcmUgbGl2ZXMgYmVoaW5kIHRoZSBwYXRoLCBpbiBmb3VyIGxheWVyczoKLy8KLy8gIDEuIENPTlRFTlQgaXMgZGF0YS4gVGhlIHBhZ2UgaXMgYXNzZW1ibGVkIGZyb20gU0xPVFM6IG5hbWVkIG1hcmtkb3duCi8vICAgICBmcmFnbWVudHMgaW4gYW4gYXZsIHRyZWUsIGVhY2ggd3JpdHRlbiBieSBpdHMgb3duIFNldCBjYWxsLiBVcGRhdGluZwovLyAgICAgb25lIHBhcmFncmFwaCBpcyBvbmUgc21hbGwgdHJhbnNhY3Rpb24uCi8vICAyLiBMQVlPVVQgaXMgZGF0YS4gVGhlIHNsb3QgbmFtZWQgImxheW91dCIgaXMgdGhlIHBhZ2UgdGVtcGxhdGU7IGV2ZXJ5Ci8vICAgICA6c2x1ZzogcGxhY2Vob2xkZXIgaW4gaXQgaXMgZmlsbGVkIGZyb20gdGhlIHNsb3Qgb2YgdGhhdCBuYW1lLgovLyAgMy4gU1RZTEUgaXMgZGF0YS4gU2xvdHMgdW5kZXIgdGhlICJzdHlsZS4iIHByZWZpeCBhcmUga25vYnMgKGNvbG9ycywKLy8gICAgIGhlYWRlciBtb2RlKSB0aGF0IHRoZSB0aGVtZSByZWFkcy4gQ2hhbmdpbmcgdGhlIGFjY2VudCBjb2xvciBpcyBhIFNldC4KLy8gIDQuIFJFTkRFUklORyBpcyBjb2RlLCBidXQgcmVwbGFjZWFibGUuIEEgVEhFTUUgaXMgYSBzZXBhcmF0ZSByZWFsbSBuZXN0ZWQKLy8gICAgIHVuZGVyIHRoaXMgb25lIHRoYXQgaW1wbGVtZW50cyBUaGVtZSBhbmQgcmVnaXN0ZXJzIGl0c2VsZiBmcm9tIGl0cyBvd24KLy8gICAgIGluaXQuIFRoZSBhdXRob3JpdHkgYWNjZXB0cyBpdCB0aHJvdWdoIHAvY2xvY2t3b3JrL3VwZ3JhZGVhYmxlIGFuZCBjYW4KLy8gICAgIHJvbGwgaXQgYmFjay4gVGhlIHNsb3RzIG5ldmVyIG1vdmU6IGFuIHVwZ3JhZGUgcmVwbGFjZXMgdGhlIGNvZGUgdGhhdAovLyAgICAgcmVhZHMgdGhlbSwgbm90IHRoZSBkYXRhLiBXaGVuIG5vIHRoZW1lIGlzIGxpdmUgdGhlIGJ1aWx0LWluIHJlbmRlcmVyCi8vICAgICBpbiByZW5kZXIuZ25vIHNlcnZlcyB0aGUgcGFnZSwgYW5kIHRoZSBvcGVyYXRvciB2aWV3cyAoc3lzdGVtLCBzbG90cywKLy8gICAgIGVkaXQsIG1hbmlmZXN0KSBhcmUgYWx3YXlzIHNlcnZlZCBieSB0aGlzIHJlYWxtLCBzbyBhIHRoZW1lIHRoYXQKLy8gICAgIHBhbmljcyBjYW4gYmUgcm9sbGVkIGJhY2sgZnJvbSB0aGUgcGFnZSBpdCBjYW5ub3QgYnJlYWsuCi8vCi8vIFRoaXMgcmVhbG0gaG9sZHMgc3RhdGUgYW5kIGZvcndhcmRzLiBJdCBpcyBkZWxpYmVyYXRlbHkgc21hbGwsIGJlY2F1c2UgaXQKLy8gaXMgdGhlIG9uZSBwaWVjZSB0aGF0IGNhbiBuZXZlciBiZSByZWRlcGxveWVkOiBpdCBpcyBpbXBvcnRhYmxlIGJ5IGl0cwovLyB0aGVtZXMsIHNvIGl0IGNhbm5vdCBiZSBwcml2YXRlLCBzbyBBZGRQYWNrYWdlIHJlZnVzZXMgYSBzZWNvbmQgZGVwbG95LgpwYWNrYWdlIGhvbWUKCmltcG9ydCAoCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9oZXgiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJjaGFpbi9ydW50aW1lIgoKCSJnbm8ubGFuZC9wL2cxbG5reXRmcWNqd2xsd3M2M2d2ZjBtdjl5dDA0YXN3eTR5OWFtaG0vdXBncmFkZWFibGUvdjAiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIEFkbWluIGlzIHRoZSBpbml0aWFsIGF1dGhvcml0eTogdGhlIG9ubHkgYWRkcmVzcyB0aGF0IG1heSB3cml0ZSBzbG90cyBhbmQKLy8gYWNjZXB0LCByb2xsIGJhY2sgb3IgZnJlZXplIGEgdGhlbWUuIEl0IGlzIGEgY29uc3RhbnQgc28gYSByZXZpZXdlciBjYW4gcmVhZAovLyB3aG8gY29udHJvbHMgdGhlIHBhZ2Ugd2l0aG91dCBkZWNvZGluZyBjaGFpbiBzdGF0ZTsgVHJhbnNmZXJBdXRob3JpdHkgbW92ZXMKLy8gaXQgYWZ0ZXJ3YXJkcy4KLy8KLy8gVGhlIHZhbHVlIGhlcmUgaXMgdGhlIHN0YW5kYXJkIHRlc3QxIGFjY291bnQsIHNvIHRoZSBnbm9kZXYgd2Fsa3Rocm91Z2ggaW4KLy8gdGhlIFJFQURNRSB3b3JrcyB1bmVkaXRlZC4gYG1ha2UgYnVpbGQgQURNSU49ZzEuLi5gIHJld3JpdGVzIGl0IGZvciBhIHJlYWwKLy8gZGVwbG95bWVudC4KY29uc3QgQWRtaW4gPSBhZGRyZXNzKCJnMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtIikKCmNvbnN0ICgKCS8vIExheW91dFNsdWcgbmFtZXMgdGhlIHNsb3QgdXNlZCBhcyB0aGUgcGFnZSB0ZW1wbGF0ZS4KCUxheW91dFNsdWcgPSAibGF5b3V0IgoKCS8vIFN0eWxlUHJlZml4IG1hcmtzIHNsb3RzIHRoYXQgYXJlIHN0eWxlIGtub2JzIHJhdGhlciB0aGFuIGNvbnRlbnQuCgkvLyBTdHlsZSgiYWNjZW50IiwgLi4uKSByZWFkcyB0aGUgc2xvdCAic3R5bGUuYWNjZW50Ii4KCVN0eWxlUHJlZml4ID0gInN0eWxlLiIKCgkvLyBtYXhTbHVnTGVuIGJvdW5kcyBhIHNsb3QgbmFtZSBzbyBhbiBpbmRleCByb3cgc3RheXMgcmVhZGFibGUuCgltYXhTbHVnTGVuID0gNjQKKQoKLy8gVGhlbWUgaXMgd2hhdCBhIHJlbmRlcmVyIHJlYWxtIHByb21pc2VzLiBJdCBpcyBkZWNsYXJlZCBoZXJlLCBpbiB0aGUgZmlsZQovLyB0aGF0IGNhbiBuZXZlciBjaGFuZ2UsIHNvIGV2ZXJ5IHRoZW1lIHZlcnNpb24gYWdyZWVzIG9uIG9uZSB0eXBlIGlkZW50aXR5LgovLwovLyBSZW5kZXIgcmVjZWl2ZXMgdGhlIHJlbmRlciBwYXRoICgiIiBpcyB0aGUgcHJvZmlsZSBwYWdlKSBhbmQgcmV0dXJucwovLyBtYXJrZG93bi4gVGhlIG9wZXJhdG9yIHZpZXdzIChzeXN0ZW0sIHNsb3RzLCBlZGl0LCBtYW5pZmVzdCkgbmV2ZXIgcmVhY2ggYQovLyB0aGVtZTsgZm9yIGFueSBvdGhlciBwYXRoIGl0IGRvZXMgbm90IGRyYXcgaXRzZWxmLCBhIHRoZW1lIHNob3VsZCByZXR1cm4KLy8gRmFsbGJhY2socGF0aCkuIEEgcGFuaWMgaGVyZSBhYm9ydHMgdGhlIHF1ZXJ5OiB0aGVyZSBpcyBubyByZWNvdmVyaW5nIGEKLy8gZm9yZWlnbiByZWFsbSdzIHBhbmljLCBzbyBhIGJyb2tlbiB0aGVtZSBzaG93cyBhbiBlcnJvciB1bnRpbCBSb2xsYmFjay4KdHlwZSBUaGVtZSBpbnRlcmZhY2UgewoJUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcKfQoKLy8gU2xvdCBpcyBvbmUgbmFtZWQgZnJhZ21lbnQgb2YgdGhlIHBhZ2UuCnR5cGUgU2xvdCBzdHJ1Y3QgewoJQm9keSAgIHN0cmluZwoJUmV2ICAgIGludCAgIC8vIFJldmlzaW9uKCkgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgd3JpdGUgdG8gdGhpcyBzbG90CglIZWlnaHQgaW50NjQgLy8gYmxvY2sgaGVpZ2h0IG9mIHRoYXQgd3JpdGUKfQoKdmFyICgKCXByb3h5ICAgICp1cGdyYWRlYWJsZS5Qcm94eQoJc2VsZlBhdGggc3RyaW5nCgoJc2xvdHMgICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gc2x1ZyAtPiAqU2xvdAoJcmV2ICAgICAgICBpbnQgICAgICAgICAgICAgLy8gdG90YWwgd3JpdGVzIGFjY2VwdGVkOyBidW1wcyBvbiBldmVyeSBtdXRhdGlvbgoJbGFzdEhlaWdodCBpbnQ2NCAgICAgICAgICAgLy8gaGVpZ2h0IG9mIHRoZSBtb3N0IHJlY2VudCB3cml0ZQopCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CgkvLyBDYXB0dXJlZCByYXRoZXIgdGhhbiB3cml0dGVuIGFzIGEgY29uc3RhbnQsIHNvIGxpbmtzIGFuZCB0aGUgbmVzdGluZwoJLy8gcnVsZSBmb2xsb3cgdGhlIHBhdGggdGhpcyBjb2RlIHdhcyBhY3R1YWxseSBkZXBsb3llZCBhdC4KCXNlbGZQYXRoID0gY3VyLlBrZ1BhdGgoKQoJcHJveHkgPSB1cGdyYWRlYWJsZS5OZXcodXBncmFkZWFibGUuTmV3QWRkckF1dGhvcml0eShBZG1pbikpCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBdXRob3JpdHkKCi8vIGFzc2VydEF1dGhvcml0eSBwYW5pY3MgdW5sZXNzIHRoZSBjYWxsZXIgb2YgdGhlIGNyb3NzaW5nIGZ1bmN0aW9uIHRoYXQgb3ducwovLyBjdXIgaXMgdGhlIGN1cnJlbnQgYXV0aG9yaXR5LiBJdCBhc2tzIHRoZSBwcm94eSdzIEF1dGhvcml0eSBkaXJlY3RseSByYXRoZXIKLy8gdGhhbiBnb2luZyB0aHJvdWdoIHByb3h5LkFzc2VydEF1dGhvcml6ZWQsIHNvIGNvbnRlbnQgd3JpdGVzIGtlZXAgd29ya2luZwovLyBhZnRlciBGcmVlemU6IGZyZWV6aW5nIGVuZHMgY29kZSB1cGdyYWRlcywgbm90IGVkaXRpbmcuCmZ1bmMgYXNzZXJ0QXV0aG9yaXR5KGN1ciByZWFsbSkgewoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpCglpZiAhcHJveHkuQXV0aG9yaXR5KCkuQXV0aG9yaXplZChjYWxsZXIuQWRkcmVzcygpLCBjYWxsZXIuUGtnUGF0aCgpKSB7CgkJcGFuaWMoImhvbWU6IHJlc3RyaWN0ZWQgdG8gdGhlIGF1dGhvcml0eSIpCgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTbHVncwoKLy8gcmVzZXJ2ZWRTbHVncyBhcmUgcGxhY2Vob2xkZXJzIGNvbXB1dGVkIGF0IHJlbmRlciB0aW1lIChzZWUgcmVuZGVyLmdubykuIEEKLy8gc2xvdCBtYXkgbm90IHRha2Ugb25lIG9mIHRoZXNlIG5hbWVzLCBzbyB0aGUgcGFnZSBuZXZlciBkZXBlbmRzIG9uIHdoaWNoCi8vIG9mIHRoZSB0d28gd291bGQgd2luLgp2YXIgcmVzZXJ2ZWRTbHVncyA9IFtdc3RyaW5neyJjaGFpbmlkIiwgImhlaWdodCIsICJvd25lciIsICJyZWFsbSIsICJyZXYiLCAic2xvdHMiLCAidGhlbWUiLCAidXBkYXRlZCJ9CgovLyB2YWxpZFNsdWcgcmVwb3J0cyB3aGV0aGVyIHNsdWcgaXMgYSBsZWdhbCBzbG90IG5hbWU6IDEuLm1heFNsdWdMZW4gYnl0ZXMgb2YKLy8gW2EtejAtOS5fLV0uIE5vICc6JyBzbyBhIHNsdWcgY2FuIG5ldmVyIGJyZWFrIG91dCBvZiBpdHMgb3duIDpzbHVnOgovLyBwbGFjZWhvbGRlciwgYW5kIG5vIHVwcGVyY2FzZSBzbyBhIHNsb3QgaGFzIGV4YWN0bHkgb25lIG5hbWUuCmZ1bmMgdmFsaWRTbHVnKHNsdWcgc3RyaW5nKSBib29sIHsKCWlmIGxlbihzbHVnKSA9PSAwIHx8IGxlbihzbHVnKSA+IG1heFNsdWdMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzbHVnKTsgaSsrIHsKCQljIDo9IHNsdWdbaV0KCQlzd2l0Y2ggewoJCWNhc2UgYyA+PSAnYScgJiYgYyA8PSAneicsIGMgPj0gJzAnICYmIGMgPD0gJzknOgoJCWNhc2UgYyA9PSAnLScsIGMgPT0gJ18nLCBjID09ICcuJzoKCQlkZWZhdWx0OgoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgpmdW5jIGFzc2VydFdyaXRhYmxlU2x1ZyhzbHVnIHN0cmluZykgewoJaWYgIXZhbGlkU2x1ZyhzbHVnKSB7CgkJcGFuaWMoImhvbWU6IGludmFsaWQgc2x1ZyAiICsgc3RyY29udi5RdW90ZShzbHVnKSArCgkJCSI6IHdhbnQgMS0iICsgc3RyY29udi5JdG9hKG1heFNsdWdMZW4pICsgIiBieXRlcyBvZiBbYS16MC05Ll8tXSIpCgl9Cglmb3IgXywgciA6PSByYW5nZSByZXNlcnZlZFNsdWdzIHsKCQlpZiBzbHVnID09IHIgewoJCQlwYW5pYygiaG9tZTogcmVzZXJ2ZWQgc2x1ZyAiICsgc2x1ZyArICIgaXMgY29tcHV0ZWQgYXQgcmVuZGVyIHRpbWUiKQoJCX0KCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdyaXRlcyAoYXV0aG9yaXR5IG9ubHkpCgovLyBTZXQgY3JlYXRlcyBvciByZXBsYWNlcyB0aGUgc2xvdCBuYW1lZCBzbHVnLiBUaGlzIGlzIHRoZSBvcmRpbmFyeSB1cGRhdGU6Ci8vIG9uZSBzbG90LCBvbmUgdHJhbnNhY3Rpb24uIEFuIGVtcHR5IGJvZHkga2VlcHMgdGhlIHNsb3QgYnV0IGVtcHRpZXMgaXQ7IHVzZQovLyBEZWxldGUgdG8gcmVtb3ZlIGl0LgpmdW5jIFNldChjdXIgcmVhbG0sIHNsdWcsIGJvZHkgc3RyaW5nKSB7Cglhc3NlcnRBdXRob3JpdHkoY3VyKQoJYXNzZXJ0V3JpdGFibGVTbHVnKHNsdWcpCgl3cml0ZShzbHVnLCBib2R5KQp9CgovLyBBcHBlbmQgYWRkcyB0byB0aGUgZW5kIG9mIGEgc2xvdCwgY3JlYXRpbmcgaXQgd2hlbiBhYnNlbnQuIEl0IGV4aXN0cyBmb3IgYQovLyBib2R5IHRvbyBsYXJnZSBmb3Igb25lIHRyYW5zYWN0aW9uOiBTZXQgdGhlIGZpcnN0IGNodW5rLCBBcHBlbmQgdGhlIHJlc3QuCmZ1bmMgQXBwZW5kKGN1ciByZWFsbSwgc2x1ZywgYm9keSBzdHJpbmcpIHsKCWFzc2VydEF1dGhvcml0eShjdXIpCglhc3NlcnRXcml0YWJsZVNsdWcoc2x1ZykKCXdyaXRlKHNsdWcsIEdldChzbHVnKStib2R5KQp9CgovLyBEZWxldGUgcmVtb3ZlcyBhIHNsb3QuIERlbGV0aW5nIHRoZSBsYXlvdXQgc2xvdCByZXN0b3JlcyB0aGUgdGhlbWUncwovLyBkZWZhdWx0IGxheW91dC4KZnVuYyBEZWxldGUoY3VyIHJlYWxtLCBzbHVnIHN0cmluZykgewoJYXNzZXJ0QXV0aG9yaXR5KGN1cikKCWlmIF8sIHJlbW92ZWQgOj0gc2xvdHMuUmVtb3ZlKHNsdWcpOyAhcmVtb3ZlZCB7CgkJcGFuaWMoImhvbWU6IG5vIHN1Y2ggc2xvdDogIiArIHNsdWcpCgl9CglidW1wKCkKfQoKZnVuYyB3cml0ZShzbHVnLCBib2R5IHN0cmluZykgewoJYnVtcCgpCglzbG90cy5TZXQoc2x1ZywgJlNsb3R7Qm9keTogYm9keSwgUmV2OiByZXYsIEhlaWdodDogbGFzdEhlaWdodH0pCn0KCmZ1bmMgYnVtcCgpIHsKCXJldisrCglsYXN0SGVpZ2h0ID0gcnVudGltZS5DaGFpbkhlaWdodCgpCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZWFkcyAoYW55b25lLCBpbmNsdWRpbmcgdGhlbWVzKQoKLy8gR2V0IHJldHVybnMgYSBzbG90IGJvZHksIG9yICIiIHdoZW4gdGhlIHNsb3QgZG9lcyBub3QgZXhpc3QuCmZ1bmMgR2V0KHNsdWcgc3RyaW5nKSBzdHJpbmcgewoJdiA6PSBzbG90cy5HZXQoc2x1ZykKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiB2LigqU2xvdCkuQm9keQp9CgovLyBIYXMgcmVwb3J0cyB3aGV0aGVyIGEgc2xvdCBleGlzdHMsIGVtcHR5IG9yIG5vdC4KZnVuYyBIYXMoc2x1ZyBzdHJpbmcpIGJvb2wgeyByZXR1cm4gc2xvdHMuSGFzKHNsdWcpIH0KCi8vIExvb2t1cCByZXR1cm5zIGEgY29weSBvZiBhIHNsb3QgYW5kIHdoZXRoZXIgaXQgZXhpc3RzLgpmdW5jIExvb2t1cChzbHVnIHN0cmluZykgKFNsb3QsIGJvb2wpIHsKCXYgOj0gc2xvdHMuR2V0KHNsdWcpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIFNsb3R7fSwgZmFsc2UKCX0KCXJldHVybiAqdi4oKlNsb3QpLCB0cnVlCn0KCi8vIFNsdWdzIHJldHVybnMgZXZlcnkgc2xvdCBuYW1lLCBzb3J0ZWQuCmZ1bmMgU2x1Z3MoKSBbXXN0cmluZyB7CglvdXQgOj0gbWFrZShbXXN0cmluZywgMCwgc2xvdHMuU2l6ZSgpKQoJc2xvdHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgXyBhbnkpIGJvb2wgewoJCW91dCA9IGFwcGVuZChvdXQsIGtleSkKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gb3V0Cn0KCi8vIEVhY2ggdmlzaXRzIGV2ZXJ5IHNsb3QgaW4gbmFtZSBvcmRlciB1bnRpbCBmbiByZXR1cm5zIHRydWUuCmZ1bmMgRWFjaChmbiBmdW5jKHNsdWcgc3RyaW5nLCBzIFNsb3QpIGJvb2wpIHsKCXNsb3RzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGZuKGtleSwgKnZhbHVlLigqU2xvdCkpCgl9KQp9CgovLyBTdHlsZSByZXR1cm5zIHRoZSBzdHlsZSBrbm9iIG5hbWVkIGtleSAodGhlIHNsb3QgInN0eWxlLiIra2V5KSwgb3IgZmFsbGJhY2sKLy8gd2hlbiBpdCBpcyBhYnNlbnQgb3IgZW1wdHkuCmZ1bmMgU3R5bGUoa2V5LCBmYWxsYmFjayBzdHJpbmcpIHN0cmluZyB7CglpZiB2IDo9IEdldChTdHlsZVByZWZpeCArIGtleSk7IHYgIT0gIiIgewoJCXJldHVybiB2Cgl9CglyZXR1cm4gZmFsbGJhY2sKfQoKLy8gTGF5b3V0IHJldHVybnMgdGhlIGxheW91dCBzbG90LCBvciAiIiB3aGVuIG5vbmUgaGFzIGJlZW4gc2V0LiBUaGVtZXMKLy8gc3Vic3RpdHV0ZSB0aGVpciBvd24gZGVmYXVsdCBpbiB0aGF0IGNhc2UuCmZ1bmMgTGF5b3V0KCkgc3RyaW5nIHsgcmV0dXJuIEdldChMYXlvdXRTbHVnKSB9CgovLyBSZXZpc2lvbiByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2Ygd3JpdGVzIHRoaXMgcmVhbG0gaGFzIGFjY2VwdGVkLiBJdAovLyBjaGFuZ2VzIG9uIGV2ZXJ5IG11dGF0aW9uLCBzbyBhIGNsaWVudCBjYW4gY2hlYXBseSB0ZWxsICJub3RoaW5nIG1vdmVkIi4KZnVuYyBSZXZpc2lvbigpIGludCB7IHJldHVybiByZXYgfQoKLy8gTGFzdEhlaWdodCByZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgb2YgdGhlIG1vc3QgcmVjZW50IHdyaXRlLCBvciAwLgpmdW5jIExhc3RIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBsYXN0SGVpZ2h0IH0KCi8vIE1hbmlmZXN0IHJldHVybnMgb25lIHRhYi1zZXBhcmF0ZWQgbGluZSBwZXIgc2xvdDoKLy8KLy8JPHNsdWc+XHQ8cmV2Plx0PGJ5dGVzPlx0PHNoYTI1NiBvZiBib2R5LCBoZXg+Ci8vCi8vIEl0IGlzIHRoZSBkaWZmIHN1cmZhY2Ugc2NyaXB0cy9zeW5jLnNoIHJlYWRzOiBvbmUgcXVlcnkgdGVsbHMgaXQgZXhhY3RseQovLyB3aGljaCBsb2NhbCBmaWxlIGlzIG91dCBvZiBkYXRlLCB3aXRob3V0IGRvd25sb2FkaW5nIGFueSBib2R5LgpmdW5jIE1hbmlmZXN0KCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJc2xvdHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlzIDo9IHZhbHVlLigqU2xvdCkKCQlzdW0gOj0gc2hhMjU2LlN1bTI1NihbXWJ5dGUocy5Cb2R5KSkKCQliLldyaXRlU3RyaW5nKGtleSkKCQliLldyaXRlU3RyaW5nKCJcdCIpCgkJYi5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2Eocy5SZXYpKQoJCWIuV3JpdGVTdHJpbmcoIlx0IikKCQliLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShsZW4ocy5Cb2R5KSkpCgkJYi5Xcml0ZVN0cmluZygiXHQiKQoJCWIuV3JpdGVTdHJpbmcoaGV4LkVuY29kZVRvU3RyaW5nKHN1bVs6XSkpCgkJYi5Xcml0ZVN0cmluZygiXG4iKQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIFBhdGggcmV0dXJucyB0aGlzIHJlYWxtJ3MgcGFja2FnZSBwYXRoLCBlLmcuICJnbm8ubGFuZC9yL2cxbG5reXRmcWNqd2xsd3M2M2d2ZjBtdjl5dDA0YXN3eTR5OWFtaG0vaG9tZSIuCmZ1bmMgUGF0aCgpIHN0cmluZyB7IHJldHVybiBzZWxmUGF0aCB9CgovLyBMaW5rIHJldHVybnMgdGhlIGdub3dlYiBwYXRoIG9mIGEgcmVuZGVyIHBhdGggb24gdGhpcyByZWFsbToKLy8gTGluaygiIikgaXMgIi9yL2cxbG5reXRmcWNqd2xsd3M2M2d2ZjBtdjl5dDA0YXN3eTR5OWFtaG0vaG9tZSIsIExpbmsoInNsb3RzIikgaXMgIi9yL2cxbG5reXRmcWNqd2xsd3M2M2d2ZjBtdjl5dDA0YXN3eTR5OWFtaG0vaG9tZTpzbG90cyIuCmZ1bmMgTGluayhzdWIgc3RyaW5nKSBzdHJpbmcgewoJcCA6PSBzZWxmUGF0aAoJaWYgaSA6PSBzdHJpbmdzLkluZGV4KHAsICIvIik7IGkgPj0gMCB7CgkJcCA9IHBbaTpdCgl9CglpZiBzdWIgPT0gIiIgewoJCXJldHVybiBwCgl9CglyZXR1cm4gcCArICI6IiArIHN1Ygp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhlbWVzOiB0aGUgdXBncmFkZWFibGUgcGFydC4KLy8KLy8gQSB0aGVtZSByZWFsbSBuZXN0ZWQgdW5kZXIgdGhpcyBwYXRoICjigKYvaG9tZS90aGVtZS92TikgY2FsbHMgUmVnaXN0ZXIgZnJvbQovLyBpdHMgb3duIGluaXQsIHNvIGRlcGxveWluZyBpdCBpcyB3aGF0IG5vbWluYXRlcyBpdC4gTm90aGluZyBzZXJ2ZXMgdW50aWwgdGhlCi8vIGF1dGhvcml0eSBydW5zIEFjY2VwdCB3aXRoIHRoYXQgcGF0aCwgd2hpY2ggaXMgYSBzZXBhcmF0ZSB0cmFuc2FjdGlvbiBuYW1pbmcKLy8gY29kZSBhbnlvbmUgY2FuIGdvIGFuZCByZWFkLiBSb2xsYmFjayBwdXRzIHRoZSBwcmV2aW91cyB0aGVtZSBiYWNrLgoKLy8gUmVnaXN0ZXIgcmVjb3JkcyB0aGUgY2FsbGluZyByZWFsbSdzIHRoZW1lIGFzIGEgY2FuZGlkYXRlLiBUaGUgcGF0aCBmaWxlZAovLyBpcyByZWFkIG9mZiB0aGUgY3Jvc3NpbmcgZnJhbWUsIG5ldmVyIHRha2VuIGFzIGFuIGFyZ3VtZW50LCBzbyBhIGNhbmRpZGF0ZQovLyBjYW5ub3QgY2xhaW0gdG8gbGl2ZSBzb21ld2hlcmUgaXQgZG9lcyBub3QuIE9ubHkgcmVhbG1zIG5lc3RlZCB1bmRlciB0aGlzCi8vIG9uZSBhcmUgYWRtaXR0ZWQ7IGEgZGlyZWN0IHVzZXIgY2FsbCBpcyByZWZ1c2VkLgpmdW5jIFJlZ2lzdGVyKGN1ciByZWFsbSwgdCBUaGVtZSkgeyBwcm94eS5Qcm9wb3NlKDAsIGN1ciwgdCkgfQoKLy8gQWNjZXB0IG1ha2VzIHRoZSBjYW5kaWRhdGUgYXQgcGtnUGF0aCB0aGUgbGl2ZSB0aGVtZS4gQXV0aG9yaXR5IG9ubHkuCmZ1bmMgQWNjZXB0KGN1ciByZWFsbSwgcGtnUGF0aCBzdHJpbmcpIHsgcHJveHkuQWNjZXB0KDAsIGN1ciwgcGtnUGF0aCkgfQoKLy8gV2l0aGRyYXcgZHJvcHMgYSBjYW5kaWRhdGUuIEF1dGhvcml0eSBvbmx5LCBleGNlcHQgdGhhdCBhIHRoZW1lIHJlYWxtIG1heQovLyBhbHdheXMgZHJvcCBpdHMgb3duLgpmdW5jIFdpdGhkcmF3KGN1ciByZWFsbSwgcGtnUGF0aCBzdHJpbmcpIHsgcHJveHkuV2l0aGRyYXcoMCwgY3VyLCBwa2dQYXRoKSB9CgovLyBSb2xsYmFjayByZXN0b3JlcyB0aGUgcHJldmlvdXMgdGhlbWUgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgb25lIHRvIHRoZQovLyBwZW5kaW5nIHNldC4gQXV0aG9yaXR5IG9ubHkuCmZ1bmMgUm9sbGJhY2soY3VyIHJlYWxtKSB7IHByb3h5LlJvbGxiYWNrKDAsIGN1cikgfQoKLy8gRm9yZ2V0IGRyb3BzIHRoZSByb2xsYmFjayBoaXN0b3J5IGFuZCB0aGUgc3RvcmFnZSBpdCBob2xkcy4gQXV0aG9yaXR5IG9ubHkuCmZ1bmMgRm9yZ2V0KGN1ciByZWFsbSkgeyBwcm94eS5Gb3JnZXQoMCwgY3VyKSB9CgovLyBGcmVlemUgZW5kcyB0aGVtZSB1cGdyYWRlcyBwZXJtYW5lbnRseS4gU2xvdHMgc3RheSBlZGl0YWJsZS4gQXV0aG9yaXR5Ci8vIG9ubHksIGFuZCB0aGVyZSBpcyBubyB3YXkgYmFjay4KZnVuYyBGcmVlemUoY3VyIHJlYWxtKSB7IHByb3h5LkZyZWV6ZSgwLCBjdXIpIH0KCi8vIFRyYW5zZmVyQXV0aG9yaXR5IGhhbmRzIGJvdGggZWRpdGluZyBhbmQgdXBncmFkaW5nIHRvIGFub3RoZXIgYWRkcmVzcy4KZnVuYyBUcmFuc2ZlckF1dGhvcml0eShjdXIgcmVhbG0sIHRvIGFkZHJlc3MpIHsKCXByb3h5LlRyYW5zZmVyQXV0aG9yaXR5KDAsIGN1ciwgdXBncmFkZWFibGUuTmV3QWRkckF1dGhvcml0eSh0bykpCn0KCi8vIExpdmVQYXRoIHJldHVybnMgdGhlIHJlYWxtIHBhdGggb2YgdGhlIHRoZW1lIGN1cnJlbnRseSBzZXJ2aW5nLCBvciAiIi4KZnVuYyBMaXZlUGF0aCgpIHN0cmluZyB7IHJldHVybiBwcm94eS5MaXZlUGF0aCgpIH0KCi8vIFBlbmRpbmdQYXRocyByZXR1cm5zIHRoZSBjYW5kaWRhdGUgdGhlbWUgcGF0aHMgYXdhaXRpbmcgYWNjZXB0YW5jZS4KZnVuYyBQZW5kaW5nUGF0aHMoKSBbXXN0cmluZyB7CglvdXQgOj0gW11zdHJpbmd7fQoJZm9yIF8sIHIgOj0gcmFuZ2UgcHJveHkuUGVuZGluZygpIHsKCQlvdXQgPSBhcHBlbmQob3V0LCByLlBrZ1BhdGgoKSkKCX0KCXJldHVybiBvdXQKfQoKLy8gSGlzdG9yeVBhdGhzIHJldHVybnMgdGhlIHRoZW1lcyB0aGlzIHJlYWxtIGhhcyBhbHJlYWR5IHNlcnZlZCwgb2xkZXN0Ci8vIGZpcnN0LCBleGNsdWRpbmcgdGhlIGxpdmUgb25lLgpmdW5jIEhpc3RvcnlQYXRocygpIFtdc3RyaW5nIHsKCW91dCA6PSBbXXN0cmluZ3t9Cglmb3IgXywgciA6PSByYW5nZSBwcm94eS5IaXN0b3J5KCkgewoJCW91dCA9IGFwcGVuZChvdXQsIHIuUGtnUGF0aCgpKQoJfQoJcmV0dXJuIG91dAp9CgovLyBGcm96ZW4gcmVwb3J0cyB3aGV0aGVyIHRoZW1lIHVwZ3JhZGVzIGhhdmUgZW5kZWQuCmZ1bmMgRnJvemVuKCkgYm9vbCB7IHJldHVybiBwcm94eS5Gcm96ZW4oKSB9CgovLyBBdXRob3JpdHkgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdobyBtYXkgd3JpdGUgYW5kCi8vIHVwZ3JhZGUuCmZ1bmMgQXV0aG9yaXR5KCkgc3RyaW5nIHsgcmV0dXJuIHByb3h5LkF1dGhvcml0eSgpLlN0cmluZygpIH0KCi8vIGxpdmVUaGVtZSByZXR1cm5zIHRoZSBhY2NlcHRlZCB0aGVtZSwgaWYgYW55LgpmdW5jIGxpdmVUaGVtZSgpIChUaGVtZSwgYm9vbCkgewoJdiwgb2sgOj0gcHJveHkuVHJ5SW1wbCgpCglpZiAhb2sgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9Cgl0LCBvayA6PSB2LihUaGVtZSkKCXJldHVybiB0LCBvawp9ChrnRwoNaG9tZV90ZXN0LmdubxLVRy8vIFBhY2thZ2UgaG9tZV90ZXN0IGRyaXZlcyB0aGUgcmVhbG0gZnJvbSBvdXRzaWRlLCB0aGUgd2F5IHRyYW5zYWN0aW9ucyBkbzoKLy8gZXZlcnkgd3JpdGUgYW5kIGV2ZXJ5IHRoZW1lIG9wZXJhdGlvbiBjcm9zc2VzIGludG8gZ25vLmxhbmQvci9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL2hvbWUsCi8vIHNvIHRoZSBhdXRob3JpdHkgY2hlY2sgc2VlcyB3aG9ldmVyIHRlc3RpbmcuU2V0UmVhbG0gbmFtZXMgYXMgdGhlIGNhbGxlci4KcGFja2FnZSBob21lX3Rlc3QKCmltcG9ydCAoCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCgkiZ25vLmxhbmQvci9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL2hvbWUiCikKCnZhciBzdHJhbmdlciA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygibWFsbG9yeSIpCgpjb25zdCAoCgl0aGVtZUEgPSAiZ25vLmxhbmQvci9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL2hvbWUvdGhlbWUvdjAiCgl0aGVtZUIgPSAiZ25vLmxhbmQvci9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL2hvbWUvdGhlbWUvdjEiCikKCi8vIHN0dWJUaGVtZSB3cmFwcyB0aGUgcGFnZSBzbyBhIHRlc3QgY2FuIHRlbGwgd2hvIGFuc3dlcmVkLgp0eXBlIHN0dWJUaGVtZSBzdHJ1Y3R7IHRhZyBzdHJpbmcgfQoKZnVuYyAocyBzdHViVGhlbWUpIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJjdXN0b20iKSB7CgkJcmV0dXJuICJjdXN0b20gYnkgIiArIHMudGFnCgl9CglpZiBwYXRoICE9ICIiIHsKCQlyZXR1cm4gaG9tZS5GYWxsYmFjayhwYXRoKQoJfQoJZiA6PSBob21lLk5ld0ZpbGxlcigpCglmLkFkZCgid2lkZ2V0IiwgZnVuYygpIHN0cmluZyB7IHJldHVybiAiPCIgKyBzLnRhZyArICI+IiB9KQoJbGF5b3V0IDo9IGhvbWUuTGF5b3V0KCkKCWlmIGxheW91dCA9PSAiIiB7CgkJbGF5b3V0ID0gImRlZmF1bHQgb2YgIiArIHMudGFnCgl9CglyZXR1cm4gZi5GaWxsKGxheW91dCkKfQoKLy8gYnJva2VuVGhlbWUgcGFuaWNzIG9uIHRoZSBwcm9maWxlIHBhZ2UuCnR5cGUgYnJva2VuVGhlbWUgc3RydWN0e30KCmZ1bmMgKGJyb2tlblRoZW1lKSBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoID09ICIiIHsKCQlwYW5pYygia2Fib29tIikKCX0KCXJldHVybiBob21lLkZhbGxiYWNrKHBhdGgpCn0KCi8vIHRlc3RpbmcuU2V0UmVhbG0gYXBwbGllcyB0byB0aGUgZnJhbWUgdGhhdCBjYWxscyBpdCwgc28gZXZlcnkgdGVzdCBuYW1lcwovLyBpdHMgY2FsbGVyIGlubGluZSwgcmlnaHQgYmVmb3JlIHRoZSBjcm9zc2luZyBjYWxsLCByYXRoZXIgdGhhbiB0aHJvdWdoIGEKLy8gaGVscGVyLiBBIGNvZGUgcmVhbG0gc3RhbmRzIGluIGZvciBhIHRoZW1lIGRlcGxveW1lbnQ6IG9uIGNoYWluIHRoZSB0aGVtZSdzCi8vIGluaXQgY3Jvc3MtY2FsbHMgUmVnaXN0ZXIsIHdoaWNoIHRoZSBoYXJuZXNzIGRvZXMgbm90IGRlbGl2ZXIgYXMgYQovLyB0cmFuc2FjdGlvbi4KdmFyICgKCWFkbWluICAgPSB0ZXN0aW5nLk5ld1VzZXJSZWFsbShob21lLkFkbWluKQoJbWFsbG9yeSA9IHRlc3RpbmcuTmV3VXNlclJlYWxtKHN0cmFuZ2VyKQopCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2xvdHMKCmZ1bmMgVGVzdFNldEdldERlbGV0ZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaG9tZS5SZXNldEZvclRlc3QoKQoJdGVzdGluZy5TZXRSZWFsbShhZG1pbikKCglob21lLlNldChjcm9zcyhjdXIpLCAiaW50cm8iLCAiQnVpbGRpbmcgb24gZ25vLiIpCgl1YXNzZXJ0LkVxdWFsKHQsICJCdWlsZGluZyBvbiBnbm8uIiwgaG9tZS5HZXQoImludHJvIikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGhvbWUuUmV2aXNpb24oKSkKCXVhc3NlcnQuVHJ1ZSh0LCBob21lLkhhcygiaW50cm8iKSkKCglob21lLlNldChjcm9zcyhjdXIpLCAiaW50cm8iLCAiU3RpbGwgYnVpbGRpbmcuIikKCXVhc3NlcnQuRXF1YWwodCwgIlN0aWxsIGJ1aWxkaW5nLiIsIGhvbWUuR2V0KCJpbnRybyIpKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBob21lLlJldmlzaW9uKCkpCgoJcywgb2sgOj0gaG9tZS5Mb29rdXAoImludHJvIikKCXVhc3NlcnQuVHJ1ZSh0LCBvaykKCXVhc3NlcnQuRXF1YWwodCwgMiwgcy5SZXYpCgoJaG9tZS5EZWxldGUoY3Jvc3MoY3VyKSwgImludHJvIikKCXVhc3NlcnQuRXF1YWwodCwgIiIsIGhvbWUuR2V0KCJpbnRybyIpKQoJdWFzc2VydC5GYWxzZSh0LCBob21lLkhhcygiaW50cm8iKSkKCXVhc3NlcnQuRXF1YWwodCwgMywgaG9tZS5SZXZpc2lvbigpKQoKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibm8gc3VjaCBzbG90OiBpbnRybyIsIGZ1bmMoKSB7CgkJaG9tZS5EZWxldGUoY3Jvc3MoY3VyKSwgImludHJvIikKCX0pCn0KCmZ1bmMgVGVzdEFwcGVuZENodW5rcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaG9tZS5SZXNldEZvclRlc3QoKQoJdGVzdGluZy5TZXRSZWFsbShhZG1pbikKCglob21lLlNldChjcm9zcyhjdXIpLCAibG9uZyIsICJwYXJ0IG9uZS4gIikKCWhvbWUuQXBwZW5kKGNyb3NzKGN1ciksICJsb25nIiwgInBhcnQgdHdvLiIpCgl1YXNzZXJ0LkVxdWFsKHQsICJwYXJ0IG9uZS4gcGFydCB0d28uIiwgaG9tZS5HZXQoImxvbmciKSkKCglob21lLkFwcGVuZChjcm9zcyhjdXIpLCAiZnJlc2giLCAiaGVsbG8iKQoJdWFzc2VydC5FcXVhbCh0LCAiaGVsbG8iLCBob21lLkdldCgiZnJlc2giKSkKfQoKZnVuYyBUZXN0V3JpdGVzQXJlQXV0aG9yaXR5T25seShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaG9tZS5SZXNldEZvclRlc3QoKQoJdGVzdGluZy5TZXRSZWFsbShtYWxsb3J5KQoKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicmVzdHJpY3RlZCB0byB0aGUgYXV0aG9yaXR5IiwgZnVuYygpIHsKCQlob21lLlNldChjcm9zcyhjdXIpLCAiaW50cm8iLCAicHduZWQiKQoJfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicmVzdHJpY3RlZCB0byB0aGUgYXV0aG9yaXR5IiwgZnVuYygpIHsKCQlob21lLkFwcGVuZChjcm9zcyhjdXIpLCAiaW50cm8iLCAicHduZWQiKQoJfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicmVzdHJpY3RlZCB0byB0aGUgYXV0aG9yaXR5IiwgZnVuYygpIHsKCQlob21lLkRlbGV0ZShjcm9zcyhjdXIpLCAiaW50cm8iKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgaG9tZS5SZXZpc2lvbigpKQp9CgpmdW5jIFRlc3RUcmFuc2ZlckF1dGhvcml0eU1vdmVzRWRpdGluZyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaG9tZS5SZXNldEZvclRlc3QoKQoJdGVzdGluZy5TZXRSZWFsbShhZG1pbikKCWhvbWUuVHJhbnNmZXJBdXRob3JpdHkoY3Jvc3MoY3VyKSwgc3RyYW5nZXIpCgoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJyZXN0cmljdGVkIHRvIHRoZSBhdXRob3JpdHkiLCBmdW5jKCkgewoJCWhvbWUuU2V0KGNyb3NzKGN1ciksICJpbnRybyIsICJvbGQgb3duZXIiKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKG1hbGxvcnkpCglob21lLlNldChjcm9zcyhjdXIpLCAiaW50cm8iLCAibmV3IG93bmVyIikKCXVhc3NlcnQuRXF1YWwodCwgIm5ldyBvd25lciIsIGhvbWUuR2V0KCJpbnRybyIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaG9tZS5BdXRob3JpdHkoKSwgc3RyYW5nZXIuU3RyaW5nKCkpKQp9CgpmdW5jIFRlc3RTbHVnUnVsZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWhvbWUuUmVzZXRGb3JUZXN0KCkKCXRlc3RpbmcuU2V0UmVhbG0oYWRtaW4pCgoJZm9yIF8sIGJhZCA6PSByYW5nZSBbXXN0cmluZ3siIiwgIkludHJvIiwgImE6YiIsICJ3aXRoIHNwYWNlIiwgc3RyaW5ncy5SZXBlYXQoIngiLCA2NSl9IHsKCQl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImludmFsaWQgc2x1ZyIsIGZ1bmMoKSB7CgkJCWhvbWUuU2V0KGNyb3NzKGN1ciksIGJhZCwgIngiKQoJCX0sIGJhZCkKCX0KCWZvciBfLCByZXNlcnZlZCA6PSByYW5nZSBob21lLlJlc2VydmVkU2x1Z3NGb3JUZXN0KCkgewoJCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicmVzZXJ2ZWQgc2x1ZyIsIGZ1bmMoKSB7CgkJCWhvbWUuU2V0KGNyb3NzKGN1ciksIHJlc2VydmVkLCAieCIpCgkJfSwgcmVzZXJ2ZWQpCgl9Cglob21lLlNldChjcm9zcyhjdXIpLCAic3R5bGUuYWNjZW50IiwgIiNEOUE0NDEiKQoJdWFzc2VydC5FcXVhbCh0LCAiI0Q5QTQ0MSIsIGhvbWUuU3R5bGUoImFjY2VudCIsICIjMDAwMDAwIikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGhvbWUuUmV2aXNpb24oKSkKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRoZW1lcwoKZnVuYyBUZXN0VGhlbWVMaWZlY3ljbGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWhvbWUuUmVzZXRGb3JUZXN0KCkKCWhvbWUuU2VlZEZvclRlc3QoImxheW91dCIsICJwYWdlIDp3aWRnZXQ6IDpyZXY6IikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKHRoZW1lQSkpCglob21lLlJlZ2lzdGVyKGNyb3NzKGN1ciksIHN0dWJUaGVtZXsiQSJ9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSh0aGVtZUIpKQoJaG9tZS5SZWdpc3Rlcihjcm9zcyhjdXIpLCBzdHViVGhlbWV7IkIifSkKCXVhc3NlcnQuRXF1YWwodCwgIiIsIGhvbWUuTGl2ZVBhdGgoKSkKCXVhc3NlcnQuRXF1YWwodCwgMiwgbGVuKGhvbWUuUGVuZGluZ1BhdGhzKCkpKQoJdWFzc2VydC5FcXVhbCh0LCAicGFnZSA6d2lkZ2V0OiAxIiwgaG9tZS5SZW5kZXIoIiIpLCAibm90aGluZyBzZXJ2ZXMgYmVmb3JlIEFjY2VwdCIpCgoJdGVzdGluZy5TZXRSZWFsbShhZG1pbikKCWhvbWUuQWNjZXB0KGNyb3NzKGN1ciksIHRoZW1lQSkKCXVhc3NlcnQuRXF1YWwodCwgdGhlbWVBLCBob21lLkxpdmVQYXRoKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICJwYWdlIDxBPiAxIiwgaG9tZS5SZW5kZXIoIiIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaG9tZS5SZW5kZXIoInNsb3RzIiksICIjIFNsb3RzIiksICJ0aGVtZXMgZGVsZWdhdGUgb3RoZXIgcGF0aHMiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaG9tZS5SZW5kZXIoInN5c3RlbSIpLCAiWyIrdGhlbWVBKyJdIiksIGhvbWUuUmVuZGVyKCJzeXN0ZW0iKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGhvbWUuUmVuZGVyKCJzeXN0ZW0iKSwgInZhbHVlPVwiIit0aGVtZUIrIlwiIiksICJwZW5kaW5nIHRoZW1lcyBnZXQgYW4gQWNjZXB0IGZvcm0iKQoKCWhvbWUuQWNjZXB0KGNyb3NzKGN1ciksIHRoZW1lQikKCXVhc3NlcnQuRXF1YWwodCwgInBhZ2UgPEI+IDEiLCBob21lLlJlbmRlcigiIikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGxlbihob21lLkhpc3RvcnlQYXRocygpKSkKCXVhc3NlcnQuRXF1YWwodCwgdGhlbWVBLCBob21lLkhpc3RvcnlQYXRocygpWzBdKQoKCWhvbWUuUm9sbGJhY2soY3Jvc3MoY3VyKSkKCXVhc3NlcnQuRXF1YWwodCwgInBhZ2UgPEE+IDEiLCBob21lLlJlbmRlcigiIikpCgl1YXNzZXJ0LkVxdWFsKHQsIHRoZW1lQiwgaG9tZS5QZW5kaW5nUGF0aHMoKVswXSwgInRoZSBkaXNwbGFjZWQgdGhlbWUgcmV0dXJucyB0byBwZW5kaW5nIikKCgkvLyBUaGUgc2xvdHMgd2VyZSBuZXZlciBpbiB0aGUgdGhlbWUsIHNvIHN3aXRjaGluZyBuZXZlciB0b3VjaGVkIHRoZW0uCglob21lLlNldChjcm9zcyhjdXIpLCAibGF5b3V0IiwgIjp3aWRnZXQ6IG9ubHkiKQoJdWFzc2VydC5FcXVhbCh0LCAiPEE+IG9ubHkiLCBob21lLlJlbmRlcigiIikpCn0KCmZ1bmMgVGVzdEJyb2tlblRoZW1lTGVhdmVzT3BlcmF0b3JWaWV3cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaG9tZS5SZXNldEZvclRlc3QoKQoJaG9tZS5TZWVkRm9yVGVzdCgibGF5b3V0IiwgImhlbGxvIDpyZXY6IikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0odGhlbWVBKSkKCWhvbWUuUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgc3R1YlRoZW1leyJBIn0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKHRoZW1lQikpCglob21lLlJlZ2lzdGVyKGNyb3NzKGN1ciksIGJyb2tlblRoZW1le30pCgl0ZXN0aW5nLlNldFJlYWxtKGFkbWluKQoJaG9tZS5BY2NlcHQoY3Jvc3MoY3VyKSwgdGhlbWVBKQoJdWFzc2VydC5FcXVhbCh0LCAiaGVsbG8gMSIsIGhvbWUuUmVuZGVyKCIiKSkKCWhvbWUuQWNjZXB0KGNyb3NzKGN1ciksIHRoZW1lQikKCgkvLyBUaGUgcGFnZSBpcyBkb3duOiBvbiBjaGFpbiB0aGlzIGlzIGEgVk0gYWJvcnQsIG5vdCBzb21ldGhpbmcgdGhpcwoJLy8gcmVhbG0gY2FuIGNhdGNoLgoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJrYWJvb20iLCBmdW5jKCkgeyBob21lLlJlbmRlcigiIikgfSkKCgkvLyBUaGUgdmlld3MgdGhlIHJvbGxiYWNrIGlzIGRvbmUgZnJvbSBuZXZlciB0b3VjaCB0aGUgdGhlbWUuCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhob21lLlJlbmRlcigic3lzdGVtIiksICJbIit0aGVtZUErIl0iKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGhvbWUuUmVuZGVyKCJzbG90cyIpLCAiIyBTbG90cyIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaG9tZS5SZW5kZXIoImVkaXQiKSwgIjxnbm8tZm9ybSBleGVjPVwiU2V0XCI+IikpCgl1YXNzZXJ0LkVxdWFsKHQsIGhvbWUuTWFuaWZlc3QoKSwgaG9tZS5SZW5kZXIoIm1hbmlmZXN0IikpCgoJaG9tZS5Sb2xsYmFjayhjcm9zcyhjdXIpKQoJdWFzc2VydC5FcXVhbCh0LCB0aGVtZUEsIGhvbWUuTGl2ZVBhdGgoKSkKCXVhc3NlcnQuRXF1YWwodCwgImhlbGxvIDEiLCBob21lLlJlbmRlcigiIikpCn0KCmZ1bmMgVGVzdFRoZW1lT3duc0V2ZXJ5T3RoZXJQYXRoKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cglob21lLlJlc2V0Rm9yVGVzdCgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKHRoZW1lQSkpCglob21lLlJlZ2lzdGVyKGNyb3NzKGN1ciksIHN0dWJUaGVtZXsiQSJ9KQoJdGVzdGluZy5TZXRSZWFsbShhZG1pbikKCWhvbWUuQWNjZXB0KGNyb3NzKGN1ciksIHRoZW1lQSkKCgl1YXNzZXJ0LkVxdWFsKHQsICJjdXN0b20gYnkgQSIsIGhvbWUuUmVuZGVyKCJjdXN0b20iKSwgImEgcGF0aCB0aGUgcmVhbG0gZG9lcyBub3QgcmVzZXJ2ZSByZWFjaGVzIHRoZSB0aGVtZSIpCgl1YXNzZXJ0LkVxdWFsKHQsICJjdXN0b20gYnkgQSIsIGhvbWUuUmVuZGVyKCJjdXN0b20/eD0xIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhob21lLlJlbmRlcigic2xvdHM/eD0xIiksICIjIFNsb3RzIiksICJyZXNlcnZlZCBwYXRocyBhcmUgbWF0Y2hlZCB3aXRob3V0IHRoZSBxdWVyeSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhob21lLlJlbmRlcigic2xvdHMvbm9wZSIpLCAiIyBOb3QgZm91bmQiKSkKfQoKZnVuYyBUZXN0UmVnaXN0ZXJSZWZ1c2FscyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaG9tZS5SZXNldEZvclRlc3QoKQoKCS8vIEEgdXNlciBjYW5ub3Qgbm9taW5hdGUgYSB0aGVtZTsgb25seSBhIGRlcGxveWVkIHJlYWxtIGNhbi4KCXRlc3RpbmcuU2V0UmVhbG0oYWRtaW4pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm9ubHkgYSBkZXBsb3llZCByZWFsbSIsIGZ1bmMoKSB7CgkJaG9tZS5SZWdpc3Rlcihjcm9zcyhjdXIpLCBzdHViVGhlbWV7InVzZXIifSkKCX0pCgoJLy8gQSByZWFsbSBvdXRzaWRlIHRoaXMgcGF0aCBjYW5ub3QgZWl0aGVyLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9tYWxsb3J5L3RoZW1lIikpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vdCBuZXN0ZWQiLCBmdW5jKCkgewoJCWhvbWUuUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgc3R1YlRoZW1leyJmb3JlaWduIn0pCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAwLCBsZW4oaG9tZS5QZW5kaW5nUGF0aHMoKSkpCn0KCmZ1bmMgVGVzdEFjY2VwdElzQXV0aG9yaXR5T25seShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaG9tZS5SZXNldEZvclRlc3QoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSh0aGVtZUEpKQoJaG9tZS5SZWdpc3Rlcihjcm9zcyhjdXIpLCBzdHViVGhlbWV7IkEifSkKCgl0ZXN0aW5nLlNldFJlYWxtKG1hbGxvcnkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vdCB0aGUgYXV0aG9yaXR5IiwgZnVuYygpIHsKCQlob21lLkFjY2VwdChjcm9zcyhjdXIpLCB0aGVtZUEpCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgaG9tZS5MaXZlUGF0aCgpKQp9CgpmdW5jIFRlc3RGcmVlemVLZWVwc0VkaXRpbmcoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWhvbWUuUmVzZXRGb3JUZXN0KCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0odGhlbWVBKSkKCWhvbWUuUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgc3R1YlRoZW1leyJBIn0pCgl0ZXN0aW5nLlNldFJlYWxtKGFkbWluKQoJaG9tZS5BY2NlcHQoY3Jvc3MoY3VyKSwgdGhlbWVBKQoJaG9tZS5GcmVlemUoY3Jvc3MoY3VyKSkKCXVhc3NlcnQuVHJ1ZSh0LCBob21lLkZyb3plbigpKQoKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiZnJvemVuIiwgZnVuYygpIHsKCQlob21lLlJvbGxiYWNrKGNyb3NzKGN1cikpCgl9KQoJaG9tZS5TZXQoY3Jvc3MoY3VyKSwgImxheW91dCIsICJzdGlsbCBlZGl0YWJsZSA6d2lkZ2V0OiIpCgl1YXNzZXJ0LkVxdWFsKHQsICJzdGlsbCBlZGl0YWJsZSA8QT4iLCBob21lLlJlbmRlcigiIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhob21lLlJlbmRlcigic3lzdGVtIiksICIqKmZyb3plbioqIikpCn0KGuJpCgpyZW5kZXIuZ25vEtNpcGFja2FnZSBob21lCgppbXBvcnQgKAoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiY2hhaW4vcnVudGltZSIKKQoKLy8gUmVuZGVyIGlzIHdoYXQgZ25vd2ViIGNhbGxzLgovLwovLyBUaGUgb3BlcmF0b3Igdmlld3MgKHN5c3RlbSwgc2xvdHMsIGVkaXQsIG1hbmlmZXN0KSBhcmUgYWx3YXlzIHNlcnZlZCBoZXJlLAovLyBuZXZlciB0aHJvdWdoIHRoZSB0aGVtZTogYSBwYW5pYyBpbnNpZGUgYSBmb3JlaWduIHJlYWxtJ3MgY29kZSBhYm9ydHMgdGhlCi8vIHdob2xlIGNhbGwgYW5kIGNhbm5vdCBiZSByZWNvdmVyZWQgZnJvbSB0aGlzIHNpZGUsIHNvIGEgdGhlbWUgdGhhdCBwYW5pY3MKLy8gdGFrZXMgdGhlIHBhZ2UgZG93biB1bnRpbCBpdCBpcyByb2xsZWQgYmFjay4gVGhlc2Ugdmlld3MgYXJlIHdoYXQgdGhlCi8vIHJvbGxiYWNrIGlzIGRvbmUgZnJvbSwgYW5kIHRoZSByb3V0aW5nIGtlZXBzIHRoZW0gb3V0IG9mIHRoZSB0aGVtZSdzIHJlYWNoLgovLyBFdmVyeSBvdGhlciBwYXRoLCB0aGUgcGFnZSBpdHNlbGYgaW5jbHVkZWQsIGdvZXMgdG8gdGhlIGxpdmUgdGhlbWUsIG9yIHRvCi8vIHRoZSBidWlsdC1pbiByZW5kZXJlciB3aGVuIG5vbmUgaXMgYWNjZXB0ZWQuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgaXNPcGVyYXRvclBhdGgocGF0aCkgewoJCXJldHVybiBGYWxsYmFjayhwYXRoKQoJfQoJaWYgdCwgb2sgOj0gbGl2ZVRoZW1lKCk7IG9rIHsKCQlyZXR1cm4gdC5SZW5kZXIocGF0aCkKCX0KCXJldHVybiBGYWxsYmFjayhwYXRoKQp9CgovLyBvcGVyYXRvclBhdGhzIGFyZSB0aGUgcmVuZGVyIHBhdGhzIHRoaXMgcmVhbG0ga2VlcHMgZm9yIGl0c2VsZi4KdmFyIG9wZXJhdG9yUGF0aHMgPSBbXXN0cmluZ3sic3lzdGVtIiwgInNsb3RzIiwgImVkaXQiLCAibWFuaWZlc3QifQoKZnVuYyBpc09wZXJhdG9yUGF0aChwYXRoIHN0cmluZykgYm9vbCB7CglwYXRoID0gY2xlYW5QYXRoKHBhdGgpCglmb3IgXywgcCA6PSByYW5nZSBvcGVyYXRvclBhdGhzIHsKCQlpZiBwYXRoID09IHAgfHwgc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgcCsiLyIpIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gY2xlYW5QYXRoIGRyb3BzIGEgcXVlcnkgc3RyaW5nIGZyb20gYSByZW5kZXIgcGF0aC4KZnVuYyBjbGVhblBhdGgocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBpIDo9IHN0cmluZ3MuSW5kZXgocGF0aCwgIj8iKTsgaSA+PSAwIHsKCQlyZXR1cm4gcGF0aFs6aV0KCX0KCXJldHVybiBwYXRoCn0KCi8vIEZhbGxiYWNrIGlzIHRoZSBidWlsdC1pbiByZW5kZXJlci4gUmVuZGVyIHJvdXRlcyB0aGUgb3BlcmF0b3Igdmlld3MgaGVyZQovLyBkaXJlY3RseSwgYW5kIHRoZW1lcyBkZWxlZ2F0ZSB0byBpdCBmb3IgZXZlcnkgb3RoZXIgcGF0aCB0aGV5IGRvIG5vdCBkcmF3Ci8vIHRoZW1zZWx2ZXMsIHNvIHRoZXNlIHZpZXdzIGV4aXN0IHVuZGVyIGFueSB0aGVtZToKLy8KLy8JIiIgICAgICAgICAgICAgdGhlIGFzc2VtYmxlZCBwYWdlOiB0aGUgbGF5b3V0IHNsb3QgZmlsbGVkIGZyb20gdGhlIHNsb3RzCi8vCSJzbG90cyIgICAgICAgIHRoZSBzbG90IGluZGV4OiBuYW1lLCBzaXplLCByZXZpc2lvbiwgaGVpZ2h0IG9mIGxhc3Qgd3JpdGUKLy8JInNsb3RzLzxzbHVnPiIgb25lIHNsb3QncyByYXcgbWFya2Rvd24sIGZlbmNlZAovLwkiZWRpdCIgICAgICAgICBmb3JtcyB0aGF0IHdyaXRlIHNsb3RzICh0aGV5IGJ1aWxkIHRoZSBnbm9rZXkgY29tbWFuZCkKLy8JImVkaXQvPHNsdWc+IiAgdGhlIHNhbWUsIHByZWZpbGxlZCB3aXRoIG9uZSBzbG90Ci8vCSJzeXN0ZW0iICAgICAgIHdobyBtYXkgd3JpdGUsIHdoaWNoIHRoZW1lIGlzIGxpdmUsIHBlbmRpbmcsIGhpc3RvcnkKLy8JIm1hbmlmZXN0IiAgICAgTWFuaWZlc3QoKSBhcyBwbGFpbiB0ZXh0LCBmb3Igc2NyaXB0cwpmdW5jIEZhbGxiYWNrKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcGF0aCA9IGNsZWFuUGF0aChwYXRoKQoJc3dpdGNoIHsKCWNhc2UgcGF0aCA9PSAiIjoKCQlyZXR1cm4gcmVuZGVyUGFnZSgpCgljYXNlIHBhdGggPT0gInNsb3RzIjoKCQlyZXR1cm4gcmVuZGVySW5kZXgoKQoJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAic2xvdHMvIik6CgkJcmV0dXJuIHJlbmRlclNsb3Qoc3RyaW5ncy5UcmltUHJlZml4KHBhdGgsICJzbG90cy8iKSkKCWNhc2UgcGF0aCA9PSAiZWRpdCI6CgkJcmV0dXJuIHJlbmRlckVkaXQoIiIpCgljYXNlIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJlZGl0LyIpOgoJCXJldHVybiByZW5kZXJFZGl0KHN0cmluZ3MuVHJpbVByZWZpeChwYXRoLCAiZWRpdC8iKSkKCWNhc2UgcGF0aCA9PSAic3lzdGVtIjoKCQlyZXR1cm4gcmVuZGVyU3lzdGVtKCkKCWNhc2UgcGF0aCA9PSAibWFuaWZlc3QiOgoJCXJldHVybiBNYW5pZmVzdCgpCgl9CglyZXR1cm4gIiMgTm90IGZvdW5kXG5cbk5vIHN1Y2ggcGF0aDogIiArIHN0cmNvbnYuUXVvdGUocGF0aCkgKwoJCSJcblxuVHJ5IFt0aGUgc2xvdCBpbmRleF0oIiArIExpbmsoInNsb3RzIikgKyAiKS5cbiIKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFBsYWNlaG9sZGVyIGZpbGxpbmcKCi8vIEZpbGxlciBzdWJzdGl0dXRlcyA6bmFtZTogcGxhY2Vob2xkZXJzIGluIGEgbGF5b3V0LiBJdCBpcyBsYXp5OiBhIGNhbGxiYWNrCi8vIHJ1bnMgb25seSB3aGVuIGl0cyBwbGFjZWhvbGRlciBvY2N1cnMgaW4gdGhlIGxheW91dCwgc28gYW4gdW51c2VkIHNsb3QgaXMKLy8gbmV2ZXIgZXZlbiByZWFkLiBTdWJzdGl0dXRpb24gaXMgc2luZ2xlLXBhc3MgYW5kIG5vbi1yZWN1cnNpdmUsIHNvIGEKLy8gcGxhY2Vob2xkZXIgaW5zaWRlIGEgc2xvdCBib2R5IGlzIGxlZnQgYWxvbmUgYW5kIG5vIHNsb3QgY2FuIGV4cGFuZCBpbnRvCi8vIGFub3RoZXIuIE5hbWVzIG5ldmVyIGNvbnRhaW4gJzonLCBzbyBubyBwbGFjZWhvbGRlciBpcyBhIHByZWZpeCBvZiBhbm90aGVyCi8vIGFuZCB0aGUgcmVzdWx0IGRvZXMgbm90IGRlcGVuZCBvbiByZWdpc3RyYXRpb24gb3JkZXIuIEEgcGxhY2Vob2xkZXIgdGhhdAovLyBub3RoaW5nIGNsYWltcyBzdXJ2aXZlcyBpbnRvIHRoZSBvdXRwdXQgdmVyYmF0aW06IGEgbWlzc2luZyBzZWN0aW9uIHNob3VsZAovLyBiZSB2aXNpYmxlLCBub3Qgc2lsZW50bHkgYmxhbmsuCnR5cGUgRmlsbGVyIHN0cnVjdCB7CgluYW1lcyBbXXN0cmluZwoJZm5zICAgbWFwW3N0cmluZ11mdW5jKCkgc3RyaW5nCn0KCi8vIE5ld0ZpbGxlciByZXR1cm5zIGEgRmlsbGVyIHdpdGggZXZlcnkgc2xvdCBhbmQgZXZlcnkgY29tcHV0ZWQgcGxhY2Vob2xkZXIKLy8gcmVnaXN0ZXJlZC4gQSB0aGVtZSBhZGRzIGl0cyBvd24gd2lkZ2V0cyB3aXRoIEFkZCBiZWZvcmUgY2FsbGluZyBGaWxsLgpmdW5jIE5ld0ZpbGxlcigpICpGaWxsZXIgewoJZiA6PSAmRmlsbGVye2ZuczogbWFwW3N0cmluZ11mdW5jKCkgc3RyaW5ne319CglzbG90cy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCXMgOj0gdmFsdWUuKCpTbG90KSAvLyByZS1ib3VuZCBwZXIgaXRlcmF0aW9uLCBzbyBlYWNoIGNsb3N1cmUgc2VlcyBpdHMgb3duCgkJZi5BZGQoa2V5LCBmdW5jKCkgc3RyaW5nIHsgcmV0dXJuIHMuQm9keSB9KQoJCXJldHVybiBmYWxzZQoJfSkKCWYuQWRkKCJyZWFsbSIsIGZ1bmMoKSBzdHJpbmcgeyByZXR1cm4gc2VsZlBhdGggfSkKCWYuQWRkKCJvd25lciIsIEF1dGhvcml0eSkKCWYuQWRkKCJjaGFpbmlkIiwgcnVudGltZS5DaGFpbklEKQoJZi5BZGQoImhlaWdodCIsIGZ1bmMoKSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQocnVudGltZS5DaGFpbkhlaWdodCgpLCAxMCkgfSkKCWYuQWRkKCJyZXYiLCBmdW5jKCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuSXRvYShyZXYpIH0pCglmLkFkZCgic2xvdHMiLCBzbG90TGlua3MpCglmLkFkZCgidGhlbWUiLCBmdW5jKCkgc3RyaW5nIHsKCQlpZiBwIDo9IExpdmVQYXRoKCk7IHAgIT0gIiIgewoJCQlyZXR1cm4gcAoJCX0KCQlyZXR1cm4gImJ1aWx0LWluIgoJfSkKCWYuQWRkKCJ1cGRhdGVkIiwgdXBkYXRlZCkKCXJldHVybiBmCn0KCi8vIHVwZGF0ZWQgaXMgdGhlIDp1cGRhdGVkOiBwbGFjZWhvbGRlcjogd2hlbiB0aGUgc2xvdHMgbGFzdCBjaGFuZ2VkLgpmdW5jIHVwZGF0ZWQoKSBzdHJpbmcgewoJaWYgbGFzdEhlaWdodCA9PSAwIHsKCQlyZXR1cm4gIm5ldmVyIgoJfQoJcmV0dXJuICJibG9jayAiICsgc3RyY29udi5Gb3JtYXRJbnQobGFzdEhlaWdodCwgMTApICsgIiAocmV2ICIgKyBzdHJjb252Lkl0b2EocmV2KSArICIpIgp9CgovLyBBZGQgcmVnaXN0ZXJzIHRoZSBjYWxsYmFjayBmb3IgOm5hbWU6LiBBIGxhdGVyIEFkZCBmb3IgdGhlIHNhbWUgbmFtZSB3aW5zLAovLyB3aGljaCBpcyBob3cgYSB0aGVtZSB3aWRnZXQgb3ZlcnJpZGVzIGEgc2xvdCBvZiB0aGUgc2FtZSBuYW1lLgpmdW5jIChmICpGaWxsZXIpIEFkZChuYW1lIHN0cmluZywgZm4gZnVuYygpIHN0cmluZykgewoJaWYgXywgZHVwIDo9IGYuZm5zW25hbWVdOyAhZHVwIHsKCQlmLm5hbWVzID0gYXBwZW5kKGYubmFtZXMsIG5hbWUpCgl9CglmLmZuc1tuYW1lXSA9IGZuCn0KCi8vIEZpbGwgcmV0dXJucyBsYXlvdXQgd2l0aCBldmVyeSBwcmVzZW50IHBsYWNlaG9sZGVyIHJlcGxhY2VkLgpmdW5jIChmICpGaWxsZXIpIEZpbGwobGF5b3V0IHN0cmluZykgc3RyaW5nIHsKCXBhaXJzIDo9IFtdc3RyaW5ne30KCWZvciBfLCBuYW1lIDo9IHJhbmdlIGYubmFtZXMgewoJCXBoIDo9ICI6IiArIG5hbWUgKyAiOiIKCQlpZiBzdHJpbmdzLkNvbnRhaW5zKGxheW91dCwgcGgpIHsKCQkJcGFpcnMgPSBhcHBlbmQocGFpcnMsIHBoLCBmLmZuc1tuYW1lXSgpKQoJCX0KCX0KCWlmIGxlbihwYWlycykgPT0gMCB7CgkJcmV0dXJuIGxheW91dAoJfQoJcmV0dXJuIHN0cmluZ3MuTmV3UmVwbGFjZXIocGFpcnMuLi4pLlJlcGxhY2UobGF5b3V0KQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVmlld3MKCi8vIGRlZmF1bHRMYXlvdXQgcmVuZGVycyBiZWZvcmUgYSBsYXlvdXQgc2xvdCBleGlzdHMgYW5kIG5vIHRoZW1lIGlzIGxpdmUsCi8vIGkuZS4gcmlnaHQgYWZ0ZXIgdGhlIHZlcnkgZmlyc3QgZGVwbG95LiBJdCB1c2VzIG9ubHkgY29tcHV0ZWQgcGxhY2Vob2xkZXJzLAovLyBzbyBpdCBuZXZlciBzaG93cyBhbiB1bnJlc29sdmVkIDpzbHVnOiBvZiBpdHMgb3duLgpmdW5jIGRlZmF1bHRMYXlvdXQoKSBzdHJpbmcgewoJcmV0dXJuICIjICIgKyBzZWxmUGF0aCArICJcblxuIiArCgkJIk5vIHRoZW1lIGlzIGxpdmUgYW5kIG5vIGxheW91dCBzbG90IGlzIHNldCwgc28gdGhpcyBpcyB0aGUgYnVpbHQtaW4gcGFnZS4gIiArCgkJIkNvbnRlbnQgYXJyaXZlcyB3aXRoIGBTZXRgLCBvbmUgc2xvdCBwZXIgY2FsbCwgYW5kIGEgdGhlbWUgZGVwbG95ZWQgdW5kZXIgIiArCgkJImAiICsgc2VsZlBhdGggKyAiL3RoZW1lL2AgZ29lcyBsaXZlIHdpdGggYEFjY2VwdGAuICIgKwoJCSJTZWUgW3N5c3RlbV0oIiArIExpbmsoInN5c3RlbSIpICsgIikgYW5kIFtlZGl0XSgiICsgTGluaygiZWRpdCIpICsgIikuXG5cbiIgKwoJCSIjIyBTbG90c1xuXG46c2xvdHM6XG5cbi0tLVxuXG4iICsKCQkicmV2IDpyZXY6IMK3IGJsb2NrIDpoZWlnaHQ6IMK3IDpjaGFpbmlkOiDCtyB0aGVtZSA6dGhlbWU6IMK3ICIgKwoJCSJbZWRpdF0oIiArIExpbmsoImVkaXQiKSArICIpIMK3IFtzeXN0ZW1dKCIgKyBMaW5rKCJzeXN0ZW0iKSArICIpXG4iCn0KCmZ1bmMgcmVuZGVyUGFnZSgpIHN0cmluZyB7CglsYXlvdXQgOj0gTGF5b3V0KCkKCWlmIGxheW91dCA9PSAiIiB7CgkJbGF5b3V0ID0gZGVmYXVsdExheW91dCgpCgl9CglyZXR1cm4gTmV3RmlsbGVyKCkuRmlsbChsYXlvdXQpCn0KCi8vIHNsb3RMaW5rcyBpcyB0aGUgOnNsb3RzOiBwbGFjZWhvbGRlcjogYSBidWxsZXQgbGlzdCBvZiBldmVyeSBzbG90LCBsaW5raW5nCi8vIHRvIGl0cyByYXcgdmlldy4KZnVuYyBzbG90TGlua3MoKSBzdHJpbmcgewoJaWYgc2xvdHMuU2l6ZSgpID09IDAgewoJCXJldHVybiAiX25vIHNsb3RzIHlldF8iCgl9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCXNsb3RzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIF8gYW55KSBib29sIHsKCQliLldyaXRlU3RyaW5nKCItIFsiICsga2V5ICsgIl0oIiArIExpbmsoInNsb3RzLyIra2V5KSArICIpXG4iKQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBzdHJpbmdzLlRyaW1TdWZmaXgoYi5TdHJpbmcoKSwgIlxuIikKfQoKZnVuYyByZW5kZXJJbmRleCgpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgU2xvdHNcblxuIikKCWIuV3JpdGVTdHJpbmcoInJldiAiICsgc3RyY29udi5JdG9hKHJldikgKyAiIMK3ICIgKyBzdHJjb252Lkl0b2Eoc2xvdHMuU2l6ZSgpKSArICIgc2xvdChzKSDCtyAiICsKCQkiW2VkaXRdKCIgKyBMaW5rKCJlZGl0IikgKyAiKSDCtyBbc3lzdGVtXSgiICsgTGluaygic3lzdGVtIikgKyAiKVxuXG4iKQoJaWYgc2xvdHMuU2l6ZSgpID09IDAgewoJCWIuV3JpdGVTdHJpbmcoIl9ubyBzbG90cyB5ZXRfXG4iKQoJCXJldHVybiBiLlN0cmluZygpCgl9CgliLldyaXRlU3RyaW5nKCJ8IHNsb3QgfCBieXRlcyB8IHJldiB8IGhlaWdodCB8IHxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IC0tLSB8IC0tLTogfCAtLS06IHwgLS0tOiB8IC0tLSB8XG4iKQoJc2xvdHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlzIDo9IHZhbHVlLigqU2xvdCkKCQliLldyaXRlU3RyaW5nKCJ8IFsiICsga2V5ICsgIl0oIiArIExpbmsoInNsb3RzLyIra2V5KSArICIpIHwgIiArCgkJCXN0cmNvbnYuSXRvYShsZW4ocy5Cb2R5KSkgKyAiIHwgIiArCgkJCXN0cmNvbnYuSXRvYShzLlJldikgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KHMuSGVpZ2h0LCAxMCkgKyAiIHwgIiArCgkJCSJbZWRpdF0oIiArIExpbmsoImVkaXQvIitrZXkpICsgIikgfFxuIikKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlclNsb3Qoc2x1ZyBzdHJpbmcpIHN0cmluZyB7CglzLCBvayA6PSBMb29rdXAoc2x1ZykKCWlmICFvayB7CgkJcmV0dXJuICIjIE5vdCBmb3VuZFxuXG5ObyBzbG90IG5hbWVkICIgKyBzdHJjb252LlF1b3RlKHNsdWcpICsKCQkJIi5cblxuVHJ5IFt0aGUgc2xvdCBpbmRleF0oIiArIExpbmsoInNsb3RzIikgKyAiKS5cbiIKCX0KCWYgOj0gZmVuY2Uocy5Cb2R5KQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjICIgKyBzbHVnICsgIlxuXG4iKQoJYi5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EobGVuKHMuQm9keSkpICsgIiBieXRlcyDCtyByZXYgIiArIHN0cmNvbnYuSXRvYShzLlJldikgKwoJCSIgwrcgd3JpdHRlbiBhdCBibG9jayAiICsgc3RyY29udi5Gb3JtYXRJbnQocy5IZWlnaHQsIDEwKSArCgkJIiDCtyBbZWRpdF0oIiArIExpbmsoImVkaXQvIitzbHVnKSArICIpXG5cbiIpCgliLldyaXRlU3RyaW5nKGYgKyAiXG4iICsgcy5Cb2R5KQoJaWYgIXN0cmluZ3MuSGFzU3VmZml4KHMuQm9keSwgIlxuIikgewoJCWIuV3JpdGVTdHJpbmcoIlxuIikKCX0KCWIuV3JpdGVTdHJpbmcoZiArICJcbiIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBmZW5jZSByZXR1cm5zIGEgY29kZSBmZW5jZSBsb25nZXIgdGhhbiBhbnkgYmFja3RpY2sgcnVuIGluIGJvZHksIHNvIHRoZQovLyBib2R5IGNhbiBuZXZlciBjbG9zZSBpdCBlYXJseS4KZnVuYyBmZW5jZShib2R5IHN0cmluZykgc3RyaW5nIHsKCWxvbmdlc3QsIHJ1biA6PSAwLCAwCglmb3IgaSA6PSAwOyBpIDwgbGVuKGJvZHkpOyBpKysgewoJCWlmIGJvZHlbaV0gIT0gJ2AnIHsKCQkJcnVuID0gMAoJCQljb250aW51ZQoJCX0KCQlydW4rKwoJCWlmIHJ1biA+IGxvbmdlc3QgewoJCQlsb25nZXN0ID0gcnVuCgkJfQoJfQoJbiA6PSAzCglpZiBsb25nZXN0ID49IDMgewoJCW4gPSBsb25nZXN0ICsgMQoJfQoJcmV0dXJuIHN0cmluZ3MuUmVwZWF0KCJgIiwgbikKfQoKLy8gcmVuZGVyRWRpdCBpcyB0aGUgaW4tYnJvd3NlciBlZGl0b3I6IGdub3dlYiBmb3JtcyB0aGF0IGJ1aWxkIHRoZSBnbm9rZXkKLy8gY29tbWFuZCBmb3IgU2V0IGFuZCBEZWxldGUuIEFueW9uZSBjYW4gc2VlIHRoZW07IG9ubHkgdGhlIGF1dGhvcml0eSdzCi8vIHNpZ25hdHVyZSBtYWtlcyB0aGUgcmVzdWx0aW5nIHRyYW5zYWN0aW9uIHN1Y2NlZWQuCmZ1bmMgcmVuZGVyRWRpdChzbHVnIHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBFZGl0XG5cbiIpCgliLldyaXRlU3RyaW5nKCJXcml0ZXMgYXJlIHJlc3RyaWN0ZWQgdG8gYCIgKyBBdXRob3JpdHkoKSArICJgLiBFYWNoIGZvcm0gYXNzZW1ibGVzIHRoZSAiICsKCQkiYGdub2tleWAgY29tbWFuZDsgc2lnbiBpdCB3aXRoIHRoYXQga2V5LiBTbG90cyBhbmQgc3R5bGUga25vYnMgYXJlIHRoZSBzYW1lIHRoaW5nOiAiICsKCQkiYHN0eWxlLmFjY2VudGAgaXMgYSBzbG90IHRvby4gW0luZGV4XSgiICsgTGluaygic2xvdHMiKSArICIpIMK3IFtzeXN0ZW1dKCIgKyBMaW5rKCJzeXN0ZW0iKSArICIpXG5cbiIpCgoJaWYgc2x1ZyAhPSAiIiB7CgkJcywgb2sgOj0gTG9va3VwKHNsdWcpCgkJaWYgIW9rIHsKCQkJYi5Xcml0ZVN0cmluZygiPiBbIVdBUk5JTkddXG4+IE5vIHNsb3QgbmFtZWQgIiArIHN0cmNvbnYuUXVvdGUoc2x1ZykgKyAiIHlldC4gU2F2aW5nIGNyZWF0ZXMgaXQuXG5cbiIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoIiMjICIgKyBzbHVnICsgIlxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIjxnbm8tZm9ybSBleGVjPVwiU2V0XCI+XG4iKQoJCWIuV3JpdGVTdHJpbmcoIiAgPGduby1pbnB1dCBuYW1lPVwic2x1Z1wiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIiICsgYXR0cihzbHVnKSArICJcIiBwbGFjZWhvbGRlcj1cInNsb3QgbmFtZVwiIC8+XG4iKQoJCWIuV3JpdGVTdHJpbmcoIiAgPGduby10ZXh0YXJlYSBuYW1lPVwiYm9keVwiIHJvd3M9XCIxMFwiIHZhbHVlPVwiIiArIGF0dHIocy5Cb2R5KSArICJcIiBwbGFjZWhvbGRlcj1cIm1hcmtkb3duXCIgLz5cbiIpCgkJYi5Xcml0ZVN0cmluZygiPC9nbm8tZm9ybT5cblxuIikKCQlpZiBvayB7CgkJCWIuV3JpdGVTdHJpbmcoIltSYXcgdmlld10oIiArIExpbmsoInNsb3RzLyIrc2x1ZykgKyAiKSDCtyAiICsKCQkJCSJhIGJvZHkgdGhhdCBpdHNlbGYgY29udGFpbnMgdGhlIHR3byBjaGFyYWN0ZXJzIGBcXG5gIG9yIGBcXHRgIGlzIHVuZm9sZGVkIGhlcmU7ICIgKwoJCQkJInVzZSBgbWFrZSBwdXNoYCBmb3IgdGhvc2UuXG5cbiIpCgkJfQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKCIjIyBOZXcgb3IgcmVwbGFjZVxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIjxnbm8tZm9ybSBleGVjPVwiU2V0XCI+XG4iKQoJCWIuV3JpdGVTdHJpbmcoIiAgPGduby1pbnB1dCBuYW1lPVwic2x1Z1wiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJzbG90IG5hbWU6IFthLXowLTkuXy1dXCIgLz5cbiIpCgkJYi5Xcml0ZVN0cmluZygiICA8Z25vLXRleHRhcmVhIG5hbWU9XCJib2R5XCIgcm93cz1cIjEwXCIgcGxhY2Vob2xkZXI9XCJtYXJrZG93blwiIC8+XG4iKQoJCWIuV3JpdGVTdHJpbmcoIjwvZ25vLWZvcm0+XG5cbiIpCgl9CgoJYi5Xcml0ZVN0cmluZygiIyMgRGVsZXRlXG5cbiIpCgliLldyaXRlU3RyaW5nKCI8Z25vLWZvcm0gZXhlYz1cIkRlbGV0ZVwiPlxuIikKCWIuV3JpdGVTdHJpbmcoIiAgPGduby1pbnB1dCBuYW1lPVwic2x1Z1wiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJzbG90IG5hbWVcIiAvPlxuIikKCWIuV3JpdGVTdHJpbmcoIjwvZ25vLWZvcm0+XG5cbiIpCgoJYi5Xcml0ZVN0cmluZygiIyMgU2xvdHNcblxuIikKCWlmIHNsb3RzLlNpemUoKSA9PSAwIHsKCQliLldyaXRlU3RyaW5nKCJfbm8gc2xvdHMgeWV0X1xuIikKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJc2xvdHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgXyBhbnkpIGJvb2wgewoJCWIuV3JpdGVTdHJpbmcoIi0gIiArIGtleSArICIgwrcgW3ZpZXddKCIgKyBMaW5rKCJzbG90cy8iK2tleSkgKyAiKSDCtyBbZWRpdF0oIiArIExpbmsoImVkaXQvIitrZXkpICsgIilcbiIpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gYXR0ciBlc2NhcGVzIHMgZm9yIGEgZG91YmxlLXF1b3RlZCBhdHRyaWJ1dGUgb2YgYSBnbm93ZWIgZm9ybSB0YWcsIHdoaWNoCi8vIG11c3Qgc2l0IG9uIG9uZSBsaW5lOiBuZXdsaW5lcyBhbmQgdGFicyBiZWNvbWUgdGhlIFxuIGFuZCBcdCBzZXF1ZW5jZXMgdGhlCi8vIHRleHRhcmVhIHVuZm9sZHMuCmZ1bmMgYXR0cihzIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBzdHJpbmdzLk5ld1JlcGxhY2VyKAoJCSImIiwgIiZhbXA7IiwKCQkiXCIiLCAiJnF1b3Q7IiwKCQkiPCIsICImbHQ7IiwKCQkiPiIsICImZ3Q7IiwKCQkiXHIiLCAiIiwKCQkiXG4iLCAiXFxuIiwKCQkiXHQiLCAiXFx0IiwKCSkuUmVwbGFjZShzKQp9CgovLyByZW5kZXJTeXN0ZW0gc2hvd3MgdGhlIHVwZ3JhZGUgd2lyaW5nIGFuZCBvZmZlcnMgdGhlIEFjY2VwdCBmb3JtLgpmdW5jIHJlbmRlclN5c3RlbSgpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgU3lzdGVtXG5cbiIpCgliLldyaXRlU3RyaW5nKCJ8IHwgfFxufCAtLS0gfCAtLS0gfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgcmVhbG0gfCBgIiArIHNlbGZQYXRoICsgImAgfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgYXV0aG9yaXR5IHwgYCIgKyBBdXRob3JpdHkoKSArICJgIHxcbiIpCglpZiBwIDo9IExpdmVQYXRoKCk7IHAgIT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoInwgdGhlbWUgfCBbIiArIHAgKyAiXSgiICsgc291cmNlTGluayhwKSArICIpIHxcbiIpCgl9IGVsc2UgewoJCWIuV3JpdGVTdHJpbmcoInwgdGhlbWUgfCBidWlsdC1pbiBmYWxsYmFjayAobm90aGluZyBhY2NlcHRlZCB5ZXQpIHxcbiIpCgl9CgliLldyaXRlU3RyaW5nKCJ8IHJldmlzaW9uIHwgIiArIHN0cmNvbnYuSXRvYShyZXYpICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBsYXN0IHdyaXRlIHwgIiArIHVwZGF0ZWQoKSArICIgfFxuIikKCWlmIEZyb3plbigpIHsKCQliLldyaXRlU3RyaW5nKCJ8IHVwZ3JhZGVzIHwgKipmcm96ZW4qKiB8XG4iKQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKCJ8IHVwZ3JhZGVzIHwgb3BlbiB8XG4iKQoJfQoJYi5Xcml0ZVN0cmluZygiXG4iKQoKCXBlbmRpbmcgOj0gUGVuZGluZ1BhdGhzKCkKCWlmIGxlbihwZW5kaW5nKSA+IDAgewoJCWIuV3JpdGVTdHJpbmcoIiMjIEF3YWl0aW5nIGFjY2VwdGFuY2VcblxuIikKCQliLldyaXRlU3RyaW5nKCJBIHRoZW1lIHJlZ2lzdGVyZWQgaXRzZWxmIGJ5IGJlaW5nIGRlcGxveWVkLiBBY2NlcHRpbmcgaXMgYSBzZXBhcmF0ZSB0cmFuc2FjdGlvbiwgIiArCgkJCSJuYW1pbmcgY29kZSB5b3UgY2FuIFtyZWFkIGZpcnN0XSgiICsgc291cmNlTGluayhwZW5kaW5nWzBdKSArICIpLlxuXG4iKQoJCWZvciBfLCBwIDo9IHJhbmdlIHBlbmRpbmcgewoJCQliLldyaXRlU3RyaW5nKCI8Z25vLWZvcm0gZXhlYz1cIkFjY2VwdFwiPlxuIikKCQkJYi5Xcml0ZVN0cmluZygiICA8Z25vLWlucHV0IG5hbWU9XCJwa2dQYXRoXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiIgKyBhdHRyKHApICsgIlwiIHBsYWNlaG9sZGVyPVwidGhlbWUgcmVhbG0gcGF0aFwiIC8+XG4iKQoJCQliLldyaXRlU3RyaW5nKCI8L2duby1mb3JtPlxuXG4iKQoJCX0KCX0KCglpZiBwYXN0IDo9IEhpc3RvcnlQYXRocygpOyBsZW4ocGFzdCkgPiAwIHsKCQliLldyaXRlU3RyaW5nKCIjIyBQcmV2aW91c2x5XG5cbiIpCgkJZm9yIF8sIHAgOj0gcmFuZ2UgcGFzdCB7CgkJCWIuV3JpdGVTdHJpbmcoIi0gWyIgKyBwICsgIl0oIiArIHNvdXJjZUxpbmsocCkgKyAiKVxuIikKCQl9CgkJYi5Xcml0ZVN0cmluZygiXG4iKQoJfQoKCWlmICFGcm96ZW4oKSB7CgkJYi5Xcml0ZVN0cmluZygiIyMgT3BlcmF0aW9uc1xuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIi0gW1JvbGxiYWNrXSgiICsgaGVscExpbmsoIlJvbGxiYWNrIikgKyAiKSB0byB0aGUgcHJldmlvdXMgdGhlbWVcbiIpCgkJYi5Xcml0ZVN0cmluZygiLSBbQWNjZXB0XSgiICsgaGVscExpbmsoIkFjY2VwdCIpICsgIikgYSB0aGVtZSBieSBwYXRoXG4iKQoJCWIuV3JpdGVTdHJpbmcoIi0gW1dpdGhkcmF3XSgiICsgaGVscExpbmsoIldpdGhkcmF3IikgKyAiKSBhIGNhbmRpZGF0ZVxuIikKCQliLldyaXRlU3RyaW5nKCItIFtGb3JnZXRdKCIgKyBoZWxwTGluaygiRm9yZ2V0IikgKyAiKSB0aGUgcm9sbGJhY2sgaGlzdG9yeVxuIikKCQliLldyaXRlU3RyaW5nKCItIFtUcmFuc2ZlciBhdXRob3JpdHldKCIgKyBoZWxwTGluaygiVHJhbnNmZXJBdXRob3JpdHkiKSArICIpXG4iKQoJCWIuV3JpdGVTdHJpbmcoIi0gW0ZyZWV6ZV0oIiArIGhlbHBMaW5rKCJGcmVlemUiKSArICIpOiBubyBtb3JlIHRoZW1lIHVwZ3JhZGVzLCBldmVyXG5cbiIpCgl9CgoJYi5Xcml0ZVN0cmluZygiIyMgSG93IGFuIHVwZ3JhZGUgd29ya3NcblxuIikKCWIuV3JpdGVTdHJpbmcoIjEuIENvcHkgYHRoZW1lL3YwYCB0byBgdGhlbWUvdjFgLCBjaGFuZ2Ugd2hhdCB5b3UgbGlrZSwga2VlcCBgUmVuZGVyYC5cbiIpCgliLldyaXRlU3RyaW5nKCIyLiBEZXBsb3kgaXQgYXQgYCIgKyBzZWxmUGF0aCArICIvdGhlbWUvdjFgLiBJdHMgaW5pdCByZWdpc3RlcnMgaXQgaGVyZS5cbiIpCgliLldyaXRlU3RyaW5nKCIzLiBBY2NlcHQgdGhhdCBwYXRoLiBUaGUgc2xvdHMgbmV2ZXIgbW92ZWQ7IG9ubHkgdGhlIGNvZGUgcmVhZGluZyB0aGVtIGNoYW5nZWQuXG4iKQoJYi5Xcml0ZVN0cmluZygiNC4gSWYgaXQgbWlzYmVoYXZlcywgUm9sbGJhY2suIEEgdGhlbWUgdGhhdCBwYW5pY3MgdGFrZXMgdGhlIHBhZ2UgZG93biB1bnRpbCB0aGVuLCAiICsKCQkiYnV0IHRoaXMgdmlldyBhbmQgdGhlIG90aGVyIGJ1aWx0LWluIG9uZXMgbmV2ZXIgZ28gdGhyb3VnaCB0aGUgdGhlbWUsIHNvIHRoZSByb2xsYmFjayBpcyBhbHdheXMgcmVhY2hhYmxlLlxuIikKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgaGVscExpbmsoZm4gc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIExpbmsoIiIpICsgIiRoZWxwJmZ1bmM9IiArIGZuCn0KCmZ1bmMgc291cmNlTGluayhwa2dQYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIGkgOj0gc3RyaW5ncy5JbmRleChwa2dQYXRoLCAiLyIpOyBpID49IDAgewoJCXBrZ1BhdGggPSBwa2dQYXRoW2k6XQoJfQoJcmV0dXJuIHBrZ1BhdGggKyAiJHNvdXJjZSIKfQoa/CcKD3JlbmRlcl90ZXN0LmdubxLoJ3BhY2thZ2UgaG9tZQoKaW1wb3J0ICgKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKLy8gVGVzdHMgdGhhdCBuZWVkIG5vIGNyb3NzaW5nOiBwdXJlIGhlbHBlcnMgYW5kIHRoZSBidWlsdC1pbiB2aWV3cy4gVGhlCi8vIGNyb3NzaW5nIGJlaGF2aW9yICh3cml0ZXMsIGF1dGhvcml0eSwgdGhlbWUgbGlmZWN5Y2xlKSBpcyBpbiBob21lX3Rlc3QuZ25vLAovLyBmcm9tIG91dHNpZGUgdGhlIHBhY2thZ2UsIGJlY2F1c2UgYSBjYWxsIGludG8gb25lJ3Mgb3duIHJlYWxtIG5ldmVyIGNyb3NzZXMuCgpmdW5jIFRlc3RWYWxpZFNsdWcodCAqdGVzdGluZy5UKSB7Cglmb3IgXywgb2sgOj0gcmFuZ2UgW11zdHJpbmd7ImEiLCAibm93IiwgInN0eWxlLmFjY2VudCIsICJhLWJfYy5kIiwgc3RyaW5ncy5SZXBlYXQoIngiLCA2NCl9IHsKCQl1YXNzZXJ0LlRydWUodCwgdmFsaWRTbHVnKG9rKSwgb2spCgl9Cglmb3IgXywgYmFkIDo9IHJhbmdlIFtdc3RyaW5neyIiLCAiTm93IiwgImE6YiIsICJhIGIiLCAiYS9iIiwgc3RyaW5ncy5SZXBlYXQoIngiLCA2NSl9IHsKCQl1YXNzZXJ0LkZhbHNlKHQsIHZhbGlkU2x1ZyhiYWQpLCBiYWQpCgl9Cn0KCmZ1bmMgVGVzdEZlbmNlKHQgKnRlc3RpbmcuVCkgewoJdWFzc2VydC5FcXVhbCh0LCAiYGBgIiwgZmVuY2UoInBsYWluIikpCgl1YXNzZXJ0LkVxdWFsKHQsICJgYGAiLCBmZW5jZSgiaGFzIGBvbmVgIGFuZCBgYHR3b2BgIikpCgl1YXNzZXJ0LkVxdWFsKHQsICJgYGBgIiwgZmVuY2UoImBgYGdvXG54XG5gYGAiKSkKCXVhc3NlcnQuRXF1YWwodCwgImBgYGBgIiwgZmVuY2UoImBgYGAiKSkKfQoKZnVuYyBUZXN0QXR0cih0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuRXF1YWwodCwgImEgJmFtcDsgYiAmcXVvdDtjJnF1b3Q7ICZsdDtkJmd0O1xcblxcdGUiLCBhdHRyKCJhICYgYiBcImNcIiA8ZD5cclxuXHRlIikpCn0KCmZ1bmMgVGVzdEZpbGxlcklzTGF6eVNpbmdsZVBhc3NBbmRPcmRlckluZGVwZW5kZW50KHQgKnRlc3RpbmcuVCkgewoJUmVzZXRGb3JUZXN0KCkKCVNlZWRGb3JUZXN0KCJhIiwgIkEgc2F5cyA6YjoiKQoJU2VlZEZvclRlc3QoImIiLCAiQiIpCgljYWxscyA6PSAwCglmIDo9IE5ld0ZpbGxlcigpCglmLkFkZCgiZXhwZW5zaXZlIiwgZnVuYygpIHN0cmluZyB7IGNhbGxzKys7IHJldHVybiAiWCIgfSkKCgl1YXNzZXJ0LkVxdWFsKHQsICJBIHNheXMgOmI6IEIgOm5vcGU6IiwgZi5GaWxsKCI6YTogOmI6IDpub3BlOiIpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBjYWxscywgImFuIGFic2VudCBwbGFjZWhvbGRlciBuZXZlciBydW5zIGl0cyBjYWxsYmFjayIpCgl1YXNzZXJ0LkVxdWFsKHQsICJYIiwgZi5GaWxsKCI6ZXhwZW5zaXZlOiIpKQoKCS8vIEEgbGF0ZXIgQWRkIGZvciBhIHNsb3QncyBuYW1lIHdpbnM6IHRoYXQgaXMgaG93IGEgdGhlbWUgd2lkZ2V0IG92ZXJyaWRlcy4KCWYuQWRkKCJhIiwgZnVuYygpIHN0cmluZyB7IHJldHVybiAid2lkZ2V0IiB9KQoJdWFzc2VydC5FcXVhbCh0LCAid2lkZ2V0IiwgZi5GaWxsKCI6YToiKSkKfQoKZnVuYyBUZXN0UmVuZGVyV2l0aG91dExheW91dE9yVGhlbWUodCAqdGVzdGluZy5UKSB7CglSZXNldEZvclRlc3QoKQoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIiMgZ25vLmxhbmQvci9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL2hvbWUiKSwgb3V0KQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiTm8gdGhlbWUgaXMgbGl2ZSIpLCBvdXQpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJfbm8gc2xvdHMgeWV0XyIpLCBvdXQpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJ0aGVtZSBidWlsdC1pbiIpLCBvdXQpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiOnNsb3RzOiIpLCAiY29tcHV0ZWQgcGxhY2Vob2xkZXJzIG11c3QgcmVzb2x2ZSIpCn0KCmZ1bmMgVGVzdFJlbmRlckxheW91dFN1YnN0aXR1dGlvbih0ICp0ZXN0aW5nLlQpIHsKCVJlc2V0Rm9yVGVzdCgpCglTZWVkRm9yVGVzdCgiaW50cm8iLCAiSGVsbG8gOnJldjogd29ybGQiKSAvLyBwbGFjZWhvbGRlcnMgaW5zaWRlIGEgYm9keSBzdGF5IHB1dAoJU2VlZEZvclRlc3QoImxheW91dCIsICIjIFBhZ2VcblxuOmludHJvOlxuXG5yZXYgOnJldjogwrcgOm1pc3Npbmc6IMK3IDpyZWFsbTpcbiIpCgoJdWFzc2VydC5FcXVhbCh0LCAiIyBQYWdlXG5cbkhlbGxvIDpyZXY6IHdvcmxkXG5cbnJldiAyIMK3IDptaXNzaW5nOiDCtyBnbm8ubGFuZC9yL2cxbG5reXRmcWNqd2xsd3M2M2d2ZjBtdjl5dDA0YXN3eTR5OWFtaG0vaG9tZVxuIiwgUmVuZGVyKCIiKSkKfQoKZnVuYyBUZXN0UmVuZGVySW5kZXhBbmRTbG90KHQgKnRlc3RpbmcuVCkgewoJUmVzZXRGb3JUZXN0KCkKCVNlZWRGb3JUZXN0KCJub3ciLCAiYGBgZ29cbnggOj0gMVxuYGBgIikKCglpZHggOj0gUmVuZGVyKCJzbG90cyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpZHgsICJ8IFtub3ddKC9yL2cxbG5reXRmcWNqd2xsd3M2M2d2ZjBtdjl5dDA0YXN3eTR5OWFtaG0vaG9tZTpzbG90cy9ub3cpIHwiKSwgaWR4KQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaWR4LCAiW2VkaXRdKC9yL2cxbG5reXRmcWNqd2xsd3M2M2d2ZjBtdjl5dDA0YXN3eTR5OWFtaG0vaG9tZTplZGl0L25vdykiKSwgaWR4KQoKCXJhdyA6PSBSZW5kZXIoInNsb3RzL25vdyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhyYXcsICIjIG5vd1xuIiksIHJhdykKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHJhdywgImBgYGBcbmBgYGdvXG54IDo9IDFcbmBgYFxuYGBgYFxuIiksICJmZW5jZSBtdXN0IG91dGdyb3cgdGhlIGJvZHk6ICIrcmF3KQoKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigic2xvdHMvbm9wZSIpLCAiIyBOb3QgZm91bmQiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigibm9wZSIpLCAiIyBOb3QgZm91bmQiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigic2xvdHM/eD0xIiksICIjIFNsb3RzIiksICJxdWVyeSBzdHJpbmdzIGFyZSBpZ25vcmVkIikKCXVhc3NlcnQuRXF1YWwodCwgTWFuaWZlc3QoKSwgUmVuZGVyKCJtYW5pZmVzdCIpKQp9CgpmdW5jIFRlc3RTbHVnc0VhY2hNYW5pZmVzdCh0ICp0ZXN0aW5nLlQpIHsKCVJlc2V0Rm9yVGVzdCgpCglTZWVkRm9yVGVzdCgiYiIsICJ0d28iKQoJU2VlZEZvclRlc3QoImEiLCAib25lIikKCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihTbHVncygpKSkKCXVhc3NlcnQuRXF1YWwodCwgImEiLCBTbHVncygpWzBdKQoKCXZpc2l0ZWQgOj0gW11zdHJpbmd7fQoJRWFjaChmdW5jKHNsdWcgc3RyaW5nLCBzIFNsb3QpIGJvb2wgewoJCXZpc2l0ZWQgPSBhcHBlbmQodmlzaXRlZCwgc2x1ZysiPSIrcy5Cb2R5KQoJCXJldHVybiBmYWxzZQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgImE9b25lIGI9dHdvIiwgc3RyaW5ncy5Kb2luKHZpc2l0ZWQsICIgIikpCgoJbGluZXMgOj0gc3RyaW5ncy5TcGxpdChzdHJpbmdzLlRyaW1TcGFjZShNYW5pZmVzdCgpKSwgIlxuIikKCXVhc3NlcnQuRXF1YWwodCwgMiwgbGVuKGxpbmVzKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkhhc1ByZWZpeChsaW5lc1swXSwgImFcdDJcdDNcdCIpLCBsaW5lc1swXSkKCXVhc3NlcnQuRXF1YWwodCwgNCwgbGVuKHN0cmluZ3MuU3BsaXQobGluZXNbMF0sICJcdCIpKSkKCglzLCBvayA6PSBMb29rdXAoImEiKQoJdWFzc2VydC5UcnVlKHQsIG9rKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBzLlJldikKCV8sIG9rID0gTG9va3VwKCJ6enoiKQoJdWFzc2VydC5GYWxzZSh0LCBvaykKCXVhc3NlcnQuRXF1YWwodCwgIiMwMDAiLCBTdHlsZSgibWlzc2luZyIsICIjMDAwIikpCn0KCmZ1bmMgVGVzdFJlbmRlckVkaXQodCAqdGVzdGluZy5UKSB7CglSZXNldEZvclRlc3QoKQoJU2VlZEZvclRlc3QoImludHJvIiwgImxpbmUgXCJvbmVcIlxuPHR3bz4gJiB0aHJlZVx0dGFiIikKCglibGFuayA6PSBSZW5kZXIoImVkaXQiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoYmxhbmssICI8Z25vLWZvcm0gZXhlYz1cIlNldFwiPiIpLCBibGFuaykKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGJsYW5rLCAiPGduby1mb3JtIGV4ZWM9XCJEZWxldGVcIj4iKSwgYmxhbmspCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhibGFuaywgIltlZGl0XSgvci9nMWxua3l0ZnFjandsbHdzNjNndmYwbXY5eXQwNGFzd3k0eTlhbWhtL2hvbWU6ZWRpdC9pbnRybykiKSwgYmxhbmspCgoJb25lIDo9IFJlbmRlcigiZWRpdC9pbnRybyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvbmUsICJ2YWx1ZT1cImludHJvXCIiKSwgb25lKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob25lLAoJCSJ2YWx1ZT1cImxpbmUgJnF1b3Q7b25lJnF1b3Q7XFxuJmx0O3R3byZndDsgJmFtcDsgdGhyZWVcXHR0YWJcIiIpLCBvbmUpCgoJbWlzc2luZyA6PSBSZW5kZXIoImVkaXQvbGF0ZXIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMobWlzc2luZywgIlNhdmluZyBjcmVhdGVzIGl0IiksIG1pc3NpbmcpCn0KCmZ1bmMgVGVzdFJlbmRlclN5c3RlbSh0ICp0ZXN0aW5nLlQpIHsKCVJlc2V0Rm9yVGVzdCgpCglvdXQgOj0gUmVuZGVyKCJzeXN0ZW0iKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiYnVpbHQtaW4gZmFsbGJhY2siKSwgb3V0KQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCBBZG1pbi5TdHJpbmcoKSksIG91dCkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIiRoZWxwJmZ1bmM9Um9sbGJhY2siKSwgb3V0KQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAifCBsYXN0IHdyaXRlIHwgbmV2ZXIgfCIpLCBvdXQpCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0yMDAwMDAwMHVnbm90EhIIgLi4chILMjQwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDU0gMEM0B0A0pDTgqang6sN+Vm0Quk1Dx+P7f2IjDDzYSQINxYCqXGsKeDj57tqmQSz5vy6wK7kacXdb805509xnsY8ctRQAeD5qT15Z4RkMevqid4fggOIbBiKZYnOE6mJsaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data