Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
0066EA2F428364C4D5A0FABF16F06DA9D14A493DF8018EB38761E473E4FD01FC
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
95,558,800
Requested gas limit
GAS USED
42,606,682
Gas consumed
FEE
286676ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf513000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CrX8AQoML3ZtLm1fYWRkcGtnEqP8AQooZzFtYW5mcmVkNDdremR1ZWM5MjB6ODh3ZnI2NHlsa3NtZGNlZGxmNRLm+wEKCXJpc2N2ZGVtbxIhZ25vLmxhbmQvci9tb3VsL3gvdm0vcmlzY3ZkZW1vL3YwGtwbCglSRUFETUUubWQSzhsjIHIvbW91bC94L3ZtL3Jpc2N2ZGVtbwoKRGVtbyBvZiBbYHAvbW91bC94L3ZtL3Jpc2N2YF0oL3AvbW91bC94L3ZtL3Jpc2N2L3YwKSwgdGhlIFJWMzJJTSBoYXJ0LCBhbmQKW2BwL21vdWwveC92bS92bWtpdGBdKC9wL21vdWwveC92bS92bWtpdC92MCksIHRoZSBob3N0IEFCSS4gVGhpcyByZWFsbSBob2xkcyBubwpsb2dpYyBvZiBpdHMgb3duOiBpdCBzdG9yZXMgaW1hZ2VzLCBidWlsZHMgYSBgdm1raXQuSG9zdGAsIGFuZCByZW5kZXJzLgoKV2hhdCBpdCBleGlzdHMgdG8gc2hvdyBpcyB0d28gdGhpbmdzIHJlYWxtIGNvZGUgY2Fubm90IGRvIGZvciBpdHNlbGYuCgoqKlRoZSBndWVzdCB3YXMgbm90IHdyaXR0ZW4gZm9yIGduby4qKiBUaGUgcHJvZ3JhbXMgb24gdGhlIGZyb250IHBhZ2UgYXJlIGZsYXQKYC50ZXh0YCBpbWFnZXMsIHRoZSBieXRlcyBhIGNyb3NzIGNvbXBpbGVyIGVtaXRzIGZvcgpgcmlzY3YzMmltLXVua25vd24tbm9uZS1lbGZgLiBgVXBsb2FkYCB0YWtlcyBoZXgsIHNvIGFueXRoaW5nIHlvdSBjYW4gYnVpbGQgd2l0aApgY2xhbmdgLCBgcnVzdGNgLCBUaW55R28gb3IgWmlnIGFuZCBzdHJpcCB0byBpdHMgdGV4dCBzZWdtZW50IGdvZXMgaW4gdW5jaGFuZ2VkLgoKVHdvIHNhbXBsZXMgYXJlIGV4YWN0bHkgdGhhdCBhbmQgbmVpdGhlciBpcyBhIG1vY2sgdXAuICoqQ29tcGlsZWQgYnkgY2xhbmcqKiBpcwphIGZyZWVzdGFuZGluZyBDIHByb2dyYW07ICoqQSB0b2tlbiwgaW4gUnVzdCoqIGlzIGAjIVtub19zdGRdYCBSdXN0IHRoYXQgbWludHMsCnNlbmRzIGFuZCBidXJucywgbGlua2luZyBSdXN0J3MgcmVhbCBgY29yZWAgYW5kIGBjb21waWxlcl9idWlsdGluc2AsIHNvIGEKNjQtYml0IGRpdmlkZSBpbiBpdCBydW5zIGBfX3VkaXZkaTNgIG9uIGEgbWFjaGluZSB3aXRoIG5vIDY0LWJpdCBkaXZpZGUKaW5zdHJ1Y3Rpb24uIEJvdGggYXJlIHNoaXBwZWQgYXMgdGhlIGJ5dGVzIHRoZSBjb21waWxlciBlbWl0dGVkLCBhbmQgdGhlIHBhZ2UKc2hvd3MgdGhlaXIgc291cmNlIHJhdGhlciB0aGFuIGEgZGlzYXNzZW1ibHksIGJlY2F1c2UgYSBkaXNhc3NlbWJseSB3b3VsZCBidXJ5CnRoZSBvbmx5IGludGVyZXN0aW5nIGZhY3Q6IG5vYm9keSB3cm90ZSB0aGUgbWFjaGluZSBjb2RlLiBTb3VyY2VzIGFuZCBidWlsZApjb21tYW5kczogYHRvb2xzL3Jpc2N2LWd1ZXN0c2AuCgoqKkEgcHJvZ3JhbSBwYXVzZXMgaW5zdGVhZCBvZiBmYWlsaW5nLioqIEl0IHJ1bnMgdW50aWwgaXRzIGZ1ZWwgc2xpY2UgaXMgc3BlbnQsCnRoZW4gc3RvcHMgd2l0aCBhIHNuYXBzaG90IHRoZSByZWFsbSBrZWVwcywgYW5kIHRoZSBuZXh0IGNhbGxlciBwYXlzIGZvciB0aGUKbmV4dCBzbGljZS4gVGhlICJIZWF2eSBsb29wIiBzYW1wbGUgaXMgMjAwLDAwNiBpbnN0cnVjdGlvbnMgYW5kIHRha2VzIHRocmVlCnRyYW5zYWN0aW9ucyBhdCB0aGUgZGVmYXVsdCBzbGljZSwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50LgoKYGBgClVwbG9hZFNhbXBsZSgiaGVhdnkiLCAiIiwgMCkgICAtPiBpZApTdGVwKGlkLCA4MDAwMCkgICAgICAgICAgICAgICAgLT4gInJ1bm5pbmciClN0ZXAoaWQsIDgwMDAwKSAgICAgICAgICAgICAgICAtPiAicnVubmluZyIKU3RlcChpZCwgODAwMDApICAgICAgICAgICAgICAgIC0+ICJoYWx0ZWQiCmBgYAoKIyMgUmVhZGluZyB0aGUgaW5zdGFuY2UgcGFnZQoKQSBndWVzdCB0aGF0IHdyaXRlcyBub3RoaW5nIGhhcyBzdGlsbCBjb21wdXRlZCBzb21ldGhpbmcsIHNvIHRoZSBpbnN0YW5jZSBwYWdlCnJlc3RvcmVzIHRoZSBzbmFwc2hvdCBhbmQgc2hvd3MgdGhlIHJlZ2lzdGVyIGZpbGUgdW5kZXIgaXRzIEFCSSBuYW1lcy4gVGhhdCBpcwp0aGUgb25seSBwbGFjZSB0aGUgc3RhdGUgaXMgbGVnaWJsZTogdGhlIGhhcnQgaXRzZWxmIGRvZXMgbm90IHN1cnZpdmUgdGhlCnRyYW5zYWN0aW9uLCBvbmx5IGl0cyBzbmFwc2hvdCBkb2VzLgoKIyMgV2hhdCBhIHNsaWNlIGNvc3RzCgpBbiBSVjMySU0gaW5zdHJ1Y3Rpb24gY29zdHMgYWJvdXQgKio4LDUwMCBnYXMqKiwgbWVhc3VyZWQgcmF0aGVyIHRoYW4gZXN0aW1hdGVkLApzbyBhIGJsb2NrIGJ1eXMgcm91Z2hseSAqKjM1MCwwMDAgZ3Vlc3QgaW5zdHJ1Y3Rpb25zKiouIExvYWRpbmcgdGhlIGltYWdlIGNvc3RzCmFib3V0ICoqMTksNjAwIGdhcyBwZXIgaW5zdHJ1Y3Rpb24gd29yZCoqIGFuZCBpcyBwYWlkIGFnYWluIG9uIGV2ZXJ5IHJlc3VtZSwKd2hpY2ggaXMgd2h5IGBNYXhJbWFnZWAgaXMgOCBLaUIgYW5kIG5vdCBhIG1lZ2FieXRlLiBUaGUgbWVhc3VyZW1lbnRzIGFuZCBob3cKdGhleSB3ZXJlIHRha2VuIGFyZSBpbiB0aGUgW2xpYnJhcnkgUkVBRE1FXSgvcC9tb3VsL3gvdm0vcmlzY3YvdjApLgoKIyMgV2hhdCB0aGlzIHJlYWxtIGRvZXMgbm90IGdyYW50CgpgU2VuZGAgYWx3YXlzIHJldHVybnMgYHZta2l0LkVyck5vdEdyYW50ZWRgLiBObyBpbnN0YW5jZSBoZXJlIGlzIGZ1bmRlZCwgc28gYQpndWVzdCB0aGF0IHRyaWVzIHRvIG1vdmUgY29pbnMgaXMgcmVmdXNlZCwgYW5kIHRoYXQgaXMgdGhlIGNhcGFiaWxpdHkgcnVsZQp3b3JraW5nIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmZWF0dXJlLiBHdWVzdCBrZXktdmFsdWUgc3RvcmFnZSBpcyBzY29wZWQgdG8gdGhlCmluc3RhbmNlIGJlaW5nIHN0ZXBwZWQgYnkgY29uc3RydWN0aW9uOiB0aGUgdHJlZSBiZWxvbmdzIHRvIHRoZSBpbnN0YW5jZSwgc28gb25lCnByb2dyYW0gY2Fubm90IHJlYWNoIGFub3RoZXIncyBldmVuIHRob3VnaCBib3RoIGxpdmUgaW4gdGhpcyByZWFsbS4KCjwhLS0gQkVHSU4gR05PQ09OVFJBQ1RTIEZPT1RFUiAoZ2VuZXJhdGVkIGJ5IGBtYWtlIHJlYWRtZXNgOyBkbyBub3QgZWRpdCBiZWxvdykgLS0+CgotLS0KClBhcnQgb2YgKipbbW91bC9nbm8tY29udHJhY3RzXShodHRwczovL2dpdGh1Yi5jb20vbW91bC9nbm8tY29udHJhY3RzKSoqIOKAlCBtb3VsJ3MgdmVyc2lvbmVkIGduby5sYW5kIGNvbnRyYWN0cy4gU2VlIHRoZSByZXBvc2l0b3J5IGZvciB0aGUgZnVsbCBjYXRhbG9nLCBidWlsZC90ZXN0IHRvb2xpbmcsIGFuZCB1c2FnZS4KCioqRGVwZW5kZW5jeSBncmFwaDoqKgoKIVtnbm8ubGFuZC9yL21vdWwveC92bS9yaXNjdmRlbW8vdjAgZGVwZW5kZW5jeSBncmFwaF0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9tYWluL19hc3NldHMvZ25vLmxhbmQvci9tb3VsL3gvdm0vcmlzY3ZkZW1vL3YwL2RlcHMucG5nKQoKPiDwn6eqICoqSGlnaGx5IGV4cGVyaW1lbnRhbCDigJQgcG90ZW50aWFsbHkgdmliZS1jb2RlZC4qKiBOb3QgYXVkaXRlZDsgbWF5IGJyZWFrLCBjaGFuZ2UsIG9yIGJlIHJlbW92ZWQgYXQgYW55IHRpbWUuIERvIG5vdCB1c2Ugd2l0aCBhbnl0aGluZyBvZiB2YWx1ZS4gRnVsbCBkaXNjbGFpbWVyOiBbRElTQ0xBSU1FUl0oaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9ibG9iL21haW4vRElTQ0xBSU1FUi5tZCkuCgo8IS0tIEVORCBHTk9DT05UUkFDVFMgRk9PVEVSIC0tPgoaVwoLZ25vbW9kLnRvbWwSSG1vZHVsZSA9ICJnbm8ubGFuZC9yL21vdWwveC92bS9yaXNjdmRlbW8vdjAiCmdubyA9ICIwLjkiCnByaXZhdGUgPSB0cnVlChrDPgoKcmVuZGVyLmdubxK0PnBhY2thZ2UgcmlzY3ZkZW1vCgppbXBvcnQgKAoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvbW91bC9raXQvdWkvdjAiCgkiZ25vLmxhbmQvcC9tb3VsL3gvdm0vcmlzY3YvdjAiCgkiZ25vLmxhbmQvcC9tb3VsL3gvdm0vdm1raXQvdjAiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgovLyByZWdOYW1lcyBhcmUgdGhlIEFCSSBuYW1lcywgYmVjYXVzZSBub2JvZHkgcmVhZGluZyBhIHJlZ2lzdGVyIGR1bXAgdGhpbmtzIGluCi8vIHgtbnVtYmVycyBhbmQgZXZlcnkgY29tcGlsZXIncyBvdXRwdXQgaXMgYW5ub3RhdGVkIHdpdGggdGhlc2UuCnZhciByZWdOYW1lcyA9IFszMl1zdHJpbmd7CgkiemVybyIsICJyYSIsICJzcCIsICJncCIsICJ0cCIsICJ0MCIsICJ0MSIsICJ0MiIsCgkiczAiLCAiczEiLCAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiLAoJImE2IiwgImE3IiwgInMyIiwgInMzIiwgInM0IiwgInM1IiwgInM2IiwgInM3IiwKCSJzOCIsICJzOSIsICJzMTAiLCAiczExIiwgInQzIiwgInQ0IiwgInQ1IiwgInQ2IiwKfQoKLy8gUmVuZGVyIGlzIHRoZSByZWFsbSdzIGdub3dlYiB2aWV3LgovLwovLyAgIC0gIi8iICAgICAgdGhlIHNhbXBsZXMsIHRoZSBpbnN0YW5jZSBsaXN0LCBhbmQgd2hhdCB0aGUgbnVtYmVycyBtZWFuLgovLyAgIC0gIi88aWQ+IiAgb25lIGluc3RhbmNlOiBpdHMgc3RhdHVzLCBmdWVsLCBvdXRwdXQgYW5kIHJlZ2lzdGVyIGZpbGUuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWQgOj0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5UcmltUHJlZml4KHBhdGgsICIvIikpCglpZiBpZCA9PSAiIiB7CgkJcmV0dXJuIHJlbmRlckhvbWUoKQoJfQoJcmV0dXJuIHJlbmRlckluc3RhbmNlKGlkKQp9CgpmdW5jIHJlbmRlckhvbWUoKSBzdHJpbmcgewoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgUlYzMklNLCBvbiBjaGFpbiwgYSBzbGljZSBhdCBhIHRpbWVcblxuIikKCXNiLldyaXRlU3RyaW5nKCJEZW1vIG9mIFtgcC9tb3VsL3gvdm0vcmlzY3ZgXSgvcC9tb3VsL3gvdm0vcmlzY3YvdjApICh0aGUgaGFydCkgYW5kICIpCglzYi5Xcml0ZVN0cmluZygiW2BwL21vdWwveC92bS92bWtpdGBdKC9wL21vdWwveC92bS92bWtpdC92MCkgKHRoZSBob3N0IEFCSSwgdGhlIGZ1ZWwgbWV0ZXIsICIpCglzYi5Xcml0ZVN0cmluZygidGhlIGluc3RhbmNlIHN0b3JlKS4gVGhpcyByZWFsbSBob2xkcyBubyBsb2dpYyBvZiBpdHMgb3duLlxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIlRoZSBwcm9ncmFtcyBiZWxvdyBhcmUgZmxhdCBgLnRleHRgIGltYWdlczogdGhlIHNhbWUgYnl0ZXMgYSBjcm9zcyBjb21waWxlciAiKQoJc2IuV3JpdGVTdHJpbmcoImVtaXRzIGZvciBgcmlzY3YzMmltLXVua25vd24tbm9uZS1lbGZgLiBOb3RoaW5nIGhlcmUgd2FzIHdyaXR0ZW4gaW4gYSAiKQoJc2IuV3JpdGVTdHJpbmcoImNoYWluIGxhbmd1YWdlLCBhbmQgbm90aGluZyB0cmFuc2xhdGVkIGl0LlxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkEgcHJvZ3JhbSBkb2VzIG5vdCBydW4gdG8gY29tcGxldGlvbi4gSXQgcnVucyB1bnRpbCBpdHMgZnVlbCBzbGljZSBpcyBzcGVudCwgIikKCXNiLldyaXRlU3RyaW5nKCJ0aGVuIHBhdXNlczogdGhlIHJlYWxtIGtlZXBzIHRoZSBzbmFwc2hvdCBhbmQgdGhlIG5leHQgY2FsbGVyIHBheXMgZm9yIHRoZSAiKQoJc2IuV3JpdGVTdHJpbmcoIm5leHQgc2xpY2UuIFJlYWxtIGNvZGUgY2Fubm90IHBhdXNlIGl0c2VsZiwgYW5kIGEgZ3Vlc3QgY2FuLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBTYW1wbGVzXG5cbiIpCglmb3IgaSA6PSByYW5nZSBzYW1wbGVzIHsKCQlzIDo9ICZzYW1wbGVzW2ldCgkJc2IuV3JpdGVTdHJpbmcoIioqIiArIHVpLklubGluZShzLm5hbWUpICsgIioqOiAiICsgcy5ub3RlICsgIlxuXG4iKQoJCXNiLldyaXRlU3RyaW5nKCJgYGAiICsgcy5sYW5nKCkgKyAiXG4iICsgcy5hc20gKyAiXG5gYGBcblxuIikKCQlzYi5Xcml0ZVN0cmluZyh1aS5BY3Rpb24oIlVwbG9hZCAiK3MubmFtZSwgIlVwbG9hZFNhbXBsZSIsCgkJCSJuYW1lIiwgcy5zbHVnLCAiaW5wdXQiLCBzLmlucHV0LAoJCQkiYnVkZ2V0IiwgdWZtdC5TcHJpbnRmKCIlZCIsIHMuYnVkZ2V0KSkgKyAiXG5cbiIpCgl9CgoJc2IuV3JpdGVTdHJpbmcoIiMjIEluc3RhbmNlc1xuXG4iKQoJdCA6PSB1aS5OZXdUYWJsZSgiaWQiLCAic3RhdHVzIiwgImluc3RydWN0aW9ucyIsICJzbGljZXMiLCAib3V0cHV0IikKCXN0b3JlLlJldmVyc2VJdGVyYXRlKGZ1bmMoaSAqdm1raXQuSW5zdGFuY2UpIGJvb2wgewoJCXQuUm93KAoJCQkiWyIraS5JRCsiXSgvci9tb3VsL3gvdm0vcmlzY3ZkZW1vL3YwOiIraS5JRCsiKSIsCgkJCWkuU3RhdHVzLlN0cmluZygpLAoJCQl1Zm10LlNwcmludGYoIiVkIiwgaS5GdWVsVXNlZCksCgkJCXVmbXQuU3ByaW50ZigiJWQiLCBpLlNsaWNlcyksCgkJCSJgIit1aS5DZWxsKHByaW50YWJsZShpLk91dHB1dCwgMjQpKSsiYCIsCgkJKQoJCXJldHVybiBmYWxzZQoJfSkKCXNiLldyaXRlU3RyaW5nKHQuT3JFbXB0eSgiTm8gaW5zdGFuY2VzIHlldC4gVXBsb2FkIG9uZSBvZiB0aGUgc2FtcGxlcyBhYm92ZS4iKSkKCXNiLldyaXRlU3RyaW5nKCJcblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgV2hhdCBhIHNsaWNlIGNvc3RzXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiQW4gUlYzMklNIGluc3RydWN0aW9uIGNvc3RzIGFib3V0ICoqOCw1MDAgZ2FzKiogaGVyZSwgbWVhc3VyZWQgcmF0aGVyIHRoYW4gIikKCXNiLldyaXRlU3RyaW5nKCJlc3RpbWF0ZWQsIHNvIGEgYmxvY2sgYnV5cyByb3VnaGx5ICoqMzUwLDAwMCBndWVzdCBpbnN0cnVjdGlvbnMqKi4gTG9hZGluZyAiKQoJc2IuV3JpdGVTdHJpbmcoInRoZSBpbWFnZSBjb3N0cyBhYm91dCAqKjE5LDYwMCBnYXMgcGVyIGluc3RydWN0aW9uIHdvcmQqKiBhbmQgaXMgcGFpZCBhZ2FpbiAiKQoJc2IuV3JpdGVTdHJpbmcoIm9uIGV2ZXJ5IHJlc3VtZSwgd2hpY2ggaXMgd2h5IHRoZSBpbWFnZSBjYXAgYmVsb3cgaXMgc21hbGwuIFRoZSBudW1iZXJzIGFuZCAiKQoJc2IuV3JpdGVTdHJpbmcoImhvdyB0aGV5IHdlcmUgdGFrZW4gYXJlIGluIHRoZSBbbGlicmFyeSBSRUFETUVdKC9wL21vdWwveC92bS9yaXNjdi92MCkuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIExpbWl0c1xuXG4iKQoJbHQgOj0gdWkuTmV3VGFibGUoImxpbWl0IiwgInZhbHVlIikKCWx0LlJvdygiaW5zdGFuY2VzIiwgdWZtdC5TcHJpbnRmKCIlZCIsIE1heEluc3RhbmNlcykpCglsdC5Sb3coImltYWdlIGJ5dGVzIiwgdWZtdC5TcHJpbnRmKCIlZCIsIE1heEltYWdlKSkKCWx0LlJvdygiaW5wdXQgYnl0ZXMiLCB1Zm10LlNwcmludGYoIiVkIiwgTWF4SW5wdXQpKQoJbHQuUm93KCJvdXRwdXQgYnl0ZXMiLCB1Zm10LlNwcmludGYoIiVkIiwgTWF4T3V0cHV0KSkKCWx0LlJvdygiaW5zdHJ1Y3Rpb25zIHBlciBzbGljZSIsIHVmbXQuU3ByaW50ZigiJWQiLCBNYXhTbGljZUZ1ZWwpKQoJbHQuUm93KCJhZGRyZXNzIHNwYWNlIiwgdWZtdC5TcHJpbnRmKCIlZCIsIHJpc2N2Lk1lbVNpemUpKQoJc2IuV3JpdGVTdHJpbmcobHQuU3RyaW5nKCkpCglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJJbnN0YW5jZShpZCBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyBJbnN0YW5jZSAiICsgdWkuSW5saW5lKGlkKSArICJcblxuIikKCXNiLldyaXRlU3RyaW5nKCJb4oaQIGFsbCBpbnN0YW5jZXNdKC9yL21vdWwveC92bS9yaXNjdmRlbW8vdjApXG5cbiIpCgoJaW5zdCA6PSBzdG9yZS5HZXQoaWQpCglpZiBpbnN0ID09IG5pbCB7CgkJc2IuV3JpdGVTdHJpbmcoIioqTm8gc3VjaCBpbnN0YW5jZS4qKiBJdCB3YXMgbmV2ZXIgdXBsb2FkZWQsIG9yIGl0cyBvd25lciByZW1vdmVkIGl0LlxuIikKCQlyZXR1cm4gc2IuU3RyaW5nKCkKCX0KCgl0IDo9IHVpLk5ld1RhYmxlKCJmaWVsZCIsICJ2YWx1ZSIpCgl0LlJvdygib3duZXIiLCB1aS5BZGRyKGluc3QuT3duZXIpKQoJdC5Sb3coInZtIiwgdWkuQ2VsbChpbnN0LlZNKSkKCXQuUm93KCJzdGF0dXMiLCBpbnN0LlN0YXR1cy5TdHJpbmcoKSkKCWlmIGluc3QuVHJhcCAhPSAiIiB7CgkJdC5Sb3coInRyYXAiLCB1aS5DZWxsKGluc3QuVHJhcCkpCgl9Cgl0LlJvdygiaW5zdHJ1Y3Rpb25zIHJ1biIsIHVmbXQuU3ByaW50ZigiJWQiLCBpbnN0LkZ1ZWxVc2VkKSkKCXQuUm93KCJidWRnZXQiLCBmdWVsVGV4dChpbnN0LkZ1ZWxCdWRnZXQpKQoJdC5Sb3coInNsaWNlcyIsIHVmbXQuU3ByaW50ZigiJWQiLCBpbnN0LlNsaWNlcykpCgl0LlJvdygiaW1hZ2UgYnl0ZXMiLCB1Zm10LlNwcmludGYoIiVkIiwgbGVuKGluc3QuUHJvZ3JhbSkpKQoJdC5Sb3coImltYWdlIHdvcmRzIiwgdWZtdC5TcHJpbnRmKCIlZCIsIGxlbihpbnN0LlByb2dyYW0pLzQpKQoJdC5Sb3coInNuYXBzaG90IGJ5dGVzIiwgdWZtdC5TcHJpbnRmKCIlZCIsIGxlbihpbnN0LlNuYXBzaG90KSkpCglzYi5Xcml0ZVN0cmluZyh0LlN0cmluZygpKQoJc2IuV3JpdGVTdHJpbmcoIlxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgUmVnaXN0ZXJzXG5cbiIpCglzYi5Xcml0ZVN0cmluZyhyZW5kZXJSZWdpc3RlcnMoaW5zdCkpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIE91dHB1dFxuXG4iKQoJaWYgbGVuKGluc3QuT3V0cHV0KSA9PSAwIHsKCQlzYi5Xcml0ZVN0cmluZyh1aS5FbXB0eSgiTm90aGluZyB3cml0dGVuIHlldC4iKSkKCX0gZWxzZSB7CgkJc2IuV3JpdGVTdHJpbmcoImBgYFxuIiArIHByaW50YWJsZShpbnN0Lk91dHB1dCwgTWF4T3V0cHV0KSArICJcbmBgYFxuIikKCX0KCXNiLldyaXRlU3RyaW5nKCJcbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIEltYWdlXG5cbmBgYFxuIiArIGhleER1bXAoaW5zdC5Qcm9ncmFtLCA2NCkgKyAiXG5gYGBcblxuIikKCglpZiBpbnN0LlN0YXR1cyA9PSB2bWtpdC5SdW5uaW5nIHsKCQlzYi5Xcml0ZVN0cmluZyh1aS5BY3Rpb24oIlJ1biAyNTAwMCBpbnN0cnVjdGlvbnMiLCAiU3RlcCIsICJpZCIsIGlkLCAiZnVlbCIsICIyNTAwMCIpKQoJCXNiLldyaXRlU3RyaW5nKCIgwrcgIikKCQlzYi5Xcml0ZVN0cmluZyh1aS5BY3Rpb24oIlJ1biAxMDAwMDAgaW5zdHJ1Y3Rpb25zIiwgIlN0ZXAiLCAiaWQiLCBpZCwgImZ1ZWwiLCAiMTAwMDAwIikpCgkJc2IuV3JpdGVTdHJpbmcoIlxuIikKCX0gZWxzZSB7CgkJc2IuV3JpdGVTdHJpbmcoIlRoaXMgaW5zdGFuY2UgaXMgKioiICsgaW5zdC5TdGF0dXMuU3RyaW5nKCkgKyAiKiogYW5kIGNhbm5vdCBiZSBzdGVwcGVkIGFnYWluLlxuIikKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyByZW5kZXJSZWdpc3RlcnMgcmVzdG9yZXMgdGhlIHNuYXBzaG90IHRvIHJlYWQgdGhlIHJlZ2lzdGVyIGZpbGUgb3V0IG9mIGl0LgovLyBUaGUgaGFydCBpcyBub3Qga2VwdCBiZXR3ZWVuIHRyYW5zYWN0aW9ucywgb25seSBpdHMgc25hcHNob3QgaXMsIHNvIHRoaXMgaXMKLy8gdGhlIG9ubHkgcGxhY2UgdGhlIHN0YXRlIGlzIGxlZ2libGUsIGFuZCBpdCBpcyB0aGUgdGhpbmcgd29ydGggc2VlaW5nOiBhCi8vIHByb2dyYW0gdGhhdCB3cm90ZSBub3RoaW5nIHN0aWxsIGNvbXB1dGVkIHNvbWV0aGluZy4KZnVuYyByZW5kZXJSZWdpc3RlcnMoaW5zdCAqdm1raXQuSW5zdGFuY2UpIHN0cmluZyB7CglpZiBsZW4oaW5zdC5TbmFwc2hvdCkgPT0gMCB7CgkJcmV0dXJuIHVpLkVtcHR5KCJOb3Qgc3RhcnRlZCB5ZXQ6IG5vIHNuYXBzaG90IHRvIHJlYWQuIikgKyAiXG5cbiIKCX0KCXZhciBtIHJpc2N2Lk1hY2hpbmUKCWlmIGVyciA6PSBtLlJlc3RvcmUoaW5zdC5TbmFwc2hvdCk7IGVyciAhPSBuaWwgewoJCXJldHVybiB1aS5FbXB0eSgiVGhlIHNuYXBzaG90IGNvdWxkIG5vdCBiZSByZWFkLiIpICsgIlxuXG4iCgl9CglyZWcgOj0gbS5SZWdpc3RlcnMoKQoKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXQgOj0gdWkuTmV3VGFibGUoInJlZ2lzdGVyIiwgImhleCIsICJ1bnNpZ25lZCIsICJzaWduZWQiKQoJdC5Sb3coInBjIiwgdWZtdC5TcHJpbnRmKCIweCUwOFgiLCBtLlBDKCkpLCAiIiwgIiIpCglzaG93biA6PSAwCglmb3IgaSA6PSAxOyBpIDwgMzI7IGkrKyB7CgkJaWYgcmVnW2ldID09IDAgewoJCQljb250aW51ZQoJCX0KCQl0LlJvdygKCQkJcmVnTmFtZXNbaV0sCgkJCXVmbXQuU3ByaW50ZigiMHglMDhYIiwgcmVnW2ldKSwKCQkJdWZtdC5TcHJpbnRmKCIlZCIsIHJlZ1tpXSksCgkJCXVmbXQuU3ByaW50ZigiJWQiLCBpbnQ2NChpbnQzMihyZWdbaV0pKSksCgkJKQoJCXNob3duKysKCX0KCXNiLldyaXRlU3RyaW5nKHQuU3RyaW5nKCkpCglpZiBzaG93biA9PSAwIHsKCQlzYi5Xcml0ZVN0cmluZygiXG5FdmVyeSByZWdpc3RlciBleGNlcHQgYHBjYCBpcyB6ZXJvLlxuIikKCX0KCXNiLldyaXRlU3RyaW5nKCJcbiIpCglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKZnVuYyBmdWVsVGV4dChuIGludDY0KSBzdHJpbmcgewoJaWYgbiA9PSB2bWtpdC5Vbm1ldGVyZWQgewoJCXJldHVybiAidW5tZXRlcmVkIgoJfQoJcmV0dXJuIHVmbXQuU3ByaW50ZigiJWQiLCBuKQp9Cgpjb25zdCBoZXhEaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZiIKCi8vIGhleER1bXAgc2hvd3MgdGhlIGltYWdlIGFzIHdvcmRzLCB3aGljaCBpcyBob3cgYW55b25lIHJlYWRpbmcgUlYzMiByZWFkcyBpdC4KZnVuYyBoZXhEdW1wKGIgW11ieXRlLCBtYXggaW50KSBzdHJpbmcgewoJdHJ1bmNhdGVkIDo9IGZhbHNlCglpZiBsZW4oYikgPiBtYXggewoJCWIsIHRydW5jYXRlZCA9IGJbOm1heF0sIHRydWUKCX0KCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBpIDo9IDA7IGkrMyA8IGxlbihiKTsgaSArPSA0IHsKCQlpZiBpID4gMCAmJiBpJTE2ID09IDAgewoJCQlzYi5Xcml0ZVN0cmluZygiXG4iKQoJCX0gZWxzZSBpZiBpID4gMCB7CgkJCXNiLldyaXRlU3RyaW5nKCIgIikKCQl9CgkJdyA6PSB1aW50MzIoYltpXSkgfCB1aW50MzIoYltpKzFdKTw8OCB8IHVpbnQzMihiW2krMl0pPDwxNiB8IHVpbnQzMihiW2krM10pPDwyNAoJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiJTA4eCIsIHcpKQoJfQoJaWYgdHJ1bmNhdGVkIHsKCQlzYi5Xcml0ZVN0cmluZygiXG4uLi4iKQoJfQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCi8vIHByaW50YWJsZSByZW5kZXJzIGd1ZXN0IG91dHB1dCBmb3IgYSBjb2RlIGZlbmNlOiBwcmludGFibGUgQVNDSUkgYXMgaXRzZWxmLAovLyBldmVyeXRoaW5nIGVsc2UgYXMgYW4gZXNjYXBlLiBBIGd1ZXN0IHdyaXRlcyBhcmJpdHJhcnkgYnl0ZXMsIHNvIHRoaXMgaXMgdGhlCi8vIG9ubHkgZm9ybSBvZiBpdCB0aGF0IGlzIHNhZmUgdG8gc2hvdy4KZnVuYyBwcmludGFibGUoYiBbXWJ5dGUsIG1heCBpbnQpIHN0cmluZyB7CglpZiBsZW4oYikgPT0gMCB7CgkJcmV0dXJuICIiCgl9Cgl0cnVuY2F0ZWQgOj0gZmFsc2UKCWlmIGxlbihiKSA+IG1heCB7CgkJYiwgdHJ1bmNhdGVkID0gYls6bWF4XSwgdHJ1ZQoJfQoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJZm9yIF8sIGMgOj0gcmFuZ2UgYiB7CgkJc3dpdGNoIHsKCQljYXNlIGMgPT0gJ1xuJzoKCQkJc2IuV3JpdGVTdHJpbmcoIlxcbiIpCgkJY2FzZSBjID09ICdcdCc6CgkJCXNiLldyaXRlU3RyaW5nKCJcXHQiKQoJCWNhc2UgYyA9PSAnXFwnOgoJCQlzYi5Xcml0ZVN0cmluZygiXFxcXCIpCgkJY2FzZSBjID09ICdgJzoKCQkJc2IuV3JpdGVTdHJpbmcoIlxceDYwIikKCQljYXNlIGMgPj0gMHgyMCAmJiBjIDwgMHg3ZjoKCQkJc2IuV3JpdGVCeXRlKGMpCgkJZGVmYXVsdDoKCQkJc2IuV3JpdGVTdHJpbmcoIlxceCIpCgkJCXNiLldyaXRlQnl0ZShoZXhEaWdpdHNbYz4+NF0pCgkJCXNiLldyaXRlQnl0ZShoZXhEaWdpdHNbYyYweDBmXSkKCQl9Cgl9CglpZiB0cnVuY2F0ZWQgewoJCXNiLldyaXRlU3RyaW5nKCLigKYiKQoJfQoJcmV0dXJuIHNiLlN0cmluZygpCn0KGvlDCg1yaXNjdmRlbW8uZ25vEudDLy8gUGFja2FnZSByaXNjdmRlbW8gcnVucyByZWFsIGNvbXBpbGVkIG1hY2hpbmUgY29kZSBvbiBjaGFpbiwgYSBzbGljZSBhdCBhCi8vIHRpbWUuCi8vCi8vIEl0IGlzIGEgZGVtbyBvZiB0d28gbGlicmFyaWVzIGFuZCBjYXJyaWVzIG5vIGxvZ2ljIG9mIGl0cyBvd246Ci8vIFtwL21vdWwveC92bS9yaXNjdl0oL3AvbW91bC94L3ZtL3Jpc2N2L3YwKSBpcyB0aGUgUlYzMklNIGhhcnQsIGFuZAovLyBbcC9tb3VsL3gvdm0vdm1raXRdKC9wL21vdWwveC92bS92bWtpdC92MCkgaXMgdGhlIGhvc3QgQUJJLCB0aGUgZnVlbCBtZXRlcgovLyBhbmQgdGhlIGluc3RhbmNlIHN0b3JlLgovLwovLyBXaGF0IGl0IGV4aXN0cyB0byBzaG93IGlzIHRoYXQgdGhlIGd1ZXN0IHdhcyBub3Qgd3JpdHRlbiBmb3IgZ25vLiBUaGUKLy8gcHJvZ3JhbXMgb24gdGhlIGZyb250IHBhZ2UgYXJlIGZsYXQgLnRleHQgaW1hZ2VzOiB0aGUgc2FtZSBieXRlcwovLyBgcnVzdGMgLS10YXJnZXQgcmlzY3YzMmltLXVua25vd24tbm9uZS1lbGZgIGVtaXRzLCB1cGxvYWRlZCBhcyBoZXguIFRoZQovLyByZWFsbSBob2xkcyB0aGUgc25hcHNob3QgYmV0d2VlbiB0cmFuc2FjdGlvbnMsIHNvIG9uZSBjb21wdXRhdGlvbiBmaW5pc2hlcwovLyBhY3Jvc3Mgc2V2ZXJhbCBvZiB0aGVtLCBhbmQgcmVhbG0gY29kZSBjYW5ub3QgZG8gdGhhdCBmb3IgaXRzZWxmLgpwYWNrYWdlIHJpc2N2ZGVtbwoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInRpbWUiCgoJImduby5sYW5kL3AvbW91bC94L3ZtL3Jpc2N2L3YwIgoJImduby5sYW5kL3AvbW91bC94L3ZtL3Zta2l0L3YwIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvc2VxaWQvdjAiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgovLyBDYXBzLiBFdmVyeXRoaW5nIGEgY2FsbGVyIGNhbiBncm93IGlzIGJvdW5kZWQsIGJlY2F1c2UgYWxsIG9mIGl0IGlzIHN0b3JhZ2UKLy8gc29tZWJvZHkgcGF5cyBhIGRlcG9zaXQgb24uCmNvbnN0ICgKCS8vIE1heEluc3RhbmNlcyBpcyBob3cgbWFueSBwcm9ncmFtcyB0aGUgcmVhbG0ga2VlcHMgYXQgb25jZS4KCU1heEluc3RhbmNlcyA9IDY0CgkvLyBNYXhJbWFnZSBjYXBzIGFuIHVwbG9hZGVkIHRleHQgc2VnbWVudCBhdCAyLDA0OCBpbnN0cnVjdGlvbnMuCgkvLwoJLy8gVGhpcyBvbmUgaXMgbm90IGFyYml0cmFyeS4gUHJlZGVjb2RpbmcgY29zdHMgYWJvdXQgMTksNjAwIGdhcyBwZXIgd29yZAoJLy8gYW5kIGlzIHJlZG9uZSBvbiBldmVyeSByZXN1bWUsIHNvIHRoZSBpbWFnZSBzaXplIGlzIGEgdGF4IG9uIGV2ZXJ5CgkvLyB0cmFuc2FjdGlvbiB0aGF0IHRvdWNoZXMgdGhlIGluc3RhbmNlLCBub3QganVzdCB0aGUgdXBsb2FkLiA4IEtpQiB3b3JrcwoJLy8gb3V0IHRvIHJvdWdobHkgNDBNIGdhcyBwZXIgc2xpY2UgYmVmb3JlIHRoZSBndWVzdCBleGVjdXRlcyBhbnl0aGluZywKCS8vIHdoaWNoIGlzIGFib3V0IDElIG9mIGEgYmxvY2suCglNYXhJbWFnZSA9IDgxOTIKCS8vIE1heE91dHB1dCBjYXBzIHRoZSBieXRlcyBvbmUgcHJvZ3JhbSBtYXkgd3JpdGUuIFBhc3QgaXQgdGhlIGd1ZXN0IGlzCgkvLyB0cmFwcGVkIHJhdGhlciB0aGFuIHRydW5jYXRlZCwgc28gcmVuZGVyZWQgb3V0cHV0IGlzIG5ldmVyIGEgbGllLgoJTWF4T3V0cHV0ID0gNDA5NgoJLy8gTWF4SW5wdXQgY2FwcyB0aGUgY2FsbCBpbnB1dCBhIHByb2dyYW0gY2FuIGJlIGdpdmVuLgoJTWF4SW5wdXQgPSAxMDI0CgkvLyBEZWZhdWx0RnVlbCBpcyB0aGUgYnVkZ2V0IGFuIHVwbG9hZCBnZXRzIHdoZW4gaXQgYXNrcyBmb3Igbm9uZSwgYW5kIHRoZQoJLy8gc2xpY2Ugc2l6ZSBTdGVwIHVzZXMgd2hlbiBhc2tlZCBmb3Igbm9uZS4KCURlZmF1bHRGdWVsID0gMTAwMDAwCgkvLyBNYXhTbGljZUZ1ZWwgYm91bmRzIG9uZSB0cmFuc2FjdGlvbidzIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZQoJLy8gY2FsbGVyIGFza2VkIGZvciwgYW5kIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgbWVhc3VyZW1lbnQgcmF0aGVyIHRoYW4KCS8vIHBpY2tlZDogYW4gUlYzMklNIGluc3RydWN0aW9uIGNvc3RzIGFib3V0IDgsNTAwIGdhcywgc28gMTAwLDAwMCBvZiB0aGVtCgkvLyBpcyBhYm91dCA4NTBNLCBhIGxpdHRsZSB1bmRlciBhIHRoaXJkIG9mIGEgM0cgYmxvY2suIFR3aWNlIHRoaXMgd291bGQKCS8vIHN0aWxsIGJlIGEgbGVnYWwgdHJhbnNhY3Rpb24gYW5kIGEgcnVkZSBvbmUsIGFuZCBpdCB3b3VsZCBsZWF2ZSBubyByb29tCgkvLyBmb3IgdGhlIHByZWRlY29kZSBhbmQgdGhlIHJlYWxtJ3Mgb3duIHN0b3JhZ2Ugd3JpdGVzIG9uIHRvcC4KCU1heFNsaWNlRnVlbCA9IDEwMDAwMAopCgp2YXIgKAoJc3RvcmUgID0gdm1raXQuTmV3U3RvcmUoKQoJaW5wdXRzID0gYXZsLk5ld1RyZWUoKQoJaWRnZW4gIHNlcWlkLklECgljb3VudCAgaW50CikKCi8vIGhvc3QgaXMgdGhlIHJlYWxtLWJhY2tlZCBbdm1raXQuSG9zdF0uIE9uZSBpcyBidWlsdCBwZXIgY2FsbCwgd3JhcHBpbmcgdGhlCi8vIGluc3RhbmNlIGJlaW5nIHN0ZXBwZWQsIHNvIGEgZ3Vlc3QncyBvdXRwdXQgYW5kIGF1dGhvcml0eSBhcmUgc2NvcGVkIHRvIGl0Ci8vIGFuZCBub3RoaW5nIGFtYmllbnQgbGVha3MgaW4uCnR5cGUgaG9zdCBzdHJ1Y3QgewoJaW5zdCAgICAqdm1raXQuSW5zdGFuY2UKCWluICAgICAgW11ieXRlCglrdiAgICAgICphdmwuVHJlZQoJb3ZlcnJ1biBib29sIC8vIHRoZSBndWVzdCB3cm90ZSBwYXN0IE1heE91dHB1dAp9CgpmdW5jIChoICpob3N0KSBDYWxsZXIoKSBhZGRyZXNzIHsgcmV0dXJuIGguaW5zdC5Pd25lciB9CmZ1bmMgKGggKmhvc3QpIE9yaWdpbigpIGFkZHJlc3MgeyByZXR1cm4gaC5pbnN0Lk93bmVyIH0KZnVuYyAoaCAqaG9zdCkgTm93KCkgaW50NjQgICAgICB7IHJldHVybiB0aW1lLk5vdygpLlVuaXgoKSB9CmZ1bmMgKGggKmhvc3QpIEhlaWdodCgpIGludDY0ICAgeyByZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIH0KZnVuYyAoaCAqaG9zdCkgSW5wdXQoKSBbXWJ5dGUgICB7IHJldHVybiBoLmluIH0KCi8vIEdldCBhbmQgU2V0IGFyZSBzY29wZWQgdG8gdGhlIGluc3RhbmNlIGJ5IGNvbnN0cnVjdGlvbjogdGhlIHRyZWUgYmVsb25ncyB0bwovLyB0aGUgaW5zdGFuY2UgYmVpbmcgc3RlcHBlZCwgc28gb25lIHByb2dyYW0gY2Fubm90IHJlYWNoIGFub3RoZXIncyBzdG9yYWdlCi8vIGV2ZW4gdGhvdWdoIGJvdGggbGl2ZSBpbiB0aGlzIG9uZSByZWFsbS4KZnVuYyAoaCAqaG9zdCkgR2V0KGtleSBbXWJ5dGUpIFtdYnl0ZSB7Cgl2IDo9IGgua3YuR2V0KHN0cmluZyhrZXkpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXJldHVybiB2LihbXWJ5dGUpCn0KCmZ1bmMgKGggKmhvc3QpIFNldChrZXksIHZhbCBbXWJ5dGUpIHsgaC5rdi5TZXQoc3RyaW5nKGtleSksIHZhbCkgfQoKZnVuYyAoaCAqaG9zdCkgT3V0cHV0KHAgW11ieXRlKSB7CglpZiBsZW4oaC5pbnN0Lk91dHB1dCkrbGVuKHApID4gTWF4T3V0cHV0IHsKCQloLm92ZXJydW4gPSB0cnVlCgkJcmV0dXJuCgl9CgloLmluc3QuT3V0cHV0ID0gYXBwZW5kKGguaW5zdC5PdXRwdXQsIHAuLi4pCn0KCmZ1bmMgKGggKmhvc3QpIEVtaXQodHlwIHN0cmluZywga3YgLi4uc3RyaW5nKSB7IGNoYWluLkVtaXQodHlwLCBrdi4uLikgfQoKLy8gU2VuZCBpcyBuZXZlciBncmFudGVkIGhlcmUuIFRoZSBkZW1vIGZ1bmRzIG5vIGluc3RhbmNlLCBzbyBhIGd1ZXN0IHRoYXQKLy8gdHJpZXMgdG8gbW92ZSBjb2lucyBpcyByZWZ1c2VkLiBUaGF0IGlzIHRoZSBjYXBhYmlsaXR5IHJ1bGUgZG9pbmcgaXRzIGpvYiwKLy8gbm90IGEgbWlzc2luZyBmZWF0dXJlLgpmdW5jIChoICpob3N0KSBTZW5kKHRvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgZXJyb3IgeyByZXR1cm4gdm1raXQuRXJyTm90R3JhbnRlZCB9CgpmdW5jIChoICpob3N0KSBMb2cobXNnIHN0cmluZykge30KCi8vIFVwbG9hZCBzdG9yZXMgYSBoZXgtZW5jb2RlZCB0ZXh0IGltYWdlIGFzIGEgbmV3IGluc3RhbmNlIGFuZCByZXR1cm5zIGl0cyBpZC4KLy8KLy8gVGhlIGltYWdlIGlzIGxvYWRlZCBoZXJlIHJhdGhlciB0aGFuIGF0IHRoZSBmaXJzdCBTdGVwLCBzbyBhIG1pc2FsaWduZWQgb3IKLy8gb3ZlcnNpemVkIG9uZSBpcyByZWplY3RlZCBieSB0aGUgdHJhbnNhY3Rpb24gdGhhdCBzdWJtaXR0ZWQgaXQgaW5zdGVhZCBvZgovLyBjb3N0aW5nIHNvbWVib2R5IGVsc2UgdGhlIGdhcyBsYXRlci4KZnVuYyBVcGxvYWQoY3VyIHJlYWxtLCBoZXhJbWFnZSwgaW5wdXQgc3RyaW5nLCBidWRnZXQgaW50NjQpIHN0cmluZyB7CglpbWcsIG9rIDo9IGRlY29kZUhleChoZXhJbWFnZSkKCWlmICFvayB7CgkJcGFuaWMoInJpc2N2ZGVtbzogaW1hZ2UgaXMgbm90IHZhbGlkIGhleCIpCgl9CglyZXR1cm4gdXBsb2FkKGltZywgaW5wdXQsIGJ1ZGdldCkKfQoKLy8gVXBsb2FkU2FtcGxlIHN0b3JlcyBvbmUgb2YgdGhlIHByb2dyYW1zIHRoZSBmcm9udCBwYWdlIG9mZmVycy4gV3JpdGluZyBSVjMySU0KLy8gYnkgaGFuZCBpcyBub3QgdGhlIHBvaW50IG9mIHRoaXMgcmVhbG0sIGFuZCB3aXRob3V0IHRoaXMgbm9ib2R5IHdpdGhvdXQgYQovLyBjcm9zcyBjb21waWxlciBjb3VsZCBwcmVzcyBhIGJ1dHRvbi4KZnVuYyBVcGxvYWRTYW1wbGUoY3VyIHJlYWxtLCBuYW1lLCBpbnB1dCBzdHJpbmcsIGJ1ZGdldCBpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc2FtcGxlQnlOYW1lKG5hbWUpCglpZiBzID09IG5pbCB7CgkJcGFuaWMoInJpc2N2ZGVtbzogbm8gc3VjaCBzYW1wbGUiKQoJfQoJLy8gQSBzYW1wbGUgY2FycmllcyBpdHMgb3duIGJ1ZGdldCBiZWNhdXNlIHRoZSBkZWZhdWx0IGlzIGEgdG90YWwsIG5vdCBhCgkvLyBzbGljZTogdGhlIGhlYXZ5IGxvb3AgbmVlZHMgMjAwLDAwNiBpbnN0cnVjdGlvbnMsIGFuZCBvZmZlcmluZyBhIGJ1dHRvbgoJLy8gdGhhdCBydW5zIG91dCBvZiBmdWVsIGhhbGZ3YXkgaXMgYSB3b3JzZSBkZW1vIHRoYW4gbm8gYnV0dG9uLgoJaWYgYnVkZ2V0IDw9IDAgewoJCWJ1ZGdldCA9IHMuYnVkZ2V0Cgl9CglyZXR1cm4gdXBsb2FkKHMuaW1hZ2UoKSwgaW5wdXQsIGJ1ZGdldCkKfQoKZnVuYyB1cGxvYWQoaW1nIFtdYnl0ZSwgaW5wdXQgc3RyaW5nLCBidWRnZXQgaW50NjQpIHN0cmluZyB7CglpZiBjb3VudCA+PSBNYXhJbnN0YW5jZXMgewoJCXBhbmljKCJyaXNjdmRlbW86IHRvbyBtYW55IGluc3RhbmNlcywgcmVtb3ZlIG9uZSBmaXJzdCIpCgl9CglpZiBsZW4oaW5wdXQpID4gTWF4SW5wdXQgewoJCXBhbmljKCJyaXNjdmRlbW86IGlucHV0IHRvbyBsb25nIikKCX0KCWlmIGxlbihpbWcpID09IDAgewoJCXBhbmljKCJyaXNjdmRlbW86IGVtcHR5IGltYWdlIikKCX0KCWlmIGxlbihpbWcpID4gTWF4SW1hZ2UgewoJCXBhbmljKCJyaXNjdmRlbW86IGltYWdlIHRvbyBsYXJnZSIpCgl9CgkvLyBMb2FkaW5nIGl0IG5vdyBpcyB0aGUgdmFsaWRhdGlvbjogTmV3TWFjaGluZSBpcyB3aGF0IHJlamVjdHMgYW4gaW1hZ2UKCS8vIHRoYXQgaXMgbm90IGEgd2hvbGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucy4KCWlmIF8sIGVyciA6PSByaXNjdi5OZXdNYWNoaW5lKGltZywgcmlzY3YuRGVmYXVsdEVudHJ5KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoInJpc2N2ZGVtbzogIiArIGVyci5FcnJvcigpKQoJfQoJaWYgYnVkZ2V0IDw9IDAgewoJCWJ1ZGdldCA9IERlZmF1bHRGdWVsCgl9CgoJaWQgOj0gaWRnZW4uTmV4dCgpLlN0cmluZygpCglvd25lciA6PSB1bnNhZmUuUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQoJc3RvcmUuU2V0KHZta2l0Lk5ld0luc3RhbmNlKGlkLCBvd25lciwgcmlzY3YuVk1OYW1lLCBpbWcsIGJ1ZGdldCkpCglpZiBpbnB1dCAhPSAiIiB7CgkJaW5wdXRzLlNldChpZCwgaW5wdXQpCgl9Cgljb3VudCsrCgoJY2hhaW4uRW1pdCgicmlzY3ZfdXBsb2FkIiwgImlkIiwgaWQsICJieXRlcyIsIHVmbXQuU3ByaW50ZigiJWQiLCBsZW4oaW1nKSkpCglyZXR1cm4gaWQKfQoKLy8gU3RlcCBydW5zIG9uZSBzbGljZSBvZiB0aGUgaW5zdGFuY2U6IHVwIHRvIGBmdWVsYCBndWVzdCBpbnN0cnVjdGlvbnMsIHRoZW4KLy8gc3RvcCBhbmQga2VlcCB0aGUgc25hcHNob3QuIEFueW9uZSBtYXkgcGF5IGZvciBhIHNsaWNlLCBub3Qgb25seSB0aGUgb3duZXI6Ci8vIGEgcGF1c2VkIHByb2dyYW0gdGhhdCBvbmx5IGl0cyBvd25lciBjYW4gYWR2YW5jZSBpcyBhIHdvcnNlIGRlbW8gYW5kIG5vCi8vIHNhZmVyLCBzaW5jZSB0aGUgcHJvZ3JhbSBhbmQgaXRzIGJ1ZGdldCB3ZXJlIGJvdGggZml4ZWQgYXQgdXBsb2FkLgpmdW5jIFN0ZXAoY3VyIHJlYWxtLCBpZCBzdHJpbmcsIGZ1ZWwgaW50NjQpIHN0cmluZyB7CglpbnN0IDo9IHN0b3JlLkdldChpZCkKCWlmIGluc3QgPT0gbmlsIHsKCQlwYW5pYygicmlzY3ZkZW1vOiBubyBzdWNoIGluc3RhbmNlIikKCX0KCWlmIGluc3QuU3RhdHVzICE9IHZta2l0LlJ1bm5pbmcgewoJCXBhbmljKCJyaXNjdmRlbW86IGluc3RhbmNlIGlzICIgKyBpbnN0LlN0YXR1cy5TdHJpbmcoKSkKCX0KCWlmIGZ1ZWwgPD0gMCB7CgkJZnVlbCA9IERlZmF1bHRGdWVsCgl9CglpZiBmdWVsID4gTWF4U2xpY2VGdWVsIHsKCQlmdWVsID0gTWF4U2xpY2VGdWVsCgl9CgoJbSwgZXJyIDo9IHJpc2N2Lk5ld01hY2hpbmUoaW5zdC5Qcm9ncmFtLCByaXNjdi5EZWZhdWx0RW50cnkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygicmlzY3ZkZW1vOiAiICsgZXJyLkVycm9yKCkpCgl9CgloIDo9ICZob3N0e2luc3Q6IGluc3QsIGluOiBbXWJ5dGUoaW5wdXRPZihpZCkpLCBrdjogYXZsLk5ld1RyZWUoKX0KCWlmIGVyciA6PSBpbnN0LlJ1bihtLCBoLCBmdWVsKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoInJpc2N2ZGVtbzogIiArIGVyci5FcnJvcigpKQoJfQoJaWYgaC5vdmVycnVuIHsKCQlpbnN0LlN0YXR1cyA9IHZta2l0LlRyYXBwZWQKCQlpbnN0LlRyYXAgPSAib3V0cHV0IGxpbWl0IHJlYWNoZWQiCgl9CgoJY2hhaW4uRW1pdCgicmlzY3Zfc3RlcCIsCgkJImlkIiwgaWQsCgkJInN0YXR1cyIsIGluc3QuU3RhdHVzLlN0cmluZygpLAoJCSJmdWVsIiwgdWZtdC5TcHJpbnRmKCIlZCIsIGluc3QuRnVlbFVzZWQpLAoJKQoJcmV0dXJuIGluc3QuU3RhdHVzLlN0cmluZygpCn0KCi8vIFJlbW92ZSBkZWxldGVzIGFuIGluc3RhbmNlLiBPd25lciBvbmx5LgpmdW5jIFJlbW92ZShjdXIgcmVhbG0sIGlkIHN0cmluZykgewoJaW5zdCA6PSBzdG9yZS5HZXQoaWQpCglpZiBpbnN0ID09IG5pbCB7CgkJcGFuaWMoInJpc2N2ZGVtbzogbm8gc3VjaCBpbnN0YW5jZSIpCgl9CglpZiBpbnN0Lk93bmVyICE9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpIHsKCQlwYW5pYygicmlzY3ZkZW1vOiBub3QgeW91ciBpbnN0YW5jZSIpCgl9CglzdG9yZS5SZW1vdmUoaWQpCglpbnB1dHMuUmVtb3ZlKGlkKQoJY291bnQtLQp9CgpmdW5jIGlucHV0T2YoaWQgc3RyaW5nKSBzdHJpbmcgewoJdiA6PSBpbnB1dHMuR2V0KGlkKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHYuKHN0cmluZykKfQoKLy8gZGVjb2RlSGV4IGFjY2VwdHMgdGhlIG91dHB1dCBvZiBhbnkgaGV4ZHVtcDogYW4gZXZlbiBudW1iZXIgb2YgaGV4IGRpZ2l0cywKLy8gd2l0aCBhbiBvcHRpb25hbCAweCBwcmVmaXgsIGFuZCB3aGl0ZXNwYWNlIGFueXdoZXJlLiBXaGl0ZXNwYWNlIGlzIGFsbG93ZWQKLy8gYmVjYXVzZSB0aGF0IGlzIHdoYXQgYSBwYXN0ZWQgaGV4ZHVtcCBoYXMgaW4gaXQ7IGFueXRoaW5nIGVsc2UgaXMgcmVmdXNlZCwKLy8gYmVjYXVzZSBhIHNpbGVudGx5IG1hbmdsZWQgaW1hZ2Ugd291bGQgdHJhcCBzb21ld2hlcmUgdW5yZWxhdGVkIGxhdGVyLgpmdW5jIGRlY29kZUhleChzIHN0cmluZykgKFtdYnl0ZSwgYm9vbCkgewoJaWYgbGVuKHMpID49IDIgJiYgc1swXSA9PSAnMCcgJiYgKHNbMV0gPT0gJ3gnIHx8IHNbMV0gPT0gJ1gnKSB7CgkJcyA9IHNbMjpdCgl9CglkaWdpdHMgOj0gbWFrZShbXWJ5dGUsIDAsIGxlbihzKSkKCWZvciBpIDo9IDA7IGkgPCBsZW4ocyk7IGkrKyB7CgkJYyA6PSBzW2ldCgkJaWYgYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgewoJCQljb250aW51ZQoJCX0KCQl2LCBvayA6PSBoZXhWYWwoYykKCQlpZiAhb2sgewoJCQlyZXR1cm4gbmlsLCBmYWxzZQoJCX0KCQlkaWdpdHMgPSBhcHBlbmQoZGlnaXRzLCB2KQoJfQoJaWYgbGVuKGRpZ2l0cykgPT0gMCB8fCBsZW4oZGlnaXRzKSUyICE9IDAgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9CglvdXQgOj0gbWFrZShbXWJ5dGUsIGxlbihkaWdpdHMpLzIpCglmb3IgaSA6PSAwOyBpIDwgbGVuKG91dCk7IGkrKyB7CgkJb3V0W2ldID0gZGlnaXRzW2kqMl08PDQgfCBkaWdpdHNbaSoyKzFdCgl9CglyZXR1cm4gb3V0LCB0cnVlCn0KCmZ1bmMgaGV4VmFsKGMgYnl0ZSkgKGJ5dGUsIGJvb2wpIHsKCXN3aXRjaCB7CgljYXNlIGMgPj0gJzAnICYmIGMgPD0gJzknOgoJCXJldHVybiBjIC0gJzAnLCB0cnVlCgljYXNlIGMgPj0gJ2EnICYmIGMgPD0gJ2YnOgoJCXJldHVybiBjIC0gJ2EnICsgMTAsIHRydWUKCWNhc2UgYyA+PSAnQScgJiYgYyA8PSAnRic6CgkJcmV0dXJuIGMgLSAnQScgKyAxMCwgdHJ1ZQoJfQoJcmV0dXJuIDAsIGZhbHNlCn0KGrovChJyaXNjdmRlbW9fdGVzdC5nbm8Soy9wYWNrYWdlIHJpc2N2ZGVtbwoKaW1wb3J0ICgKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbW91bC94L3ZtL3Jpc2N2L3YwIgoJImduby5sYW5kL3AvbW91bC94L3ZtL3Zta2l0L3YwIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvc2VxaWQvdjAiCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgovLyByZXNldFN0YXRlIHB1dHMgdGhlIHJlYWxtIGdsb2JhbHMgYmFjayB3aGVyZSBpbml0KCkgbGVmdCB0aGVtLiBSZWFsbSBzdGF0ZQovLyBwZXJzaXN0cyBmb3IgdGhlIHdob2xlIHRlc3QgYmluYXJ5LCBzbyBldmVyeSB0ZXN0IHRoYXQgYXNzZXJ0cyBvbiBpZHMgb3Igb24KLy8gdGhlIHJlbmRlcmVkIGluc3RhbmNlIGxpc3QgaGFzIHRvIHN0YXJ0IGZyb20gaGVyZS4KZnVuYyByZXNldFN0YXRlKCkgewoJc3RvcmUgPSB2bWtpdC5OZXdTdG9yZSgpCglpbnB1dHMgPSBhdmwuTmV3VHJlZSgpCglpZGdlbiA9IHNlcWlkLklEKDApCgljb3VudCA9IDAKfQoKZnVuYyBhbGljZSgpIGFkZHJlc3MgeyByZXR1cm4gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhbGljZSIpIH0KCmZ1bmMgVGVzdFVwbG9hZEFuZFJ1blRvQ29tcGxldGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKCkpKQoKCWlkIDo9IFVwbG9hZFNhbXBsZShjcm9zcyhjdXIpLCAiaGVsbG8iLCAiIiwgMCkKCXVhc3NlcnQuRXF1YWwodCwgImhhbHRlZCIsIFN0ZXAoY3Jvc3MoY3VyKSwgaWQsIDApKQoKCWluc3QgOj0gc3RvcmUuR2V0KGlkKQoJdWFzc2VydC5FcXVhbCh0LCAiSGVsbG8sIGduby5sYW5kXG4iLCBzdHJpbmcoaW5zdC5PdXRwdXQpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgaW5zdC5TbGljZXMpCgl1YXNzZXJ0LkVxdWFsKHQsIGFsaWNlKCksIGluc3QuT3duZXIpCgl1YXNzZXJ0LkVxdWFsKHQsICJyaXNjdjMyaW0iLCBpbnN0LlZNKQp9CgovLyBFdmVyeSBzYW1wbGUgb24gdGhlIGZyb250IHBhZ2UgaGFzIHRvIHJlYWNoIGl0cyBkb2N1bWVudGVkIGFuc3dlciwgb3IgdGhlCi8vIHBhZ2Ugb2ZmZXJzIGEgYnV0dG9uIHRoYXQgdHJhcHMgd2hlbiBwcmVzc2VkLiBUaGUgd29yZHMgYXJlIGFzc2VtYmxlZAovLyBvdXRzaWRlIHRoaXMgcmVwbywgc28gdGhpcyBpcyB0aGUgdGVzdCB0aGF0IGNhdGNoZXMgYSBtaXN0eXBlZCBvbmUuCmZ1bmMgVGVzdEV2ZXJ5U2FtcGxlUmVhY2hlc0l0c0Fuc3dlcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKCkpKQoKCWNhc2VzIDo9IFtdc3RydWN0IHsKCQlzbHVnICAgc3RyaW5nCgkJcmVnICAgIGludAoJCXdhbnQgICB1aW50MzIKCQlvdXRwdXQgc3RyaW5nCgl9ewoJCXsiaGVsbG8iLCAwLCAwLCAiSGVsbG8sIGduby5sYW5kXG4ifSwKCQl7InN1bTEwMCIsIDUsIDUwNTAsICIifSwKCQl7ImhlYXZ5IiwgNSwgMTI1MDAyNTAwMCwgIiJ9LAoJCXsibWV4dCIsIDUsIDMwMDAwMDAwMjEsICIifSwKCQl7ImNsYW5nIiwgMCwgMCwgImZiN2ZmYmEwIn0sCgkJeyJsZWRnZXIiLCAwLCAwLCAiYWxpY2UgNzBcbmJvYiA4MFxuIn0sCgl9Cglmb3IgXywgYyA6PSByYW5nZSBjYXNlcyB7CgkJaWQgOj0gVXBsb2FkU2FtcGxlKGNyb3NzKGN1ciksIGMuc2x1Zywgc2FtcGxlQnlOYW1lKGMuc2x1ZykuaW5wdXQsIDApCgkJc3RhdHVzIDo9ICIiCgkJZm9yIGkgOj0gMDsgaSA8IDIwOyBpKysgewoJCQlzdGF0dXMgPSBTdGVwKGNyb3NzKGN1ciksIGlkLCAwKQoJCQlpZiBzdGF0dXMgIT0gInJ1bm5pbmciIHsKCQkJCWJyZWFrCgkJCX0KCQl9CgkJdWFzc2VydC5FcXVhbCh0LCAiaGFsdGVkIiwgc3RhdHVzLCBjLnNsdWcrIiBtdXN0IGhhbHQiKQoJCWluc3QgOj0gc3RvcmUuR2V0KGlkKQoJCXVhc3NlcnQuRXF1YWwodCwgYy5vdXRwdXQsIHN0cmluZyhpbnN0Lk91dHB1dCksIGMuc2x1ZysiIG91dHB1dCIpCgkJaWYgYy5yZWcgIT0gMCB7CgkJCXZhciBtIHJpc2N2Lk1hY2hpbmUKCQkJdWFzc2VydC5Ob0Vycm9yKHQsIG0uUmVzdG9yZShpbnN0LlNuYXBzaG90KSkKCQkJdWFzc2VydC5FcXVhbCh0LCB1aW50NjQoYy53YW50KSwgdWludDY0KG0uUmVnaXN0ZXJzKClbYy5yZWddKSwgYy5zbHVnKyIgcmVzdWx0IikKCQl9Cgl9Cn0KCi8vIFRlc3RPbmVQcm9ncmFtQWNyb3NzTWFueVRyYW5zYWN0aW9ucyBpcyB3aGF0IHRoZSByZWFsbSBleGlzdHMgdG8KLy8gZGVtb25zdHJhdGU6IHRoZSBzYW1lIGNvbXB1dGF0aW9uLCBmaW5pc2hlZCBvdmVyIHNldmVyYWwgY2FsbHMsIGVhY2ggcGF5aW5nCi8vIGZvciBpdHMgb3duIHNsaWNlLgpmdW5jIFRlc3RPbmVQcm9ncmFtQWNyb3NzTWFueVRyYW5zYWN0aW9ucyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKCkpKQoKCWlkIDo9IFVwbG9hZFNhbXBsZShjcm9zcyhjdXIpLCAiaGVhdnkiLCAiIiwgMCkKCXN0YXR1cyA6PSAiIgoJZm9yIGkgOj0gMDsgaSA8IDUwOyBpKysgewoJCXN0YXR1cyA9IFN0ZXAoY3Jvc3MoY3VyKSwgaWQsIDgwMDAwKQoJCWlmIHN0YXR1cyAhPSAicnVubmluZyIgewoJCQlicmVhawoJCX0KCX0KCWluc3QgOj0gc3RvcmUuR2V0KGlkKQoJdWFzc2VydC5FcXVhbCh0LCAiaGFsdGVkIiwgc3RhdHVzKQoJdWFzc2VydC5UcnVlKHQsIGluc3QuU2xpY2VzID4gMSwgImEgMjAwayBpbnN0cnVjdGlvbiBwcm9ncmFtIG11c3Qgbm90IGZpbmlzaCBpbiBvbmUgc2xpY2UiKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgyMDAwMDYpLCBpbnN0LkZ1ZWxVc2VkKQp9CgpmdW5jIFRlc3RVcGxvYWRUYWtlc0hleChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKCkpKQoKCS8vIGFkZGkgYTcsIHplcm8sIDkzIDsgZWNhbGwKCWlkIDo9IFVwbG9hZChjcm9zcyhjdXIpLCAiMHg5MzA4ZDAwNSA3MzAwMDAwMCIsICIiLCAwKQoJXyA9IGlkCn0KCmZ1bmMgVGVzdFVwbG9hZFJlamVjdHNCYWRJbWFnZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSgpKSkKCgkvLyBDYWxsZWQgd2l0aG91dCBjcm9zcygpOiBhIHBhbmljIHJhaXNlZCB0aHJvdWdoIGEgY3Jvc3NpbmcgY2FsbCBjYW5ub3QgYmUKCS8vIHJlY292ZXJlZCwgc28gdWFzc2VydCB3b3VsZCBuZXZlciBzZWUgaXQuCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInJpc2N2ZGVtbzogaW1hZ2UgaXMgbm90IHZhbGlkIGhleCIsIGZ1bmMoKSB7CgkJVXBsb2FkKGN1ciwgInp6enoiLCAiIiwgMCkKCX0pCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInJpc2N2ZGVtbzogaW1hZ2UgaXMgbm90IHZhbGlkIGhleCIsIGZ1bmMoKSB7CgkJVXBsb2FkKGN1ciwgImFiYyIsICIiLCAwKQoJfSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAicmlzY3ZkZW1vOiBubyBzdWNoIHNhbXBsZSIsIGZ1bmMoKSB7CgkJVXBsb2FkU2FtcGxlKGN1ciwgIm5vcGUiLCAiIiwgMCkKCX0pCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkicmlzY3ZkZW1vOiByaXNjdjogaW1hZ2UgbGVuZ3RoIGlzIG5vdCBhIHdob2xlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMiLAoJCWZ1bmMoKSB7IFVwbG9hZChjdXIsICIwMDExIiwgIiIsIDApIH0pCn0KCmZ1bmMgVGVzdERlY29kZUhleCh0ICp0ZXN0aW5nLlQpIHsKCWIsIG9rIDo9IGRlY29kZUhleCgiMHhERUFEYmVlZiIpCgl1YXNzZXJ0LlRydWUodCwgb2spCgl1YXNzZXJ0LkVxdWFsKHQsIDQsIGxlbihiKSkKCXVhc3NlcnQuRXF1YWwodCwgdWludDY0KDB4REUpLCB1aW50NjQoYlswXSkpCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQ2NCgweEVGKSwgdWludDY0KGJbM10pKQoKCV8sIG9rID0gZGVjb2RlSGV4KCIiKQoJdWFzc2VydC5GYWxzZSh0LCBvaykKCV8sIG9rID0gZGVjb2RlSGV4KCIweCIpCgl1YXNzZXJ0LkZhbHNlKHQsIG9rKQoJLy8gV2hpdGVzcGFjZSBpcyBza2lwcGVkLCBiZWNhdXNlIGEgcGFzdGVkIGhleGR1bXAgaGFzIGl0LgoJYiwgb2sgPSBkZWNvZGVIZXgoIjAwIDExXG4yMlx0MzMiKQoJdWFzc2VydC5UcnVlKHQsIG9rKQoJdWFzc2VydC5FcXVhbCh0LCA0LCBsZW4oYikpCgkvLyBBbiBvZGQgbnVtYmVyIG9mIGRpZ2l0cyBpcyBzdGlsbCBhIHJlZnVzYWwsIHdoaXRlc3BhY2Ugb3Igbm90LgoJXywgb2sgPSBkZWNvZGVIZXgoIjAwIDEiKQoJdWFzc2VydC5GYWxzZSh0LCBvaykKfQoKZnVuYyBUZXN0UmVuZGVySG9tZU9mZmVyc0V2ZXJ5U2FtcGxlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCW91dCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJSVjMySU0sIG9uIGNoYWluIiksICJ0aGUgdGl0bGUiKQoJZm9yIF8sIHMgOj0gcmFuZ2Ugc2FtcGxlcyB7CgkJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCBzLm5hbWUpLCAiaG9tZSBtdXN0IG9mZmVyICIrcy5zbHVnKQoJfQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiTm8gaW5zdGFuY2VzIHlldCIpLCAidGhlIGVtcHR5IHN0YXRlIikKfQoKLy8gVGhlIHJlZ2lzdGVyIGZpbGUgaXMgdGhlIGludGVyZXN0aW5nIGhhbGYgb2YgdGhpcyBWTTogYSBwcm9ncmFtIHRoYXQgd3JpdGVzCi8vIG5vdGhpbmcgc3RpbGwgY29tcHV0ZWQgc29tZXRoaW5nLCBhbmQgdGhlIHNuYXBzaG90IGlzIHRoZSBvbmx5IHBsYWNlIGl0IGlzCi8vIGxlZ2libGUgYmV0d2VlbiB0cmFuc2FjdGlvbnMuCmZ1bmMgVGVzdFJlbmRlckluc3RhbmNlU2hvd3NUaGVSZWdpc3RlckZpbGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSgpKSkKCglpZCA6PSBVcGxvYWRTYW1wbGUoY3Jvc3MoY3VyKSwgInN1bTEwMCIsICIiLCAwKQoJU3RlcChjcm9zcyhjdXIpLCBpZCwgMCkKCglvdXQgOj0gUmVuZGVyKCIvIiArIGlkKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiIyMgUmVnaXN0ZXJzIiksICJ0aGUgc2VjdGlvbiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICI1MDUwIiksICJ0MCBtdXN0IHNob3cgdGhlIGFuc3dlciIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJoYWx0ZWQiKSwgInRoZSBzdGF0dXMiKQp9CgpmdW5jIFRlc3RSZW5kZXJVbmtub3duSW5zdGFuY2UodCAqdGVzdGluZy5UKSB7Cgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoIi9ub3BlIiksICJObyBzdWNoIGluc3RhbmNlIikpCn0KCi8vIEV4YW1wbGVSZW5kZXIgcGlucyB0aGUgcmVhbG0ncyBvdXRwdXQgZm9yIGEgcGF0aCB3aG9zZSBjb250ZW50IGNhbm5vdCBkcmlmdAovLyB3aXRoIHRoZSBpbnN0YW5jZSBsaXN0LiBUaGUgaG9tZSBwYWdlIGFuZCB0aGUgaW5zdGFuY2UgcGFnZSBib3RoIHByb2R1Y2UKLy8gY29uc2VjdXRpdmUgYmxhbmsgbGluZXMsIHdoaWNoIGFuIGV4YW1wbGUgYmxvY2sgY2Fubm90IHJlcHJlc2VudCwgc28gdGhleQovLyBhcmUgYXNzZXJ0ZWQgaW4gdGhlIHRlc3RzIGFib3ZlIGluc3RlYWQuCmZ1bmMgRXhhbXBsZVJlbmRlcigpIHsKCXByaW50KFJlbmRlcigiL21pc3NpbmciKSkKCS8vIE91dHB1dDoKCS8vICMgSW5zdGFuY2UgbWlzc2luZwoJLy8KCS8vIFvihpAgYWxsIGluc3RhbmNlc10oL3IvbW91bC94L3ZtL3Jpc2N2ZGVtby92MCkKCS8vCgkvLyAqKk5vIHN1Y2ggaW5zdGFuY2UuKiogSXQgd2FzIG5ldmVyIHVwbG9hZGVkLCBvciBpdHMgb3duZXIgcmVtb3ZlZCBpdC4KfQoa/iwKC3NhbXBsZXMuZ25vEu4scGFja2FnZSByaXNjdmRlbW8KCmltcG9ydCAiZ25vLmxhbmQvcC9tb3VsL3gvdm0vcmlzY3YvdjAiCgovLyBUaGUgcHJvZ3JhbXMgdGhlIGZyb250IHBhZ2Ugb2ZmZXJzLCBhcyB0aGUgbWFjaGluZSB3b3JkcyBhIGNyb3NzIGNvbXBpbGVyCi8vIHdvdWxkIGhhdmUgZW1pdHRlZC4gVGhleSBhcmUgYXNzZW1ibGVkIG91dHNpZGUgdGhpcyByZXBvIGFuZCBwaW5uZWQgaGVyZSwKLy8gYW5kIHJpc2N2ZGVtb190ZXN0LmdubyBydW5zIGV2ZXJ5IG9uZSBvZiB0aGVtIHRvIHRoZSBleHBlY3RlZCBhbnN3ZXIsIHNvIGEKLy8gd3Jvbmcgd29yZCBpcyBhIGZhaWxpbmcgdGVzdCByYXRoZXIgdGhhbiBhIHBhZ2UgdGhhdCB0cmFwcyB3aGVuIGNsaWNrZWQuCnR5cGUgc2FtcGxlIHN0cnVjdCB7CglzbHVnICAgc3RyaW5nIC8vIHdoYXQgVXBsb2FkU2FtcGxlIHRha2VzOiBzaG9ydCwgbm8gcHVuY3R1YXRpb24sIHN0YWJsZQoJbmFtZSAgIHN0cmluZwoJYnVkZ2V0IGludDY0IC8vIHRoZSBpbnN0YW5jZSdzIHRvdGFsIGluc3RydWN0aW9uIGJ1ZGdldCwgbm90IHRoZSBzbGljZQoKCS8vIGJ1aWx0aW4gbmFtZXMgYW4gaW1hZ2UgdGhlIGxpYnJhcnkgc2hpcHMgY29tcGlsZWQsIGluc3RlYWQgb2YgdGhlIHdvcmRzCgkvLyBiZWxvdy4gRW1wdHkgbWVhbnMgdGhlIHdvcmRzIGFyZSB0aGUgcHJvZ3JhbS4KCWJ1aWx0aW4gc3RyaW5nCgl3b3JkcyBbXXVpbnQzMgoJaW5wdXQgc3RyaW5nCglub3RlICBzdHJpbmcKCWFzbSAgIHN0cmluZwp9Cgp2YXIgc2FtcGxlcyA9IFtdc2FtcGxlewoJewoJCXNsdWc6ICJoZWxsbyIsCgkJbmFtZTogIkhlbGxvLCBnbm8ubGFuZCIsCgkJd29yZHM6IFtddWludDMyewoJCQkweDAwMTAwNTEzLCAweDAwMDAxNUI3LCAweDAyMDU4NTkzLCAweDAxMDAwNjEzLAoJCQkweDA0MDAwODkzLCAweDAwMDAwMDczLCAweDA1RDAwODkzLCAweDAwMDAwMDczLAoJCQkweDZDNkM2NTQ4LCAweDY3MjAyQzZGLCAweDZDMkU2RjZFLCAweDBBNjQ2RTYxLAoJCX0sCgkJYnVkZ2V0OiAxMDAwLAoJCW5vdGU6ICJFaWdodCBpbnN0cnVjdGlvbnMgYW5kIGEgc3RyaW5nIGNvbnN0YW50LiBUaGUgd3JpdGUgc3lzY2FsbCByZWFkcyAiICsKCQkJInRoZSBieXRlcyBzdHJhaWdodCBvdXQgb2YgdGhlIHRleHQgc2VnbWVudCBhbmQgaGFuZHMgdGhlbSB0byBIb3N0Lk91dHB1dC4iLAoJCWFzbTogYGFkZGkgYTAsIHplcm8sIDEgICAgICAgICAgIyBmZApsdWkgIGExLCAweDEwMDAgICAgICAgICAgICMgYnVmCmFkZGkgYTEsIGExLCAweDIwCmFkZGkgYTIsIHplcm8sIDE2ICAgICAgICAgIyBsZW4KYWRkaSBhNywgemVybywgNjQgICAgICAgICAjIHdyaXRlCmVjYWxsCmFkZGkgYTcsIHplcm8sIDkzICAgICAgICAgIyBleGl0CmVjYWxsCi5hc2NpaSAiSGVsbG8sIGduby5sYW5kXG4iYCwKCX0sCgl7CgkJc2x1ZzogInN1bTEwMCIsCgkJbmFtZTogIlN1bSAxIHRvIDEwMCIsCgkJd29yZHM6IFtddWludDMyewoJCQkweDA2NDAwNDEzLCAweDAwMDAwMjkzLCAweDAwMDAwMzEzLCAweDAwMTMwMzEzLAoJCQkweDAwNjI4MkIzLCAweEZFODMxQ0UzLCAweDA1RDAwODkzLCAweDAwMDAwMDczLAoJCX0sCgkJYnVkZ2V0OiAxMDAwLAoJCW5vdGU6ICJBIHJlYWwgbG9vcCwgMzAzIGluc3RydWN0aW9ucy4gV3JpdGVzIG5vdGhpbmc6IHRoZSBhbnN3ZXIgaXMgaW4gdDAsICIgKwoJCQkiYW5kIHRoZSBpbnN0YW5jZSBwYWdlIHNob3dzIHRoZSByZWdpc3RlciBmaWxlLiIsCgkJYXNtOiBgYWRkaSBzMCwgemVybywgMTAwCmFkZGkgdDAsIHplcm8sIDAKYWRkaSB0MSwgemVybywgMApsb29wOgphZGRpIHQxLCB0MSwgMQphZGQgIHQwLCB0MCwgdDEKYm5lICB0MSwgczAsIGxvb3AKYWRkaSBhNywgemVybywgOTMKZWNhbGxgLAoJfSwKCXsKCQlzbHVnOiAiaGVhdnkiLAoJCW5hbWU6ICJIZWF2eSBsb29wIiwKCQl3b3JkczogW111aW50MzJ7CgkJCTB4MDAwMEM0MzcsIDB4MzUwNDA0MTMsIDB4MDAwMDAyOTMsIDB4MDAwMDAzMTMsCgkJCTB4MDAxMzAzMTMsIDB4MDA2MjgyQjMsIDB4MDAwMDAzOTMsIDB4RkU4MzFBRTMsCgkJCTB4MDVEMDA4OTMsIDB4MDAwMDAwNzMsCgkJfSwKCQlidWRnZXQ6IDI1MDAwMCwKCQlub3RlOiAiMjAwLDAwNiBpbnN0cnVjdGlvbnMsIGZvdXIgcGVyIGl0ZXJhdGlvbi4gQXQgdGhlIGxhcmdlc3Qgc2xpY2UgdGhpcyByZWFsbSAiICsKCQkJImFsbG93cyBpdCB0YWtlcyB0aHJlZSB0cmFuc2FjdGlvbnMgdG8gZmluaXNoLCB3aGljaCBpcyB0aGUgdGhpbmcgaXQgZXhpc3RzIHRvIHNob3cuIiwKCQlhc206IGBsdWkgIHMwLCAweGMwMDAgICAgICAgICAgICMgczAgPSA1MDAwMAphZGRpIHMwLCBzMCwgMHgzNTAKYWRkaSB0MCwgemVybywgMAphZGRpIHQxLCB6ZXJvLCAwCmxvb3A6CmFkZGkgdDEsIHQxLCAxCmFkZCAgdDAsIHQwLCB0MQphZGRpIHQyLCB6ZXJvLCAwCmJuZSAgdDEsIHMwLCBsb29wCmFkZGkgYTcsIHplcm8sIDkzCmVjYWxsYCwKCX0sCgl7CgkJc2x1ZzogIm1leHQiLAoJCW5hbWU6ICJNdWx0aXBseSBhbmQgZGl2aWRlIiwKCQl3b3JkczogW111aW50MzJ7CgkJCTB4M0I5QUQyQjcsIDB4QTA3MjgyOTMsIDB4MDAzMDAzMTMsIDB4MDI2MjgyQjMsCgkJCTB4MDA3MDAzOTMsIDB4MDI3MkQzMzMsIDB4MDVEMDA4OTMsIDB4MDAwMDAwNzMsCgkJfSwKCQlidWRnZXQ6IDEwMDAsCgkJbm90ZTogIlRoZSBNIGV4dGVuc2lvbi4gdDAgPSAxMDAwMDAwMDA3ICogMyB0cnVuY2F0ZWQgdG8gMzIgYml0cywgdGhlbiB0MSA9IHQwIC8gNy4gIiArCgkJCSJEaXZpc2lvbiBieSB6ZXJvIGFuZCB0aGUgb25lIHNpZ25lZCBvdmVyZmxvdyBjYXNlIHJldHVybiB2YWx1ZXMgaGVyZSAiICsKCQkJInJhdGhlciB0aGFuIHRyYXBwaW5nLCB3aGljaCBpcyB3aGF0IHRoZSBzcGVjIHNheXMgYW5kIHdoYXQgYSBjaGFpbiBuZWVkcy4iLAoJCWFzbTogYGx1aSAgdDAsIDB4M2I5YWQwMDAgICAgICAgIyB0MCA9IDEwMDAwMDAwMDcKYWRkaSB0MCwgdDAsIC0xNTI5CmFkZGkgdDEsIHplcm8sIDMKbXVsICB0MCwgdDAsIHQxCmFkZGkgdDIsIHplcm8sIDcKZGl2dSB0MSwgdDAsIHQyCmFkZGkgYTcsIHplcm8sIDkzCmVjYWxsYCwKCX0sCgl7CgkJc2x1ZzogICAiY2xhbmciLAoJCW5hbWU6ICAgIkNvbXBpbGVkIGJ5IGNsYW5nIiwKCQlpbnB1dDogICJnbm8ubGFuZCIsCgkJYnVkZ2V0OiAyMDAwMCwKCQlub3RlOiAiTm90IHdyaXR0ZW4gZm9yIGdubyBhbmQgbm90IHdyaXR0ZW4gYnkgaGFuZDogYSBmcmVlc3RhbmRpbmcgQyBwcm9ncmFtLCAiICsKCQkJImNvbXBpbGVkIGJ5IGNsYW5nIGZvciByaXNjdjMyaW0gYW5kIHNoaXBwZWQgYXMgdGhlIGJ5dGVzIExMVk0gZW1pdHRlZC4gSXQgcmVhZHMgIiArCgkJCSJ0aGUgY2FsbCBpbnB1dCwgaGFzaGVzIGl0IHdpdGggRk5WLTFhIGFuZCB3cml0ZXMgZWlnaHQgaGV4IGRpZ2l0cyBiYWNrLiAiICsKCQkJIldpdGggdGhlIGRlZmF1bHQgaW5wdXQgaXQgcHJpbnRzIGZiN2ZmYmEwLiBTb3VyY2UgYW5kIGJ1aWxkIGNvbW1hbmQ6ICIgKwoJCQkidG9vbHMvcmlzY3YtZ3Vlc3RzL2Zudi4iLAoJCWJ1aWx0aW46ICJmbnYiLAoJCWFzbTogYGxvbmcgbiA9IHN5c2NhbGwzKFNZU19SRUFELCAwLCAobG9uZylpbiwgc2l6ZW9mKGluKSk7Cgp1bnNpZ25lZCBpbnQgaCA9IDIxNjYxMzYyNjF1Owpmb3IgKGxvbmcgaSA9IDA7IGkgPCBuOyBpKyspIHsKCWggXj0gaW5baV07CgloICo9IDE2Nzc3NjE5dTsgICAgICAvKiB0aGUgcmVhc29uIHRoaXMgaXMgcnYzMmltICovCn0KCmZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Cgl1bnNpZ25lZCBpbnQgbmliID0gKGggPj4gKDI4IC0gaSAqIDQpKSAmIDB4RjsKCW91dFtpXSA9IG5pYiA8IDEwID8gJzAnICsgbmliIDogJ2EnICsgKG5pYiAtIDEwKTsKfQoKc3lzY2FsbDMoU1lTX1dSSVRFLCAxLCAobG9uZylvdXQsIDgpOwpzeXNjYWxsMyhTWVNfRVhJVCwgMCwgMCwgMCk7YCwKCX0sCgl7CgkJc2x1ZzogICAibGVkZ2VyIiwKCQluYW1lOiAgICJBIHRva2VuLCBpbiBSdXN0IiwKCQlpbnB1dDogICJtaW50IGFsaWNlIDEwMFxubWludCBib2IgNTBcbnNlbmQgYWxpY2UgYm9iIDMwXG4iLAoJCWJ1ZGdldDogMjAwMDAsCgkJbm90ZTogIm5vX3N0ZCBSdXN0LCBjb21waWxlZCBieSBydXN0YyBmb3IgcmlzY3YzMmltOiBtaW50LCBzZW5kIGFuZCBidXJuLCBhcHBsaWVkICIgKwoJCQkiZnJvbSB0aGUgY2FsbCBpbnB1dC4gSXQgbGlua3MgUnVzdCdzIHJlYWwgY29yZSBhbmQgY29tcGlsZXJfYnVpbHRpbnMsIHNvIHRoZSAiICsKCQkJImJhbGFuY2VzIGJlaW5nIDY0LWJpdCBtZWFucyBhIGRpdmlkZSBydW5zIF9fdWRpdmRpMyBoZXJlLCBiZWNhdXNlIFJWMzIgaGFzIG5vICIgKwoJCQkiNjQtYml0IGRpdmlkZSBpbnN0cnVjdGlvbi4gV2l0aCB0aGUgZGVmYXVsdCBpbnB1dCBpdCBwcmludHMgYWxpY2UgNzAgYW5kIGJvYiA4MC4gIiArCgkJCSJTb3VyY2U6IHRvb2xzL3Jpc2N2LWd1ZXN0cy9sZWRnZXIuIiwKCQlidWlsdGluOiAibGVkZ2VyIiwKCQlhc206IGBtYXRjaCBjbWQgewoJYiJzZW5kIiA9PiB7CgkJbGV0IChmcm9tLCByZXN0KSA9IGZpZWxkKHJlc3QpOwoJCWxldCAodG8sIHJlc3QpID0gZmllbGQocmVzdCk7CgkJbGV0IChhbW91bnQsIF8pID0gZmllbGQocmVzdCk7CgkJbGV0IG4gPSBwYXJzZV91MzIoYW1vdW50KS5va19vcigiYmFkIGFtb3VudCIpPzsKCQlsZXQgZmkgPSBsZWQuZmluZChmcm9tKS5va19vcigidW5rbm93biBzZW5kZXIiKT87CgkJaWYgbGVkLmJhbGFuY2VzW2ZpXSA8IG4gewoJCQlyZXR1cm4gRXJyKCJpbnN1ZmZpY2llbnQgYmFsYW5jZSIpOwoJCX0KCQlsZXQgdGkgPSBsZWQuaW50ZXJuKHRvKS5va19vcigibGVkZ2VyIGZ1bGwgb3IgYmFkIG5hbWUiKT87CgkJbGVkLmJhbGFuY2VzW2ZpXSAtPSBuOwoJCWxlZC5iYWxhbmNlc1t0aV0gKz0gbjsKCQlPaygoKSkKCX0KCV8gPT4gRXJyKCJ1bmtub3duIGNvbW1hbmQiKSwKfWAsCgl9LAp9CgovLyBpbWFnZSBpcyB3aGF0IGdldHMgdXBsb2FkZWQ6IGVpdGhlciB0aGUgd29yZHMgYXNzZW1ibGVkIGhlcmUsIG9yIGEgcHJvZ3JhbQovLyB0aGUgbGlicmFyeSBzaGlwcyBiZWNhdXNlIGEgY29tcGlsZXIgcHJvZHVjZWQgaXQuCmZ1bmMgKHMgKnNhbXBsZSkgaW1hZ2UoKSBbXWJ5dGUgewoJc3dpdGNoIHMuYnVpbHRpbiB7CgljYXNlICJmbnYiOgoJCXJldHVybiByaXNjdi5HdWVzdEZOVigpCgljYXNlICJsZWRnZXIiOgoJCXJldHVybiByaXNjdi5HdWVzdExlZGdlcigpCgl9CglyZXR1cm4gcmlzY3YuSW1hZ2Uocy53b3JkcykKfQoKLy8gbGFuZyBpcyB0aGUgZmVuY2UgdGFnIGZvciB3aGF0IHRoZSBzYW1wbGUgc2hvd3MuIFRoZSBjb21waWxlZCBndWVzdCBzaG93cwovLyBpdHMgQywgYmVjYXVzZSBzaG93aW5nIGEgZGlzYXNzZW1ibHkgb2Ygd2hhdCBMTFZNIGRpZCB3aXRoIGl0IHdvdWxkIGJ1cnkgdGhlCi8vIG9ubHkgaW50ZXJlc3RpbmcgZmFjdDogbm9ib2R5IHdyb3RlIHRoZSBtYWNoaW5lIGNvZGUuCmZ1bmMgKHMgKnNhbXBsZSkgbGFuZygpIHN0cmluZyB7Cglzd2l0Y2ggcy5idWlsdGluIHsKCWNhc2UgImZudiI6CgkJcmV0dXJuICJjIgoJY2FzZSAibGVkZ2VyIjoKCQlyZXR1cm4gInJ1c3QiCgl9CglyZXR1cm4gImFzbSIKfQoKZnVuYyBzYW1wbGVCeU5hbWUoc2x1ZyBzdHJpbmcpICpzYW1wbGUgewoJZm9yIGkgOj0gcmFuZ2Ugc2FtcGxlcyB7CgkJaWYgc2FtcGxlc1tpXS5zbHVnID09IHNsdWcgewoJCQlyZXR1cm4gJnNhbXBsZXNbaV0KCQl9Cgl9CglyZXR1cm4gbmlsCn0KIg0xMzAwMDAwMHVnbm90EhIIoPKQWxILMjg2Njc2dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECAFJKP40sADqJxD9F/q9uuO1FtuOjX3u+aztJ/54tg8gSQFwSMRdNFUy2SJZgvmPkdG2dYdwOClQvBQEo0tiOhC1SCqaFsrQRlyM8PDD9AlBJWifDXhwPJxixo8j7CWtCmNAaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=