Name: series-workflow5qg46 Phase: Failed StartedAt: 2026-09-07 05:56:25 +0000 UTC FinishedAt: 2026-09-07 06:12:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5qg46[0] Phase: Succeeded StartedAt: 2026-09-07 05:56:25 +0000 UTC FinishedAt: 2026-09-07 06:12:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5qg46[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 05:56:25 +0000 UTC FinishedAt: 2026-09-07 06:12:44 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2Vyc3BhY2UgY29kZSAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6MTI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBiNjI4YjljZTRhY2ZhMjg1OWVkYzJiYjRjYmEzYzVhYjMxOGQ0MGU5XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwNjoxMjoyMSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li5lYTZmMTM4OTI0NWZiIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5AQCAtNzQwLDE1ICYjNDM7NzQwLDEwIEBAIHN0YXRpYyBpbnQgZG9fc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xO1xuIH1cbiBcbi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuLVx0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuLVx0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuJiM0MztzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuJiM0MztcdFx0XHQgICBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuJiM0MztcdFx0XHQgICBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuIHtcbi1cdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuLVx0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4tXHRcdHJldHVybiAtMTtcbi1cdH1cbi1cbiBcdGlmIChqc29uX291dHB1dCkge1xuIFx0XHRwcmludF9lbnRyeV9qc29uKG1hcF9pbmZvLCBrZXksIHZhbHVlLCBidGYpO1xuIFx0fSBlbHNlIGlmIChidGYpIHtcbkBAIC03NjIsMTAgJiM0Mzs3NTcsMTExIEBAIHN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHR9IGVsc2Uge1xuIFx0XHRwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7XG4gXHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4mIzQzO1x0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuJiM0MztcdFx0XHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcbiYjNDM7e1xuJiM0MztcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuJiM0MztcdFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiBcbiYjNDM7XHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTtcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9TSVpFIDI1NlVcbiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNClcbiYjNDM7XG4mIzQzOy8qIFJldHVybiAxIHRvIHVzZSBpbmRpdmlkdWFsIGxvb2t1cHMsIGJ1dCBvbmx5IGJlZm9yZSBiYXRjaCB0cmF2ZXJzYWwgc3RhcnRzLiAqL1xuJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCAganNvbl93cml0ZXJfdCAqd3RyLCB1bnNpZ25lZCBpbnQgKm51bV9lbGVtcylcbiYjNDM7e1xuJiM0MztcdF9fdTMyIGNhcGFjaXR5LCBjb3VudCwgYmF0Y2ggPSAwLCBuZXh0X2JhdGNoID0gMCwgaTtcbiYjNDM7XHR2b2lkICprZXlzID0gTlVMTCwgKnZhbHVlcyA9IE5VTEwsICpidWY7XG4mIzQzO1x0Ym9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBIYXNoIGxvb2t1cCBiYXRjaGVzIG11c3QgYWNjb21tb2RhdGUgYSB3aG9sZSBidWNrZXQuIFJlc3RyaWN0IHRoZVxuJiM0MztcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXG4mIzQzO1x0ICogc28gYSBsYXRlciBFTk9TUEMgbmV2ZXIgZm9yY2VzIGEgcmVzdGFydCBhZnRlciBwcmludGluZyBzb21lIGVudHJpZXMuXG4mIzQzO1x0ICogRGl2aXNpb24gYWxzbyBib3VuZHMgdGhlIGFsbG9jYXRpb24gbXVsdGlwbGljYXRpb25zIG9uIDMyLWJpdCBob3N0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaW5mby1cdTAwM2V0eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIHx8ICFpbmZvLVx1MDAzZW1heF9lbnRyaWVzIHx8XG4mIzQzO1x0ICAgIChfX3U2NClpbmZvLVx1MDAzZWtleV9zaXplICYjNDM7IGluZm8tXHUwMDNldmFsdWVfc2l6ZSBcdTAwM2VcbiYjNDM7XHQgICAgTUFQX0RVTVBfQkFUQ0hfTUFYX0JZVEVTIC8gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHRjYXBhY2l0eSA9IG1pbihpbmZvLVx1MDAzZW1heF9lbnRyaWVzLCBNQVBfRFVNUF9CQVRDSF9TSVpFKTtcbiYjNDM7cmVzaXplOlxuJiM0MztcdGJ1ZiA9IHJlYWxsb2Moa2V5cywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdGlmICghYnVmKSB7XG4mIzQzO1x0XHRlcnIgPSBFTk9NRU07XG4mIzQzO1x0XHRnb3RvIGVycm9yO1xuJiM0MztcdH1cbiYjNDM7XHRrZXlzID0gYnVmO1xuJiM0MztcdGJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRpZiAoIWJ1Zikge1xuJiM0MztcdFx0ZXJyID0gRU5PTUVNO1xuJiM0MztcdFx0Z290byBlcnJvcjtcbiYjNDM7XHR9XG4mIzQzO1x0dmFsdWVzID0gYnVmO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAodHJ1ZSkge1xuJiM0MztcdFx0Y291bnQgPSBjYXBhY2l0eTtcbiYjNDM7XHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcdTAwMjZiYXRjaCxcbiYjNDM7XHRcdFx0XHRcdCAgIFx1MDAyNm5leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgXHUwMDI2Y291bnQsIE5VTEwpO1xuJiM0MztcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE9sZGVyIGtlcm5lbHMgcmVqZWN0IHRoZSBjb21tYW5kIGJlZm9yZSB1cGRhdGluZyBjb3VudC4gRG8gbm90XG4mIzQzO1x0XHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoY2FuX2ZhbGxiYWNrIFx1MDAyNlx1MDAyNiAoZXJyID09IEVJTlZBTCB8fCBlcnIgPT0gRU9QTk9UU1VQUCB8fFxuJiM0MztcdFx0XHRcdCAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHtcbiYjNDM7XHRcdFx0ZXJyID0gMTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjYW5fZmFsbGJhY2sgPSBmYWxzZTtcbiYjNDM7XHRcdGlmIChlcnIgPT0gRU5PU1BDKSB7XG4mIzQzO1x0XHRcdGlmIChjYXBhY2l0eSA9PSBpbmZvLVx1MDAzZW1heF9lbnRyaWVzKVxuJiM0MztcdFx0XHRcdGdvdG8gZXJyb3I7XG4mIzQzO1x0XHRcdGNhcGFjaXR5ICYjNDM7PSBtaW4oY2FwYWNpdHksIGluZm8tXHUwMDNlbWF4X2VudHJpZXMgLSBjYXBhY2l0eSk7XG4mIzQzO1x0XHRcdC8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi9cbiYjNDM7XHRcdFx0Z290byByZXNpemU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqL1xuJiM0MztcdFx0aWYgKGVyciBcdTAwMjZcdTAwMjYgZXJyICE9IEVOT0VOVClcbiYjNDM7XHRcdFx0Z290byBlcnJvcjtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBLZWVwIHRoZSBhbGlnbm1lbnQgcHJvdmlkZWQgYnkgaW5kaXZpZHVhbCBsb29rdXBzLCBpbmNsdWRpbmdcbiYjNDM7XHRcdFx0ICogZm9yIEJURiB0eXBlcyB3aG9zZSBtYXAga2V5L3ZhbHVlIHNpemUgaXMgbm90IGFsaWduZWQuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRtZW1jcHkoa2V5LCBrZXlzICYjNDM7IChzaXplX3QpaSAqIGluZm8tXHUwMDNla2V5X3NpemUsIGluZm8tXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdFx0XHRtZW1jcHkodmFsdWUsIHZhbHVlcyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLVx1MDAzZXZhbHVlX3NpemUsIGluZm8tXHUwMDNldmFsdWVfc2l6ZSk7XG4mIzQzO1x0XHRcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbiYjNDM7XHRcdFx0KCpudW1fZWxlbXMpJiM0MzsmIzQzOztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChlcnIgPT0gRU5PRU5UKSB7XG4mIzQzO1x0XHRcdGVyciA9IDA7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Zmlyc3QgPSBmYWxzZTtcbiYjNDM7XHRcdGJhdGNoID0gbmV4dF9iYXRjaDtcbiYjNDM7XHR9XG4mIzQzO2Vycm9yOlxuJiM0MztcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtFcnJvcjogY2FuJiMzOTt0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXFxuXCYjMzQ7LCBzdHJlcnJvcihlcnIpKTtcbiYjNDM7XHRlcnIgPSAtMTtcbiYjNDM7b3V0OlxuJiM0MztcdGZyZWUoa2V5cyk7XG4mIzQzO1x0ZnJlZSh2YWx1ZXMpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGludCBtYXBzX2hhdmVfYnRmKGludCAqZmRzLCBpbnQgbmJfZmRzKVxuIHtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuQEAgLTg2OSw2ICYjNDM7OTY1LDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRcdHBfaW5mbyhcJiMzNDtXYXJuaW5nOiBjYW5ub3QgcmVhZCB2YWx1ZXMgZnJvbSAlcyBtYXAgd2l0aCB2YWx1ZV9zaXplICE9IDhcJiMzNDssXG4gXHRcdCAgICAgICBtYXBfdHlwZV9zdHIpO1xuIFx0fVxuJiM0MztcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXHUwMDI2bnVtX2VsZW1zKTtcbiYjNDM7XHRpZiAoZXJyICE9IDEpXG4mIzQzO1x0XHRnb3RvIGVuZF9kdW1wO1xuIFx0d2hpbGUgKHRydWUpIHtcbiBcdFx0ZXJyID0gYnBmX21hcF9nZXRfbmV4dF9rZXkoZmQsIHByZXZfa2V5LCBrZXkpO1xuIFx0XHRpZiAoZXJyKSB7XG5AQCAtODgxLDYgJiM0Mzs5ODAsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG4mIzQzO2VuZF9kdW1wOlxuIFx0aWYgKHd0cikge1xuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIGVsZW1lbnRzICovXG4gXHRcdGlmIChzaG93X2hlYWRlcilcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmI0MjE2ZWQ3NzhlZjlcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcbkBAIC0wLDAgJiM0MzsxLDE4NyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2N0eXBlLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxuJiM0MzsjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NlxuJiM0MzsjZGVmaW5lIE9VVFBVVF9TSVpFIChNQVhfRU5UUklFUyAqIFJFQ09SRF9TSVpFICYjNDM7IDEwMjQpXG4mIzQzO1xuJiM0MztzdHJ1Y3QgZHVtcF9jYXNlIHtcbiYjNDM7XHRjb25zdCBjaGFyICpuYW1lO1xuJiM0MztcdHVuc2lnbmVkIGludCBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQga2V5X3NpemU7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XG4mIzQzO1x0Ym9vbCBidGY7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBoZXhfYnl0ZXMoY2hhciAqb3V0LCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xuJiM0MztcdHVuc2lnbmVkIGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoanNvbilcbiYjNDM7XHRcdCpvdXQmIzQzOyYjNDM7ID0gJiMzOTtbJiMzOTs7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiBpKVxuJiM0MztcdFx0XHQqb3V0JiM0MzsmIzQzOyA9ICYjMzk7LCYjMzk7O1xuJiM0MztcdFx0b3V0ICYjNDM7PSBzcHJpbnRmKG91dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7MHglMDJ4XFxcJiMzNDtcJiMzNDsgOiBcJiMzNDslMDJ4XCYjMzQ7LCBieXRlc1tpXSk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChqc29uKVxuJiM0MztcdFx0Km91dCYjNDM7JiM0MzsgPSAmIzM5O10mIzM5OztcbiYjNDM7XHQqb3V0ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZXhwZWN0ZWRfcmVjb3JkKGNoYXIgKnJlY29yZCwgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0X191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyAmIzQzOyAxMTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGluZGV4O1xuJiM0MztcdGNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07XG4mIzQzO1xuJiM0MztcdGhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleSxcbiYjNDM7XHRcdCAgdGVzdC1cdTAwM2VrZXlfc2l6ZSwganNvbik7XG4mIzQzO1x0aGV4X2J5dGVzKHZhbHVlX2hleCwgXHUwMDI2dmFsdWUsIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XG4mIzQzO1x0c25wcmludGYoZm9ybWF0dGVkLCBzaXplb2YoZm9ybWF0dGVkKSwgXCYjMzQ7e1xcXCYjMzQ7a2V5XFxcJiMzNDs6JXUsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiV1fVwmIzM0OyxcbiYjNDM7XHRcdCBrZXksIHZhbHVlKTtcbiYjNDM7XHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgdGVzdC1cdTAwM2VidGYpXG4mIzQzO1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLFxuJiM0MztcdFx0XHQgXCYjMzQ7e1xcXCYjMzQ7a2V5XFxcJiMzNDs6JXMsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiVzLFxcXCYjMzQ7Zm9ybWF0dGVkXFxcJiMzNDs6JXN9XCYjMzQ7LFxuJiM0MztcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpO1xuJiM0MztcdGVsc2UgaWYgKGpzb24pXG4mIzQzO1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcJiMzNDt7XFxcJiMzNDtrZXlcXFwmIzM0OzolcyxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6JXN9XCYjMzQ7LFxuJiM0MztcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4KTtcbiYjNDM7XHRlbHNlIGlmICh0ZXN0LVx1MDAzZWJ0ZilcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0OyVzXCYjMzQ7LCBmb3JtYXR0ZWQpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0O2tleTolc3ZhbHVlOiVzXCYjMzQ7LCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19kdW1wKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsIF9fdTMyIGlkLCBib29sIGpzb24sIGJvb2wgcHJldHR5KVxuJiM0Mzt7XG4mIzQzO1x0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cdTAwM2VidGY7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07XG4mIzQzO1x0Ym9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9O1xuJiM0MztcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaSwgbjtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRvdXRwdXQgPSBjYWxsb2MoMSwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihvdXRwdXQsIFwmIzM0O2FsbG9jX291dHB1dFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDslc21hcCBkdW1wIGlkICV1XCYjMzQ7LFxuJiM0MztcdFx0IHByZXR0eSA/IFwmIzM0Oy1wIFwmIzM0OyA6IGpzb24gPyBcJiMzNDstaiBcJiMzNDsgOiBcJiMzNDtcJiMzNDssIGlkKTtcbiYjNDM7XHRlcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O21hcF9kdW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qXG4mIzQzO1x0ICogSWdub3JlIHByZXNlbnRhdGlvbiB3aGl0ZXNwYWNlLCBidXQgY29tcGFyZSBjb21wbGV0ZSByZWNvcmRzIGFuZCBhbGxcbiYjNDM7XHQgKiBwdW5jdHVhdGlvbi4gRXhwZWN0ZWQgY29udGVudHMgY29tZSBvbmx5IGZyb20gdGhlIGlucHV0IGRhdGEsIG5ldmVyXG4mIzQzO1x0ICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKHNyYyA9IG91dHB1dCwgZHN0ID0gb3V0cHV0OyAqc3JjOyBzcmMmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuJiM0MztcdFx0XHQqZHN0JiM0MzsmIzQzOyA9ICpzcmM7XG4mIzQzO1x0KmRzdCA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0Y3Vyc29yID0gb3V0cHV0O1xuJiM0MztcdGlmIChhcnJheSkge1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJiMzOTtbJiMzOTssIFwmIzM0O2FycmF5X3N0YXJ0XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRjdXJzb3ImIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKG4gPSAwOyBuIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBuJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGFycmF5IFx1MDAyNlx1MDAyNiBuKSB7XG4mIzQzO1x0XHRcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICYjMzk7LCYjMzk7LCBcJiMzNDtyZWNvcmRfc2VwYXJhdG9yXCYjMzQ7KSlcbiYjNDM7XHRcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdFx0Y3Vyc29yJiM0MzsmIzQzOztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmIChzZWVuW2ldKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRleHBlY3RlZF9yZWNvcmQoZXhwZWN0ZWQsIHRlc3QsIGksIGpzb24pO1xuJiM0MztcdFx0XHRpZiAoIXN0cm5jbXAoY3Vyc29yLCBleHBlY3RlZCwgc3RybGVuKGV4cGVjdGVkKSkpXG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LVx1MDAzZWNvdW50LCBcJiMzNDt1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRzZWVuW2ldID0gdHJ1ZTtcbiYjNDM7XHRcdGN1cnNvciAmIzQzOz0gc3RybGVuKGV4cGVjdGVkKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGFycmF5KSB7XG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBcJiMzNDtdXCYjMzQ7LCBcJiMzNDthcnJheV9lbmRfYW5kX2NvdW50XCYjMzQ7KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0c25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgXCYjMzQ7Rm91bmQldWVsZW1lbnQlc1wmIzM0OywgdGVzdC1cdTAwM2Vjb3VudCxcbiYjNDM7XHRcdFx0IHRlc3QtXHUwMDNlY291bnQgPT0gMSA/IFwmIzM0O1wmIzM0OyA6IFwmIzM0O3NcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgZm9vdGVyLCBcJiMzNDtwbGFpbl9jb3VudFwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0ZnJlZShvdXRwdXQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRfX3UzMiBpbmZvX2xlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuJiM0MztcdHVuc2lnbmVkIGludCBpO1xuJiM0MztcdGludCBmZCA9IC0xO1xuJiM0MztcbiYjNDM7XHRpZiAodGVzdC1cdTAwM2VidGYpIHtcbiYjNDM7XHRcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtidGZfbmV3XCYjMzQ7KSlcbiYjNDM7XHRcdFx0cmV0dXJuO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7dW5zaWduZWQgaW50XCYjMzQ7LCA0LCAwKSwgMSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O2J0Zl9pbnRcJiMzNDspIHx8XG4mIzQzO1x0XHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCYjMzQ7YnRmX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdG9wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xuJiM0MztcdFx0b3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuJiM0MztcdFx0b3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XG4mIzQzO1x0fVxuJiM0MztcdGZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfYmF0Y2hcJiMzNDssIHRlc3QtXHUwMDNla2V5X3NpemUsXG4mIzQzO1x0XHRcdCAgICB0ZXN0LVx1MDAzZXZhbHVlX3NpemUsIHRlc3QtXHUwMDNlY291bnQgPzogMSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwmIzM0O21hcF9jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgdGVzdC1cdTAwM2Vjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdF9fdTMyIGtleSA9IGksIHZhbHVlID0gaSAqIDM3ICYjNDM7IDExO1xuJiM0MztcdFx0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpO1xuJiM0MztcdFx0dm9pZCAqa2V5X3B0ciA9IHRlc3QtXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXHUwMDI2c2hvcnRfa2V5IDogXHUwMDI2a2V5O1xuJiM0MztcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmQsIGtleV9wdHIsIFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O21hcF91cGRhdGVcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2aW5mb19sZW4pLCBcJiMzNDttYXBfaW5mb1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7XG4mIzQzO1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCB0cnVlKTtcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0YnRmX19mcmVlKGJ0Zik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9iYXRjaCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHtcbiYjNDM7XHRcdHsgXCYjMzQ7ZW1wdHlcJiMzNDssIDAsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7c2luZ2xlXCYjMzQ7LCAxLCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O2JlbG93X2JhdGNoXCYjMzQ7LCAyNTUsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7ZXhhY3RfYmF0Y2hcJiMzNDssIDI1NiwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDthYm92ZV9iYXRjaFwmIzM0OywgMjU3LCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O211bHRpcGxlX2JhdGNoZXNcJiMzNDssIDEwMjUsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7b25lX2J5dGVfa2V5XCYjMzQ7LCAyNTYsIDEsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7b2RkX3ZhbHVlX3NpemVcJiMzNDssIDI1NywgNCwgMyB9LFxuJiM0MztcdFx0eyBcJiMzNDtidGZfZW1wdHlcJiMzNDssIDAsIDQsIDQsIHRydWUgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YnRmX3NpbmdsZVwmIzM0OywgMSwgNCwgNCwgdHJ1ZSB9LFxuJiM0MztcdFx0eyBcJiMzNDtidGZfbXVsdGlwbGVfYmF0Y2hlc1wmIzM0OywgMTAyNSwgNCwgNCwgdHJ1ZSB9LFxuJiM0MztcdH07XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoY2FzZXMpOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KGNhc2VzW2ldLm5hbWUpKVxuJiM0MztcdFx0XHRydW5fZHVtcF9jYXNlKFx1MDAyNmNhc2VzW2ldKTtcbiYjNDM7fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjYyOGI5Y2U0YWNmYTI4NTllZGMyYmI0Y2JhM2M1YWIzMThkNDBlOQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMDY6MTI6MjEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCmluZGV4IDY4NGE4ZmI3MjQxNDYuLmVhNmYxMzg5MjQ1ZmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCkBAIC03NDAsMTUgJiM0Mzs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKIAlyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xOwogfQogCi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAotCQkJIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCi0JCQkganNvbl93cml0ZXJfdCAqYnRmX3d0cikKJiM0MztzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAganNvbl93cml0ZXJfdCAqYnRmX3d0cikKIHsKLQlpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHsKLQkJcHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJaWYgKGpzb25fb3V0cHV0KSB7CiAJCXByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7CiAJfSBlbHNlIGlmIChidGYpIHsKQEAgLTc2MiwxMCAmIzQzOzc1NywxMTEgQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIAl9IGVsc2UgewogCQlwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7CiAJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCSBqc29uX3dyaXRlcl90ICpidGZfd3RyKQomIzQzO3sKJiM0MzsJaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7CiYjNDM7CQlwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KIAomIzQzOwlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTsKIAlyZXR1cm4gMDsKIH0KIAomIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVCiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MzsvKiBSZXR1cm4gMSB0byB1c2UgaW5kaXZpZHVhbCBsb29rdXBzLCBidXQgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi8KJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKJiM0MzsJCQkgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpCiYjNDM7ewomIzQzOwlfX3UzMiBjYXBhY2l0eSwgY291bnQsIGJhdGNoID0gMCwgbmV4dF9iYXRjaCA9IDAsIGk7CiYjNDM7CXZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjsKJiM0MzsJYm9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlCiYjNDM7CSAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsCiYjNDM7CSAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLgomIzQzOwkgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGluZm8tJmd0O3R5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tJmd0O21heF9lbnRyaWVzIHx8CiYjNDM7CSAgICAoX191NjQpaW5mby0mZ3Q7a2V5X3NpemUgJiM0MzsgaW5mby0mZ3Q7dmFsdWVfc2l6ZSAmZ3Q7CiYjNDM7CSAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLSZndDttYXhfZW50cmllcykKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwljYXBhY2l0eSA9IG1pbihpbmZvLSZndDttYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7CiYjNDM7cmVzaXplOgomIzQzOwlidWYgPSByZWFsbG9jKGtleXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLSZndDtrZXlfc2l6ZSk7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQllcnIgPSBFTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yOwomIzQzOwl9CiYjNDM7CWtleXMgPSBidWY7CiYjNDM7CWJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby0mZ3Q7dmFsdWVfc2l6ZSk7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQllcnIgPSBFTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yOwomIzQzOwl9CiYjNDM7CXZhbHVlcyA9IGJ1ZjsKJiM0MzsKJiM0MzsJd2hpbGUgKHRydWUpIHsKJiM0MzsJCWNvdW50ID0gY2FwYWNpdHk7CiYjNDM7CQllcnIgPSBicGZfbWFwX2xvb2t1cF9iYXRjaChmZCwgZmlyc3QgPyBOVUxMIDogJmFtcDtiYXRjaCwKJiM0MzsJCQkJCSAgICZhbXA7bmV4dF9iYXRjaCwga2V5cywgdmFsdWVzLCAmYW1wO2NvdW50LCBOVUxMKTsKJiM0MzsJCWVyciA9IGVyciA/IGVycm5vIDogMDsKJiM0MzsJCS8qCiYjNDM7CQkgKiBPbGRlciBrZXJuZWxzIHJlamVjdCB0aGUgY29tbWFuZCBiZWZvcmUgdXBkYXRpbmcgY291bnQuIERvIG5vdAomIzQzOwkJICogaW5zcGVjdCB0aGUgYnVmZmVycyBvbiB0aGVzZSBlcnJvcnMsIG9yIGZhbGwgYmFjayBhZnRlciBwcm9ncmVzcy4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGNhbl9mYWxsYmFjayAmYW1wOyZhbXA7IChlcnIgPT0gRUlOVkFMIHx8IGVyciA9PSBFT1BOT1RTVVBQIHx8CiYjNDM7CQkJCSAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHsKJiM0MzsJCQllcnIgPSAxOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJY2FuX2ZhbGxiYWNrID0gZmFsc2U7CiYjNDM7CQlpZiAoZXJyID09IEVOT1NQQykgewomIzQzOwkJCWlmIChjYXBhY2l0eSA9PSBpbmZvLSZndDttYXhfZW50cmllcykKJiM0MzsJCQkJZ290byBlcnJvcjsKJiM0MzsJCQljYXBhY2l0eSAmIzQzOz0gbWluKGNhcGFjaXR5LCBpbmZvLSZndDttYXhfZW50cmllcyAtIGNhcGFjaXR5KTsKJiM0MzsJCQkvKiBQcmVzZXJ2ZSB0aGUgaW5wdXQgY3Vyc29yOiB0aGUgb3ZlcnNpemVkIGJ1Y2tldCB3YXMgbm90IHJlYWQuICovCiYjNDM7CQkJZ290byByZXNpemU7CiYjNDM7CQl9CiYjNDM7CQkvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqLwomIzQzOwkJaWYgKGVyciAmYW1wOyZhbXA7IGVyciAhPSBFTk9FTlQpCiYjNDM7CQkJZ290byBlcnJvcjsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBjb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkvKgomIzQzOwkJCSAqIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZwomIzQzOwkJCSAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLgomIzQzOwkJCSAqLwomIzQzOwkJCW1lbWNweShrZXksIGtleXMgJiM0MzsgKHNpemVfdClpICogaW5mby0mZ3Q7a2V5X3NpemUsIGluZm8tJmd0O2tleV9zaXplKTsKJiM0MzsJCQltZW1jcHkodmFsdWUsIHZhbHVlcyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLSZndDt2YWx1ZV9zaXplLCBpbmZvLSZndDt2YWx1ZV9zaXplKTsKJiM0MzsJCQlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7CiYjNDM7CQkJKCpudW1fZWxlbXMpJiM0MzsmIzQzOzsKJiM0MzsJCX0KJiM0MzsJCWlmIChlcnIgPT0gRU5PRU5UKSB7CiYjNDM7CQkJZXJyID0gMDsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWZpcnN0ID0gZmFsc2U7CiYjNDM7CQliYXRjaCA9IG5leHRfYmF0Y2g7CiYjNDM7CX0KJiM0MztlcnJvcjoKJiM0MzsJZnByaW50ZihzdGRlcnIsICYjMzQ7RXJyb3I6IGNhbiYjMzk7dCBsb29rdXAgbWFwIGJhdGNoOiAlc1xuJiMzNDssIHN0cmVycm9yKGVycikpOwomIzQzOwllcnIgPSAtMTsKJiM0MztvdXQ6CiYjNDM7CWZyZWUoa2V5cyk7CiYjNDM7CWZyZWUodmFsdWVzKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW50IG1hcHNfaGF2ZV9idGYoaW50ICpmZHMsIGludCBuYl9mZHMpCiB7CiAJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CkBAIC04NjksNiAmIzQzOzk2NSw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAogCQlwX2luZm8oJiMzNDtXYXJuaW5nOiBjYW5ub3QgcmVhZCB2YWx1ZXMgZnJvbSAlcyBtYXAgd2l0aCB2YWx1ZV9zaXplICE9IDgmIzM0OywKIAkJICAgICAgIG1hcF90eXBlX3N0cik7CiAJfQomIzQzOwllcnIgPSBkdW1wX21hcF9iYXRjaChmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIsICZhbXA7bnVtX2VsZW1zKTsKJiM0MzsJaWYgKGVyciAhPSAxKQomIzQzOwkJZ290byBlbmRfZHVtcDsKIAl3aGlsZSAodHJ1ZSkgewogCQllcnIgPSBicGZfbWFwX2dldF9uZXh0X2tleShmZCwgcHJldl9rZXksIGtleSk7CiAJCWlmIChlcnIpIHsKQEAgLTg4MSw2ICYjNDM7OTgwLDcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCXByZXZfa2V5ID0ga2V5OwogCX0KIAomIzQzO2VuZF9kdW1wOgogCWlmICh3dHIpIHsKIAkJanNvbndfZW5kX2FycmF5KHd0cik7CS8qIGVsZW1lbnRzICovCiAJCWlmIChzaG93X2hlYWRlcikKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmI0MjE2ZWQ3NzhlZjkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jCkBAIC0wLDAgJiM0MzsxLDE4NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmdG9vbF9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Y3R5cGUuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIE1BWF9FTlRSSUVTIDEwMjUKJiM0MzsjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NgomIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgKE1BWF9FTlRSSUVTICogUkVDT1JEX1NJWkUgJiM0MzsgMTAyNCkKJiM0MzsKJiM0MztzdHJ1Y3QgZHVtcF9jYXNlIHsKJiM0MzsJY29uc3QgY2hhciAqbmFtZTsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50OwomIzQzOwl1bnNpZ25lZCBpbnQga2V5X3NpemU7CiYjNDM7CXVuc2lnbmVkIGludCB2YWx1ZV9zaXplOwomIzQzOwlib29sIGJ0ZjsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlpZiAoanNvbikKJiM0MzsJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTtbJiMzOTs7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBzaXplOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGpzb24gJmFtcDsmYW1wOyBpKQomIzQzOwkJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTssJiMzOTs7CiYjNDM7CQlvdXQgJiM0Mzs9IHNwcmludGYob3V0LCBqc29uID8gJiMzNDtcJiMzNDsweCUwMnhcJiMzNDsmIzM0OyA6ICYjMzQ7JTAyeCYjMzQ7LCBieXRlc1tpXSk7CiYjNDM7CX0KJiM0MzsJaWYgKGpzb24pCiYjNDM7CQkqb3V0JiM0MzsmIzQzOyA9ICYjMzk7XSYjMzk7OwomIzQzOwkqb3V0ID0gJiMzOTtcMCYjMzk7OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBleHBlY3RlZF9yZWNvcmQoY2hhciAqcmVjb3JkLCBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIGJvb2wganNvbikKJiM0Mzt7CiYjNDM7CV9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgJiM0MzsgMTE7CiYjNDM7CXVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7CiYjNDM7CWNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07CiYjNDM7CiYjNDM7CWhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LSZndDtrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKikmYW1wO3Nob3J0X2tleSA6ICZhbXA7a2V5LAomIzQzOwkJICB0ZXN0LSZndDtrZXlfc2l6ZSwganNvbik7CiYjNDM7CWhleF9ieXRlcyh2YWx1ZV9oZXgsICZhbXA7dmFsdWUsIHRlc3QtJmd0O3ZhbHVlX3NpemUsIGpzb24pOwomIzQzOwlzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCAmIzM0O3tcJiMzNDtrZXlcJiMzNDs6JXUsXCYjMzQ7dmFsdWVcJiMzNDs6JXV9JiMzNDssCiYjNDM7CQkga2V5LCB2YWx1ZSk7CiYjNDM7CWlmIChqc29uICZhbXA7JmFtcDsgdGVzdC0mZ3Q7YnRmKQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwKJiM0MzsJCQkgJiMzNDt7XCYjMzQ7a2V5XCYjMzQ7OiVzLFwmIzM0O3ZhbHVlXCYjMzQ7OiVzLFwmIzM0O2Zvcm1hdHRlZFwmIzM0Ozolc30mIzM0OywKJiM0MzsJCQkga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpOwomIzQzOwllbHNlIGlmIChqc29uKQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgJiMzNDt7XCYjMzQ7a2V5XCYjMzQ7OiVzLFwmIzM0O3ZhbHVlXCYjMzQ7OiVzfSYjMzQ7LAomIzQzOwkJCSBrZXlfaGV4LCB2YWx1ZV9oZXgpOwomIzQzOwllbHNlIGlmICh0ZXN0LSZndDtidGYpCiYjNDM7CQlzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCAmIzM0OyVzJiMzNDssIGZvcm1hdHRlZCk7CiYjNDM7CWVsc2UKJiM0MzsJCXNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsICYjMzQ7a2V5OiVzdmFsdWU6JXMmIzM0Oywga2V5X2hleCwgdmFsdWVfaGV4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfZHVtcChjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LCBfX3UzMiBpZCwgYm9vbCBqc29uLCBib29sIHByZXR0eSkKJiM0Mzt7CiYjNDM7CWJvb2wgYXJyYXkgPSBqc29uIHx8IHRlc3QtJmd0O2J0ZjsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07CiYjNDM7CWJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTsKJiM0MzsJY2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yOwomIzQzOwl1bnNpZ25lZCBpbnQgaSwgbjsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJb3V0cHV0ID0gY2FsbG9jKDEsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG91dHB1dCwgJiMzNDthbGxvY19vdXRwdXQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslc21hcCBkdW1wIGlkICV1JiMzNDssCiYjNDM7CQkgcHJldHR5ID8gJiMzNDstcCAmIzM0OyA6IGpzb24gPyAmIzM0Oy1qICYjMzQ7IDogJiMzNDsmIzM0OywgaWQpOwomIzQzOwllcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O21hcF9kdW1wJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qCiYjNDM7CSAqIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsCiYjNDM7CSAqIHB1bmN0dWF0aW9uLiBFeHBlY3RlZCBjb250ZW50cyBjb21lIG9ubHkgZnJvbSB0aGUgaW5wdXQgZGF0YSwgbmV2ZXIKJiM0MzsJICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi4KJiM0MzsJICovCiYjNDM7CWZvciAoc3JjID0gb3V0cHV0LCBkc3QgPSBvdXRwdXQ7ICpzcmM7IHNyYyYjNDM7JiM0MzspCiYjNDM7CQlpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpCiYjNDM7CQkJKmRzdCYjNDM7JiM0MzsgPSAqc3JjOwomIzQzOwkqZHN0ID0gJiMzOTtcMCYjMzk7OwomIzQzOwljdXJzb3IgPSBvdXRwdXQ7CiYjNDM7CWlmIChhcnJheSkgewomIzQzOwkJaWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJiMzOTtbJiMzOTssICYjMzQ7YXJyYXlfc3RhcnQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQljdXJzb3ImIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWZvciAobiA9IDA7IG4gJmx0OyB0ZXN0LSZndDtjb3VudDsgbiYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChhcnJheSAmYW1wOyZhbXA7IG4pIHsKJiM0MzsJCQlpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5OywmIzM5OywgJiMzNDtyZWNvcmRfc2VwYXJhdG9yJiMzNDspKQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQljdXJzb3ImIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IHRlc3QtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChzZWVuW2ldKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlleHBlY3RlZF9yZWNvcmQoZXhwZWN0ZWQsIHRlc3QsIGksIGpzb24pOwomIzQzOwkJCWlmICghc3RybmNtcChjdXJzb3IsIGV4cGVjdGVkLCBzdHJsZW4oZXhwZWN0ZWQpKSkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LSZndDtjb3VudCwgJiMzNDt1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJc2VlbltpXSA9IHRydWU7CiYjNDM7CQljdXJzb3IgJiM0Mzs9IHN0cmxlbihleHBlY3RlZCk7CiYjNDM7CX0KJiM0MzsJaWYgKGFycmF5KSB7CiYjNDM7CQlBU1NFUlRfU1RSRVEoY3Vyc29yLCAmIzM0O10mIzM0OywgJiMzNDthcnJheV9lbmRfYW5kX2NvdW50JiMzNDspOwomIzQzOwl9IGVsc2UgewomIzQzOwkJc25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgJiMzNDtGb3VuZCV1ZWxlbWVudCVzJiMzNDssIHRlc3QtJmd0O2NvdW50LAomIzQzOwkJCSB0ZXN0LSZndDtjb3VudCA9PSAxID8gJiMzNDsmIzM0OyA6ICYjMzQ7cyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgJiMzNDtwbGFpbl9jb3VudCYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJZnJlZShvdXRwdXQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CV9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pOwomIzQzOwlzdHJ1Y3QgYnRmICpidGYgPSBOVUxMOwomIzQzOwl1bnNpZ25lZCBpbnQgaTsKJiM0MzsJaW50IGZkID0gLTE7CiYjNDM7CiYjNDM7CWlmICh0ZXN0LSZndDtidGYpIHsKJiM0MzsJCWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2J0Zl9uZXcmIzM0OykpCiYjNDM7CQkJcmV0dXJuOwomIzQzOwkJaWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsCiYjNDM7CQkJICAgICAgICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7YnRmX2xvYWQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCW9wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCW9wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9iYXRjaCYjMzQ7LCB0ZXN0LSZndDtrZXlfc2l6ZSwKJiM0MzsJCQkgICAgdGVzdC0mZ3Q7dmFsdWVfc2l6ZSwgdGVzdC0mZ3Q7Y291bnQgPzogMSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmQsICYjMzQ7bWFwX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdGVzdC0mZ3Q7Y291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyAmIzQzOyAxMTsKJiM0MzsJCXVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaTsKJiM0MzsJCXZvaWQgKmtleV9wdHIgPSB0ZXN0LSZndDtrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKikmYW1wO3Nob3J0X2tleSA6ICZhbXA7a2V5OwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgJmFtcDt2YWx1ZSwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7bWFwX3VwZGF0ZSYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCAmYW1wO2luZm8sICZhbXA7aW5mb19sZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTsKJiM0MzsJY2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7CiYjNDM7CWNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgdHJ1ZSk7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9iYXRjaCh2b2lkKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHsKJiM0MzsJCXsgJiMzNDtlbXB0eSYjMzQ7LCAwLCA0LCA0IH0sCiYjNDM7CQl7ICYjMzQ7c2luZ2xlJiMzNDssIDEsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtiZWxvd19iYXRjaCYjMzQ7LCAyNTUsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtleGFjdF9iYXRjaCYjMzQ7LCAyNTYsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDthYm92ZV9iYXRjaCYjMzQ7LCAyNTcsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDttdWx0aXBsZV9iYXRjaGVzJiMzNDssIDEwMjUsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtvbmVfYnl0ZV9rZXkmIzM0OywgMjU2LCAxLCA0IH0sCiYjNDM7CQl7ICYjMzQ7b2RkX3ZhbHVlX3NpemUmIzM0OywgMjU3LCA0LCAzIH0sCiYjNDM7CQl7ICYjMzQ7YnRmX2VtcHR5JiMzNDssIDAsIDQsIDQsIHRydWUgfSwKJiM0MzsJCXsgJiMzNDtidGZfc2luZ2xlJiMzNDssIDEsIDQsIDQsIHRydWUgfSwKJiM0MzsJCXsgJiMzNDtidGZfbXVsdGlwbGVfYmF0Y2hlcyYjMzQ7LCAxMDI1LCA0LCA0LCB0cnVlIH0sCiYjNDM7CX07CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShjYXNlcyk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpCiYjNDM7CQkJcnVuX2R1bXBfY2FzZSgmYW1wO2Nhc2VzW2ldKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY5OTYKCQkJCQkJCW91dHB1dDogODMKCQkJCQkJCXRob3VnaHRzOiAzMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBFdmFsdWF0aW9uOiBOb24tS2VybmVsIFRvb2xpbmcqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIGFuZCBzZWUgaWYgaXQmIzM5O3MgYSBjYW5kaWRhdGUgZm9yIHN5emthbGxlciBmdXp6aW5nLiBUaGUgZmlsZXMgbW9kaWZpZWQgYXJlIGB0b29scy9icGYvYnBmdG9vbC9tYXAuY2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jYC4gUmlnaHQgYXdheSwgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5IHJhaXNlcyBhIGZsYWcuCgpOb3csIGxldCYjMzk7cyBjb25zdWx0IHRoZSBlc3RhYmxpc2hlZCBydWxlcy4gU2VjdGlvbiAyIGNsZWFybHkgb3V0bGluZXMgbmVnYXRpdmUgY3JpdGVyaWEgZm9yIFdvcnRoRnV6emluZyDigJMgc3BlY2lmaWNhbGx5LCAmIzM0O05vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXMmIzM0Oy4gVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB1c2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzLCBhcyBsb25nIGFzIHRoZXkgKmRvbiYjMzk7dCogaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4gR2l2ZW4gdGhhdCBib3RoIG1vZGlmaWVkIGZpbGVzIGFyZSBuZXN0bGVkIGZpcm1seSB3aXRoaW4gdGhlIGB0b29scy9gIHN0cnVjdHVyZSwgdGhleSBmYWxsIHNxdWFyZWx5IGludG8gdGhpcyBjYXRlZ29yeS4gYGJwZnRvb2xgIGlzIGEgdXNlci1zcGFjZSB1dGlsaXR5LCBhbmQgdGhlIHNlbGZ0ZXN0cyBhcmUganVzdCB0aGF0OiB0ZXN0cy4gVGhlc2UgY2hhbmdlcyBhcmVuJiMzOTt0IGdvaW5nIHRvIGFmZmVjdCB0aGUgY29yZSBrZXJuZWwsIHZtbGludXguCgpUaGVyZWZvcmUsIGFmdGVyIHRoaXMgcmV2aWV3LCBpdCYjMzk7cyBjbGVhcjogV29ydGhGdXp6aW5nIGlzIGBmYWxzZWAgaW4gdGhpcyBjYXNlLgoKSSYjMzk7bSBjb25maWRlbnQgaW4gdGhpcyBhc3Nlc3NtZW50LiBUaW1lIHRvIGZvcm11bGF0ZSB0aGUgdG9vbCBjYWxsOiBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2Vyc3BhY2UgY29kZSAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjoxMjoyMi42NzA1NzM0OTdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTA2MTc1MDU4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjoxMjoyMi42NzA1NzgxMTdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyNzcwNDE2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGI2MjhiOWNlNGFjZmEyODU5ZWRjMmJiNGNiYTNjNWFiMzE4ZDQwZTlcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBTZXAgNyAwNjoxMjoyMSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXFxuaW5kZXggNjg0YThmYjcyNDE0Ni4uZWE2ZjEzODkyNDVmYiAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXFxuQEAgLTc0MCwxNSArNzQwLDEwIEBAIHN0YXRpYyBpbnQgZG9fc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdHJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAwIDogLTE7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuLVxcdFxcdFxcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxcbi1cXHRcXHRcXHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcXG4rc3RhdGljIHZvaWQgcHJpbnRfbWFwX2VsZW0odm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0ICAganNvbl93cml0ZXJfdCAqYnRmX3d0cilcXG4ge1xcbi1cXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcXG4tXFx0XFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xcbi1cXHRcXHRyZXR1cm4gLTE7XFxuLVxcdH1cXG4tXFxuIFxcdGlmIChqc29uX291dHB1dCkge1xcbiBcXHRcXHRwcmludF9lbnRyeV9qc29uKG1hcF9pbmZvLCBrZXksIHZhbHVlLCBidGYpO1xcbiBcXHR9IGVsc2UgaWYgKGJ0Zikge1xcbkBAIC03NjIsMTAgKzc1NywxMTEgQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0cHJpbnRfZW50cnlfcGxhaW4obWFwX2luZm8sIGtleSwgdmFsdWUpO1xcbiBcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuK1xcdFxcdFxcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxcbitcXHRcXHRcXHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcXG4re1xcbitcXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcXG4rXFx0XFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4gXFxuK1xcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIG1hcF9pbmZvLCBidGYsIGJ0Zl93dHIpO1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rI2RlZmluZSBNQVBfRFVNUF9CQVRDSF9TSVpFIDI1NlVcXG4rI2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNClcXG4rXFxuKy8qIFJldHVybiAxIHRvIHVzZSBpbmRpdmlkdWFsIGxvb2t1cHMsIGJ1dCBvbmx5IGJlZm9yZSBiYXRjaCB0cmF2ZXJzYWwgc3RhcnRzLiAqL1xcbitzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBzdHJ1Y3QgYnRmICpidGYsXFxuK1xcdFxcdFxcdCAganNvbl93cml0ZXJfdCAqd3RyLCB1bnNpZ25lZCBpbnQgKm51bV9lbGVtcylcXG4re1xcbitcXHRfX3UzMiBjYXBhY2l0eSwgY291bnQsIGJhdGNoID0gMCwgbmV4dF9iYXRjaCA9IDAsIGk7XFxuK1xcdHZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjtcXG4rXFx0Ym9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBIYXNoIGxvb2t1cCBiYXRjaGVzIG11c3QgYWNjb21tb2RhdGUgYSB3aG9sZSBidWNrZXQuIFJlc3RyaWN0IHRoZVxcbitcXHQgKiBvcHRpbWl6YXRpb24gdG8gbWFwcyB3aG9zZSB3b3JzdC1jYXNlIGJ1Y2tldCBmaXRzIHRoZSBtZW1vcnkgYnVkZ2V0LFxcbitcXHQgKiBzbyBhIGxhdGVyIEVOT1NQQyBuZXZlciBmb3JjZXMgYSByZXN0YXJ0IGFmdGVyIHByaW50aW5nIHNvbWUgZW50cmllcy5cXG4rXFx0ICogRGl2aXNpb24gYWxzbyBib3VuZHMgdGhlIGFsbG9jYXRpb24gbXVsdGlwbGljYXRpb25zIG9uIDMyLWJpdCBob3N0cy5cXG4rXFx0ICovXFxuK1xcdGlmIChpbmZvLVxcdTAwM2V0eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIHx8ICFpbmZvLVxcdTAwM2VtYXhfZW50cmllcyB8fFxcbitcXHQgICAgKF9fdTY0KWluZm8tXFx1MDAzZWtleV9zaXplICsgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSBcXHUwMDNlXFxuK1xcdCAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLVxcdTAwM2VtYXhfZW50cmllcylcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRjYXBhY2l0eSA9IG1pbihpbmZvLVxcdTAwM2VtYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7XFxuK3Jlc2l6ZTpcXG4rXFx0YnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRpZiAoIWJ1Zikge1xcbitcXHRcXHRlcnIgPSBFTk9NRU07XFxuK1xcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdH1cXG4rXFx0a2V5cyA9IGJ1ZjtcXG4rXFx0YnVmID0gcmVhbGxvYyh2YWx1ZXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKTtcXG4rXFx0aWYgKCFidWYpIHtcXG4rXFx0XFx0ZXJyID0gRU5PTUVNO1xcbitcXHRcXHRnb3RvIGVycm9yO1xcbitcXHR9XFxuK1xcdHZhbHVlcyA9IGJ1ZjtcXG4rXFxuK1xcdHdoaWxlICh0cnVlKSB7XFxuK1xcdFxcdGNvdW50ID0gY2FwYWNpdHk7XFxuK1xcdFxcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcXHUwMDI2YmF0Y2gsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIFxcdTAwMjZuZXh0X2JhdGNoLCBrZXlzLCB2YWx1ZXMsIFxcdTAwMjZjb3VudCwgTlVMTCk7XFxuK1xcdFxcdGVyciA9IGVyciA/IGVycm5vIDogMDtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3RcXG4rXFx0XFx0ICogaW5zcGVjdCB0aGUgYnVmZmVycyBvbiB0aGVzZSBlcnJvcnMsIG9yIGZhbGwgYmFjayBhZnRlciBwcm9ncmVzcy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChjYW5fZmFsbGJhY2sgXFx1MDAyNlxcdTAwMjYgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHxcXG4rXFx0XFx0XFx0XFx0ICAgICBlcnIgPT0gNTI0IC8qIEVOT1RTVVBQICovKSkge1xcbitcXHRcXHRcXHRlcnIgPSAxO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHRcXHRjYW5fZmFsbGJhY2sgPSBmYWxzZTtcXG4rXFx0XFx0aWYgKGVyciA9PSBFTk9TUEMpIHtcXG4rXFx0XFx0XFx0aWYgKGNhcGFjaXR5ID09IGluZm8tXFx1MDAzZW1heF9lbnRyaWVzKVxcbitcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcbitcXHRcXHRcXHRjYXBhY2l0eSArPSBtaW4oY2FwYWNpdHksIGluZm8tXFx1MDAzZW1heF9lbnRyaWVzIC0gY2FwYWNpdHkpO1xcbitcXHRcXHRcXHQvKiBQcmVzZXJ2ZSB0aGUgaW5wdXQgY3Vyc29yOiB0aGUgb3ZlcnNpemVkIGJ1Y2tldCB3YXMgbm90IHJlYWQuICovXFxuK1xcdFxcdFxcdGdvdG8gcmVzaXplO1xcbitcXHRcXHR9XFxuK1xcdFxcdC8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovXFxuK1xcdFxcdGlmIChlcnIgXFx1MDAyNlxcdTAwMjYgZXJyICE9IEVOT0VOVClcXG4rXFx0XFx0XFx0Z290byBlcnJvcjtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGNvdW50OyBpKyspIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogS2VlcCB0aGUgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgbG9va3VwcywgaW5jbHVkaW5nXFxuK1xcdFxcdFxcdCAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0bWVtY3B5KGtleSwga2V5cyArIChzaXplX3QpaSAqIGluZm8tXFx1MDAzZWtleV9zaXplLCBpbmZvLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdFxcdFxcdG1lbWNweSh2YWx1ZSwgdmFsdWVzICsgKHNpemVfdClpICogaW5mby1cXHUwMDNldmFsdWVfc2l6ZSwgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSk7XFxuK1xcdFxcdFxcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcXG4rXFx0XFx0XFx0KCpudW1fZWxlbXMpKys7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKGVyciA9PSBFTk9FTlQpIHtcXG4rXFx0XFx0XFx0ZXJyID0gMDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Zmlyc3QgPSBmYWxzZTtcXG4rXFx0XFx0YmF0Y2ggPSBuZXh0X2JhdGNoO1xcbitcXHR9XFxuK2Vycm9yOlxcbitcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkVycm9yOiBjYW4ndCBsb29rdXAgbWFwIGJhdGNoOiAlc1xcXFxuXFxcIiwgc3RyZXJyb3IoZXJyKSk7XFxuK1xcdGVyciA9IC0xO1xcbitvdXQ6XFxuK1xcdGZyZWUoa2V5cyk7XFxuK1xcdGZyZWUodmFsdWVzKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4gc3RhdGljIGludCBtYXBzX2hhdmVfYnRmKGludCAqZmRzLCBpbnQgbmJfZmRzKVxcbiB7XFxuIFxcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbkBAIC04NjksNiArOTY1LDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcdFxcdHBfaW5mbyhcXFwiV2FybmluZzogY2Fubm90IHJlYWQgdmFsdWVzIGZyb20gJXMgbWFwIHdpdGggdmFsdWVfc2l6ZSAhPSA4XFxcIixcXG4gXFx0XFx0ICAgICAgIG1hcF90eXBlX3N0cik7XFxuIFxcdH1cXG4rXFx0ZXJyID0gZHVtcF9tYXBfYmF0Y2goZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyLCBcXHUwMDI2bnVtX2VsZW1zKTtcXG4rXFx0aWYgKGVyciAhPSAxKVxcbitcXHRcXHRnb3RvIGVuZF9kdW1wO1xcbiBcXHR3aGlsZSAodHJ1ZSkge1xcbiBcXHRcXHRlcnIgPSBicGZfbWFwX2dldF9uZXh0X2tleShmZCwgcHJldl9rZXksIGtleSk7XFxuIFxcdFxcdGlmIChlcnIpIHtcXG5AQCAtODgxLDYgKzk4MCw3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxcbiBcXHRcXHRwcmV2X2tleSA9IGtleTtcXG4gXFx0fVxcbiBcXG4rZW5kX2R1bXA6XFxuIFxcdGlmICh3dHIpIHtcXG4gXFx0XFx0anNvbndfZW5kX2FycmF5KHd0cik7XFx0LyogZWxlbWVudHMgKi9cXG4gXFx0XFx0aWYgKHNob3dfaGVhZGVyKVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjQyMTZlZDc3OGVmOVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXFxuQEAgLTAsMCArMSwxODcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjY3R5cGUuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxcbisjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NlxcbisjZGVmaW5lIE9VVFBVVF9TSVpFIChNQVhfRU5UUklFUyAqIFJFQ09SRF9TSVpFICsgMTAyNClcXG4rXFxuK3N0cnVjdCBkdW1wX2Nhc2Uge1xcbitcXHRjb25zdCBjaGFyICpuYW1lO1xcbitcXHR1bnNpZ25lZCBpbnQgY291bnQ7XFxuK1xcdHVuc2lnbmVkIGludCBrZXlfc2l6ZTtcXG4rXFx0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XFxuK1xcdGJvb2wgYnRmO1xcbit9O1xcbitcXG4rc3RhdGljIHZvaWQgaGV4X2J5dGVzKGNoYXIgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wganNvbilcXG4re1xcbitcXHRjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7XFxuK1xcdHVuc2lnbmVkIGludCBpO1xcbitcXG4rXFx0aWYgKGpzb24pXFxuK1xcdFxcdCpvdXQrKyA9ICdbJztcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNpemU7IGkrKykge1xcbitcXHRcXHRpZiAoanNvbiBcXHUwMDI2XFx1MDAyNiBpKVxcbitcXHRcXHRcXHQqb3V0KysgPSAnLCc7XFxuK1xcdFxcdG91dCArPSBzcHJpbnRmKG91dCwganNvbiA/IFxcXCJcXFxcXFxcIjB4JTAyeFxcXFxcXFwiXFxcIiA6IFxcXCIlMDJ4XFxcIiwgYnl0ZXNbaV0pO1xcbitcXHR9XFxuK1xcdGlmIChqc29uKVxcbitcXHRcXHQqb3V0KysgPSAnXSc7XFxuK1xcdCpvdXQgPSAnXFxcXDAnO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBleHBlY3RlZF9yZWNvcmQoY2hhciAqcmVjb3JkLCBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LFxcbitcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGluZGV4LCBib29sIGpzb24pXFxuK3tcXG4rXFx0X191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyArIDExO1xcbitcXHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGluZGV4O1xcbitcXHRjaGFyIGtleV9oZXhbNjRdLCB2YWx1ZV9oZXhbNjRdLCBmb3JtYXR0ZWRbOTZdO1xcbitcXG4rXFx0aGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtXFx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVxcdTAwMjZzaG9ydF9rZXkgOiBcXHUwMDI2a2V5LFxcbitcXHRcXHQgIHRlc3QtXFx1MDAzZWtleV9zaXplLCBqc29uKTtcXG4rXFx0aGV4X2J5dGVzKHZhbHVlX2hleCwgXFx1MDAyNnZhbHVlLCB0ZXN0LVxcdTAwM2V2YWx1ZV9zaXplLCBqc29uKTtcXG4rXFx0c25wcmludGYoZm9ybWF0dGVkLCBzaXplb2YoZm9ybWF0dGVkKSwgXFxcIntcXFxcXFxcImtleVxcXFxcXFwiOiV1LFxcXFxcXFwidmFsdWVcXFxcXFxcIjoldX1cXFwiLFxcbitcXHRcXHQga2V5LCB2YWx1ZSk7XFxuK1xcdGlmIChqc29uIFxcdTAwMjZcXHUwMDI2IHRlc3QtXFx1MDAzZWJ0ZilcXG4rXFx0XFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSxcXG4rXFx0XFx0XFx0IFxcXCJ7XFxcXFxcXCJrZXlcXFxcXFxcIjolcyxcXFxcXFxcInZhbHVlXFxcXFxcXCI6JXMsXFxcXFxcXCJmb3JtYXR0ZWRcXFxcXFxcIjolc31cXFwiLFxcbitcXHRcXHRcXHQga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpO1xcbitcXHRlbHNlIGlmIChqc29uKVxcbitcXHRcXHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcXFwie1xcXFxcXFwia2V5XFxcXFxcXCI6JXMsXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOiVzfVxcXCIsXFxuK1xcdFxcdFxcdCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xcbitcXHRlbHNlIGlmICh0ZXN0LVxcdTAwM2VidGYpXFxuK1xcdFxcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFxcXCIlc1xcXCIsIGZvcm1hdHRlZCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXFxcImtleTolc3ZhbHVlOiVzXFxcIiwga2V5X2hleCwgdmFsdWVfaGV4KTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfZHVtcChjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LCBfX3UzMiBpZCwgYm9vbCBqc29uLCBib29sIHByZXR0eSlcXG4re1xcbitcXHRib29sIGFycmF5ID0ganNvbiB8fCB0ZXN0LVxcdTAwM2VidGY7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgZXhwZWN0ZWRbUkVDT1JEX1NJWkVdLCBmb290ZXJbNjRdO1xcbitcXHRib29sIHNlZW5bTUFYX0VOVFJJRVNdID0ge307XFxuK1xcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcXG4rXFx0dW5zaWduZWQgaW50IGksIG47XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRvdXRwdXQgPSBjYWxsb2MoMSwgT1VUUFVUX1NJWkUpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcXFwiYWxsb2Nfb3V0cHV0XFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiJXNtYXAgZHVtcCBpZCAldVxcXCIsXFxuK1xcdFxcdCBwcmV0dHkgPyBcXFwiLXAgXFxcIiA6IGpzb24gPyBcXFwiLWogXFxcIiA6IFxcXCJcXFwiLCBpZCk7XFxuK1xcdGVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJtYXBfZHVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0LypcXG4rXFx0ICogSWdub3JlIHByZXNlbnRhdGlvbiB3aGl0ZXNwYWNlLCBidXQgY29tcGFyZSBjb21wbGV0ZSByZWNvcmRzIGFuZCBhbGxcXG4rXFx0ICogcHVuY3R1YXRpb24uIEV4cGVjdGVkIGNvbnRlbnRzIGNvbWUgb25seSBmcm9tIHRoZSBpbnB1dCBkYXRhLCBuZXZlclxcbitcXHQgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLlxcbitcXHQgKi9cXG4rXFx0Zm9yIChzcmMgPSBvdXRwdXQsIGRzdCA9IG91dHB1dDsgKnNyYzsgc3JjKyspXFxuK1xcdFxcdGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSlcXG4rXFx0XFx0XFx0KmRzdCsrID0gKnNyYztcXG4rXFx0KmRzdCA9ICdcXFxcMCc7XFxuK1xcdGN1cnNvciA9IG91dHB1dDtcXG4rXFx0aWYgKGFycmF5KSB7XFxuK1xcdFxcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICdbJywgXFxcImFycmF5X3N0YXJ0XFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRjdXJzb3IrKztcXG4rXFx0fVxcbitcXHRmb3IgKG4gPSAwOyBuIFxcdTAwM2MgdGVzdC1cXHUwMDNlY291bnQ7IG4rKykge1xcbitcXHRcXHRpZiAoYXJyYXkgXFx1MDAyNlxcdTAwMjYgbikge1xcbitcXHRcXHRcXHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAnLCcsIFxcXCJyZWNvcmRfc2VwYXJhdG9yXFxcIikpXFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRcXHRjdXJzb3IrKztcXG4rXFx0XFx0fVxcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGVzdC1cXHUwMDNlY291bnQ7IGkrKykge1xcbitcXHRcXHRcXHRpZiAoc2VlbltpXSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGV4cGVjdGVkX3JlY29yZChleHBlY3RlZCwgdGVzdCwgaSwganNvbik7XFxuK1xcdFxcdFxcdGlmICghc3RybmNtcChjdXJzb3IsIGV4cGVjdGVkLCBzdHJsZW4oZXhwZWN0ZWQpKSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFBU1NFUlRfTFQoaSwgdGVzdC1cXHUwMDNlY291bnQsIFxcXCJ1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRzZWVuW2ldID0gdHJ1ZTtcXG4rXFx0XFx0Y3Vyc29yICs9IHN0cmxlbihleHBlY3RlZCk7XFxuK1xcdH1cXG4rXFx0aWYgKGFycmF5KSB7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShjdXJzb3IsIFxcXCJdXFxcIiwgXFxcImFycmF5X2VuZF9hbmRfY291bnRcXFwiKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgXFxcIkZvdW5kJXVlbGVtZW50JXNcXFwiLCB0ZXN0LVxcdTAwM2Vjb3VudCxcXG4rXFx0XFx0XFx0IHRlc3QtXFx1MDAzZWNvdW50ID09IDEgPyBcXFwiXFxcIiA6IFxcXCJzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgXFxcInBsYWluX2NvdW50XFxcIik7XFxuK1xcdH1cXG4rb3V0OlxcbitcXHRmcmVlKG91dHB1dCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XFxuK1xcdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFx0aW50IGZkID0gLTE7XFxuK1xcbitcXHRpZiAodGVzdC1cXHUwMDNlYnRmKSB7XFxuK1xcdFxcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJidGZfbmV3XFxcIikpXFxuK1xcdFxcdFxcdHJldHVybjtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXFxcInVuc2lnbmVkIGludFxcXCIsIDQsIDApLCAxLFxcbitcXHRcXHRcXHQgICAgICAgXFxcImJ0Zl9pbnRcXFwiKSB8fFxcbitcXHRcXHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXFxcImJ0Zl9sb2FkXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcXG4rXFx0XFx0b3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xcbitcXHRcXHRvcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcXG4rXFx0fVxcbitcXHRmZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcXFwiZHVtcF9iYXRjaFxcXCIsIHRlc3QtXFx1MDAzZWtleV9zaXplLFxcbitcXHRcXHRcXHQgICAgdGVzdC1cXHUwMDNldmFsdWVfc2l6ZSwgdGVzdC1cXHUwMDNlY291bnQgPzogMSwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXFxcIm1hcF9jcmVhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0ZXN0LVxcdTAwM2Vjb3VudDsgaSsrKSB7XFxuK1xcdFxcdF9fdTMyIGtleSA9IGksIHZhbHVlID0gaSAqIDM3ICsgMTE7XFxuK1xcdFxcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaTtcXG4rXFx0XFx0dm9pZCAqa2V5X3B0ciA9IHRlc3QtXFx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVxcdTAwMjZzaG9ydF9rZXkgOiBcXHUwMDI2a2V5O1xcbitcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgXFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJtYXBfdXBkYXRlXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFxcdTAwMjZpbmZvLCBcXHUwMDI2aW5mb19sZW4pLCBcXFwibWFwX2luZm9cXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7XFxuK1xcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgdHJ1ZSk7XFxuK291dDpcXG4rXFx0aWYgKGZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9icGZ0b29sX21hcF9iYXRjaCh2b2lkKVxcbit7XFxuK1xcdHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlIGNhc2VzW10gPSB7XFxuK1xcdFxcdHsgXFxcImVtcHR5XFxcIiwgMCwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJzaW5nbGVcXFwiLCAxLCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcImJlbG93X2JhdGNoXFxcIiwgMjU1LCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcImV4YWN0X2JhdGNoXFxcIiwgMjU2LCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcImFib3ZlX2JhdGNoXFxcIiwgMjU3LCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcIm11bHRpcGxlX2JhdGNoZXNcXFwiLCAxMDI1LCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcIm9uZV9ieXRlX2tleVxcXCIsIDI1NiwgMSwgNCB9LFxcbitcXHRcXHR7IFxcXCJvZGRfdmFsdWVfc2l6ZVxcXCIsIDI1NywgNCwgMyB9LFxcbitcXHRcXHR7IFxcXCJidGZfZW1wdHlcXFwiLCAwLCA0LCA0LCB0cnVlIH0sXFxuK1xcdFxcdHsgXFxcImJ0Zl9zaW5nbGVcXFwiLCAxLCA0LCA0LCB0cnVlIH0sXFxuK1xcdFxcdHsgXFxcImJ0Zl9tdWx0aXBsZV9iYXRjaGVzXFxcIiwgMTAyNSwgNCwgNCwgdHJ1ZSB9LFxcbitcXHR9O1xcbitcXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGNhc2VzKTsgaSsrKVxcbitcXHRcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSlcXG4rXFx0XFx0XFx0cnVuX2R1bXBfY2FzZShcXHUwMDI2Y2FzZXNbaV0pO1xcbit9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjEyOjIzLjA5OTE1MDMyOVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTA2MzMxNjMzOTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGI2MjhiOWNlNGFjZmEyODU5ZWRjMmJiNGNiYTNjNWFiMzE4ZDQwZTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDA2OjEyOjIxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uZWE2ZjEzODkyNDVmYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTc0MCwxNSArNzQwLDEwIEBAIHN0YXRpYyBpbnQgZG9fc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xO1xuIH1cbiBcbi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuLVx0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuLVx0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuK3N0YXRpYyB2b2lkIHByaW50X21hcF9lbGVtKHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4rXHRcdFx0ICAgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQgICBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuIHtcbi1cdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuLVx0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4tXHRcdHJldHVybiAtMTtcbi1cdH1cbi1cbiBcdGlmIChqc29uX291dHB1dCkge1xuIFx0XHRwcmludF9lbnRyeV9qc29uKG1hcF9pbmZvLCBrZXksIHZhbHVlLCBidGYpO1xuIFx0fSBlbHNlIGlmIChidGYpIHtcbkBAIC03NjIsMTAgKzc1NywxMTEgQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBcdH0gZWxzZSB7XG4gXHRcdHByaW50X2VudHJ5X3BsYWluKG1hcF9pbmZvLCBrZXksIHZhbHVlKTtcbiBcdH1cbit9XG4rXG4rc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcbit7XG4rXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcbitcdFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4gXG4rXHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTtcbiBcdHJldHVybiAwO1xuIH1cbiBcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfTUFYX0JZVEVTICg0ICogMTAyNCAqIDEwMjQpXG4rXG4rLyogUmV0dXJuIDEgdG8gdXNlIGluZGl2aWR1YWwgbG9va3VwcywgYnV0IG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXG4rc3RhdGljIGludCBkdW1wX21hcF9iYXRjaChpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4rXHRcdFx0ICBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4rXHRcdFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxuK3tcbitcdF9fdTMyIGNhcGFjaXR5LCBjb3VudCwgYmF0Y2ggPSAwLCBuZXh0X2JhdGNoID0gMCwgaTtcbitcdHZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjtcbitcdGJvb2wgZmlyc3QgPSB0cnVlLCBjYW5fZmFsbGJhY2sgPSB0cnVlO1xuK1x0aW50IGVycjtcbitcbitcdC8qXG4rXHQgKiBIYXNoIGxvb2t1cCBiYXRjaGVzIG11c3QgYWNjb21tb2RhdGUgYSB3aG9sZSBidWNrZXQuIFJlc3RyaWN0IHRoZVxuK1x0ICogb3B0aW1pemF0aW9uIHRvIG1hcHMgd2hvc2Ugd29yc3QtY2FzZSBidWNrZXQgZml0cyB0aGUgbWVtb3J5IGJ1ZGdldCxcbitcdCAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLlxuK1x0ICogRGl2aXNpb24gYWxzbyBib3VuZHMgdGhlIGFsbG9jYXRpb24gbXVsdGlwbGljYXRpb25zIG9uIDMyLWJpdCBob3N0cy5cbitcdCAqL1xuK1x0aWYgKGluZm8tXHUwMDNldHlwZSAhPSBCUEZfTUFQX1RZUEVfSEFTSCB8fCAhaW5mby1cdTAwM2VtYXhfZW50cmllcyB8fFxuK1x0ICAgIChfX3U2NClpbmZvLVx1MDAzZWtleV9zaXplICsgaW5mby1cdTAwM2V2YWx1ZV9zaXplIFx1MDAzZVxuK1x0ICAgIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAvIGluZm8tXHUwMDNlbWF4X2VudHJpZXMpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0Y2FwYWNpdHkgPSBtaW4oaW5mby1cdTAwM2VtYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7XG4rcmVzaXplOlxuK1x0YnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRpZiAoIWJ1Zikge1xuK1x0XHRlcnIgPSBFTk9NRU07XG4rXHRcdGdvdG8gZXJyb3I7XG4rXHR9XG4rXHRrZXlzID0gYnVmO1xuK1x0YnVmID0gcmVhbGxvYyh2YWx1ZXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xuK1x0aWYgKCFidWYpIHtcbitcdFx0ZXJyID0gRU5PTUVNO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1x0dmFsdWVzID0gYnVmO1xuK1xuK1x0d2hpbGUgKHRydWUpIHtcbitcdFx0Y291bnQgPSBjYXBhY2l0eTtcbitcdFx0ZXJyID0gYnBmX21hcF9sb29rdXBfYmF0Y2goZmQsIGZpcnN0ID8gTlVMTCA6IFx1MDAyNmJhdGNoLFxuK1x0XHRcdFx0XHQgICBcdTAwMjZuZXh0X2JhdGNoLCBrZXlzLCB2YWx1ZXMsIFx1MDAyNmNvdW50LCBOVUxMKTtcbitcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuK1x0XHQvKlxuK1x0XHQgKiBPbGRlciBrZXJuZWxzIHJlamVjdCB0aGUgY29tbWFuZCBiZWZvcmUgdXBkYXRpbmcgY291bnQuIERvIG5vdFxuK1x0XHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxuK1x0XHQgKi9cbitcdFx0aWYgKGNhbl9mYWxsYmFjayBcdTAwMjZcdTAwMjYgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHxcbitcdFx0XHRcdCAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHtcbitcdFx0XHRlcnIgPSAxO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHRcdGNhbl9mYWxsYmFjayA9IGZhbHNlO1xuK1x0XHRpZiAoZXJyID09IEVOT1NQQykge1xuK1x0XHRcdGlmIChjYXBhY2l0eSA9PSBpbmZvLVx1MDAzZW1heF9lbnRyaWVzKVxuK1x0XHRcdFx0Z290byBlcnJvcjtcbitcdFx0XHRjYXBhY2l0eSArPSBtaW4oY2FwYWNpdHksIGluZm8tXHUwMDNlbWF4X2VudHJpZXMgLSBjYXBhY2l0eSk7XG4rXHRcdFx0LyogUHJlc2VydmUgdGhlIGlucHV0IGN1cnNvcjogdGhlIG92ZXJzaXplZCBidWNrZXQgd2FzIG5vdCByZWFkLiAqL1xuK1x0XHRcdGdvdG8gcmVzaXplO1xuK1x0XHR9XG4rXHRcdC8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovXG4rXHRcdGlmIChlcnIgXHUwMDI2XHUwMDI2IGVyciAhPSBFTk9FTlQpXG4rXHRcdFx0Z290byBlcnJvcjtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgY291bnQ7IGkrKykge1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogS2VlcCB0aGUgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgbG9va3VwcywgaW5jbHVkaW5nXG4rXHRcdFx0ICogZm9yIEJURiB0eXBlcyB3aG9zZSBtYXAga2V5L3ZhbHVlIHNpemUgaXMgbm90IGFsaWduZWQuXG4rXHRcdFx0ICovXG4rXHRcdFx0bWVtY3B5KGtleSwga2V5cyArIChzaXplX3QpaSAqIGluZm8tXHUwMDNla2V5X3NpemUsIGluZm8tXHUwMDNla2V5X3NpemUpO1xuK1x0XHRcdG1lbWNweSh2YWx1ZSwgdmFsdWVzICsgKHNpemVfdClpICogaW5mby1cdTAwM2V2YWx1ZV9zaXplLCBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xuK1x0XHRcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbitcdFx0XHQoKm51bV9lbGVtcykrKztcbitcdFx0fVxuK1x0XHRpZiAoZXJyID09IEVOT0VOVCkge1xuK1x0XHRcdGVyciA9IDA7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0Zmlyc3QgPSBmYWxzZTtcbitcdFx0YmF0Y2ggPSBuZXh0X2JhdGNoO1xuK1x0fVxuK2Vycm9yOlxuK1x0ZnByaW50ZihzdGRlcnIsIFwiRXJyb3I6IGNhbid0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXFxuXCIsIHN0cmVycm9yKGVycikpO1xuK1x0ZXJyID0gLTE7XG4rb3V0OlxuK1x0ZnJlZShrZXlzKTtcbitcdGZyZWUodmFsdWVzKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbkBAIC04NjksNiArOTY1LDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRcdHBfaW5mbyhcIldhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOFwiLFxuIFx0XHQgICAgICAgbWFwX3R5cGVfc3RyKTtcbiBcdH1cbitcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXHUwMDI2bnVtX2VsZW1zKTtcbitcdGlmIChlcnIgIT0gMSlcbitcdFx0Z290byBlbmRfZHVtcDtcbiBcdHdoaWxlICh0cnVlKSB7XG4gXHRcdGVyciA9IGJwZl9tYXBfZ2V0X25leHRfa2V5KGZkLCBwcmV2X2tleSwga2V5KTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg4MSw2ICs5ODAsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG4rZW5kX2R1bXA6XG4gXHRpZiAod3RyKSB7XG4gXHRcdGpzb253X2VuZF9hcnJheSh3dHIpO1x0LyogZWxlbWVudHMgKi9cbiBcdFx0aWYgKHNob3dfaGVhZGVyKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjQyMTZlZDc3OGVmOVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xuQEAgLTAsMCArMSwxODcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuK1xuKyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxuKyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2XG4rI2RlZmluZSBPVVRQVVRfU0laRSAoTUFYX0VOVFJJRVMgKiBSRUNPUkRfU0laRSArIDEwMjQpXG4rXG4rc3RydWN0IGR1bXBfY2FzZSB7XG4rXHRjb25zdCBjaGFyICpuYW1lO1xuK1x0dW5zaWduZWQgaW50IGNvdW50O1xuK1x0dW5zaWduZWQgaW50IGtleV9zaXplO1xuK1x0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XG4rXHRib29sIGJ0Zjtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pXG4re1xuK1x0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRpZiAoanNvbilcbitcdFx0Km91dCsrID0gJ1snO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSsrKSB7XG4rXHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiBpKVxuK1x0XHRcdCpvdXQrKyA9ICcsJztcbitcdFx0b3V0ICs9IHNwcmludGYob3V0LCBqc29uID8gXCJcXFwiMHglMDJ4XFxcIlwiIDogXCIlMDJ4XCIsIGJ5dGVzW2ldKTtcbitcdH1cbitcdGlmIChqc29uKVxuK1x0XHQqb3V0KysgPSAnXSc7XG4rXHQqb3V0ID0gJ1xcMCc7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGV4cGVjdGVkX3JlY29yZChjaGFyICpyZWNvcmQsIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsXG4rXHRcdFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxuK3tcbitcdF9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgKyAxMTtcbitcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7XG4rXHRjaGFyIGtleV9oZXhbNjRdLCB2YWx1ZV9oZXhbNjRdLCBmb3JtYXR0ZWRbOTZdO1xuK1xuK1x0aGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXHUwMDI2c2hvcnRfa2V5IDogXHUwMDI2a2V5LFxuK1x0XHQgIHRlc3QtXHUwMDNla2V5X3NpemUsIGpzb24pO1xuK1x0aGV4X2J5dGVzKHZhbHVlX2hleCwgXHUwMDI2dmFsdWUsIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XG4rXHRzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCBcIntcXFwia2V5XFxcIjoldSxcXFwidmFsdWVcXFwiOiV1fVwiLFxuK1x0XHQga2V5LCB2YWx1ZSk7XG4rXHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgdGVzdC1cdTAwM2VidGYpXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsXG4rXHRcdFx0IFwie1xcXCJrZXlcXFwiOiVzLFxcXCJ2YWx1ZVxcXCI6JXMsXFxcImZvcm1hdHRlZFxcXCI6JXN9XCIsXG4rXHRcdFx0IGtleV9oZXgsIHZhbHVlX2hleCwgZm9ybWF0dGVkKTtcbitcdGVsc2UgaWYgKGpzb24pXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwie1xcXCJrZXlcXFwiOiVzLFxcXCJ2YWx1ZVxcXCI6JXN9XCIsXG4rXHRcdFx0IGtleV9oZXgsIHZhbHVlX2hleCk7XG4rXHRlbHNlIGlmICh0ZXN0LVx1MDAzZWJ0ZilcbitcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCIlc1wiLCBmb3JtYXR0ZWQpO1xuK1x0ZWxzZVxuK1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcImtleTolc3ZhbHVlOiVzXCIsIGtleV9oZXgsIHZhbHVlX2hleCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX2R1bXAoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCwgX191MzIgaWQsIGJvb2wganNvbiwgYm9vbCBwcmV0dHkpXG4re1xuK1x0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cdTAwM2VidGY7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTtcbitcdGJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTtcbitcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcbitcdHVuc2lnbmVkIGludCBpLCBuO1xuK1x0aW50IGVycjtcbitcbitcdG91dHB1dCA9IGNhbGxvYygxLCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jX291dHB1dFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzbWFwIGR1bXAgaWQgJXVcIixcbitcdFx0IHByZXR0eSA/IFwiLXAgXCIgOiBqc29uID8gXCItaiBcIiA6IFwiXCIsIGlkKTtcbitcdGVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcIm1hcF9kdW1wXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdC8qXG4rXHQgKiBJZ25vcmUgcHJlc2VudGF0aW9uIHdoaXRlc3BhY2UsIGJ1dCBjb21wYXJlIGNvbXBsZXRlIHJlY29yZHMgYW5kIGFsbFxuK1x0ICogcHVuY3R1YXRpb24uIEV4cGVjdGVkIGNvbnRlbnRzIGNvbWUgb25seSBmcm9tIHRoZSBpbnB1dCBkYXRhLCBuZXZlclxuK1x0ICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi5cbitcdCAqL1xuK1x0Zm9yIChzcmMgPSBvdXRwdXQsIGRzdCA9IG91dHB1dDsgKnNyYzsgc3JjKyspXG4rXHRcdGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSlcbitcdFx0XHQqZHN0KysgPSAqc3JjO1xuK1x0KmRzdCA9ICdcXDAnO1xuK1x0Y3Vyc29yID0gb3V0cHV0O1xuK1x0aWYgKGFycmF5KSB7XG4rXHRcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICdbJywgXCJhcnJheV9zdGFydFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0Y3Vyc29yKys7XG4rXHR9XG4rXHRmb3IgKG4gPSAwOyBuIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBuKyspIHtcbitcdFx0aWYgKGFycmF5IFx1MDAyNlx1MDAyNiBuKSB7XG4rXHRcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJywnLCBcInJlY29yZF9zZXBhcmF0b3JcIikpXG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHRjdXJzb3IrKztcbitcdFx0fVxuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBpKyspIHtcbitcdFx0XHRpZiAoc2VlbltpXSlcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdGV4cGVjdGVkX3JlY29yZChleHBlY3RlZCwgdGVzdCwgaSwganNvbik7XG4rXHRcdFx0aWYgKCFzdHJuY21wKGN1cnNvciwgZXhwZWN0ZWQsIHN0cmxlbihleHBlY3RlZCkpKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdFx0aWYgKCFBU1NFUlRfTFQoaSwgdGVzdC1cdTAwM2Vjb3VudCwgXCJ1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRzZWVuW2ldID0gdHJ1ZTtcbitcdFx0Y3Vyc29yICs9IHN0cmxlbihleHBlY3RlZCk7XG4rXHR9XG4rXHRpZiAoYXJyYXkpIHtcbitcdFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgXCJdXCIsIFwiYXJyYXlfZW5kX2FuZF9jb3VudFwiKTtcbitcdH0gZWxzZSB7XG4rXHRcdHNucHJpbnRmKGZvb3Rlciwgc2l6ZW9mKGZvb3RlciksIFwiRm91bmQldWVsZW1lbnQlc1wiLCB0ZXN0LVx1MDAzZWNvdW50LFxuK1x0XHRcdCB0ZXN0LVx1MDAzZWNvdW50ID09IDEgPyBcIlwiIDogXCJzXCIpO1xuK1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBmb290ZXIsIFwicGxhaW5fY291bnRcIik7XG4rXHR9XG4rb3V0OlxuK1x0ZnJlZShvdXRwdXQpO1xuK31cbitcbitzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xuK1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbitcdHVuc2lnbmVkIGludCBpO1xuK1x0aW50IGZkID0gLTE7XG4rXG4rXHRpZiAodGVzdC1cdTAwM2VidGYpIHtcbitcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJidGZfbmV3XCIpKVxuK1x0XHRcdHJldHVybjtcbitcdFx0aWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXCJ1bnNpZ25lZCBpbnRcIiwgNCwgMCksIDEsXG4rXHRcdFx0ICAgICAgIFwiYnRmX2ludFwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCJidGZfbG9hZFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0b3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XG4rXHRcdG9wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbitcdFx0b3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XG4rXHR9XG4rXHRmZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfYmF0Y2hcIiwgdGVzdC1cdTAwM2VrZXlfc2l6ZSxcbitcdFx0XHQgICAgdGVzdC1cdTAwM2V2YWx1ZV9zaXplLCB0ZXN0LVx1MDAzZWNvdW50ID86IDEsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwibWFwX2NyZWF0ZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBpKyspIHtcbitcdFx0X191MzIga2V5ID0gaSwgdmFsdWUgPSBpICogMzcgKyAxMTtcbitcdFx0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpO1xuK1x0XHR2b2lkICprZXlfcHRyID0gdGVzdC1cdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcdTAwMjZzaG9ydF9rZXkgOiBcdTAwMjZrZXk7XG4rXG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmQsIGtleV9wdHIsIFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJtYXBfdXBkYXRlXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2aW5mb19sZW4pLCBcIm1hcF9pbmZvXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTtcbitcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgZmFsc2UpO1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCB0cnVlKTtcbitvdXQ6XG4rXHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShmZCk7XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2JhdGNoKHZvaWQpXG4re1xuK1x0c3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHtcbitcdFx0eyBcImVtcHR5XCIsIDAsIDQsIDQgfSxcbitcdFx0eyBcInNpbmdsZVwiLCAxLCA0LCA0IH0sXG4rXHRcdHsgXCJiZWxvd19iYXRjaFwiLCAyNTUsIDQsIDQgfSxcbitcdFx0eyBcImV4YWN0X2JhdGNoXCIsIDI1NiwgNCwgNCB9LFxuK1x0XHR7IFwiYWJvdmVfYmF0Y2hcIiwgMjU3LCA0LCA0IH0sXG4rXHRcdHsgXCJtdWx0aXBsZV9iYXRjaGVzXCIsIDEwMjUsIDQsIDQgfSxcbitcdFx0eyBcIm9uZV9ieXRlX2tleVwiLCAyNTYsIDEsIDQgfSxcbitcdFx0eyBcIm9kZF92YWx1ZV9zaXplXCIsIDI1NywgNCwgMyB9LFxuK1x0XHR7IFwiYnRmX2VtcHR5XCIsIDAsIDQsIDQsIHRydWUgfSxcbitcdFx0eyBcImJ0Zl9zaW5nbGVcIiwgMSwgNCwgNCwgdHJ1ZSB9LFxuK1x0XHR7IFwiYnRmX211bHRpcGxlX2JhdGNoZXNcIiwgMTAyNSwgNCwgNCwgdHJ1ZSB9LFxuK1x0fTtcbitcdHVuc2lnbmVkIGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShjYXNlcyk7IGkrKylcbitcdFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpXG4rXHRcdFx0cnVuX2R1bXBfY2FzZShcdTAwMjZjYXNlc1tpXSk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDY6MTI6MjMuMDk5MTUxODk5WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTA2MzMxNDIxNDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBFdmFsdWF0aW9uOiBOb24tS2VybmVsIFRvb2xpbmcqKlxuXG5Pa2F5LCBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGlzIHBhdGNoIHNlcmllcyBhbmQgc2VlIGlmIGl0J3MgYSBjYW5kaWRhdGUgZm9yIHN5emthbGxlciBmdXp6aW5nLiBUaGUgZmlsZXMgbW9kaWZpZWQgYXJlIGB0b29scy9icGYvYnBmdG9vbC9tYXAuY2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jYC4gUmlnaHQgYXdheSwgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5IHJhaXNlcyBhIGZsYWcuXG5cbk5vdywgbGV0J3MgY29uc3VsdCB0aGUgZXN0YWJsaXNoZWQgcnVsZXMuIFNlY3Rpb24gMiBjbGVhcmx5IG91dGxpbmVzIG5lZ2F0aXZlIGNyaXRlcmlhIGZvciBXb3J0aEZ1enppbmcg4oCTIHNwZWNpZmljYWxseSwgXCJOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzXCIuIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpa2UgdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cywgYXMgbG9uZyBhcyB0aGV5ICpkb24ndCogaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4gR2l2ZW4gdGhhdCBib3RoIG1vZGlmaWVkIGZpbGVzIGFyZSBuZXN0bGVkIGZpcm1seSB3aXRoaW4gdGhlIGB0b29scy9gIHN0cnVjdHVyZSwgdGhleSBmYWxsIHNxdWFyZWx5IGludG8gdGhpcyBjYXRlZ29yeS4gYGJwZnRvb2xgIGlzIGEgdXNlci1zcGFjZSB1dGlsaXR5LCBhbmQgdGhlIHNlbGZ0ZXN0cyBhcmUganVzdCB0aGF0OiB0ZXN0cy4gVGhlc2UgY2hhbmdlcyBhcmVuJ3QgZ29pbmcgdG8gYWZmZWN0IHRoZSBjb3JlIGtlcm5lbCwgdm1saW51eC5cblxuVGhlcmVmb3JlLCBhZnRlciB0aGlzIHJldmlldywgaXQncyBjbGVhcjogV29ydGhGdXp6aW5nIGlzIGBmYWxzZWAgaW4gdGhpcyBjYXNlLlxuXG5JJ20gY29uZmlkZW50IGluIHRoaXMgYXNzZXNzbWVudC4gVGltZSB0byBmb3JtdWxhdGUgdGhlIHRvb2wgY2FsbDogYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6Njk5NiwiT3V0cHV0VG9rZW5zIjo4MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzMSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjEyOjMzLjczMjI5NTgyOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYxMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2Vyc3BhY2UgY29kZSAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjoxMjozMy43MzIzMTYwNThaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow5qg46[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 05:56:25 +0000 UTC FinishedAt: 2026-09-07 06:12:34 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2Vyc3BhY2UgY29kZSAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6MTI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBiNjI4YjljZTRhY2ZhMjg1OWVkYzJiYjRjYmEzYzVhYjMxOGQ0MGU5XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwNjoxMjoyMSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li5lYTZmMTM4OTI0NWZiIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5AQCAtNzQwLDE1ICYjNDM7NzQwLDEwIEBAIHN0YXRpYyBpbnQgZG9fc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xO1xuIH1cbiBcbi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuLVx0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuLVx0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuJiM0MztzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuJiM0MztcdFx0XHQgICBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuJiM0MztcdFx0XHQgICBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuIHtcbi1cdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuLVx0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4tXHRcdHJldHVybiAtMTtcbi1cdH1cbi1cbiBcdGlmIChqc29uX291dHB1dCkge1xuIFx0XHRwcmludF9lbnRyeV9qc29uKG1hcF9pbmZvLCBrZXksIHZhbHVlLCBidGYpO1xuIFx0fSBlbHNlIGlmIChidGYpIHtcbkBAIC03NjIsMTAgJiM0Mzs3NTcsMTExIEBAIHN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHR9IGVsc2Uge1xuIFx0XHRwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7XG4gXHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4mIzQzO1x0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuJiM0MztcdFx0XHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcbiYjNDM7e1xuJiM0MztcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuJiM0MztcdFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiBcbiYjNDM7XHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTtcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9TSVpFIDI1NlVcbiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNClcbiYjNDM7XG4mIzQzOy8qIFJldHVybiAxIHRvIHVzZSBpbmRpdmlkdWFsIGxvb2t1cHMsIGJ1dCBvbmx5IGJlZm9yZSBiYXRjaCB0cmF2ZXJzYWwgc3RhcnRzLiAqL1xuJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCAganNvbl93cml0ZXJfdCAqd3RyLCB1bnNpZ25lZCBpbnQgKm51bV9lbGVtcylcbiYjNDM7e1xuJiM0MztcdF9fdTMyIGNhcGFjaXR5LCBjb3VudCwgYmF0Y2ggPSAwLCBuZXh0X2JhdGNoID0gMCwgaTtcbiYjNDM7XHR2b2lkICprZXlzID0gTlVMTCwgKnZhbHVlcyA9IE5VTEwsICpidWY7XG4mIzQzO1x0Ym9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBIYXNoIGxvb2t1cCBiYXRjaGVzIG11c3QgYWNjb21tb2RhdGUgYSB3aG9sZSBidWNrZXQuIFJlc3RyaWN0IHRoZVxuJiM0MztcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXG4mIzQzO1x0ICogc28gYSBsYXRlciBFTk9TUEMgbmV2ZXIgZm9yY2VzIGEgcmVzdGFydCBhZnRlciBwcmludGluZyBzb21lIGVudHJpZXMuXG4mIzQzO1x0ICogRGl2aXNpb24gYWxzbyBib3VuZHMgdGhlIGFsbG9jYXRpb24gbXVsdGlwbGljYXRpb25zIG9uIDMyLWJpdCBob3N0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaW5mby1cdTAwM2V0eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIHx8ICFpbmZvLVx1MDAzZW1heF9lbnRyaWVzIHx8XG4mIzQzO1x0ICAgIChfX3U2NClpbmZvLVx1MDAzZWtleV9zaXplICYjNDM7IGluZm8tXHUwMDNldmFsdWVfc2l6ZSBcdTAwM2VcbiYjNDM7XHQgICAgTUFQX0RVTVBfQkFUQ0hfTUFYX0JZVEVTIC8gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHRjYXBhY2l0eSA9IG1pbihpbmZvLVx1MDAzZW1heF9lbnRyaWVzLCBNQVBfRFVNUF9CQVRDSF9TSVpFKTtcbiYjNDM7cmVzaXplOlxuJiM0MztcdGJ1ZiA9IHJlYWxsb2Moa2V5cywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdGlmICghYnVmKSB7XG4mIzQzO1x0XHRlcnIgPSBFTk9NRU07XG4mIzQzO1x0XHRnb3RvIGVycm9yO1xuJiM0MztcdH1cbiYjNDM7XHRrZXlzID0gYnVmO1xuJiM0MztcdGJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRpZiAoIWJ1Zikge1xuJiM0MztcdFx0ZXJyID0gRU5PTUVNO1xuJiM0MztcdFx0Z290byBlcnJvcjtcbiYjNDM7XHR9XG4mIzQzO1x0dmFsdWVzID0gYnVmO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAodHJ1ZSkge1xuJiM0MztcdFx0Y291bnQgPSBjYXBhY2l0eTtcbiYjNDM7XHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcdTAwMjZiYXRjaCxcbiYjNDM7XHRcdFx0XHRcdCAgIFx1MDAyNm5leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgXHUwMDI2Y291bnQsIE5VTEwpO1xuJiM0MztcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE9sZGVyIGtlcm5lbHMgcmVqZWN0IHRoZSBjb21tYW5kIGJlZm9yZSB1cGRhdGluZyBjb3VudC4gRG8gbm90XG4mIzQzO1x0XHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoY2FuX2ZhbGxiYWNrIFx1MDAyNlx1MDAyNiAoZXJyID09IEVJTlZBTCB8fCBlcnIgPT0gRU9QTk9UU1VQUCB8fFxuJiM0MztcdFx0XHRcdCAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHtcbiYjNDM7XHRcdFx0ZXJyID0gMTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjYW5fZmFsbGJhY2sgPSBmYWxzZTtcbiYjNDM7XHRcdGlmIChlcnIgPT0gRU5PU1BDKSB7XG4mIzQzO1x0XHRcdGlmIChjYXBhY2l0eSA9PSBpbmZvLVx1MDAzZW1heF9lbnRyaWVzKVxuJiM0MztcdFx0XHRcdGdvdG8gZXJyb3I7XG4mIzQzO1x0XHRcdGNhcGFjaXR5ICYjNDM7PSBtaW4oY2FwYWNpdHksIGluZm8tXHUwMDNlbWF4X2VudHJpZXMgLSBjYXBhY2l0eSk7XG4mIzQzO1x0XHRcdC8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi9cbiYjNDM7XHRcdFx0Z290byByZXNpemU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqL1xuJiM0MztcdFx0aWYgKGVyciBcdTAwMjZcdTAwMjYgZXJyICE9IEVOT0VOVClcbiYjNDM7XHRcdFx0Z290byBlcnJvcjtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBLZWVwIHRoZSBhbGlnbm1lbnQgcHJvdmlkZWQgYnkgaW5kaXZpZHVhbCBsb29rdXBzLCBpbmNsdWRpbmdcbiYjNDM7XHRcdFx0ICogZm9yIEJURiB0eXBlcyB3aG9zZSBtYXAga2V5L3ZhbHVlIHNpemUgaXMgbm90IGFsaWduZWQuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRtZW1jcHkoa2V5LCBrZXlzICYjNDM7IChzaXplX3QpaSAqIGluZm8tXHUwMDNla2V5X3NpemUsIGluZm8tXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdFx0XHRtZW1jcHkodmFsdWUsIHZhbHVlcyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLVx1MDAzZXZhbHVlX3NpemUsIGluZm8tXHUwMDNldmFsdWVfc2l6ZSk7XG4mIzQzO1x0XHRcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbiYjNDM7XHRcdFx0KCpudW1fZWxlbXMpJiM0MzsmIzQzOztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChlcnIgPT0gRU5PRU5UKSB7XG4mIzQzO1x0XHRcdGVyciA9IDA7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Zmlyc3QgPSBmYWxzZTtcbiYjNDM7XHRcdGJhdGNoID0gbmV4dF9iYXRjaDtcbiYjNDM7XHR9XG4mIzQzO2Vycm9yOlxuJiM0MztcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtFcnJvcjogY2FuJiMzOTt0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXFxuXCYjMzQ7LCBzdHJlcnJvcihlcnIpKTtcbiYjNDM7XHRlcnIgPSAtMTtcbiYjNDM7b3V0OlxuJiM0MztcdGZyZWUoa2V5cyk7XG4mIzQzO1x0ZnJlZSh2YWx1ZXMpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGludCBtYXBzX2hhdmVfYnRmKGludCAqZmRzLCBpbnQgbmJfZmRzKVxuIHtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuQEAgLTg2OSw2ICYjNDM7OTY1LDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRcdHBfaW5mbyhcJiMzNDtXYXJuaW5nOiBjYW5ub3QgcmVhZCB2YWx1ZXMgZnJvbSAlcyBtYXAgd2l0aCB2YWx1ZV9zaXplICE9IDhcJiMzNDssXG4gXHRcdCAgICAgICBtYXBfdHlwZV9zdHIpO1xuIFx0fVxuJiM0MztcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXHUwMDI2bnVtX2VsZW1zKTtcbiYjNDM7XHRpZiAoZXJyICE9IDEpXG4mIzQzO1x0XHRnb3RvIGVuZF9kdW1wO1xuIFx0d2hpbGUgKHRydWUpIHtcbiBcdFx0ZXJyID0gYnBmX21hcF9nZXRfbmV4dF9rZXkoZmQsIHByZXZfa2V5LCBrZXkpO1xuIFx0XHRpZiAoZXJyKSB7XG5AQCAtODgxLDYgJiM0Mzs5ODAsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG4mIzQzO2VuZF9kdW1wOlxuIFx0aWYgKHd0cikge1xuIFx0XHRqc29ud19lbmRfYXJyYXkod3RyKTtcdC8qIGVsZW1lbnRzICovXG4gXHRcdGlmIChzaG93X2hlYWRlcilcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmI0MjE2ZWQ3NzhlZjlcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcbkBAIC0wLDAgJiM0MzsxLDE4NyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2N0eXBlLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxuJiM0MzsjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NlxuJiM0MzsjZGVmaW5lIE9VVFBVVF9TSVpFIChNQVhfRU5UUklFUyAqIFJFQ09SRF9TSVpFICYjNDM7IDEwMjQpXG4mIzQzO1xuJiM0MztzdHJ1Y3QgZHVtcF9jYXNlIHtcbiYjNDM7XHRjb25zdCBjaGFyICpuYW1lO1xuJiM0MztcdHVuc2lnbmVkIGludCBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQga2V5X3NpemU7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XG4mIzQzO1x0Ym9vbCBidGY7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBoZXhfYnl0ZXMoY2hhciAqb3V0LCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xuJiM0MztcdHVuc2lnbmVkIGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoanNvbilcbiYjNDM7XHRcdCpvdXQmIzQzOyYjNDM7ID0gJiMzOTtbJiMzOTs7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiBpKVxuJiM0MztcdFx0XHQqb3V0JiM0MzsmIzQzOyA9ICYjMzk7LCYjMzk7O1xuJiM0MztcdFx0b3V0ICYjNDM7PSBzcHJpbnRmKG91dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7MHglMDJ4XFxcJiMzNDtcJiMzNDsgOiBcJiMzNDslMDJ4XCYjMzQ7LCBieXRlc1tpXSk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChqc29uKVxuJiM0MztcdFx0Km91dCYjNDM7JiM0MzsgPSAmIzM5O10mIzM5OztcbiYjNDM7XHQqb3V0ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZXhwZWN0ZWRfcmVjb3JkKGNoYXIgKnJlY29yZCwgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxuJiM0Mzt7XG4mIzQzO1x0X191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyAmIzQzOyAxMTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGluZGV4O1xuJiM0MztcdGNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07XG4mIzQzO1xuJiM0MztcdGhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleSxcbiYjNDM7XHRcdCAgdGVzdC1cdTAwM2VrZXlfc2l6ZSwganNvbik7XG4mIzQzO1x0aGV4X2J5dGVzKHZhbHVlX2hleCwgXHUwMDI2dmFsdWUsIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XG4mIzQzO1x0c25wcmludGYoZm9ybWF0dGVkLCBzaXplb2YoZm9ybWF0dGVkKSwgXCYjMzQ7e1xcXCYjMzQ7a2V5XFxcJiMzNDs6JXUsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiV1fVwmIzM0OyxcbiYjNDM7XHRcdCBrZXksIHZhbHVlKTtcbiYjNDM7XHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgdGVzdC1cdTAwM2VidGYpXG4mIzQzO1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLFxuJiM0MztcdFx0XHQgXCYjMzQ7e1xcXCYjMzQ7a2V5XFxcJiMzNDs6JXMsXFxcJiMzNDt2YWx1ZVxcXCYjMzQ7OiVzLFxcXCYjMzQ7Zm9ybWF0dGVkXFxcJiMzNDs6JXN9XCYjMzQ7LFxuJiM0MztcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpO1xuJiM0MztcdGVsc2UgaWYgKGpzb24pXG4mIzQzO1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcJiMzNDt7XFxcJiMzNDtrZXlcXFwmIzM0OzolcyxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6JXN9XCYjMzQ7LFxuJiM0MztcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4KTtcbiYjNDM7XHRlbHNlIGlmICh0ZXN0LVx1MDAzZWJ0ZilcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0OyVzXCYjMzQ7LCBmb3JtYXR0ZWQpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0O2tleTolc3ZhbHVlOiVzXCYjMzQ7LCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19kdW1wKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsIF9fdTMyIGlkLCBib29sIGpzb24sIGJvb2wgcHJldHR5KVxuJiM0Mzt7XG4mIzQzO1x0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cdTAwM2VidGY7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07XG4mIzQzO1x0Ym9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9O1xuJiM0MztcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaSwgbjtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRvdXRwdXQgPSBjYWxsb2MoMSwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihvdXRwdXQsIFwmIzM0O2FsbG9jX291dHB1dFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDslc21hcCBkdW1wIGlkICV1XCYjMzQ7LFxuJiM0MztcdFx0IHByZXR0eSA/IFwmIzM0Oy1wIFwmIzM0OyA6IGpzb24gPyBcJiMzNDstaiBcJiMzNDsgOiBcJiMzNDtcJiMzNDssIGlkKTtcbiYjNDM7XHRlcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O21hcF9kdW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdC8qXG4mIzQzO1x0ICogSWdub3JlIHByZXNlbnRhdGlvbiB3aGl0ZXNwYWNlLCBidXQgY29tcGFyZSBjb21wbGV0ZSByZWNvcmRzIGFuZCBhbGxcbiYjNDM7XHQgKiBwdW5jdHVhdGlvbi4gRXhwZWN0ZWQgY29udGVudHMgY29tZSBvbmx5IGZyb20gdGhlIGlucHV0IGRhdGEsIG5ldmVyXG4mIzQzO1x0ICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKHNyYyA9IG91dHB1dCwgZHN0ID0gb3V0cHV0OyAqc3JjOyBzcmMmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuJiM0MztcdFx0XHQqZHN0JiM0MzsmIzQzOyA9ICpzcmM7XG4mIzQzO1x0KmRzdCA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0Y3Vyc29yID0gb3V0cHV0O1xuJiM0MztcdGlmIChhcnJheSkge1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJiMzOTtbJiMzOTssIFwmIzM0O2FycmF5X3N0YXJ0XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRjdXJzb3ImIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKG4gPSAwOyBuIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBuJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGFycmF5IFx1MDAyNlx1MDAyNiBuKSB7XG4mIzQzO1x0XHRcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICYjMzk7LCYjMzk7LCBcJiMzNDtyZWNvcmRfc2VwYXJhdG9yXCYjMzQ7KSlcbiYjNDM7XHRcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdFx0Y3Vyc29yJiM0MzsmIzQzOztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmIChzZWVuW2ldKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRleHBlY3RlZF9yZWNvcmQoZXhwZWN0ZWQsIHRlc3QsIGksIGpzb24pO1xuJiM0MztcdFx0XHRpZiAoIXN0cm5jbXAoY3Vyc29yLCBleHBlY3RlZCwgc3RybGVuKGV4cGVjdGVkKSkpXG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LVx1MDAzZWNvdW50LCBcJiMzNDt1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRzZWVuW2ldID0gdHJ1ZTtcbiYjNDM7XHRcdGN1cnNvciAmIzQzOz0gc3RybGVuKGV4cGVjdGVkKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGFycmF5KSB7XG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBcJiMzNDtdXCYjMzQ7LCBcJiMzNDthcnJheV9lbmRfYW5kX2NvdW50XCYjMzQ7KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0c25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgXCYjMzQ7Rm91bmQldWVsZW1lbnQlc1wmIzM0OywgdGVzdC1cdTAwM2Vjb3VudCxcbiYjNDM7XHRcdFx0IHRlc3QtXHUwMDNlY291bnQgPT0gMSA/IFwmIzM0O1wmIzM0OyA6IFwmIzM0O3NcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgZm9vdGVyLCBcJiMzNDtwbGFpbl9jb3VudFwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0ZnJlZShvdXRwdXQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRfX3UzMiBpbmZvX2xlbiA9IHNpemVvZihpbmZvKTtcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuJiM0MztcdHVuc2lnbmVkIGludCBpO1xuJiM0MztcdGludCBmZCA9IC0xO1xuJiM0MztcbiYjNDM7XHRpZiAodGVzdC1cdTAwM2VidGYpIHtcbiYjNDM7XHRcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtidGZfbmV3XCYjMzQ7KSlcbiYjNDM7XHRcdFx0cmV0dXJuO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7dW5zaWduZWQgaW50XCYjMzQ7LCA0LCAwKSwgMSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O2J0Zl9pbnRcJiMzNDspIHx8XG4mIzQzO1x0XHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCYjMzQ7YnRmX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdG9wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xuJiM0MztcdFx0b3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuJiM0MztcdFx0b3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XG4mIzQzO1x0fVxuJiM0MztcdGZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfYmF0Y2hcJiMzNDssIHRlc3QtXHUwMDNla2V5X3NpemUsXG4mIzQzO1x0XHRcdCAgICB0ZXN0LVx1MDAzZXZhbHVlX3NpemUsIHRlc3QtXHUwMDNlY291bnQgPzogMSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwmIzM0O21hcF9jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgdGVzdC1cdTAwM2Vjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdF9fdTMyIGtleSA9IGksIHZhbHVlID0gaSAqIDM3ICYjNDM7IDExO1xuJiM0MztcdFx0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpO1xuJiM0MztcdFx0dm9pZCAqa2V5X3B0ciA9IHRlc3QtXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXHUwMDI2c2hvcnRfa2V5IDogXHUwMDI2a2V5O1xuJiM0MztcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmQsIGtleV9wdHIsIFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O21hcF91cGRhdGVcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2aW5mb19sZW4pLCBcJiMzNDttYXBfaW5mb1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7XG4mIzQzO1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCB0cnVlKTtcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0YnRmX19mcmVlKGJ0Zik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9iYXRjaCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHtcbiYjNDM7XHRcdHsgXCYjMzQ7ZW1wdHlcJiMzNDssIDAsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7c2luZ2xlXCYjMzQ7LCAxLCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O2JlbG93X2JhdGNoXCYjMzQ7LCAyNTUsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7ZXhhY3RfYmF0Y2hcJiMzNDssIDI1NiwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDthYm92ZV9iYXRjaFwmIzM0OywgMjU3LCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O211bHRpcGxlX2JhdGNoZXNcJiMzNDssIDEwMjUsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7b25lX2J5dGVfa2V5XCYjMzQ7LCAyNTYsIDEsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7b2RkX3ZhbHVlX3NpemVcJiMzNDssIDI1NywgNCwgMyB9LFxuJiM0MztcdFx0eyBcJiMzNDtidGZfZW1wdHlcJiMzNDssIDAsIDQsIDQsIHRydWUgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YnRmX3NpbmdsZVwmIzM0OywgMSwgNCwgNCwgdHJ1ZSB9LFxuJiM0MztcdFx0eyBcJiMzNDtidGZfbXVsdGlwbGVfYmF0Y2hlc1wmIzM0OywgMTAyNSwgNCwgNCwgdHJ1ZSB9LFxuJiM0MztcdH07XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoY2FzZXMpOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KGNhc2VzW2ldLm5hbWUpKVxuJiM0MztcdFx0XHRydW5fZHVtcF9jYXNlKFx1MDAyNmNhc2VzW2ldKTtcbiYjNDM7fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjYyOGI5Y2U0YWNmYTI4NTllZGMyYmI0Y2JhM2M1YWIzMThkNDBlOQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gU2VwIDcgMDY6MTI6MjEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCmluZGV4IDY4NGE4ZmI3MjQxNDYuLmVhNmYxMzg5MjQ1ZmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCkBAIC03NDAsMTUgJiM0Mzs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKIAlyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xOwogfQogCi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAotCQkJIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCi0JCQkganNvbl93cml0ZXJfdCAqYnRmX3d0cikKJiM0MztzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAganNvbl93cml0ZXJfdCAqYnRmX3d0cikKIHsKLQlpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHsKLQkJcHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJaWYgKGpzb25fb3V0cHV0KSB7CiAJCXByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7CiAJfSBlbHNlIGlmIChidGYpIHsKQEAgLTc2MiwxMCAmIzQzOzc1NywxMTEgQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIAl9IGVsc2UgewogCQlwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7CiAJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCSBqc29uX3dyaXRlcl90ICpidGZfd3RyKQomIzQzO3sKJiM0MzsJaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7CiYjNDM7CQlwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KIAomIzQzOwlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTsKIAlyZXR1cm4gMDsKIH0KIAomIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVCiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MzsvKiBSZXR1cm4gMSB0byB1c2UgaW5kaXZpZHVhbCBsb29rdXBzLCBidXQgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi8KJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKJiM0MzsJCQkgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpCiYjNDM7ewomIzQzOwlfX3UzMiBjYXBhY2l0eSwgY291bnQsIGJhdGNoID0gMCwgbmV4dF9iYXRjaCA9IDAsIGk7CiYjNDM7CXZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjsKJiM0MzsJYm9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlCiYjNDM7CSAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsCiYjNDM7CSAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLgomIzQzOwkgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGluZm8tJmd0O3R5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tJmd0O21heF9lbnRyaWVzIHx8CiYjNDM7CSAgICAoX191NjQpaW5mby0mZ3Q7a2V5X3NpemUgJiM0MzsgaW5mby0mZ3Q7dmFsdWVfc2l6ZSAmZ3Q7CiYjNDM7CSAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLSZndDttYXhfZW50cmllcykKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwljYXBhY2l0eSA9IG1pbihpbmZvLSZndDttYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7CiYjNDM7cmVzaXplOgomIzQzOwlidWYgPSByZWFsbG9jKGtleXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLSZndDtrZXlfc2l6ZSk7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQllcnIgPSBFTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yOwomIzQzOwl9CiYjNDM7CWtleXMgPSBidWY7CiYjNDM7CWJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby0mZ3Q7dmFsdWVfc2l6ZSk7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQllcnIgPSBFTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yOwomIzQzOwl9CiYjNDM7CXZhbHVlcyA9IGJ1ZjsKJiM0MzsKJiM0MzsJd2hpbGUgKHRydWUpIHsKJiM0MzsJCWNvdW50ID0gY2FwYWNpdHk7CiYjNDM7CQllcnIgPSBicGZfbWFwX2xvb2t1cF9iYXRjaChmZCwgZmlyc3QgPyBOVUxMIDogJmFtcDtiYXRjaCwKJiM0MzsJCQkJCSAgICZhbXA7bmV4dF9iYXRjaCwga2V5cywgdmFsdWVzLCAmYW1wO2NvdW50LCBOVUxMKTsKJiM0MzsJCWVyciA9IGVyciA/IGVycm5vIDogMDsKJiM0MzsJCS8qCiYjNDM7CQkgKiBPbGRlciBrZXJuZWxzIHJlamVjdCB0aGUgY29tbWFuZCBiZWZvcmUgdXBkYXRpbmcgY291bnQuIERvIG5vdAomIzQzOwkJICogaW5zcGVjdCB0aGUgYnVmZmVycyBvbiB0aGVzZSBlcnJvcnMsIG9yIGZhbGwgYmFjayBhZnRlciBwcm9ncmVzcy4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGNhbl9mYWxsYmFjayAmYW1wOyZhbXA7IChlcnIgPT0gRUlOVkFMIHx8IGVyciA9PSBFT1BOT1RTVVBQIHx8CiYjNDM7CQkJCSAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHsKJiM0MzsJCQllcnIgPSAxOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJY2FuX2ZhbGxiYWNrID0gZmFsc2U7CiYjNDM7CQlpZiAoZXJyID09IEVOT1NQQykgewomIzQzOwkJCWlmIChjYXBhY2l0eSA9PSBpbmZvLSZndDttYXhfZW50cmllcykKJiM0MzsJCQkJZ290byBlcnJvcjsKJiM0MzsJCQljYXBhY2l0eSAmIzQzOz0gbWluKGNhcGFjaXR5LCBpbmZvLSZndDttYXhfZW50cmllcyAtIGNhcGFjaXR5KTsKJiM0MzsJCQkvKiBQcmVzZXJ2ZSB0aGUgaW5wdXQgY3Vyc29yOiB0aGUgb3ZlcnNpemVkIGJ1Y2tldCB3YXMgbm90IHJlYWQuICovCiYjNDM7CQkJZ290byByZXNpemU7CiYjNDM7CQl9CiYjNDM7CQkvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqLwomIzQzOwkJaWYgKGVyciAmYW1wOyZhbXA7IGVyciAhPSBFTk9FTlQpCiYjNDM7CQkJZ290byBlcnJvcjsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBjb3VudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkvKgomIzQzOwkJCSAqIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZwomIzQzOwkJCSAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLgomIzQzOwkJCSAqLwomIzQzOwkJCW1lbWNweShrZXksIGtleXMgJiM0MzsgKHNpemVfdClpICogaW5mby0mZ3Q7a2V5X3NpemUsIGluZm8tJmd0O2tleV9zaXplKTsKJiM0MzsJCQltZW1jcHkodmFsdWUsIHZhbHVlcyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLSZndDt2YWx1ZV9zaXplLCBpbmZvLSZndDt2YWx1ZV9zaXplKTsKJiM0MzsJCQlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7CiYjNDM7CQkJKCpudW1fZWxlbXMpJiM0MzsmIzQzOzsKJiM0MzsJCX0KJiM0MzsJCWlmIChlcnIgPT0gRU5PRU5UKSB7CiYjNDM7CQkJZXJyID0gMDsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWZpcnN0ID0gZmFsc2U7CiYjNDM7CQliYXRjaCA9IG5leHRfYmF0Y2g7CiYjNDM7CX0KJiM0MztlcnJvcjoKJiM0MzsJZnByaW50ZihzdGRlcnIsICYjMzQ7RXJyb3I6IGNhbiYjMzk7dCBsb29rdXAgbWFwIGJhdGNoOiAlc1xuJiMzNDssIHN0cmVycm9yKGVycikpOwomIzQzOwllcnIgPSAtMTsKJiM0MztvdXQ6CiYjNDM7CWZyZWUoa2V5cyk7CiYjNDM7CWZyZWUodmFsdWVzKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW50IG1hcHNfaGF2ZV9idGYoaW50ICpmZHMsIGludCBuYl9mZHMpCiB7CiAJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CkBAIC04NjksNiAmIzQzOzk2NSw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAogCQlwX2luZm8oJiMzNDtXYXJuaW5nOiBjYW5ub3QgcmVhZCB2YWx1ZXMgZnJvbSAlcyBtYXAgd2l0aCB2YWx1ZV9zaXplICE9IDgmIzM0OywKIAkJICAgICAgIG1hcF90eXBlX3N0cik7CiAJfQomIzQzOwllcnIgPSBkdW1wX21hcF9iYXRjaChmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIsICZhbXA7bnVtX2VsZW1zKTsKJiM0MzsJaWYgKGVyciAhPSAxKQomIzQzOwkJZ290byBlbmRfZHVtcDsKIAl3aGlsZSAodHJ1ZSkgewogCQllcnIgPSBicGZfbWFwX2dldF9uZXh0X2tleShmZCwgcHJldl9rZXksIGtleSk7CiAJCWlmIChlcnIpIHsKQEAgLTg4MSw2ICYjNDM7OTgwLDcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCXByZXZfa2V5ID0ga2V5OwogCX0KIAomIzQzO2VuZF9kdW1wOgogCWlmICh3dHIpIHsKIAkJanNvbndfZW5kX2FycmF5KHd0cik7CS8qIGVsZW1lbnRzICovCiAJCWlmIChzaG93X2hlYWRlcikKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmI0MjE2ZWQ3NzhlZjkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jCkBAIC0wLDAgJiM0MzsxLDE4NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmdG9vbF9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Y3R5cGUuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIE1BWF9FTlRSSUVTIDEwMjUKJiM0MzsjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NgomIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgKE1BWF9FTlRSSUVTICogUkVDT1JEX1NJWkUgJiM0MzsgMTAyNCkKJiM0MzsKJiM0MztzdHJ1Y3QgZHVtcF9jYXNlIHsKJiM0MzsJY29uc3QgY2hhciAqbmFtZTsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50OwomIzQzOwl1bnNpZ25lZCBpbnQga2V5X3NpemU7CiYjNDM7CXVuc2lnbmVkIGludCB2YWx1ZV9zaXplOwomIzQzOwlib29sIGJ0ZjsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlpZiAoanNvbikKJiM0MzsJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTtbJiMzOTs7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBzaXplOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGpzb24gJmFtcDsmYW1wOyBpKQomIzQzOwkJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTssJiMzOTs7CiYjNDM7CQlvdXQgJiM0Mzs9IHNwcmludGYob3V0LCBqc29uID8gJiMzNDtcJiMzNDsweCUwMnhcJiMzNDsmIzM0OyA6ICYjMzQ7JTAyeCYjMzQ7LCBieXRlc1tpXSk7CiYjNDM7CX0KJiM0MzsJaWYgKGpzb24pCiYjNDM7CQkqb3V0JiM0MzsmIzQzOyA9ICYjMzk7XSYjMzk7OwomIzQzOwkqb3V0ID0gJiMzOTtcMCYjMzk7OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBleHBlY3RlZF9yZWNvcmQoY2hhciAqcmVjb3JkLCBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIGJvb2wganNvbikKJiM0Mzt7CiYjNDM7CV9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgJiM0MzsgMTE7CiYjNDM7CXVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7CiYjNDM7CWNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07CiYjNDM7CiYjNDM7CWhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LSZndDtrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKikmYW1wO3Nob3J0X2tleSA6ICZhbXA7a2V5LAomIzQzOwkJICB0ZXN0LSZndDtrZXlfc2l6ZSwganNvbik7CiYjNDM7CWhleF9ieXRlcyh2YWx1ZV9oZXgsICZhbXA7dmFsdWUsIHRlc3QtJmd0O3ZhbHVlX3NpemUsIGpzb24pOwomIzQzOwlzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCAmIzM0O3tcJiMzNDtrZXlcJiMzNDs6JXUsXCYjMzQ7dmFsdWVcJiMzNDs6JXV9JiMzNDssCiYjNDM7CQkga2V5LCB2YWx1ZSk7CiYjNDM7CWlmIChqc29uICZhbXA7JmFtcDsgdGVzdC0mZ3Q7YnRmKQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwKJiM0MzsJCQkgJiMzNDt7XCYjMzQ7a2V5XCYjMzQ7OiVzLFwmIzM0O3ZhbHVlXCYjMzQ7OiVzLFwmIzM0O2Zvcm1hdHRlZFwmIzM0Ozolc30mIzM0OywKJiM0MzsJCQkga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpOwomIzQzOwllbHNlIGlmIChqc29uKQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgJiMzNDt7XCYjMzQ7a2V5XCYjMzQ7OiVzLFwmIzM0O3ZhbHVlXCYjMzQ7OiVzfSYjMzQ7LAomIzQzOwkJCSBrZXlfaGV4LCB2YWx1ZV9oZXgpOwomIzQzOwllbHNlIGlmICh0ZXN0LSZndDtidGYpCiYjNDM7CQlzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCAmIzM0OyVzJiMzNDssIGZvcm1hdHRlZCk7CiYjNDM7CWVsc2UKJiM0MzsJCXNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsICYjMzQ7a2V5OiVzdmFsdWU6JXMmIzM0Oywga2V5X2hleCwgdmFsdWVfaGV4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfZHVtcChjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LCBfX3UzMiBpZCwgYm9vbCBqc29uLCBib29sIHByZXR0eSkKJiM0Mzt7CiYjNDM7CWJvb2wgYXJyYXkgPSBqc29uIHx8IHRlc3QtJmd0O2J0ZjsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07CiYjNDM7CWJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTsKJiM0MzsJY2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yOwomIzQzOwl1bnNpZ25lZCBpbnQgaSwgbjsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJb3V0cHV0ID0gY2FsbG9jKDEsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG91dHB1dCwgJiMzNDthbGxvY19vdXRwdXQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslc21hcCBkdW1wIGlkICV1JiMzNDssCiYjNDM7CQkgcHJldHR5ID8gJiMzNDstcCAmIzM0OyA6IGpzb24gPyAmIzM0Oy1qICYjMzQ7IDogJiMzNDsmIzM0OywgaWQpOwomIzQzOwllcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O21hcF9kdW1wJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qCiYjNDM7CSAqIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsCiYjNDM7CSAqIHB1bmN0dWF0aW9uLiBFeHBlY3RlZCBjb250ZW50cyBjb21lIG9ubHkgZnJvbSB0aGUgaW5wdXQgZGF0YSwgbmV2ZXIKJiM0MzsJICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi4KJiM0MzsJICovCiYjNDM7CWZvciAoc3JjID0gb3V0cHV0LCBkc3QgPSBvdXRwdXQ7ICpzcmM7IHNyYyYjNDM7JiM0MzspCiYjNDM7CQlpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpCiYjNDM7CQkJKmRzdCYjNDM7JiM0MzsgPSAqc3JjOwomIzQzOwkqZHN0ID0gJiMzOTtcMCYjMzk7OwomIzQzOwljdXJzb3IgPSBvdXRwdXQ7CiYjNDM7CWlmIChhcnJheSkgewomIzQzOwkJaWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJiMzOTtbJiMzOTssICYjMzQ7YXJyYXlfc3RhcnQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQljdXJzb3ImIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWZvciAobiA9IDA7IG4gJmx0OyB0ZXN0LSZndDtjb3VudDsgbiYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChhcnJheSAmYW1wOyZhbXA7IG4pIHsKJiM0MzsJCQlpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5OywmIzM5OywgJiMzNDtyZWNvcmRfc2VwYXJhdG9yJiMzNDspKQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQljdXJzb3ImIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IHRlc3QtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChzZWVuW2ldKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlleHBlY3RlZF9yZWNvcmQoZXhwZWN0ZWQsIHRlc3QsIGksIGpzb24pOwomIzQzOwkJCWlmICghc3RybmNtcChjdXJzb3IsIGV4cGVjdGVkLCBzdHJsZW4oZXhwZWN0ZWQpKSkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LSZndDtjb3VudCwgJiMzNDt1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJc2VlbltpXSA9IHRydWU7CiYjNDM7CQljdXJzb3IgJiM0Mzs9IHN0cmxlbihleHBlY3RlZCk7CiYjNDM7CX0KJiM0MzsJaWYgKGFycmF5KSB7CiYjNDM7CQlBU1NFUlRfU1RSRVEoY3Vyc29yLCAmIzM0O10mIzM0OywgJiMzNDthcnJheV9lbmRfYW5kX2NvdW50JiMzNDspOwomIzQzOwl9IGVsc2UgewomIzQzOwkJc25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgJiMzNDtGb3VuZCV1ZWxlbWVudCVzJiMzNDssIHRlc3QtJmd0O2NvdW50LAomIzQzOwkJCSB0ZXN0LSZndDtjb3VudCA9PSAxID8gJiMzNDsmIzM0OyA6ICYjMzQ7cyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgJiMzNDtwbGFpbl9jb3VudCYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJZnJlZShvdXRwdXQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CV9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pOwomIzQzOwlzdHJ1Y3QgYnRmICpidGYgPSBOVUxMOwomIzQzOwl1bnNpZ25lZCBpbnQgaTsKJiM0MzsJaW50IGZkID0gLTE7CiYjNDM7CiYjNDM7CWlmICh0ZXN0LSZndDtidGYpIHsKJiM0MzsJCWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2J0Zl9uZXcmIzM0OykpCiYjNDM7CQkJcmV0dXJuOwomIzQzOwkJaWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsCiYjNDM7CQkJICAgICAgICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7YnRmX2xvYWQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCW9wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCW9wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9iYXRjaCYjMzQ7LCB0ZXN0LSZndDtrZXlfc2l6ZSwKJiM0MzsJCQkgICAgdGVzdC0mZ3Q7dmFsdWVfc2l6ZSwgdGVzdC0mZ3Q7Y291bnQgPzogMSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmQsICYjMzQ7bWFwX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdGVzdC0mZ3Q7Y291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyAmIzQzOyAxMTsKJiM0MzsJCXVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaTsKJiM0MzsJCXZvaWQgKmtleV9wdHIgPSB0ZXN0LSZndDtrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKikmYW1wO3Nob3J0X2tleSA6ICZhbXA7a2V5OwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgJmFtcDt2YWx1ZSwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7bWFwX3VwZGF0ZSYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCAmYW1wO2luZm8sICZhbXA7aW5mb19sZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTsKJiM0MzsJY2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7CiYjNDM7CWNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgdHJ1ZSk7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9iYXRjaCh2b2lkKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHsKJiM0MzsJCXsgJiMzNDtlbXB0eSYjMzQ7LCAwLCA0LCA0IH0sCiYjNDM7CQl7ICYjMzQ7c2luZ2xlJiMzNDssIDEsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtiZWxvd19iYXRjaCYjMzQ7LCAyNTUsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtleGFjdF9iYXRjaCYjMzQ7LCAyNTYsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDthYm92ZV9iYXRjaCYjMzQ7LCAyNTcsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDttdWx0aXBsZV9iYXRjaGVzJiMzNDssIDEwMjUsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtvbmVfYnl0ZV9rZXkmIzM0OywgMjU2LCAxLCA0IH0sCiYjNDM7CQl7ICYjMzQ7b2RkX3ZhbHVlX3NpemUmIzM0OywgMjU3LCA0LCAzIH0sCiYjNDM7CQl7ICYjMzQ7YnRmX2VtcHR5JiMzNDssIDAsIDQsIDQsIHRydWUgfSwKJiM0MzsJCXsgJiMzNDtidGZfc2luZ2xlJiMzNDssIDEsIDQsIDQsIHRydWUgfSwKJiM0MzsJCXsgJiMzNDtidGZfbXVsdGlwbGVfYmF0Y2hlcyYjMzQ7LCAxMDI1LCA0LCA0LCB0cnVlIH0sCiYjNDM7CX07CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShjYXNlcyk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpCiYjNDM7CQkJcnVuX2R1bXBfY2FzZSgmYW1wO2Nhc2VzW2ldKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY5OTYKCQkJCQkJCW91dHB1dDogODMKCQkJCQkJCXRob3VnaHRzOiAzMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBFdmFsdWF0aW9uOiBOb24tS2VybmVsIFRvb2xpbmcqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIGFuZCBzZWUgaWYgaXQmIzM5O3MgYSBjYW5kaWRhdGUgZm9yIHN5emthbGxlciBmdXp6aW5nLiBUaGUgZmlsZXMgbW9kaWZpZWQgYXJlIGB0b29scy9icGYvYnBmdG9vbC9tYXAuY2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jYC4gUmlnaHQgYXdheSwgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5IHJhaXNlcyBhIGZsYWcuCgpOb3csIGxldCYjMzk7cyBjb25zdWx0IHRoZSBlc3RhYmxpc2hlZCBydWxlcy4gU2VjdGlvbiAyIGNsZWFybHkgb3V0bGluZXMgbmVnYXRpdmUgY3JpdGVyaWEgZm9yIFdvcnRoRnV6emluZyDigJMgc3BlY2lmaWNhbGx5LCAmIzM0O05vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXMmIzM0Oy4gVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB1c2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzLCBhcyBsb25nIGFzIHRoZXkgKmRvbiYjMzk7dCogaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4gR2l2ZW4gdGhhdCBib3RoIG1vZGlmaWVkIGZpbGVzIGFyZSBuZXN0bGVkIGZpcm1seSB3aXRoaW4gdGhlIGB0b29scy9gIHN0cnVjdHVyZSwgdGhleSBmYWxsIHNxdWFyZWx5IGludG8gdGhpcyBjYXRlZ29yeS4gYGJwZnRvb2xgIGlzIGEgdXNlci1zcGFjZSB1dGlsaXR5LCBhbmQgdGhlIHNlbGZ0ZXN0cyBhcmUganVzdCB0aGF0OiB0ZXN0cy4gVGhlc2UgY2hhbmdlcyBhcmVuJiMzOTt0IGdvaW5nIHRvIGFmZmVjdCB0aGUgY29yZSBrZXJuZWwsIHZtbGludXguCgpUaGVyZWZvcmUsIGFmdGVyIHRoaXMgcmV2aWV3LCBpdCYjMzk7cyBjbGVhcjogV29ydGhGdXp6aW5nIGlzIGBmYWxzZWAgaW4gdGhpcyBjYXNlLgoKSSYjMzk7bSBjb25maWRlbnQgaW4gdGhpcyBhc3Nlc3NtZW50LiBUaW1lIHRvIGZvcm11bGF0ZSB0aGUgdG9vbCBjYWxsOiBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2Vyc3BhY2UgY29kZSAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjEyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjoxMjoyMi42NzA1NzM0OTdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTA2MTc1MDU4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjoxMjoyMi42NzA1NzgxMTdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyNzcwNDE2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGI2MjhiOWNlNGFjZmEyODU5ZWRjMmJiNGNiYTNjNWFiMzE4ZDQwZTlcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBTZXAgNyAwNjoxMjoyMSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXFxuaW5kZXggNjg0YThmYjcyNDE0Ni4uZWE2ZjEzODkyNDVmYiAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXFxuQEAgLTc0MCwxNSArNzQwLDEwIEBAIHN0YXRpYyBpbnQgZG9fc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdHJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAwIDogLTE7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuLVxcdFxcdFxcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxcbi1cXHRcXHRcXHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcXG4rc3RhdGljIHZvaWQgcHJpbnRfbWFwX2VsZW0odm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0ICAganNvbl93cml0ZXJfdCAqYnRmX3d0cilcXG4ge1xcbi1cXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcXG4tXFx0XFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xcbi1cXHRcXHRyZXR1cm4gLTE7XFxuLVxcdH1cXG4tXFxuIFxcdGlmIChqc29uX291dHB1dCkge1xcbiBcXHRcXHRwcmludF9lbnRyeV9qc29uKG1hcF9pbmZvLCBrZXksIHZhbHVlLCBidGYpO1xcbiBcXHR9IGVsc2UgaWYgKGJ0Zikge1xcbkBAIC03NjIsMTAgKzc1NywxMTEgQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0cHJpbnRfZW50cnlfcGxhaW4obWFwX2luZm8sIGtleSwgdmFsdWUpO1xcbiBcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuK1xcdFxcdFxcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxcbitcXHRcXHRcXHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcXG4re1xcbitcXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcXG4rXFx0XFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4gXFxuK1xcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIG1hcF9pbmZvLCBidGYsIGJ0Zl93dHIpO1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rI2RlZmluZSBNQVBfRFVNUF9CQVRDSF9TSVpFIDI1NlVcXG4rI2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNClcXG4rXFxuKy8qIFJldHVybiAxIHRvIHVzZSBpbmRpdmlkdWFsIGxvb2t1cHMsIGJ1dCBvbmx5IGJlZm9yZSBiYXRjaCB0cmF2ZXJzYWwgc3RhcnRzLiAqL1xcbitzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBzdHJ1Y3QgYnRmICpidGYsXFxuK1xcdFxcdFxcdCAganNvbl93cml0ZXJfdCAqd3RyLCB1bnNpZ25lZCBpbnQgKm51bV9lbGVtcylcXG4re1xcbitcXHRfX3UzMiBjYXBhY2l0eSwgY291bnQsIGJhdGNoID0gMCwgbmV4dF9iYXRjaCA9IDAsIGk7XFxuK1xcdHZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjtcXG4rXFx0Ym9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBIYXNoIGxvb2t1cCBiYXRjaGVzIG11c3QgYWNjb21tb2RhdGUgYSB3aG9sZSBidWNrZXQuIFJlc3RyaWN0IHRoZVxcbitcXHQgKiBvcHRpbWl6YXRpb24gdG8gbWFwcyB3aG9zZSB3b3JzdC1jYXNlIGJ1Y2tldCBmaXRzIHRoZSBtZW1vcnkgYnVkZ2V0LFxcbitcXHQgKiBzbyBhIGxhdGVyIEVOT1NQQyBuZXZlciBmb3JjZXMgYSByZXN0YXJ0IGFmdGVyIHByaW50aW5nIHNvbWUgZW50cmllcy5cXG4rXFx0ICogRGl2aXNpb24gYWxzbyBib3VuZHMgdGhlIGFsbG9jYXRpb24gbXVsdGlwbGljYXRpb25zIG9uIDMyLWJpdCBob3N0cy5cXG4rXFx0ICovXFxuK1xcdGlmIChpbmZvLVxcdTAwM2V0eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIHx8ICFpbmZvLVxcdTAwM2VtYXhfZW50cmllcyB8fFxcbitcXHQgICAgKF9fdTY0KWluZm8tXFx1MDAzZWtleV9zaXplICsgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSBcXHUwMDNlXFxuK1xcdCAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLVxcdTAwM2VtYXhfZW50cmllcylcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRjYXBhY2l0eSA9IG1pbihpbmZvLVxcdTAwM2VtYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7XFxuK3Jlc2l6ZTpcXG4rXFx0YnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRpZiAoIWJ1Zikge1xcbitcXHRcXHRlcnIgPSBFTk9NRU07XFxuK1xcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdH1cXG4rXFx0a2V5cyA9IGJ1ZjtcXG4rXFx0YnVmID0gcmVhbGxvYyh2YWx1ZXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKTtcXG4rXFx0aWYgKCFidWYpIHtcXG4rXFx0XFx0ZXJyID0gRU5PTUVNO1xcbitcXHRcXHRnb3RvIGVycm9yO1xcbitcXHR9XFxuK1xcdHZhbHVlcyA9IGJ1ZjtcXG4rXFxuK1xcdHdoaWxlICh0cnVlKSB7XFxuK1xcdFxcdGNvdW50ID0gY2FwYWNpdHk7XFxuK1xcdFxcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcXHUwMDI2YmF0Y2gsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIFxcdTAwMjZuZXh0X2JhdGNoLCBrZXlzLCB2YWx1ZXMsIFxcdTAwMjZjb3VudCwgTlVMTCk7XFxuK1xcdFxcdGVyciA9IGVyciA/IGVycm5vIDogMDtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3RcXG4rXFx0XFx0ICogaW5zcGVjdCB0aGUgYnVmZmVycyBvbiB0aGVzZSBlcnJvcnMsIG9yIGZhbGwgYmFjayBhZnRlciBwcm9ncmVzcy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChjYW5fZmFsbGJhY2sgXFx1MDAyNlxcdTAwMjYgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHxcXG4rXFx0XFx0XFx0XFx0ICAgICBlcnIgPT0gNTI0IC8qIEVOT1RTVVBQICovKSkge1xcbitcXHRcXHRcXHRlcnIgPSAxO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHRcXHRjYW5fZmFsbGJhY2sgPSBmYWxzZTtcXG4rXFx0XFx0aWYgKGVyciA9PSBFTk9TUEMpIHtcXG4rXFx0XFx0XFx0aWYgKGNhcGFjaXR5ID09IGluZm8tXFx1MDAzZW1heF9lbnRyaWVzKVxcbitcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcbitcXHRcXHRcXHRjYXBhY2l0eSArPSBtaW4oY2FwYWNpdHksIGluZm8tXFx1MDAzZW1heF9lbnRyaWVzIC0gY2FwYWNpdHkpO1xcbitcXHRcXHRcXHQvKiBQcmVzZXJ2ZSB0aGUgaW5wdXQgY3Vyc29yOiB0aGUgb3ZlcnNpemVkIGJ1Y2tldCB3YXMgbm90IHJlYWQuICovXFxuK1xcdFxcdFxcdGdvdG8gcmVzaXplO1xcbitcXHRcXHR9XFxuK1xcdFxcdC8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovXFxuK1xcdFxcdGlmIChlcnIgXFx1MDAyNlxcdTAwMjYgZXJyICE9IEVOT0VOVClcXG4rXFx0XFx0XFx0Z290byBlcnJvcjtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGNvdW50OyBpKyspIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogS2VlcCB0aGUgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgbG9va3VwcywgaW5jbHVkaW5nXFxuK1xcdFxcdFxcdCAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0bWVtY3B5KGtleSwga2V5cyArIChzaXplX3QpaSAqIGluZm8tXFx1MDAzZWtleV9zaXplLCBpbmZvLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdFxcdFxcdG1lbWNweSh2YWx1ZSwgdmFsdWVzICsgKHNpemVfdClpICogaW5mby1cXHUwMDNldmFsdWVfc2l6ZSwgaW5mby1cXHUwMDNldmFsdWVfc2l6ZSk7XFxuK1xcdFxcdFxcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcXG4rXFx0XFx0XFx0KCpudW1fZWxlbXMpKys7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKGVyciA9PSBFTk9FTlQpIHtcXG4rXFx0XFx0XFx0ZXJyID0gMDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Zmlyc3QgPSBmYWxzZTtcXG4rXFx0XFx0YmF0Y2ggPSBuZXh0X2JhdGNoO1xcbitcXHR9XFxuK2Vycm9yOlxcbitcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkVycm9yOiBjYW4ndCBsb29rdXAgbWFwIGJhdGNoOiAlc1xcXFxuXFxcIiwgc3RyZXJyb3IoZXJyKSk7XFxuK1xcdGVyciA9IC0xO1xcbitvdXQ6XFxuK1xcdGZyZWUoa2V5cyk7XFxuK1xcdGZyZWUodmFsdWVzKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4gc3RhdGljIGludCBtYXBzX2hhdmVfYnRmKGludCAqZmRzLCBpbnQgbmJfZmRzKVxcbiB7XFxuIFxcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbkBAIC04NjksNiArOTY1LDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcdFxcdHBfaW5mbyhcXFwiV2FybmluZzogY2Fubm90IHJlYWQgdmFsdWVzIGZyb20gJXMgbWFwIHdpdGggdmFsdWVfc2l6ZSAhPSA4XFxcIixcXG4gXFx0XFx0ICAgICAgIG1hcF90eXBlX3N0cik7XFxuIFxcdH1cXG4rXFx0ZXJyID0gZHVtcF9tYXBfYmF0Y2goZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyLCBcXHUwMDI2bnVtX2VsZW1zKTtcXG4rXFx0aWYgKGVyciAhPSAxKVxcbitcXHRcXHRnb3RvIGVuZF9kdW1wO1xcbiBcXHR3aGlsZSAodHJ1ZSkge1xcbiBcXHRcXHRlcnIgPSBicGZfbWFwX2dldF9uZXh0X2tleShmZCwgcHJldl9rZXksIGtleSk7XFxuIFxcdFxcdGlmIChlcnIpIHtcXG5AQCAtODgxLDYgKzk4MCw3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxcbiBcXHRcXHRwcmV2X2tleSA9IGtleTtcXG4gXFx0fVxcbiBcXG4rZW5kX2R1bXA6XFxuIFxcdGlmICh3dHIpIHtcXG4gXFx0XFx0anNvbndfZW5kX2FycmF5KHd0cik7XFx0LyogZWxlbWVudHMgKi9cXG4gXFx0XFx0aWYgKHNob3dfaGVhZGVyKVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjQyMTZlZDc3OGVmOVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXFxuQEAgLTAsMCArMSwxODcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjY3R5cGUuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxcbisjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NlxcbisjZGVmaW5lIE9VVFBVVF9TSVpFIChNQVhfRU5UUklFUyAqIFJFQ09SRF9TSVpFICsgMTAyNClcXG4rXFxuK3N0cnVjdCBkdW1wX2Nhc2Uge1xcbitcXHRjb25zdCBjaGFyICpuYW1lO1xcbitcXHR1bnNpZ25lZCBpbnQgY291bnQ7XFxuK1xcdHVuc2lnbmVkIGludCBrZXlfc2l6ZTtcXG4rXFx0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XFxuK1xcdGJvb2wgYnRmO1xcbit9O1xcbitcXG4rc3RhdGljIHZvaWQgaGV4X2J5dGVzKGNoYXIgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wganNvbilcXG4re1xcbitcXHRjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7XFxuK1xcdHVuc2lnbmVkIGludCBpO1xcbitcXG4rXFx0aWYgKGpzb24pXFxuK1xcdFxcdCpvdXQrKyA9ICdbJztcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNpemU7IGkrKykge1xcbitcXHRcXHRpZiAoanNvbiBcXHUwMDI2XFx1MDAyNiBpKVxcbitcXHRcXHRcXHQqb3V0KysgPSAnLCc7XFxuK1xcdFxcdG91dCArPSBzcHJpbnRmKG91dCwganNvbiA/IFxcXCJcXFxcXFxcIjB4JTAyeFxcXFxcXFwiXFxcIiA6IFxcXCIlMDJ4XFxcIiwgYnl0ZXNbaV0pO1xcbitcXHR9XFxuK1xcdGlmIChqc29uKVxcbitcXHRcXHQqb3V0KysgPSAnXSc7XFxuK1xcdCpvdXQgPSAnXFxcXDAnO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBleHBlY3RlZF9yZWNvcmQoY2hhciAqcmVjb3JkLCBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LFxcbitcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGluZGV4LCBib29sIGpzb24pXFxuK3tcXG4rXFx0X191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyArIDExO1xcbitcXHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGluZGV4O1xcbitcXHRjaGFyIGtleV9oZXhbNjRdLCB2YWx1ZV9oZXhbNjRdLCBmb3JtYXR0ZWRbOTZdO1xcbitcXG4rXFx0aGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtXFx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVxcdTAwMjZzaG9ydF9rZXkgOiBcXHUwMDI2a2V5LFxcbitcXHRcXHQgIHRlc3QtXFx1MDAzZWtleV9zaXplLCBqc29uKTtcXG4rXFx0aGV4X2J5dGVzKHZhbHVlX2hleCwgXFx1MDAyNnZhbHVlLCB0ZXN0LVxcdTAwM2V2YWx1ZV9zaXplLCBqc29uKTtcXG4rXFx0c25wcmludGYoZm9ybWF0dGVkLCBzaXplb2YoZm9ybWF0dGVkKSwgXFxcIntcXFxcXFxcImtleVxcXFxcXFwiOiV1LFxcXFxcXFwidmFsdWVcXFxcXFxcIjoldX1cXFwiLFxcbitcXHRcXHQga2V5LCB2YWx1ZSk7XFxuK1xcdGlmIChqc29uIFxcdTAwMjZcXHUwMDI2IHRlc3QtXFx1MDAzZWJ0ZilcXG4rXFx0XFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSxcXG4rXFx0XFx0XFx0IFxcXCJ7XFxcXFxcXCJrZXlcXFxcXFxcIjolcyxcXFxcXFxcInZhbHVlXFxcXFxcXCI6JXMsXFxcXFxcXCJmb3JtYXR0ZWRcXFxcXFxcIjolc31cXFwiLFxcbitcXHRcXHRcXHQga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpO1xcbitcXHRlbHNlIGlmIChqc29uKVxcbitcXHRcXHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcXFwie1xcXFxcXFwia2V5XFxcXFxcXCI6JXMsXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOiVzfVxcXCIsXFxuK1xcdFxcdFxcdCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xcbitcXHRlbHNlIGlmICh0ZXN0LVxcdTAwM2VidGYpXFxuK1xcdFxcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFxcXCIlc1xcXCIsIGZvcm1hdHRlZCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXFxcImtleTolc3ZhbHVlOiVzXFxcIiwga2V5X2hleCwgdmFsdWVfaGV4KTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfZHVtcChjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LCBfX3UzMiBpZCwgYm9vbCBqc29uLCBib29sIHByZXR0eSlcXG4re1xcbitcXHRib29sIGFycmF5ID0ganNvbiB8fCB0ZXN0LVxcdTAwM2VidGY7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgZXhwZWN0ZWRbUkVDT1JEX1NJWkVdLCBmb290ZXJbNjRdO1xcbitcXHRib29sIHNlZW5bTUFYX0VOVFJJRVNdID0ge307XFxuK1xcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcXG4rXFx0dW5zaWduZWQgaW50IGksIG47XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRvdXRwdXQgPSBjYWxsb2MoMSwgT1VUUFVUX1NJWkUpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcXFwiYWxsb2Nfb3V0cHV0XFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiJXNtYXAgZHVtcCBpZCAldVxcXCIsXFxuK1xcdFxcdCBwcmV0dHkgPyBcXFwiLXAgXFxcIiA6IGpzb24gPyBcXFwiLWogXFxcIiA6IFxcXCJcXFwiLCBpZCk7XFxuK1xcdGVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJtYXBfZHVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0LypcXG4rXFx0ICogSWdub3JlIHByZXNlbnRhdGlvbiB3aGl0ZXNwYWNlLCBidXQgY29tcGFyZSBjb21wbGV0ZSByZWNvcmRzIGFuZCBhbGxcXG4rXFx0ICogcHVuY3R1YXRpb24uIEV4cGVjdGVkIGNvbnRlbnRzIGNvbWUgb25seSBmcm9tIHRoZSBpbnB1dCBkYXRhLCBuZXZlclxcbitcXHQgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLlxcbitcXHQgKi9cXG4rXFx0Zm9yIChzcmMgPSBvdXRwdXQsIGRzdCA9IG91dHB1dDsgKnNyYzsgc3JjKyspXFxuK1xcdFxcdGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSlcXG4rXFx0XFx0XFx0KmRzdCsrID0gKnNyYztcXG4rXFx0KmRzdCA9ICdcXFxcMCc7XFxuK1xcdGN1cnNvciA9IG91dHB1dDtcXG4rXFx0aWYgKGFycmF5KSB7XFxuK1xcdFxcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICdbJywgXFxcImFycmF5X3N0YXJ0XFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRjdXJzb3IrKztcXG4rXFx0fVxcbitcXHRmb3IgKG4gPSAwOyBuIFxcdTAwM2MgdGVzdC1cXHUwMDNlY291bnQ7IG4rKykge1xcbitcXHRcXHRpZiAoYXJyYXkgXFx1MDAyNlxcdTAwMjYgbikge1xcbitcXHRcXHRcXHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAnLCcsIFxcXCJyZWNvcmRfc2VwYXJhdG9yXFxcIikpXFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRcXHRjdXJzb3IrKztcXG4rXFx0XFx0fVxcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGVzdC1cXHUwMDNlY291bnQ7IGkrKykge1xcbitcXHRcXHRcXHRpZiAoc2VlbltpXSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGV4cGVjdGVkX3JlY29yZChleHBlY3RlZCwgdGVzdCwgaSwganNvbik7XFxuK1xcdFxcdFxcdGlmICghc3RybmNtcChjdXJzb3IsIGV4cGVjdGVkLCBzdHJsZW4oZXhwZWN0ZWQpKSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFBU1NFUlRfTFQoaSwgdGVzdC1cXHUwMDNlY291bnQsIFxcXCJ1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRzZWVuW2ldID0gdHJ1ZTtcXG4rXFx0XFx0Y3Vyc29yICs9IHN0cmxlbihleHBlY3RlZCk7XFxuK1xcdH1cXG4rXFx0aWYgKGFycmF5KSB7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShjdXJzb3IsIFxcXCJdXFxcIiwgXFxcImFycmF5X2VuZF9hbmRfY291bnRcXFwiKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgXFxcIkZvdW5kJXVlbGVtZW50JXNcXFwiLCB0ZXN0LVxcdTAwM2Vjb3VudCxcXG4rXFx0XFx0XFx0IHRlc3QtXFx1MDAzZWNvdW50ID09IDEgPyBcXFwiXFxcIiA6IFxcXCJzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgXFxcInBsYWluX2NvdW50XFxcIik7XFxuK1xcdH1cXG4rb3V0OlxcbitcXHRmcmVlKG91dHB1dCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XFxuK1xcdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFx0aW50IGZkID0gLTE7XFxuK1xcbitcXHRpZiAodGVzdC1cXHUwMDNlYnRmKSB7XFxuK1xcdFxcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJidGZfbmV3XFxcIikpXFxuK1xcdFxcdFxcdHJldHVybjtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXFxcInVuc2lnbmVkIGludFxcXCIsIDQsIDApLCAxLFxcbitcXHRcXHRcXHQgICAgICAgXFxcImJ0Zl9pbnRcXFwiKSB8fFxcbitcXHRcXHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXFxcImJ0Zl9sb2FkXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcXG4rXFx0XFx0b3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xcbitcXHRcXHRvcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcXG4rXFx0fVxcbitcXHRmZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcXFwiZHVtcF9iYXRjaFxcXCIsIHRlc3QtXFx1MDAzZWtleV9zaXplLFxcbitcXHRcXHRcXHQgICAgdGVzdC1cXHUwMDNldmFsdWVfc2l6ZSwgdGVzdC1cXHUwMDNlY291bnQgPzogMSwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXFxcIm1hcF9jcmVhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0ZXN0LVxcdTAwM2Vjb3VudDsgaSsrKSB7XFxuK1xcdFxcdF9fdTMyIGtleSA9IGksIHZhbHVlID0gaSAqIDM3ICsgMTE7XFxuK1xcdFxcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaTtcXG4rXFx0XFx0dm9pZCAqa2V5X3B0ciA9IHRlc3QtXFx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVxcdTAwMjZzaG9ydF9rZXkgOiBcXHUwMDI2a2V5O1xcbitcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgXFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJtYXBfdXBkYXRlXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFxcdTAwMjZpbmZvLCBcXHUwMDI2aW5mb19sZW4pLCBcXFwibWFwX2luZm9cXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTtcXG4rXFx0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7XFxuK1xcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgdHJ1ZSk7XFxuK291dDpcXG4rXFx0aWYgKGZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9icGZ0b29sX21hcF9iYXRjaCh2b2lkKVxcbit7XFxuK1xcdHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlIGNhc2VzW10gPSB7XFxuK1xcdFxcdHsgXFxcImVtcHR5XFxcIiwgMCwgNCwgNCB9LFxcbitcXHRcXHR7IFxcXCJzaW5nbGVcXFwiLCAxLCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcImJlbG93X2JhdGNoXFxcIiwgMjU1LCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcImV4YWN0X2JhdGNoXFxcIiwgMjU2LCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcImFib3ZlX2JhdGNoXFxcIiwgMjU3LCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcIm11bHRpcGxlX2JhdGNoZXNcXFwiLCAxMDI1LCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcIm9uZV9ieXRlX2tleVxcXCIsIDI1NiwgMSwgNCB9LFxcbitcXHRcXHR7IFxcXCJvZGRfdmFsdWVfc2l6ZVxcXCIsIDI1NywgNCwgMyB9LFxcbitcXHRcXHR7IFxcXCJidGZfZW1wdHlcXFwiLCAwLCA0LCA0LCB0cnVlIH0sXFxuK1xcdFxcdHsgXFxcImJ0Zl9zaW5nbGVcXFwiLCAxLCA0LCA0LCB0cnVlIH0sXFxuK1xcdFxcdHsgXFxcImJ0Zl9tdWx0aXBsZV9iYXRjaGVzXFxcIiwgMTAyNSwgNCwgNCwgdHJ1ZSB9LFxcbitcXHR9O1xcbitcXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGNhc2VzKTsgaSsrKVxcbitcXHRcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSlcXG4rXFx0XFx0XFx0cnVuX2R1bXBfY2FzZShcXHUwMDI2Y2FzZXNbaV0pO1xcbit9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjEyOjIzLjA5OTE1MDMyOVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTA2MzMxNjMzOTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGI2MjhiOWNlNGFjZmEyODU5ZWRjMmJiNGNiYTNjNWFiMzE4ZDQwZTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIFNlcCA3IDA2OjEyOjIxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uZWE2ZjEzODkyNDVmYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTc0MCwxNSArNzQwLDEwIEBAIHN0YXRpYyBpbnQgZG9fc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xO1xuIH1cbiBcbi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuLVx0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuLVx0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuK3N0YXRpYyB2b2lkIHByaW50X21hcF9lbGVtKHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4rXHRcdFx0ICAgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQgICBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuIHtcbi1cdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuLVx0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4tXHRcdHJldHVybiAtMTtcbi1cdH1cbi1cbiBcdGlmIChqc29uX291dHB1dCkge1xuIFx0XHRwcmludF9lbnRyeV9qc29uKG1hcF9pbmZvLCBrZXksIHZhbHVlLCBidGYpO1xuIFx0fSBlbHNlIGlmIChidGYpIHtcbkBAIC03NjIsMTAgKzc1NywxMTEgQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBcdH0gZWxzZSB7XG4gXHRcdHByaW50X2VudHJ5X3BsYWluKG1hcF9pbmZvLCBrZXksIHZhbHVlKTtcbiBcdH1cbit9XG4rXG4rc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcbit7XG4rXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcbitcdFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4gXG4rXHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTtcbiBcdHJldHVybiAwO1xuIH1cbiBcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfTUFYX0JZVEVTICg0ICogMTAyNCAqIDEwMjQpXG4rXG4rLyogUmV0dXJuIDEgdG8gdXNlIGluZGl2aWR1YWwgbG9va3VwcywgYnV0IG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXG4rc3RhdGljIGludCBkdW1wX21hcF9iYXRjaChpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4rXHRcdFx0ICBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4rXHRcdFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxuK3tcbitcdF9fdTMyIGNhcGFjaXR5LCBjb3VudCwgYmF0Y2ggPSAwLCBuZXh0X2JhdGNoID0gMCwgaTtcbitcdHZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjtcbitcdGJvb2wgZmlyc3QgPSB0cnVlLCBjYW5fZmFsbGJhY2sgPSB0cnVlO1xuK1x0aW50IGVycjtcbitcbitcdC8qXG4rXHQgKiBIYXNoIGxvb2t1cCBiYXRjaGVzIG11c3QgYWNjb21tb2RhdGUgYSB3aG9sZSBidWNrZXQuIFJlc3RyaWN0IHRoZVxuK1x0ICogb3B0aW1pemF0aW9uIHRvIG1hcHMgd2hvc2Ugd29yc3QtY2FzZSBidWNrZXQgZml0cyB0aGUgbWVtb3J5IGJ1ZGdldCxcbitcdCAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLlxuK1x0ICogRGl2aXNpb24gYWxzbyBib3VuZHMgdGhlIGFsbG9jYXRpb24gbXVsdGlwbGljYXRpb25zIG9uIDMyLWJpdCBob3N0cy5cbitcdCAqL1xuK1x0aWYgKGluZm8tXHUwMDNldHlwZSAhPSBCUEZfTUFQX1RZUEVfSEFTSCB8fCAhaW5mby1cdTAwM2VtYXhfZW50cmllcyB8fFxuK1x0ICAgIChfX3U2NClpbmZvLVx1MDAzZWtleV9zaXplICsgaW5mby1cdTAwM2V2YWx1ZV9zaXplIFx1MDAzZVxuK1x0ICAgIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAvIGluZm8tXHUwMDNlbWF4X2VudHJpZXMpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0Y2FwYWNpdHkgPSBtaW4oaW5mby1cdTAwM2VtYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7XG4rcmVzaXplOlxuK1x0YnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRpZiAoIWJ1Zikge1xuK1x0XHRlcnIgPSBFTk9NRU07XG4rXHRcdGdvdG8gZXJyb3I7XG4rXHR9XG4rXHRrZXlzID0gYnVmO1xuK1x0YnVmID0gcmVhbGxvYyh2YWx1ZXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xuK1x0aWYgKCFidWYpIHtcbitcdFx0ZXJyID0gRU5PTUVNO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1x0dmFsdWVzID0gYnVmO1xuK1xuK1x0d2hpbGUgKHRydWUpIHtcbitcdFx0Y291bnQgPSBjYXBhY2l0eTtcbitcdFx0ZXJyID0gYnBmX21hcF9sb29rdXBfYmF0Y2goZmQsIGZpcnN0ID8gTlVMTCA6IFx1MDAyNmJhdGNoLFxuK1x0XHRcdFx0XHQgICBcdTAwMjZuZXh0X2JhdGNoLCBrZXlzLCB2YWx1ZXMsIFx1MDAyNmNvdW50LCBOVUxMKTtcbitcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuK1x0XHQvKlxuK1x0XHQgKiBPbGRlciBrZXJuZWxzIHJlamVjdCB0aGUgY29tbWFuZCBiZWZvcmUgdXBkYXRpbmcgY291bnQuIERvIG5vdFxuK1x0XHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxuK1x0XHQgKi9cbitcdFx0aWYgKGNhbl9mYWxsYmFjayBcdTAwMjZcdTAwMjYgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHxcbitcdFx0XHRcdCAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHtcbitcdFx0XHRlcnIgPSAxO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHRcdGNhbl9mYWxsYmFjayA9IGZhbHNlO1xuK1x0XHRpZiAoZXJyID09IEVOT1NQQykge1xuK1x0XHRcdGlmIChjYXBhY2l0eSA9PSBpbmZvLVx1MDAzZW1heF9lbnRyaWVzKVxuK1x0XHRcdFx0Z290byBlcnJvcjtcbitcdFx0XHRjYXBhY2l0eSArPSBtaW4oY2FwYWNpdHksIGluZm8tXHUwMDNlbWF4X2VudHJpZXMgLSBjYXBhY2l0eSk7XG4rXHRcdFx0LyogUHJlc2VydmUgdGhlIGlucHV0IGN1cnNvcjogdGhlIG92ZXJzaXplZCBidWNrZXQgd2FzIG5vdCByZWFkLiAqL1xuK1x0XHRcdGdvdG8gcmVzaXplO1xuK1x0XHR9XG4rXHRcdC8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovXG4rXHRcdGlmIChlcnIgXHUwMDI2XHUwMDI2IGVyciAhPSBFTk9FTlQpXG4rXHRcdFx0Z290byBlcnJvcjtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgY291bnQ7IGkrKykge1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogS2VlcCB0aGUgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgbG9va3VwcywgaW5jbHVkaW5nXG4rXHRcdFx0ICogZm9yIEJURiB0eXBlcyB3aG9zZSBtYXAga2V5L3ZhbHVlIHNpemUgaXMgbm90IGFsaWduZWQuXG4rXHRcdFx0ICovXG4rXHRcdFx0bWVtY3B5KGtleSwga2V5cyArIChzaXplX3QpaSAqIGluZm8tXHUwMDNla2V5X3NpemUsIGluZm8tXHUwMDNla2V5X3NpemUpO1xuK1x0XHRcdG1lbWNweSh2YWx1ZSwgdmFsdWVzICsgKHNpemVfdClpICogaW5mby1cdTAwM2V2YWx1ZV9zaXplLCBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xuK1x0XHRcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbitcdFx0XHQoKm51bV9lbGVtcykrKztcbitcdFx0fVxuK1x0XHRpZiAoZXJyID09IEVOT0VOVCkge1xuK1x0XHRcdGVyciA9IDA7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0Zmlyc3QgPSBmYWxzZTtcbitcdFx0YmF0Y2ggPSBuZXh0X2JhdGNoO1xuK1x0fVxuK2Vycm9yOlxuK1x0ZnByaW50ZihzdGRlcnIsIFwiRXJyb3I6IGNhbid0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXFxuXCIsIHN0cmVycm9yKGVycikpO1xuK1x0ZXJyID0gLTE7XG4rb3V0OlxuK1x0ZnJlZShrZXlzKTtcbitcdGZyZWUodmFsdWVzKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbkBAIC04NjksNiArOTY1LDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXHRcdHBfaW5mbyhcIldhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOFwiLFxuIFx0XHQgICAgICAgbWFwX3R5cGVfc3RyKTtcbiBcdH1cbitcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXHUwMDI2bnVtX2VsZW1zKTtcbitcdGlmIChlcnIgIT0gMSlcbitcdFx0Z290byBlbmRfZHVtcDtcbiBcdHdoaWxlICh0cnVlKSB7XG4gXHRcdGVyciA9IGJwZl9tYXBfZ2V0X25leHRfa2V5KGZkLCBwcmV2X2tleSwga2V5KTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg4MSw2ICs5ODAsNyBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG4rZW5kX2R1bXA6XG4gXHRpZiAod3RyKSB7XG4gXHRcdGpzb253X2VuZF9hcnJheSh3dHIpO1x0LyogZWxlbWVudHMgKi9cbiBcdFx0aWYgKHNob3dfaGVhZGVyKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjQyMTZlZDc3OGVmOVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xuQEAgLTAsMCArMSwxODcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuK1xuKyNkZWZpbmUgTUFYX0VOVFJJRVMgMTAyNVxuKyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2XG4rI2RlZmluZSBPVVRQVVRfU0laRSAoTUFYX0VOVFJJRVMgKiBSRUNPUkRfU0laRSArIDEwMjQpXG4rXG4rc3RydWN0IGR1bXBfY2FzZSB7XG4rXHRjb25zdCBjaGFyICpuYW1lO1xuK1x0dW5zaWduZWQgaW50IGNvdW50O1xuK1x0dW5zaWduZWQgaW50IGtleV9zaXplO1xuK1x0dW5zaWduZWQgaW50IHZhbHVlX3NpemU7XG4rXHRib29sIGJ0Zjtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pXG4re1xuK1x0Y29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRpZiAoanNvbilcbitcdFx0Km91dCsrID0gJ1snO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSsrKSB7XG4rXHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiBpKVxuK1x0XHRcdCpvdXQrKyA9ICcsJztcbitcdFx0b3V0ICs9IHNwcmludGYob3V0LCBqc29uID8gXCJcXFwiMHglMDJ4XFxcIlwiIDogXCIlMDJ4XCIsIGJ5dGVzW2ldKTtcbitcdH1cbitcdGlmIChqc29uKVxuK1x0XHQqb3V0KysgPSAnXSc7XG4rXHQqb3V0ID0gJ1xcMCc7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGV4cGVjdGVkX3JlY29yZChjaGFyICpyZWNvcmQsIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsXG4rXHRcdFx0ICAgIHVuc2lnbmVkIGludCBpbmRleCwgYm9vbCBqc29uKVxuK3tcbitcdF9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgKyAxMTtcbitcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7XG4rXHRjaGFyIGtleV9oZXhbNjRdLCB2YWx1ZV9oZXhbNjRdLCBmb3JtYXR0ZWRbOTZdO1xuK1xuK1x0aGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXHUwMDI2c2hvcnRfa2V5IDogXHUwMDI2a2V5LFxuK1x0XHQgIHRlc3QtXHUwMDNla2V5X3NpemUsIGpzb24pO1xuK1x0aGV4X2J5dGVzKHZhbHVlX2hleCwgXHUwMDI2dmFsdWUsIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwganNvbik7XG4rXHRzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCBcIntcXFwia2V5XFxcIjoldSxcXFwidmFsdWVcXFwiOiV1fVwiLFxuK1x0XHQga2V5LCB2YWx1ZSk7XG4rXHRpZiAoanNvbiBcdTAwMjZcdTAwMjYgdGVzdC1cdTAwM2VidGYpXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsXG4rXHRcdFx0IFwie1xcXCJrZXlcXFwiOiVzLFxcXCJ2YWx1ZVxcXCI6JXMsXFxcImZvcm1hdHRlZFxcXCI6JXN9XCIsXG4rXHRcdFx0IGtleV9oZXgsIHZhbHVlX2hleCwgZm9ybWF0dGVkKTtcbitcdGVsc2UgaWYgKGpzb24pXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwie1xcXCJrZXlcXFwiOiVzLFxcXCJ2YWx1ZVxcXCI6JXN9XCIsXG4rXHRcdFx0IGtleV9oZXgsIHZhbHVlX2hleCk7XG4rXHRlbHNlIGlmICh0ZXN0LVx1MDAzZWJ0ZilcbitcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCIlc1wiLCBmb3JtYXR0ZWQpO1xuK1x0ZWxzZVxuK1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcImtleTolc3ZhbHVlOiVzXCIsIGtleV9oZXgsIHZhbHVlX2hleCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX2R1bXAoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCwgX191MzIgaWQsIGJvb2wganNvbiwgYm9vbCBwcmV0dHkpXG4re1xuK1x0Ym9vbCBhcnJheSA9IGpzb24gfHwgdGVzdC1cdTAwM2VidGY7XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTtcbitcdGJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTtcbitcdGNoYXIgKm91dHB1dCwgKnNyYywgKmRzdCwgKmN1cnNvcjtcbitcdHVuc2lnbmVkIGludCBpLCBuO1xuK1x0aW50IGVycjtcbitcbitcdG91dHB1dCA9IGNhbGxvYygxLCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jX291dHB1dFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIiVzbWFwIGR1bXAgaWQgJXVcIixcbitcdFx0IHByZXR0eSA/IFwiLXAgXCIgOiBqc29uID8gXCItaiBcIiA6IFwiXCIsIGlkKTtcbitcdGVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcIm1hcF9kdW1wXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdC8qXG4rXHQgKiBJZ25vcmUgcHJlc2VudGF0aW9uIHdoaXRlc3BhY2UsIGJ1dCBjb21wYXJlIGNvbXBsZXRlIHJlY29yZHMgYW5kIGFsbFxuK1x0ICogcHVuY3R1YXRpb24uIEV4cGVjdGVkIGNvbnRlbnRzIGNvbWUgb25seSBmcm9tIHRoZSBpbnB1dCBkYXRhLCBuZXZlclxuK1x0ICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi5cbitcdCAqL1xuK1x0Zm9yIChzcmMgPSBvdXRwdXQsIGRzdCA9IG91dHB1dDsgKnNyYzsgc3JjKyspXG4rXHRcdGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikqc3JjKSlcbitcdFx0XHQqZHN0KysgPSAqc3JjO1xuK1x0KmRzdCA9ICdcXDAnO1xuK1x0Y3Vyc29yID0gb3V0cHV0O1xuK1x0aWYgKGFycmF5KSB7XG4rXHRcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICdbJywgXCJhcnJheV9zdGFydFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0Y3Vyc29yKys7XG4rXHR9XG4rXHRmb3IgKG4gPSAwOyBuIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBuKyspIHtcbitcdFx0aWYgKGFycmF5IFx1MDAyNlx1MDAyNiBuKSB7XG4rXHRcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJywnLCBcInJlY29yZF9zZXBhcmF0b3JcIikpXG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHRjdXJzb3IrKztcbitcdFx0fVxuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBpKyspIHtcbitcdFx0XHRpZiAoc2VlbltpXSlcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdGV4cGVjdGVkX3JlY29yZChleHBlY3RlZCwgdGVzdCwgaSwganNvbik7XG4rXHRcdFx0aWYgKCFzdHJuY21wKGN1cnNvciwgZXhwZWN0ZWQsIHN0cmxlbihleHBlY3RlZCkpKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdFx0aWYgKCFBU1NFUlRfTFQoaSwgdGVzdC1cdTAwM2Vjb3VudCwgXCJ1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRzZWVuW2ldID0gdHJ1ZTtcbitcdFx0Y3Vyc29yICs9IHN0cmxlbihleHBlY3RlZCk7XG4rXHR9XG4rXHRpZiAoYXJyYXkpIHtcbitcdFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgXCJdXCIsIFwiYXJyYXlfZW5kX2FuZF9jb3VudFwiKTtcbitcdH0gZWxzZSB7XG4rXHRcdHNucHJpbnRmKGZvb3Rlciwgc2l6ZW9mKGZvb3RlciksIFwiRm91bmQldWVsZW1lbnQlc1wiLCB0ZXN0LVx1MDAzZWNvdW50LFxuK1x0XHRcdCB0ZXN0LVx1MDAzZWNvdW50ID09IDEgPyBcIlwiIDogXCJzXCIpO1xuK1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBmb290ZXIsIFwicGxhaW5fY291bnRcIik7XG4rXHR9XG4rb3V0OlxuK1x0ZnJlZShvdXRwdXQpO1xuK31cbitcbitzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xuK1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbitcdHVuc2lnbmVkIGludCBpO1xuK1x0aW50IGZkID0gLTE7XG4rXG4rXHRpZiAodGVzdC1cdTAwM2VidGYpIHtcbitcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJidGZfbmV3XCIpKVxuK1x0XHRcdHJldHVybjtcbitcdFx0aWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXCJ1bnNpZ25lZCBpbnRcIiwgNCwgMCksIDEsXG4rXHRcdFx0ICAgICAgIFwiYnRmX2ludFwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCJidGZfbG9hZFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0b3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XG4rXHRcdG9wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbitcdFx0b3B0cy5idGZfdmFsdWVfdHlwZV9pZCA9IDE7XG4rXHR9XG4rXHRmZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfYmF0Y2hcIiwgdGVzdC1cdTAwM2VrZXlfc2l6ZSxcbitcdFx0XHQgICAgdGVzdC1cdTAwM2V2YWx1ZV9zaXplLCB0ZXN0LVx1MDAzZWNvdW50ID86IDEsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwibWFwX2NyZWF0ZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBpKyspIHtcbitcdFx0X191MzIga2V5ID0gaSwgdmFsdWUgPSBpICogMzcgKyAxMTtcbitcdFx0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpO1xuK1x0XHR2b2lkICprZXlfcHRyID0gdGVzdC1cdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcdTAwMjZzaG9ydF9rZXkgOiBcdTAwMjZrZXk7XG4rXG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmQsIGtleV9wdHIsIFx1MDAyNnZhbHVlLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJtYXBfdXBkYXRlXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2aW5mb19sZW4pLCBcIm1hcF9pbmZvXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTtcbitcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgZmFsc2UpO1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCB0cnVlKTtcbitvdXQ6XG4rXHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShmZCk7XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2JhdGNoKHZvaWQpXG4re1xuK1x0c3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHtcbitcdFx0eyBcImVtcHR5XCIsIDAsIDQsIDQgfSxcbitcdFx0eyBcInNpbmdsZVwiLCAxLCA0LCA0IH0sXG4rXHRcdHsgXCJiZWxvd19iYXRjaFwiLCAyNTUsIDQsIDQgfSxcbitcdFx0eyBcImV4YWN0X2JhdGNoXCIsIDI1NiwgNCwgNCB9LFxuK1x0XHR7IFwiYWJvdmVfYmF0Y2hcIiwgMjU3LCA0LCA0IH0sXG4rXHRcdHsgXCJtdWx0aXBsZV9iYXRjaGVzXCIsIDEwMjUsIDQsIDQgfSxcbitcdFx0eyBcIm9uZV9ieXRlX2tleVwiLCAyNTYsIDEsIDQgfSxcbitcdFx0eyBcIm9kZF92YWx1ZV9zaXplXCIsIDI1NywgNCwgMyB9LFxuK1x0XHR7IFwiYnRmX2VtcHR5XCIsIDAsIDQsIDQsIHRydWUgfSxcbitcdFx0eyBcImJ0Zl9zaW5nbGVcIiwgMSwgNCwgNCwgdHJ1ZSB9LFxuK1x0XHR7IFwiYnRmX211bHRpcGxlX2JhdGNoZXNcIiwgMTAyNSwgNCwgNCwgdHJ1ZSB9LFxuK1x0fTtcbitcdHVuc2lnbmVkIGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShjYXNlcyk7IGkrKylcbitcdFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpXG4rXHRcdFx0cnVuX2R1bXBfY2FzZShcdTAwMjZjYXNlc1tpXSk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDY6MTI6MjMuMDk5MTUxODk5WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTA2MzMxNDIxNDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBFdmFsdWF0aW9uOiBOb24tS2VybmVsIFRvb2xpbmcqKlxuXG5Pa2F5LCBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGlzIHBhdGNoIHNlcmllcyBhbmQgc2VlIGlmIGl0J3MgYSBjYW5kaWRhdGUgZm9yIHN5emthbGxlciBmdXp6aW5nLiBUaGUgZmlsZXMgbW9kaWZpZWQgYXJlIGB0b29scy9icGYvYnBmdG9vbC9tYXAuY2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jYC4gUmlnaHQgYXdheSwgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5IHJhaXNlcyBhIGZsYWcuXG5cbk5vdywgbGV0J3MgY29uc3VsdCB0aGUgZXN0YWJsaXNoZWQgcnVsZXMuIFNlY3Rpb24gMiBjbGVhcmx5IG91dGxpbmVzIG5lZ2F0aXZlIGNyaXRlcmlhIGZvciBXb3J0aEZ1enppbmcg4oCTIHNwZWNpZmljYWxseSwgXCJOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzXCIuIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpa2UgdXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cywgYXMgbG9uZyBhcyB0aGV5ICpkb24ndCogaW1wYWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4gR2l2ZW4gdGhhdCBib3RoIG1vZGlmaWVkIGZpbGVzIGFyZSBuZXN0bGVkIGZpcm1seSB3aXRoaW4gdGhlIGB0b29scy9gIHN0cnVjdHVyZSwgdGhleSBmYWxsIHNxdWFyZWx5IGludG8gdGhpcyBjYXRlZ29yeS4gYGJwZnRvb2xgIGlzIGEgdXNlci1zcGFjZSB1dGlsaXR5LCBhbmQgdGhlIHNlbGZ0ZXN0cyBhcmUganVzdCB0aGF0OiB0ZXN0cy4gVGhlc2UgY2hhbmdlcyBhcmVuJ3QgZ29pbmcgdG8gYWZmZWN0IHRoZSBjb3JlIGtlcm5lbCwgdm1saW51eC5cblxuVGhlcmVmb3JlLCBhZnRlciB0aGlzIHJldmlldywgaXQncyBjbGVhcjogV29ydGhGdXp6aW5nIGlzIGBmYWxzZWAgaW4gdGhpcyBjYXNlLlxuXG5JJ20gY29uZmlkZW50IGluIHRoaXMgYXNzZXNzbWVudC4gVGltZSB0byBmb3JtdWxhdGUgdGhlIHRvb2wgY2FsbDogYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6Njk5NiwiT3V0cHV0VG9rZW5zIjo4MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzMSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjEyOjMzLjczMjI5NTgyOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYxMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgb25seSB1c2Vyc3BhY2UgY29kZSAoYnBmdG9vbCB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgQlBGIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cyksIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG9ubHkgdXNlcnNwYWNlIGNvZGUgKGJwZnRvb2wgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIEJQRiBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMpLCB3aGljaCBkb2VzIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjoxMjozMy43MzIzMTYwNThaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow5qg46[1] Phase: Running StartedAt: 2026-09-07 06:12:44 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5qg46[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-07 06:12:44 +0000 UTC FinishedAt: 2026-09-07 06:12:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}