Name: series-workflow6fq8d Phase: Succeeded StartedAt: 2026-09-05 09:11:50 +0000 UTC FinishedAt: 2026-09-05 12:59:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[0] Phase: Succeeded StartedAt: 2026-09-05 09:11:50 +0000 UTC FinishedAt: 2026-09-05 09:15:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[0].run-triage Phase: Succeeded StartedAt: 2026-09-05 09:11:50 +0000 UTC FinishedAt: 2026-09-05 09:15:34 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "76671054f9a1ff6abb976583cd8da37650acdc97", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "KVM_INTEL", "KVM_AMD", "KVM_GUEST_MEMFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "76671054f9a1ff6abb976583cd8da37650acdc97", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "KVM_INTEL", "KVM_AMD", "KVM_GUEST_MEMFD" ], "series_id": "d3db87e0-2050-4b46-a2eb-96736648f72a" }, "track": "KASAN", "fuzz": { "focus": [ "kvm" ], "focus_symbols": [ "kvm_gmem_bind", "kvm_set_memslot", "kvm_set_memory_region" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtLVk1fSU5URUwmIzM0OywKICAgICYjMzQ7S1ZNX0FNRCYjMzQ7LAogICAgJiMzNDtLVk1fR1VFU1RfTUVNRkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9iaW5kJiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICAgJiMzNDtrdm1fc2V0X21lbW9yeV9yZWdpb24mIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgb3JkZXJpbmcgYW5kIGVycm9yIGhhbmRsaW5nIG9mIGBrdm1fZ21lbV9iaW5kKClgIGR1cmluZyBLVk0gbWVtc2xvdCBjcmVhdGlvbiBhbmQgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgYHhhX3N0b3JlX3JhbmdlKClgLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBzdHJ1Y3R1cmUgZmllbGRzIHRvdWNoZWQgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZC4gQW55IHJlc291cmNlIGxpZmVjeWNsZSBlcnJvcnMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWUgaW4gZXJyb3IgdW53aW5kIHBhdGhzKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gVGhlcmVmb3JlLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbXNsb3QgbWFuYWdlbWVudCBhbmQgZ3Vlc3RfbWVtZmQgYmluZGluZyBsb2dpYywgbW92aW5nIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCkgdW5kZXIgc2xvdHNfYXJjaF9sb2NrLCBhZGRpbmcgZXJyb3IgaGFuZGxpbmcgYW5kIHJvbGxiYWNrIGZvciB4YV9zdG9yZV9yYW5nZSgpLCBhbmQgaW50cm9kdWNpbmcgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zIGFuZCBlcnJvciBwYXRocy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgS1ZNIG1lbW9yeSByZWdpb24gaW9jdGxzIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZmJmOTU5MTZkNmIxOWRjMTc2YjNiMGU5MDRlMmYxNWVjNDVlZGZjMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMDk6MTQ6MzAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbmluZGV4IGI1OTY0ODZkMTg0Y2EuLjZjOGRmNjczODJmY2UgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5AQCAtNjEyLDEwICYjNDM7NjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiBcdGludCByID0gLUVJTlZBTDtcbiYjNDM7XHR2b2lkICp4YXI7XG4gXG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShzbG90LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuIFx0ZmlsZSA9IGZnZXQoZmQpO1xuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuQEAgLTY0OSwxMiAmIzQzOzY1MywyMCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxuIFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4gXHQgKi9cbi1cdFdSSVRFX09OQ0Uoc2xvdC1cdTAwM2VnbWVtLmZpbGUsIGZpbGUpO1xuJiM0MztcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiBcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiBcbi1cdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiYjNDM7XHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4mIzQzO1xuJiM0MztcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiYjNDM7XHRpZiAocikge1xuJiM0MztcdFx0eGFfc3RvcmVfcmFuZ2UoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIE5VTEwsIEdGUF9LRVJORUwpO1xuJiM0MztcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuJiM0MztcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gMDtcbiYjNDM7XHRcdHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZO1xuJiM0MztcdH1cbiBcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiBcbiBcdC8qXG5AQCAtNjYyLDcgJiM0Mzs2NzQsNiBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGVcbiBcdCAqIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBtZW1zbG90cyBhcmUgZGVzdHJveWVkLlxuIFx0ICovXG4tXHRyID0gMDtcbiBlcnI6XG4gXHRmcHV0KGZpbGUpO1xuIFx0cmV0dXJuIHI7XG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbmluZGV4IDY1ZWIyNmEwNTIwZDguLjIxYzEwY2JiYWM2NjEgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXG5AQCAtMTg4Nyw3ICYjNDM7MTg4Nyw4IEBAIHN0YXRpYyB2b2lkIGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXG4tXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSlcbiYjNDM7XHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbiYjNDM7XHRcdFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcbiB7XG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICppbnZhbGlkX3Nsb3Q7XG4gXHRpbnQgcjtcbkBAIC0xOTMxLDIwICYjNDM7MTkzMiwxNiBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHR9XG4gXG4gXHRyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuLVx0aWYgKHIpIHtcbi1cdFx0Lypcbi1cdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm9cbi1cdFx0ICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkXG4tXHRcdCAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzb1xuLVx0XHQgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbi1cdFx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbi1cdFx0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbi1cdFx0fVxuLVx0XHRyZXR1cm4gcjtcbiYjNDM7XHRpZiAocilcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbiYjNDM7XHRcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxuJiM0MztcdFx0XHRnb3RvIGVycl9iaW5kO1xuJiM0MztcbiYjNDM7XHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XG4mIzQzO1x0XHRpZiAocilcbiYjNDM7XHRcdFx0Z290byBlcnJfYmluZDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbiBcbiBcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7ZXJyX2JpbmQ6XG4mIzQzO1x0aWYgKG5ldykge1xuJiM0MztcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobmV3LVx1MDAzZWRpcnR5X2JpdG1hcCBcdTAwMjZcdTAwMjYgKCFvbGQgfHwgIW9sZC1cdTAwM2VkaXJ0eV9iaXRtYXApKVxuJiM0MztcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbiYjNDM7XHR9XG4mIzQzO2VycjpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcbiYjNDM7XHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cbiYjNDM7XHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuJiM0MztcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4mIzQzO1x0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiByO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXG5AQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0aWYgKFdBUk5fT05fT05DRShrdm0tXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcdTAwM2Mgb2xkLVx1MDAzZW5wYWdlcykpXG4gXHRcdFx0cmV0dXJuIC1FSU87XG4gXG4tXHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUpO1xuJiM0MztcdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xuIFx0fVxuIFxuIFx0YmFzZV9nZm4gPSAobWVtLVx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjEwNSwyMSAmIzQzOzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuIFx0bmV3LVx1MDAzZW5wYWdlcyA9IG5wYWdlcztcbiBcdG5ldy1cdTAwM2VmbGFncyA9IG1lbS1cdTAwM2VmbGFncztcbiBcdG5ldy1cdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cdTAwM2V1c2Vyc3BhY2VfYWRkcjtcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbi1cdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4tXHRcdGlmIChyKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0fVxuIFxuLVx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuJiM0MztcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxuJiM0MztcdFx0XHQgICAgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbiBcdGlmIChyKVxuLVx0XHRnb3RvIG91dF91bmJpbmQ7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcbiBcdHJldHVybiAwO1xuIFxuLW91dF91bmJpbmQ6XG4tXHRpZiAobWVtLVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKVxuLVx0XHRrdm1fZ21lbV91bmJpbmQobmV3KTtcbiBvdXQ6XG4gXHRrZnJlZShuZXcpO1xuIFx0cmV0dXJuIHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O0tWTV9JTlRFTCYjMzQ7LAogICAgJiMzNDtLVk1fQU1EJiMzNDssCiAgICAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2JpbmQmIzM0OywKICAgICYjMzQ7a3ZtX3NldF9tZW1zbG90JiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtb3J5X3JlZ2lvbiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBLVk0gbWVtc2xvdCBtYW5hZ2VtZW50IGFuZCBndWVzdF9tZW1mZCBiaW5kaW5nIGxvZ2ljLCBtb3Zpbmcga3ZtX2dtZW1fYmluZCgpIGluc2lkZSBrdm1fc2V0X21lbXNsb3QoKSB1bmRlciBzbG90c19hcmNoX2xvY2ssIGFkZGluZyBlcnJvciBoYW5kbGluZyBhbmQgcm9sbGJhY2sgZm9yIHhhX3N0b3JlX3JhbmdlKCksIGFuZCBpbnRyb2R1Y2luZyBuZXcgV0FSTl9PTl9PTkNFIGFzc2VydGlvbnMgYW5kIGVycm9yIHBhdGhzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBLVk0gbWVtb3J5IHJlZ2lvbiBpb2N0bHMgYW5kIHdhcnJhbnRzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmYmY5NTkxNmQ2YjE5ZGMxNzZiM2IwZTkwNGUyZjE1ZWM0NWVkZmMwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgNSAwOToxNDozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCmluZGV4IGI1OTY0ODZkMTg0Y2EuLjZjOGRmNjczODJmY2UgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwpAQCAtNjEyLDEwICYjNDM7NjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCByID0gLUVJTlZBTDsKJiM0MzsJdm9pZCAqeGFyOwogCiAJQlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpOwogCUJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LSZndDtnbWVtLnBnb2ZmKSk7CiAKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzbG90LSZndDtmbGFncyAmYW1wOyBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKQEAgLTY0OSwxMiAmIzQzOzY1MywyMCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsCiAJICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3QKIAkgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS4KIAkgKi8KLQlXUklURV9PTkNFKHNsb3QtJmd0O2dtZW0uZmlsZSwgZmlsZSk7CiYjNDM7CXNsb3QtJmd0O2dtZW0uZmlsZSA9IGZpbGU7CiAJc2xvdC0mZ3Q7Z21lbS5wZ29mZiA9IHN0YXJ0OwogCWlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSkKIAkJc2xvdC0mZ3Q7ZmxhZ3MgfD0gS1ZNX01FTVNMT1RfR01FTV9PTkxZOwogCi0JeGFfc3RvcmVfcmFuZ2UoJmFtcDtmLSZndDtiaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpOwomIzQzOwl4YXIgPSB4YV9zdG9yZV9yYW5nZSgmYW1wO2YtJmd0O2JpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7CiYjNDM7CiYjNDM7CXIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDsKJiM0MzsJaWYgKHIpIHsKJiM0MzsJCXhhX3N0b3JlX3JhbmdlKCZhbXA7Zi0mZ3Q7YmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTsKJiM0MzsJCXNsb3QtJmd0O2dtZW0uZmlsZSA9IE5VTEw7CiYjNDM7CQlzbG90LSZndDtnbWVtLnBnb2ZmID0gMDsKJiM0MzsJCXNsb3QtJmd0O2ZsYWdzICZhbXA7PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZOwomIzQzOwl9CiAJZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKIAogCS8qCkBAIC02NjIsNyAmIzQzOzY3NCw2IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAkgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGUKIAkgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC4KIAkgKi8KLQlyID0gMDsKIGVycjoKIAlmcHV0KGZpbGUpOwogCXJldHVybiByOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC0xODg3LDcgJiM0MzsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldywKLQkJCSAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpCiYjNDM7CQkJICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSwKJiM0MzsJCQkgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KQogewogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDsKIAlpbnQgcjsKQEAgLTE5MzEsMjAgJiM0MzsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAl9CiAKIAlyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwotCWlmIChyKSB7Ci0JCS8qCi0JCSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vCi0JCSAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZAotCQkgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28KLQkJICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suCi0JCSAqLwotCQlpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7Ci0JCQlrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTsKLQkJCWtmcmVlKGludmFsaWRfc2xvdCk7Ci0JCX0gZWxzZSB7Ci0JCQltdXRleF91bmxvY2soJmFtcDtrdm0tJmd0O3Nsb3RzX2FyY2hfbG9jayk7Ci0JCX0KLQkJcmV0dXJuIHI7CiYjNDM7CWlmIChyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CWlmIChuZXcgJmFtcDsmYW1wOyBuZXctJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKQomIzQzOwkJCWdvdG8gZXJyX2JpbmQ7CiYjNDM7CiYjNDM7CQlyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpOwomIzQzOwkJaWYgKHIpCiYjNDM7CQkJZ290byBlcnJfYmluZDsKIAl9CiAKIAkvKgpAQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sCiAJa3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7CiAKIAlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJfYmluZDoKJiM0MzsJaWYgKG5ldykgewomIzQzOwkJa3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTsKJiM0MzsKJiM0MzsJCWlmIChuZXctJmd0O2RpcnR5X2JpdG1hcCAmYW1wOyZhbXA7ICghb2xkIHx8ICFvbGQtJmd0O2RpcnR5X2JpdG1hcCkpCiYjNDM7CQkJa3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7CiYjNDM7CX0KJiM0MztlcnI6CiYjNDM7CS8qCiYjNDM7CSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnMKJiM0MzsJICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuCiYjNDM7CSAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay4KJiM0MzsJICovCiYjNDM7CWlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHsKJiM0MzsJCWt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpOwomIzQzOwkJa2ZyZWUoaW52YWxpZF9zbG90KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO2t2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLApAQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAkJaWYgKFdBUk5fT05fT05DRShrdm0tJmd0O25yX21lbXNsb3RfcGFnZXMgJmx0OyBvbGQtJmd0O25wYWdlcykpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTsKJiM0MzsJCXJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTsKIAl9CiAKIAliYXNlX2dmbiA9IChtZW0tJmd0O2d1ZXN0X3BoeXNfYWRkciAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKQEAgLTIxMDUsMjEgJiM0MzsyMTIzLDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAluZXctJmd0O25wYWdlcyA9IG5wYWdlczsKIAluZXctJmd0O2ZsYWdzID0gbWVtLSZndDtmbGFnczsKIAluZXctJmd0O3VzZXJzcGFjZV9hZGRyID0gbWVtLSZndDt1c2Vyc3BhY2VfYWRkcjsKLQlpZiAobWVtLSZndDtmbGFncyAmYW1wOyBLVk1fTUVNX0dVRVNUX01FTUZEKSB7Ci0JCXIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBtZW0tJmd0O2d1ZXN0X21lbWZkLCBtZW0tJmd0O2d1ZXN0X21lbWZkX29mZnNldCk7Ci0JCWlmIChyKQotCQkJZ290byBvdXQ7Ci0JfQogCi0JciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwomIzQzOwlyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSwKJiM0MzsJCQkgICAgbWVtLSZndDtndWVzdF9tZW1mZCwgbWVtLSZndDtndWVzdF9tZW1mZF9vZmZzZXQpOwogCWlmIChyKQotCQlnb3RvIG91dF91bmJpbmQ7CiYjNDM7CQlnb3RvIG91dDsKIAogCXJldHVybiAwOwogCi1vdXRfdW5iaW5kOgotCWlmIChtZW0tJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpCi0JCWt2bV9nbWVtX3VuYmluZChuZXcpOwogb3V0OgogCWtmcmVlKG5ldyk7CiAJcmV0dXJuIHI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3OTkKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA5NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpcyAmYW1wOyBGdXp6aW5nIFN0cmF0ZWd5KioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7SXMgdGhpcyBmdXp6LXdvcnRoeT8mIzM0OyBJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgdGhlIHBvdGVudGlhbCBpbXBhY3QgYW5kIGlkZW50aWZ5IHRoZSBtb3N0IHByb21pc2luZyBhcmVhcyBmb3IgZnV6emluZy4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBhbnkgc2lnbnMgb2YgbWVtb3J5IHNhZmV0eSB2dWxuZXJhYmlsaXRpZXMgb3IgbG9naWMgZmxhd3MgdGhhdCBjb3VsZCBiZSBleHBsb2l0ZWQuCgpGaXJzdCwgSSBzZWUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIGdvb2QsIHRoYXQmIzM5O3Mgd2hhdCBJJiMzOTttIGNvbWZvcnRhYmxlIHdpdGguIE5vdywgdGhlIGZpbGVzIG1vZGlmaWVkIGp1bXAgb3V0IGF0IG1lOiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYW5kIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gSW50ZXJlc3RpbmcuIEtlcm5lbCBWaXJ0dWFsIE1hY2hpbmUgKEtWTSkgY29kZSDigJMgZGVmaW5pdGVseSB3b3J0aCBhIGNsb3NlciBsb29rLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGJlZW4gY2hhbmdlZCBpbiB0aGVzZSBmaWxlcyBhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIFRpbWUgdG8gcHVsbCB1cCBteSB0cnVzdHkgdG9vbHMgYW5kIGdldCBhIGRldGFpbGVkIGxvb2sgYXQgdGhlIHBhdGNoIGNvbnRlbnRzLiBJJiMzOTtsbCBiZSBzY3J1dGluaXppbmcgdGhvc2UgY29kZSBzbmlwcGV0cyB0byBtYXAgb3V0IHRoZSBhdHRhY2sgc3VyZmFjZSBhbmQgdGhpbmsgc3RyYXRlZ2ljYWxseS4gSSYjMzk7bGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByaWdodCBmb2N1cyBzeW1ib2xzIGFuZCBjb25maWdzIHRvIG1heGltaXplIG91ciBmdXp6aW5nIGVmZm9ydHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7S1ZNX01FTV9HVUVTVF9NRU1GRCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NjA2PWludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1MS1cdC8qXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jOjY1MjpcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjUzLVx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3Rcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTkzNj1zdGF0aWMgdm9pZCBrdm1fZnJlZV9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdClcbnZpcnQva3ZtL2t2bV9tYWluLmMtOTM3LXtcbnZpcnQva3ZtL2t2bV9tYWluLmM6OTM4Olx0aWYgKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTkzOS1cdFx0a3ZtX2dtZW1fdW5iaW5kKHNsb3QpO1xuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9MTU3ND1zdGF0aWMgaW50IGNoZWNrX21lbW9yeV9yZWdpb25fZmxhZ3Moc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU3OS1cdGlmIChJU19FTkFCTEVEKENPTkZJR19LVk1fR1VFU1RfTUVNRkQpKVxudmlydC9rdm0va3ZtX21haW4uYzoxNTgwOlx0XHR2YWxpZF9mbGFncyB8PSBLVk1fTUVNX0dVRVNUX01FTUZEO1xudmlydC9rdm0va3ZtX21haW4uYy0xNTgxLVxudmlydC9rdm0va3ZtX21haW4uYy0xNTgyLVx0LyogRGlydHkgbG9nZ2luZyBwcml2YXRlIG1lbW9yeSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gKi9cbnZpcnQva3ZtL2t2bV9tYWluLmM6MTU4MzpcdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE1ODQtXHRcdHZhbGlkX2ZsYWdzIFx1MDAyNj0gfktWTV9NRU1fTE9HX0RJUlRZX1BBR0VTO1xuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU5MS1cdGlmIChrdm1fYXJjaF9oYXNfcmVhZG9ubHlfbWVtKGt2bSkgXHUwMDI2XHUwMDI2XG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE1OTI6XHQgICAgIShtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpKVxudmlydC9rdm0va3ZtX21haW4uYy0xNTkzLVx0XHR2YWxpZF9mbGFncyB8PSBLVk1fTUVNX1JFQURPTkxZO1xuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9MTY5Nz1zdGF0aWMgdm9pZCBrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTczMy1cdFx0ICovXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE3MzQ6XHRcdFdBUk5fT05fT05DRShvbGQtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpO1xudmlydC9rdm0va3ZtX21haW4uYy0xNzM1LVx0XHRmYWxsdGhyb3VnaDtcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE3NDktXHRcdCAqL1xudmlydC9rdm0va3ZtX21haW4uYzoxNzUwOlx0XHRpZiAoV0FSTl9PTl9PTkNFKG9sZC1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkpXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE3NTEtXHRcdFx0a3ZtX2dtZW1fdW5iaW5kKG9sZCk7XG4tLVxudmlydC9rdm0va3ZtX21haW4uYz0xODg3PXN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE5MzctXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE5Mzg6XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTkzOS1cdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4tLVxudmlydC9rdm0va3ZtX21haW4uYz0yMDEzPXN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwNDQtXHRcdHJldHVybiAtRUlOVkFMO1xudmlydC9rdm0va3ZtX21haW4uYzoyMDQ1Olx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCBcdTAwMjZcdTAwMjZcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA0Ni1cdCAgICAobWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCBcdTAwMjYgKFBBR0VfU0laRSAtIDEpIHx8XG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0yMDk1LVx0XHQvKiBQcml2YXRlIG1lbXNsb3RzIGFyZSBpbW11dGFibGUsIHRoZXkgY2FuIG9ubHkgYmUgZGVsZXRlZC4gKi9cbnZpcnQva3ZtL2t2bV9tYWluLmM6MjA5NjpcdFx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRClcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA5Ny1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwOTktXHRcdCAgICAobnBhZ2VzICE9IG9sZC1cdTAwM2VucGFnZXMpIHx8XG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIxMDA6XHRcdCAgICAoKG1lbS1cdTAwM2VmbGFncyBeIG9sZC1cdTAwM2VmbGFncykgXHUwMDI2IChLVk1fTUVNX1JFQURPTkxZIHwgS1ZNX01FTV9HVUVTVF9NRU1GRCkpKVxudmlydC9rdm0va3ZtX21haW4uYy0yMTAxLVx0XHRcdHJldHVybiAtRUlOVkFMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY0NjIKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIGludG8gdGhlIEtWTSBDb2RlKioKCk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGNoYW5nZXMgcmVsYXRlZCB0byB0aGVzZSBtZW1mZCB1cGRhdGVzIHdpdGhpbiB0aGUgS1ZNIHN1YnN5c3RlbS4gVGhlIHBhdGNoIG1lbnRpb25zIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhbmQgYHZpcnQva3ZtL2t2bV9tYWluLmNgIGFyb3VuZCB0aGUgbW9kaWZpZWQgbGluZXMuIFJpZ2h0LCB0aGF0IG1ha2VzIHNlbnNlLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBndWVzdCBtZW1vcnkgYW5kIG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIGludGVyYWN0IHdpdGhpbiBLVk0sIGFuZCBob3cgdGhlIGNvcmUgS1ZNIGxvZ2ljIGhhbmRsZXMgdGhpcy4gVGltZSB0byBkaWcgaW4gYW5kIGNyb3NzLXJlZmVyZW5jZSB0aGUgcmVsZXZhbnQgY29kZSBibG9ja3MuIExldCYjMzk7cyBzZWUgaG93IHRoZXNlIHBhcnRpY3VsYXIgZmlsZXMgaW5mbHVlbmNlIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZSBoZXJlLiBUaGlzIHdpbGwgYmUgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBmdWxsIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYwNTpcdFxuIDYwNjpcdGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiA2MDc6XHRcdFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXG4gNjA4Olx0e1xuIDYwOTpcdFx0dW9mZl90IHNpemUgPSBzbG90LVx1MDAzZW5wYWdlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiA2MTA6XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDtcbiA2MTE6XHRcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XG4gNjEyOlx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIDYxMzpcdFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gNjE0Olx0XHRpbnQgciA9IC1FSU5WQUw7XG4gNjE1Olx0XHR2b2lkICp4YXI7XG4gNjE2Olx0XG4gNjE3Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gNjE4Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gNjE5Olx0XG4gNjIwOlx0XHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXG4gNjIxOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYyMjpcdFxuIDYyMzpcdFx0ZmlsZSA9IGZnZXQoZmQpO1xuIDYyNDpcdFx0aWYgKCFmaWxlKVxuIDYyNTpcdFx0XHRyZXR1cm4gLUVCQURGO1xuIDYyNjpcdFxuIDYyNzpcdFx0aWYgKGZpbGUtXHUwMDNlZl9vcCAhPSBcdTAwMjZrdm1fZ21lbV9mb3BzKVxuIDYyODpcdFx0XHRnb3RvIGVycjtcbiA2Mjk6XHRcbiA2MzA6XHRcdGYgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiA2MzE6XHRcdGlmIChmLVx1MDAzZWt2bSAhPSBrdm0pXG4gNjMyOlx0XHRcdGdvdG8gZXJyO1xuIDYzMzpcdFxuIDYzNDpcdFx0aW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xuIDYzNTpcdFxuIDYzNjpcdFx0aWYgKCFQQUdFX0FMSUdORUQob2Zmc2V0KSB8fCBvZmZzZXQgJiM0Mzsgc2l6ZSBcdTAwM2UgaV9zaXplX3JlYWQoaW5vZGUpKVxuIDYzNzpcdFx0XHRnb3RvIGVycjtcbiA2Mzg6XHRcbiA2Mzk6XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gNjQwOlx0XG4gNjQxOlx0XHRzdGFydCA9IG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiA2NDI6XHRcdGVuZCA9IHN0YXJ0ICYjNDM7IHNsb3QtXHUwMDNlbnBhZ2VzO1xuIDY0MzpcdFxuIDY0NDpcdFx0aWYgKCF4YV9lbXB0eShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzKSBcdTAwMjZcdTAwMjZcbiA2NDU6XHRcdCAgICB4YV9maW5kKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIFx1MDAyNnN0YXJ0LCBlbmQgLSAxLCBYQV9QUkVTRU5UKSkge1xuIDY0NjpcdFx0XHRyID0gLUVFWElTVDtcbiA2NDc6XHRcdFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDY0ODpcdFx0XHRnb3RvIGVycjtcbiA2NDk6XHRcdH1cbiA2NTA6XHRcbiA2NTE6XHRcdC8qXG4gNjUyOlx0XHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXG4gNjUzOlx0XHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxuIDY1NDpcdFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4gNjU1Olx0XHQgKi9cbiA2NTY6XHRcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiA2NTc6XHRcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIDY1ODpcdFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIDY1OTpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2NjA6XHRcbiA2NjE6XHRcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiA2NjI6XHRcbiA2NjM6XHRcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiA2NjQ6XHRcdGlmIChyKSB7XG4gNjY1Olx0XHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbiA2NjY6XHRcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuIDY2NzpcdFx0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuIDY2ODpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2Njk6XHRcdH1cbiA2NzA6XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiA2NzE6XHRcbiA2NzI6XHRcdC8qXG4gNjczOlx0XHQgKiBEcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhlIGZpbGUsIGV2ZW4gb24gc3VjY2Vzcy4gIFRoZSBmaWxlIHBpbnMgS1ZNLFxuIDY3NDpcdFx0ICogbm90IHRoZSBvdGhlciB3YXkgJiMzOTtyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXG4gNjc1Olx0XHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cbiA2NzY6XHRcdCAqL1xuIDY3NzpcdGVycjpcbiA2Nzg6XHRcdGZwdXQoZmlsZSk7XG4gNjc5Olx0XHRyZXR1cm4gcjtcbiA2ODA6XHR9XG4gNjgxOlx0XG4gNjgyOlx0c3RhdGljIHZvaWQgX19rdm1fZ21lbV91bmJpbmQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwgc3RydWN0IGdtZW1fZmlsZSAqZilcbiA2ODM6XHR7XG4gNjg0Olx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gc2xvdC1cdTAwM2VnbWVtLnBnb2ZmO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc5NjIKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAzOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDoKCioqRGlnZ2luZyBpbnRvIE1lbW9yeSBNYW5hZ2VtZW50IGluIEtWTSoqCgpPa2F5LCBzbyB3ZSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IG1lbW9yeSByZWdpb25zIGFyZSBiZWluZyBzZXQgdXAgYW5kIG1hbmFnZWQgd2l0aGluIEtWTS4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gemVybyBpbiBvbiBgdmlydC9rdm0va3ZtX21haW4uY2AgYmVjYXVzZSB0aGF0JiMzOTtzIHVzdWFsbHkgdGhlIGhlYXJ0IG9mIHRoZSBjb3JlIEtWTSBsb2dpYy4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGludGVyYWN0aW9ucyBhcm91bmQgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLiBUaGVzZSBmdW5jdGlvbnMgYXJlIGdvaW5nIHRvIGJlIGNyaXRpY2FsIGZvciB0cmFja2luZyBob3cgbWVtb3J5IGlzIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQgcG90ZW50aWFsbHkgcmVtYXBwZWQgd2l0aGluIHRoZSBndWVzdCYjMzk7cyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyB0aGUgaG9zdCBtYXBzIHRoZSBndWVzdCYjMzk7cyBwaHlzaWNhbCBtZW1vcnksIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgaHlwZXJ2aXNvciYjMzk7cyB2aWV3IGFuZCB0aGUgaGFyZHdhcmUuIExldCYjMzk7cyBzZWUgaG93IHRoZXNlIGFyZSBjYWxsZWQsIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIHRoZXkgbWFuaXB1bGF0ZSwgYW5kIHdoYXQgaW1wbGljYXRpb25zIHRob3NlIG1hbmlwdWxhdGlvbnMgaGF2ZSBvbiB0aGUgb3ZlcmFsbCBtZW1vcnkgb3JnYW5pemF0aW9uLiBIb3BlZnVsbHksIGxvb2tpbmcgYXQgdGhlc2UgZnVuY3Rpb25zIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgaXMgaGFuZGxlZCBhdCB0aGUgS1ZNIGxldmVsLCBlc3BlY2lhbGx5IHdoZW4gY29uc2lkZXJpbmcgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgaG90cGx1Z2dpbmcgc2NlbmFyaW9zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0va3ZtX21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4ODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE4ODA6XHRcdCAqIGFuIGludGVybWVkaWF0ZSBzdGVwLiBJbnN0ZWFkLCB0aGUgb2xkIG1lbXNsb3QgaXMgc2ltcGx5IHJlcGxhY2VkXG4xODgxOlx0XHQgKiB3aXRoIGEgbmV3LCB1cGRhdGVkIGNvcHkgaW4gYm90aCBtZW1zbG90IHNldHMuXG4xODgyOlx0XHQgKi9cbjE4ODM6XHRcdGt2bV9yZXBsYWNlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldyk7XG4xODg0Olx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcbjE4ODU6XHR9XG4xODg2Olx0XG4xODg3Olx0c3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuMTg4ODpcdFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCxcbjE4ODk6XHRcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXG4xODkwOlx0XHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbjE4OTE6XHRcdFx0XHQgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KVxuMTg5MjpcdHtcbjE4OTM6XHRcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDtcbjE4OTQ6XHRcdGludCByO1xuMTg5NTpcdFxuMTg5NjpcdFx0LypcbjE4OTc6XHRcdCAqIFJlbGVhc2VkIGluIGt2bV9zd2FwX2FjdGl2ZV9tZW1zbG90cygpLlxuMTg5ODpcdFx0ICpcbjE4OTk6XHRcdCAqIE11c3QgYmUgaGVsZCBmcm9tIGJlZm9yZSB0aGUgY3VycmVudCBtZW1zbG90cyBhcmUgY29waWVkIHVudGlsIGFmdGVyXG4xOTAwOlx0XHQgKiB0aGUgbmV3IG1lbXNsb3RzIGFyZSBpbnN0YWxsZWQgd2l0aCByY3VfYXNzaWduX3BvaW50ZXIsIHRoZW5cbjE5MDE6XHRcdCAqIHJlbGVhc2VkIGJlZm9yZSB0aGUgc3luY2hyb25pemUgc3JjdSBpbiBrdm1fc3dhcF9hY3RpdmVfbWVtc2xvdHMoKS5cbjE5MDI6XHRcdCAqXG4xOTAzOlx0XHQgKiBXaGVuIG1vZGlmeWluZyBtZW1zbG90cyBvdXRzaWRlIG9mIHRoZSBzbG90c19sb2NrLCBtdXN0IGJlIGhlbGRcbjE5MDQ6XHRcdCAqIGJlZm9yZSByZWFkaW5nIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1lbXNsb3RzIHVudGlsIGFmdGVyIGFsbFxuMTkwNTpcdFx0ICogY2hhbmdlcyB0byB0aG9zZSBtZW1zbG90cyBhcmUgY29tcGxldGUuXG4xOTA2Olx0XHQgKlxuMTkwNzpcdFx0ICogVGhlc2UgcnVsZXMgZW5zdXJlIHRoYXQgaW5zdGFsbGluZyBuZXcgbWVtc2xvdHMgZG9lcyBub3QgbG9zZVxuMTkwODpcdFx0ICogY2hhbmdlcyBtYWRlIHRvIHRoZSBwcmV2aW91cyBtZW1zbG90cy5cbjE5MDk6XHRcdCAqL1xuMTkxMDpcdFx0bXV0ZXhfbG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbjE5MTE6XHRcbjE5MTI6XHRcdC8qXG4xOTEzOlx0XHQgKiBJbnZhbGlkYXRlIHRoZSBvbGQgc2xvdCBpZiBpdCYjMzk7cyBiZWluZyBkZWxldGVkIG9yIG1vdmVkLiAgVGhpcyBpc1xuMTkxNDpcdFx0ICogZG9uZSBwcmlvciB0byBhY3R1YWxseSBkZWxldGluZy9tb3ZpbmcgdGhlIG1lbXNsb3QgdG8gYWxsb3cgdkNQVXMgdG9cbjE5MTU6XHRcdCAqIGNvbnRpbnVlIHJ1bm5pbmcgYnkgZW5zdXJpbmcgdGhlcmUgYXJlIG5vIG1hcHBpbmdzIG9yIHNoYWRvdyBwYWdlc1xuMTkxNjpcdFx0ICogZm9yIHRoZSBtZW1zbG90IHdoZW4gaXQgaXMgZGVsZXRlZC9tb3ZlZC4gIFdpdGhvdXQgcHJlLWludmFsaWRhdGlvblxuMTkxNzpcdFx0ICogKGFuZCB3aXRob3V0IGEgbG9jayksIGEgd2luZG93IHdvdWxkIGV4aXN0IGJldHdlZW4gZWZmZWN0aW5nIHRoZVxuMTkxODpcdFx0ICogZGVsZXRlL21vdmUgYW5kIGNvbW1pdHRpbmcgdGhlIGNoYW5nZXMgaW4gYXJjaCBjb2RlIHdoZXJlIEtWTSBvciBhXG4xOTE5Olx0XHQgKiBndWVzdCBjb3VsZCBhY2Nlc3MgYSBub24tZXhpc3RlbnQgbWVtc2xvdC5cbjE5MjA6XHRcdCAqXG4xOTIxOlx0XHQgKiBNb2RpZmljYXRpb25zIGFyZSBkb25lIG9uIGEgdGVtcG9yYXJ5LCB1bnJlYWNoYWJsZSBzbG90LiAgVGhlIG9sZFxuMTkyMjpcdFx0ICogc2xvdCBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgaW4gY2FzZSBhIGxhdGVyIHN0ZXAgZmFpbHMgYW5kIHRoZVxuMTkyMzpcdFx0ICogaW52YWxpZGF0aW9uIG5lZWRzIHRvIGJlIHJldmVydGVkLlxuMTkyNDpcdFx0ICovXG4xOTI1Olx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4xOTI2Olx0XHRcdGludmFsaWRfc2xvdCA9IGt6YWxsb2Nfb2JqKCppbnZhbGlkX3Nsb3QsIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4xOTI3Olx0XHRcdGlmICghaW52YWxpZF9zbG90KSB7XG4xOTI4Olx0XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmt2bS1cdTAwM2VzbG90c19hcmNoX2xvY2spO1xuMTkyOTpcdFx0XHRcdHJldHVybiAtRU5PTUVNO1xuMTkzMDpcdFx0XHR9XG4xOTMxOlx0XHRcdGt2bV9pbnZhbGlkYXRlX21lbXNsb3Qoa3ZtLCBvbGQsIGludmFsaWRfc2xvdCk7XG4xOTMyOlx0XHR9XG4xOTMzOlx0XG4xOTM0Olx0XHRyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuMTkzNTpcdFx0aWYgKHIpXG4xOTM2Olx0XHRcdGdvdG8gZXJyO1xuMTkzNzpcdFxuMTkzODpcdFx0aWYgKG5ldyBcdTAwMjZcdTAwMjYgbmV3LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XG4xOTM5Olx0XHRcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxuMTk0MDpcdFx0XHRcdGdvdG8gZXJyX2JpbmQ7XG4xOTQxOlx0XG4xOTQyOlx0XHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XG4xOTQzOlx0XHRcdGlmIChyKVxuMTk0NDpcdFx0XHRcdGdvdG8gZXJyX2JpbmQ7XG4xOTQ1Olx0XHR9XG4xOTQ2Olx0XG4xOTQ3Olx0XHQvKlxuMTk0ODpcdFx0ICogRm9yIERFTEVURSBhbmQgTU9WRSwgdGhlIHdvcmtpbmcgc2xvdCBpcyBub3cgYWN0aXZlIGFzIHRoZSBJTlZBTElEXG4xOTQ5Olx0XHQgKiB2ZXJzaW9uIG9mIHRoZSBvbGQgc2xvdC4gIE1PVkUgaXMgcGFydGljdWxhcmx5IHNwZWNpYWwgYXMgaXQgcmV1c2VzXG4xOTUwOlx0XHQgKiB0aGUgb2xkIHNsb3QgYW5kIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvbGQgc2xvdCAoaW4gd29ya2luZ19zbG90KS5cbjE5NTE6XHRcdCAqIEZvciBDUkVBVEUsIHRoZXJlIGlzIG5vIG9sZCBzbG90LiAgRm9yIERFTEVURSBhbmQgRkxBR1NfT05MWSwgdGhlXG4xOTUyOlx0XHQgKiBvbGQgc2xvdCBpcyBkZXRhY2hlZCBidXQgb3RoZXJ3aXNlIHByZXNlcnZlZC5cbjE5NTM6XHRcdCAqL1xuMTk1NDpcdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfQ1JFQVRFKVxuMTk1NTpcdFx0XHRrdm1fY3JlYXRlX21lbXNsb3Qoa3ZtLCBuZXcpO1xuMTk1NjpcdFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUpXG4xOTU3Olx0XHRcdGt2bV9kZWxldGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcbjE5NTg6XHRcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcbjE5NTk6XHRcdFx0a3ZtX21vdmVfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBpbnZhbGlkX3Nsb3QpO1xuMTk2MDpcdFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9GTEFHU19PTkxZKVxuMTk2MTpcdFx0XHRrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldyk7XG4xOTYyOlx0XHRlbHNlXG4xOTYzOlx0XHRcdEJVRygpO1xuMTk2NDpcdFxuMTk2NTpcdFx0LyogRnJlZSB0aGUgdGVtcG9yYXJ5IElOVkFMSUQgc2xvdCB1c2VkIGZvciBERUxFVEUgYW5kIE1PVkUuICovXG4xOTY2Olx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKVxuMTk2NzpcdFx0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuMTk2ODpcdFxuMTk2OTpcdFx0LypcbjE5NzA6XHRcdCAqIE5vIG5lZWQgdG8gcmVmcmVzaCBuZXctXHUwMDNlYXJjaCwgY2hhbmdlcyBhZnRlciBkcm9wcGluZyBzbG90c19hcmNoX2xvY2tcbjE5NzE6XHRcdCAqIHdpbGwgZGlyZWN0bHkgaGl0IHRoZSBmaW5hbCwgYWN0aXZlIG1lbXNsb3QuICBBcmNoaXRlY3R1cmVzIGFyZVxuMTk3MjpcdFx0ICogcmVzcG9uc2libGUgZm9yIGtub3dpbmcgdGhhdCBuZXctXHUwMDNlYXJjaCBtYXkgYmUgc3RhbGUuXG4xOTczOlx0XHQgKi9cbjE5NzQ6XHRcdGt2bV9jb21taXRfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuMTk3NTpcdFxuMTk3NjpcdFx0cmV0dXJuIDA7XG4xOTc3Olx0XG4xOTc4Olx0ZXJyX2JpbmQ6XG4xOTc5Olx0XHRpZiAobmV3KSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTkzMgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgbXlzZWxmOgoKKipJbnZlc3RpZ2F0aW5nIEtjb25maWcgT3B0aW9ucyBmb3IgS1ZNIGFuZCBHdWVzdCBNZW1vcnkgRmlsZSBEZXNjcmlwdG9ycyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgS1ZNIGFuZCBgZ3Vlc3RfbWVtZmRgIHNpdHVhdGlvbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggS2NvbmZpZyBvcHRpb25zIGFyZSByZWxldmFudCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGBLVk1fR1VFU1RfTUVNRkRgLiBUaGUgb2J2aW91cyBzdGFydGluZyBwb2ludCBpcyB0aGUgS2NvbmZpZyBmaWxlcyB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4gR2l2ZW4gdGhhdCB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIEtWTSwgd2hpY2ggaXMgaGlnaGx5IGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQsIEkmIzM5O2xsIHN0YXJ0IGJ5IGxvb2tpbmcgaW4gYGFyY2gveDg2L2t2bS9LY29uZmlnYCDigJMgbWFrZXMgc2Vuc2UgdG8gY2hlY2sgdGhlIHg4NiBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiBJZiB0aGF0IGRvZXNuJiMzOTt0IHlpZWxkIGFueXRoaW5nLCBvciBpZiBJIHdhbnQgYSBtb3JlIGdlbmVyYWwgcGVyc3BlY3RpdmUsIEkmIzM5O2xsIGV4cGFuZCB0aGUgc2VhcmNoIGFuZCBsb29rIGluIGB2aXJ0L2t2bS9LY29uZmlnYC4gQSBxdWljayBgZ3JlcGAgZm9yIGBLVk1fR1VFU1RfTUVNRkRgIGluIGJvdGggdGhvc2UgbG9jYXRpb25zIHNob3VsZCByZXZlYWwgdGhlIG5lY2Vzc2FyeSBvcHRpb25zIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMuIFRoYXQgc2hvdWxkIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludCB0byBhbmFseXplIHdoYXQgb3B0aW9ucyBhcmUgbmVlZGVkLCB0byBidWlsZCBteSBzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2FyY2gveDg2L2t2bSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDthcmNoL3g4Ni9rdm0vS2NvbmZpZz0yMD1jb25maWcgS1ZNX1g4NlxuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTQ5LVx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo1MDpcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkQgaWYgWDg2XzY0XG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy01MS1cbi0tXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jPTUxMzU9dm9pZCBrdm1fYXJjaF9hc3luY19wYWdlX3JlYWR5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9hc3luY19wZiAqd29yaylcbi0tXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jLTUxNjUtXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jOjUxNjY6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTE2Ny1zdGF0aWMgdm9pZCBrdm1fYXNzZXJ0X2dtZW1faW52YWxpZGF0ZV9sb2NrX2hlbGQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdClcbi0tXG5hcmNoL3g4Ni9rdm0veDg2LmM9MTA2MzQ9Ym9vbCBrdm1fYXJjaF9ub19wb2xsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbi0tXG5hcmNoL3g4Ni9rdm0veDg2LmMtMTA2MzgtXG5hcmNoL3g4Ni9rdm0veDg2LmM6MTA2Mzk6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbmFyY2gveDg2L2t2bS94ODYuYy0xMDY0MC0vKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDY1MAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKkludmVzdGlnYXRpbmcgS1ZNX0dVRVNUX01FTUZEIGluIHRoZSBLY29uZmlnIENvbnRleHQqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZywgYmV5b25kIHdoYXQgd2UmIzM5O3ZlIGFscmVhZHkgbG9va2VkIGF0LCB3ZSBuZWVkIHRvIHNwZWNpZmljYWxseSBzZWFyY2ggZm9yIGBLVk1fR1VFU1RfTUVNRkRgIHdpdGhpbiB0aGUgYHZpcnQva3ZtL0tjb25maWdgIGZpbGUuIEdpdmVuIG15IGV4cGVydGlzZSwgSSBzdXNwZWN0IHRoaXMgaXMgd2hlcmUgdGhlIG1haW4gY29uZmlndXJhdGlvbiBvcHRpb24gcmVsYXRlZCB0byBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9ycyB3aWxsIGJlIGRlZmluZWQsIG9yIGF0IGxlYXN0IGhhdmUgaXRzIGRlcGVuZGVuY2llcyBjbGVhcmx5IGxhaWQgb3V0LiBUaGlzIHdpbGwgcHJvdmlkZSB2YWx1YWJsZSBjb250ZXh0IGluIHVuZGVyc3RhbmRpbmcgaG93IGl04oCZcyBlbmFibGVkLCBhbnkgcHJlcmVxdWlzaXRlcyBpdCBoYXMsIGFuZCBwZXJoYXBzIHNoZWQgbGlnaHQgb24gd2hlcmUgaXRzIGZ1bmN0aW9uYWxpdHkgaW50ZWdyYXRlcyB3aXRoaW4gdGhlIGJyb2FkZXIgS1ZNIGZyYW1ld29yay4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyB0byBkZXRlcm1pbmUgaXQmIzM5O3MgYmVoYXZpb3Igb3IgaG93IGl0IG1pZ2h0IG5lZWQgdG8gYmUgbW9kaWZpZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLVk1fR1VFU1RfTUVNRkQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDt2aXJ0L2t2bSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDt2aXJ0L2t2bS9LY29uZmlnPTEwMz1jb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcbi0tXG52aXJ0L2t2bS9LY29uZmlnLTEwNS1cbnZpcnQva3ZtL0tjb25maWc6MTA2OmNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwOTYzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIEtWTSBDb25maWd1cmF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGB2aXJ0L2t2bS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTA2LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgcGFydGljdWxhciBvcHRpb24gaXMgaGFuZGxlZC4gSSBzdXNwZWN0IHdlJiMzOTtyZSBsb29raW5nIGF0IGEgS2NvbmZpZyBzeW1ib2wgcmVsYXRlZCB0byBhIHNwZWNpZmljIHZpcnR1YWxpemF0aW9uIGZlYXR1cmUgb3IgZGV2aWNlLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgSSBtaWdodCBiZSBsb29raW5nIGZvciBkZXBlbmRlbmNpZXMsIGRlZmF1bHQgdmFsdWVzLCBvciBwZXJoYXBzIGV2ZW4gY29tbWVudHMgY2xhcmlmeWluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGlzIG9wdGlvbi4gTXkgZ29hbCBoZXJlIGlzIHRvIGdyYXNwIHRoZSBjb25maWd1cmFiaWxpdHkgb2YgdGhpcyBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aGUgS1ZNIHNldHVwIGFuZCBpdHMgcG90ZW50aWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZSBvciBmdW5jdGlvbmFsaXR5LiBJIHdpbGwgcGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmZWF0dXJlcyBvciBoYXJkd2FyZSwgbG9va2luZyBmb3IgYW55IGVkZ2UgY2FzZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDk1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgOTU6XHQgICAgICAgYm9vbFxuICA5NjpcdFxuICA5NzpcdGNvbmZpZyBLVk1fRUxJREVfVExCX0ZMVVNIX0lGX1lPVU5HXG4gIDk4Olx0ICAgICAgIGJvb2xcbiAgOTk6XHRcbiAxMDA6XHRjb25maWcgS1ZNX01NVV9MT0NLTEVTU19BR0lOR1xuIDEwMTpcdCAgICAgICBib29sXG4gMTAyOlx0XG4gMTAzOlx0Y29uZmlnIEtWTV9HRU5FUklDX01FTU9SWV9BVFRSSUJVVEVTXG4gMTA0Olx0ICAgICAgIGJvb2xcbiAxMDU6XHRcbiAxMDY6XHRjb25maWcgS1ZNX0dVRVNUX01FTUZEXG4gMTA3Olx0ICAgICAgIHNlbGVjdCBYQVJSQVlfTVVMVElcbiAxMDg6XHQgICAgICAgYm9vbFxuIDEwOTpcdFxuIDExMDpcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fQ09OVkVSVFxuIDExMTpcdCAgICAgICBib29sXG4gMTEyOlx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4gMTEzOlx0XG4gMTE0Olx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9SRUNMQUlNXG4gMTE1Olx0ICAgICAgIGJvb2xcbiAxMTY6XHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbiAxMTc6XHRcbiAxMTg6XHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0lOVkFMSURBVEVcbiAxMTk6XHQgICAgICAgYm9vbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTQ5MwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDkxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgZG93biB0aGlzIEtWTSBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50LiBGaXJzdCwgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBLVk0gbW9kdWxlcyBuZWNlc3NhcnkuIFNpbmNlIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggeDg2IGFyY2hpdGVjdHVyZSAoc3BlY2lmaWNhbGx5IGFtZDY0KSwgdGhlIHByaW1hcnkgY2FuZGlkYXRlcyBhcmUgKipLVk0qKiwgKipLVk1fSU5URUwqKiwgb3IgKipLVk1fQU1EKiouIFRoZSBgS1ZNX0dVRVNUX01FTUZEYCBtb2R1bGUgYWxzbyBzZWVtcyByZWxldmFudCwgY29uZGl0aW9uYWxseSBzZWxlY3RlZCBieSBgS1ZNX1g4NmAgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBYODZfNjQsIHdoaWNoIGlzIGxpa2VseSBpbiB0aGlzIGNvbnRleHQuIFRvIHZlcmlmeSB0aGlzIGFuZCB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25hbCBsb2dpYyBtb3JlIHRob3JvdWdobHksIEkgc2hvdWxkIGNvbnN1bHQgdGhlIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AgZmlsZS4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgZGVmaW5pdGl2ZSBjb25maWd1cmF0aW9uIGRldGFpbHMgd2lsbCByZXNpZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7YXJjaC94ODYva3ZtL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDYwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4gICAyOlx0I1xuICAgMzpcdCMgS1ZNIGNvbmZpZ3VyYXRpb25cbiAgIDQ6XHQjXG4gICA1Olx0XG4gICA2Olx0c291cmNlIFwmIzM0O3ZpcnQva3ZtL0tjb25maWdcJiMzNDtcbiAgIDc6XHRcbiAgIDg6XHRtZW51Y29uZmlnIFZJUlRVQUxJWkFUSU9OXG4gICA5Olx0XHRib29sIFwmIzM0O1ZpcnR1YWxpemF0aW9uXCYjMzQ7XG4gIDEwOlx0XHRkZWZhdWx0IHlcbiAgMTE6XHRcdGhlbHBcbiAgMTI6XHRcdCAgU2F5IFkgaGVyZSB0byBnZXQgdG8gc2VlIG9wdGlvbnMgZm9yIHVzaW5nIHlvdXIgTGludXggaG9zdCB0byBydW4gb3RoZXJcbiAgMTM6XHRcdCAgb3BlcmF0aW5nIHN5c3RlbXMgaW5zaWRlIHZpcnR1YWwgbWFjaGluZXMgKGd1ZXN0cykuXG4gIDE0Olx0XHQgIFRoaXMgb3B0aW9uIGFsb25lIGRvZXMgbm90IGFkZCBhbnkga2VybmVsIGNvZGUuXG4gIDE1Olx0XG4gIDE2Olx0XHQgIElmIHlvdSBzYXkgTiwgYWxsIG9wdGlvbnMgaW4gdGhpcyBzdWJtZW51IHdpbGwgYmUgc2tpcHBlZCBhbmQgZGlzYWJsZWQuXG4gIDE3Olx0XG4gIDE4Olx0aWYgVklSVFVBTElaQVRJT05cbiAgMTk6XHRcbiAgMjA6XHRjb25maWcgS1ZNX1g4NlxuICAyMTpcdFx0ZGVmX3RyaXN0YXRlIEtWTSBpZiAoS1ZNX0lOVEVMICE9IG4gfHwgS1ZNX0FNRCAhPSBuKVxuICAyMjpcdFx0c2VsZWN0IEtWTV9DT01NT05cbiAgMjM6XHRcdHNlbGVjdCBLVk1fRUxJREVfVExCX0ZMVVNIX0lGX1lPVU5HXG4gIDI0Olx0XHRzZWxlY3QgS1ZNX01NVV9MT0NLTEVTU19BR0lOR1xuICAyNTpcdFx0c2VsZWN0IEhBVkVfS1ZNX0lSUUNISVBcbiAgMjY6XHRcdHNlbGVjdCBIQVZFX0tWTV9QRk5DQUNIRVxuICAyNzpcdFx0c2VsZWN0IEhBVkVfS1ZNX0RJUlRZX1JJTkdfVFNPXG4gIDI4Olx0XHRzZWxlY3QgSEFWRV9LVk1fRElSVFlfUklOR19BQ1FfUkVMXG4gIDI5Olx0XHRzZWxlY3QgSEFWRV9LVk1fSVJRX0JZUEFTU1xuICAzMDpcdFx0c2VsZWN0IEhBVkVfS1ZNX0lSUV9ST1VUSU5HXG4gIDMxOlx0XHRzZWxlY3QgSEFWRV9LVk1fUkVBRE9OTFlfTUVNXG4gIDMyOlx0XHRzZWxlY3QgVkhPU1RfVEFTS1xuICAzMzpcdFx0c2VsZWN0IEtWTV9BU1lOQ19QRlxuICAzNDpcdFx0c2VsZWN0IFVTRVJfUkVUVVJOX05PVElGSUVSXG4gIDM1Olx0XHRzZWxlY3QgS1ZNX01NSU9cbiAgMzY6XHRcdHNlbGVjdCBTQ0hFRF9JTkZPXG4gIDM3Olx0XHRzZWxlY3QgUEVSRl9FVkVOVFNcbiAgMzg6XHRcdHNlbGVjdCBHVUVTVF9QRVJGX0VWRU5UU1xuICAzOTpcdFx0c2VsZWN0IFBFUkZfR1VFU1RfTUVESUFURURfUE1VXG4gIDQwOlx0XHRzZWxlY3QgSEFWRV9LVk1fTVNJXG4gIDQxOlx0XHRzZWxlY3QgSEFWRV9LVk1fQ1BVX1JFTEFYX0lOVEVSQ0VQVFxuICA0MjpcdFx0c2VsZWN0IEhBVkVfS1ZNX05PX1BPTExcbiAgNDM6XHRcdHNlbGVjdCBWSVJUX1hGRVJfVE9fR1VFU1RfV09SS1xuICA0NDpcdFx0c2VsZWN0IEtWTV9HRU5FUklDX0RJUlRZTE9HX1JFQURfUFJPVEVDVFxuICA0NTpcdFx0c2VsZWN0IEtWTV9WRklPXG4gIDQ2Olx0XHRzZWxlY3QgSEFWRV9LVk1fUE1fTk9USUZJRVIgaWYgUE1cbiAgNDc6XHRcdHNlbGVjdCBLVk1fR0VORVJJQ19IQVJEV0FSRV9FTkFCTElOR1xuICA0ODpcdFx0c2VsZWN0IEtWTV9HRU5FUklDX1BSRV9GQVVMVF9NRU1PUllcbiAgNDk6XHRcdHNlbGVjdCBLVk1fV0VSUk9SIGlmIFdFUlJPUlxuICA1MDpcdFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRCBpZiBYODZfNjRcbiAgNTE6XHRcbiAgNTI6XHRjb25maWcgS1ZNXG4gIDUzOlx0XHR0cmlzdGF0ZSBcJiMzNDtLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIChLVk0pIHN1cHBvcnRcJiMzNDtcbiAgNTQ6XHRcdGRlcGVuZHMgb24gWDg2X0xPQ0FMX0FQSUNcbiAgNTU6XHRcdGhlbHBcbiAgNTY6XHRcdCAgU3VwcG9ydCBob3N0aW5nIGZ1bGx5IHZpcnR1YWxpemVkIGd1ZXN0IG1hY2hpbmVzIHVzaW5nIGhhcmR3YXJlXG4gIDU3Olx0XHQgIHZpcnR1YWxpemF0aW9uIGV4dGVuc2lvbnMuICBZb3Ugd2lsbCBuZWVkIGEgZmFpcmx5IHJlY2VudFxuICA1ODpcdFx0ICBwcm9jZXNzb3IgZXF1aXBwZWQgd2l0aCB2aXJ0dWFsaXphdGlvbiBleHRlbnNpb25zLiBZb3Ugd2lsbCBhbHNvXG4gIDU5Olx0XHQgIG5lZWQgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG9mIHRoZSBwcm9jZXNzb3IgbW9kdWxlcyBiZWxvdy5cbiAgNjA6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI2MzYKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA5MTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBLVk0gR3Vlc3QgTWVtb3J5IEZpbGUgRGVzY3JpcHRvciBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIHBhdGNoIGlzIGRvaW5nLiBGcm9tIHdoYXQgSSBjYW4gc2VlLCBpdCYjMzk7cyBwcmltYXJpbHkgZm9jdXNlZCBvbiBgZ3Vlc3RfbWVtZmRgIGhhbmRsaW5nIHdpdGhpbiBLVk0uIFNwZWNpZmljYWxseToKCjEuICAqKmB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYDoqKiBUaGUgcGF0Y2ggbWFrZXMga2V5IGNoYW5nZXMgaW4gYGt2bV9nbWVtX2JpbmQoKWAuIEl0IGludHJvZHVjZXMgYSBgV0FSTl9PTl9PTkNFYCBjaGVjaywgcmVwbGFjZXMgdGhlIGBXUklURV9PTkNFYCB3aXRoIGEgZGlyZWN0IGFzc2lnbm1lbnQsIGNhcHR1cmVzIGFuZCBlcnJvciBjaGVja3MgdGhlIHJldHVybiBmcm9tIGB4YV9zdG9yZV9yYW5nZSgpYCwgYW5kIGltcG9ydGFudGx5LCBpbXBsZW1lbnRzIGEgcm9sbGJhY2sgbWVjaGFuaXNtIHRoYXQgY2xlYXJzIGBnbWVtLmZpbGVgLCBgZ21lbS5wZ29mZmAsIGFuZCByZW1vdmVzIHRoZSBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBmbGFnIG9uIGVycm9yLiBUaGlzIGVycm9yIGhhbmRsaW5nIGlzIGNydWNpYWwgZm9yIGFueSBmdXp6ZXI7IHdlIG5lZWQgdG8gZXhhbWluZSBob3cgdGhlIHN5c3RlbSByZWFjdHMgdG8gZmFpbHVyZXMuCgoyLiAgKipgdmlydC9rdm0va3ZtX21haW4uY2A6KiogVGhlIHNpZ25hdHVyZSBvZiBga3ZtX3NldF9tZW1zbG90KClgIGlzIG1vZGlmaWVkIHRvIHRha2UgYGdtZW1fZmRgIGFuZCBgZ21lbV9vZmZzZXRgLCBpbmRpY2F0aW5nIGNoYW5nZXMgdG8gaG93IG1lbXNsb3RzIGFyZSBiZWluZyBtYW5hZ2VkLiBUaGUgYGt2bV9nbWVtX2JpbmQoKWAgZnVuY3Rpb24gaXMgbm93IGNhbGxlZCAqd2l0aGluKiBga3ZtX3NldF9tZW1zbG90KClgLCBzcGVjaWZpY2FsbHkgYWZ0ZXIgYGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKWAgYW5kIHdoaWxlIGhvbGRpbmcgYGt2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrYC4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGNvbnRyb2wgZmxvdyBjaGFuZ2UuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGFub3RoZXIgYFdBUk5fT05fT05DRWAgYXNzZXJ0aW9uLiBBbHNvLCBlcnJvciBoYW5kbGluZyBhbmQgYW4gdW53aW5kIHBhdGggYXJlIGFkZGVkIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGlmIGBrdm1fZ21lbV9iaW5kKClgIGZhaWxzLiBGaW5hbGx5LCB0aGUgY2FsbHMgdG8gYGt2bV9nbWVtX2JpbmQoKWAgYW5kIGBrdm1fZ21lbV91bmJpbmQoKWAgYXJlIHJlbW92ZWQgZnJvbSBga3ZtX3NldF9tZW1vcnlfcmVnaW9uKClgLgoKTm93LCBpcyB0aGlzIHNvbWV0aGluZyB3ZSBzaG91bGQgY29uc2lkZXIgZnV6emluZz8gQWJzb2x1dGVseS4gS1ZNIGlzIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nIGFzIGl0JiMzOTtzIGEgY3JpdGljYWwgdmlydHVhbGl6YXRpb24gY29tcG9uZW50IGV4cG9zZWQgdmlhIGAvZGV2L2t2bWAgaW9jdGxzIGxpa2UgYEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMmAgYW5kIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYC4gVGhlc2UgbW9kaWZpY2F0aW9ucyB0byBtZW1vcnkgc2xvdCBjcmVhdGlvbiBhbmQgYmluZGluZyBsb2dpYywgdGhlIGFkZGVkIGFzc2VydGlvbnMsIGFuZCB0aGUgbmV3IGVycm9yIHVud2luZGluZywgcHJlc2VudCBtYW55IG9wcG9ydHVuaXRpZXMgZm9yIGRpc2NvdmVyaW5nIHZ1bG5lcmFiaWxpdGllcywgb3IgYXQgbGVhc3QgZW5zdXJpbmcgdGhlIGVycm9yIHBhdGhzIGFyZSBleGVyY2lzZWQuIFRoZSBtb3ZlbWVudCBvZiBga3ZtX2dtZW1fYmluZCgpYCBhbmQgdGhlIGBzbG90c19hcmNoX2xvY2tgIGFyZSBwb3RlbnRpYWwgc3luY2hyb25pemF0aW9uIGlzc3VlcyB0aGF0IHdlIG5lZWQgdG8gdGFyZ2V0LgoKVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdCBhcmU6CgoqICAgYGt2bV9nbWVtX2JpbmRgCiogICBga3ZtX3NldF9tZW1zbG90YAoqICAgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAKClJlZ2FyZGluZyBjb25maWd1cmF0aW9ucywgd2Ugc2hvdWxkIGJlIHVzaW5nIGBLVk1gIGFuZCBgS1ZNX0dVRVNUX01FTUZEYCwgYnV0IGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlcyBpbiBgdmlydC9rdm0vYCBhbmQgYGFyY2gveDg2L2t2bS9gIHRvIGVuc3VyZSB3ZSBjb3ZlciB0aGUgbmVjZXNzYXJ5IGRlcGVuZGVuY2llcy4gV2UgZG9uJiMzOTt0IHdhbnQgdG8gZXhjbHVkZSBjb25maWd1cmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Z3Vlc3RfbWVtZmRcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7dmlydC9rdm0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7dmlydC9rdm0vTWFrZWZpbGUua3ZtPTE0PWt2bS0kKENPTkZJR19IQVZFX0tWTV9QRk5DQUNIRSkgJiM0Mzs9ICQoS1ZNKS9wZm5jYWNoZS5vXG52aXJ0L2t2bS9NYWtlZmlsZS5rdm06MTU6a3ZtLSQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkgJiM0Mzs9ICQoS1ZNKS9ndWVzdF9tZW1mZC5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MzMwCgkJCQkJCQlvdXRwdXQ6IDE4MQoJCQkJCQkJdGhvdWdodHM6IDI0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBLVk0gU3ltYm9sIEFuYWx5c2lzKioKCk9rYXksIHNvIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYEtWTV9HVUVTVF9NRU1GRGAgYW5kIG90aGVyIEtWTSBjb21wb25lbnRzLiBSaWdodCwgaXQgbG9va3MgbGlrZSBgS1ZNX0dVRVNUX01FTUZEYCBpcyBpbXBsaWNpdGx5IGVuYWJsZWQgd2hlbiBgS1ZNX1g4NmAgaXMgc2VsZWN0ZWQsIHNwZWNpZmljYWxseSB3aGVuIHJ1bm5pbmcgb24gYW4gYFg4Nl82NGAgYXJjaGl0ZWN0dXJlLiBBbmQgc2luY2UgYEtWTWAsIGBLVk1fSU5URUxgLCBhbmQgYEtWTV9BTURgIGFsbCBlbmFibGUgYEtWTV9YODZgLCB0aGF0IG1lYW5zIHRoZXNlIGtlcm5lbCBtb2R1bGVzIOKAkyBgS1ZNYCwgYEtWTV9JTlRFTGAsIGBLVk1fQU1EYCwgYW5kIGBLVk1fR1VFU1RfTUVNRkRgIOKAkyBhcmUgYWxsIHBvdGVudGlhbGx5IHJlbGV2YW50IHRvIHRoaXMgaW52ZXN0aWdhdGlvbi4gV2UmIzM5O3JlIGxvb2tpbmcgYXQgYSBwcmV0dHkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBoZXJlLgoKTGV0JiMzOTtzIHF1aWNrbHkgdmVyaWZ5IG15IHVuZGVyc3RhbmRpbmcgYnkgY2hlY2tpbmcgYWxsIHRoZSByZWNlbnRseSBtb2RpZmllZCBzeW1ib2xzIHJlbGF0ZWQgdG8gZ3Vlc3QgbWVtZmQ6IGBrdm1fZ21lbV9iaW5kYCB3aXRoaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLCBhbmQgYm90aCBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgd2l0aGluIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4KCkdvb2QsIG5vdyBhcmUgdGhlc2UgZ2VuZXJpYyBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnM/IE5vLCB0aGVzZSBhcmUgS1ZNIHNwZWNpZmljIGZ1bmN0aW9ucywgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gbWVtc2xvdCBzZXR1cCBhbmQgZ3Vlc3RfbWVtZmQgb3BlcmF0aW9uLgoKT2theSwgbGV0JiMzOTtzIGdvIHdpdGggdGhpcyBhbmQgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O0tWTV9JTlRFTCYjMzQ7LAogICAgJiMzNDtLVk1fQU1EJiMzNDssCiAgICAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2JpbmQmIzM0OywKICAgICYjMzQ7a3ZtX3NldF9tZW1zbG90JiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtb3J5X3JlZ2lvbiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBLVk0gbWVtc2xvdCBtYW5hZ2VtZW50IGFuZCBndWVzdF9tZW1mZCBiaW5kaW5nIGxvZ2ljLCBtb3Zpbmcga3ZtX2dtZW1fYmluZCgpIGluc2lkZSBrdm1fc2V0X21lbXNsb3QoKSB1bmRlciBzbG90c19hcmNoX2xvY2ssIGFkZGluZyBlcnJvciBoYW5kbGluZyBhbmQgcm9sbGJhY2sgZm9yIHhhX3N0b3JlX3JhbmdlKCksIGFuZCBpbnRyb2R1Y2luZyBuZXcgV0FSTl9PTl9PTkNFIGFzc2VydGlvbnMgYW5kIGVycm9yIHBhdGhzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBLVk0gbWVtb3J5IHJlZ2lvbiBpb2N0bHMgYW5kIHdhcnJhbnRzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtLVk1fSU5URUwmIzM0OywKICAgICYjMzQ7S1ZNX0FNRCYjMzQ7LAogICAgJiMzNDtLVk1fR1VFU1RfTUVNRkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9iaW5kJiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICAgJiMzNDtrdm1fc2V0X21lbW9yeV9yZWdpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbXNsb3QgbWFuYWdlbWVudCBhbmQgZ3Vlc3RfbWVtZmQgYmluZGluZyBsb2dpYywgbW92aW5nIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCkgdW5kZXIgc2xvdHNfYXJjaF9sb2NrLCBhZGRpbmcgZXJyb3IgaGFuZGxpbmcgYW5kIHJvbGxiYWNrIGZvciB4YV9zdG9yZV9yYW5nZSgpLCBhbmQgaW50cm9kdWNpbmcgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zIGFuZCBlcnJvciBwYXRocy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgS1ZNIG1lbW9yeSByZWdpb24gaW9jdGxzIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmYmY5NTkxNmQ2YjE5ZGMxNzZiM2IwZTkwNGUyZjE1ZWM0NWVkZmMwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgNSAwOToxNDozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCmluZGV4IGI1OTY0ODZkMTg0Y2EuLjZjOGRmNjczODJmY2UgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwpAQCAtNjEyLDEwICYjNDM7NjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCByID0gLUVJTlZBTDsKJiM0MzsJdm9pZCAqeGFyOwogCiAJQlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpOwogCUJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LSZndDtnbWVtLnBnb2ZmKSk7CiAKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzbG90LSZndDtmbGFncyAmYW1wOyBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKQEAgLTY0OSwxMiAmIzQzOzY1MywyMCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsCiAJICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3QKIAkgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS4KIAkgKi8KLQlXUklURV9PTkNFKHNsb3QtJmd0O2dtZW0uZmlsZSwgZmlsZSk7CiYjNDM7CXNsb3QtJmd0O2dtZW0uZmlsZSA9IGZpbGU7CiAJc2xvdC0mZ3Q7Z21lbS5wZ29mZiA9IHN0YXJ0OwogCWlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSkKIAkJc2xvdC0mZ3Q7ZmxhZ3MgfD0gS1ZNX01FTVNMT1RfR01FTV9PTkxZOwogCi0JeGFfc3RvcmVfcmFuZ2UoJmFtcDtmLSZndDtiaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpOwomIzQzOwl4YXIgPSB4YV9zdG9yZV9yYW5nZSgmYW1wO2YtJmd0O2JpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7CiYjNDM7CiYjNDM7CXIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDsKJiM0MzsJaWYgKHIpIHsKJiM0MzsJCXhhX3N0b3JlX3JhbmdlKCZhbXA7Zi0mZ3Q7YmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTsKJiM0MzsJCXNsb3QtJmd0O2dtZW0uZmlsZSA9IE5VTEw7CiYjNDM7CQlzbG90LSZndDtnbWVtLnBnb2ZmID0gMDsKJiM0MzsJCXNsb3QtJmd0O2ZsYWdzICZhbXA7PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZOwomIzQzOwl9CiAJZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKIAogCS8qCkBAIC02NjIsNyAmIzQzOzY3NCw2IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAkgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGUKIAkgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC4KIAkgKi8KLQlyID0gMDsKIGVycjoKIAlmcHV0KGZpbGUpOwogCXJldHVybiByOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC0xODg3LDcgJiM0MzsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldywKLQkJCSAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpCiYjNDM7CQkJICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSwKJiM0MzsJCQkgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KQogewogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDsKIAlpbnQgcjsKQEAgLTE5MzEsMjAgJiM0MzsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAl9CiAKIAlyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwotCWlmIChyKSB7Ci0JCS8qCi0JCSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vCi0JCSAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZAotCQkgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28KLQkJICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suCi0JCSAqLwotCQlpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7Ci0JCQlrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTsKLQkJCWtmcmVlKGludmFsaWRfc2xvdCk7Ci0JCX0gZWxzZSB7Ci0JCQltdXRleF91bmxvY2soJmFtcDtrdm0tJmd0O3Nsb3RzX2FyY2hfbG9jayk7Ci0JCX0KLQkJcmV0dXJuIHI7CiYjNDM7CWlmIChyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CWlmIChuZXcgJmFtcDsmYW1wOyBuZXctJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKQomIzQzOwkJCWdvdG8gZXJyX2JpbmQ7CiYjNDM7CiYjNDM7CQlyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpOwomIzQzOwkJaWYgKHIpCiYjNDM7CQkJZ290byBlcnJfYmluZDsKIAl9CiAKIAkvKgpAQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sCiAJa3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7CiAKIAlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJfYmluZDoKJiM0MzsJaWYgKG5ldykgewomIzQzOwkJa3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTsKJiM0MzsKJiM0MzsJCWlmIChuZXctJmd0O2RpcnR5X2JpdG1hcCAmYW1wOyZhbXA7ICghb2xkIHx8ICFvbGQtJmd0O2RpcnR5X2JpdG1hcCkpCiYjNDM7CQkJa3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7CiYjNDM7CX0KJiM0MztlcnI6CiYjNDM7CS8qCiYjNDM7CSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnMKJiM0MzsJICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuCiYjNDM7CSAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay4KJiM0MzsJICovCiYjNDM7CWlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHsKJiM0MzsJCWt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpOwomIzQzOwkJa2ZyZWUoaW52YWxpZF9zbG90KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO2t2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLApAQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAkJaWYgKFdBUk5fT05fT05DRShrdm0tJmd0O25yX21lbXNsb3RfcGFnZXMgJmx0OyBvbGQtJmd0O25wYWdlcykpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTsKJiM0MzsJCXJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTsKIAl9CiAKIAliYXNlX2dmbiA9IChtZW0tJmd0O2d1ZXN0X3BoeXNfYWRkciAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKQEAgLTIxMDUsMjEgJiM0MzsyMTIzLDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAluZXctJmd0O25wYWdlcyA9IG5wYWdlczsKIAluZXctJmd0O2ZsYWdzID0gbWVtLSZndDtmbGFnczsKIAluZXctJmd0O3VzZXJzcGFjZV9hZGRyID0gbWVtLSZndDt1c2Vyc3BhY2VfYWRkcjsKLQlpZiAobWVtLSZndDtmbGFncyAmYW1wOyBLVk1fTUVNX0dVRVNUX01FTUZEKSB7Ci0JCXIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBtZW0tJmd0O2d1ZXN0X21lbWZkLCBtZW0tJmd0O2d1ZXN0X21lbWZkX29mZnNldCk7Ci0JCWlmIChyKQotCQkJZ290byBvdXQ7Ci0JfQogCi0JciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwomIzQzOwlyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSwKJiM0MzsJCQkgICAgbWVtLSZndDtndWVzdF9tZW1mZCwgbWVtLSZndDtndWVzdF9tZW1mZF9vZmZzZXQpOwogCWlmIChyKQotCQlnb3RvIG91dF91bmJpbmQ7CiYjNDM7CQlnb3RvIG91dDsKIAogCXJldHVybiAwOwogCi1vdXRfdW5iaW5kOgotCWlmIChtZW0tJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpCi0JCWt2bV9nbWVtX3VuYmluZChuZXcpOwogb3V0OgogCWtmcmVlKG5ldyk7CiAJcmV0dXJuIHI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDExCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIEtWTSBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgUmlza3MqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBhc3Nlc3MgdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmUsIHNwZWNpZmljYWxseSB3YXJyYW50aW5nIGEgS01TQU4gZnV6emluZyBzZXNzaW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2hhbmdlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBpbnRyb2R1Y2UgYW55IG5ldyByaXNrcyBpbiB0aGF0IGFyZWEuCgpGaXJzdCwgdGhlIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBmaWxlLiBJbiBga3ZtX2dtZW1fYmluZGAsIHRoZSBwYXRjaCBhZGRzIGEgY2hlY2sgdG8gc2VlIGlmIGBzbG90LSZndDtmbGFnc2AgaGFzIHRoZSBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBmbGFnLCB3aGljaCBsb29rcyBsaWtlIGEgZGVmZW5zaXZlIG1lYXN1cmUuIEl0IGFsc28gY2hhbmdlcyBhIGBXUklURV9PTkNFYCB0byBhIGRpcmVjdCBhc3NpZ25tZW50IHRvIGBzbG90LSZndDtnbWVtLmZpbGVgLiBUaGF0JiMzOTtzIG5vdCBpbmhlcmVudGx5IHN1c3BpY2lvdXMsIGJ1dCBpdCB3YXJyYW50cyBhIGNsb3NlciBsb29rIGF0IHRoZSBzdXJyb3VuZGluZyBjb2RlLiBNb3N0IG5vdGFibHksIHRoZSBlcnJvciBoYW5kbGluZyBhcm91bmQgYHhhX3N0b3JlX3JhbmdlYCBpcyBpbnRlcmVzdGluZy4gSWYgYHhhX3N0b3JlX3JhbmdlYCBmYWlscywgaXQgbm93IGV4cGxpY2l0bHkgY2xlYXJzIHRoZSBgZ21lbS5maWxlYCwgYGdtZW0ucGdvZmZgLCBhbmQgdGhlIGBLVk1fTUVNU0xPVF9HTUVNX09OTFlgIGZsYWcgb24gYHNsb3RgLiBUaGlzIHNlZW1zIGxpa2UgYSBnb29kIHByYWN0aWNlIHRvIHByZXZlbnQgbGluZ2VyaW5nIHN0YWxlIGRhdGEuCgpOZXh0LCBJJiMzOTtsbCBtb3ZlIG9uIHRvIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gSGVyZSwgdGhlIHBhdGNoIHJlLWFycmFuZ2VzIHRoZSBleGVjdXRpb24sIG1vdmluZyBga3ZtX2dtZW1fYmluZGAgaW50byBga3ZtX3NldF9tZW1zbG90YC4gIEl0IGFsc28gcGFzc2VzIGBnbWVtX2ZkYCBhbmQgYGdtZW1fb2Zmc2V0YCB0byBga3ZtX3NldF9tZW1zbG90YCwgd2hpY2ggZ2l2ZXMgY29udGV4dCB0byB0aGUgYmluZGluZyBwcm9jZXNzLiBDcnVjaWFsbHksIHRoZSBwYXRjaCBhZGRzIGVycm9yIGhhbmRsaW5nIGFmdGVyIHRoZSBjYWxsIHRvIGBrdm1fZ21lbV9iaW5kYCB3aXRoaW4gYGt2bV9zZXRfbWVtc2xvdGAsIHdoaWNoIGluY2x1ZGVzIGNsZWFudXAgdXNpbmcgYGt2bV9hcmNoX2ZyZWVfbWVtc2xvdGAgYW5kIHBvdGVudGlhbGx5IGBrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXBgLCBpZiBuZWVkZWQuIFNpbXBsaWZ5aW5nIHRoZSBlcnJvciBwYXRoIGluIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGJ5IGRlZmVycmluZyBga3ZtX2dtZW1fdW5iaW5kYCBzb3VuZHMgbGlrZSBhIGdvb2Qgb3B0aW1pemF0aW9uLCBhc3N1bWluZyB0aGlzIGRvZXNuJiMzOTt0IGNyZWF0ZSBuZXcgc3VidGxlIGlzc3Vlcy4KCk5vdywgbXkgdGhvdWdodHMgdHVybiB0byB0aGUgb3ZlcmFsbCBjb250ZXh0LiBJIG5lZWQgdG8gdHJhY2UgdGhlIHVzYWdlIG9mIGBrdm1fZ21lbV9iaW5kYCBhbmQgYGt2bV9zZXRfbWVtc2xvdGAuIEkgaGF2ZSB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMgYW5kIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyB3aXRoaW4gdGhlIEtWTSBzeXN0ZW0uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCBzdGF0ZSBpc24mIzM5O3QgZ2V0dGluZyB3cml0dGVuIGludG8gdGhlIG1lbXNsb3QgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb24uIElmIHRoZXJlIGFyZSBubyBjbGVhciB3cml0ZSBvcGVyYXRpb25zIGJlZm9yZSBhIGNvbmRpdGlvbmFsIHJlYWQsIEkmIzM5O2Qgd2FudCB0byBiZSBzdXJlIHRvIHRlc3QgaXQgd2l0aCBmdXp6aW5nLgoKT3ZlcmFsbCwgdGhpcyBwYXRjaCBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSByZWZhY3RvciB3aXRoIGFkZGVkIGVycm9yIGhhbmRsaW5nLiBJdCYjMzk7cyBub3QgaW1tZWRpYXRlbHkgc2NyZWFtaW5nICYjMzQ7dW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0eSYjMzQ7IGF0IG1lLiBUaGUgZXhwbGljaXQgY2xlYXJpbmcgb2YgZmllbGRzIGluIHRoZSBlcnJvciBwYXRoIHNlZW1zIGxpa2UgYSBwb3NpdGl2ZSBzdGVwLiBIb3dldmVyLCB0aGUgbW92ZSBvZiBga3ZtX2dtZW1fYmluZGAgYW5kIHRoZSBhbHRlcmVkIGVycm9yIGhhbmRsaW5nIGFyZSB3aGF0IEkgbmVlZCB0byBwcm9iZSBmdXJ0aGVyIHRvIGJlIGNlcnRhaW4uIEkmIzM5O2xsIG5lZWQgdG8gZG8gYSB0aG9yb3VnaCBjb2RlIHdhbGsgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBidXQgSSYjMzk7bSBsZWFuaW5nIHRvd2FyZCBuZWVkaW5nIEtNU0FOIGZ1enppbmcgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBsYXRlbnQgYnVncy4gSSYjMzk7bGwgbmVlZCB0byBjcmVhdGUgYSB0ZXN0IGhhcm5lc3Mgd2l0aCBzY2VuYXJpb3MgdGhhdCBjb3VsZCBsZWFkIHRvIHRoZXNlIGVycm9yIGNvbmRpdGlvbnMgdG8gbG9vayBpbnRvIGl0IGRlZXBlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3ZtX2dtZW1fYmluZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NTkyPWludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYwNS1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjA2OmludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjA3LVx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldClcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1Mi1cdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjUzOlx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjU0LVx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaD0xMD1pbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpO1xudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDoxMTppbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEyLVx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldCk7XG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaD0xOT1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2dtZW1fZXhpdCh2b2lkKSB7fTtcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MjA6c3RhdGljIGlubGluZSBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTIxLVx0XHRcdFx0XHQgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE4ODc9c3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0MS1cbnZpcnQva3ZtL2t2bV9tYWluLmM6MTk0MjpcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0My1cdFx0aWYgKHIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU4NzgKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKioKCk9rYXksIHNvIEkmIzM5O20gdGhpbmtpbmcgSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyBLVk0gaGFuZGxlcyBndWVzdCBtZW1vcnksIHBhcnRpY3VsYXJseSBhcm91bmQgdGhvc2UgYG1lbWZkYCBpbnRlcmFjdGlvbnMuIFJpZ2h0LCBsZXQmIzM5O3MgemVybyBpbiBvbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBnb2luZyB0byBiZSBmb2N1c2luZyBvbiB0aGUgYGt2bV9nbWVtX2JpbmRgIGFuZCBga3ZtX2dtZW1fdW5iaW5kYCBmdW5jdGlvbnMuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBndWVzdCBtZW1vcnkgaXMgYm91bmQgYW5kIHVuYm91bmQgdG8gdGhlIGhvc3QmIzM5O3MgbWVtb3J5IG1vZGVsIHVzaW5nIGBtZW1mZGAgc2luY2UgdGhpcyBpcyBhIGNyaXRpY2FsIGFzcGVjdCBvZiBlZmZpY2llbnQgYW5kIHNlY3VyZSBtZW1vcnkgbWFuYWdlbWVudC4gV2hhdCBhcmUgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgbWFuaXB1bGF0ZWQgaGVyZT8gV2hhdCYjMzk7cyB0aGUgY29udHJvbCBmbG93PyBJJiMzOTttIGhvcGluZyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHRoaXMgbWVjaGFuaXNtIGFsbG93cyBmb3Igc2hhcmVkIG1lbW9yeSwgbWVtb3J5IG1pZ3JhdGlvbiwgYW5kIHByb3RlY3Rpb24gaW4gdGhlIEtWTSBlbnZpcm9ubWVudC4gVGltZSB0byBkaWcgaW4gYW5kIHJlbWluZCBteXNlbGYgb2YgdGhlIGRldGFpbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4NQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjAwOlx0XHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiA2MDE6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjAyOlx0XG4gNjAzOlx0XHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7XG4gNjA0Olx0fVxuIDYwNTpcdFxuIDYwNjpcdGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiA2MDc6XHRcdFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXG4gNjA4Olx0e1xuIDYwOTpcdFx0dW9mZl90IHNpemUgPSBzbG90LVx1MDAzZW5wYWdlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiA2MTA6XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDtcbiA2MTE6XHRcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XG4gNjEyOlx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIDYxMzpcdFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gNjE0Olx0XHRpbnQgciA9IC1FSU5WQUw7XG4gNjE1Olx0XHR2b2lkICp4YXI7XG4gNjE2Olx0XG4gNjE3Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gNjE4Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gNjE5Olx0XG4gNjIwOlx0XHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXG4gNjIxOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYyMjpcdFxuIDYyMzpcdFx0ZmlsZSA9IGZnZXQoZmQpO1xuIDYyNDpcdFx0aWYgKCFmaWxlKVxuIDYyNTpcdFx0XHRyZXR1cm4gLUVCQURGO1xuIDYyNjpcdFxuIDYyNzpcdFx0aWYgKGZpbGUtXHUwMDNlZl9vcCAhPSBcdTAwMjZrdm1fZ21lbV9mb3BzKVxuIDYyODpcdFx0XHRnb3RvIGVycjtcbiA2Mjk6XHRcbiA2MzA6XHRcdGYgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiA2MzE6XHRcdGlmIChmLVx1MDAzZWt2bSAhPSBrdm0pXG4gNjMyOlx0XHRcdGdvdG8gZXJyO1xuIDYzMzpcdFxuIDYzNDpcdFx0aW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xuIDYzNTpcdFxuIDYzNjpcdFx0aWYgKCFQQUdFX0FMSUdORUQob2Zmc2V0KSB8fCBvZmZzZXQgJiM0Mzsgc2l6ZSBcdTAwM2UgaV9zaXplX3JlYWQoaW5vZGUpKVxuIDYzNzpcdFx0XHRnb3RvIGVycjtcbiA2Mzg6XHRcbiA2Mzk6XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gNjQwOlx0XG4gNjQxOlx0XHRzdGFydCA9IG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiA2NDI6XHRcdGVuZCA9IHN0YXJ0ICYjNDM7IHNsb3QtXHUwMDNlbnBhZ2VzO1xuIDY0MzpcdFxuIDY0NDpcdFx0aWYgKCF4YV9lbXB0eShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzKSBcdTAwMjZcdTAwMjZcbiA2NDU6XHRcdCAgICB4YV9maW5kKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIFx1MDAyNnN0YXJ0LCBlbmQgLSAxLCBYQV9QUkVTRU5UKSkge1xuIDY0NjpcdFx0XHRyID0gLUVFWElTVDtcbiA2NDc6XHRcdFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDY0ODpcdFx0XHRnb3RvIGVycjtcbiA2NDk6XHRcdH1cbiA2NTA6XHRcbiA2NTE6XHRcdC8qXG4gNjUyOlx0XHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXG4gNjUzOlx0XHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxuIDY1NDpcdFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4gNjU1Olx0XHQgKi9cbiA2NTY6XHRcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiA2NTc6XHRcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIDY1ODpcdFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIDY1OTpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2NjA6XHRcbiA2NjE6XHRcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiA2NjI6XHRcbiA2NjM6XHRcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiA2NjQ6XHRcdGlmIChyKSB7XG4gNjY1Olx0XHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbiA2NjY6XHRcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuIDY2NzpcdFx0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuIDY2ODpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2Njk6XHRcdH1cbiA2NzA6XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiA2NzE6XHRcbiA2NzI6XHRcdC8qXG4gNjczOlx0XHQgKiBEcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhlIGZpbGUsIGV2ZW4gb24gc3VjY2Vzcy4gIFRoZSBmaWxlIHBpbnMgS1ZNLFxuIDY3NDpcdFx0ICogbm90IHRoZSBvdGhlciB3YXkgJiMzOTtyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXG4gNjc1Olx0XHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cbiA2NzY6XHRcdCAqL1xuIDY3NzpcdGVycjpcbiA2Nzg6XHRcdGZwdXQoZmlsZSk7XG4gNjc5Olx0XHRyZXR1cm4gcjtcbiA2ODA6XHR9XG4gNjgxOlx0XG4gNjgyOlx0c3RhdGljIHZvaWQgX19rdm1fZ21lbV91bmJpbmQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwgc3RydWN0IGdtZW1fZmlsZSAqZilcbiA2ODM6XHR7XG4gNjg0Olx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gc2xvdC1cdTAwM2VnbWVtLnBnb2ZmO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3NDk1CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6CgoqKkRpZ2dpbmcgaW50byBNZW1vcnkgTWFuYWdlbWVudCBpbiBLVk0qKgoKT2theSwgc28gd2UgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtZW1vcnkgcmVnaW9ucyBhcmUgaGFuZGxlZCB3aXRoaW4gS1ZNLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gYHZpcnQva3ZtL2t2bV9tYWluLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgZnVuY3Rpb25zLiBUaGVzZSBhcmUgbGlrZWx5IHRoZSBjb3JlIGZ1bmN0aW9ucyByZXNwb25zaWJsZSBmb3IgbWFwcGluZyBhbmQgY29uZmlndXJpbmcgdGhlIGd1ZXN0JiMzOTtzIHBoeXNpY2FsIG1lbW9yeSB3aXRoaW4gdGhlIGhvc3QuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtZW1zbG90cyBhbmQgbWVtb3J5IHJlZ2lvbnMuIFdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGhlcmU/IFdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGFyZSBpbiBwbGFjZSB0byBlbnN1cmUgY29uc2lzdGVuY3kgZHVyaW5nIHRoZXNlIG9wZXJhdGlvbnM/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZiwgZXNwZWNpYWxseSByZWdhcmRpbmcgY29uY3VycmVudCBhY2Nlc3MgZnJvbSBkaWZmZXJlbnQgdkNQVXM/IEkgc2hvdWxkIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gaG93IG1lbW9yeSBpcyBhY3R1YWxseSBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIGJ5IEtWTSBmb3IgdGhlIGd1ZXN0LiBJIGJldCB0aGVyZSYjMzk7cyBzb21lIGludGVyZXN0aW5nIGludGVycGxheSB3aXRoIHRoZSBob3N0JiMzOTtzIHBhZ2UgdGFibGVzIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB1bml0IGhlcmUuIFRpbWUgdG8gZGl2ZSBpbiBhbmQgc2VlIHdoYXQmIzM5O3Mgd2hhdCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9rdm1fbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTIwOlx0XHQgKlxuMTkyMTpcdFx0ICogTW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBvbiBhIHRlbXBvcmFyeSwgdW5yZWFjaGFibGUgc2xvdC4gIFRoZSBvbGRcbjE5MjI6XHRcdCAqIHNsb3QgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGluIGNhc2UgYSBsYXRlciBzdGVwIGZhaWxzIGFuZCB0aGVcbjE5MjM6XHRcdCAqIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSByZXZlcnRlZC5cbjE5MjQ6XHRcdCAqL1xuMTkyNTpcdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuMTkyNjpcdFx0XHRpbnZhbGlkX3Nsb3QgPSBremFsbG9jX29iaigqaW52YWxpZF9zbG90LCBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuMTkyNzpcdFx0XHRpZiAoIWludmFsaWRfc2xvdCkge1xuMTkyODpcdFx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbjE5Mjk6XHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjE5MzA6XHRcdFx0fVxuMTkzMTpcdFx0XHRrdm1faW52YWxpZGF0ZV9tZW1zbG90KGt2bSwgb2xkLCBpbnZhbGlkX3Nsb3QpO1xuMTkzMjpcdFx0fVxuMTkzMzpcdFxuMTkzNDpcdFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbjE5MzU6XHRcdGlmIChyKVxuMTkzNjpcdFx0XHRnb3RvIGVycjtcbjE5Mzc6XHRcbjE5Mzg6XHRcdGlmIChuZXcgXHUwMDI2XHUwMDI2IG5ldy1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xuMTkzOTpcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcbjE5NDA6XHRcdFx0XHRnb3RvIGVycl9iaW5kO1xuMTk0MTpcdFxuMTk0MjpcdFx0XHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpO1xuMTk0MzpcdFx0XHRpZiAocilcbjE5NDQ6XHRcdFx0XHRnb3RvIGVycl9iaW5kO1xuMTk0NTpcdFx0fVxuMTk0NjpcdFxuMTk0NzpcdFx0LypcbjE5NDg6XHRcdCAqIEZvciBERUxFVEUgYW5kIE1PVkUsIHRoZSB3b3JraW5nIHNsb3QgaXMgbm93IGFjdGl2ZSBhcyB0aGUgSU5WQUxJRFxuMTk0OTpcdFx0ICogdmVyc2lvbiBvZiB0aGUgb2xkIHNsb3QuICBNT1ZFIGlzIHBhcnRpY3VsYXJseSBzcGVjaWFsIGFzIGl0IHJldXNlc1xuMTk1MDpcdFx0ICogdGhlIG9sZCBzbG90IGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGUgb2xkIHNsb3QgKGluIHdvcmtpbmdfc2xvdCkuXG4xOTUxOlx0XHQgKiBGb3IgQ1JFQVRFLCB0aGVyZSBpcyBubyBvbGQgc2xvdC4gIEZvciBERUxFVEUgYW5kIEZMQUdTX09OTFksIHRoZVxuMTk1MjpcdFx0ICogb2xkIHNsb3QgaXMgZGV0YWNoZWQgYnV0IG90aGVyd2lzZSBwcmVzZXJ2ZWQuXG4xOTUzOlx0XHQgKi9cbjE5NTQ6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSlcbjE5NTU6XHRcdFx0a3ZtX2NyZWF0ZV9tZW1zbG90KGt2bSwgbmV3KTtcbjE5NTY6XHRcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFKVxuMTk1NzpcdFx0XHRrdm1fZGVsZXRlX21lbXNsb3Qoa3ZtLCBvbGQsIGludmFsaWRfc2xvdCk7XG4xOTU4Olx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXG4xOTU5Olx0XHRcdGt2bV9tb3ZlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgaW52YWxpZF9zbG90KTtcbjE5NjA6XHRcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfRkxBR1NfT05MWSlcbjE5NjE6XHRcdFx0a3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KGt2bSwgb2xkLCBuZXcpO1xuMTk2MjpcdFx0ZWxzZVxuMTk2MzpcdFx0XHRCVUcoKTtcbjE5NjQ6XHRcbjE5NjU6XHRcdC8qIEZyZWUgdGhlIHRlbXBvcmFyeSBJTlZBTElEIHNsb3QgdXNlZCBmb3IgREVMRVRFIGFuZCBNT1ZFLiAqL1xuMTk2NjpcdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcbjE5Njc6XHRcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbjE5Njg6XHRcbjE5Njk6XHRcdC8qXG4xOTcwOlx0XHQgKiBObyBuZWVkIHRvIHJlZnJlc2ggbmV3LVx1MDAzZWFyY2gsIGNoYW5nZXMgYWZ0ZXIgZHJvcHBpbmcgc2xvdHNfYXJjaF9sb2NrXG4xOTcxOlx0XHQgKiB3aWxsIGRpcmVjdGx5IGhpdCB0aGUgZmluYWwsIGFjdGl2ZSBtZW1zbG90LiAgQXJjaGl0ZWN0dXJlcyBhcmVcbjE5NzI6XHRcdCAqIHJlc3BvbnNpYmxlIGZvciBrbm93aW5nIHRoYXQgbmV3LVx1MDAzZWFyY2ggbWF5IGJlIHN0YWxlLlxuMTk3MzpcdFx0ICovXG4xOTc0Olx0XHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbjE5NzU6XHRcbjE5NzY6XHRcdHJldHVybiAwO1xuMTk3NzpcdFxuMTk3ODpcdGVycl9iaW5kOlxuMTk3OTpcdFx0aWYgKG5ldykge1xuMTk4MDpcdFx0XHRrdm1fYXJjaF9mcmVlX21lbXNsb3Qoa3ZtLCBuZXcpO1xuMTk4MTpcdFxuMTk4MjpcdFx0XHRpZiAobmV3LVx1MDAzZWRpcnR5X2JpdG1hcCBcdTAwMjZcdTAwMjYgKCFvbGQgfHwgIW9sZC1cdTAwM2VkaXJ0eV9iaXRtYXApKVxuMTk4MzpcdFx0XHRcdGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcChuZXcpO1xuMTk4NDpcdFx0fVxuMTk4NTpcdGVycjpcbjE5ODY6XHRcdC8qXG4xOTg3Olx0XHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXG4xOTg4Olx0XHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cbjE5ODk6XHRcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbjE5OTA6XHRcdCAqL1xuMTk5MTpcdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuMTk5MjpcdFx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbjE5OTM6XHRcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbjE5OTQ6XHRcdH0gZWxzZSB7XG4xOTk1Olx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbjE5OTY6XHRcdH1cbjE5OTc6XHRcdHJldHVybiByO1xuMTk5ODpcdH1cbjE5OTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTA3MwoJCQkJCQkJb3V0cHV0OiAxMzYKCQkJCQkJCXRob3VnaHRzOiA2NzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUGF0Y2ggQW5hbHlzaXMgYW5kIEtNU0FOIEV2YWx1YXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQmIzM5O3MgZm9jdXNlZCBvbiBpbXByb3ZpbmcgdGhlIHJvYnVzdG5lc3Mgb2YgdGhlIEtWTSBndWVzdF9tZW1mZCBtZW1vcnkgc2xvdCBzZXR1cC4gSSBzZWUgdGhhdCBpdCYjMzk7cyBwcmltYXJpbHkgcmVmYWN0b3JpbmcgdGhlIGVycm9yIGhhbmRsaW5nIHdpdGhpbiBga3ZtX2dtZW1fYmluZGAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYnJvYWRlciBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCBwcm9jZXNzLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gbm90aW5nIHRoZSBjaGFuZ2VzIGluIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb246IGVycm9yIGhhbmRsaW5nIGFkZGVkIGZvciBgeGFfc3RvcmVfcmFuZ2VgLCB0aGUgYWRkaXRpb24gb2YgYSBgV0FSTl9PTl9PTkNFYCBjaGVjaywgYW5kIHRoZSByZW1vdmFsIG9mIGEgYFdSSVRFX09OQ0VgLiBUaGUgcmVvcmRlcmluZyBvZiB0aGUgZnVuY3Rpb24gY2FsbHMgaXMgYWxzbyBzaWduaWZpY2FudCwgZXNwZWNpYWxseSB0aGUgc2hpZnQgb2YgYGt2bV9nbWVtX2JpbmRgIHRvIGJlIGluc2lkZSBga3ZtX3NldF9tZW1zbG90YC4gSW1wb3J0YW50bHksIHRoaXMgbWVhbnMgdGhlIHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cCBpbiBhbiBpbXByb3ZlZCBtYW5uZXIuCgpOb3csIGxldCYjMzk7cyB0aGluayBhYm91dCBLTVNBTiYjMzk7cyByb2xlIGhlcmUuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEkmIzM5O3ZlIHNjYW5uZWQgdGhlIGNoYW5nZXMgYW5kIEkgZG9uJiMzOTt0IHNlZSBhbnl0aGluZyB0aGF0IHNjcmVhbXMgJiMzNDtLTVNBTiByaXNrLiYjMzQ7IEkmIzM5O20gbG9va2luZyBmb3IgZGlyZWN0IGludGVyYWN0aW9ucyB3aXRoIHVzZXJzcGFjZSB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIGRhdGEuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBjaGVja2luZyBmb3IgbmV3IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBuZXcgYWxsb2NhdGlvbnMsIG9yIHJlYWRzIHRoYXQgY291bGQgbGVhZCB0byBtZW1vcnkgY29ycnVwdGlvbiBvciBpbmZvIGxlYWtzLiBJdCBsb29rcyBsaWtlIHRoZSBwYXRjaCBpcyBjb3JyZWN0aW5nIGZhaWx1cmUgaGFuZGxpbmcuIFRoZSBwYXRjaCBzZWVtcyB0byBiZSBjb3JyZWN0bHkgdXNpbmcgdGhlIHJldHVybiB2YWx1ZXMgZnJvbSB0aGUgeGFycmF5IGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgYmVoYXZpb3IsIHNvIG5vIGNvbmNlcm5zIHRoZXJlLgoKVGhlIGNoYW5nZXMgYXJlIGNlbnRlcmVkIGFyb3VuZCBpbXByb3ZlZCBlcnJvciBoYW5kbGluZyBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgY2xlYW51cCBvbiBlcnJvcnMuIFRoaXMgaXNuJiMzOTt0IHdoZXJlIEtNU0FOIHRyYWRpdGlvbmFsbHkgc2hpbmVzLiBXZSBhcmUgaGFuZGxpbmcgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbi4gU28sIEkgZG9uJiMzOTt0IHRoaW5rIHRoaXMgaXMgYSBLTVNBTiBpc3N1ZS4gS0FTQU4gYW5kIHRoZSB1c3VhbCBtZW1vcnkgZGVidWdnaW5nIHRvb2xzIGFyZSBsaWtlbHkgc3VmZmljaWVudCBmb3IgdGhvc2UgY29uY2VybnMsIHN1Y2ggYXMgZG91YmxlIGZyZWVzIG9yIFVBRi4gVGhlIHBhdGNoIGl0c2VsZiBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyBzdHJ1Y3R1cmVzLCBjaGFuZ2VzIGluIGRhdGEgbGVuZ3RocywgYnVmZmVyIG92ZXJmbG93cywgb3Igc2hpZnRzIG9mIG9mZnNldHMgdG8gaW50cm9kdWNlIHZ1bG5lcmFiaWxpdGllcy4KCkxldCYjMzk7cyBtYWtlIHN1cmUgSSYjMzk7bSBjcnlzdGFsIGNsZWFyIGluIG15IHJhdGlvbmFsZS4gS01TQU4gdGFyZ2V0cyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3NlcyBhbmQga2VybmVsLXRvLXVzZXIgbGVha3MuIFRoaXMgcGF0Y2ggcHJpbWFyaWx5IG1vZGlmaWVzIHRoZSBlcnJvciBoYW5kbGluZywgZm9jdXNpbmcgb24gdGhlIGNvcnJlY3Qgc2VxdWVuY2UgYW5kIGZhaWx1cmUgaGFuZGxpbmcgb2YgdGhlIGBrdm1fZ21lbV9iaW5kYCBwcm9jZXNzLiBTaW5jZSB0aGlzIGRvZXNuJiMzOTt0IGRpcmVjdGx5IGludHJvZHVjZSBhbnkgbmV3IHVuaW5pdGlhbGl6ZWQgZGF0YSwgZG9lc24mIzM5O3QgY29weSBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSwgYW5kIGZpeGVzIGV4aXN0aW5nIGVycm9yIHBhdGh3YXlzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXNuJiMzOTt0IHdhcnJhbnRlZC4gSSBjYW4gY29uZmlybSB0aGF0IE5lZWRzS01TQU4gc2hvdWxkIGJlIGZhbHNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgb3JkZXJpbmcgYW5kIGVycm9yIGhhbmRsaW5nIG9mIGBrdm1fZ21lbV9iaW5kKClgIGR1cmluZyBLVk0gbWVtc2xvdCBjcmVhdGlvbiBhbmQgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgYHhhX3N0b3JlX3JhbmdlKClgLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBzdHJ1Y3R1cmUgZmllbGRzIHRvdWNoZWQgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZC4gQW55IHJlc291cmNlIGxpZmVjeWNsZSBlcnJvcnMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWUgaW4gZXJyb3IgdW53aW5kIHBhdGhzKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gVGhlcmVmb3JlLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBvcmRlcmluZyBhbmQgZXJyb3IgaGFuZGxpbmcgb2YgYGt2bV9nbWVtX2JpbmQoKWAgZHVyaW5nIEtWTSBtZW1zbG90IGNyZWF0aW9uIGFuZCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBgeGFfc3RvcmVfcmFuZ2UoKWAuIEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdHVyZSBmaWVsZHMgdG91Y2hlZCBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgbGVmdCB1bmluaXRpYWxpemVkLiBBbnkgcmVzb3VyY2UgbGlmZWN5Y2xlIGVycm9ycyAoc3VjaCBhcyB1c2UtYWZ0ZXItZnJlZSBvciBkb3VibGUgZnJlZSBpbiBlcnJvciB1bndpbmQgcGF0aHMpIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDozMS45MTc4NzQ1M1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwNzAyMjUwMzA1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiS1ZNX0lOVEVMXCIsXG4gICAgXCJLVk1fQU1EXCIsXG4gICAgXCJLVk1fR1VFU1RfTUVNRkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9iaW5kXCIsXG4gICAgXCJrdm1fc2V0X21lbXNsb3RcIixcbiAgICBcImt2bV9zZXRfbWVtb3J5X3JlZ2lvblwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbXNsb3QgbWFuYWdlbWVudCBhbmQgZ3Vlc3RfbWVtZmQgYmluZGluZyBsb2dpYywgbW92aW5nIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCkgdW5kZXIgc2xvdHNfYXJjaF9sb2NrLCBhZGRpbmcgZXJyb3IgaGFuZGxpbmcgYW5kIHJvbGxiYWNrIGZvciB4YV9zdG9yZV9yYW5nZSgpLCBhbmQgaW50cm9kdWNpbmcgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zIGFuZCBlcnJvciBwYXRocy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgS1ZNIG1lbW9yeSByZWdpb24gaW9jdGxzIGFuZCB3YXJyYW50cyBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDozMS45MTc4NzkyMVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ1MDI1ODI3NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGZiZjk1OTE2ZDZiMTlkYzE3NmIzYjBlOTA0ZTJmMTVlYzQ1ZWRmYzBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFNhdCBTZXAgNSAwOToxNDozMCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbmluZGV4IGI1OTY0ODZkMTg0Y2EuLjZjOGRmNjczODJmY2UgMTAwNjQ0XFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcXG5AQCAtNjEyLDEwICs2MTIsMTQgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbiBcXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcXG4gXFx0aW50IHIgPSAtRUlOVkFMO1xcbitcXHR2b2lkICp4YXI7XFxuIFxcbiBcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XFxuIFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVxcdTAwM2VnbWVtLnBnb2ZmKSk7XFxuIFxcbitcXHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbiBcXHRmaWxlID0gZmdldChmZCk7XFxuIFxcdGlmICghZmlsZSlcXG4gXFx0XFx0cmV0dXJuIC1FQkFERjtcXG5AQCAtNjQ5LDEyICs2NTMsMjAgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiBcXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxcbiBcXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4gXFx0ICovXFxuLVxcdFdSSVRFX09OQ0Uoc2xvdC1cXHUwMDNlZ21lbS5maWxlLCBmaWxlKTtcXG4rXFx0c2xvdC1cXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcXG4gXFx0c2xvdC1cXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xcbiBcXHRpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpXFxuIFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcXG4gXFxuLVxcdHhhX3N0b3JlX3JhbmdlKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpO1xcbitcXHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcXG4rXFxuK1xcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4rXFx0aWYgKHIpIHtcXG4rXFx0XFx0eGFfc3RvcmVfcmFuZ2UoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgTlVMTCwgR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuK1xcdFxcdHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYgPSAwO1xcbitcXHRcXHRzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZO1xcbitcXHR9XFxuIFxcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuIFxcbiBcXHQvKlxcbkBAIC02NjIsNyArNjc0LDYgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiBcXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxcbiBcXHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cXG4gXFx0ICovXFxuLVxcdHIgPSAwO1xcbiBlcnI6XFxuIFxcdGZwdXQoZmlsZSk7XFxuIFxcdHJldHVybiByO1xcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uY1xcbmluZGV4IDY1ZWIyNmEwNTIwZDguLjIxYzEwY2JiYWM2NjEgMTAwNjQ0XFxuLS0tIGEvdmlydC9rdm0va3ZtX21haW4uY1xcbisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcXG5AQCAtMTg4Nyw3ICsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4gc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxcbiBcXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXFxuIFxcdFxcdFxcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldyxcXG4tXFx0XFx0XFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSlcXG4rXFx0XFx0XFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcXG4rXFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcXG4ge1xcbiBcXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICppbnZhbGlkX3Nsb3Q7XFxuIFxcdGludCByO1xcbkBAIC0xOTMxLDIwICsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4gXFx0fVxcbiBcXG4gXFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4tXFx0aWYgKHIpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm9cXG4tXFx0XFx0ICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkXFxuLVxcdFxcdCAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzb1xcbi1cXHRcXHQgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcXG4tXFx0XFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuLVxcdFxcdFxcdGtmcmVlKGludmFsaWRfc2xvdCk7XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbi1cXHRcXHR9XFxuLVxcdFxcdHJldHVybiByO1xcbitcXHRpZiAocilcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcbitcXHRpZiAobmV3IFxcdTAwMjZcXHUwMDI2IG5ldy1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XFxuK1xcdFxcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxcbitcXHRcXHRcXHRnb3RvIGVycl9iaW5kO1xcbitcXG4rXFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG4rXFx0XFx0aWYgKHIpXFxuK1xcdFxcdFxcdGdvdG8gZXJyX2JpbmQ7XFxuIFxcdH1cXG4gXFxuIFxcdC8qXFxuQEAgLTE5NzcsNiArMTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcdGt2bV9jb21taXRfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xcbiBcXG4gXFx0cmV0dXJuIDA7XFxuK1xcbitlcnJfYmluZDpcXG4rXFx0aWYgKG5ldykge1xcbitcXHRcXHRrdm1fYXJjaF9mcmVlX21lbXNsb3Qoa3ZtLCBuZXcpO1xcbitcXG4rXFx0XFx0aWYgKG5ldy1cXHUwMDNlZGlydHlfYml0bWFwIFxcdTAwMjZcXHUwMDI2ICghb2xkIHx8ICFvbGQtXFx1MDAzZWRpcnR5X2JpdG1hcCkpXFxuK1xcdFxcdFxcdGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcChuZXcpO1xcbitcXHR9XFxuK2VycjpcXG4rXFx0LypcXG4rXFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9uc1xcbitcXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cXG4rXFx0ICogQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLlxcbitcXHQgKi9cXG4rXFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbitcXHRcXHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcXG4rXFx0XFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZrdm0tXFx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHI7XFxuIH1cXG4gXFxuIHN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcXG5AQCAtMjA1OCw3ICsyMDc2LDcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbiBcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGt2bS1cXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcXHUwMDNjIG9sZC1cXHUwMDNlbnBhZ2VzKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuIFxcbi1cXHRcXHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTtcXG4rXFx0XFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xcbiBcXHR9XFxuIFxcbiBcXHRiYXNlX2dmbiA9IChtZW0tXFx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG5AQCAtMjEwNSwyMSArMjEyMywxNCBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcdG5ldy1cXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xcbiBcXHRuZXctXFx1MDAzZWZsYWdzID0gbWVtLVxcdTAwM2VmbGFncztcXG4gXFx0bmV3LVxcdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cXHUwMDNldXNlcnNwYWNlX2FkZHI7XFxuLVxcdGlmIChtZW0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xcbi1cXHRcXHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgbWVtLVxcdTAwM2VndWVzdF9tZW1mZCwgbWVtLVxcdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xcbi1cXHRcXHRpZiAocilcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4gXFxuLVxcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4rXFx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXFxuK1xcdFxcdFxcdCAgICBtZW0tXFx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXFx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XFxuIFxcdGlmIChyKVxcbi1cXHRcXHRnb3RvIG91dF91bmJpbmQ7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIFxcbi1vdXRfdW5iaW5kOlxcbi1cXHRpZiAobWVtLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXFxuLVxcdFxcdGt2bV9nbWVtX3VuYmluZChuZXcpO1xcbiBvdXQ6XFxuIFxcdGtmcmVlKG5ldyk7XFxuIFxcdHJldHVybiByO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDozMy4zNjkzNzMzNDZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjI2ODM0NzM3MTk3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiS1ZNX0lOVEVMXCIsXG4gICAgXCJLVk1fQU1EXCIsXG4gICAgXCJLVk1fR1VFU1RfTUVNRkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9iaW5kXCIsXG4gICAgXCJrdm1fc2V0X21lbXNsb3RcIixcbiAgICBcImt2bV9zZXRfbWVtb3J5X3JlZ2lvblwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1zbG90IG1hbmFnZW1lbnQgYW5kIGd1ZXN0X21lbWZkIGJpbmRpbmcgbG9naWMsIG1vdmluZyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpIHVuZGVyIHNsb3RzX2FyY2hfbG9jaywgYWRkaW5nIGVycm9yIGhhbmRsaW5nIGFuZCByb2xsYmFjayBmb3IgeGFfc3RvcmVfcmFuZ2UoKSwgYW5kIGludHJvZHVjaW5nIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucyBhbmQgZXJyb3IgcGF0aHMuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEtWTSBtZW1vcnkgcmVnaW9uIGlvY3RscyBhbmQgd2FycmFudHMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBmYmY5NTkxNmQ2YjE5ZGMxNzZiM2IwZTkwNGUyZjE1ZWM0NWVkZmMwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgNSAwOToxNDozMCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCBiNTk2NDg2ZDE4NGNhLi42YzhkZjY3MzgyZmNlIDEwMDY0NFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuKysrIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuQEAgLTYxMiwxMCArNjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiBcdGludCByID0gLUVJTlZBTDtcbitcdHZvaWQgKnhhcjtcbiBcbiBcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcbiBcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVx1MDAzZWdtZW0ucGdvZmYpKTtcbiBcbitcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4gXHRmaWxlID0gZmdldChmZCk7XG4gXHRpZiAoIWZpbGUpXG4gXHRcdHJldHVybiAtRUJBREY7XG5AQCAtNjQ5LDEyICs2NTMsMjAgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbiBcdCAqIGlzIG5vdCB2aXNpYmxlIHlldCwga3ZtX2dtZW1fZ2V0X3BmbigpIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBmaWxlLlxuIFx0ICovXG4tXHRXUklURV9PTkNFKHNsb3QtXHUwMDNlZ21lbS5maWxlLCBmaWxlKTtcbitcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiBcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiBcbi1cdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbitcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbitcbitcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbitcdGlmIChyKSB7XG4rXHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbitcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuK1x0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuK1x0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbitcdH1cbiBcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiBcbiBcdC8qXG5AQCAtNjYyLDcgKzY3NCw2IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICdyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXG4gXHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cbiBcdCAqL1xuLVx0ciA9IDA7XG4gZXJyOlxuIFx0ZnB1dChmaWxlKTtcbiBcdHJldHVybiByO1xuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2t2bV9tYWluLmMgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXG5pbmRleCA2NWViMjZhMDUyMGQ4Li4yMWMxMGNiYmFjNjYxIDEwMDY0NFxuLS0tIGEvdmlydC9rdm0va3ZtX21haW4uY1xuKysrIGIvdmlydC9rdm0va3ZtX21haW4uY1xuQEAgLTE4ODcsNyArMTg4Nyw4IEBAIHN0YXRpYyB2b2lkIGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXG4tXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSlcbitcdFx0XHQgICBlbnVtIGt2bV9tcl9jaGFuZ2UgY2hhbmdlLFxuK1x0XHRcdCAgIHVuc2lnbmVkIGludCBnbWVtX2ZkLCB1b2ZmX3QgZ21lbV9vZmZzZXQpXG4ge1xuIFx0c3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqaW52YWxpZF9zbG90O1xuIFx0aW50IHI7XG5AQCAtMTkzMSwyMCArMTkzMiwxNiBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHR9XG4gXG4gXHRyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuLVx0aWYgKHIpIHtcbi1cdFx0Lypcbi1cdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm9cbi1cdFx0ICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkXG4tXHRcdCAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzb1xuLVx0XHQgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbi1cdFx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbi1cdFx0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbi1cdFx0fVxuLVx0XHRyZXR1cm4gcjtcbitcdGlmIChyKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdGlmIChuZXcgXHUwMDI2XHUwMDI2IG5ldy1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xuK1x0XHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcbitcdFx0XHRnb3RvIGVycl9iaW5kO1xuK1xuK1x0XHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpO1xuK1x0XHRpZiAocilcbitcdFx0XHRnb3RvIGVycl9iaW5kO1xuIFx0fVxuIFxuIFx0LypcbkBAIC0xOTc3LDYgKzE5NzQsMjcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0a3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4gXG4gXHRyZXR1cm4gMDtcbitcbitlcnJfYmluZDpcbitcdGlmIChuZXcpIHtcbitcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbitcbitcdFx0aWYgKG5ldy1cdTAwM2VkaXJ0eV9iaXRtYXAgXHUwMDI2XHUwMDI2ICghb2xkIHx8ICFvbGQtXHUwMDNlZGlydHlfYml0bWFwKSlcbitcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbitcdH1cbitlcnI6XG4rXHQvKlxuK1x0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9uc1xuK1x0ICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuXG4rXHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4rXHQgKi9cbitcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbitcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4rXHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4rXHR9IGVsc2Uge1xuK1x0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4rXHR9XG4rXHRyZXR1cm4gcjtcbiB9XG4gXG4gc3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLFxuQEAgLTIwNTgsNyArMjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0aWYgKFdBUk5fT05fT05DRShrdm0tXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcdTAwM2Mgb2xkLVx1MDAzZW5wYWdlcykpXG4gXHRcdFx0cmV0dXJuIC1FSU87XG4gXG4tXHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUpO1xuK1x0XHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFLCAtMSwgMCk7XG4gXHR9XG4gXG4gXHRiYXNlX2dmbiA9IChtZW0tXHUwMDNlZ3Vlc3RfcGh5c19hZGRyIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbkBAIC0yMTA1LDIxICsyMTIzLDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbiBcdG5ldy1cdTAwM2VucGFnZXMgPSBucGFnZXM7XG4gXHRuZXctXHUwMDNlZmxhZ3MgPSBtZW0tXHUwMDNlZmxhZ3M7XG4gXHRuZXctXHUwMDNldXNlcnNwYWNlX2FkZHIgPSBtZW0tXHUwMDNldXNlcnNwYWNlX2FkZHI7XG4tXHRpZiAobWVtLVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XG4tXHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmQsIG1lbS1cdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xuLVx0XHRpZiAocilcbi1cdFx0XHRnb3RvIG91dDtcbi1cdH1cbiBcbi1cdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbitcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxuK1x0XHRcdCAgICBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmQsIG1lbS1cdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xuIFx0aWYgKHIpXG4tXHRcdGdvdG8gb3V0X3VuYmluZDtcbitcdFx0Z290byBvdXQ7XG4gXG4gXHRyZXR1cm4gMDtcbiBcbi1vdXRfdW5iaW5kOlxuLVx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRClcbi1cdFx0a3ZtX2dtZW1fdW5iaW5kKG5ldyk7XG4gb3V0OlxuIFx0a2ZyZWUobmV3KTtcbiBcdHJldHVybiByO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6MzMuMzY5Mzc1MjQ2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjI3NzQ3OTczNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipQYXRjaCBBbmFseXNpcyBcdTAwMjYgRnV6emluZyBTdHJhdGVneSoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgXCJJcyB0aGlzIGZ1enotd29ydGh5P1wiIEkgbmVlZCB0byBxdWlja2x5IGFzc2VzcyB0aGUgcG90ZW50aWFsIGltcGFjdCBhbmQgaWRlbnRpZnkgdGhlIG1vc3QgcHJvbWlzaW5nIGFyZWFzIGZvciBmdXp6aW5nLiBHaXZlbiBteSBleHBlcnRpc2UsIEknbGwgYmUgbG9va2luZyBmb3IgYW55IHNpZ25zIG9mIG1lbW9yeSBzYWZldHkgdnVsbmVyYWJpbGl0aWVzIG9yIGxvZ2ljIGZsYXdzIHRoYXQgY291bGQgYmUgZXhwbG9pdGVkLlxuXG5GaXJzdCwgSSBzZWUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIGdvb2QsIHRoYXQncyB3aGF0IEknbSBjb21mb3J0YWJsZSB3aXRoLiBOb3csIHRoZSBmaWxlcyBtb2RpZmllZCBqdW1wIG91dCBhdCBtZTogYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGFuZCBgdmlydC9rdm0va3ZtX21haW4uY2AuIEludGVyZXN0aW5nLiBLZXJuZWwgVmlydHVhbCBNYWNoaW5lIChLVk0pIGNvZGUg4oCTIGRlZmluaXRlbHkgd29ydGggYSBjbG9zZXIgbG9vay4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGJlZW4gY2hhbmdlZCBpbiB0aGVzZSBmaWxlcyBhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIFRpbWUgdG8gcHVsbCB1cCBteSB0cnVzdHkgdG9vbHMgYW5kIGdldCBhIGRldGFpbGVkIGxvb2sgYXQgdGhlIHBhdGNoIGNvbnRlbnRzLiBJJ2xsIGJlIHNjcnV0aW5pemluZyB0aG9zZSBjb2RlIHNuaXBwZXRzIHRvIG1hcCBvdXQgdGhlIGF0dGFjayBzdXJmYWNlIGFuZCB0aGluayBzdHJhdGVnaWNhbGx5LiBJJ2xsIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcmlnaHQgZm9jdXMgc3ltYm9scyBhbmQgY29uZmlncyB0byBtYXhpbWl6ZSBvdXIgZnV6emluZyBlZmZvcnRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0Nzk5LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDozOS42NDY4NTg4MzNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUzMDYyNzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiS1ZNX01FTV9HVUVTVF9NRU1GRFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJ2aXJ0L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jPTYwNj1pbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1MS1cXHQvKlxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjUyOlxcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1My1cXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz05MzY9c3RhdGljIHZvaWQga3ZtX2ZyZWVfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QpXFxudmlydC9rdm0va3ZtX21haW4uYy05Mzcte1xcbnZpcnQva3ZtL2t2bV9tYWluLmM6OTM4OlxcdGlmIChzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXFxudmlydC9rdm0va3ZtX21haW4uYy05MzktXFx0XFx0a3ZtX2dtZW1fdW5iaW5kKHNsb3QpO1xcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz0xNTc0PXN0YXRpYyBpbnQgY2hlY2tfbWVtb3J5X3JlZ2lvbl9mbGFncyhzdHJ1Y3Qga3ZtICprdm0sXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE1NzktXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkpXFxudmlydC9rdm0va3ZtX21haW4uYzoxNTgwOlxcdFxcdHZhbGlkX2ZsYWdzIHw9IEtWTV9NRU1fR1VFU1RfTUVNRkQ7XFxudmlydC9rdm0va3ZtX21haW4uYy0xNTgxLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU4Mi1cXHQvKiBEaXJ0eSBsb2dnaW5nIHByaXZhdGUgbWVtb3J5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiAqL1xcbnZpcnQva3ZtL2t2bV9tYWluLmM6MTU4MzpcXHRpZiAobWVtLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXFxudmlydC9rdm0va3ZtX21haW4uYy0xNTg0LVxcdFxcdHZhbGlkX2ZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNX0xPR19ESVJUWV9QQUdFUztcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU5MS1cXHRpZiAoa3ZtX2FyY2hfaGFzX3JlYWRvbmx5X21lbShrdm0pIFxcdTAwMjZcXHUwMDI2XFxudmlydC9rdm0va3ZtX21haW4uYzoxNTkyOlxcdCAgICAhKG1lbS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSlcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE1OTMtXFx0XFx0dmFsaWRfZmxhZ3MgfD0gS1ZNX01FTV9SRUFET05MWTtcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmM9MTY5Nz1zdGF0aWMgdm9pZCBrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0xNzMzLVxcdFxcdCAqL1xcbnZpcnQva3ZtL2t2bV9tYWluLmM6MTczNDpcXHRcXHRXQVJOX09OX09OQ0Uob2xkLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpO1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTczNS1cXHRcXHRmYWxsdGhyb3VnaDtcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTc0OS1cXHRcXHQgKi9cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE3NTA6XFx0XFx0aWYgKFdBUk5fT05fT05DRShvbGQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkpXFxudmlydC9rdm0va3ZtX21haW4uYy0xNzUxLVxcdFxcdFxcdGt2bV9nbWVtX3VuYmluZChvbGQpO1xcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz0xODg3PXN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTkzNy1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE5Mzg6XFx0aWYgKG5ldyBcXHUwMDI2XFx1MDAyNiBuZXctXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTkzOS1cXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmM9MjAxMz1zdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwNDQtXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxudmlydC9rdm0va3ZtX21haW4uYzoyMDQ1OlxcdGlmIChtZW0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCBcXHUwMDI2XFx1MDAyNlxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA0Ni1cXHQgICAgKG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0IFxcdTAwMjYgKFBBR0VfU0laRSAtIDEpIHx8XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwOTUtXFx0XFx0LyogUHJpdmF0ZSBtZW1zbG90cyBhcmUgaW1tdXRhYmxlLCB0aGV5IGNhbiBvbmx5IGJlIGRlbGV0ZWQuICovXFxudmlydC9rdm0va3ZtX21haW4uYzoyMDk2OlxcdFxcdGlmIChtZW0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRClcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwOTctXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwOTktXFx0XFx0ICAgIChucGFnZXMgIT0gb2xkLVxcdTAwM2VucGFnZXMpIHx8XFxudmlydC9rdm0va3ZtX21haW4uYzoyMTAwOlxcdFxcdCAgICAoKG1lbS1cXHUwMDNlZmxhZ3MgXiBvbGQtXFx1MDAzZWZsYWdzKSBcXHUwMDI2IChLVk1fTUVNX1JFQURPTkxZIHwgS1ZNX01FTV9HVUVTVF9NRU1GRCkpKVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjEwMS1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6MzkuNjkyMTcwOTkyWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgwODk5MDE4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIHRoZSBLVk0gQ29kZSoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGNoYW5nZXMgcmVsYXRlZCB0byB0aGVzZSBtZW1mZCB1cGRhdGVzIHdpdGhpbiB0aGUgS1ZNIHN1YnN5c3RlbS4gVGhlIHBhdGNoIG1lbnRpb25zIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhbmQgYHZpcnQva3ZtL2t2bV9tYWluLmNgIGFyb3VuZCB0aGUgbW9kaWZpZWQgbGluZXMuIFJpZ2h0LCB0aGF0IG1ha2VzIHNlbnNlLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBndWVzdCBtZW1vcnkgYW5kIG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIGludGVyYWN0IHdpdGhpbiBLVk0sIGFuZCBob3cgdGhlIGNvcmUgS1ZNIGxvZ2ljIGhhbmRsZXMgdGhpcy4gVGltZSB0byBkaWcgaW4gYW5kIGNyb3NzLXJlZmVyZW5jZSB0aGUgcmVsZXZhbnQgY29kZSBibG9ja3MuIExldCdzIHNlZSBob3cgdGhlc2UgcGFydGljdWxhciBmaWxlcyBpbmZsdWVuY2UgdGhlIG92ZXJhbGwgYXJjaGl0ZWN0dXJlIGhlcmUuIFRoaXMgd2lsbCBiZSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bGwgaW1wbGljYXRpb25zIG9mIHRoaXMgY2hhbmdlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NDYyLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDEuNTAxMTY1NTAzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY2NjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjA1LFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjA1OlxcdFxcbiA2MDY6XFx0aW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiA2MDc6XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXFxuIDYwODpcXHR7XFxuIDYwOTpcXHRcXHR1b2ZmX3Qgc2l6ZSA9IHNsb3QtXFx1MDAzZW5wYWdlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbiA2MTA6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCwgZW5kO1xcbiA2MTE6XFx0XFx0c3RydWN0IGdtZW1fZmlsZSAqZjtcXG4gNjEyOlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIDYxMzpcXHRcXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcXG4gNjE0OlxcdFxcdGludCByID0gLUVJTlZBTDtcXG4gNjE1OlxcdFxcdHZvaWQgKnhhcjtcXG4gNjE2OlxcdFxcbiA2MTc6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpO1xcbiA2MTg6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihnZm5fdCkgIT0gc2l6ZW9mKHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYpKTtcXG4gNjE5OlxcdFxcbiA2MjA6XFx0XFx0aWYgKFdBUk5fT05fT05DRShzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXFxuIDYyMTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjIyOlxcdFxcbiA2MjM6XFx0XFx0ZmlsZSA9IGZnZXQoZmQpO1xcbiA2MjQ6XFx0XFx0aWYgKCFmaWxlKVxcbiA2MjU6XFx0XFx0XFx0cmV0dXJuIC1FQkFERjtcXG4gNjI2OlxcdFxcbiA2Mjc6XFx0XFx0aWYgKGZpbGUtXFx1MDAzZWZfb3AgIT0gXFx1MDAyNmt2bV9nbWVtX2ZvcHMpXFxuIDYyODpcXHRcXHRcXHRnb3RvIGVycjtcXG4gNjI5OlxcdFxcbiA2MzA6XFx0XFx0ZiA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gNjMxOlxcdFxcdGlmIChmLVxcdTAwM2Vrdm0gIT0ga3ZtKVxcbiA2MzI6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYzMzpcXHRcXG4gNjM0OlxcdFxcdGlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4gNjM1OlxcdFxcbiA2MzY6XFx0XFx0aWYgKCFQQUdFX0FMSUdORUQob2Zmc2V0KSB8fCBvZmZzZXQgKyBzaXplIFxcdTAwM2UgaV9zaXplX3JlYWQoaW5vZGUpKVxcbiA2Mzc6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYzODpcXHRcXG4gNjM5OlxcdFxcdGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NDA6XFx0XFxuIDY0MTpcXHRcXHRzdGFydCA9IG9mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiA2NDI6XFx0XFx0ZW5kID0gc3RhcnQgKyBzbG90LVxcdTAwM2VucGFnZXM7XFxuIDY0MzpcXHRcXG4gNjQ0OlxcdFxcdGlmICgheGFfZW1wdHkoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzKSBcXHUwMDI2XFx1MDAyNlxcbiA2NDU6XFx0XFx0ICAgIHhhX2ZpbmQoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBcXHUwMDI2c3RhcnQsIGVuZCAtIDEsIFhBX1BSRVNFTlQpKSB7XFxuIDY0NjpcXHRcXHRcXHRyID0gLUVFWElTVDtcXG4gNjQ3OlxcdFxcdFxcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuIDY0ODpcXHRcXHRcXHRnb3RvIGVycjtcXG4gNjQ5OlxcdFxcdH1cXG4gNjUwOlxcdFxcbiA2NTE6XFx0XFx0LypcXG4gNjUyOlxcdFxcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cXG4gNjUzOlxcdFxcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XFxuIDY1NDpcXHRcXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4gNjU1OlxcdFxcdCAqL1xcbiA2NTY6XFx0XFx0c2xvdC1cXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcXG4gNjU3OlxcdFxcdHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcXG4gNjU4OlxcdFxcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcXG4gNjU5OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcXG4gNjYwOlxcdFxcbiA2NjE6XFx0XFx0eGFyID0geGFfc3RvcmVfcmFuZ2UoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XFxuIDY2MjpcXHRcXG4gNjYzOlxcdFxcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4gNjY0OlxcdFxcdGlmIChyKSB7XFxuIDY2NTpcXHRcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4gNjY2OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuIDY2NzpcXHRcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gMDtcXG4gNjY4OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY2OTpcXHRcXHR9XFxuIDY3MDpcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NzE6XFx0XFxuIDY3MjpcXHRcXHQvKlxcbiA2NzM6XFx0XFx0ICogRHJvcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBmaWxlLCBldmVuIG9uIHN1Y2Nlc3MuICBUaGUgZmlsZSBwaW5zIEtWTSxcXG4gNjc0OlxcdFxcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICdyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXFxuIDY3NTpcXHRcXHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cXG4gNjc2OlxcdFxcdCAqL1xcbiA2Nzc6XFx0ZXJyOlxcbiA2Nzg6XFx0XFx0ZnB1dChmaWxlKTtcXG4gNjc5OlxcdFxcdHJldHVybiByO1xcbiA2ODA6XFx0fVxcbiA2ODE6XFx0XFxuIDY4MjpcXHRzdGF0aWMgdm9pZCBfX2t2bV9nbWVtX3VuYmluZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBzdHJ1Y3QgZ21lbV9maWxlICpmKVxcbiA2ODM6XFx0e1xcbiA2ODQ6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCA9IHNsb3QtXFx1MDAzZWdtZW0ucGdvZmY7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjQxLjUwMTMzNTExMloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMTIwNDQ1MjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipEaWdnaW5nIGludG8gTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKipcblxuT2theSwgc28gd2UgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtZW1vcnkgcmVnaW9ucyBhcmUgYmVpbmcgc2V0IHVwIGFuZCBtYW5hZ2VkIHdpdGhpbiBLVk0uIE15IGZpcnN0IGluc3RpbmN0IGlzIHRvIHplcm8gaW4gb24gYHZpcnQva3ZtL2t2bV9tYWluLmNgIGJlY2F1c2UgdGhhdCdzIHVzdWFsbHkgdGhlIGhlYXJ0IG9mIHRoZSBjb3JlIEtWTSBsb2dpYy4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGludGVyYWN0aW9ucyBhcm91bmQgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLiBUaGVzZSBmdW5jdGlvbnMgYXJlIGdvaW5nIHRvIGJlIGNyaXRpY2FsIGZvciB0cmFja2luZyBob3cgbWVtb3J5IGlzIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQgcG90ZW50aWFsbHkgcmVtYXBwZWQgd2l0aGluIHRoZSBndWVzdCdzIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4gSSdsbCBuZWVkIHRvIHNlZSBob3cgdGhlIGhvc3QgbWFwcyB0aGUgZ3Vlc3QncyBwaHlzaWNhbCBtZW1vcnksIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgaHlwZXJ2aXNvcidzIHZpZXcgYW5kIHRoZSBoYXJkd2FyZS4gTGV0J3Mgc2VlIGhvdyB0aGVzZSBhcmUgY2FsbGVkLCB3aGF0IGRhdGEgc3RydWN0dXJlcyB0aGV5IG1hbmlwdWxhdGUsIGFuZCB3aGF0IGltcGxpY2F0aW9ucyB0aG9zZSBtYW5pcHVsYXRpb25zIGhhdmUgb24gdGhlIG92ZXJhbGwgbWVtb3J5IG9yZ2FuaXphdGlvbi4gSG9wZWZ1bGx5LCBsb29raW5nIGF0IHRoZXNlIGZ1bmN0aW9ucyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGlzIGhhbmRsZWQgYXQgdGhlIEtWTSBsZXZlbCwgZXNwZWNpYWxseSB3aGVuIGNvbnNpZGVyaW5nIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGhvdHBsdWdnaW5nIHNjZW5hcmlvcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzk2MiwiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDMuODEzMzgyODk0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzE1MjY5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTg4MCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE4ODA6XFx0XFx0ICogYW4gaW50ZXJtZWRpYXRlIHN0ZXAuIEluc3RlYWQsIHRoZSBvbGQgbWVtc2xvdCBpcyBzaW1wbHkgcmVwbGFjZWRcXG4xODgxOlxcdFxcdCAqIHdpdGggYSBuZXcsIHVwZGF0ZWQgY29weSBpbiBib3RoIG1lbXNsb3Qgc2V0cy5cXG4xODgyOlxcdFxcdCAqL1xcbjE4ODM6XFx0XFx0a3ZtX3JlcGxhY2VfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcXG4xODg0OlxcdFxcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgb2xkLCBuZXcpO1xcbjE4ODU6XFx0fVxcbjE4ODY6XFx0XFxuMTg4NzpcXHRzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuMTg4ODpcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXFxuMTg4OTpcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXFxuMTg5MDpcXHRcXHRcXHRcXHQgICBlbnVtIGt2bV9tcl9jaGFuZ2UgY2hhbmdlLFxcbjE4OTE6XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcXG4xODkyOlxcdHtcXG4xODkzOlxcdFxcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDtcXG4xODk0OlxcdFxcdGludCByO1xcbjE4OTU6XFx0XFxuMTg5NjpcXHRcXHQvKlxcbjE4OTc6XFx0XFx0ICogUmVsZWFzZWQgaW4ga3ZtX3N3YXBfYWN0aXZlX21lbXNsb3RzKCkuXFxuMTg5ODpcXHRcXHQgKlxcbjE4OTk6XFx0XFx0ICogTXVzdCBiZSBoZWxkIGZyb20gYmVmb3JlIHRoZSBjdXJyZW50IG1lbXNsb3RzIGFyZSBjb3BpZWQgdW50aWwgYWZ0ZXJcXG4xOTAwOlxcdFxcdCAqIHRoZSBuZXcgbWVtc2xvdHMgYXJlIGluc3RhbGxlZCB3aXRoIHJjdV9hc3NpZ25fcG9pbnRlciwgdGhlblxcbjE5MDE6XFx0XFx0ICogcmVsZWFzZWQgYmVmb3JlIHRoZSBzeW5jaHJvbml6ZSBzcmN1IGluIGt2bV9zd2FwX2FjdGl2ZV9tZW1zbG90cygpLlxcbjE5MDI6XFx0XFx0ICpcXG4xOTAzOlxcdFxcdCAqIFdoZW4gbW9kaWZ5aW5nIG1lbXNsb3RzIG91dHNpZGUgb2YgdGhlIHNsb3RzX2xvY2ssIG11c3QgYmUgaGVsZFxcbjE5MDQ6XFx0XFx0ICogYmVmb3JlIHJlYWRpbmcgdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWVtc2xvdHMgdW50aWwgYWZ0ZXIgYWxsXFxuMTkwNTpcXHRcXHQgKiBjaGFuZ2VzIHRvIHRob3NlIG1lbXNsb3RzIGFyZSBjb21wbGV0ZS5cXG4xOTA2OlxcdFxcdCAqXFxuMTkwNzpcXHRcXHQgKiBUaGVzZSBydWxlcyBlbnN1cmUgdGhhdCBpbnN0YWxsaW5nIG5ldyBtZW1zbG90cyBkb2VzIG5vdCBsb3NlXFxuMTkwODpcXHRcXHQgKiBjaGFuZ2VzIG1hZGUgdG8gdGhlIHByZXZpb3VzIG1lbXNsb3RzLlxcbjE5MDk6XFx0XFx0ICovXFxuMTkxMDpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZrdm0tXFx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XFxuMTkxMTpcXHRcXG4xOTEyOlxcdFxcdC8qXFxuMTkxMzpcXHRcXHQgKiBJbnZhbGlkYXRlIHRoZSBvbGQgc2xvdCBpZiBpdCdzIGJlaW5nIGRlbGV0ZWQgb3IgbW92ZWQuICBUaGlzIGlzXFxuMTkxNDpcXHRcXHQgKiBkb25lIHByaW9yIHRvIGFjdHVhbGx5IGRlbGV0aW5nL21vdmluZyB0aGUgbWVtc2xvdCB0byBhbGxvdyB2Q1BVcyB0b1xcbjE5MTU6XFx0XFx0ICogY29udGludWUgcnVubmluZyBieSBlbnN1cmluZyB0aGVyZSBhcmUgbm8gbWFwcGluZ3Mgb3Igc2hhZG93IHBhZ2VzXFxuMTkxNjpcXHRcXHQgKiBmb3IgdGhlIG1lbXNsb3Qgd2hlbiBpdCBpcyBkZWxldGVkL21vdmVkLiAgV2l0aG91dCBwcmUtaW52YWxpZGF0aW9uXFxuMTkxNzpcXHRcXHQgKiAoYW5kIHdpdGhvdXQgYSBsb2NrKSwgYSB3aW5kb3cgd291bGQgZXhpc3QgYmV0d2VlbiBlZmZlY3RpbmcgdGhlXFxuMTkxODpcXHRcXHQgKiBkZWxldGUvbW92ZSBhbmQgY29tbWl0dGluZyB0aGUgY2hhbmdlcyBpbiBhcmNoIGNvZGUgd2hlcmUgS1ZNIG9yIGFcXG4xOTE5OlxcdFxcdCAqIGd1ZXN0IGNvdWxkIGFjY2VzcyBhIG5vbi1leGlzdGVudCBtZW1zbG90LlxcbjE5MjA6XFx0XFx0ICpcXG4xOTIxOlxcdFxcdCAqIE1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgb24gYSB0ZW1wb3JhcnksIHVucmVhY2hhYmxlIHNsb3QuICBUaGUgb2xkXFxuMTkyMjpcXHRcXHQgKiBzbG90IG5lZWRzIHRvIGJlIHByZXNlcnZlZCBpbiBjYXNlIGEgbGF0ZXIgc3RlcCBmYWlscyBhbmQgdGhlXFxuMTkyMzpcXHRcXHQgKiBpbnZhbGlkYXRpb24gbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQuXFxuMTkyNDpcXHRcXHQgKi9cXG4xOTI1OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcXG4xOTI2OlxcdFxcdFxcdGludmFsaWRfc2xvdCA9IGt6YWxsb2Nfb2JqKCppbnZhbGlkX3Nsb3QsIEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuMTkyNzpcXHRcXHRcXHRpZiAoIWludmFsaWRfc2xvdCkge1xcbjE5Mjg6XFx0XFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZrdm0tXFx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XFxuMTkyOTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4xOTMwOlxcdFxcdFxcdH1cXG4xOTMxOlxcdFxcdFxcdGt2bV9pbnZhbGlkYXRlX21lbXNsb3Qoa3ZtLCBvbGQsIGludmFsaWRfc2xvdCk7XFxuMTkzMjpcXHRcXHR9XFxuMTkzMzpcXHRcXG4xOTM0OlxcdFxcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XFxuMTkzNTpcXHRcXHRpZiAocilcXG4xOTM2OlxcdFxcdFxcdGdvdG8gZXJyO1xcbjE5Mzc6XFx0XFxuMTkzODpcXHRcXHRpZiAobmV3IFxcdTAwMjZcXHUwMDI2IG5ldy1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XFxuMTkzOTpcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcXG4xOTQwOlxcdFxcdFxcdFxcdGdvdG8gZXJyX2JpbmQ7XFxuMTk0MTpcXHRcXG4xOTQyOlxcdFxcdFxcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XFxuMTk0MzpcXHRcXHRcXHRpZiAocilcXG4xOTQ0OlxcdFxcdFxcdFxcdGdvdG8gZXJyX2JpbmQ7XFxuMTk0NTpcXHRcXHR9XFxuMTk0NjpcXHRcXG4xOTQ3OlxcdFxcdC8qXFxuMTk0ODpcXHRcXHQgKiBGb3IgREVMRVRFIGFuZCBNT1ZFLCB0aGUgd29ya2luZyBzbG90IGlzIG5vdyBhY3RpdmUgYXMgdGhlIElOVkFMSURcXG4xOTQ5OlxcdFxcdCAqIHZlcnNpb24gb2YgdGhlIG9sZCBzbG90LiAgTU9WRSBpcyBwYXJ0aWN1bGFybHkgc3BlY2lhbCBhcyBpdCByZXVzZXNcXG4xOTUwOlxcdFxcdCAqIHRoZSBvbGQgc2xvdCBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9sZCBzbG90IChpbiB3b3JraW5nX3Nsb3QpLlxcbjE5NTE6XFx0XFx0ICogRm9yIENSRUFURSwgdGhlcmUgaXMgbm8gb2xkIHNsb3QuICBGb3IgREVMRVRFIGFuZCBGTEFHU19PTkxZLCB0aGVcXG4xOTUyOlxcdFxcdCAqIG9sZCBzbG90IGlzIGRldGFjaGVkIGJ1dCBvdGhlcndpc2UgcHJlc2VydmVkLlxcbjE5NTM6XFx0XFx0ICovXFxuMTk1NDpcXHRcXHRpZiAoY2hhbmdlID09IEtWTV9NUl9DUkVBVEUpXFxuMTk1NTpcXHRcXHRcXHRrdm1fY3JlYXRlX21lbXNsb3Qoa3ZtLCBuZXcpO1xcbjE5NTY6XFx0XFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUpXFxuMTk1NzpcXHRcXHRcXHRrdm1fZGVsZXRlX21lbXNsb3Qoa3ZtLCBvbGQsIGludmFsaWRfc2xvdCk7XFxuMTk1ODpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXFxuMTk1OTpcXHRcXHRcXHRrdm1fbW92ZV9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGludmFsaWRfc2xvdCk7XFxuMTk2MDpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0ZMQUdTX09OTFkpXFxuMTk2MTpcXHRcXHRcXHRrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldyk7XFxuMTk2MjpcXHRcXHRlbHNlXFxuMTk2MzpcXHRcXHRcXHRCVUcoKTtcXG4xOTY0OlxcdFxcbjE5NjU6XFx0XFx0LyogRnJlZSB0aGUgdGVtcG9yYXJ5IElOVkFMSUQgc2xvdCB1c2VkIGZvciBERUxFVEUgYW5kIE1PVkUuICovXFxuMTk2NjpcXHRcXHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKVxcbjE5Njc6XFx0XFx0XFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcXG4xOTY4OlxcdFxcbjE5Njk6XFx0XFx0LypcXG4xOTcwOlxcdFxcdCAqIE5vIG5lZWQgdG8gcmVmcmVzaCBuZXctXFx1MDAzZWFyY2gsIGNoYW5nZXMgYWZ0ZXIgZHJvcHBpbmcgc2xvdHNfYXJjaF9sb2NrXFxuMTk3MTpcXHRcXHQgKiB3aWxsIGRpcmVjdGx5IGhpdCB0aGUgZmluYWwsIGFjdGl2ZSBtZW1zbG90LiAgQXJjaGl0ZWN0dXJlcyBhcmVcXG4xOTcyOlxcdFxcdCAqIHJlc3BvbnNpYmxlIGZvciBrbm93aW5nIHRoYXQgbmV3LVxcdTAwM2VhcmNoIG1heSBiZSBzdGFsZS5cXG4xOTczOlxcdFxcdCAqL1xcbjE5NzQ6XFx0XFx0a3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XFxuMTk3NTpcXHRcXG4xOTc2OlxcdFxcdHJldHVybiAwO1xcbjE5Nzc6XFx0XFxuMTk3ODpcXHRlcnJfYmluZDpcXG4xOTc5OlxcdFxcdGlmIChuZXcpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDMuODEzNzAwNTQ1WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjE2NDA2Mjg3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgbXlzZWxmOlxuXG4qKkludmVzdGlnYXRpbmcgS2NvbmZpZyBPcHRpb25zIGZvciBLVk0gYW5kIEd1ZXN0IE1lbW9yeSBGaWxlIERlc2NyaXB0b3JzKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgS1ZNIGFuZCBgZ3Vlc3RfbWVtZmRgIHNpdHVhdGlvbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggS2NvbmZpZyBvcHRpb25zIGFyZSByZWxldmFudCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGBLVk1fR1VFU1RfTUVNRkRgLiBUaGUgb2J2aW91cyBzdGFydGluZyBwb2ludCBpcyB0aGUgS2NvbmZpZyBmaWxlcyB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4gR2l2ZW4gdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGggS1ZNLCB3aGljaCBpcyBoaWdobHkgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCwgSSdsbCBzdGFydCBieSBsb29raW5nIGluIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2Ag4oCTIG1ha2VzIHNlbnNlIHRvIGNoZWNrIHRoZSB4ODYgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gSWYgdGhhdCBkb2Vzbid0IHlpZWxkIGFueXRoaW5nLCBvciBpZiBJIHdhbnQgYSBtb3JlIGdlbmVyYWwgcGVyc3BlY3RpdmUsIEknbGwgZXhwYW5kIHRoZSBzZWFyY2ggYW5kIGxvb2sgaW4gYHZpcnQva3ZtL0tjb25maWdgLiBBIHF1aWNrIGBncmVwYCBmb3IgYEtWTV9HVUVTVF9NRU1GRGAgaW4gYm90aCB0aG9zZSBsb2NhdGlvbnMgc2hvdWxkIHJldmVhbCB0aGUgbmVjZXNzYXJ5IG9wdGlvbnMgYW5kIHRoZWlyIGRlcGVuZGVuY2llcy4gVGhhdCBzaG91bGQgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50IHRvIGFuYWx5emUgd2hhdCBvcHRpb25zIGFyZSBuZWVkZWQsIHRvIGJ1aWxkIG15IHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6OTkzMiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDUuOTc3NzY1NzA5WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MjQ0NzA1OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJLVk1fR1VFU1RfTUVNRkRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYXJjaC94ODYva3ZtXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gveDg2L2t2bS9LY29uZmlnPTIwPWNvbmZpZyBLVk1fWDg2XFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy00OS1cXHRzZWxlY3QgS1ZNX1dFUlJPUiBpZiBXRVJST1JcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo1MDpcXHRzZWxlY3QgS1ZNX0dVRVNUX01FTUZEIGlmIFg4Nl82NFxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTUxLVxcbi0tXFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYz01MTM1PXZvaWQga3ZtX2FyY2hfYXN5bmNfcGFnZV9yZWFkeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fYXN5bmNfcGYgKndvcmspXFxuLS1cXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jLTUxNjUtXFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYzo1MTY2OiNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUX01FTUZEXFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYy01MTY3LXN0YXRpYyB2b2lkIGt2bV9hc3NlcnRfZ21lbV9pbnZhbGlkYXRlX2xvY2tfaGVsZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90KVxcbi0tXFxuYXJjaC94ODYva3ZtL3g4Ni5jPTEwNjM0PWJvb2wga3ZtX2FyY2hfbm9fcG9sbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuLS1cXG5hcmNoL3g4Ni9rdm0veDg2LmMtMTA2MzgtXFxuYXJjaC94ODYva3ZtL3g4Ni5jOjEwNjM5OiNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUX01FTUZEXFxuYXJjaC94ODYva3ZtL3g4Ni5jLTEwNjQwLS8qXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjQ2LjA0MDIxODMyOFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNzA0MzM0MjMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipJbnZlc3RpZ2F0aW5nIEtWTV9HVUVTVF9NRU1GRCBpbiB0aGUgS2NvbmZpZyBDb250ZXh0KipcblxuT2theSwgc28gSSdtIHRoaW5raW5nLCBiZXlvbmQgd2hhdCB3ZSd2ZSBhbHJlYWR5IGxvb2tlZCBhdCwgd2UgbmVlZCB0byBzcGVjaWZpY2FsbHkgc2VhcmNoIGZvciBgS1ZNX0dVRVNUX01FTUZEYCB3aXRoaW4gdGhlIGB2aXJ0L2t2bS9LY29uZmlnYCBmaWxlLiBHaXZlbiBteSBleHBlcnRpc2UsIEkgc3VzcGVjdCB0aGlzIGlzIHdoZXJlIHRoZSBtYWluIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHJlbGF0ZWQgdG8gZ3Vlc3QgbWVtb3J5IGZpbGUgZGVzY3JpcHRvcnMgd2lsbCBiZSBkZWZpbmVkLCBvciBhdCBsZWFzdCBoYXZlIGl0cyBkZXBlbmRlbmNpZXMgY2xlYXJseSBsYWlkIG91dC4gVGhpcyB3aWxsIHByb3ZpZGUgdmFsdWFibGUgY29udGV4dCBpbiB1bmRlcnN0YW5kaW5nIGhvdyBpdOKAmXMgZW5hYmxlZCwgYW55IHByZXJlcXVpc2l0ZXMgaXQgaGFzLCBhbmQgcGVyaGFwcyBzaGVkIGxpZ2h0IG9uIHdoZXJlIGl0cyBmdW5jdGlvbmFsaXR5IGludGVncmF0ZXMgd2l0aGluIHRoZSBicm9hZGVyIEtWTSBmcmFtZXdvcmsuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgdG8gZGV0ZXJtaW5lIGl0J3MgYmVoYXZpb3Igb3IgaG93IGl0IG1pZ2h0IG5lZWQgdG8gYmUgbW9kaWZpZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNjUwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDcuNzQ0NTU1WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MzkxMDM4OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS1ZNX0dVRVNUX01FTUZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQva3ZtXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbi0tXFxudmlydC9rdm0vS2NvbmZpZy0xMDUtXFxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjQ3LjgxODQ5MjY2OFoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODA1ODY5NzIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgS1ZNIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhlIGB2aXJ0L2t2bS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTA2LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgcGFydGljdWxhciBvcHRpb24gaXMgaGFuZGxlZC4gSSBzdXNwZWN0IHdlJ3JlIGxvb2tpbmcgYXQgYSBLY29uZmlnIHN5bWJvbCByZWxhdGVkIHRvIGEgc3BlY2lmaWMgdmlydHVhbGl6YXRpb24gZmVhdHVyZSBvciBkZXZpY2UuIERlcGVuZGluZyBvbiB0aGUgY29udGV4dCBJIG1pZ2h0IGJlIGxvb2tpbmcgZm9yIGRlcGVuZGVuY2llcywgZGVmYXVsdCB2YWx1ZXMsIG9yIHBlcmhhcHMgZXZlbiBjb21tZW50cyBjbGFyaWZ5aW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHRoaXMgb3B0aW9uLiBNeSBnb2FsIGhlcmUgaXMgdG8gZ3Jhc3AgdGhlIGNvbmZpZ3VyYWJpbGl0eSBvZiB0aGlzIHBhcnRpY3VsYXIgYXNwZWN0IG9mIHRoZSBLVk0gc2V0dXAgYW5kIGl0cyBwb3RlbnRpYWwgaW1wYWN0IG9uIHBlcmZvcm1hbmNlIG9yIGZ1bmN0aW9uYWxpdHkuIEkgd2lsbCBwYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8gZGVwZW5kZW5jaWVzIG9uIG90aGVyIGZlYXR1cmVzIG9yIGhhcmR3YXJlLCBsb29raW5nIGZvciBhbnkgZWRnZSBjYXNlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA5NjMsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDo0OS42MjQzNjYzNTlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogOTUsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgOTU6XFx0ICAgICAgIGJvb2xcXG4gIDk2OlxcdFxcbiAgOTc6XFx0Y29uZmlnIEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcXG4gIDk4OlxcdCAgICAgICBib29sXFxuICA5OTpcXHRcXG4gMTAwOlxcdGNvbmZpZyBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXFxuIDEwMTpcXHQgICAgICAgYm9vbFxcbiAxMDI6XFx0XFxuIDEwMzpcXHRjb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcXG4gMTA0OlxcdCAgICAgICBib29sXFxuIDEwNTpcXHRcXG4gMTA2OlxcdGNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcXG4gMTA3OlxcdCAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuIDEwODpcXHQgICAgICAgYm9vbFxcbiAxMDk6XFx0XFxuIDExMDpcXHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcXG4gMTExOlxcdCAgICAgICBib29sXFxuIDExMjpcXHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG4gMTEzOlxcdFxcbiAxMTQ6XFx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9SRUNMQUlNXFxuIDExNTpcXHQgICAgICAgYm9vbFxcbiAxMTY6XFx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxuIDExNzpcXHRcXG4gMTE4OlxcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fSU5WQUxJREFURVxcbiAxMTk6XFx0ICAgICAgIGJvb2xcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDkuNjI0NDg0MTQ5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE2OTQyMzI5NDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBLVk0gY29uZmlndXJhdGlvbiByZXF1aXJlbWVudC4gRmlyc3QsIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgS1ZNIG1vZHVsZXMgbmVjZXNzYXJ5LiBTaW5jZSB3ZSdyZSBkZWFsaW5nIHdpdGggeDg2IGFyY2hpdGVjdHVyZSAoc3BlY2lmaWNhbGx5IGFtZDY0KSwgdGhlIHByaW1hcnkgY2FuZGlkYXRlcyBhcmUgKipLVk0qKiwgKipLVk1fSU5URUwqKiwgb3IgKipLVk1fQU1EKiouIFRoZSBgS1ZNX0dVRVNUX01FTUZEYCBtb2R1bGUgYWxzbyBzZWVtcyByZWxldmFudCwgY29uZGl0aW9uYWxseSBzZWxlY3RlZCBieSBgS1ZNX1g4NmAgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBYODZfNjQsIHdoaWNoIGlzIGxpa2VseSBpbiB0aGlzIGNvbnRleHQuIFRvIHZlcmlmeSB0aGlzIGFuZCB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25hbCBsb2dpYyBtb3JlIHRob3JvdWdobHksIEkgc2hvdWxkIGNvbnN1bHQgdGhlIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AgZmlsZS4gVGhhdCdzIHdoZXJlIHRoZSBkZWZpbml0aXZlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyB3aWxsIHJlc2lkZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0OTMsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjUxLjMxODcyMDg2MVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDEzNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiYXJjaC94ODYva3ZtL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuICAgMjpcXHQjXFxuICAgMzpcXHQjIEtWTSBjb25maWd1cmF0aW9uXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdHNvdXJjZSBcXFwidmlydC9rdm0vS2NvbmZpZ1xcXCJcXG4gICA3OlxcdFxcbiAgIDg6XFx0bWVudWNvbmZpZyBWSVJUVUFMSVpBVElPTlxcbiAgIDk6XFx0XFx0Ym9vbCBcXFwiVmlydHVhbGl6YXRpb25cXFwiXFxuICAxMDpcXHRcXHRkZWZhdWx0IHlcXG4gIDExOlxcdFxcdGhlbHBcXG4gIDEyOlxcdFxcdCAgU2F5IFkgaGVyZSB0byBnZXQgdG8gc2VlIG9wdGlvbnMgZm9yIHVzaW5nIHlvdXIgTGludXggaG9zdCB0byBydW4gb3RoZXJcXG4gIDEzOlxcdFxcdCAgb3BlcmF0aW5nIHN5c3RlbXMgaW5zaWRlIHZpcnR1YWwgbWFjaGluZXMgKGd1ZXN0cykuXFxuICAxNDpcXHRcXHQgIFRoaXMgb3B0aW9uIGFsb25lIGRvZXMgbm90IGFkZCBhbnkga2VybmVsIGNvZGUuXFxuICAxNTpcXHRcXG4gIDE2OlxcdFxcdCAgSWYgeW91IHNheSBOLCBhbGwgb3B0aW9ucyBpbiB0aGlzIHN1Ym1lbnUgd2lsbCBiZSBza2lwcGVkIGFuZCBkaXNhYmxlZC5cXG4gIDE3OlxcdFxcbiAgMTg6XFx0aWYgVklSVFVBTElaQVRJT05cXG4gIDE5OlxcdFxcbiAgMjA6XFx0Y29uZmlnIEtWTV9YODZcXG4gIDIxOlxcdFxcdGRlZl90cmlzdGF0ZSBLVk0gaWYgKEtWTV9JTlRFTCAhPSBuIHx8IEtWTV9BTUQgIT0gbilcXG4gIDIyOlxcdFxcdHNlbGVjdCBLVk1fQ09NTU9OXFxuICAyMzpcXHRcXHRzZWxlY3QgS1ZNX0VMSURFX1RMQl9GTFVTSF9JRl9ZT1VOR1xcbiAgMjQ6XFx0XFx0c2VsZWN0IEtWTV9NTVVfTE9DS0xFU1NfQUdJTkdcXG4gIDI1OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9JUlFDSElQXFxuICAyNjpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fUEZOQ0FDSEVcXG4gIDI3OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9ESVJUWV9SSU5HX1RTT1xcbiAgMjg6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX0RJUlRZX1JJTkdfQUNRX1JFTFxcbiAgMjk6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX0lSUV9CWVBBU1NcXG4gIDMwOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9JUlFfUk9VVElOR1xcbiAgMzE6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX1JFQURPTkxZX01FTVxcbiAgMzI6XFx0XFx0c2VsZWN0IFZIT1NUX1RBU0tcXG4gIDMzOlxcdFxcdHNlbGVjdCBLVk1fQVNZTkNfUEZcXG4gIDM0OlxcdFxcdHNlbGVjdCBVU0VSX1JFVFVSTl9OT1RJRklFUlxcbiAgMzU6XFx0XFx0c2VsZWN0IEtWTV9NTUlPXFxuICAzNjpcXHRcXHRzZWxlY3QgU0NIRURfSU5GT1xcbiAgMzc6XFx0XFx0c2VsZWN0IFBFUkZfRVZFTlRTXFxuICAzODpcXHRcXHRzZWxlY3QgR1VFU1RfUEVSRl9FVkVOVFNcXG4gIDM5OlxcdFxcdHNlbGVjdCBQRVJGX0dVRVNUX01FRElBVEVEX1BNVVxcbiAgNDA6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX01TSVxcbiAgNDE6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX0NQVV9SRUxBWF9JTlRFUkNFUFRcXG4gIDQyOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9OT19QT0xMXFxuICA0MzpcXHRcXHRzZWxlY3QgVklSVF9YRkVSX1RPX0dVRVNUX1dPUktcXG4gIDQ0OlxcdFxcdHNlbGVjdCBLVk1fR0VORVJJQ19ESVJUWUxPR19SRUFEX1BST1RFQ1RcXG4gIDQ1OlxcdFxcdHNlbGVjdCBLVk1fVkZJT1xcbiAgNDY6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX1BNX05PVElGSUVSIGlmIFBNXFxuICA0NzpcXHRcXHRzZWxlY3QgS1ZNX0dFTkVSSUNfSEFSRFdBUkVfRU5BQkxJTkdcXG4gIDQ4OlxcdFxcdHNlbGVjdCBLVk1fR0VORVJJQ19QUkVfRkFVTFRfTUVNT1JZXFxuICA0OTpcXHRcXHRzZWxlY3QgS1ZNX1dFUlJPUiBpZiBXRVJST1JcXG4gIDUwOlxcdFxcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkQgaWYgWDg2XzY0XFxuICA1MTpcXHRcXG4gIDUyOlxcdGNvbmZpZyBLVk1cXG4gIDUzOlxcdFxcdHRyaXN0YXRlIFxcXCJLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIChLVk0pIHN1cHBvcnRcXFwiXFxuICA1NDpcXHRcXHRkZXBlbmRzIG9uIFg4Nl9MT0NBTF9BUElDXFxuICA1NTpcXHRcXHRoZWxwXFxuICA1NjpcXHRcXHQgIFN1cHBvcnQgaG9zdGluZyBmdWxseSB2aXJ0dWFsaXplZCBndWVzdCBtYWNoaW5lcyB1c2luZyBoYXJkd2FyZVxcbiAgNTc6XFx0XFx0ICB2aXJ0dWFsaXphdGlvbiBleHRlbnNpb25zLiAgWW91IHdpbGwgbmVlZCBhIGZhaXJseSByZWNlbnRcXG4gIDU4OlxcdFxcdCAgcHJvY2Vzc29yIGVxdWlwcGVkIHdpdGggdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9ucy4gWW91IHdpbGwgYWxzb1xcbiAgNTk6XFx0XFx0ICBuZWVkIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBvZiB0aGUgcHJvY2Vzc29yIG1vZHVsZXMgYmVsb3cuXFxuICA2MDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NTEuMzE4ODIzOTgxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU4NTA0NDI5NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBLVk0gR3Vlc3QgTWVtb3J5IEZpbGUgRGVzY3JpcHRvciBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBwYXRjaCBpcyBkb2luZy4gRnJvbSB3aGF0IEkgY2FuIHNlZSwgaXQncyBwcmltYXJpbHkgZm9jdXNlZCBvbiBgZ3Vlc3RfbWVtZmRgIGhhbmRsaW5nIHdpdGhpbiBLVk0uIFNwZWNpZmljYWxseTpcblxuMS4gICoqYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgOioqIFRoZSBwYXRjaCBtYWtlcyBrZXkgY2hhbmdlcyBpbiBga3ZtX2dtZW1fYmluZCgpYC4gSXQgaW50cm9kdWNlcyBhIGBXQVJOX09OX09OQ0VgIGNoZWNrLCByZXBsYWNlcyB0aGUgYFdSSVRFX09OQ0VgIHdpdGggYSBkaXJlY3QgYXNzaWdubWVudCwgY2FwdHVyZXMgYW5kIGVycm9yIGNoZWNrcyB0aGUgcmV0dXJuIGZyb20gYHhhX3N0b3JlX3JhbmdlKClgLCBhbmQgaW1wb3J0YW50bHksIGltcGxlbWVudHMgYSByb2xsYmFjayBtZWNoYW5pc20gdGhhdCBjbGVhcnMgYGdtZW0uZmlsZWAsIGBnbWVtLnBnb2ZmYCwgYW5kIHJlbW92ZXMgdGhlIGBLVk1fTUVNU0xPVF9HTUVNX09OTFlgIGZsYWcgb24gZXJyb3IuIFRoaXMgZXJyb3IgaGFuZGxpbmcgaXMgY3J1Y2lhbCBmb3IgYW55IGZ1enplcjsgd2UgbmVlZCB0byBleGFtaW5lIGhvdyB0aGUgc3lzdGVtIHJlYWN0cyB0byBmYWlsdXJlcy5cblxuMi4gICoqYHZpcnQva3ZtL2t2bV9tYWluLmNgOioqIFRoZSBzaWduYXR1cmUgb2YgYGt2bV9zZXRfbWVtc2xvdCgpYCBpcyBtb2RpZmllZCB0byB0YWtlIGBnbWVtX2ZkYCBhbmQgYGdtZW1fb2Zmc2V0YCwgaW5kaWNhdGluZyBjaGFuZ2VzIHRvIGhvdyBtZW1zbG90cyBhcmUgYmVpbmcgbWFuYWdlZC4gVGhlIGBrdm1fZ21lbV9iaW5kKClgIGZ1bmN0aW9uIGlzIG5vdyBjYWxsZWQgKndpdGhpbiogYGt2bV9zZXRfbWVtc2xvdCgpYCwgc3BlY2lmaWNhbGx5IGFmdGVyIGBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKClgIGFuZCB3aGlsZSBob2xkaW5nIGBrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrYC4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGNvbnRyb2wgZmxvdyBjaGFuZ2UuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGFub3RoZXIgYFdBUk5fT05fT05DRWAgYXNzZXJ0aW9uLiBBbHNvLCBlcnJvciBoYW5kbGluZyBhbmQgYW4gdW53aW5kIHBhdGggYXJlIGFkZGVkIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGlmIGBrdm1fZ21lbV9iaW5kKClgIGZhaWxzLiBGaW5hbGx5LCB0aGUgY2FsbHMgdG8gYGt2bV9nbWVtX2JpbmQoKWAgYW5kIGBrdm1fZ21lbV91bmJpbmQoKWAgYXJlIHJlbW92ZWQgZnJvbSBga3ZtX3NldF9tZW1vcnlfcmVnaW9uKClgLlxuXG5Ob3csIGlzIHRoaXMgc29tZXRoaW5nIHdlIHNob3VsZCBjb25zaWRlciBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBLVk0gaXMgYSBwcmltZSB0YXJnZXQgZm9yIGZ1enppbmcgYXMgaXQncyBhIGNyaXRpY2FsIHZpcnR1YWxpemF0aW9uIGNvbXBvbmVudCBleHBvc2VkIHZpYSBgL2Rldi9rdm1gIGlvY3RscyBsaWtlIGBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjJgIGFuZCBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAuIFRoZXNlIG1vZGlmaWNhdGlvbnMgdG8gbWVtb3J5IHNsb3QgY3JlYXRpb24gYW5kIGJpbmRpbmcgbG9naWMsIHRoZSBhZGRlZCBhc3NlcnRpb25zLCBhbmQgdGhlIG5ldyBlcnJvciB1bndpbmRpbmcsIHByZXNlbnQgbWFueSBvcHBvcnR1bml0aWVzIGZvciBkaXNjb3ZlcmluZyB2dWxuZXJhYmlsaXRpZXMsIG9yIGF0IGxlYXN0IGVuc3VyaW5nIHRoZSBlcnJvciBwYXRocyBhcmUgZXhlcmNpc2VkLiBUaGUgbW92ZW1lbnQgb2YgYGt2bV9nbWVtX2JpbmQoKWAgYW5kIHRoZSBgc2xvdHNfYXJjaF9sb2NrYCBhcmUgcG90ZW50aWFsIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgdGhhdCB3ZSBuZWVkIHRvIHRhcmdldC5cblxuVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdCBhcmU6XG5cbiogICBga3ZtX2dtZW1fYmluZGBcbiogICBga3ZtX3NldF9tZW1zbG90YFxuKiAgIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gXG5cblJlZ2FyZGluZyBjb25maWd1cmF0aW9ucywgd2Ugc2hvdWxkIGJlIHVzaW5nIGBLVk1gIGFuZCBgS1ZNX0dVRVNUX01FTUZEYCwgYnV0IGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlcyBpbiBgdmlydC9rdm0vYCBhbmQgYGFyY2gveDg2L2t2bS9gIHRvIGVuc3VyZSB3ZSBjb3ZlciB0aGUgbmVjZXNzYXJ5IGRlcGVuZGVuY2llcy4gV2UgZG9uJ3Qgd2FudCB0byBleGNsdWRlIGNvbmZpZ3VyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjYzNiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkxOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjU3LjE2OTI2OTc0NFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjQ1OTg3MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZ3Vlc3RfbWVtZmRcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwidmlydC9rdm1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwidmlydC9rdm0vTWFrZWZpbGUua3ZtPTE0PWt2bS0kKENPTkZJR19IQVZFX0tWTV9QRk5DQUNIRSkgKz0gJChLVk0pL3BmbmNhY2hlLm9cXG52aXJ0L2t2bS9NYWtlZmlsZS5rdm06MTU6a3ZtLSQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkgKz0gJChLVk0pL2d1ZXN0X21lbWZkLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NTcuMjMzODgxMDgzWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI4MTA5OTQ2MDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgS1ZNIFN5bWJvbCBBbmFseXNpcyoqXG5cbk9rYXksIHNvIEknbSBmb2N1c2luZyBvbiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBgS1ZNX0dVRVNUX01FTUZEYCBhbmQgb3RoZXIgS1ZNIGNvbXBvbmVudHMuIFJpZ2h0LCBpdCBsb29rcyBsaWtlIGBLVk1fR1VFU1RfTUVNRkRgIGlzIGltcGxpY2l0bHkgZW5hYmxlZCB3aGVuIGBLVk1fWDg2YCBpcyBzZWxlY3RlZCwgc3BlY2lmaWNhbGx5IHdoZW4gcnVubmluZyBvbiBhbiBgWDg2XzY0YCBhcmNoaXRlY3R1cmUuIEFuZCBzaW5jZSBgS1ZNYCwgYEtWTV9JTlRFTGAsIGFuZCBgS1ZNX0FNRGAgYWxsIGVuYWJsZSBgS1ZNX1g4NmAsIHRoYXQgbWVhbnMgdGhlc2Uga2VybmVsIG1vZHVsZXMg4oCTIGBLVk1gLCBgS1ZNX0lOVEVMYCwgYEtWTV9BTURgLCBhbmQgYEtWTV9HVUVTVF9NRU1GRGAg4oCTIGFyZSBhbGwgcG90ZW50aWFsbHkgcmVsZXZhbnQgdG8gdGhpcyBpbnZlc3RpZ2F0aW9uLiBXZSdyZSBsb29raW5nIGF0IGEgcHJldHR5IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaGVyZS5cblxuTGV0J3MgcXVpY2tseSB2ZXJpZnkgbXkgdW5kZXJzdGFuZGluZyBieSBjaGVja2luZyBhbGwgdGhlIHJlY2VudGx5IG1vZGlmaWVkIHN5bWJvbHMgcmVsYXRlZCB0byBndWVzdCBtZW1mZDogYGt2bV9nbWVtX2JpbmRgIHdpdGhpbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AsIGFuZCBib3RoIGBrdm1fc2V0X21lbXNsb3RgIGFuZCBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCB3aXRoaW4gYHZpcnQva3ZtL2t2bV9tYWluLmNgLlxuXG5Hb29kLCBub3cgYXJlIHRoZXNlIGdlbmVyaWMgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zPyBObywgdGhlc2UgYXJlIEtWTSBzcGVjaWZpYyBmdW5jdGlvbnMsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIG1lbXNsb3Qgc2V0dXAgYW5kIGd1ZXN0X21lbWZkIG9wZXJhdGlvbi5cblxuT2theSwgbGV0J3MgZ28gd2l0aCB0aGlzIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MzMwLCJPdXRwdXRUb2tlbnMiOjE4MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNTowMC4wNDQ4Nzk1NDdaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTkyMDE1MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiS1ZNX0lOVEVMXCIsXG4gICAgXCJLVk1fQU1EXCIsXG4gICAgXCJLVk1fR1VFU1RfTUVNRkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9iaW5kXCIsXG4gICAgXCJrdm1fc2V0X21lbXNsb3RcIixcbiAgICBcImt2bV9zZXRfbWVtb3J5X3JlZ2lvblwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1zbG90IG1hbmFnZW1lbnQgYW5kIGd1ZXN0X21lbWZkIGJpbmRpbmcgbG9naWMsIG1vdmluZyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpIHVuZGVyIHNsb3RzX2FyY2hfbG9jaywgYWRkaW5nIGVycm9yIGhhbmRsaW5nIGFuZCByb2xsYmFjayBmb3IgeGFfc3RvcmVfcmFuZ2UoKSwgYW5kIGludHJvZHVjaW5nIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucyBhbmQgZXJyb3IgcGF0aHMuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEtWTSBtZW1vcnkgcmVnaW9uIGlvY3RscyBhbmQgd2FycmFudHMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLVk1cIixcbiAgICBcIktWTV9JTlRFTFwiLFxuICAgIFwiS1ZNX0FNRFwiLFxuICAgIFwiS1ZNX0dVRVNUX01FTUZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia3ZtX2dtZW1fYmluZFwiLFxuICAgIFwia3ZtX3NldF9tZW1zbG90XCIsXG4gICAgXCJrdm1fc2V0X21lbW9yeV9yZWdpb25cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBLVk0gbWVtc2xvdCBtYW5hZ2VtZW50IGFuZCBndWVzdF9tZW1mZCBiaW5kaW5nIGxvZ2ljLCBtb3Zpbmcga3ZtX2dtZW1fYmluZCgpIGluc2lkZSBrdm1fc2V0X21lbXNsb3QoKSB1bmRlciBzbG90c19hcmNoX2xvY2ssIGFkZGluZyBlcnJvciBoYW5kbGluZyBhbmQgcm9sbGJhY2sgZm9yIHhhX3N0b3JlX3JhbmdlKCksIGFuZCBpbnRyb2R1Y2luZyBuZXcgV0FSTl9PTl9PTkNFIGFzc2VydGlvbnMgYW5kIGVycm9yIHBhdGhzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBLVk0gbWVtb3J5IHJlZ2lvbiBpb2N0bHMgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjAwLjIwNDExNzc1NFoiLCJTZXEiOjIxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI0MTU5OTcwOTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNTowMC4yMDYxNzMzMjRaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMjQxMzkzNjMxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZmJmOTU5MTZkNmIxOWRjMTc2YjNiMGU5MDRlMmYxNWVjNDVlZGZjMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMDk6MTQ6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuaW5kZXggYjU5NjQ4NmQxODRjYS4uNmM4ZGY2NzM4MmZjZSAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbkBAIC02MTIsMTAgKzYxMiwxNCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gXHRpbnQgciA9IC1FSU5WQUw7XG4rXHR2b2lkICp4YXI7XG4gXG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gXG4rXHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuIFx0ZmlsZSA9IGZnZXQoZmQpO1xuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuQEAgLTY0OSwxMiArNjUzLDIwIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XG4gXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cbiBcdCAqL1xuLVx0V1JJVEVfT05DRShzbG90LVx1MDAzZWdtZW0uZmlsZSwgZmlsZSk7XG4rXHRzbG90LVx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XG4gXHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcbiBcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcbiBcdFx0c2xvdC1cdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4gXG4tXHR4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4rXHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4rXG4rXHRyID0geGFfaXNfZXJyKHhhcikgPyB4YV9lcnIoeGFyKSA6IDA7XG4rXHRpZiAocikge1xuK1x0XHR4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgTlVMTCwgR0ZQX0tFUk5FTCk7XG4rXHRcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gTlVMTDtcbitcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gMDtcbitcdFx0c2xvdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4rXHR9XG4gXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gXG4gXHQvKlxuQEAgLTY2Miw3ICs2NzQsNiBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxuIFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXG4gXHQgKi9cbi1cdHIgPSAwO1xuIGVycjpcbiBcdGZwdXQoZmlsZSk7XG4gXHRyZXR1cm4gcjtcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uY1xuaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2t2bV9tYWluLmNcbisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbkBAIC0xODg3LDcgKzE4ODcsOCBAQCBzdGF0aWMgdm9pZCBrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXG4gXHRcdFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbmV3LFxuLVx0XHRcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpXG4rXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbitcdFx0XHQgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KVxuIHtcbiBcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDtcbiBcdGludCByO1xuQEAgLTE5MzEsMjAgKzE5MzIsMTYgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0fVxuIFxuIFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbi1cdGlmIChyKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vXG4tXHRcdCAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZFxuLVx0XHQgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc29cbi1cdFx0ICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4tXHRcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4tXHRcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4tXHRcdH1cbi1cdFx0cmV0dXJuIHI7XG4rXHRpZiAocilcbitcdFx0Z290byBlcnI7XG4rXG4rXHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbitcdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4rXHRcdFx0Z290byBlcnJfYmluZDtcbitcbitcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbitcdFx0aWYgKHIpXG4rXHRcdFx0Z290byBlcnJfYmluZDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMTk3Nyw2ICsxOTc0LDI3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdGt2bV9jb21taXRfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuIFxuIFx0cmV0dXJuIDA7XG4rXG4rZXJyX2JpbmQ6XG4rXHRpZiAobmV3KSB7XG4rXHRcdGt2bV9hcmNoX2ZyZWVfbWVtc2xvdChrdm0sIG5ldyk7XG4rXG4rXHRcdGlmIChuZXctXHUwMDNlZGlydHlfYml0bWFwIFx1MDAyNlx1MDAyNiAoIW9sZCB8fCAhb2xkLVx1MDAzZWRpcnR5X2JpdG1hcCkpXG4rXHRcdFx0a3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7XG4rXHR9XG4rZXJyOlxuK1x0LypcbitcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcbitcdCAqIHJlcXVpcmVkIHNpbmNlIHRoZSBvcmlnaW5hbCBzbG90IHdhcyBwcmVzZXJ2ZWQgaW4gdGhlIGluYWN0aXZlIHNsb3RzLlxuK1x0ICogQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLlxuK1x0ICovXG4rXHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4rXHRcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpO1xuK1x0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuK1x0fSBlbHNlIHtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmt2bS1cdTAwM2VzbG90c19hcmNoX2xvY2spO1xuK1x0fVxuK1x0cmV0dXJuIHI7XG4gfVxuIFxuIHN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcbkBAIC0yMDU4LDcgKzIwNzYsNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4gXHRcdGlmIChXQVJOX09OX09OQ0Uoa3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMgXHUwMDNjIG9sZC1cdTAwM2VucGFnZXMpKVxuIFx0XHRcdHJldHVybiAtRUlPO1xuIFxuLVx0XHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTtcbitcdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xuIFx0fVxuIFxuIFx0YmFzZV9nZm4gPSAobWVtLVx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjEwNSwyMSArMjEyMywxNCBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4gXHRuZXctXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xuIFx0bmV3LVx1MDAzZWZsYWdzID0gbWVtLVx1MDAzZWZsYWdzO1xuIFx0bmV3LVx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyO1xuLVx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xuLVx0XHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbi1cdFx0aWYgKHIpXG4tXHRcdFx0Z290byBvdXQ7XG4tXHR9XG4gXG4tXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4rXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSxcbitcdFx0XHQgICAgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbiBcdGlmIChyKVxuLVx0XHRnb3RvIG91dF91bmJpbmQ7XG4rXHRcdGdvdG8gb3V0O1xuIFxuIFx0cmV0dXJuIDA7XG4gXG4tb3V0X3VuYmluZDpcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG4tXHRcdGt2bV9nbWVtX3VuYmluZChuZXcpO1xuIG91dDpcbiBcdGtmcmVlKG5ldyk7XG4gXHRyZXR1cm4gcjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjAwLjIwNjE4MjM4NFoiLCJTZXEiOjIzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTcwNDk2MDIwNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLVk0gUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggYW5kIGFzc2VzcyB0aGUgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZSwgc3BlY2lmaWNhbGx5IHdhcnJhbnRpbmcgYSBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjaGFuZ2VzIHRvIGRldGVybWluZSBpZiB0aGV5IGludHJvZHVjZSBhbnkgbmV3IHJpc2tzIGluIHRoYXQgYXJlYS5cblxuRmlyc3QsIHRoZSBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgZmlsZS4gSW4gYGt2bV9nbWVtX2JpbmRgLCB0aGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIHNlZSBpZiBgc2xvdC1cdTAwM2VmbGFnc2AgaGFzIHRoZSBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBmbGFnLCB3aGljaCBsb29rcyBsaWtlIGEgZGVmZW5zaXZlIG1lYXN1cmUuIEl0IGFsc28gY2hhbmdlcyBhIGBXUklURV9PTkNFYCB0byBhIGRpcmVjdCBhc3NpZ25tZW50IHRvIGBzbG90LVx1MDAzZWdtZW0uZmlsZWAuIFRoYXQncyBub3QgaW5oZXJlbnRseSBzdXNwaWNpb3VzLCBidXQgaXQgd2FycmFudHMgYSBjbG9zZXIgbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZS4gTW9zdCBub3RhYmx5LCB0aGUgZXJyb3IgaGFuZGxpbmcgYXJvdW5kIGB4YV9zdG9yZV9yYW5nZWAgaXMgaW50ZXJlc3RpbmcuIElmIGB4YV9zdG9yZV9yYW5nZWAgZmFpbHMsIGl0IG5vdyBleHBsaWNpdGx5IGNsZWFycyB0aGUgYGdtZW0uZmlsZWAsIGBnbWVtLnBnb2ZmYCwgYW5kIHRoZSBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBmbGFnIG9uIGBzbG90YC4gVGhpcyBzZWVtcyBsaWtlIGEgZ29vZCBwcmFjdGljZSB0byBwcmV2ZW50IGxpbmdlcmluZyBzdGFsZSBkYXRhLlxuXG5OZXh0LCBJJ2xsIG1vdmUgb24gdG8gYHZpcnQva3ZtL2t2bV9tYWluLmNgLiBIZXJlLCB0aGUgcGF0Y2ggcmUtYXJyYW5nZXMgdGhlIGV4ZWN1dGlvbiwgbW92aW5nIGBrdm1fZ21lbV9iaW5kYCBpbnRvIGBrdm1fc2V0X21lbXNsb3RgLiAgSXQgYWxzbyBwYXNzZXMgYGdtZW1fZmRgIGFuZCBgZ21lbV9vZmZzZXRgIHRvIGBrdm1fc2V0X21lbXNsb3RgLCB3aGljaCBnaXZlcyBjb250ZXh0IHRvIHRoZSBiaW5kaW5nIHByb2Nlc3MuIENydWNpYWxseSwgdGhlIHBhdGNoIGFkZHMgZXJyb3IgaGFuZGxpbmcgYWZ0ZXIgdGhlIGNhbGwgdG8gYGt2bV9nbWVtX2JpbmRgIHdpdGhpbiBga3ZtX3NldF9tZW1zbG90YCwgd2hpY2ggaW5jbHVkZXMgY2xlYW51cCB1c2luZyBga3ZtX2FyY2hfZnJlZV9tZW1zbG90YCBhbmQgcG90ZW50aWFsbHkgYGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcGAsIGlmIG5lZWRlZC4gU2ltcGxpZnlpbmcgdGhlIGVycm9yIHBhdGggaW4gYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgYnkgZGVmZXJyaW5nIGBrdm1fZ21lbV91bmJpbmRgIHNvdW5kcyBsaWtlIGEgZ29vZCBvcHRpbWl6YXRpb24sIGFzc3VtaW5nIHRoaXMgZG9lc24ndCBjcmVhdGUgbmV3IHN1YnRsZSBpc3N1ZXMuXG5cbk5vdywgbXkgdGhvdWdodHMgdHVybiB0byB0aGUgb3ZlcmFsbCBjb250ZXh0LiBJIG5lZWQgdG8gdHJhY2UgdGhlIHVzYWdlIG9mIGBrdm1fZ21lbV9iaW5kYCBhbmQgYGt2bV9zZXRfbWVtc2xvdGAuIEkgaGF2ZSB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMgYW5kIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyB3aXRoaW4gdGhlIEtWTSBzeXN0ZW0uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCBzdGF0ZSBpc24ndCBnZXR0aW5nIHdyaXR0ZW4gaW50byB0aGUgbWVtc2xvdCBwcmlvciB0byBpbml0aWFsaXphdGlvbi4gSWYgdGhlcmUgYXJlIG5vIGNsZWFyIHdyaXRlIG9wZXJhdGlvbnMgYmVmb3JlIGEgY29uZGl0aW9uYWwgcmVhZCwgSSdkIHdhbnQgdG8gYmUgc3VyZSB0byB0ZXN0IGl0IHdpdGggZnV6emluZy5cblxuT3ZlcmFsbCwgdGhpcyBwYXRjaCBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSByZWZhY3RvciB3aXRoIGFkZGVkIGVycm9yIGhhbmRsaW5nLiBJdCdzIG5vdCBpbW1lZGlhdGVseSBzY3JlYW1pbmcgXCJ1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXR5XCIgYXQgbWUuIFRoZSBleHBsaWNpdCBjbGVhcmluZyBvZiBmaWVsZHMgaW4gdGhlIGVycm9yIHBhdGggc2VlbXMgbGlrZSBhIHBvc2l0aXZlIHN0ZXAuIEhvd2V2ZXIsIHRoZSBtb3ZlIG9mIGBrdm1fZ21lbV9iaW5kYCBhbmQgdGhlIGFsdGVyZWQgZXJyb3IgaGFuZGxpbmcgYXJlIHdoYXQgSSBuZWVkIHRvIHByb2JlIGZ1cnRoZXIgdG8gYmUgY2VydGFpbi4gSSdsbCBuZWVkIHRvIGRvIGEgdGhvcm91Z2ggY29kZSB3YWxrIHRvIGJlIGFic29sdXRlbHkgc3VyZSwgYnV0IEknbSBsZWFuaW5nIHRvd2FyZCBuZWVkaW5nIEtNU0FOIGZ1enppbmcgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBsYXRlbnQgYnVncy4gSSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHRlc3QgaGFybmVzcyB3aXRoIHNjZW5hcmlvcyB0aGF0IGNvdWxkIGxlYWQgdG8gdGhlc2UgZXJyb3IgY29uZGl0aW9ucyB0byBsb29rIGludG8gaXQgZGVlcGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDExLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTQ0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTU6MTEuOTExMTQ2ODUxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDUzNjk5NzYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia3ZtX2dtZW1fYmluZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJ2aXJ0L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jPTU5Mj1pbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYwNS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jOjYwNjppbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy02MDctXFx0XFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1Mi1cXHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYzo2NTM6XFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1NC1cXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9MTA9aW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKTtcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oOjExOmludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEyLVxcdFxcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KTtcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9MTk9c3RhdGljIGlubGluZSB2b2lkIGt2bV9nbWVtX2V4aXQodm9pZCkge307XFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDoyMDpzdGF0aWMgaW5saW5lIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSxcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTIxLVxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz0xODg3PXN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0MS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE5NDI6XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE5NDMtXFx0XFx0aWYgKHIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjEyLjExNjUyMjk5OFoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODkzODgwMDM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgS1ZNIGhhbmRsZXMgZ3Vlc3QgbWVtb3J5LCBwYXJ0aWN1bGFybHkgYXJvdW5kIHRob3NlIGBtZW1mZGAgaW50ZXJhY3Rpb25zLiBSaWdodCwgbGV0J3MgemVybyBpbiBvbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AuIFNwZWNpZmljYWxseSwgSSdtIGdvaW5nIHRvIGJlIGZvY3VzaW5nIG9uIHRoZSBga3ZtX2dtZW1fYmluZGAgYW5kIGBrdm1fZ21lbV91bmJpbmRgIGZ1bmN0aW9ucy4gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgdGhlIGd1ZXN0IG1lbW9yeSBpcyBib3VuZCBhbmQgdW5ib3VuZCB0byB0aGUgaG9zdCdzIG1lbW9yeSBtb2RlbCB1c2luZyBgbWVtZmRgIHNpbmNlIHRoaXMgaXMgYSBjcml0aWNhbCBhc3BlY3Qgb2YgZWZmaWNpZW50IGFuZCBzZWN1cmUgbWVtb3J5IG1hbmFnZW1lbnQuIFdoYXQgYXJlIHRoZSBrZXkgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIG1hbmlwdWxhdGVkIGhlcmU/IFdoYXQncyB0aGUgY29udHJvbCBmbG93PyBJJ20gaG9waW5nIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiBob3cgdGhpcyBtZWNoYW5pc20gYWxsb3dzIGZvciBzaGFyZWQgbWVtb3J5LCBtZW1vcnkgbWlncmF0aW9uLCBhbmQgcHJvdGVjdGlvbiBpbiB0aGUgS1ZNIGVudmlyb25tZW50LiBUaW1lIHRvIGRpZyBpbiBhbmQgcmVtaW5kIG15c2VsZiBvZiB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6NTg3OCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjE0LjAxMDQwNjE3N1oiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjczNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwidmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2MDAsXG4gIFwiTGluZUNvdW50XCI6IDg1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2MDA6XFx0XFx0aWYgKHNpemUgXFx1MDAzYz0gMCB8fCAhUEFHRV9BTElHTkVEKHNpemUpKVxcbiA2MDE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYwMjpcXHRcXG4gNjAzOlxcdFxcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzKTtcXG4gNjA0OlxcdH1cXG4gNjA1OlxcdFxcbiA2MDY6XFx0aW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiA2MDc6XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXFxuIDYwODpcXHR7XFxuIDYwOTpcXHRcXHR1b2ZmX3Qgc2l6ZSA9IHNsb3QtXFx1MDAzZW5wYWdlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbiA2MTA6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCwgZW5kO1xcbiA2MTE6XFx0XFx0c3RydWN0IGdtZW1fZmlsZSAqZjtcXG4gNjEyOlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIDYxMzpcXHRcXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcXG4gNjE0OlxcdFxcdGludCByID0gLUVJTlZBTDtcXG4gNjE1OlxcdFxcdHZvaWQgKnhhcjtcXG4gNjE2OlxcdFxcbiA2MTc6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpO1xcbiA2MTg6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihnZm5fdCkgIT0gc2l6ZW9mKHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYpKTtcXG4gNjE5OlxcdFxcbiA2MjA6XFx0XFx0aWYgKFdBUk5fT05fT05DRShzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXFxuIDYyMTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjIyOlxcdFxcbiA2MjM6XFx0XFx0ZmlsZSA9IGZnZXQoZmQpO1xcbiA2MjQ6XFx0XFx0aWYgKCFmaWxlKVxcbiA2MjU6XFx0XFx0XFx0cmV0dXJuIC1FQkFERjtcXG4gNjI2OlxcdFxcbiA2Mjc6XFx0XFx0aWYgKGZpbGUtXFx1MDAzZWZfb3AgIT0gXFx1MDAyNmt2bV9nbWVtX2ZvcHMpXFxuIDYyODpcXHRcXHRcXHRnb3RvIGVycjtcXG4gNjI5OlxcdFxcbiA2MzA6XFx0XFx0ZiA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gNjMxOlxcdFxcdGlmIChmLVxcdTAwM2Vrdm0gIT0ga3ZtKVxcbiA2MzI6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYzMzpcXHRcXG4gNjM0OlxcdFxcdGlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4gNjM1OlxcdFxcbiA2MzY6XFx0XFx0aWYgKCFQQUdFX0FMSUdORUQob2Zmc2V0KSB8fCBvZmZzZXQgKyBzaXplIFxcdTAwM2UgaV9zaXplX3JlYWQoaW5vZGUpKVxcbiA2Mzc6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYzODpcXHRcXG4gNjM5OlxcdFxcdGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NDA6XFx0XFxuIDY0MTpcXHRcXHRzdGFydCA9IG9mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiA2NDI6XFx0XFx0ZW5kID0gc3RhcnQgKyBzbG90LVxcdTAwM2VucGFnZXM7XFxuIDY0MzpcXHRcXG4gNjQ0OlxcdFxcdGlmICgheGFfZW1wdHkoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzKSBcXHUwMDI2XFx1MDAyNlxcbiA2NDU6XFx0XFx0ICAgIHhhX2ZpbmQoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBcXHUwMDI2c3RhcnQsIGVuZCAtIDEsIFhBX1BSRVNFTlQpKSB7XFxuIDY0NjpcXHRcXHRcXHRyID0gLUVFWElTVDtcXG4gNjQ3OlxcdFxcdFxcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuIDY0ODpcXHRcXHRcXHRnb3RvIGVycjtcXG4gNjQ5OlxcdFxcdH1cXG4gNjUwOlxcdFxcbiA2NTE6XFx0XFx0LypcXG4gNjUyOlxcdFxcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cXG4gNjUzOlxcdFxcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XFxuIDY1NDpcXHRcXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4gNjU1OlxcdFxcdCAqL1xcbiA2NTY6XFx0XFx0c2xvdC1cXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcXG4gNjU3OlxcdFxcdHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcXG4gNjU4OlxcdFxcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcXG4gNjU5OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcXG4gNjYwOlxcdFxcbiA2NjE6XFx0XFx0eGFyID0geGFfc3RvcmVfcmFuZ2UoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XFxuIDY2MjpcXHRcXG4gNjYzOlxcdFxcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4gNjY0OlxcdFxcdGlmIChyKSB7XFxuIDY2NTpcXHRcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4gNjY2OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuIDY2NzpcXHRcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gMDtcXG4gNjY4OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY2OTpcXHRcXHR9XFxuIDY3MDpcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NzE6XFx0XFxuIDY3MjpcXHRcXHQvKlxcbiA2NzM6XFx0XFx0ICogRHJvcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBmaWxlLCBldmVuIG9uIHN1Y2Nlc3MuICBUaGUgZmlsZSBwaW5zIEtWTSxcXG4gNjc0OlxcdFxcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICdyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXFxuIDY3NTpcXHRcXHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cXG4gNjc2OlxcdFxcdCAqL1xcbiA2Nzc6XFx0ZXJyOlxcbiA2Nzg6XFx0XFx0ZnB1dChmaWxlKTtcXG4gNjc5OlxcdFxcdHJldHVybiByO1xcbiA2ODA6XFx0fVxcbiA2ODE6XFx0XFxuIDY4MjpcXHRzdGF0aWMgdm9pZCBfX2t2bV9nbWVtX3VuYmluZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBzdHJ1Y3QgZ21lbV9maWxlICpmKVxcbiA2ODM6XFx0e1xcbiA2ODQ6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCA9IHNsb3QtXFx1MDAzZWdtZW0ucGdvZmY7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjE0LjAxMDUzNjQ0N1oiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjA4Njc4MDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6XG5cbioqRGlnZ2luZyBpbnRvIE1lbW9yeSBNYW5hZ2VtZW50IGluIEtWTSoqXG5cbk9rYXksIHNvIHdlIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgbWVtb3J5IHJlZ2lvbnMgYXJlIGhhbmRsZWQgd2l0aGluIEtWTS4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIG9uIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGZ1bmN0aW9ucy4gVGhlc2UgYXJlIGxpa2VseSB0aGUgY29yZSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgYW5kIGNvbmZpZ3VyaW5nIHRoZSBndWVzdCdzIHBoeXNpY2FsIG1lbW9yeSB3aXRoaW4gdGhlIGhvc3QuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtZW1zbG90cyBhbmQgbWVtb3J5IHJlZ2lvbnMuIFdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGhlcmU/IFdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGFyZSBpbiBwbGFjZSB0byBlbnN1cmUgY29uc2lzdGVuY3kgZHVyaW5nIHRoZXNlIG9wZXJhdGlvbnM/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZiwgZXNwZWNpYWxseSByZWdhcmRpbmcgY29uY3VycmVudCBhY2Nlc3MgZnJvbSBkaWZmZXJlbnQgdkNQVXM/IEkgc2hvdWxkIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gaG93IG1lbW9yeSBpcyBhY3R1YWxseSBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIGJ5IEtWTSBmb3IgdGhlIGd1ZXN0LiBJIGJldCB0aGVyZSdzIHNvbWUgaW50ZXJlc3RpbmcgaW50ZXJwbGF5IHdpdGggdGhlIGhvc3QncyBwYWdlIHRhYmxlcyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdCBoZXJlLiBUaW1lIHRvIGRpdmUgaW4gYW5kIHNlZSB3aGF0J3Mgd2hhdCFcblxuXG4iLCJJbnB1dFRva2VucyI6NzQ5NSwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTU6MTYuMjE5MjE3NThaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI5OTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkyMCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkyMDpcXHRcXHQgKlxcbjE5MjE6XFx0XFx0ICogTW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBvbiBhIHRlbXBvcmFyeSwgdW5yZWFjaGFibGUgc2xvdC4gIFRoZSBvbGRcXG4xOTIyOlxcdFxcdCAqIHNsb3QgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGluIGNhc2UgYSBsYXRlciBzdGVwIGZhaWxzIGFuZCB0aGVcXG4xOTIzOlxcdFxcdCAqIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSByZXZlcnRlZC5cXG4xOTI0OlxcdFxcdCAqL1xcbjE5MjU6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5MjY6XFx0XFx0XFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4xOTI3OlxcdFxcdFxcdGlmICghaW52YWxpZF9zbG90KSB7XFxuMTkyODpcXHRcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmt2bS1cXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcXG4xOTI5OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjE5MzA6XFx0XFx0XFx0fVxcbjE5MzE6XFx0XFx0XFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTMyOlxcdFxcdH1cXG4xOTMzOlxcdFxcbjE5MzQ6XFx0XFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTM1OlxcdFxcdGlmIChyKVxcbjE5MzY6XFx0XFx0XFx0Z290byBlcnI7XFxuMTkzNzpcXHRcXG4xOTM4OlxcdFxcdGlmIChuZXcgXFx1MDAyNlxcdTAwMjYgbmV3LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcXG4xOTM5OlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxcbjE5NDA6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQxOlxcdFxcbjE5NDI6XFx0XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG4xOTQzOlxcdFxcdFxcdGlmIChyKVxcbjE5NDQ6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQ1OlxcdFxcdH1cXG4xOTQ2OlxcdFxcbjE5NDc6XFx0XFx0LypcXG4xOTQ4OlxcdFxcdCAqIEZvciBERUxFVEUgYW5kIE1PVkUsIHRoZSB3b3JraW5nIHNsb3QgaXMgbm93IGFjdGl2ZSBhcyB0aGUgSU5WQUxJRFxcbjE5NDk6XFx0XFx0ICogdmVyc2lvbiBvZiB0aGUgb2xkIHNsb3QuICBNT1ZFIGlzIHBhcnRpY3VsYXJseSBzcGVjaWFsIGFzIGl0IHJldXNlc1xcbjE5NTA6XFx0XFx0ICogdGhlIG9sZCBzbG90IGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGUgb2xkIHNsb3QgKGluIHdvcmtpbmdfc2xvdCkuXFxuMTk1MTpcXHRcXHQgKiBGb3IgQ1JFQVRFLCB0aGVyZSBpcyBubyBvbGQgc2xvdC4gIEZvciBERUxFVEUgYW5kIEZMQUdTX09OTFksIHRoZVxcbjE5NTI6XFx0XFx0ICogb2xkIHNsb3QgaXMgZGV0YWNoZWQgYnV0IG90aGVyd2lzZSBwcmVzZXJ2ZWQuXFxuMTk1MzpcXHRcXHQgKi9cXG4xOTU0OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSlcXG4xOTU1OlxcdFxcdFxcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XFxuMTk1NjpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcXG4xOTU3OlxcdFxcdFxcdGt2bV9kZWxldGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTU4OlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcXG4xOTU5OlxcdFxcdFxcdGt2bV9tb3ZlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgaW52YWxpZF9zbG90KTtcXG4xOTYwOlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfRkxBR1NfT05MWSlcXG4xOTYxOlxcdFxcdFxcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcXG4xOTYyOlxcdFxcdGVsc2VcXG4xOTYzOlxcdFxcdFxcdEJVRygpO1xcbjE5NjQ6XFx0XFxuMTk2NTpcXHRcXHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cXG4xOTY2OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXFxuMTk2NzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5Njg6XFx0XFxuMTk2OTpcXHRcXHQvKlxcbjE5NzA6XFx0XFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cXHUwMDNlYXJjaCwgY2hhbmdlcyBhZnRlciBkcm9wcGluZyBzbG90c19hcmNoX2xvY2tcXG4xOTcxOlxcdFxcdCAqIHdpbGwgZGlyZWN0bHkgaGl0IHRoZSBmaW5hbCwgYWN0aXZlIG1lbXNsb3QuICBBcmNoaXRlY3R1cmVzIGFyZVxcbjE5NzI6XFx0XFx0ICogcmVzcG9uc2libGUgZm9yIGtub3dpbmcgdGhhdCBuZXctXFx1MDAzZWFyY2ggbWF5IGJlIHN0YWxlLlxcbjE5NzM6XFx0XFx0ICovXFxuMTk3NDpcXHRcXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTc1OlxcdFxcbjE5NzY6XFx0XFx0cmV0dXJuIDA7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdGVycl9iaW5kOlxcbjE5Nzk6XFx0XFx0aWYgKG5ldykge1xcbjE5ODA6XFx0XFx0XFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcXG4xOTgxOlxcdFxcbjE5ODI6XFx0XFx0XFx0aWYgKG5ldy1cXHUwMDNlZGlydHlfYml0bWFwIFxcdTAwMjZcXHUwMDI2ICghb2xkIHx8ICFvbGQtXFx1MDAzZWRpcnR5X2JpdG1hcCkpXFxuMTk4MzpcXHRcXHRcXHRcXHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcXG4xOTg0OlxcdFxcdH1cXG4xOTg1OlxcdGVycjpcXG4xOTg2OlxcdFxcdC8qXFxuMTk4NzpcXHRcXHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXFxuMTk4ODpcXHRcXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cXG4xOTg5OlxcdFxcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4xOTkwOlxcdFxcdCAqL1xcbjE5OTE6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5OTI6XFx0XFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuMTk5MzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5OTQ6XFx0XFx0fSBlbHNlIHtcXG4xOTk1OlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbjE5OTY6XFx0XFx0fVxcbjE5OTc6XFx0XFx0cmV0dXJuIHI7XFxuMTk5ODpcXHR9XFxuMTk5OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTU6MTYuMjE5NDQ5MVoiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2NDAwNjE1NzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzIGFuZCBLTVNBTiBFdmFsdWF0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoLiBNeSBpbml0aWFsIGltcHJlc3Npb24gaXMgdGhhdCBpdCdzIGZvY3VzZWQgb24gaW1wcm92aW5nIHRoZSByb2J1c3RuZXNzIG9mIHRoZSBLVk0gZ3Vlc3RfbWVtZmQgbWVtb3J5IHNsb3Qgc2V0dXAuIEkgc2VlIHRoYXQgaXQncyBwcmltYXJpbHkgcmVmYWN0b3JpbmcgdGhlIGVycm9yIGhhbmRsaW5nIHdpdGhpbiBga3ZtX2dtZW1fYmluZGAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYnJvYWRlciBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCBwcm9jZXNzLiBTcGVjaWZpY2FsbHksIEknbSBub3RpbmcgdGhlIGNoYW5nZXMgaW4gdGhlIGBrdm1fZ21lbV9iaW5kYCBmdW5jdGlvbjogZXJyb3IgaGFuZGxpbmcgYWRkZWQgZm9yIGB4YV9zdG9yZV9yYW5nZWAsIHRoZSBhZGRpdGlvbiBvZiBhIGBXQVJOX09OX09OQ0VgIGNoZWNrLCBhbmQgdGhlIHJlbW92YWwgb2YgYSBgV1JJVEVfT05DRWAuIFRoZSByZW9yZGVyaW5nIG9mIHRoZSBmdW5jdGlvbiBjYWxscyBpcyBhbHNvIHNpZ25pZmljYW50LCBlc3BlY2lhbGx5IHRoZSBzaGlmdCBvZiBga3ZtX2dtZW1fYmluZGAgdG8gYmUgaW5zaWRlIGBrdm1fc2V0X21lbXNsb3RgLiBJbXBvcnRhbnRseSwgdGhpcyBtZWFucyB0aGUgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIHVwIGluIGFuIGltcHJvdmVkIG1hbm5lci5cblxuTm93LCBsZXQncyB0aGluayBhYm91dCBLTVNBTidzIHJvbGUgaGVyZS4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgYWx3YXlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXJzcGFjZS4gSSd2ZSBzY2FubmVkIHRoZSBjaGFuZ2VzIGFuZCBJIGRvbid0IHNlZSBhbnl0aGluZyB0aGF0IHNjcmVhbXMgXCJLTVNBTiByaXNrLlwiIEknbSBsb29raW5nIGZvciBkaXJlY3QgaW50ZXJhY3Rpb25zIHdpdGggdXNlcnNwYWNlIHZpYSBgY29weV90b191c2VyYCBvciBhbnkgY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kZW50IG9uIHVuaW5pdGlhbGl6ZWQgZGF0YS4gU3BlY2lmaWNhbGx5LCBJJ20gY2hlY2tpbmcgZm9yIG5ldyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbmV3IGFsbG9jYXRpb25zLCBvciByZWFkcyB0aGF0IGNvdWxkIGxlYWQgdG8gbWVtb3J5IGNvcnJ1cHRpb24gb3IgaW5mbyBsZWFrcy4gSXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggaXMgY29ycmVjdGluZyBmYWlsdXJlIGhhbmRsaW5nLiBUaGUgcGF0Y2ggc2VlbXMgdG8gYmUgY29ycmVjdGx5IHVzaW5nIHRoZSByZXR1cm4gdmFsdWVzIGZyb20gdGhlIHhhcnJheSBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIGJlaGF2aW9yLCBzbyBubyBjb25jZXJucyB0aGVyZS5cblxuVGhlIGNoYW5nZXMgYXJlIGNlbnRlcmVkIGFyb3VuZCBpbXByb3ZlZCBlcnJvciBoYW5kbGluZyBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgY2xlYW51cCBvbiBlcnJvcnMuIFRoaXMgaXNuJ3Qgd2hlcmUgS01TQU4gdHJhZGl0aW9uYWxseSBzaGluZXMuIFdlIGFyZSBoYW5kbGluZyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uLiBTbywgSSBkb24ndCB0aGluayB0aGlzIGlzIGEgS01TQU4gaXNzdWUuIEtBU0FOIGFuZCB0aGUgdXN1YWwgbWVtb3J5IGRlYnVnZ2luZyB0b29scyBhcmUgbGlrZWx5IHN1ZmZpY2llbnQgZm9yIHRob3NlIGNvbmNlcm5zLCBzdWNoIGFzIGRvdWJsZSBmcmVlcyBvciBVQUYuIFRoZSBwYXRjaCBpdHNlbGYgZG9lc24ndCBpbnRyb2R1Y2UgYW55IG5ldyBzdHJ1Y3R1cmVzLCBjaGFuZ2VzIGluIGRhdGEgbGVuZ3RocywgYnVmZmVyIG92ZXJmbG93cywgb3Igc2hpZnRzIG9mIG9mZnNldHMgdG8gaW50cm9kdWNlIHZ1bG5lcmFiaWxpdGllcy5cblxuTGV0J3MgbWFrZSBzdXJlIEknbSBjcnlzdGFsIGNsZWFyIGluIG15IHJhdGlvbmFsZS4gS01TQU4gdGFyZ2V0cyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3NlcyBhbmQga2VybmVsLXRvLXVzZXIgbGVha3MuIFRoaXMgcGF0Y2ggcHJpbWFyaWx5IG1vZGlmaWVzIHRoZSBlcnJvciBoYW5kbGluZywgZm9jdXNpbmcgb24gdGhlIGNvcnJlY3Qgc2VxdWVuY2UgYW5kIGZhaWx1cmUgaGFuZGxpbmcgb2YgdGhlIGBrdm1fZ21lbV9iaW5kYCBwcm9jZXNzLiBTaW5jZSB0aGlzIGRvZXNuJ3QgZGlyZWN0bHkgaW50cm9kdWNlIGFueSBuZXcgdW5pbml0aWFsaXplZCBkYXRhLCBkb2Vzbid0IGNvcHkgc3RydWN0dXJlcyB0byB1c2Vyc3BhY2UsIGFuZCBmaXhlcyBleGlzdGluZyBlcnJvciBwYXRod2F5cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzbid0IHdhcnJhbnRlZC4gSSBjYW4gY29uZmlybSB0aGF0IE5lZWRzS01TQU4gc2hvdWxkIGJlIGZhbHNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MDczLCJPdXRwdXRUb2tlbnMiOjEzNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY3OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjIyLjYyMDA2NzgwNVoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM4NDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflow6fq8d[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-05 09:11:50 +0000 UTC FinishedAt: 2026-09-05 09:15:24 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "76671054f9a1ff6abb976583cd8da37650acdc97", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "KVM_INTEL", "KVM_AMD", "KVM_GUEST_MEMFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "76671054f9a1ff6abb976583cd8da37650acdc97", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "KVM_INTEL", "KVM_AMD", "KVM_GUEST_MEMFD" ], "series_id": "d3db87e0-2050-4b46-a2eb-96736648f72a" }, "track": "KASAN", "fuzz": { "focus": [ "kvm" ], "focus_symbols": [ "kvm_gmem_bind", "kvm_set_memslot", "kvm_set_memory_region" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtLVk1fSU5URUwmIzM0OywKICAgICYjMzQ7S1ZNX0FNRCYjMzQ7LAogICAgJiMzNDtLVk1fR1VFU1RfTUVNRkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9iaW5kJiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICAgJiMzNDtrdm1fc2V0X21lbW9yeV9yZWdpb24mIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgb3JkZXJpbmcgYW5kIGVycm9yIGhhbmRsaW5nIG9mIGBrdm1fZ21lbV9iaW5kKClgIGR1cmluZyBLVk0gbWVtc2xvdCBjcmVhdGlvbiBhbmQgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgYHhhX3N0b3JlX3JhbmdlKClgLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBzdHJ1Y3R1cmUgZmllbGRzIHRvdWNoZWQgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZC4gQW55IHJlc291cmNlIGxpZmVjeWNsZSBlcnJvcnMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWUgaW4gZXJyb3IgdW53aW5kIHBhdGhzKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gVGhlcmVmb3JlLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbXNsb3QgbWFuYWdlbWVudCBhbmQgZ3Vlc3RfbWVtZmQgYmluZGluZyBsb2dpYywgbW92aW5nIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCkgdW5kZXIgc2xvdHNfYXJjaF9sb2NrLCBhZGRpbmcgZXJyb3IgaGFuZGxpbmcgYW5kIHJvbGxiYWNrIGZvciB4YV9zdG9yZV9yYW5nZSgpLCBhbmQgaW50cm9kdWNpbmcgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zIGFuZCBlcnJvciBwYXRocy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgS1ZNIG1lbW9yeSByZWdpb24gaW9jdGxzIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZmJmOTU5MTZkNmIxOWRjMTc2YjNiMGU5MDRlMmYxNWVjNDVlZGZjMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMDk6MTQ6MzAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbmluZGV4IGI1OTY0ODZkMTg0Y2EuLjZjOGRmNjczODJmY2UgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5AQCAtNjEyLDEwICYjNDM7NjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiBcdGludCByID0gLUVJTlZBTDtcbiYjNDM7XHR2b2lkICp4YXI7XG4gXG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShzbG90LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuIFx0ZmlsZSA9IGZnZXQoZmQpO1xuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuQEAgLTY0OSwxMiAmIzQzOzY1MywyMCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxuIFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4gXHQgKi9cbi1cdFdSSVRFX09OQ0Uoc2xvdC1cdTAwM2VnbWVtLmZpbGUsIGZpbGUpO1xuJiM0MztcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiBcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiBcbi1cdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiYjNDM7XHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4mIzQzO1xuJiM0MztcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiYjNDM7XHRpZiAocikge1xuJiM0MztcdFx0eGFfc3RvcmVfcmFuZ2UoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIE5VTEwsIEdGUF9LRVJORUwpO1xuJiM0MztcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuJiM0MztcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gMDtcbiYjNDM7XHRcdHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZO1xuJiM0MztcdH1cbiBcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiBcbiBcdC8qXG5AQCAtNjYyLDcgJiM0Mzs2NzQsNiBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGVcbiBcdCAqIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBtZW1zbG90cyBhcmUgZGVzdHJveWVkLlxuIFx0ICovXG4tXHRyID0gMDtcbiBlcnI6XG4gXHRmcHV0KGZpbGUpO1xuIFx0cmV0dXJuIHI7XG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbmluZGV4IDY1ZWIyNmEwNTIwZDguLjIxYzEwY2JiYWM2NjEgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXG5AQCAtMTg4Nyw3ICYjNDM7MTg4Nyw4IEBAIHN0YXRpYyB2b2lkIGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXG4tXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSlcbiYjNDM7XHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbiYjNDM7XHRcdFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcbiB7XG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICppbnZhbGlkX3Nsb3Q7XG4gXHRpbnQgcjtcbkBAIC0xOTMxLDIwICYjNDM7MTkzMiwxNiBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHR9XG4gXG4gXHRyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuLVx0aWYgKHIpIHtcbi1cdFx0Lypcbi1cdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm9cbi1cdFx0ICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkXG4tXHRcdCAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzb1xuLVx0XHQgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbi1cdFx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbi1cdFx0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbi1cdFx0fVxuLVx0XHRyZXR1cm4gcjtcbiYjNDM7XHRpZiAocilcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbiYjNDM7XHRcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxuJiM0MztcdFx0XHRnb3RvIGVycl9iaW5kO1xuJiM0MztcbiYjNDM7XHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XG4mIzQzO1x0XHRpZiAocilcbiYjNDM7XHRcdFx0Z290byBlcnJfYmluZDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbiBcbiBcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7ZXJyX2JpbmQ6XG4mIzQzO1x0aWYgKG5ldykge1xuJiM0MztcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobmV3LVx1MDAzZWRpcnR5X2JpdG1hcCBcdTAwMjZcdTAwMjYgKCFvbGQgfHwgIW9sZC1cdTAwM2VkaXJ0eV9iaXRtYXApKVxuJiM0MztcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbiYjNDM7XHR9XG4mIzQzO2VycjpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcbiYjNDM7XHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cbiYjNDM7XHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuJiM0MztcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4mIzQzO1x0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiByO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXG5AQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0aWYgKFdBUk5fT05fT05DRShrdm0tXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcdTAwM2Mgb2xkLVx1MDAzZW5wYWdlcykpXG4gXHRcdFx0cmV0dXJuIC1FSU87XG4gXG4tXHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUpO1xuJiM0MztcdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xuIFx0fVxuIFxuIFx0YmFzZV9nZm4gPSAobWVtLVx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjEwNSwyMSAmIzQzOzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuIFx0bmV3LVx1MDAzZW5wYWdlcyA9IG5wYWdlcztcbiBcdG5ldy1cdTAwM2VmbGFncyA9IG1lbS1cdTAwM2VmbGFncztcbiBcdG5ldy1cdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cdTAwM2V1c2Vyc3BhY2VfYWRkcjtcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbi1cdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4tXHRcdGlmIChyKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0fVxuIFxuLVx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuJiM0MztcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxuJiM0MztcdFx0XHQgICAgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbiBcdGlmIChyKVxuLVx0XHRnb3RvIG91dF91bmJpbmQ7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcbiBcdHJldHVybiAwO1xuIFxuLW91dF91bmJpbmQ6XG4tXHRpZiAobWVtLVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKVxuLVx0XHRrdm1fZ21lbV91bmJpbmQobmV3KTtcbiBvdXQ6XG4gXHRrZnJlZShuZXcpO1xuIFx0cmV0dXJuIHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O0tWTV9JTlRFTCYjMzQ7LAogICAgJiMzNDtLVk1fQU1EJiMzNDssCiAgICAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2JpbmQmIzM0OywKICAgICYjMzQ7a3ZtX3NldF9tZW1zbG90JiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtb3J5X3JlZ2lvbiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBLVk0gbWVtc2xvdCBtYW5hZ2VtZW50IGFuZCBndWVzdF9tZW1mZCBiaW5kaW5nIGxvZ2ljLCBtb3Zpbmcga3ZtX2dtZW1fYmluZCgpIGluc2lkZSBrdm1fc2V0X21lbXNsb3QoKSB1bmRlciBzbG90c19hcmNoX2xvY2ssIGFkZGluZyBlcnJvciBoYW5kbGluZyBhbmQgcm9sbGJhY2sgZm9yIHhhX3N0b3JlX3JhbmdlKCksIGFuZCBpbnRyb2R1Y2luZyBuZXcgV0FSTl9PTl9PTkNFIGFzc2VydGlvbnMgYW5kIGVycm9yIHBhdGhzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBLVk0gbWVtb3J5IHJlZ2lvbiBpb2N0bHMgYW5kIHdhcnJhbnRzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmYmY5NTkxNmQ2YjE5ZGMxNzZiM2IwZTkwNGUyZjE1ZWM0NWVkZmMwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgNSAwOToxNDozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCmluZGV4IGI1OTY0ODZkMTg0Y2EuLjZjOGRmNjczODJmY2UgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwpAQCAtNjEyLDEwICYjNDM7NjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCByID0gLUVJTlZBTDsKJiM0MzsJdm9pZCAqeGFyOwogCiAJQlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpOwogCUJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LSZndDtnbWVtLnBnb2ZmKSk7CiAKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzbG90LSZndDtmbGFncyAmYW1wOyBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKQEAgLTY0OSwxMiAmIzQzOzY1MywyMCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsCiAJICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3QKIAkgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS4KIAkgKi8KLQlXUklURV9PTkNFKHNsb3QtJmd0O2dtZW0uZmlsZSwgZmlsZSk7CiYjNDM7CXNsb3QtJmd0O2dtZW0uZmlsZSA9IGZpbGU7CiAJc2xvdC0mZ3Q7Z21lbS5wZ29mZiA9IHN0YXJ0OwogCWlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSkKIAkJc2xvdC0mZ3Q7ZmxhZ3MgfD0gS1ZNX01FTVNMT1RfR01FTV9PTkxZOwogCi0JeGFfc3RvcmVfcmFuZ2UoJmFtcDtmLSZndDtiaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpOwomIzQzOwl4YXIgPSB4YV9zdG9yZV9yYW5nZSgmYW1wO2YtJmd0O2JpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7CiYjNDM7CiYjNDM7CXIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDsKJiM0MzsJaWYgKHIpIHsKJiM0MzsJCXhhX3N0b3JlX3JhbmdlKCZhbXA7Zi0mZ3Q7YmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTsKJiM0MzsJCXNsb3QtJmd0O2dtZW0uZmlsZSA9IE5VTEw7CiYjNDM7CQlzbG90LSZndDtnbWVtLnBnb2ZmID0gMDsKJiM0MzsJCXNsb3QtJmd0O2ZsYWdzICZhbXA7PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZOwomIzQzOwl9CiAJZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKIAogCS8qCkBAIC02NjIsNyAmIzQzOzY3NCw2IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAkgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGUKIAkgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC4KIAkgKi8KLQlyID0gMDsKIGVycjoKIAlmcHV0KGZpbGUpOwogCXJldHVybiByOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC0xODg3LDcgJiM0MzsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldywKLQkJCSAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpCiYjNDM7CQkJICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSwKJiM0MzsJCQkgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KQogewogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDsKIAlpbnQgcjsKQEAgLTE5MzEsMjAgJiM0MzsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAl9CiAKIAlyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwotCWlmIChyKSB7Ci0JCS8qCi0JCSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vCi0JCSAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZAotCQkgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28KLQkJICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suCi0JCSAqLwotCQlpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7Ci0JCQlrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTsKLQkJCWtmcmVlKGludmFsaWRfc2xvdCk7Ci0JCX0gZWxzZSB7Ci0JCQltdXRleF91bmxvY2soJmFtcDtrdm0tJmd0O3Nsb3RzX2FyY2hfbG9jayk7Ci0JCX0KLQkJcmV0dXJuIHI7CiYjNDM7CWlmIChyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CWlmIChuZXcgJmFtcDsmYW1wOyBuZXctJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKQomIzQzOwkJCWdvdG8gZXJyX2JpbmQ7CiYjNDM7CiYjNDM7CQlyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpOwomIzQzOwkJaWYgKHIpCiYjNDM7CQkJZ290byBlcnJfYmluZDsKIAl9CiAKIAkvKgpAQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sCiAJa3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7CiAKIAlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJfYmluZDoKJiM0MzsJaWYgKG5ldykgewomIzQzOwkJa3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTsKJiM0MzsKJiM0MzsJCWlmIChuZXctJmd0O2RpcnR5X2JpdG1hcCAmYW1wOyZhbXA7ICghb2xkIHx8ICFvbGQtJmd0O2RpcnR5X2JpdG1hcCkpCiYjNDM7CQkJa3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7CiYjNDM7CX0KJiM0MztlcnI6CiYjNDM7CS8qCiYjNDM7CSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnMKJiM0MzsJICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuCiYjNDM7CSAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay4KJiM0MzsJICovCiYjNDM7CWlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHsKJiM0MzsJCWt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpOwomIzQzOwkJa2ZyZWUoaW52YWxpZF9zbG90KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO2t2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLApAQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAkJaWYgKFdBUk5fT05fT05DRShrdm0tJmd0O25yX21lbXNsb3RfcGFnZXMgJmx0OyBvbGQtJmd0O25wYWdlcykpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTsKJiM0MzsJCXJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTsKIAl9CiAKIAliYXNlX2dmbiA9IChtZW0tJmd0O2d1ZXN0X3BoeXNfYWRkciAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKQEAgLTIxMDUsMjEgJiM0MzsyMTIzLDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAluZXctJmd0O25wYWdlcyA9IG5wYWdlczsKIAluZXctJmd0O2ZsYWdzID0gbWVtLSZndDtmbGFnczsKIAluZXctJmd0O3VzZXJzcGFjZV9hZGRyID0gbWVtLSZndDt1c2Vyc3BhY2VfYWRkcjsKLQlpZiAobWVtLSZndDtmbGFncyAmYW1wOyBLVk1fTUVNX0dVRVNUX01FTUZEKSB7Ci0JCXIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBtZW0tJmd0O2d1ZXN0X21lbWZkLCBtZW0tJmd0O2d1ZXN0X21lbWZkX29mZnNldCk7Ci0JCWlmIChyKQotCQkJZ290byBvdXQ7Ci0JfQogCi0JciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwomIzQzOwlyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSwKJiM0MzsJCQkgICAgbWVtLSZndDtndWVzdF9tZW1mZCwgbWVtLSZndDtndWVzdF9tZW1mZF9vZmZzZXQpOwogCWlmIChyKQotCQlnb3RvIG91dF91bmJpbmQ7CiYjNDM7CQlnb3RvIG91dDsKIAogCXJldHVybiAwOwogCi1vdXRfdW5iaW5kOgotCWlmIChtZW0tJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpCi0JCWt2bV9nbWVtX3VuYmluZChuZXcpOwogb3V0OgogCWtmcmVlKG5ldyk7CiAJcmV0dXJuIHI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3OTkKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA5NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpcyAmYW1wOyBGdXp6aW5nIFN0cmF0ZWd5KioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7SXMgdGhpcyBmdXp6LXdvcnRoeT8mIzM0OyBJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgdGhlIHBvdGVudGlhbCBpbXBhY3QgYW5kIGlkZW50aWZ5IHRoZSBtb3N0IHByb21pc2luZyBhcmVhcyBmb3IgZnV6emluZy4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBhbnkgc2lnbnMgb2YgbWVtb3J5IHNhZmV0eSB2dWxuZXJhYmlsaXRpZXMgb3IgbG9naWMgZmxhd3MgdGhhdCBjb3VsZCBiZSBleHBsb2l0ZWQuCgpGaXJzdCwgSSBzZWUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIGdvb2QsIHRoYXQmIzM5O3Mgd2hhdCBJJiMzOTttIGNvbWZvcnRhYmxlIHdpdGguIE5vdywgdGhlIGZpbGVzIG1vZGlmaWVkIGp1bXAgb3V0IGF0IG1lOiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYW5kIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gSW50ZXJlc3RpbmcuIEtlcm5lbCBWaXJ0dWFsIE1hY2hpbmUgKEtWTSkgY29kZSDigJMgZGVmaW5pdGVseSB3b3J0aCBhIGNsb3NlciBsb29rLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGJlZW4gY2hhbmdlZCBpbiB0aGVzZSBmaWxlcyBhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIFRpbWUgdG8gcHVsbCB1cCBteSB0cnVzdHkgdG9vbHMgYW5kIGdldCBhIGRldGFpbGVkIGxvb2sgYXQgdGhlIHBhdGNoIGNvbnRlbnRzLiBJJiMzOTtsbCBiZSBzY3J1dGluaXppbmcgdGhvc2UgY29kZSBzbmlwcGV0cyB0byBtYXAgb3V0IHRoZSBhdHRhY2sgc3VyZmFjZSBhbmQgdGhpbmsgc3RyYXRlZ2ljYWxseS4gSSYjMzk7bGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByaWdodCBmb2N1cyBzeW1ib2xzIGFuZCBjb25maWdzIHRvIG1heGltaXplIG91ciBmdXp6aW5nIGVmZm9ydHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7S1ZNX01FTV9HVUVTVF9NRU1GRCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NjA2PWludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1MS1cdC8qXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jOjY1MjpcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjUzLVx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3Rcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTkzNj1zdGF0aWMgdm9pZCBrdm1fZnJlZV9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdClcbnZpcnQva3ZtL2t2bV9tYWluLmMtOTM3LXtcbnZpcnQva3ZtL2t2bV9tYWluLmM6OTM4Olx0aWYgKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTkzOS1cdFx0a3ZtX2dtZW1fdW5iaW5kKHNsb3QpO1xuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9MTU3ND1zdGF0aWMgaW50IGNoZWNrX21lbW9yeV9yZWdpb25fZmxhZ3Moc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU3OS1cdGlmIChJU19FTkFCTEVEKENPTkZJR19LVk1fR1VFU1RfTUVNRkQpKVxudmlydC9rdm0va3ZtX21haW4uYzoxNTgwOlx0XHR2YWxpZF9mbGFncyB8PSBLVk1fTUVNX0dVRVNUX01FTUZEO1xudmlydC9rdm0va3ZtX21haW4uYy0xNTgxLVxudmlydC9rdm0va3ZtX21haW4uYy0xNTgyLVx0LyogRGlydHkgbG9nZ2luZyBwcml2YXRlIG1lbW9yeSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gKi9cbnZpcnQva3ZtL2t2bV9tYWluLmM6MTU4MzpcdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE1ODQtXHRcdHZhbGlkX2ZsYWdzIFx1MDAyNj0gfktWTV9NRU1fTE9HX0RJUlRZX1BBR0VTO1xuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU5MS1cdGlmIChrdm1fYXJjaF9oYXNfcmVhZG9ubHlfbWVtKGt2bSkgXHUwMDI2XHUwMDI2XG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE1OTI6XHQgICAgIShtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpKVxudmlydC9rdm0va3ZtX21haW4uYy0xNTkzLVx0XHR2YWxpZF9mbGFncyB8PSBLVk1fTUVNX1JFQURPTkxZO1xuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9MTY5Nz1zdGF0aWMgdm9pZCBrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTczMy1cdFx0ICovXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE3MzQ6XHRcdFdBUk5fT05fT05DRShvbGQtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpO1xudmlydC9rdm0va3ZtX21haW4uYy0xNzM1LVx0XHRmYWxsdGhyb3VnaDtcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE3NDktXHRcdCAqL1xudmlydC9rdm0va3ZtX21haW4uYzoxNzUwOlx0XHRpZiAoV0FSTl9PTl9PTkNFKG9sZC1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkpXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE3NTEtXHRcdFx0a3ZtX2dtZW1fdW5iaW5kKG9sZCk7XG4tLVxudmlydC9rdm0va3ZtX21haW4uYz0xODg3PXN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE5MzctXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE5Mzg6XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTkzOS1cdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4tLVxudmlydC9rdm0va3ZtX21haW4uYz0yMDEzPXN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwNDQtXHRcdHJldHVybiAtRUlOVkFMO1xudmlydC9rdm0va3ZtX21haW4uYzoyMDQ1Olx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCBcdTAwMjZcdTAwMjZcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA0Ni1cdCAgICAobWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCBcdTAwMjYgKFBBR0VfU0laRSAtIDEpIHx8XG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0yMDk1LVx0XHQvKiBQcml2YXRlIG1lbXNsb3RzIGFyZSBpbW11dGFibGUsIHRoZXkgY2FuIG9ubHkgYmUgZGVsZXRlZC4gKi9cbnZpcnQva3ZtL2t2bV9tYWluLmM6MjA5NjpcdFx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRClcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA5Ny1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwOTktXHRcdCAgICAobnBhZ2VzICE9IG9sZC1cdTAwM2VucGFnZXMpIHx8XG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIxMDA6XHRcdCAgICAoKG1lbS1cdTAwM2VmbGFncyBeIG9sZC1cdTAwM2VmbGFncykgXHUwMDI2IChLVk1fTUVNX1JFQURPTkxZIHwgS1ZNX01FTV9HVUVTVF9NRU1GRCkpKVxudmlydC9rdm0va3ZtX21haW4uYy0yMTAxLVx0XHRcdHJldHVybiAtRUlOVkFMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY0NjIKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIGludG8gdGhlIEtWTSBDb2RlKioKCk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGNoYW5nZXMgcmVsYXRlZCB0byB0aGVzZSBtZW1mZCB1cGRhdGVzIHdpdGhpbiB0aGUgS1ZNIHN1YnN5c3RlbS4gVGhlIHBhdGNoIG1lbnRpb25zIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhbmQgYHZpcnQva3ZtL2t2bV9tYWluLmNgIGFyb3VuZCB0aGUgbW9kaWZpZWQgbGluZXMuIFJpZ2h0LCB0aGF0IG1ha2VzIHNlbnNlLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBndWVzdCBtZW1vcnkgYW5kIG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIGludGVyYWN0IHdpdGhpbiBLVk0sIGFuZCBob3cgdGhlIGNvcmUgS1ZNIGxvZ2ljIGhhbmRsZXMgdGhpcy4gVGltZSB0byBkaWcgaW4gYW5kIGNyb3NzLXJlZmVyZW5jZSB0aGUgcmVsZXZhbnQgY29kZSBibG9ja3MuIExldCYjMzk7cyBzZWUgaG93IHRoZXNlIHBhcnRpY3VsYXIgZmlsZXMgaW5mbHVlbmNlIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZSBoZXJlLiBUaGlzIHdpbGwgYmUgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBmdWxsIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYwNTpcdFxuIDYwNjpcdGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiA2MDc6XHRcdFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXG4gNjA4Olx0e1xuIDYwOTpcdFx0dW9mZl90IHNpemUgPSBzbG90LVx1MDAzZW5wYWdlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiA2MTA6XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDtcbiA2MTE6XHRcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XG4gNjEyOlx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIDYxMzpcdFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gNjE0Olx0XHRpbnQgciA9IC1FSU5WQUw7XG4gNjE1Olx0XHR2b2lkICp4YXI7XG4gNjE2Olx0XG4gNjE3Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gNjE4Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gNjE5Olx0XG4gNjIwOlx0XHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXG4gNjIxOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYyMjpcdFxuIDYyMzpcdFx0ZmlsZSA9IGZnZXQoZmQpO1xuIDYyNDpcdFx0aWYgKCFmaWxlKVxuIDYyNTpcdFx0XHRyZXR1cm4gLUVCQURGO1xuIDYyNjpcdFxuIDYyNzpcdFx0aWYgKGZpbGUtXHUwMDNlZl9vcCAhPSBcdTAwMjZrdm1fZ21lbV9mb3BzKVxuIDYyODpcdFx0XHRnb3RvIGVycjtcbiA2Mjk6XHRcbiA2MzA6XHRcdGYgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiA2MzE6XHRcdGlmIChmLVx1MDAzZWt2bSAhPSBrdm0pXG4gNjMyOlx0XHRcdGdvdG8gZXJyO1xuIDYzMzpcdFxuIDYzNDpcdFx0aW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xuIDYzNTpcdFxuIDYzNjpcdFx0aWYgKCFQQUdFX0FMSUdORUQob2Zmc2V0KSB8fCBvZmZzZXQgJiM0Mzsgc2l6ZSBcdTAwM2UgaV9zaXplX3JlYWQoaW5vZGUpKVxuIDYzNzpcdFx0XHRnb3RvIGVycjtcbiA2Mzg6XHRcbiA2Mzk6XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gNjQwOlx0XG4gNjQxOlx0XHRzdGFydCA9IG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiA2NDI6XHRcdGVuZCA9IHN0YXJ0ICYjNDM7IHNsb3QtXHUwMDNlbnBhZ2VzO1xuIDY0MzpcdFxuIDY0NDpcdFx0aWYgKCF4YV9lbXB0eShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzKSBcdTAwMjZcdTAwMjZcbiA2NDU6XHRcdCAgICB4YV9maW5kKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIFx1MDAyNnN0YXJ0LCBlbmQgLSAxLCBYQV9QUkVTRU5UKSkge1xuIDY0NjpcdFx0XHRyID0gLUVFWElTVDtcbiA2NDc6XHRcdFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDY0ODpcdFx0XHRnb3RvIGVycjtcbiA2NDk6XHRcdH1cbiA2NTA6XHRcbiA2NTE6XHRcdC8qXG4gNjUyOlx0XHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXG4gNjUzOlx0XHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxuIDY1NDpcdFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4gNjU1Olx0XHQgKi9cbiA2NTY6XHRcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiA2NTc6XHRcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIDY1ODpcdFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIDY1OTpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2NjA6XHRcbiA2NjE6XHRcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiA2NjI6XHRcbiA2NjM6XHRcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiA2NjQ6XHRcdGlmIChyKSB7XG4gNjY1Olx0XHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbiA2NjY6XHRcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuIDY2NzpcdFx0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuIDY2ODpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2Njk6XHRcdH1cbiA2NzA6XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiA2NzE6XHRcbiA2NzI6XHRcdC8qXG4gNjczOlx0XHQgKiBEcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhlIGZpbGUsIGV2ZW4gb24gc3VjY2Vzcy4gIFRoZSBmaWxlIHBpbnMgS1ZNLFxuIDY3NDpcdFx0ICogbm90IHRoZSBvdGhlciB3YXkgJiMzOTtyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXG4gNjc1Olx0XHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cbiA2NzY6XHRcdCAqL1xuIDY3NzpcdGVycjpcbiA2Nzg6XHRcdGZwdXQoZmlsZSk7XG4gNjc5Olx0XHRyZXR1cm4gcjtcbiA2ODA6XHR9XG4gNjgxOlx0XG4gNjgyOlx0c3RhdGljIHZvaWQgX19rdm1fZ21lbV91bmJpbmQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwgc3RydWN0IGdtZW1fZmlsZSAqZilcbiA2ODM6XHR7XG4gNjg0Olx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gc2xvdC1cdTAwM2VnbWVtLnBnb2ZmO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc5NjIKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAzOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDoKCioqRGlnZ2luZyBpbnRvIE1lbW9yeSBNYW5hZ2VtZW50IGluIEtWTSoqCgpPa2F5LCBzbyB3ZSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IG1lbW9yeSByZWdpb25zIGFyZSBiZWluZyBzZXQgdXAgYW5kIG1hbmFnZWQgd2l0aGluIEtWTS4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gemVybyBpbiBvbiBgdmlydC9rdm0va3ZtX21haW4uY2AgYmVjYXVzZSB0aGF0JiMzOTtzIHVzdWFsbHkgdGhlIGhlYXJ0IG9mIHRoZSBjb3JlIEtWTSBsb2dpYy4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGludGVyYWN0aW9ucyBhcm91bmQgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLiBUaGVzZSBmdW5jdGlvbnMgYXJlIGdvaW5nIHRvIGJlIGNyaXRpY2FsIGZvciB0cmFja2luZyBob3cgbWVtb3J5IGlzIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQgcG90ZW50aWFsbHkgcmVtYXBwZWQgd2l0aGluIHRoZSBndWVzdCYjMzk7cyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyB0aGUgaG9zdCBtYXBzIHRoZSBndWVzdCYjMzk7cyBwaHlzaWNhbCBtZW1vcnksIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgaHlwZXJ2aXNvciYjMzk7cyB2aWV3IGFuZCB0aGUgaGFyZHdhcmUuIExldCYjMzk7cyBzZWUgaG93IHRoZXNlIGFyZSBjYWxsZWQsIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIHRoZXkgbWFuaXB1bGF0ZSwgYW5kIHdoYXQgaW1wbGljYXRpb25zIHRob3NlIG1hbmlwdWxhdGlvbnMgaGF2ZSBvbiB0aGUgb3ZlcmFsbCBtZW1vcnkgb3JnYW5pemF0aW9uLiBIb3BlZnVsbHksIGxvb2tpbmcgYXQgdGhlc2UgZnVuY3Rpb25zIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgaXMgaGFuZGxlZCBhdCB0aGUgS1ZNIGxldmVsLCBlc3BlY2lhbGx5IHdoZW4gY29uc2lkZXJpbmcgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgaG90cGx1Z2dpbmcgc2NlbmFyaW9zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0va3ZtX21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4ODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE4ODA6XHRcdCAqIGFuIGludGVybWVkaWF0ZSBzdGVwLiBJbnN0ZWFkLCB0aGUgb2xkIG1lbXNsb3QgaXMgc2ltcGx5IHJlcGxhY2VkXG4xODgxOlx0XHQgKiB3aXRoIGEgbmV3LCB1cGRhdGVkIGNvcHkgaW4gYm90aCBtZW1zbG90IHNldHMuXG4xODgyOlx0XHQgKi9cbjE4ODM6XHRcdGt2bV9yZXBsYWNlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldyk7XG4xODg0Olx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcbjE4ODU6XHR9XG4xODg2Olx0XG4xODg3Olx0c3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuMTg4ODpcdFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCxcbjE4ODk6XHRcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXG4xODkwOlx0XHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbjE4OTE6XHRcdFx0XHQgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KVxuMTg5MjpcdHtcbjE4OTM6XHRcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDtcbjE4OTQ6XHRcdGludCByO1xuMTg5NTpcdFxuMTg5NjpcdFx0LypcbjE4OTc6XHRcdCAqIFJlbGVhc2VkIGluIGt2bV9zd2FwX2FjdGl2ZV9tZW1zbG90cygpLlxuMTg5ODpcdFx0ICpcbjE4OTk6XHRcdCAqIE11c3QgYmUgaGVsZCBmcm9tIGJlZm9yZSB0aGUgY3VycmVudCBtZW1zbG90cyBhcmUgY29waWVkIHVudGlsIGFmdGVyXG4xOTAwOlx0XHQgKiB0aGUgbmV3IG1lbXNsb3RzIGFyZSBpbnN0YWxsZWQgd2l0aCByY3VfYXNzaWduX3BvaW50ZXIsIHRoZW5cbjE5MDE6XHRcdCAqIHJlbGVhc2VkIGJlZm9yZSB0aGUgc3luY2hyb25pemUgc3JjdSBpbiBrdm1fc3dhcF9hY3RpdmVfbWVtc2xvdHMoKS5cbjE5MDI6XHRcdCAqXG4xOTAzOlx0XHQgKiBXaGVuIG1vZGlmeWluZyBtZW1zbG90cyBvdXRzaWRlIG9mIHRoZSBzbG90c19sb2NrLCBtdXN0IGJlIGhlbGRcbjE5MDQ6XHRcdCAqIGJlZm9yZSByZWFkaW5nIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1lbXNsb3RzIHVudGlsIGFmdGVyIGFsbFxuMTkwNTpcdFx0ICogY2hhbmdlcyB0byB0aG9zZSBtZW1zbG90cyBhcmUgY29tcGxldGUuXG4xOTA2Olx0XHQgKlxuMTkwNzpcdFx0ICogVGhlc2UgcnVsZXMgZW5zdXJlIHRoYXQgaW5zdGFsbGluZyBuZXcgbWVtc2xvdHMgZG9lcyBub3QgbG9zZVxuMTkwODpcdFx0ICogY2hhbmdlcyBtYWRlIHRvIHRoZSBwcmV2aW91cyBtZW1zbG90cy5cbjE5MDk6XHRcdCAqL1xuMTkxMDpcdFx0bXV0ZXhfbG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbjE5MTE6XHRcbjE5MTI6XHRcdC8qXG4xOTEzOlx0XHQgKiBJbnZhbGlkYXRlIHRoZSBvbGQgc2xvdCBpZiBpdCYjMzk7cyBiZWluZyBkZWxldGVkIG9yIG1vdmVkLiAgVGhpcyBpc1xuMTkxNDpcdFx0ICogZG9uZSBwcmlvciB0byBhY3R1YWxseSBkZWxldGluZy9tb3ZpbmcgdGhlIG1lbXNsb3QgdG8gYWxsb3cgdkNQVXMgdG9cbjE5MTU6XHRcdCAqIGNvbnRpbnVlIHJ1bm5pbmcgYnkgZW5zdXJpbmcgdGhlcmUgYXJlIG5vIG1hcHBpbmdzIG9yIHNoYWRvdyBwYWdlc1xuMTkxNjpcdFx0ICogZm9yIHRoZSBtZW1zbG90IHdoZW4gaXQgaXMgZGVsZXRlZC9tb3ZlZC4gIFdpdGhvdXQgcHJlLWludmFsaWRhdGlvblxuMTkxNzpcdFx0ICogKGFuZCB3aXRob3V0IGEgbG9jayksIGEgd2luZG93IHdvdWxkIGV4aXN0IGJldHdlZW4gZWZmZWN0aW5nIHRoZVxuMTkxODpcdFx0ICogZGVsZXRlL21vdmUgYW5kIGNvbW1pdHRpbmcgdGhlIGNoYW5nZXMgaW4gYXJjaCBjb2RlIHdoZXJlIEtWTSBvciBhXG4xOTE5Olx0XHQgKiBndWVzdCBjb3VsZCBhY2Nlc3MgYSBub24tZXhpc3RlbnQgbWVtc2xvdC5cbjE5MjA6XHRcdCAqXG4xOTIxOlx0XHQgKiBNb2RpZmljYXRpb25zIGFyZSBkb25lIG9uIGEgdGVtcG9yYXJ5LCB1bnJlYWNoYWJsZSBzbG90LiAgVGhlIG9sZFxuMTkyMjpcdFx0ICogc2xvdCBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgaW4gY2FzZSBhIGxhdGVyIHN0ZXAgZmFpbHMgYW5kIHRoZVxuMTkyMzpcdFx0ICogaW52YWxpZGF0aW9uIG5lZWRzIHRvIGJlIHJldmVydGVkLlxuMTkyNDpcdFx0ICovXG4xOTI1Olx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4xOTI2Olx0XHRcdGludmFsaWRfc2xvdCA9IGt6YWxsb2Nfb2JqKCppbnZhbGlkX3Nsb3QsIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4xOTI3Olx0XHRcdGlmICghaW52YWxpZF9zbG90KSB7XG4xOTI4Olx0XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmt2bS1cdTAwM2VzbG90c19hcmNoX2xvY2spO1xuMTkyOTpcdFx0XHRcdHJldHVybiAtRU5PTUVNO1xuMTkzMDpcdFx0XHR9XG4xOTMxOlx0XHRcdGt2bV9pbnZhbGlkYXRlX21lbXNsb3Qoa3ZtLCBvbGQsIGludmFsaWRfc2xvdCk7XG4xOTMyOlx0XHR9XG4xOTMzOlx0XG4xOTM0Olx0XHRyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuMTkzNTpcdFx0aWYgKHIpXG4xOTM2Olx0XHRcdGdvdG8gZXJyO1xuMTkzNzpcdFxuMTkzODpcdFx0aWYgKG5ldyBcdTAwMjZcdTAwMjYgbmV3LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XG4xOTM5Olx0XHRcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxuMTk0MDpcdFx0XHRcdGdvdG8gZXJyX2JpbmQ7XG4xOTQxOlx0XG4xOTQyOlx0XHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XG4xOTQzOlx0XHRcdGlmIChyKVxuMTk0NDpcdFx0XHRcdGdvdG8gZXJyX2JpbmQ7XG4xOTQ1Olx0XHR9XG4xOTQ2Olx0XG4xOTQ3Olx0XHQvKlxuMTk0ODpcdFx0ICogRm9yIERFTEVURSBhbmQgTU9WRSwgdGhlIHdvcmtpbmcgc2xvdCBpcyBub3cgYWN0aXZlIGFzIHRoZSBJTlZBTElEXG4xOTQ5Olx0XHQgKiB2ZXJzaW9uIG9mIHRoZSBvbGQgc2xvdC4gIE1PVkUgaXMgcGFydGljdWxhcmx5IHNwZWNpYWwgYXMgaXQgcmV1c2VzXG4xOTUwOlx0XHQgKiB0aGUgb2xkIHNsb3QgYW5kIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvbGQgc2xvdCAoaW4gd29ya2luZ19zbG90KS5cbjE5NTE6XHRcdCAqIEZvciBDUkVBVEUsIHRoZXJlIGlzIG5vIG9sZCBzbG90LiAgRm9yIERFTEVURSBhbmQgRkxBR1NfT05MWSwgdGhlXG4xOTUyOlx0XHQgKiBvbGQgc2xvdCBpcyBkZXRhY2hlZCBidXQgb3RoZXJ3aXNlIHByZXNlcnZlZC5cbjE5NTM6XHRcdCAqL1xuMTk1NDpcdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfQ1JFQVRFKVxuMTk1NTpcdFx0XHRrdm1fY3JlYXRlX21lbXNsb3Qoa3ZtLCBuZXcpO1xuMTk1NjpcdFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUpXG4xOTU3Olx0XHRcdGt2bV9kZWxldGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcbjE5NTg6XHRcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcbjE5NTk6XHRcdFx0a3ZtX21vdmVfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBpbnZhbGlkX3Nsb3QpO1xuMTk2MDpcdFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9GTEFHU19PTkxZKVxuMTk2MTpcdFx0XHRrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldyk7XG4xOTYyOlx0XHRlbHNlXG4xOTYzOlx0XHRcdEJVRygpO1xuMTk2NDpcdFxuMTk2NTpcdFx0LyogRnJlZSB0aGUgdGVtcG9yYXJ5IElOVkFMSUQgc2xvdCB1c2VkIGZvciBERUxFVEUgYW5kIE1PVkUuICovXG4xOTY2Olx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKVxuMTk2NzpcdFx0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuMTk2ODpcdFxuMTk2OTpcdFx0LypcbjE5NzA6XHRcdCAqIE5vIG5lZWQgdG8gcmVmcmVzaCBuZXctXHUwMDNlYXJjaCwgY2hhbmdlcyBhZnRlciBkcm9wcGluZyBzbG90c19hcmNoX2xvY2tcbjE5NzE6XHRcdCAqIHdpbGwgZGlyZWN0bHkgaGl0IHRoZSBmaW5hbCwgYWN0aXZlIG1lbXNsb3QuICBBcmNoaXRlY3R1cmVzIGFyZVxuMTk3MjpcdFx0ICogcmVzcG9uc2libGUgZm9yIGtub3dpbmcgdGhhdCBuZXctXHUwMDNlYXJjaCBtYXkgYmUgc3RhbGUuXG4xOTczOlx0XHQgKi9cbjE5NzQ6XHRcdGt2bV9jb21taXRfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuMTk3NTpcdFxuMTk3NjpcdFx0cmV0dXJuIDA7XG4xOTc3Olx0XG4xOTc4Olx0ZXJyX2JpbmQ6XG4xOTc5Olx0XHRpZiAobmV3KSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTkzMgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgbXlzZWxmOgoKKipJbnZlc3RpZ2F0aW5nIEtjb25maWcgT3B0aW9ucyBmb3IgS1ZNIGFuZCBHdWVzdCBNZW1vcnkgRmlsZSBEZXNjcmlwdG9ycyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgS1ZNIGFuZCBgZ3Vlc3RfbWVtZmRgIHNpdHVhdGlvbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggS2NvbmZpZyBvcHRpb25zIGFyZSByZWxldmFudCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGBLVk1fR1VFU1RfTUVNRkRgLiBUaGUgb2J2aW91cyBzdGFydGluZyBwb2ludCBpcyB0aGUgS2NvbmZpZyBmaWxlcyB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4gR2l2ZW4gdGhhdCB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIEtWTSwgd2hpY2ggaXMgaGlnaGx5IGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQsIEkmIzM5O2xsIHN0YXJ0IGJ5IGxvb2tpbmcgaW4gYGFyY2gveDg2L2t2bS9LY29uZmlnYCDigJMgbWFrZXMgc2Vuc2UgdG8gY2hlY2sgdGhlIHg4NiBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiBJZiB0aGF0IGRvZXNuJiMzOTt0IHlpZWxkIGFueXRoaW5nLCBvciBpZiBJIHdhbnQgYSBtb3JlIGdlbmVyYWwgcGVyc3BlY3RpdmUsIEkmIzM5O2xsIGV4cGFuZCB0aGUgc2VhcmNoIGFuZCBsb29rIGluIGB2aXJ0L2t2bS9LY29uZmlnYC4gQSBxdWljayBgZ3JlcGAgZm9yIGBLVk1fR1VFU1RfTUVNRkRgIGluIGJvdGggdGhvc2UgbG9jYXRpb25zIHNob3VsZCByZXZlYWwgdGhlIG5lY2Vzc2FyeSBvcHRpb25zIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMuIFRoYXQgc2hvdWxkIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludCB0byBhbmFseXplIHdoYXQgb3B0aW9ucyBhcmUgbmVlZGVkLCB0byBidWlsZCBteSBzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2FyY2gveDg2L2t2bSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDthcmNoL3g4Ni9rdm0vS2NvbmZpZz0yMD1jb25maWcgS1ZNX1g4NlxuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTQ5LVx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo1MDpcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkQgaWYgWDg2XzY0XG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy01MS1cbi0tXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jPTUxMzU9dm9pZCBrdm1fYXJjaF9hc3luY19wYWdlX3JlYWR5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9hc3luY19wZiAqd29yaylcbi0tXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jLTUxNjUtXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jOjUxNjY6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTE2Ny1zdGF0aWMgdm9pZCBrdm1fYXNzZXJ0X2dtZW1faW52YWxpZGF0ZV9sb2NrX2hlbGQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdClcbi0tXG5hcmNoL3g4Ni9rdm0veDg2LmM9MTA2MzQ9Ym9vbCBrdm1fYXJjaF9ub19wb2xsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbi0tXG5hcmNoL3g4Ni9rdm0veDg2LmMtMTA2MzgtXG5hcmNoL3g4Ni9rdm0veDg2LmM6MTA2Mzk6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbmFyY2gveDg2L2t2bS94ODYuYy0xMDY0MC0vKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDY1MAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKkludmVzdGlnYXRpbmcgS1ZNX0dVRVNUX01FTUZEIGluIHRoZSBLY29uZmlnIENvbnRleHQqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZywgYmV5b25kIHdoYXQgd2UmIzM5O3ZlIGFscmVhZHkgbG9va2VkIGF0LCB3ZSBuZWVkIHRvIHNwZWNpZmljYWxseSBzZWFyY2ggZm9yIGBLVk1fR1VFU1RfTUVNRkRgIHdpdGhpbiB0aGUgYHZpcnQva3ZtL0tjb25maWdgIGZpbGUuIEdpdmVuIG15IGV4cGVydGlzZSwgSSBzdXNwZWN0IHRoaXMgaXMgd2hlcmUgdGhlIG1haW4gY29uZmlndXJhdGlvbiBvcHRpb24gcmVsYXRlZCB0byBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9ycyB3aWxsIGJlIGRlZmluZWQsIG9yIGF0IGxlYXN0IGhhdmUgaXRzIGRlcGVuZGVuY2llcyBjbGVhcmx5IGxhaWQgb3V0LiBUaGlzIHdpbGwgcHJvdmlkZSB2YWx1YWJsZSBjb250ZXh0IGluIHVuZGVyc3RhbmRpbmcgaG93IGl04oCZcyBlbmFibGVkLCBhbnkgcHJlcmVxdWlzaXRlcyBpdCBoYXMsIGFuZCBwZXJoYXBzIHNoZWQgbGlnaHQgb24gd2hlcmUgaXRzIGZ1bmN0aW9uYWxpdHkgaW50ZWdyYXRlcyB3aXRoaW4gdGhlIGJyb2FkZXIgS1ZNIGZyYW1ld29yay4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyB0byBkZXRlcm1pbmUgaXQmIzM5O3MgYmVoYXZpb3Igb3IgaG93IGl0IG1pZ2h0IG5lZWQgdG8gYmUgbW9kaWZpZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLVk1fR1VFU1RfTUVNRkQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDt2aXJ0L2t2bSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDt2aXJ0L2t2bS9LY29uZmlnPTEwMz1jb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcbi0tXG52aXJ0L2t2bS9LY29uZmlnLTEwNS1cbnZpcnQva3ZtL0tjb25maWc6MTA2OmNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwOTYzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIEtWTSBDb25maWd1cmF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGB2aXJ0L2t2bS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTA2LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgcGFydGljdWxhciBvcHRpb24gaXMgaGFuZGxlZC4gSSBzdXNwZWN0IHdlJiMzOTtyZSBsb29raW5nIGF0IGEgS2NvbmZpZyBzeW1ib2wgcmVsYXRlZCB0byBhIHNwZWNpZmljIHZpcnR1YWxpemF0aW9uIGZlYXR1cmUgb3IgZGV2aWNlLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgSSBtaWdodCBiZSBsb29raW5nIGZvciBkZXBlbmRlbmNpZXMsIGRlZmF1bHQgdmFsdWVzLCBvciBwZXJoYXBzIGV2ZW4gY29tbWVudHMgY2xhcmlmeWluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGlzIG9wdGlvbi4gTXkgZ29hbCBoZXJlIGlzIHRvIGdyYXNwIHRoZSBjb25maWd1cmFiaWxpdHkgb2YgdGhpcyBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aGUgS1ZNIHNldHVwIGFuZCBpdHMgcG90ZW50aWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZSBvciBmdW5jdGlvbmFsaXR5LiBJIHdpbGwgcGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmZWF0dXJlcyBvciBoYXJkd2FyZSwgbG9va2luZyBmb3IgYW55IGVkZ2UgY2FzZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDk1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgOTU6XHQgICAgICAgYm9vbFxuICA5NjpcdFxuICA5NzpcdGNvbmZpZyBLVk1fRUxJREVfVExCX0ZMVVNIX0lGX1lPVU5HXG4gIDk4Olx0ICAgICAgIGJvb2xcbiAgOTk6XHRcbiAxMDA6XHRjb25maWcgS1ZNX01NVV9MT0NLTEVTU19BR0lOR1xuIDEwMTpcdCAgICAgICBib29sXG4gMTAyOlx0XG4gMTAzOlx0Y29uZmlnIEtWTV9HRU5FUklDX01FTU9SWV9BVFRSSUJVVEVTXG4gMTA0Olx0ICAgICAgIGJvb2xcbiAxMDU6XHRcbiAxMDY6XHRjb25maWcgS1ZNX0dVRVNUX01FTUZEXG4gMTA3Olx0ICAgICAgIHNlbGVjdCBYQVJSQVlfTVVMVElcbiAxMDg6XHQgICAgICAgYm9vbFxuIDEwOTpcdFxuIDExMDpcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fQ09OVkVSVFxuIDExMTpcdCAgICAgICBib29sXG4gMTEyOlx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4gMTEzOlx0XG4gMTE0Olx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9SRUNMQUlNXG4gMTE1Olx0ICAgICAgIGJvb2xcbiAxMTY6XHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbiAxMTc6XHRcbiAxMTg6XHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0lOVkFMSURBVEVcbiAxMTk6XHQgICAgICAgYm9vbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTQ5MwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDkxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgZG93biB0aGlzIEtWTSBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50LiBGaXJzdCwgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBLVk0gbW9kdWxlcyBuZWNlc3NhcnkuIFNpbmNlIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggeDg2IGFyY2hpdGVjdHVyZSAoc3BlY2lmaWNhbGx5IGFtZDY0KSwgdGhlIHByaW1hcnkgY2FuZGlkYXRlcyBhcmUgKipLVk0qKiwgKipLVk1fSU5URUwqKiwgb3IgKipLVk1fQU1EKiouIFRoZSBgS1ZNX0dVRVNUX01FTUZEYCBtb2R1bGUgYWxzbyBzZWVtcyByZWxldmFudCwgY29uZGl0aW9uYWxseSBzZWxlY3RlZCBieSBgS1ZNX1g4NmAgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBYODZfNjQsIHdoaWNoIGlzIGxpa2VseSBpbiB0aGlzIGNvbnRleHQuIFRvIHZlcmlmeSB0aGlzIGFuZCB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25hbCBsb2dpYyBtb3JlIHRob3JvdWdobHksIEkgc2hvdWxkIGNvbnN1bHQgdGhlIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AgZmlsZS4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgZGVmaW5pdGl2ZSBjb25maWd1cmF0aW9uIGRldGFpbHMgd2lsbCByZXNpZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7YXJjaC94ODYva3ZtL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDYwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4gICAyOlx0I1xuICAgMzpcdCMgS1ZNIGNvbmZpZ3VyYXRpb25cbiAgIDQ6XHQjXG4gICA1Olx0XG4gICA2Olx0c291cmNlIFwmIzM0O3ZpcnQva3ZtL0tjb25maWdcJiMzNDtcbiAgIDc6XHRcbiAgIDg6XHRtZW51Y29uZmlnIFZJUlRVQUxJWkFUSU9OXG4gICA5Olx0XHRib29sIFwmIzM0O1ZpcnR1YWxpemF0aW9uXCYjMzQ7XG4gIDEwOlx0XHRkZWZhdWx0IHlcbiAgMTE6XHRcdGhlbHBcbiAgMTI6XHRcdCAgU2F5IFkgaGVyZSB0byBnZXQgdG8gc2VlIG9wdGlvbnMgZm9yIHVzaW5nIHlvdXIgTGludXggaG9zdCB0byBydW4gb3RoZXJcbiAgMTM6XHRcdCAgb3BlcmF0aW5nIHN5c3RlbXMgaW5zaWRlIHZpcnR1YWwgbWFjaGluZXMgKGd1ZXN0cykuXG4gIDE0Olx0XHQgIFRoaXMgb3B0aW9uIGFsb25lIGRvZXMgbm90IGFkZCBhbnkga2VybmVsIGNvZGUuXG4gIDE1Olx0XG4gIDE2Olx0XHQgIElmIHlvdSBzYXkgTiwgYWxsIG9wdGlvbnMgaW4gdGhpcyBzdWJtZW51IHdpbGwgYmUgc2tpcHBlZCBhbmQgZGlzYWJsZWQuXG4gIDE3Olx0XG4gIDE4Olx0aWYgVklSVFVBTElaQVRJT05cbiAgMTk6XHRcbiAgMjA6XHRjb25maWcgS1ZNX1g4NlxuICAyMTpcdFx0ZGVmX3RyaXN0YXRlIEtWTSBpZiAoS1ZNX0lOVEVMICE9IG4gfHwgS1ZNX0FNRCAhPSBuKVxuICAyMjpcdFx0c2VsZWN0IEtWTV9DT01NT05cbiAgMjM6XHRcdHNlbGVjdCBLVk1fRUxJREVfVExCX0ZMVVNIX0lGX1lPVU5HXG4gIDI0Olx0XHRzZWxlY3QgS1ZNX01NVV9MT0NLTEVTU19BR0lOR1xuICAyNTpcdFx0c2VsZWN0IEhBVkVfS1ZNX0lSUUNISVBcbiAgMjY6XHRcdHNlbGVjdCBIQVZFX0tWTV9QRk5DQUNIRVxuICAyNzpcdFx0c2VsZWN0IEhBVkVfS1ZNX0RJUlRZX1JJTkdfVFNPXG4gIDI4Olx0XHRzZWxlY3QgSEFWRV9LVk1fRElSVFlfUklOR19BQ1FfUkVMXG4gIDI5Olx0XHRzZWxlY3QgSEFWRV9LVk1fSVJRX0JZUEFTU1xuICAzMDpcdFx0c2VsZWN0IEhBVkVfS1ZNX0lSUV9ST1VUSU5HXG4gIDMxOlx0XHRzZWxlY3QgSEFWRV9LVk1fUkVBRE9OTFlfTUVNXG4gIDMyOlx0XHRzZWxlY3QgVkhPU1RfVEFTS1xuICAzMzpcdFx0c2VsZWN0IEtWTV9BU1lOQ19QRlxuICAzNDpcdFx0c2VsZWN0IFVTRVJfUkVUVVJOX05PVElGSUVSXG4gIDM1Olx0XHRzZWxlY3QgS1ZNX01NSU9cbiAgMzY6XHRcdHNlbGVjdCBTQ0hFRF9JTkZPXG4gIDM3Olx0XHRzZWxlY3QgUEVSRl9FVkVOVFNcbiAgMzg6XHRcdHNlbGVjdCBHVUVTVF9QRVJGX0VWRU5UU1xuICAzOTpcdFx0c2VsZWN0IFBFUkZfR1VFU1RfTUVESUFURURfUE1VXG4gIDQwOlx0XHRzZWxlY3QgSEFWRV9LVk1fTVNJXG4gIDQxOlx0XHRzZWxlY3QgSEFWRV9LVk1fQ1BVX1JFTEFYX0lOVEVSQ0VQVFxuICA0MjpcdFx0c2VsZWN0IEhBVkVfS1ZNX05PX1BPTExcbiAgNDM6XHRcdHNlbGVjdCBWSVJUX1hGRVJfVE9fR1VFU1RfV09SS1xuICA0NDpcdFx0c2VsZWN0IEtWTV9HRU5FUklDX0RJUlRZTE9HX1JFQURfUFJPVEVDVFxuICA0NTpcdFx0c2VsZWN0IEtWTV9WRklPXG4gIDQ2Olx0XHRzZWxlY3QgSEFWRV9LVk1fUE1fTk9USUZJRVIgaWYgUE1cbiAgNDc6XHRcdHNlbGVjdCBLVk1fR0VORVJJQ19IQVJEV0FSRV9FTkFCTElOR1xuICA0ODpcdFx0c2VsZWN0IEtWTV9HRU5FUklDX1BSRV9GQVVMVF9NRU1PUllcbiAgNDk6XHRcdHNlbGVjdCBLVk1fV0VSUk9SIGlmIFdFUlJPUlxuICA1MDpcdFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRCBpZiBYODZfNjRcbiAgNTE6XHRcbiAgNTI6XHRjb25maWcgS1ZNXG4gIDUzOlx0XHR0cmlzdGF0ZSBcJiMzNDtLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIChLVk0pIHN1cHBvcnRcJiMzNDtcbiAgNTQ6XHRcdGRlcGVuZHMgb24gWDg2X0xPQ0FMX0FQSUNcbiAgNTU6XHRcdGhlbHBcbiAgNTY6XHRcdCAgU3VwcG9ydCBob3N0aW5nIGZ1bGx5IHZpcnR1YWxpemVkIGd1ZXN0IG1hY2hpbmVzIHVzaW5nIGhhcmR3YXJlXG4gIDU3Olx0XHQgIHZpcnR1YWxpemF0aW9uIGV4dGVuc2lvbnMuICBZb3Ugd2lsbCBuZWVkIGEgZmFpcmx5IHJlY2VudFxuICA1ODpcdFx0ICBwcm9jZXNzb3IgZXF1aXBwZWQgd2l0aCB2aXJ0dWFsaXphdGlvbiBleHRlbnNpb25zLiBZb3Ugd2lsbCBhbHNvXG4gIDU5Olx0XHQgIG5lZWQgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG9mIHRoZSBwcm9jZXNzb3IgbW9kdWxlcyBiZWxvdy5cbiAgNjA6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI2MzYKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA5MTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBLVk0gR3Vlc3QgTWVtb3J5IEZpbGUgRGVzY3JpcHRvciBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIHBhdGNoIGlzIGRvaW5nLiBGcm9tIHdoYXQgSSBjYW4gc2VlLCBpdCYjMzk7cyBwcmltYXJpbHkgZm9jdXNlZCBvbiBgZ3Vlc3RfbWVtZmRgIGhhbmRsaW5nIHdpdGhpbiBLVk0uIFNwZWNpZmljYWxseToKCjEuICAqKmB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYDoqKiBUaGUgcGF0Y2ggbWFrZXMga2V5IGNoYW5nZXMgaW4gYGt2bV9nbWVtX2JpbmQoKWAuIEl0IGludHJvZHVjZXMgYSBgV0FSTl9PTl9PTkNFYCBjaGVjaywgcmVwbGFjZXMgdGhlIGBXUklURV9PTkNFYCB3aXRoIGEgZGlyZWN0IGFzc2lnbm1lbnQsIGNhcHR1cmVzIGFuZCBlcnJvciBjaGVja3MgdGhlIHJldHVybiBmcm9tIGB4YV9zdG9yZV9yYW5nZSgpYCwgYW5kIGltcG9ydGFudGx5LCBpbXBsZW1lbnRzIGEgcm9sbGJhY2sgbWVjaGFuaXNtIHRoYXQgY2xlYXJzIGBnbWVtLmZpbGVgLCBgZ21lbS5wZ29mZmAsIGFuZCByZW1vdmVzIHRoZSBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBmbGFnIG9uIGVycm9yLiBUaGlzIGVycm9yIGhhbmRsaW5nIGlzIGNydWNpYWwgZm9yIGFueSBmdXp6ZXI7IHdlIG5lZWQgdG8gZXhhbWluZSBob3cgdGhlIHN5c3RlbSByZWFjdHMgdG8gZmFpbHVyZXMuCgoyLiAgKipgdmlydC9rdm0va3ZtX21haW4uY2A6KiogVGhlIHNpZ25hdHVyZSBvZiBga3ZtX3NldF9tZW1zbG90KClgIGlzIG1vZGlmaWVkIHRvIHRha2UgYGdtZW1fZmRgIGFuZCBgZ21lbV9vZmZzZXRgLCBpbmRpY2F0aW5nIGNoYW5nZXMgdG8gaG93IG1lbXNsb3RzIGFyZSBiZWluZyBtYW5hZ2VkLiBUaGUgYGt2bV9nbWVtX2JpbmQoKWAgZnVuY3Rpb24gaXMgbm93IGNhbGxlZCAqd2l0aGluKiBga3ZtX3NldF9tZW1zbG90KClgLCBzcGVjaWZpY2FsbHkgYWZ0ZXIgYGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKWAgYW5kIHdoaWxlIGhvbGRpbmcgYGt2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrYC4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGNvbnRyb2wgZmxvdyBjaGFuZ2UuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGFub3RoZXIgYFdBUk5fT05fT05DRWAgYXNzZXJ0aW9uLiBBbHNvLCBlcnJvciBoYW5kbGluZyBhbmQgYW4gdW53aW5kIHBhdGggYXJlIGFkZGVkIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGlmIGBrdm1fZ21lbV9iaW5kKClgIGZhaWxzLiBGaW5hbGx5LCB0aGUgY2FsbHMgdG8gYGt2bV9nbWVtX2JpbmQoKWAgYW5kIGBrdm1fZ21lbV91bmJpbmQoKWAgYXJlIHJlbW92ZWQgZnJvbSBga3ZtX3NldF9tZW1vcnlfcmVnaW9uKClgLgoKTm93LCBpcyB0aGlzIHNvbWV0aGluZyB3ZSBzaG91bGQgY29uc2lkZXIgZnV6emluZz8gQWJzb2x1dGVseS4gS1ZNIGlzIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nIGFzIGl0JiMzOTtzIGEgY3JpdGljYWwgdmlydHVhbGl6YXRpb24gY29tcG9uZW50IGV4cG9zZWQgdmlhIGAvZGV2L2t2bWAgaW9jdGxzIGxpa2UgYEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMmAgYW5kIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYC4gVGhlc2UgbW9kaWZpY2F0aW9ucyB0byBtZW1vcnkgc2xvdCBjcmVhdGlvbiBhbmQgYmluZGluZyBsb2dpYywgdGhlIGFkZGVkIGFzc2VydGlvbnMsIGFuZCB0aGUgbmV3IGVycm9yIHVud2luZGluZywgcHJlc2VudCBtYW55IG9wcG9ydHVuaXRpZXMgZm9yIGRpc2NvdmVyaW5nIHZ1bG5lcmFiaWxpdGllcywgb3IgYXQgbGVhc3QgZW5zdXJpbmcgdGhlIGVycm9yIHBhdGhzIGFyZSBleGVyY2lzZWQuIFRoZSBtb3ZlbWVudCBvZiBga3ZtX2dtZW1fYmluZCgpYCBhbmQgdGhlIGBzbG90c19hcmNoX2xvY2tgIGFyZSBwb3RlbnRpYWwgc3luY2hyb25pemF0aW9uIGlzc3VlcyB0aGF0IHdlIG5lZWQgdG8gdGFyZ2V0LgoKVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdCBhcmU6CgoqICAgYGt2bV9nbWVtX2JpbmRgCiogICBga3ZtX3NldF9tZW1zbG90YAoqICAgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAKClJlZ2FyZGluZyBjb25maWd1cmF0aW9ucywgd2Ugc2hvdWxkIGJlIHVzaW5nIGBLVk1gIGFuZCBgS1ZNX0dVRVNUX01FTUZEYCwgYnV0IGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlcyBpbiBgdmlydC9rdm0vYCBhbmQgYGFyY2gveDg2L2t2bS9gIHRvIGVuc3VyZSB3ZSBjb3ZlciB0aGUgbmVjZXNzYXJ5IGRlcGVuZGVuY2llcy4gV2UgZG9uJiMzOTt0IHdhbnQgdG8gZXhjbHVkZSBjb25maWd1cmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Z3Vlc3RfbWVtZmRcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7dmlydC9rdm0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7dmlydC9rdm0vTWFrZWZpbGUua3ZtPTE0PWt2bS0kKENPTkZJR19IQVZFX0tWTV9QRk5DQUNIRSkgJiM0Mzs9ICQoS1ZNKS9wZm5jYWNoZS5vXG52aXJ0L2t2bS9NYWtlZmlsZS5rdm06MTU6a3ZtLSQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkgJiM0Mzs9ICQoS1ZNKS9ndWVzdF9tZW1mZC5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MzMwCgkJCQkJCQlvdXRwdXQ6IDE4MQoJCQkJCQkJdGhvdWdodHM6IDI0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBLVk0gU3ltYm9sIEFuYWx5c2lzKioKCk9rYXksIHNvIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYEtWTV9HVUVTVF9NRU1GRGAgYW5kIG90aGVyIEtWTSBjb21wb25lbnRzLiBSaWdodCwgaXQgbG9va3MgbGlrZSBgS1ZNX0dVRVNUX01FTUZEYCBpcyBpbXBsaWNpdGx5IGVuYWJsZWQgd2hlbiBgS1ZNX1g4NmAgaXMgc2VsZWN0ZWQsIHNwZWNpZmljYWxseSB3aGVuIHJ1bm5pbmcgb24gYW4gYFg4Nl82NGAgYXJjaGl0ZWN0dXJlLiBBbmQgc2luY2UgYEtWTWAsIGBLVk1fSU5URUxgLCBhbmQgYEtWTV9BTURgIGFsbCBlbmFibGUgYEtWTV9YODZgLCB0aGF0IG1lYW5zIHRoZXNlIGtlcm5lbCBtb2R1bGVzIOKAkyBgS1ZNYCwgYEtWTV9JTlRFTGAsIGBLVk1fQU1EYCwgYW5kIGBLVk1fR1VFU1RfTUVNRkRgIOKAkyBhcmUgYWxsIHBvdGVudGlhbGx5IHJlbGV2YW50IHRvIHRoaXMgaW52ZXN0aWdhdGlvbi4gV2UmIzM5O3JlIGxvb2tpbmcgYXQgYSBwcmV0dHkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBoZXJlLgoKTGV0JiMzOTtzIHF1aWNrbHkgdmVyaWZ5IG15IHVuZGVyc3RhbmRpbmcgYnkgY2hlY2tpbmcgYWxsIHRoZSByZWNlbnRseSBtb2RpZmllZCBzeW1ib2xzIHJlbGF0ZWQgdG8gZ3Vlc3QgbWVtZmQ6IGBrdm1fZ21lbV9iaW5kYCB3aXRoaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLCBhbmQgYm90aCBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgd2l0aGluIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4KCkdvb2QsIG5vdyBhcmUgdGhlc2UgZ2VuZXJpYyBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnM/IE5vLCB0aGVzZSBhcmUgS1ZNIHNwZWNpZmljIGZ1bmN0aW9ucywgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gbWVtc2xvdCBzZXR1cCBhbmQgZ3Vlc3RfbWVtZmQgb3BlcmF0aW9uLgoKT2theSwgbGV0JiMzOTtzIGdvIHdpdGggdGhpcyBhbmQgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O0tWTV9JTlRFTCYjMzQ7LAogICAgJiMzNDtLVk1fQU1EJiMzNDssCiAgICAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2JpbmQmIzM0OywKICAgICYjMzQ7a3ZtX3NldF9tZW1zbG90JiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtb3J5X3JlZ2lvbiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBLVk0gbWVtc2xvdCBtYW5hZ2VtZW50IGFuZCBndWVzdF9tZW1mZCBiaW5kaW5nIGxvZ2ljLCBtb3Zpbmcga3ZtX2dtZW1fYmluZCgpIGluc2lkZSBrdm1fc2V0X21lbXNsb3QoKSB1bmRlciBzbG90c19hcmNoX2xvY2ssIGFkZGluZyBlcnJvciBoYW5kbGluZyBhbmQgcm9sbGJhY2sgZm9yIHhhX3N0b3JlX3JhbmdlKCksIGFuZCBpbnRyb2R1Y2luZyBuZXcgV0FSTl9PTl9PTkNFIGFzc2VydGlvbnMgYW5kIGVycm9yIHBhdGhzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBLVk0gbWVtb3J5IHJlZ2lvbiBpb2N0bHMgYW5kIHdhcnJhbnRzIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtLVk1fSU5URUwmIzM0OywKICAgICYjMzQ7S1ZNX0FNRCYjMzQ7LAogICAgJiMzNDtLVk1fR1VFU1RfTUVNRkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9iaW5kJiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICAgJiMzNDtrdm1fc2V0X21lbW9yeV9yZWdpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbXNsb3QgbWFuYWdlbWVudCBhbmQgZ3Vlc3RfbWVtZmQgYmluZGluZyBsb2dpYywgbW92aW5nIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCkgdW5kZXIgc2xvdHNfYXJjaF9sb2NrLCBhZGRpbmcgZXJyb3IgaGFuZGxpbmcgYW5kIHJvbGxiYWNrIGZvciB4YV9zdG9yZV9yYW5nZSgpLCBhbmQgaW50cm9kdWNpbmcgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zIGFuZCBlcnJvciBwYXRocy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgS1ZNIG1lbW9yeSByZWdpb24gaW9jdGxzIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmYmY5NTkxNmQ2YjE5ZGMxNzZiM2IwZTkwNGUyZjE1ZWM0NWVkZmMwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgNSAwOToxNDozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCmluZGV4IGI1OTY0ODZkMTg0Y2EuLjZjOGRmNjczODJmY2UgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwpAQCAtNjEyLDEwICYjNDM7NjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCByID0gLUVJTlZBTDsKJiM0MzsJdm9pZCAqeGFyOwogCiAJQlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpOwogCUJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LSZndDtnbWVtLnBnb2ZmKSk7CiAKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzbG90LSZndDtmbGFncyAmYW1wOyBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKQEAgLTY0OSwxMiAmIzQzOzY1MywyMCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsCiAJICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3QKIAkgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS4KIAkgKi8KLQlXUklURV9PTkNFKHNsb3QtJmd0O2dtZW0uZmlsZSwgZmlsZSk7CiYjNDM7CXNsb3QtJmd0O2dtZW0uZmlsZSA9IGZpbGU7CiAJc2xvdC0mZ3Q7Z21lbS5wZ29mZiA9IHN0YXJ0OwogCWlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSkKIAkJc2xvdC0mZ3Q7ZmxhZ3MgfD0gS1ZNX01FTVNMT1RfR01FTV9PTkxZOwogCi0JeGFfc3RvcmVfcmFuZ2UoJmFtcDtmLSZndDtiaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpOwomIzQzOwl4YXIgPSB4YV9zdG9yZV9yYW5nZSgmYW1wO2YtJmd0O2JpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7CiYjNDM7CiYjNDM7CXIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDsKJiM0MzsJaWYgKHIpIHsKJiM0MzsJCXhhX3N0b3JlX3JhbmdlKCZhbXA7Zi0mZ3Q7YmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTsKJiM0MzsJCXNsb3QtJmd0O2dtZW0uZmlsZSA9IE5VTEw7CiYjNDM7CQlzbG90LSZndDtnbWVtLnBnb2ZmID0gMDsKJiM0MzsJCXNsb3QtJmd0O2ZsYWdzICZhbXA7PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZOwomIzQzOwl9CiAJZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKIAogCS8qCkBAIC02NjIsNyAmIzQzOzY3NCw2IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAkgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGUKIAkgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC4KIAkgKi8KLQlyID0gMDsKIGVycjoKIAlmcHV0KGZpbGUpOwogCXJldHVybiByOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC0xODg3LDcgJiM0MzsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldywKLQkJCSAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpCiYjNDM7CQkJICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSwKJiM0MzsJCQkgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KQogewogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDsKIAlpbnQgcjsKQEAgLTE5MzEsMjAgJiM0MzsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAl9CiAKIAlyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwotCWlmIChyKSB7Ci0JCS8qCi0JCSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vCi0JCSAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZAotCQkgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28KLQkJICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suCi0JCSAqLwotCQlpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7Ci0JCQlrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTsKLQkJCWtmcmVlKGludmFsaWRfc2xvdCk7Ci0JCX0gZWxzZSB7Ci0JCQltdXRleF91bmxvY2soJmFtcDtrdm0tJmd0O3Nsb3RzX2FyY2hfbG9jayk7Ci0JCX0KLQkJcmV0dXJuIHI7CiYjNDM7CWlmIChyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CWlmIChuZXcgJmFtcDsmYW1wOyBuZXctJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKQomIzQzOwkJCWdvdG8gZXJyX2JpbmQ7CiYjNDM7CiYjNDM7CQlyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpOwomIzQzOwkJaWYgKHIpCiYjNDM7CQkJZ290byBlcnJfYmluZDsKIAl9CiAKIAkvKgpAQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sCiAJa3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7CiAKIAlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJfYmluZDoKJiM0MzsJaWYgKG5ldykgewomIzQzOwkJa3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTsKJiM0MzsKJiM0MzsJCWlmIChuZXctJmd0O2RpcnR5X2JpdG1hcCAmYW1wOyZhbXA7ICghb2xkIHx8ICFvbGQtJmd0O2RpcnR5X2JpdG1hcCkpCiYjNDM7CQkJa3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7CiYjNDM7CX0KJiM0MztlcnI6CiYjNDM7CS8qCiYjNDM7CSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnMKJiM0MzsJICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuCiYjNDM7CSAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay4KJiM0MzsJICovCiYjNDM7CWlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHsKJiM0MzsJCWt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpOwomIzQzOwkJa2ZyZWUoaW52YWxpZF9zbG90KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO2t2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLApAQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAkJaWYgKFdBUk5fT05fT05DRShrdm0tJmd0O25yX21lbXNsb3RfcGFnZXMgJmx0OyBvbGQtJmd0O25wYWdlcykpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTsKJiM0MzsJCXJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTsKIAl9CiAKIAliYXNlX2dmbiA9IChtZW0tJmd0O2d1ZXN0X3BoeXNfYWRkciAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKQEAgLTIxMDUsMjEgJiM0MzsyMTIzLDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAluZXctJmd0O25wYWdlcyA9IG5wYWdlczsKIAluZXctJmd0O2ZsYWdzID0gbWVtLSZndDtmbGFnczsKIAluZXctJmd0O3VzZXJzcGFjZV9hZGRyID0gbWVtLSZndDt1c2Vyc3BhY2VfYWRkcjsKLQlpZiAobWVtLSZndDtmbGFncyAmYW1wOyBLVk1fTUVNX0dVRVNUX01FTUZEKSB7Ci0JCXIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBtZW0tJmd0O2d1ZXN0X21lbWZkLCBtZW0tJmd0O2d1ZXN0X21lbWZkX29mZnNldCk7Ci0JCWlmIChyKQotCQkJZ290byBvdXQ7Ci0JfQogCi0JciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwomIzQzOwlyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSwKJiM0MzsJCQkgICAgbWVtLSZndDtndWVzdF9tZW1mZCwgbWVtLSZndDtndWVzdF9tZW1mZF9vZmZzZXQpOwogCWlmIChyKQotCQlnb3RvIG91dF91bmJpbmQ7CiYjNDM7CQlnb3RvIG91dDsKIAogCXJldHVybiAwOwogCi1vdXRfdW5iaW5kOgotCWlmIChtZW0tJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpCi0JCWt2bV9nbWVtX3VuYmluZChuZXcpOwogb3V0OgogCWtmcmVlKG5ldyk7CiAJcmV0dXJuIHI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDExCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIEtWTSBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgUmlza3MqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBhc3Nlc3MgdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmUsIHNwZWNpZmljYWxseSB3YXJyYW50aW5nIGEgS01TQU4gZnV6emluZyBzZXNzaW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2hhbmdlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBpbnRyb2R1Y2UgYW55IG5ldyByaXNrcyBpbiB0aGF0IGFyZWEuCgpGaXJzdCwgdGhlIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBmaWxlLiBJbiBga3ZtX2dtZW1fYmluZGAsIHRoZSBwYXRjaCBhZGRzIGEgY2hlY2sgdG8gc2VlIGlmIGBzbG90LSZndDtmbGFnc2AgaGFzIHRoZSBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBmbGFnLCB3aGljaCBsb29rcyBsaWtlIGEgZGVmZW5zaXZlIG1lYXN1cmUuIEl0IGFsc28gY2hhbmdlcyBhIGBXUklURV9PTkNFYCB0byBhIGRpcmVjdCBhc3NpZ25tZW50IHRvIGBzbG90LSZndDtnbWVtLmZpbGVgLiBUaGF0JiMzOTtzIG5vdCBpbmhlcmVudGx5IHN1c3BpY2lvdXMsIGJ1dCBpdCB3YXJyYW50cyBhIGNsb3NlciBsb29rIGF0IHRoZSBzdXJyb3VuZGluZyBjb2RlLiBNb3N0IG5vdGFibHksIHRoZSBlcnJvciBoYW5kbGluZyBhcm91bmQgYHhhX3N0b3JlX3JhbmdlYCBpcyBpbnRlcmVzdGluZy4gSWYgYHhhX3N0b3JlX3JhbmdlYCBmYWlscywgaXQgbm93IGV4cGxpY2l0bHkgY2xlYXJzIHRoZSBgZ21lbS5maWxlYCwgYGdtZW0ucGdvZmZgLCBhbmQgdGhlIGBLVk1fTUVNU0xPVF9HTUVNX09OTFlgIGZsYWcgb24gYHNsb3RgLiBUaGlzIHNlZW1zIGxpa2UgYSBnb29kIHByYWN0aWNlIHRvIHByZXZlbnQgbGluZ2VyaW5nIHN0YWxlIGRhdGEuCgpOZXh0LCBJJiMzOTtsbCBtb3ZlIG9uIHRvIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gSGVyZSwgdGhlIHBhdGNoIHJlLWFycmFuZ2VzIHRoZSBleGVjdXRpb24sIG1vdmluZyBga3ZtX2dtZW1fYmluZGAgaW50byBga3ZtX3NldF9tZW1zbG90YC4gIEl0IGFsc28gcGFzc2VzIGBnbWVtX2ZkYCBhbmQgYGdtZW1fb2Zmc2V0YCB0byBga3ZtX3NldF9tZW1zbG90YCwgd2hpY2ggZ2l2ZXMgY29udGV4dCB0byB0aGUgYmluZGluZyBwcm9jZXNzLiBDcnVjaWFsbHksIHRoZSBwYXRjaCBhZGRzIGVycm9yIGhhbmRsaW5nIGFmdGVyIHRoZSBjYWxsIHRvIGBrdm1fZ21lbV9iaW5kYCB3aXRoaW4gYGt2bV9zZXRfbWVtc2xvdGAsIHdoaWNoIGluY2x1ZGVzIGNsZWFudXAgdXNpbmcgYGt2bV9hcmNoX2ZyZWVfbWVtc2xvdGAgYW5kIHBvdGVudGlhbGx5IGBrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXBgLCBpZiBuZWVkZWQuIFNpbXBsaWZ5aW5nIHRoZSBlcnJvciBwYXRoIGluIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGJ5IGRlZmVycmluZyBga3ZtX2dtZW1fdW5iaW5kYCBzb3VuZHMgbGlrZSBhIGdvb2Qgb3B0aW1pemF0aW9uLCBhc3N1bWluZyB0aGlzIGRvZXNuJiMzOTt0IGNyZWF0ZSBuZXcgc3VidGxlIGlzc3Vlcy4KCk5vdywgbXkgdGhvdWdodHMgdHVybiB0byB0aGUgb3ZlcmFsbCBjb250ZXh0LiBJIG5lZWQgdG8gdHJhY2UgdGhlIHVzYWdlIG9mIGBrdm1fZ21lbV9iaW5kYCBhbmQgYGt2bV9zZXRfbWVtc2xvdGAuIEkgaGF2ZSB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMgYW5kIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyB3aXRoaW4gdGhlIEtWTSBzeXN0ZW0uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCBzdGF0ZSBpc24mIzM5O3QgZ2V0dGluZyB3cml0dGVuIGludG8gdGhlIG1lbXNsb3QgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb24uIElmIHRoZXJlIGFyZSBubyBjbGVhciB3cml0ZSBvcGVyYXRpb25zIGJlZm9yZSBhIGNvbmRpdGlvbmFsIHJlYWQsIEkmIzM5O2Qgd2FudCB0byBiZSBzdXJlIHRvIHRlc3QgaXQgd2l0aCBmdXp6aW5nLgoKT3ZlcmFsbCwgdGhpcyBwYXRjaCBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSByZWZhY3RvciB3aXRoIGFkZGVkIGVycm9yIGhhbmRsaW5nLiBJdCYjMzk7cyBub3QgaW1tZWRpYXRlbHkgc2NyZWFtaW5nICYjMzQ7dW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0eSYjMzQ7IGF0IG1lLiBUaGUgZXhwbGljaXQgY2xlYXJpbmcgb2YgZmllbGRzIGluIHRoZSBlcnJvciBwYXRoIHNlZW1zIGxpa2UgYSBwb3NpdGl2ZSBzdGVwLiBIb3dldmVyLCB0aGUgbW92ZSBvZiBga3ZtX2dtZW1fYmluZGAgYW5kIHRoZSBhbHRlcmVkIGVycm9yIGhhbmRsaW5nIGFyZSB3aGF0IEkgbmVlZCB0byBwcm9iZSBmdXJ0aGVyIHRvIGJlIGNlcnRhaW4uIEkmIzM5O2xsIG5lZWQgdG8gZG8gYSB0aG9yb3VnaCBjb2RlIHdhbGsgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBidXQgSSYjMzk7bSBsZWFuaW5nIHRvd2FyZCBuZWVkaW5nIEtNU0FOIGZ1enppbmcgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBsYXRlbnQgYnVncy4gSSYjMzk7bGwgbmVlZCB0byBjcmVhdGUgYSB0ZXN0IGhhcm5lc3Mgd2l0aCBzY2VuYXJpb3MgdGhhdCBjb3VsZCBsZWFkIHRvIHRoZXNlIGVycm9yIGNvbmRpdGlvbnMgdG8gbG9vayBpbnRvIGl0IGRlZXBlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3ZtX2dtZW1fYmluZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NTkyPWludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYwNS1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjA2OmludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjA3LVx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldClcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1Mi1cdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjUzOlx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjU0LVx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaD0xMD1pbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpO1xudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDoxMTppbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEyLVx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldCk7XG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaD0xOT1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2dtZW1fZXhpdCh2b2lkKSB7fTtcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MjA6c3RhdGljIGlubGluZSBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTIxLVx0XHRcdFx0XHQgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE4ODc9c3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0MS1cbnZpcnQva3ZtL2t2bV9tYWluLmM6MTk0MjpcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0My1cdFx0aWYgKHIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU4NzgKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKioKCk9rYXksIHNvIEkmIzM5O20gdGhpbmtpbmcgSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyBLVk0gaGFuZGxlcyBndWVzdCBtZW1vcnksIHBhcnRpY3VsYXJseSBhcm91bmQgdGhvc2UgYG1lbWZkYCBpbnRlcmFjdGlvbnMuIFJpZ2h0LCBsZXQmIzM5O3MgemVybyBpbiBvbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBnb2luZyB0byBiZSBmb2N1c2luZyBvbiB0aGUgYGt2bV9nbWVtX2JpbmRgIGFuZCBga3ZtX2dtZW1fdW5iaW5kYCBmdW5jdGlvbnMuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBndWVzdCBtZW1vcnkgaXMgYm91bmQgYW5kIHVuYm91bmQgdG8gdGhlIGhvc3QmIzM5O3MgbWVtb3J5IG1vZGVsIHVzaW5nIGBtZW1mZGAgc2luY2UgdGhpcyBpcyBhIGNyaXRpY2FsIGFzcGVjdCBvZiBlZmZpY2llbnQgYW5kIHNlY3VyZSBtZW1vcnkgbWFuYWdlbWVudC4gV2hhdCBhcmUgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgbWFuaXB1bGF0ZWQgaGVyZT8gV2hhdCYjMzk7cyB0aGUgY29udHJvbCBmbG93PyBJJiMzOTttIGhvcGluZyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHRoaXMgbWVjaGFuaXNtIGFsbG93cyBmb3Igc2hhcmVkIG1lbW9yeSwgbWVtb3J5IG1pZ3JhdGlvbiwgYW5kIHByb3RlY3Rpb24gaW4gdGhlIEtWTSBlbnZpcm9ubWVudC4gVGltZSB0byBkaWcgaW4gYW5kIHJlbWluZCBteXNlbGYgb2YgdGhlIGRldGFpbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDA5OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4NQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjAwOlx0XHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiA2MDE6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjAyOlx0XG4gNjAzOlx0XHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7XG4gNjA0Olx0fVxuIDYwNTpcdFxuIDYwNjpcdGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiA2MDc6XHRcdFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXG4gNjA4Olx0e1xuIDYwOTpcdFx0dW9mZl90IHNpemUgPSBzbG90LVx1MDAzZW5wYWdlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiA2MTA6XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDtcbiA2MTE6XHRcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XG4gNjEyOlx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIDYxMzpcdFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gNjE0Olx0XHRpbnQgciA9IC1FSU5WQUw7XG4gNjE1Olx0XHR2b2lkICp4YXI7XG4gNjE2Olx0XG4gNjE3Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gNjE4Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gNjE5Olx0XG4gNjIwOlx0XHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXG4gNjIxOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYyMjpcdFxuIDYyMzpcdFx0ZmlsZSA9IGZnZXQoZmQpO1xuIDYyNDpcdFx0aWYgKCFmaWxlKVxuIDYyNTpcdFx0XHRyZXR1cm4gLUVCQURGO1xuIDYyNjpcdFxuIDYyNzpcdFx0aWYgKGZpbGUtXHUwMDNlZl9vcCAhPSBcdTAwMjZrdm1fZ21lbV9mb3BzKVxuIDYyODpcdFx0XHRnb3RvIGVycjtcbiA2Mjk6XHRcbiA2MzA6XHRcdGYgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiA2MzE6XHRcdGlmIChmLVx1MDAzZWt2bSAhPSBrdm0pXG4gNjMyOlx0XHRcdGdvdG8gZXJyO1xuIDYzMzpcdFxuIDYzNDpcdFx0aW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xuIDYzNTpcdFxuIDYzNjpcdFx0aWYgKCFQQUdFX0FMSUdORUQob2Zmc2V0KSB8fCBvZmZzZXQgJiM0Mzsgc2l6ZSBcdTAwM2UgaV9zaXplX3JlYWQoaW5vZGUpKVxuIDYzNzpcdFx0XHRnb3RvIGVycjtcbiA2Mzg6XHRcbiA2Mzk6XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gNjQwOlx0XG4gNjQxOlx0XHRzdGFydCA9IG9mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiA2NDI6XHRcdGVuZCA9IHN0YXJ0ICYjNDM7IHNsb3QtXHUwMDNlbnBhZ2VzO1xuIDY0MzpcdFxuIDY0NDpcdFx0aWYgKCF4YV9lbXB0eShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzKSBcdTAwMjZcdTAwMjZcbiA2NDU6XHRcdCAgICB4YV9maW5kKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIFx1MDAyNnN0YXJ0LCBlbmQgLSAxLCBYQV9QUkVTRU5UKSkge1xuIDY0NjpcdFx0XHRyID0gLUVFWElTVDtcbiA2NDc6XHRcdFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDY0ODpcdFx0XHRnb3RvIGVycjtcbiA2NDk6XHRcdH1cbiA2NTA6XHRcbiA2NTE6XHRcdC8qXG4gNjUyOlx0XHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXG4gNjUzOlx0XHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxuIDY1NDpcdFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4gNjU1Olx0XHQgKi9cbiA2NTY6XHRcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiA2NTc6XHRcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIDY1ODpcdFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIDY1OTpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2NjA6XHRcbiA2NjE6XHRcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiA2NjI6XHRcbiA2NjM6XHRcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiA2NjQ6XHRcdGlmIChyKSB7XG4gNjY1Olx0XHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbiA2NjY6XHRcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuIDY2NzpcdFx0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuIDY2ODpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2Njk6XHRcdH1cbiA2NzA6XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiA2NzE6XHRcbiA2NzI6XHRcdC8qXG4gNjczOlx0XHQgKiBEcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhlIGZpbGUsIGV2ZW4gb24gc3VjY2Vzcy4gIFRoZSBmaWxlIHBpbnMgS1ZNLFxuIDY3NDpcdFx0ICogbm90IHRoZSBvdGhlciB3YXkgJiMzOTtyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXG4gNjc1Olx0XHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cbiA2NzY6XHRcdCAqL1xuIDY3NzpcdGVycjpcbiA2Nzg6XHRcdGZwdXQoZmlsZSk7XG4gNjc5Olx0XHRyZXR1cm4gcjtcbiA2ODA6XHR9XG4gNjgxOlx0XG4gNjgyOlx0c3RhdGljIHZvaWQgX19rdm1fZ21lbV91bmJpbmQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwgc3RydWN0IGdtZW1fZmlsZSAqZilcbiA2ODM6XHR7XG4gNjg0Olx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gc2xvdC1cdTAwM2VnbWVtLnBnb2ZmO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3NDk1CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6CgoqKkRpZ2dpbmcgaW50byBNZW1vcnkgTWFuYWdlbWVudCBpbiBLVk0qKgoKT2theSwgc28gd2UgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtZW1vcnkgcmVnaW9ucyBhcmUgaGFuZGxlZCB3aXRoaW4gS1ZNLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gYHZpcnQva3ZtL2t2bV9tYWluLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgZnVuY3Rpb25zLiBUaGVzZSBhcmUgbGlrZWx5IHRoZSBjb3JlIGZ1bmN0aW9ucyByZXNwb25zaWJsZSBmb3IgbWFwcGluZyBhbmQgY29uZmlndXJpbmcgdGhlIGd1ZXN0JiMzOTtzIHBoeXNpY2FsIG1lbW9yeSB3aXRoaW4gdGhlIGhvc3QuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtZW1zbG90cyBhbmQgbWVtb3J5IHJlZ2lvbnMuIFdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGhlcmU/IFdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGFyZSBpbiBwbGFjZSB0byBlbnN1cmUgY29uc2lzdGVuY3kgZHVyaW5nIHRoZXNlIG9wZXJhdGlvbnM/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZiwgZXNwZWNpYWxseSByZWdhcmRpbmcgY29uY3VycmVudCBhY2Nlc3MgZnJvbSBkaWZmZXJlbnQgdkNQVXM/IEkgc2hvdWxkIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gaG93IG1lbW9yeSBpcyBhY3R1YWxseSBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIGJ5IEtWTSBmb3IgdGhlIGd1ZXN0LiBJIGJldCB0aGVyZSYjMzk7cyBzb21lIGludGVyZXN0aW5nIGludGVycGxheSB3aXRoIHRoZSBob3N0JiMzOTtzIHBhZ2UgdGFibGVzIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB1bml0IGhlcmUuIFRpbWUgdG8gZGl2ZSBpbiBhbmQgc2VlIHdoYXQmIzM5O3Mgd2hhdCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9rdm1fbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTIwOlx0XHQgKlxuMTkyMTpcdFx0ICogTW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBvbiBhIHRlbXBvcmFyeSwgdW5yZWFjaGFibGUgc2xvdC4gIFRoZSBvbGRcbjE5MjI6XHRcdCAqIHNsb3QgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGluIGNhc2UgYSBsYXRlciBzdGVwIGZhaWxzIGFuZCB0aGVcbjE5MjM6XHRcdCAqIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSByZXZlcnRlZC5cbjE5MjQ6XHRcdCAqL1xuMTkyNTpcdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuMTkyNjpcdFx0XHRpbnZhbGlkX3Nsb3QgPSBremFsbG9jX29iaigqaW52YWxpZF9zbG90LCBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuMTkyNzpcdFx0XHRpZiAoIWludmFsaWRfc2xvdCkge1xuMTkyODpcdFx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbjE5Mjk6XHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjE5MzA6XHRcdFx0fVxuMTkzMTpcdFx0XHRrdm1faW52YWxpZGF0ZV9tZW1zbG90KGt2bSwgb2xkLCBpbnZhbGlkX3Nsb3QpO1xuMTkzMjpcdFx0fVxuMTkzMzpcdFxuMTkzNDpcdFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbjE5MzU6XHRcdGlmIChyKVxuMTkzNjpcdFx0XHRnb3RvIGVycjtcbjE5Mzc6XHRcbjE5Mzg6XHRcdGlmIChuZXcgXHUwMDI2XHUwMDI2IG5ldy1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xuMTkzOTpcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcbjE5NDA6XHRcdFx0XHRnb3RvIGVycl9iaW5kO1xuMTk0MTpcdFxuMTk0MjpcdFx0XHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpO1xuMTk0MzpcdFx0XHRpZiAocilcbjE5NDQ6XHRcdFx0XHRnb3RvIGVycl9iaW5kO1xuMTk0NTpcdFx0fVxuMTk0NjpcdFxuMTk0NzpcdFx0LypcbjE5NDg6XHRcdCAqIEZvciBERUxFVEUgYW5kIE1PVkUsIHRoZSB3b3JraW5nIHNsb3QgaXMgbm93IGFjdGl2ZSBhcyB0aGUgSU5WQUxJRFxuMTk0OTpcdFx0ICogdmVyc2lvbiBvZiB0aGUgb2xkIHNsb3QuICBNT1ZFIGlzIHBhcnRpY3VsYXJseSBzcGVjaWFsIGFzIGl0IHJldXNlc1xuMTk1MDpcdFx0ICogdGhlIG9sZCBzbG90IGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGUgb2xkIHNsb3QgKGluIHdvcmtpbmdfc2xvdCkuXG4xOTUxOlx0XHQgKiBGb3IgQ1JFQVRFLCB0aGVyZSBpcyBubyBvbGQgc2xvdC4gIEZvciBERUxFVEUgYW5kIEZMQUdTX09OTFksIHRoZVxuMTk1MjpcdFx0ICogb2xkIHNsb3QgaXMgZGV0YWNoZWQgYnV0IG90aGVyd2lzZSBwcmVzZXJ2ZWQuXG4xOTUzOlx0XHQgKi9cbjE5NTQ6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSlcbjE5NTU6XHRcdFx0a3ZtX2NyZWF0ZV9tZW1zbG90KGt2bSwgbmV3KTtcbjE5NTY6XHRcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFKVxuMTk1NzpcdFx0XHRrdm1fZGVsZXRlX21lbXNsb3Qoa3ZtLCBvbGQsIGludmFsaWRfc2xvdCk7XG4xOTU4Olx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXG4xOTU5Olx0XHRcdGt2bV9tb3ZlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgaW52YWxpZF9zbG90KTtcbjE5NjA6XHRcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfRkxBR1NfT05MWSlcbjE5NjE6XHRcdFx0a3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KGt2bSwgb2xkLCBuZXcpO1xuMTk2MjpcdFx0ZWxzZVxuMTk2MzpcdFx0XHRCVUcoKTtcbjE5NjQ6XHRcbjE5NjU6XHRcdC8qIEZyZWUgdGhlIHRlbXBvcmFyeSBJTlZBTElEIHNsb3QgdXNlZCBmb3IgREVMRVRFIGFuZCBNT1ZFLiAqL1xuMTk2NjpcdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcbjE5Njc6XHRcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbjE5Njg6XHRcbjE5Njk6XHRcdC8qXG4xOTcwOlx0XHQgKiBObyBuZWVkIHRvIHJlZnJlc2ggbmV3LVx1MDAzZWFyY2gsIGNoYW5nZXMgYWZ0ZXIgZHJvcHBpbmcgc2xvdHNfYXJjaF9sb2NrXG4xOTcxOlx0XHQgKiB3aWxsIGRpcmVjdGx5IGhpdCB0aGUgZmluYWwsIGFjdGl2ZSBtZW1zbG90LiAgQXJjaGl0ZWN0dXJlcyBhcmVcbjE5NzI6XHRcdCAqIHJlc3BvbnNpYmxlIGZvciBrbm93aW5nIHRoYXQgbmV3LVx1MDAzZWFyY2ggbWF5IGJlIHN0YWxlLlxuMTk3MzpcdFx0ICovXG4xOTc0Olx0XHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbjE5NzU6XHRcbjE5NzY6XHRcdHJldHVybiAwO1xuMTk3NzpcdFxuMTk3ODpcdGVycl9iaW5kOlxuMTk3OTpcdFx0aWYgKG5ldykge1xuMTk4MDpcdFx0XHRrdm1fYXJjaF9mcmVlX21lbXNsb3Qoa3ZtLCBuZXcpO1xuMTk4MTpcdFxuMTk4MjpcdFx0XHRpZiAobmV3LVx1MDAzZWRpcnR5X2JpdG1hcCBcdTAwMjZcdTAwMjYgKCFvbGQgfHwgIW9sZC1cdTAwM2VkaXJ0eV9iaXRtYXApKVxuMTk4MzpcdFx0XHRcdGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcChuZXcpO1xuMTk4NDpcdFx0fVxuMTk4NTpcdGVycjpcbjE5ODY6XHRcdC8qXG4xOTg3Olx0XHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXG4xOTg4Olx0XHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cbjE5ODk6XHRcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbjE5OTA6XHRcdCAqL1xuMTk5MTpcdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuMTk5MjpcdFx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbjE5OTM6XHRcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbjE5OTQ6XHRcdH0gZWxzZSB7XG4xOTk1Olx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbjE5OTY6XHRcdH1cbjE5OTc6XHRcdHJldHVybiByO1xuMTk5ODpcdH1cbjE5OTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMDk6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTA3MwoJCQkJCQkJb3V0cHV0OiAxMzYKCQkJCQkJCXRob3VnaHRzOiA2NzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUGF0Y2ggQW5hbHlzaXMgYW5kIEtNU0FOIEV2YWx1YXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQmIzM5O3MgZm9jdXNlZCBvbiBpbXByb3ZpbmcgdGhlIHJvYnVzdG5lc3Mgb2YgdGhlIEtWTSBndWVzdF9tZW1mZCBtZW1vcnkgc2xvdCBzZXR1cC4gSSBzZWUgdGhhdCBpdCYjMzk7cyBwcmltYXJpbHkgcmVmYWN0b3JpbmcgdGhlIGVycm9yIGhhbmRsaW5nIHdpdGhpbiBga3ZtX2dtZW1fYmluZGAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYnJvYWRlciBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCBwcm9jZXNzLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gbm90aW5nIHRoZSBjaGFuZ2VzIGluIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb246IGVycm9yIGhhbmRsaW5nIGFkZGVkIGZvciBgeGFfc3RvcmVfcmFuZ2VgLCB0aGUgYWRkaXRpb24gb2YgYSBgV0FSTl9PTl9PTkNFYCBjaGVjaywgYW5kIHRoZSByZW1vdmFsIG9mIGEgYFdSSVRFX09OQ0VgLiBUaGUgcmVvcmRlcmluZyBvZiB0aGUgZnVuY3Rpb24gY2FsbHMgaXMgYWxzbyBzaWduaWZpY2FudCwgZXNwZWNpYWxseSB0aGUgc2hpZnQgb2YgYGt2bV9nbWVtX2JpbmRgIHRvIGJlIGluc2lkZSBga3ZtX3NldF9tZW1zbG90YC4gSW1wb3J0YW50bHksIHRoaXMgbWVhbnMgdGhlIHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cCBpbiBhbiBpbXByb3ZlZCBtYW5uZXIuCgpOb3csIGxldCYjMzk7cyB0aGluayBhYm91dCBLTVNBTiYjMzk7cyByb2xlIGhlcmUuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEkmIzM5O3ZlIHNjYW5uZWQgdGhlIGNoYW5nZXMgYW5kIEkgZG9uJiMzOTt0IHNlZSBhbnl0aGluZyB0aGF0IHNjcmVhbXMgJiMzNDtLTVNBTiByaXNrLiYjMzQ7IEkmIzM5O20gbG9va2luZyBmb3IgZGlyZWN0IGludGVyYWN0aW9ucyB3aXRoIHVzZXJzcGFjZSB2aWEgYGNvcHlfdG9fdXNlcmAgb3IgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIGRhdGEuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBjaGVja2luZyBmb3IgbmV3IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBuZXcgYWxsb2NhdGlvbnMsIG9yIHJlYWRzIHRoYXQgY291bGQgbGVhZCB0byBtZW1vcnkgY29ycnVwdGlvbiBvciBpbmZvIGxlYWtzLiBJdCBsb29rcyBsaWtlIHRoZSBwYXRjaCBpcyBjb3JyZWN0aW5nIGZhaWx1cmUgaGFuZGxpbmcuIFRoZSBwYXRjaCBzZWVtcyB0byBiZSBjb3JyZWN0bHkgdXNpbmcgdGhlIHJldHVybiB2YWx1ZXMgZnJvbSB0aGUgeGFycmF5IGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgYmVoYXZpb3IsIHNvIG5vIGNvbmNlcm5zIHRoZXJlLgoKVGhlIGNoYW5nZXMgYXJlIGNlbnRlcmVkIGFyb3VuZCBpbXByb3ZlZCBlcnJvciBoYW5kbGluZyBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgY2xlYW51cCBvbiBlcnJvcnMuIFRoaXMgaXNuJiMzOTt0IHdoZXJlIEtNU0FOIHRyYWRpdGlvbmFsbHkgc2hpbmVzLiBXZSBhcmUgaGFuZGxpbmcgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbi4gU28sIEkgZG9uJiMzOTt0IHRoaW5rIHRoaXMgaXMgYSBLTVNBTiBpc3N1ZS4gS0FTQU4gYW5kIHRoZSB1c3VhbCBtZW1vcnkgZGVidWdnaW5nIHRvb2xzIGFyZSBsaWtlbHkgc3VmZmljaWVudCBmb3IgdGhvc2UgY29uY2VybnMsIHN1Y2ggYXMgZG91YmxlIGZyZWVzIG9yIFVBRi4gVGhlIHBhdGNoIGl0c2VsZiBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyBzdHJ1Y3R1cmVzLCBjaGFuZ2VzIGluIGRhdGEgbGVuZ3RocywgYnVmZmVyIG92ZXJmbG93cywgb3Igc2hpZnRzIG9mIG9mZnNldHMgdG8gaW50cm9kdWNlIHZ1bG5lcmFiaWxpdGllcy4KCkxldCYjMzk7cyBtYWtlIHN1cmUgSSYjMzk7bSBjcnlzdGFsIGNsZWFyIGluIG15IHJhdGlvbmFsZS4gS01TQU4gdGFyZ2V0cyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3NlcyBhbmQga2VybmVsLXRvLXVzZXIgbGVha3MuIFRoaXMgcGF0Y2ggcHJpbWFyaWx5IG1vZGlmaWVzIHRoZSBlcnJvciBoYW5kbGluZywgZm9jdXNpbmcgb24gdGhlIGNvcnJlY3Qgc2VxdWVuY2UgYW5kIGZhaWx1cmUgaGFuZGxpbmcgb2YgdGhlIGBrdm1fZ21lbV9iaW5kYCBwcm9jZXNzLiBTaW5jZSB0aGlzIGRvZXNuJiMzOTt0IGRpcmVjdGx5IGludHJvZHVjZSBhbnkgbmV3IHVuaW5pdGlhbGl6ZWQgZGF0YSwgZG9lc24mIzM5O3QgY29weSBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSwgYW5kIGZpeGVzIGV4aXN0aW5nIGVycm9yIHBhdGh3YXlzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXNuJiMzOTt0IHdhcnJhbnRlZC4gSSBjYW4gY29uZmlybSB0aGF0IE5lZWRzS01TQU4gc2hvdWxkIGJlIGZhbHNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAwOToxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgb3JkZXJpbmcgYW5kIGVycm9yIGhhbmRsaW5nIG9mIGBrdm1fZ21lbV9iaW5kKClgIGR1cmluZyBLVk0gbWVtc2xvdCBjcmVhdGlvbiBhbmQgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgYHhhX3N0b3JlX3JhbmdlKClgLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBzdHJ1Y3R1cmUgZmllbGRzIHRvdWNoZWQgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZC4gQW55IHJlc291cmNlIGxpZmVjeWNsZSBlcnJvcnMgKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWUgaW4gZXJyb3IgdW53aW5kIHBhdGhzKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTi4gVGhlcmVmb3JlLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBvcmRlcmluZyBhbmQgZXJyb3IgaGFuZGxpbmcgb2YgYGt2bV9nbWVtX2JpbmQoKWAgZHVyaW5nIEtWTSBtZW1zbG90IGNyZWF0aW9uIGFuZCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiBgeGFfc3RvcmVfcmFuZ2UoKWAuIEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdHVyZSBmaWVsZHMgdG91Y2hlZCBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgbGVmdCB1bmluaXRpYWxpemVkLiBBbnkgcmVzb3VyY2UgbGlmZWN5Y2xlIGVycm9ycyAoc3VjaCBhcyB1c2UtYWZ0ZXItZnJlZSBvciBkb3VibGUgZnJlZSBpbiBlcnJvciB1bndpbmQgcGF0aHMpIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDozMS45MTc4NzQ1M1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwNzAyMjUwMzA1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiS1ZNX0lOVEVMXCIsXG4gICAgXCJLVk1fQU1EXCIsXG4gICAgXCJLVk1fR1VFU1RfTUVNRkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9iaW5kXCIsXG4gICAgXCJrdm1fc2V0X21lbXNsb3RcIixcbiAgICBcImt2bV9zZXRfbWVtb3J5X3JlZ2lvblwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbXNsb3QgbWFuYWdlbWVudCBhbmQgZ3Vlc3RfbWVtZmQgYmluZGluZyBsb2dpYywgbW92aW5nIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCkgdW5kZXIgc2xvdHNfYXJjaF9sb2NrLCBhZGRpbmcgZXJyb3IgaGFuZGxpbmcgYW5kIHJvbGxiYWNrIGZvciB4YV9zdG9yZV9yYW5nZSgpLCBhbmQgaW50cm9kdWNpbmcgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zIGFuZCBlcnJvciBwYXRocy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgS1ZNIG1lbW9yeSByZWdpb24gaW9jdGxzIGFuZCB3YXJyYW50cyBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDozMS45MTc4NzkyMVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ1MDI1ODI3NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGZiZjk1OTE2ZDZiMTlkYzE3NmIzYjBlOTA0ZTJmMTVlYzQ1ZWRmYzBcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFNhdCBTZXAgNSAwOToxNDozMCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbmluZGV4IGI1OTY0ODZkMTg0Y2EuLjZjOGRmNjczODJmY2UgMTAwNjQ0XFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcXG5AQCAtNjEyLDEwICs2MTIsMTQgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbiBcXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcXG4gXFx0aW50IHIgPSAtRUlOVkFMO1xcbitcXHR2b2lkICp4YXI7XFxuIFxcbiBcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XFxuIFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVxcdTAwM2VnbWVtLnBnb2ZmKSk7XFxuIFxcbitcXHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbiBcXHRmaWxlID0gZmdldChmZCk7XFxuIFxcdGlmICghZmlsZSlcXG4gXFx0XFx0cmV0dXJuIC1FQkFERjtcXG5AQCAtNjQ5LDEyICs2NTMsMjAgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiBcXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxcbiBcXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4gXFx0ICovXFxuLVxcdFdSSVRFX09OQ0Uoc2xvdC1cXHUwMDNlZ21lbS5maWxlLCBmaWxlKTtcXG4rXFx0c2xvdC1cXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcXG4gXFx0c2xvdC1cXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xcbiBcXHRpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpXFxuIFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcXG4gXFxuLVxcdHhhX3N0b3JlX3JhbmdlKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpO1xcbitcXHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcXG4rXFxuK1xcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4rXFx0aWYgKHIpIHtcXG4rXFx0XFx0eGFfc3RvcmVfcmFuZ2UoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgTlVMTCwgR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuK1xcdFxcdHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYgPSAwO1xcbitcXHRcXHRzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZO1xcbitcXHR9XFxuIFxcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuIFxcbiBcXHQvKlxcbkBAIC02NjIsNyArNjc0LDYgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiBcXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxcbiBcXHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cXG4gXFx0ICovXFxuLVxcdHIgPSAwO1xcbiBlcnI6XFxuIFxcdGZwdXQoZmlsZSk7XFxuIFxcdHJldHVybiByO1xcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uY1xcbmluZGV4IDY1ZWIyNmEwNTIwZDguLjIxYzEwY2JiYWM2NjEgMTAwNjQ0XFxuLS0tIGEvdmlydC9rdm0va3ZtX21haW4uY1xcbisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcXG5AQCAtMTg4Nyw3ICsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4gc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxcbiBcXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXFxuIFxcdFxcdFxcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldyxcXG4tXFx0XFx0XFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSlcXG4rXFx0XFx0XFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcXG4rXFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcXG4ge1xcbiBcXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICppbnZhbGlkX3Nsb3Q7XFxuIFxcdGludCByO1xcbkBAIC0xOTMxLDIwICsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4gXFx0fVxcbiBcXG4gXFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4tXFx0aWYgKHIpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm9cXG4tXFx0XFx0ICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkXFxuLVxcdFxcdCAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzb1xcbi1cXHRcXHQgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcXG4tXFx0XFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuLVxcdFxcdFxcdGtmcmVlKGludmFsaWRfc2xvdCk7XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbi1cXHRcXHR9XFxuLVxcdFxcdHJldHVybiByO1xcbitcXHRpZiAocilcXG4rXFx0XFx0Z290byBlcnI7XFxuK1xcbitcXHRpZiAobmV3IFxcdTAwMjZcXHUwMDI2IG5ldy1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XFxuK1xcdFxcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxcbitcXHRcXHRcXHRnb3RvIGVycl9iaW5kO1xcbitcXG4rXFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG4rXFx0XFx0aWYgKHIpXFxuK1xcdFxcdFxcdGdvdG8gZXJyX2JpbmQ7XFxuIFxcdH1cXG4gXFxuIFxcdC8qXFxuQEAgLTE5NzcsNiArMTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcdGt2bV9jb21taXRfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xcbiBcXG4gXFx0cmV0dXJuIDA7XFxuK1xcbitlcnJfYmluZDpcXG4rXFx0aWYgKG5ldykge1xcbitcXHRcXHRrdm1fYXJjaF9mcmVlX21lbXNsb3Qoa3ZtLCBuZXcpO1xcbitcXG4rXFx0XFx0aWYgKG5ldy1cXHUwMDNlZGlydHlfYml0bWFwIFxcdTAwMjZcXHUwMDI2ICghb2xkIHx8ICFvbGQtXFx1MDAzZWRpcnR5X2JpdG1hcCkpXFxuK1xcdFxcdFxcdGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcChuZXcpO1xcbitcXHR9XFxuK2VycjpcXG4rXFx0LypcXG4rXFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9uc1xcbitcXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cXG4rXFx0ICogQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLlxcbitcXHQgKi9cXG4rXFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbitcXHRcXHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcXG4rXFx0XFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZrdm0tXFx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHI7XFxuIH1cXG4gXFxuIHN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcXG5AQCAtMjA1OCw3ICsyMDc2LDcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbiBcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGt2bS1cXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcXHUwMDNjIG9sZC1cXHUwMDNlbnBhZ2VzKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuIFxcbi1cXHRcXHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTtcXG4rXFx0XFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xcbiBcXHR9XFxuIFxcbiBcXHRiYXNlX2dmbiA9IChtZW0tXFx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG5AQCAtMjEwNSwyMSArMjEyMywxNCBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcdG5ldy1cXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xcbiBcXHRuZXctXFx1MDAzZWZsYWdzID0gbWVtLVxcdTAwM2VmbGFncztcXG4gXFx0bmV3LVxcdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cXHUwMDNldXNlcnNwYWNlX2FkZHI7XFxuLVxcdGlmIChtZW0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xcbi1cXHRcXHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgbWVtLVxcdTAwM2VndWVzdF9tZW1mZCwgbWVtLVxcdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xcbi1cXHRcXHRpZiAocilcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4gXFxuLVxcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4rXFx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXFxuK1xcdFxcdFxcdCAgICBtZW0tXFx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXFx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XFxuIFxcdGlmIChyKVxcbi1cXHRcXHRnb3RvIG91dF91bmJpbmQ7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIFxcbi1vdXRfdW5iaW5kOlxcbi1cXHRpZiAobWVtLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXFxuLVxcdFxcdGt2bV9nbWVtX3VuYmluZChuZXcpO1xcbiBvdXQ6XFxuIFxcdGtmcmVlKG5ldyk7XFxuIFxcdHJldHVybiByO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDozMy4zNjkzNzMzNDZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjI2ODM0NzM3MTk3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiS1ZNX0lOVEVMXCIsXG4gICAgXCJLVk1fQU1EXCIsXG4gICAgXCJLVk1fR1VFU1RfTUVNRkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9iaW5kXCIsXG4gICAgXCJrdm1fc2V0X21lbXNsb3RcIixcbiAgICBcImt2bV9zZXRfbWVtb3J5X3JlZ2lvblwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1zbG90IG1hbmFnZW1lbnQgYW5kIGd1ZXN0X21lbWZkIGJpbmRpbmcgbG9naWMsIG1vdmluZyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpIHVuZGVyIHNsb3RzX2FyY2hfbG9jaywgYWRkaW5nIGVycm9yIGhhbmRsaW5nIGFuZCByb2xsYmFjayBmb3IgeGFfc3RvcmVfcmFuZ2UoKSwgYW5kIGludHJvZHVjaW5nIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucyBhbmQgZXJyb3IgcGF0aHMuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEtWTSBtZW1vcnkgcmVnaW9uIGlvY3RscyBhbmQgd2FycmFudHMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBmYmY5NTkxNmQ2YjE5ZGMxNzZiM2IwZTkwNGUyZjE1ZWM0NWVkZmMwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgNSAwOToxNDozMCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCBiNTk2NDg2ZDE4NGNhLi42YzhkZjY3MzgyZmNlIDEwMDY0NFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuKysrIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuQEAgLTYxMiwxMCArNjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiBcdGludCByID0gLUVJTlZBTDtcbitcdHZvaWQgKnhhcjtcbiBcbiBcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcbiBcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVx1MDAzZWdtZW0ucGdvZmYpKTtcbiBcbitcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4gXHRmaWxlID0gZmdldChmZCk7XG4gXHRpZiAoIWZpbGUpXG4gXHRcdHJldHVybiAtRUJBREY7XG5AQCAtNjQ5LDEyICs2NTMsMjAgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbiBcdCAqIGlzIG5vdCB2aXNpYmxlIHlldCwga3ZtX2dtZW1fZ2V0X3BmbigpIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBmaWxlLlxuIFx0ICovXG4tXHRXUklURV9PTkNFKHNsb3QtXHUwMDNlZ21lbS5maWxlLCBmaWxlKTtcbitcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiBcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiBcbi1cdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbitcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbitcbitcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbitcdGlmIChyKSB7XG4rXHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbitcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuK1x0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuK1x0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbitcdH1cbiBcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiBcbiBcdC8qXG5AQCAtNjYyLDcgKzY3NCw2IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICdyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXG4gXHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cbiBcdCAqL1xuLVx0ciA9IDA7XG4gZXJyOlxuIFx0ZnB1dChmaWxlKTtcbiBcdHJldHVybiByO1xuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2t2bV9tYWluLmMgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXG5pbmRleCA2NWViMjZhMDUyMGQ4Li4yMWMxMGNiYmFjNjYxIDEwMDY0NFxuLS0tIGEvdmlydC9rdm0va3ZtX21haW4uY1xuKysrIGIvdmlydC9rdm0va3ZtX21haW4uY1xuQEAgLTE4ODcsNyArMTg4Nyw4IEBAIHN0YXRpYyB2b2lkIGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXG4tXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSlcbitcdFx0XHQgICBlbnVtIGt2bV9tcl9jaGFuZ2UgY2hhbmdlLFxuK1x0XHRcdCAgIHVuc2lnbmVkIGludCBnbWVtX2ZkLCB1b2ZmX3QgZ21lbV9vZmZzZXQpXG4ge1xuIFx0c3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqaW52YWxpZF9zbG90O1xuIFx0aW50IHI7XG5AQCAtMTkzMSwyMCArMTkzMiwxNiBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHR9XG4gXG4gXHRyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuLVx0aWYgKHIpIHtcbi1cdFx0Lypcbi1cdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm9cbi1cdFx0ICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkXG4tXHRcdCAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzb1xuLVx0XHQgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbi1cdFx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbi1cdFx0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbi1cdFx0fVxuLVx0XHRyZXR1cm4gcjtcbitcdGlmIChyKVxuK1x0XHRnb3RvIGVycjtcbitcbitcdGlmIChuZXcgXHUwMDI2XHUwMDI2IG5ldy1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xuK1x0XHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcbitcdFx0XHRnb3RvIGVycl9iaW5kO1xuK1xuK1x0XHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpO1xuK1x0XHRpZiAocilcbitcdFx0XHRnb3RvIGVycl9iaW5kO1xuIFx0fVxuIFxuIFx0LypcbkBAIC0xOTc3LDYgKzE5NzQsMjcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0a3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4gXG4gXHRyZXR1cm4gMDtcbitcbitlcnJfYmluZDpcbitcdGlmIChuZXcpIHtcbitcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbitcbitcdFx0aWYgKG5ldy1cdTAwM2VkaXJ0eV9iaXRtYXAgXHUwMDI2XHUwMDI2ICghb2xkIHx8ICFvbGQtXHUwMDNlZGlydHlfYml0bWFwKSlcbitcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbitcdH1cbitlcnI6XG4rXHQvKlxuK1x0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9uc1xuK1x0ICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuXG4rXHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4rXHQgKi9cbitcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbitcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4rXHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4rXHR9IGVsc2Uge1xuK1x0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4rXHR9XG4rXHRyZXR1cm4gcjtcbiB9XG4gXG4gc3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLFxuQEAgLTIwNTgsNyArMjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0aWYgKFdBUk5fT05fT05DRShrdm0tXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcdTAwM2Mgb2xkLVx1MDAzZW5wYWdlcykpXG4gXHRcdFx0cmV0dXJuIC1FSU87XG4gXG4tXHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUpO1xuK1x0XHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFLCAtMSwgMCk7XG4gXHR9XG4gXG4gXHRiYXNlX2dmbiA9IChtZW0tXHUwMDNlZ3Vlc3RfcGh5c19hZGRyIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbkBAIC0yMTA1LDIxICsyMTIzLDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbiBcdG5ldy1cdTAwM2VucGFnZXMgPSBucGFnZXM7XG4gXHRuZXctXHUwMDNlZmxhZ3MgPSBtZW0tXHUwMDNlZmxhZ3M7XG4gXHRuZXctXHUwMDNldXNlcnNwYWNlX2FkZHIgPSBtZW0tXHUwMDNldXNlcnNwYWNlX2FkZHI7XG4tXHRpZiAobWVtLVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XG4tXHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmQsIG1lbS1cdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xuLVx0XHRpZiAocilcbi1cdFx0XHRnb3RvIG91dDtcbi1cdH1cbiBcbi1cdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbitcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxuK1x0XHRcdCAgICBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmQsIG1lbS1cdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xuIFx0aWYgKHIpXG4tXHRcdGdvdG8gb3V0X3VuYmluZDtcbitcdFx0Z290byBvdXQ7XG4gXG4gXHRyZXR1cm4gMDtcbiBcbi1vdXRfdW5iaW5kOlxuLVx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRClcbi1cdFx0a3ZtX2dtZW1fdW5iaW5kKG5ldyk7XG4gb3V0OlxuIFx0a2ZyZWUobmV3KTtcbiBcdHJldHVybiByO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6MzMuMzY5Mzc1MjQ2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjI3NzQ3OTczNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipQYXRjaCBBbmFseXNpcyBcdTAwMjYgRnV6emluZyBTdHJhdGVneSoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgXCJJcyB0aGlzIGZ1enotd29ydGh5P1wiIEkgbmVlZCB0byBxdWlja2x5IGFzc2VzcyB0aGUgcG90ZW50aWFsIGltcGFjdCBhbmQgaWRlbnRpZnkgdGhlIG1vc3QgcHJvbWlzaW5nIGFyZWFzIGZvciBmdXp6aW5nLiBHaXZlbiBteSBleHBlcnRpc2UsIEknbGwgYmUgbG9va2luZyBmb3IgYW55IHNpZ25zIG9mIG1lbW9yeSBzYWZldHkgdnVsbmVyYWJpbGl0aWVzIG9yIGxvZ2ljIGZsYXdzIHRoYXQgY291bGQgYmUgZXhwbG9pdGVkLlxuXG5GaXJzdCwgSSBzZWUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIGdvb2QsIHRoYXQncyB3aGF0IEknbSBjb21mb3J0YWJsZSB3aXRoLiBOb3csIHRoZSBmaWxlcyBtb2RpZmllZCBqdW1wIG91dCBhdCBtZTogYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGFuZCBgdmlydC9rdm0va3ZtX21haW4uY2AuIEludGVyZXN0aW5nLiBLZXJuZWwgVmlydHVhbCBNYWNoaW5lIChLVk0pIGNvZGUg4oCTIGRlZmluaXRlbHkgd29ydGggYSBjbG9zZXIgbG9vay4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGJlZW4gY2hhbmdlZCBpbiB0aGVzZSBmaWxlcyBhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIFRpbWUgdG8gcHVsbCB1cCBteSB0cnVzdHkgdG9vbHMgYW5kIGdldCBhIGRldGFpbGVkIGxvb2sgYXQgdGhlIHBhdGNoIGNvbnRlbnRzLiBJJ2xsIGJlIHNjcnV0aW5pemluZyB0aG9zZSBjb2RlIHNuaXBwZXRzIHRvIG1hcCBvdXQgdGhlIGF0dGFjayBzdXJmYWNlIGFuZCB0aGluayBzdHJhdGVnaWNhbGx5LiBJJ2xsIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcmlnaHQgZm9jdXMgc3ltYm9scyBhbmQgY29uZmlncyB0byBtYXhpbWl6ZSBvdXIgZnV6emluZyBlZmZvcnRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0Nzk5LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDozOS42NDY4NTg4MzNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUzMDYyNzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiS1ZNX01FTV9HVUVTVF9NRU1GRFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJ2aXJ0L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jPTYwNj1pbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1MS1cXHQvKlxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjUyOlxcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1My1cXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz05MzY9c3RhdGljIHZvaWQga3ZtX2ZyZWVfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QpXFxudmlydC9rdm0va3ZtX21haW4uYy05Mzcte1xcbnZpcnQva3ZtL2t2bV9tYWluLmM6OTM4OlxcdGlmIChzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXFxudmlydC9rdm0va3ZtX21haW4uYy05MzktXFx0XFx0a3ZtX2dtZW1fdW5iaW5kKHNsb3QpO1xcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz0xNTc0PXN0YXRpYyBpbnQgY2hlY2tfbWVtb3J5X3JlZ2lvbl9mbGFncyhzdHJ1Y3Qga3ZtICprdm0sXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE1NzktXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkpXFxudmlydC9rdm0va3ZtX21haW4uYzoxNTgwOlxcdFxcdHZhbGlkX2ZsYWdzIHw9IEtWTV9NRU1fR1VFU1RfTUVNRkQ7XFxudmlydC9rdm0va3ZtX21haW4uYy0xNTgxLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU4Mi1cXHQvKiBEaXJ0eSBsb2dnaW5nIHByaXZhdGUgbWVtb3J5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiAqL1xcbnZpcnQva3ZtL2t2bV9tYWluLmM6MTU4MzpcXHRpZiAobWVtLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXFxudmlydC9rdm0va3ZtX21haW4uYy0xNTg0LVxcdFxcdHZhbGlkX2ZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNX0xPR19ESVJUWV9QQUdFUztcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU5MS1cXHRpZiAoa3ZtX2FyY2hfaGFzX3JlYWRvbmx5X21lbShrdm0pIFxcdTAwMjZcXHUwMDI2XFxudmlydC9rdm0va3ZtX21haW4uYzoxNTkyOlxcdCAgICAhKG1lbS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSlcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE1OTMtXFx0XFx0dmFsaWRfZmxhZ3MgfD0gS1ZNX01FTV9SRUFET05MWTtcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmM9MTY5Nz1zdGF0aWMgdm9pZCBrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0xNzMzLVxcdFxcdCAqL1xcbnZpcnQva3ZtL2t2bV9tYWluLmM6MTczNDpcXHRcXHRXQVJOX09OX09OQ0Uob2xkLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpO1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTczNS1cXHRcXHRmYWxsdGhyb3VnaDtcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTc0OS1cXHRcXHQgKi9cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE3NTA6XFx0XFx0aWYgKFdBUk5fT05fT05DRShvbGQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkpXFxudmlydC9rdm0va3ZtX21haW4uYy0xNzUxLVxcdFxcdFxcdGt2bV9nbWVtX3VuYmluZChvbGQpO1xcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz0xODg3PXN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTkzNy1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE5Mzg6XFx0aWYgKG5ldyBcXHUwMDI2XFx1MDAyNiBuZXctXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTkzOS1cXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmM9MjAxMz1zdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwNDQtXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxudmlydC9rdm0va3ZtX21haW4uYzoyMDQ1OlxcdGlmIChtZW0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCBcXHUwMDI2XFx1MDAyNlxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA0Ni1cXHQgICAgKG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0IFxcdTAwMjYgKFBBR0VfU0laRSAtIDEpIHx8XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwOTUtXFx0XFx0LyogUHJpdmF0ZSBtZW1zbG90cyBhcmUgaW1tdXRhYmxlLCB0aGV5IGNhbiBvbmx5IGJlIGRlbGV0ZWQuICovXFxudmlydC9rdm0va3ZtX21haW4uYzoyMDk2OlxcdFxcdGlmIChtZW0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRClcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwOTctXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwOTktXFx0XFx0ICAgIChucGFnZXMgIT0gb2xkLVxcdTAwM2VucGFnZXMpIHx8XFxudmlydC9rdm0va3ZtX21haW4uYzoyMTAwOlxcdFxcdCAgICAoKG1lbS1cXHUwMDNlZmxhZ3MgXiBvbGQtXFx1MDAzZWZsYWdzKSBcXHUwMDI2IChLVk1fTUVNX1JFQURPTkxZIHwgS1ZNX01FTV9HVUVTVF9NRU1GRCkpKVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjEwMS1cXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6MzkuNjkyMTcwOTkyWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgwODk5MDE4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIHRoZSBLVk0gQ29kZSoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGNoYW5nZXMgcmVsYXRlZCB0byB0aGVzZSBtZW1mZCB1cGRhdGVzIHdpdGhpbiB0aGUgS1ZNIHN1YnN5c3RlbS4gVGhlIHBhdGNoIG1lbnRpb25zIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhbmQgYHZpcnQva3ZtL2t2bV9tYWluLmNgIGFyb3VuZCB0aGUgbW9kaWZpZWQgbGluZXMuIFJpZ2h0LCB0aGF0IG1ha2VzIHNlbnNlLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBndWVzdCBtZW1vcnkgYW5kIG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIGludGVyYWN0IHdpdGhpbiBLVk0sIGFuZCBob3cgdGhlIGNvcmUgS1ZNIGxvZ2ljIGhhbmRsZXMgdGhpcy4gVGltZSB0byBkaWcgaW4gYW5kIGNyb3NzLXJlZmVyZW5jZSB0aGUgcmVsZXZhbnQgY29kZSBibG9ja3MuIExldCdzIHNlZSBob3cgdGhlc2UgcGFydGljdWxhciBmaWxlcyBpbmZsdWVuY2UgdGhlIG92ZXJhbGwgYXJjaGl0ZWN0dXJlIGhlcmUuIFRoaXMgd2lsbCBiZSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bGwgaW1wbGljYXRpb25zIG9mIHRoaXMgY2hhbmdlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NDYyLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDEuNTAxMTY1NTAzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY2NjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjA1LFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjA1OlxcdFxcbiA2MDY6XFx0aW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiA2MDc6XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXFxuIDYwODpcXHR7XFxuIDYwOTpcXHRcXHR1b2ZmX3Qgc2l6ZSA9IHNsb3QtXFx1MDAzZW5wYWdlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbiA2MTA6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCwgZW5kO1xcbiA2MTE6XFx0XFx0c3RydWN0IGdtZW1fZmlsZSAqZjtcXG4gNjEyOlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIDYxMzpcXHRcXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcXG4gNjE0OlxcdFxcdGludCByID0gLUVJTlZBTDtcXG4gNjE1OlxcdFxcdHZvaWQgKnhhcjtcXG4gNjE2OlxcdFxcbiA2MTc6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpO1xcbiA2MTg6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihnZm5fdCkgIT0gc2l6ZW9mKHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYpKTtcXG4gNjE5OlxcdFxcbiA2MjA6XFx0XFx0aWYgKFdBUk5fT05fT05DRShzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXFxuIDYyMTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjIyOlxcdFxcbiA2MjM6XFx0XFx0ZmlsZSA9IGZnZXQoZmQpO1xcbiA2MjQ6XFx0XFx0aWYgKCFmaWxlKVxcbiA2MjU6XFx0XFx0XFx0cmV0dXJuIC1FQkFERjtcXG4gNjI2OlxcdFxcbiA2Mjc6XFx0XFx0aWYgKGZpbGUtXFx1MDAzZWZfb3AgIT0gXFx1MDAyNmt2bV9nbWVtX2ZvcHMpXFxuIDYyODpcXHRcXHRcXHRnb3RvIGVycjtcXG4gNjI5OlxcdFxcbiA2MzA6XFx0XFx0ZiA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gNjMxOlxcdFxcdGlmIChmLVxcdTAwM2Vrdm0gIT0ga3ZtKVxcbiA2MzI6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYzMzpcXHRcXG4gNjM0OlxcdFxcdGlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4gNjM1OlxcdFxcbiA2MzY6XFx0XFx0aWYgKCFQQUdFX0FMSUdORUQob2Zmc2V0KSB8fCBvZmZzZXQgKyBzaXplIFxcdTAwM2UgaV9zaXplX3JlYWQoaW5vZGUpKVxcbiA2Mzc6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYzODpcXHRcXG4gNjM5OlxcdFxcdGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NDA6XFx0XFxuIDY0MTpcXHRcXHRzdGFydCA9IG9mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiA2NDI6XFx0XFx0ZW5kID0gc3RhcnQgKyBzbG90LVxcdTAwM2VucGFnZXM7XFxuIDY0MzpcXHRcXG4gNjQ0OlxcdFxcdGlmICgheGFfZW1wdHkoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzKSBcXHUwMDI2XFx1MDAyNlxcbiA2NDU6XFx0XFx0ICAgIHhhX2ZpbmQoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBcXHUwMDI2c3RhcnQsIGVuZCAtIDEsIFhBX1BSRVNFTlQpKSB7XFxuIDY0NjpcXHRcXHRcXHRyID0gLUVFWElTVDtcXG4gNjQ3OlxcdFxcdFxcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuIDY0ODpcXHRcXHRcXHRnb3RvIGVycjtcXG4gNjQ5OlxcdFxcdH1cXG4gNjUwOlxcdFxcbiA2NTE6XFx0XFx0LypcXG4gNjUyOlxcdFxcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cXG4gNjUzOlxcdFxcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XFxuIDY1NDpcXHRcXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4gNjU1OlxcdFxcdCAqL1xcbiA2NTY6XFx0XFx0c2xvdC1cXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcXG4gNjU3OlxcdFxcdHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcXG4gNjU4OlxcdFxcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcXG4gNjU5OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcXG4gNjYwOlxcdFxcbiA2NjE6XFx0XFx0eGFyID0geGFfc3RvcmVfcmFuZ2UoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XFxuIDY2MjpcXHRcXG4gNjYzOlxcdFxcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4gNjY0OlxcdFxcdGlmIChyKSB7XFxuIDY2NTpcXHRcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4gNjY2OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuIDY2NzpcXHRcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gMDtcXG4gNjY4OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY2OTpcXHRcXHR9XFxuIDY3MDpcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NzE6XFx0XFxuIDY3MjpcXHRcXHQvKlxcbiA2NzM6XFx0XFx0ICogRHJvcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBmaWxlLCBldmVuIG9uIHN1Y2Nlc3MuICBUaGUgZmlsZSBwaW5zIEtWTSxcXG4gNjc0OlxcdFxcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICdyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXFxuIDY3NTpcXHRcXHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cXG4gNjc2OlxcdFxcdCAqL1xcbiA2Nzc6XFx0ZXJyOlxcbiA2Nzg6XFx0XFx0ZnB1dChmaWxlKTtcXG4gNjc5OlxcdFxcdHJldHVybiByO1xcbiA2ODA6XFx0fVxcbiA2ODE6XFx0XFxuIDY4MjpcXHRzdGF0aWMgdm9pZCBfX2t2bV9nbWVtX3VuYmluZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBzdHJ1Y3QgZ21lbV9maWxlICpmKVxcbiA2ODM6XFx0e1xcbiA2ODQ6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCA9IHNsb3QtXFx1MDAzZWdtZW0ucGdvZmY7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjQxLjUwMTMzNTExMloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMTIwNDQ1MjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipEaWdnaW5nIGludG8gTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKipcblxuT2theSwgc28gd2UgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtZW1vcnkgcmVnaW9ucyBhcmUgYmVpbmcgc2V0IHVwIGFuZCBtYW5hZ2VkIHdpdGhpbiBLVk0uIE15IGZpcnN0IGluc3RpbmN0IGlzIHRvIHplcm8gaW4gb24gYHZpcnQva3ZtL2t2bV9tYWluLmNgIGJlY2F1c2UgdGhhdCdzIHVzdWFsbHkgdGhlIGhlYXJ0IG9mIHRoZSBjb3JlIEtWTSBsb2dpYy4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGludGVyYWN0aW9ucyBhcm91bmQgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLiBUaGVzZSBmdW5jdGlvbnMgYXJlIGdvaW5nIHRvIGJlIGNyaXRpY2FsIGZvciB0cmFja2luZyBob3cgbWVtb3J5IGlzIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQgcG90ZW50aWFsbHkgcmVtYXBwZWQgd2l0aGluIHRoZSBndWVzdCdzIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4gSSdsbCBuZWVkIHRvIHNlZSBob3cgdGhlIGhvc3QgbWFwcyB0aGUgZ3Vlc3QncyBwaHlzaWNhbCBtZW1vcnksIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgaHlwZXJ2aXNvcidzIHZpZXcgYW5kIHRoZSBoYXJkd2FyZS4gTGV0J3Mgc2VlIGhvdyB0aGVzZSBhcmUgY2FsbGVkLCB3aGF0IGRhdGEgc3RydWN0dXJlcyB0aGV5IG1hbmlwdWxhdGUsIGFuZCB3aGF0IGltcGxpY2F0aW9ucyB0aG9zZSBtYW5pcHVsYXRpb25zIGhhdmUgb24gdGhlIG92ZXJhbGwgbWVtb3J5IG9yZ2FuaXphdGlvbi4gSG9wZWZ1bGx5LCBsb29raW5nIGF0IHRoZXNlIGZ1bmN0aW9ucyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGlzIGhhbmRsZWQgYXQgdGhlIEtWTSBsZXZlbCwgZXNwZWNpYWxseSB3aGVuIGNvbnNpZGVyaW5nIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGhvdHBsdWdnaW5nIHNjZW5hcmlvcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzk2MiwiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDMuODEzMzgyODk0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzE1MjY5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTg4MCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE4ODA6XFx0XFx0ICogYW4gaW50ZXJtZWRpYXRlIHN0ZXAuIEluc3RlYWQsIHRoZSBvbGQgbWVtc2xvdCBpcyBzaW1wbHkgcmVwbGFjZWRcXG4xODgxOlxcdFxcdCAqIHdpdGggYSBuZXcsIHVwZGF0ZWQgY29weSBpbiBib3RoIG1lbXNsb3Qgc2V0cy5cXG4xODgyOlxcdFxcdCAqL1xcbjE4ODM6XFx0XFx0a3ZtX3JlcGxhY2VfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcXG4xODg0OlxcdFxcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgb2xkLCBuZXcpO1xcbjE4ODU6XFx0fVxcbjE4ODY6XFx0XFxuMTg4NzpcXHRzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuMTg4ODpcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXFxuMTg4OTpcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXFxuMTg5MDpcXHRcXHRcXHRcXHQgICBlbnVtIGt2bV9tcl9jaGFuZ2UgY2hhbmdlLFxcbjE4OTE6XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcXG4xODkyOlxcdHtcXG4xODkzOlxcdFxcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDtcXG4xODk0OlxcdFxcdGludCByO1xcbjE4OTU6XFx0XFxuMTg5NjpcXHRcXHQvKlxcbjE4OTc6XFx0XFx0ICogUmVsZWFzZWQgaW4ga3ZtX3N3YXBfYWN0aXZlX21lbXNsb3RzKCkuXFxuMTg5ODpcXHRcXHQgKlxcbjE4OTk6XFx0XFx0ICogTXVzdCBiZSBoZWxkIGZyb20gYmVmb3JlIHRoZSBjdXJyZW50IG1lbXNsb3RzIGFyZSBjb3BpZWQgdW50aWwgYWZ0ZXJcXG4xOTAwOlxcdFxcdCAqIHRoZSBuZXcgbWVtc2xvdHMgYXJlIGluc3RhbGxlZCB3aXRoIHJjdV9hc3NpZ25fcG9pbnRlciwgdGhlblxcbjE5MDE6XFx0XFx0ICogcmVsZWFzZWQgYmVmb3JlIHRoZSBzeW5jaHJvbml6ZSBzcmN1IGluIGt2bV9zd2FwX2FjdGl2ZV9tZW1zbG90cygpLlxcbjE5MDI6XFx0XFx0ICpcXG4xOTAzOlxcdFxcdCAqIFdoZW4gbW9kaWZ5aW5nIG1lbXNsb3RzIG91dHNpZGUgb2YgdGhlIHNsb3RzX2xvY2ssIG11c3QgYmUgaGVsZFxcbjE5MDQ6XFx0XFx0ICogYmVmb3JlIHJlYWRpbmcgdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWVtc2xvdHMgdW50aWwgYWZ0ZXIgYWxsXFxuMTkwNTpcXHRcXHQgKiBjaGFuZ2VzIHRvIHRob3NlIG1lbXNsb3RzIGFyZSBjb21wbGV0ZS5cXG4xOTA2OlxcdFxcdCAqXFxuMTkwNzpcXHRcXHQgKiBUaGVzZSBydWxlcyBlbnN1cmUgdGhhdCBpbnN0YWxsaW5nIG5ldyBtZW1zbG90cyBkb2VzIG5vdCBsb3NlXFxuMTkwODpcXHRcXHQgKiBjaGFuZ2VzIG1hZGUgdG8gdGhlIHByZXZpb3VzIG1lbXNsb3RzLlxcbjE5MDk6XFx0XFx0ICovXFxuMTkxMDpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZrdm0tXFx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XFxuMTkxMTpcXHRcXG4xOTEyOlxcdFxcdC8qXFxuMTkxMzpcXHRcXHQgKiBJbnZhbGlkYXRlIHRoZSBvbGQgc2xvdCBpZiBpdCdzIGJlaW5nIGRlbGV0ZWQgb3IgbW92ZWQuICBUaGlzIGlzXFxuMTkxNDpcXHRcXHQgKiBkb25lIHByaW9yIHRvIGFjdHVhbGx5IGRlbGV0aW5nL21vdmluZyB0aGUgbWVtc2xvdCB0byBhbGxvdyB2Q1BVcyB0b1xcbjE5MTU6XFx0XFx0ICogY29udGludWUgcnVubmluZyBieSBlbnN1cmluZyB0aGVyZSBhcmUgbm8gbWFwcGluZ3Mgb3Igc2hhZG93IHBhZ2VzXFxuMTkxNjpcXHRcXHQgKiBmb3IgdGhlIG1lbXNsb3Qgd2hlbiBpdCBpcyBkZWxldGVkL21vdmVkLiAgV2l0aG91dCBwcmUtaW52YWxpZGF0aW9uXFxuMTkxNzpcXHRcXHQgKiAoYW5kIHdpdGhvdXQgYSBsb2NrKSwgYSB3aW5kb3cgd291bGQgZXhpc3QgYmV0d2VlbiBlZmZlY3RpbmcgdGhlXFxuMTkxODpcXHRcXHQgKiBkZWxldGUvbW92ZSBhbmQgY29tbWl0dGluZyB0aGUgY2hhbmdlcyBpbiBhcmNoIGNvZGUgd2hlcmUgS1ZNIG9yIGFcXG4xOTE5OlxcdFxcdCAqIGd1ZXN0IGNvdWxkIGFjY2VzcyBhIG5vbi1leGlzdGVudCBtZW1zbG90LlxcbjE5MjA6XFx0XFx0ICpcXG4xOTIxOlxcdFxcdCAqIE1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgb24gYSB0ZW1wb3JhcnksIHVucmVhY2hhYmxlIHNsb3QuICBUaGUgb2xkXFxuMTkyMjpcXHRcXHQgKiBzbG90IG5lZWRzIHRvIGJlIHByZXNlcnZlZCBpbiBjYXNlIGEgbGF0ZXIgc3RlcCBmYWlscyBhbmQgdGhlXFxuMTkyMzpcXHRcXHQgKiBpbnZhbGlkYXRpb24gbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQuXFxuMTkyNDpcXHRcXHQgKi9cXG4xOTI1OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcXG4xOTI2OlxcdFxcdFxcdGludmFsaWRfc2xvdCA9IGt6YWxsb2Nfb2JqKCppbnZhbGlkX3Nsb3QsIEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuMTkyNzpcXHRcXHRcXHRpZiAoIWludmFsaWRfc2xvdCkge1xcbjE5Mjg6XFx0XFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZrdm0tXFx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XFxuMTkyOTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4xOTMwOlxcdFxcdFxcdH1cXG4xOTMxOlxcdFxcdFxcdGt2bV9pbnZhbGlkYXRlX21lbXNsb3Qoa3ZtLCBvbGQsIGludmFsaWRfc2xvdCk7XFxuMTkzMjpcXHRcXHR9XFxuMTkzMzpcXHRcXG4xOTM0OlxcdFxcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XFxuMTkzNTpcXHRcXHRpZiAocilcXG4xOTM2OlxcdFxcdFxcdGdvdG8gZXJyO1xcbjE5Mzc6XFx0XFxuMTkzODpcXHRcXHRpZiAobmV3IFxcdTAwMjZcXHUwMDI2IG5ldy1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XFxuMTkzOTpcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcXG4xOTQwOlxcdFxcdFxcdFxcdGdvdG8gZXJyX2JpbmQ7XFxuMTk0MTpcXHRcXG4xOTQyOlxcdFxcdFxcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XFxuMTk0MzpcXHRcXHRcXHRpZiAocilcXG4xOTQ0OlxcdFxcdFxcdFxcdGdvdG8gZXJyX2JpbmQ7XFxuMTk0NTpcXHRcXHR9XFxuMTk0NjpcXHRcXG4xOTQ3OlxcdFxcdC8qXFxuMTk0ODpcXHRcXHQgKiBGb3IgREVMRVRFIGFuZCBNT1ZFLCB0aGUgd29ya2luZyBzbG90IGlzIG5vdyBhY3RpdmUgYXMgdGhlIElOVkFMSURcXG4xOTQ5OlxcdFxcdCAqIHZlcnNpb24gb2YgdGhlIG9sZCBzbG90LiAgTU9WRSBpcyBwYXJ0aWN1bGFybHkgc3BlY2lhbCBhcyBpdCByZXVzZXNcXG4xOTUwOlxcdFxcdCAqIHRoZSBvbGQgc2xvdCBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9sZCBzbG90IChpbiB3b3JraW5nX3Nsb3QpLlxcbjE5NTE6XFx0XFx0ICogRm9yIENSRUFURSwgdGhlcmUgaXMgbm8gb2xkIHNsb3QuICBGb3IgREVMRVRFIGFuZCBGTEFHU19PTkxZLCB0aGVcXG4xOTUyOlxcdFxcdCAqIG9sZCBzbG90IGlzIGRldGFjaGVkIGJ1dCBvdGhlcndpc2UgcHJlc2VydmVkLlxcbjE5NTM6XFx0XFx0ICovXFxuMTk1NDpcXHRcXHRpZiAoY2hhbmdlID09IEtWTV9NUl9DUkVBVEUpXFxuMTk1NTpcXHRcXHRcXHRrdm1fY3JlYXRlX21lbXNsb3Qoa3ZtLCBuZXcpO1xcbjE5NTY6XFx0XFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUpXFxuMTk1NzpcXHRcXHRcXHRrdm1fZGVsZXRlX21lbXNsb3Qoa3ZtLCBvbGQsIGludmFsaWRfc2xvdCk7XFxuMTk1ODpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXFxuMTk1OTpcXHRcXHRcXHRrdm1fbW92ZV9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGludmFsaWRfc2xvdCk7XFxuMTk2MDpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0ZMQUdTX09OTFkpXFxuMTk2MTpcXHRcXHRcXHRrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldyk7XFxuMTk2MjpcXHRcXHRlbHNlXFxuMTk2MzpcXHRcXHRcXHRCVUcoKTtcXG4xOTY0OlxcdFxcbjE5NjU6XFx0XFx0LyogRnJlZSB0aGUgdGVtcG9yYXJ5IElOVkFMSUQgc2xvdCB1c2VkIGZvciBERUxFVEUgYW5kIE1PVkUuICovXFxuMTk2NjpcXHRcXHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKVxcbjE5Njc6XFx0XFx0XFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcXG4xOTY4OlxcdFxcbjE5Njk6XFx0XFx0LypcXG4xOTcwOlxcdFxcdCAqIE5vIG5lZWQgdG8gcmVmcmVzaCBuZXctXFx1MDAzZWFyY2gsIGNoYW5nZXMgYWZ0ZXIgZHJvcHBpbmcgc2xvdHNfYXJjaF9sb2NrXFxuMTk3MTpcXHRcXHQgKiB3aWxsIGRpcmVjdGx5IGhpdCB0aGUgZmluYWwsIGFjdGl2ZSBtZW1zbG90LiAgQXJjaGl0ZWN0dXJlcyBhcmVcXG4xOTcyOlxcdFxcdCAqIHJlc3BvbnNpYmxlIGZvciBrbm93aW5nIHRoYXQgbmV3LVxcdTAwM2VhcmNoIG1heSBiZSBzdGFsZS5cXG4xOTczOlxcdFxcdCAqL1xcbjE5NzQ6XFx0XFx0a3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XFxuMTk3NTpcXHRcXG4xOTc2OlxcdFxcdHJldHVybiAwO1xcbjE5Nzc6XFx0XFxuMTk3ODpcXHRlcnJfYmluZDpcXG4xOTc5OlxcdFxcdGlmIChuZXcpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDMuODEzNzAwNTQ1WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjE2NDA2Mjg3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgbXlzZWxmOlxuXG4qKkludmVzdGlnYXRpbmcgS2NvbmZpZyBPcHRpb25zIGZvciBLVk0gYW5kIEd1ZXN0IE1lbW9yeSBGaWxlIERlc2NyaXB0b3JzKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgS1ZNIGFuZCBgZ3Vlc3RfbWVtZmRgIHNpdHVhdGlvbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggS2NvbmZpZyBvcHRpb25zIGFyZSByZWxldmFudCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGBLVk1fR1VFU1RfTUVNRkRgLiBUaGUgb2J2aW91cyBzdGFydGluZyBwb2ludCBpcyB0aGUgS2NvbmZpZyBmaWxlcyB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4gR2l2ZW4gdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGggS1ZNLCB3aGljaCBpcyBoaWdobHkgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCwgSSdsbCBzdGFydCBieSBsb29raW5nIGluIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2Ag4oCTIG1ha2VzIHNlbnNlIHRvIGNoZWNrIHRoZSB4ODYgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gSWYgdGhhdCBkb2Vzbid0IHlpZWxkIGFueXRoaW5nLCBvciBpZiBJIHdhbnQgYSBtb3JlIGdlbmVyYWwgcGVyc3BlY3RpdmUsIEknbGwgZXhwYW5kIHRoZSBzZWFyY2ggYW5kIGxvb2sgaW4gYHZpcnQva3ZtL0tjb25maWdgLiBBIHF1aWNrIGBncmVwYCBmb3IgYEtWTV9HVUVTVF9NRU1GRGAgaW4gYm90aCB0aG9zZSBsb2NhdGlvbnMgc2hvdWxkIHJldmVhbCB0aGUgbmVjZXNzYXJ5IG9wdGlvbnMgYW5kIHRoZWlyIGRlcGVuZGVuY2llcy4gVGhhdCBzaG91bGQgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50IHRvIGFuYWx5emUgd2hhdCBvcHRpb25zIGFyZSBuZWVkZWQsIHRvIGJ1aWxkIG15IHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6OTkzMiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDUuOTc3NzY1NzA5WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MjQ0NzA1OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJLVk1fR1VFU1RfTUVNRkRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYXJjaC94ODYva3ZtXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gveDg2L2t2bS9LY29uZmlnPTIwPWNvbmZpZyBLVk1fWDg2XFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy00OS1cXHRzZWxlY3QgS1ZNX1dFUlJPUiBpZiBXRVJST1JcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo1MDpcXHRzZWxlY3QgS1ZNX0dVRVNUX01FTUZEIGlmIFg4Nl82NFxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTUxLVxcbi0tXFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYz01MTM1PXZvaWQga3ZtX2FyY2hfYXN5bmNfcGFnZV9yZWFkeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fYXN5bmNfcGYgKndvcmspXFxuLS1cXG5hcmNoL3g4Ni9rdm0vbW11L21tdS5jLTUxNjUtXFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYzo1MTY2OiNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUX01FTUZEXFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYy01MTY3LXN0YXRpYyB2b2lkIGt2bV9hc3NlcnRfZ21lbV9pbnZhbGlkYXRlX2xvY2tfaGVsZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90KVxcbi0tXFxuYXJjaC94ODYva3ZtL3g4Ni5jPTEwNjM0PWJvb2wga3ZtX2FyY2hfbm9fcG9sbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuLS1cXG5hcmNoL3g4Ni9rdm0veDg2LmMtMTA2MzgtXFxuYXJjaC94ODYva3ZtL3g4Ni5jOjEwNjM5OiNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUX01FTUZEXFxuYXJjaC94ODYva3ZtL3g4Ni5jLTEwNjQwLS8qXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjQ2LjA0MDIxODMyOFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNzA0MzM0MjMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipJbnZlc3RpZ2F0aW5nIEtWTV9HVUVTVF9NRU1GRCBpbiB0aGUgS2NvbmZpZyBDb250ZXh0KipcblxuT2theSwgc28gSSdtIHRoaW5raW5nLCBiZXlvbmQgd2hhdCB3ZSd2ZSBhbHJlYWR5IGxvb2tlZCBhdCwgd2UgbmVlZCB0byBzcGVjaWZpY2FsbHkgc2VhcmNoIGZvciBgS1ZNX0dVRVNUX01FTUZEYCB3aXRoaW4gdGhlIGB2aXJ0L2t2bS9LY29uZmlnYCBmaWxlLiBHaXZlbiBteSBleHBlcnRpc2UsIEkgc3VzcGVjdCB0aGlzIGlzIHdoZXJlIHRoZSBtYWluIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHJlbGF0ZWQgdG8gZ3Vlc3QgbWVtb3J5IGZpbGUgZGVzY3JpcHRvcnMgd2lsbCBiZSBkZWZpbmVkLCBvciBhdCBsZWFzdCBoYXZlIGl0cyBkZXBlbmRlbmNpZXMgY2xlYXJseSBsYWlkIG91dC4gVGhpcyB3aWxsIHByb3ZpZGUgdmFsdWFibGUgY29udGV4dCBpbiB1bmRlcnN0YW5kaW5nIGhvdyBpdOKAmXMgZW5hYmxlZCwgYW55IHByZXJlcXVpc2l0ZXMgaXQgaGFzLCBhbmQgcGVyaGFwcyBzaGVkIGxpZ2h0IG9uIHdoZXJlIGl0cyBmdW5jdGlvbmFsaXR5IGludGVncmF0ZXMgd2l0aGluIHRoZSBicm9hZGVyIEtWTSBmcmFtZXdvcmsuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgdG8gZGV0ZXJtaW5lIGl0J3MgYmVoYXZpb3Igb3IgaG93IGl0IG1pZ2h0IG5lZWQgdG8gYmUgbW9kaWZpZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNjUwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDcuNzQ0NTU1WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MzkxMDM4OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS1ZNX0dVRVNUX01FTUZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQva3ZtXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbi0tXFxudmlydC9rdm0vS2NvbmZpZy0xMDUtXFxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjQ3LjgxODQ5MjY2OFoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODA1ODY5NzIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgS1ZNIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhlIGB2aXJ0L2t2bS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTA2LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgcGFydGljdWxhciBvcHRpb24gaXMgaGFuZGxlZC4gSSBzdXNwZWN0IHdlJ3JlIGxvb2tpbmcgYXQgYSBLY29uZmlnIHN5bWJvbCByZWxhdGVkIHRvIGEgc3BlY2lmaWMgdmlydHVhbGl6YXRpb24gZmVhdHVyZSBvciBkZXZpY2UuIERlcGVuZGluZyBvbiB0aGUgY29udGV4dCBJIG1pZ2h0IGJlIGxvb2tpbmcgZm9yIGRlcGVuZGVuY2llcywgZGVmYXVsdCB2YWx1ZXMsIG9yIHBlcmhhcHMgZXZlbiBjb21tZW50cyBjbGFyaWZ5aW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHRoaXMgb3B0aW9uLiBNeSBnb2FsIGhlcmUgaXMgdG8gZ3Jhc3AgdGhlIGNvbmZpZ3VyYWJpbGl0eSBvZiB0aGlzIHBhcnRpY3VsYXIgYXNwZWN0IG9mIHRoZSBLVk0gc2V0dXAgYW5kIGl0cyBwb3RlbnRpYWwgaW1wYWN0IG9uIHBlcmZvcm1hbmNlIG9yIGZ1bmN0aW9uYWxpdHkuIEkgd2lsbCBwYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8gZGVwZW5kZW5jaWVzIG9uIG90aGVyIGZlYXR1cmVzIG9yIGhhcmR3YXJlLCBsb29raW5nIGZvciBhbnkgZWRnZSBjYXNlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA5NjMsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNDo0OS42MjQzNjYzNTlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogOTUsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgOTU6XFx0ICAgICAgIGJvb2xcXG4gIDk2OlxcdFxcbiAgOTc6XFx0Y29uZmlnIEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcXG4gIDk4OlxcdCAgICAgICBib29sXFxuICA5OTpcXHRcXG4gMTAwOlxcdGNvbmZpZyBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXFxuIDEwMTpcXHQgICAgICAgYm9vbFxcbiAxMDI6XFx0XFxuIDEwMzpcXHRjb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcXG4gMTA0OlxcdCAgICAgICBib29sXFxuIDEwNTpcXHRcXG4gMTA2OlxcdGNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcXG4gMTA3OlxcdCAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuIDEwODpcXHQgICAgICAgYm9vbFxcbiAxMDk6XFx0XFxuIDExMDpcXHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcXG4gMTExOlxcdCAgICAgICBib29sXFxuIDExMjpcXHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG4gMTEzOlxcdFxcbiAxMTQ6XFx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9SRUNMQUlNXFxuIDExNTpcXHQgICAgICAgYm9vbFxcbiAxMTY6XFx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxuIDExNzpcXHRcXG4gMTE4OlxcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fSU5WQUxJREFURVxcbiAxMTk6XFx0ICAgICAgIGJvb2xcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NDkuNjI0NDg0MTQ5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE2OTQyMzI5NDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBLVk0gY29uZmlndXJhdGlvbiByZXF1aXJlbWVudC4gRmlyc3QsIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgS1ZNIG1vZHVsZXMgbmVjZXNzYXJ5LiBTaW5jZSB3ZSdyZSBkZWFsaW5nIHdpdGggeDg2IGFyY2hpdGVjdHVyZSAoc3BlY2lmaWNhbGx5IGFtZDY0KSwgdGhlIHByaW1hcnkgY2FuZGlkYXRlcyBhcmUgKipLVk0qKiwgKipLVk1fSU5URUwqKiwgb3IgKipLVk1fQU1EKiouIFRoZSBgS1ZNX0dVRVNUX01FTUZEYCBtb2R1bGUgYWxzbyBzZWVtcyByZWxldmFudCwgY29uZGl0aW9uYWxseSBzZWxlY3RlZCBieSBgS1ZNX1g4NmAgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBYODZfNjQsIHdoaWNoIGlzIGxpa2VseSBpbiB0aGlzIGNvbnRleHQuIFRvIHZlcmlmeSB0aGlzIGFuZCB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25hbCBsb2dpYyBtb3JlIHRob3JvdWdobHksIEkgc2hvdWxkIGNvbnN1bHQgdGhlIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AgZmlsZS4gVGhhdCdzIHdoZXJlIHRoZSBkZWZpbml0aXZlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyB3aWxsIHJlc2lkZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0OTMsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjUxLjMxODcyMDg2MVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDEzNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiYXJjaC94ODYva3ZtL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuICAgMjpcXHQjXFxuICAgMzpcXHQjIEtWTSBjb25maWd1cmF0aW9uXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdHNvdXJjZSBcXFwidmlydC9rdm0vS2NvbmZpZ1xcXCJcXG4gICA3OlxcdFxcbiAgIDg6XFx0bWVudWNvbmZpZyBWSVJUVUFMSVpBVElPTlxcbiAgIDk6XFx0XFx0Ym9vbCBcXFwiVmlydHVhbGl6YXRpb25cXFwiXFxuICAxMDpcXHRcXHRkZWZhdWx0IHlcXG4gIDExOlxcdFxcdGhlbHBcXG4gIDEyOlxcdFxcdCAgU2F5IFkgaGVyZSB0byBnZXQgdG8gc2VlIG9wdGlvbnMgZm9yIHVzaW5nIHlvdXIgTGludXggaG9zdCB0byBydW4gb3RoZXJcXG4gIDEzOlxcdFxcdCAgb3BlcmF0aW5nIHN5c3RlbXMgaW5zaWRlIHZpcnR1YWwgbWFjaGluZXMgKGd1ZXN0cykuXFxuICAxNDpcXHRcXHQgIFRoaXMgb3B0aW9uIGFsb25lIGRvZXMgbm90IGFkZCBhbnkga2VybmVsIGNvZGUuXFxuICAxNTpcXHRcXG4gIDE2OlxcdFxcdCAgSWYgeW91IHNheSBOLCBhbGwgb3B0aW9ucyBpbiB0aGlzIHN1Ym1lbnUgd2lsbCBiZSBza2lwcGVkIGFuZCBkaXNhYmxlZC5cXG4gIDE3OlxcdFxcbiAgMTg6XFx0aWYgVklSVFVBTElaQVRJT05cXG4gIDE5OlxcdFxcbiAgMjA6XFx0Y29uZmlnIEtWTV9YODZcXG4gIDIxOlxcdFxcdGRlZl90cmlzdGF0ZSBLVk0gaWYgKEtWTV9JTlRFTCAhPSBuIHx8IEtWTV9BTUQgIT0gbilcXG4gIDIyOlxcdFxcdHNlbGVjdCBLVk1fQ09NTU9OXFxuICAyMzpcXHRcXHRzZWxlY3QgS1ZNX0VMSURFX1RMQl9GTFVTSF9JRl9ZT1VOR1xcbiAgMjQ6XFx0XFx0c2VsZWN0IEtWTV9NTVVfTE9DS0xFU1NfQUdJTkdcXG4gIDI1OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9JUlFDSElQXFxuICAyNjpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fUEZOQ0FDSEVcXG4gIDI3OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9ESVJUWV9SSU5HX1RTT1xcbiAgMjg6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX0RJUlRZX1JJTkdfQUNRX1JFTFxcbiAgMjk6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX0lSUV9CWVBBU1NcXG4gIDMwOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9JUlFfUk9VVElOR1xcbiAgMzE6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX1JFQURPTkxZX01FTVxcbiAgMzI6XFx0XFx0c2VsZWN0IFZIT1NUX1RBU0tcXG4gIDMzOlxcdFxcdHNlbGVjdCBLVk1fQVNZTkNfUEZcXG4gIDM0OlxcdFxcdHNlbGVjdCBVU0VSX1JFVFVSTl9OT1RJRklFUlxcbiAgMzU6XFx0XFx0c2VsZWN0IEtWTV9NTUlPXFxuICAzNjpcXHRcXHRzZWxlY3QgU0NIRURfSU5GT1xcbiAgMzc6XFx0XFx0c2VsZWN0IFBFUkZfRVZFTlRTXFxuICAzODpcXHRcXHRzZWxlY3QgR1VFU1RfUEVSRl9FVkVOVFNcXG4gIDM5OlxcdFxcdHNlbGVjdCBQRVJGX0dVRVNUX01FRElBVEVEX1BNVVxcbiAgNDA6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX01TSVxcbiAgNDE6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX0NQVV9SRUxBWF9JTlRFUkNFUFRcXG4gIDQyOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9OT19QT0xMXFxuICA0MzpcXHRcXHRzZWxlY3QgVklSVF9YRkVSX1RPX0dVRVNUX1dPUktcXG4gIDQ0OlxcdFxcdHNlbGVjdCBLVk1fR0VORVJJQ19ESVJUWUxPR19SRUFEX1BST1RFQ1RcXG4gIDQ1OlxcdFxcdHNlbGVjdCBLVk1fVkZJT1xcbiAgNDY6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX1BNX05PVElGSUVSIGlmIFBNXFxuICA0NzpcXHRcXHRzZWxlY3QgS1ZNX0dFTkVSSUNfSEFSRFdBUkVfRU5BQkxJTkdcXG4gIDQ4OlxcdFxcdHNlbGVjdCBLVk1fR0VORVJJQ19QUkVfRkFVTFRfTUVNT1JZXFxuICA0OTpcXHRcXHRzZWxlY3QgS1ZNX1dFUlJPUiBpZiBXRVJST1JcXG4gIDUwOlxcdFxcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkQgaWYgWDg2XzY0XFxuICA1MTpcXHRcXG4gIDUyOlxcdGNvbmZpZyBLVk1cXG4gIDUzOlxcdFxcdHRyaXN0YXRlIFxcXCJLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIChLVk0pIHN1cHBvcnRcXFwiXFxuICA1NDpcXHRcXHRkZXBlbmRzIG9uIFg4Nl9MT0NBTF9BUElDXFxuICA1NTpcXHRcXHRoZWxwXFxuICA1NjpcXHRcXHQgIFN1cHBvcnQgaG9zdGluZyBmdWxseSB2aXJ0dWFsaXplZCBndWVzdCBtYWNoaW5lcyB1c2luZyBoYXJkd2FyZVxcbiAgNTc6XFx0XFx0ICB2aXJ0dWFsaXphdGlvbiBleHRlbnNpb25zLiAgWW91IHdpbGwgbmVlZCBhIGZhaXJseSByZWNlbnRcXG4gIDU4OlxcdFxcdCAgcHJvY2Vzc29yIGVxdWlwcGVkIHdpdGggdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9ucy4gWW91IHdpbGwgYWxzb1xcbiAgNTk6XFx0XFx0ICBuZWVkIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBvZiB0aGUgcHJvY2Vzc29yIG1vZHVsZXMgYmVsb3cuXFxuICA2MDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NTEuMzE4ODIzOTgxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU4NTA0NDI5NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBLVk0gR3Vlc3QgTWVtb3J5IEZpbGUgRGVzY3JpcHRvciBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBwYXRjaCBpcyBkb2luZy4gRnJvbSB3aGF0IEkgY2FuIHNlZSwgaXQncyBwcmltYXJpbHkgZm9jdXNlZCBvbiBgZ3Vlc3RfbWVtZmRgIGhhbmRsaW5nIHdpdGhpbiBLVk0uIFNwZWNpZmljYWxseTpcblxuMS4gICoqYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgOioqIFRoZSBwYXRjaCBtYWtlcyBrZXkgY2hhbmdlcyBpbiBga3ZtX2dtZW1fYmluZCgpYC4gSXQgaW50cm9kdWNlcyBhIGBXQVJOX09OX09OQ0VgIGNoZWNrLCByZXBsYWNlcyB0aGUgYFdSSVRFX09OQ0VgIHdpdGggYSBkaXJlY3QgYXNzaWdubWVudCwgY2FwdHVyZXMgYW5kIGVycm9yIGNoZWNrcyB0aGUgcmV0dXJuIGZyb20gYHhhX3N0b3JlX3JhbmdlKClgLCBhbmQgaW1wb3J0YW50bHksIGltcGxlbWVudHMgYSByb2xsYmFjayBtZWNoYW5pc20gdGhhdCBjbGVhcnMgYGdtZW0uZmlsZWAsIGBnbWVtLnBnb2ZmYCwgYW5kIHJlbW92ZXMgdGhlIGBLVk1fTUVNU0xPVF9HTUVNX09OTFlgIGZsYWcgb24gZXJyb3IuIFRoaXMgZXJyb3IgaGFuZGxpbmcgaXMgY3J1Y2lhbCBmb3IgYW55IGZ1enplcjsgd2UgbmVlZCB0byBleGFtaW5lIGhvdyB0aGUgc3lzdGVtIHJlYWN0cyB0byBmYWlsdXJlcy5cblxuMi4gICoqYHZpcnQva3ZtL2t2bV9tYWluLmNgOioqIFRoZSBzaWduYXR1cmUgb2YgYGt2bV9zZXRfbWVtc2xvdCgpYCBpcyBtb2RpZmllZCB0byB0YWtlIGBnbWVtX2ZkYCBhbmQgYGdtZW1fb2Zmc2V0YCwgaW5kaWNhdGluZyBjaGFuZ2VzIHRvIGhvdyBtZW1zbG90cyBhcmUgYmVpbmcgbWFuYWdlZC4gVGhlIGBrdm1fZ21lbV9iaW5kKClgIGZ1bmN0aW9uIGlzIG5vdyBjYWxsZWQgKndpdGhpbiogYGt2bV9zZXRfbWVtc2xvdCgpYCwgc3BlY2lmaWNhbGx5IGFmdGVyIGBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKClgIGFuZCB3aGlsZSBob2xkaW5nIGBrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrYC4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGNvbnRyb2wgZmxvdyBjaGFuZ2UuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGFub3RoZXIgYFdBUk5fT05fT05DRWAgYXNzZXJ0aW9uLiBBbHNvLCBlcnJvciBoYW5kbGluZyBhbmQgYW4gdW53aW5kIHBhdGggYXJlIGFkZGVkIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGlmIGBrdm1fZ21lbV9iaW5kKClgIGZhaWxzLiBGaW5hbGx5LCB0aGUgY2FsbHMgdG8gYGt2bV9nbWVtX2JpbmQoKWAgYW5kIGBrdm1fZ21lbV91bmJpbmQoKWAgYXJlIHJlbW92ZWQgZnJvbSBga3ZtX3NldF9tZW1vcnlfcmVnaW9uKClgLlxuXG5Ob3csIGlzIHRoaXMgc29tZXRoaW5nIHdlIHNob3VsZCBjb25zaWRlciBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBLVk0gaXMgYSBwcmltZSB0YXJnZXQgZm9yIGZ1enppbmcgYXMgaXQncyBhIGNyaXRpY2FsIHZpcnR1YWxpemF0aW9uIGNvbXBvbmVudCBleHBvc2VkIHZpYSBgL2Rldi9rdm1gIGlvY3RscyBsaWtlIGBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjJgIGFuZCBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAuIFRoZXNlIG1vZGlmaWNhdGlvbnMgdG8gbWVtb3J5IHNsb3QgY3JlYXRpb24gYW5kIGJpbmRpbmcgbG9naWMsIHRoZSBhZGRlZCBhc3NlcnRpb25zLCBhbmQgdGhlIG5ldyBlcnJvciB1bndpbmRpbmcsIHByZXNlbnQgbWFueSBvcHBvcnR1bml0aWVzIGZvciBkaXNjb3ZlcmluZyB2dWxuZXJhYmlsaXRpZXMsIG9yIGF0IGxlYXN0IGVuc3VyaW5nIHRoZSBlcnJvciBwYXRocyBhcmUgZXhlcmNpc2VkLiBUaGUgbW92ZW1lbnQgb2YgYGt2bV9nbWVtX2JpbmQoKWAgYW5kIHRoZSBgc2xvdHNfYXJjaF9sb2NrYCBhcmUgcG90ZW50aWFsIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgdGhhdCB3ZSBuZWVkIHRvIHRhcmdldC5cblxuVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdCBhcmU6XG5cbiogICBga3ZtX2dtZW1fYmluZGBcbiogICBga3ZtX3NldF9tZW1zbG90YFxuKiAgIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gXG5cblJlZ2FyZGluZyBjb25maWd1cmF0aW9ucywgd2Ugc2hvdWxkIGJlIHVzaW5nIGBLVk1gIGFuZCBgS1ZNX0dVRVNUX01FTUZEYCwgYnV0IGxldCBtZSBkb3VibGUtY2hlY2sgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlcyBpbiBgdmlydC9rdm0vYCBhbmQgYGFyY2gveDg2L2t2bS9gIHRvIGVuc3VyZSB3ZSBjb3ZlciB0aGUgbmVjZXNzYXJ5IGRlcGVuZGVuY2llcy4gV2UgZG9uJ3Qgd2FudCB0byBleGNsdWRlIGNvbmZpZ3VyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjYzNiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjkxOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE0OjU3LjE2OTI2OTc0NFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjQ1OTg3MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZ3Vlc3RfbWVtZmRcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwidmlydC9rdm1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwidmlydC9rdm0vTWFrZWZpbGUua3ZtPTE0PWt2bS0kKENPTkZJR19IQVZFX0tWTV9QRk5DQUNIRSkgKz0gJChLVk0pL3BmbmNhY2hlLm9cXG52aXJ0L2t2bS9NYWtlZmlsZS5rdm06MTU6a3ZtLSQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkgKz0gJChLVk0pL2d1ZXN0X21lbWZkLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTQ6NTcuMjMzODgxMDgzWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI4MTA5OTQ2MDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgS1ZNIFN5bWJvbCBBbmFseXNpcyoqXG5cbk9rYXksIHNvIEknbSBmb2N1c2luZyBvbiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBgS1ZNX0dVRVNUX01FTUZEYCBhbmQgb3RoZXIgS1ZNIGNvbXBvbmVudHMuIFJpZ2h0LCBpdCBsb29rcyBsaWtlIGBLVk1fR1VFU1RfTUVNRkRgIGlzIGltcGxpY2l0bHkgZW5hYmxlZCB3aGVuIGBLVk1fWDg2YCBpcyBzZWxlY3RlZCwgc3BlY2lmaWNhbGx5IHdoZW4gcnVubmluZyBvbiBhbiBgWDg2XzY0YCBhcmNoaXRlY3R1cmUuIEFuZCBzaW5jZSBgS1ZNYCwgYEtWTV9JTlRFTGAsIGFuZCBgS1ZNX0FNRGAgYWxsIGVuYWJsZSBgS1ZNX1g4NmAsIHRoYXQgbWVhbnMgdGhlc2Uga2VybmVsIG1vZHVsZXMg4oCTIGBLVk1gLCBgS1ZNX0lOVEVMYCwgYEtWTV9BTURgLCBhbmQgYEtWTV9HVUVTVF9NRU1GRGAg4oCTIGFyZSBhbGwgcG90ZW50aWFsbHkgcmVsZXZhbnQgdG8gdGhpcyBpbnZlc3RpZ2F0aW9uLiBXZSdyZSBsb29raW5nIGF0IGEgcHJldHR5IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaGVyZS5cblxuTGV0J3MgcXVpY2tseSB2ZXJpZnkgbXkgdW5kZXJzdGFuZGluZyBieSBjaGVja2luZyBhbGwgdGhlIHJlY2VudGx5IG1vZGlmaWVkIHN5bWJvbHMgcmVsYXRlZCB0byBndWVzdCBtZW1mZDogYGt2bV9nbWVtX2JpbmRgIHdpdGhpbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AsIGFuZCBib3RoIGBrdm1fc2V0X21lbXNsb3RgIGFuZCBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCB3aXRoaW4gYHZpcnQva3ZtL2t2bV9tYWluLmNgLlxuXG5Hb29kLCBub3cgYXJlIHRoZXNlIGdlbmVyaWMgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zPyBObywgdGhlc2UgYXJlIEtWTSBzcGVjaWZpYyBmdW5jdGlvbnMsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIG1lbXNsb3Qgc2V0dXAgYW5kIGd1ZXN0X21lbWZkIG9wZXJhdGlvbi5cblxuT2theSwgbGV0J3MgZ28gd2l0aCB0aGlzIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MzMwLCJPdXRwdXRUb2tlbnMiOjE4MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNTowMC4wNDQ4Nzk1NDdaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTkyMDE1MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiS1ZNX0lOVEVMXCIsXG4gICAgXCJLVk1fQU1EXCIsXG4gICAgXCJLVk1fR1VFU1RfTUVNRkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9iaW5kXCIsXG4gICAgXCJrdm1fc2V0X21lbXNsb3RcIixcbiAgICBcImt2bV9zZXRfbWVtb3J5X3JlZ2lvblwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1zbG90IG1hbmFnZW1lbnQgYW5kIGd1ZXN0X21lbWZkIGJpbmRpbmcgbG9naWMsIG1vdmluZyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpIHVuZGVyIHNsb3RzX2FyY2hfbG9jaywgYWRkaW5nIGVycm9yIGhhbmRsaW5nIGFuZCByb2xsYmFjayBmb3IgeGFfc3RvcmVfcmFuZ2UoKSwgYW5kIGludHJvZHVjaW5nIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucyBhbmQgZXJyb3IgcGF0aHMuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIEtWTSBtZW1vcnkgcmVnaW9uIGlvY3RscyBhbmQgd2FycmFudHMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLVk1cIixcbiAgICBcIktWTV9JTlRFTFwiLFxuICAgIFwiS1ZNX0FNRFwiLFxuICAgIFwiS1ZNX0dVRVNUX01FTUZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia3ZtX2dtZW1fYmluZFwiLFxuICAgIFwia3ZtX3NldF9tZW1zbG90XCIsXG4gICAgXCJrdm1fc2V0X21lbW9yeV9yZWdpb25cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBLVk0gbWVtc2xvdCBtYW5hZ2VtZW50IGFuZCBndWVzdF9tZW1mZCBiaW5kaW5nIGxvZ2ljLCBtb3Zpbmcga3ZtX2dtZW1fYmluZCgpIGluc2lkZSBrdm1fc2V0X21lbXNsb3QoKSB1bmRlciBzbG90c19hcmNoX2xvY2ssIGFkZGluZyBlcnJvciBoYW5kbGluZyBhbmQgcm9sbGJhY2sgZm9yIHhhX3N0b3JlX3JhbmdlKCksIGFuZCBpbnRyb2R1Y2luZyBuZXcgV0FSTl9PTl9PTkNFIGFzc2VydGlvbnMgYW5kIGVycm9yIHBhdGhzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBLVk0gbWVtb3J5IHJlZ2lvbiBpb2N0bHMgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjAwLjIwNDExNzc1NFoiLCJTZXEiOjIxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI0MTU5OTcwOTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQwOToxNTowMC4yMDYxNzMzMjRaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMjQxMzkzNjMxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZmJmOTU5MTZkNmIxOWRjMTc2YjNiMGU5MDRlMmYxNWVjNDVlZGZjMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMDk6MTQ6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuaW5kZXggYjU5NjQ4NmQxODRjYS4uNmM4ZGY2NzM4MmZjZSAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbkBAIC02MTIsMTAgKzYxMiwxNCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gXHRpbnQgciA9IC1FSU5WQUw7XG4rXHR2b2lkICp4YXI7XG4gXG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gXG4rXHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuIFx0ZmlsZSA9IGZnZXQoZmQpO1xuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuQEAgLTY0OSwxMiArNjUzLDIwIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XG4gXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cbiBcdCAqL1xuLVx0V1JJVEVfT05DRShzbG90LVx1MDAzZWdtZW0uZmlsZSwgZmlsZSk7XG4rXHRzbG90LVx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XG4gXHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcbiBcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcbiBcdFx0c2xvdC1cdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4gXG4tXHR4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4rXHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4rXG4rXHRyID0geGFfaXNfZXJyKHhhcikgPyB4YV9lcnIoeGFyKSA6IDA7XG4rXHRpZiAocikge1xuK1x0XHR4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgTlVMTCwgR0ZQX0tFUk5FTCk7XG4rXHRcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gTlVMTDtcbitcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gMDtcbitcdFx0c2xvdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4rXHR9XG4gXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gXG4gXHQvKlxuQEAgLTY2Miw3ICs2NzQsNiBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxuIFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXG4gXHQgKi9cbi1cdHIgPSAwO1xuIGVycjpcbiBcdGZwdXQoZmlsZSk7XG4gXHRyZXR1cm4gcjtcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uY1xuaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2t2bV9tYWluLmNcbisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbkBAIC0xODg3LDcgKzE4ODcsOCBAQCBzdGF0aWMgdm9pZCBrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXG4gXHRcdFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbmV3LFxuLVx0XHRcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpXG4rXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbitcdFx0XHQgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KVxuIHtcbiBcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDtcbiBcdGludCByO1xuQEAgLTE5MzEsMjAgKzE5MzIsMTYgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0fVxuIFxuIFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbi1cdGlmIChyKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vXG4tXHRcdCAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZFxuLVx0XHQgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc29cbi1cdFx0ICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4tXHRcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4tXHRcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4tXHRcdH1cbi1cdFx0cmV0dXJuIHI7XG4rXHRpZiAocilcbitcdFx0Z290byBlcnI7XG4rXG4rXHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbitcdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4rXHRcdFx0Z290byBlcnJfYmluZDtcbitcbitcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbitcdFx0aWYgKHIpXG4rXHRcdFx0Z290byBlcnJfYmluZDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMTk3Nyw2ICsxOTc0LDI3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdGt2bV9jb21taXRfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuIFxuIFx0cmV0dXJuIDA7XG4rXG4rZXJyX2JpbmQ6XG4rXHRpZiAobmV3KSB7XG4rXHRcdGt2bV9hcmNoX2ZyZWVfbWVtc2xvdChrdm0sIG5ldyk7XG4rXG4rXHRcdGlmIChuZXctXHUwMDNlZGlydHlfYml0bWFwIFx1MDAyNlx1MDAyNiAoIW9sZCB8fCAhb2xkLVx1MDAzZWRpcnR5X2JpdG1hcCkpXG4rXHRcdFx0a3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7XG4rXHR9XG4rZXJyOlxuK1x0LypcbitcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcbitcdCAqIHJlcXVpcmVkIHNpbmNlIHRoZSBvcmlnaW5hbCBzbG90IHdhcyBwcmVzZXJ2ZWQgaW4gdGhlIGluYWN0aXZlIHNsb3RzLlxuK1x0ICogQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLlxuK1x0ICovXG4rXHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4rXHRcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpO1xuK1x0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuK1x0fSBlbHNlIHtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmt2bS1cdTAwM2VzbG90c19hcmNoX2xvY2spO1xuK1x0fVxuK1x0cmV0dXJuIHI7XG4gfVxuIFxuIHN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcbkBAIC0yMDU4LDcgKzIwNzYsNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4gXHRcdGlmIChXQVJOX09OX09OQ0Uoa3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMgXHUwMDNjIG9sZC1cdTAwM2VucGFnZXMpKVxuIFx0XHRcdHJldHVybiAtRUlPO1xuIFxuLVx0XHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTtcbitcdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xuIFx0fVxuIFxuIFx0YmFzZV9nZm4gPSAobWVtLVx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjEwNSwyMSArMjEyMywxNCBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4gXHRuZXctXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xuIFx0bmV3LVx1MDAzZWZsYWdzID0gbWVtLVx1MDAzZWZsYWdzO1xuIFx0bmV3LVx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyO1xuLVx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xuLVx0XHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbi1cdFx0aWYgKHIpXG4tXHRcdFx0Z290byBvdXQ7XG4tXHR9XG4gXG4tXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4rXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSxcbitcdFx0XHQgICAgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbiBcdGlmIChyKVxuLVx0XHRnb3RvIG91dF91bmJpbmQ7XG4rXHRcdGdvdG8gb3V0O1xuIFxuIFx0cmV0dXJuIDA7XG4gXG4tb3V0X3VuYmluZDpcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG4tXHRcdGt2bV9nbWVtX3VuYmluZChuZXcpO1xuIG91dDpcbiBcdGtmcmVlKG5ldyk7XG4gXHRyZXR1cm4gcjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjAwLjIwNjE4MjM4NFoiLCJTZXEiOjIzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTcwNDk2MDIwNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLVk0gUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggYW5kIGFzc2VzcyB0aGUgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZSwgc3BlY2lmaWNhbGx5IHdhcnJhbnRpbmcgYSBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjaGFuZ2VzIHRvIGRldGVybWluZSBpZiB0aGV5IGludHJvZHVjZSBhbnkgbmV3IHJpc2tzIGluIHRoYXQgYXJlYS5cblxuRmlyc3QsIHRoZSBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgZmlsZS4gSW4gYGt2bV9nbWVtX2JpbmRgLCB0aGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIHNlZSBpZiBgc2xvdC1cdTAwM2VmbGFnc2AgaGFzIHRoZSBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBmbGFnLCB3aGljaCBsb29rcyBsaWtlIGEgZGVmZW5zaXZlIG1lYXN1cmUuIEl0IGFsc28gY2hhbmdlcyBhIGBXUklURV9PTkNFYCB0byBhIGRpcmVjdCBhc3NpZ25tZW50IHRvIGBzbG90LVx1MDAzZWdtZW0uZmlsZWAuIFRoYXQncyBub3QgaW5oZXJlbnRseSBzdXNwaWNpb3VzLCBidXQgaXQgd2FycmFudHMgYSBjbG9zZXIgbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZS4gTW9zdCBub3RhYmx5LCB0aGUgZXJyb3IgaGFuZGxpbmcgYXJvdW5kIGB4YV9zdG9yZV9yYW5nZWAgaXMgaW50ZXJlc3RpbmcuIElmIGB4YV9zdG9yZV9yYW5nZWAgZmFpbHMsIGl0IG5vdyBleHBsaWNpdGx5IGNsZWFycyB0aGUgYGdtZW0uZmlsZWAsIGBnbWVtLnBnb2ZmYCwgYW5kIHRoZSBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBmbGFnIG9uIGBzbG90YC4gVGhpcyBzZWVtcyBsaWtlIGEgZ29vZCBwcmFjdGljZSB0byBwcmV2ZW50IGxpbmdlcmluZyBzdGFsZSBkYXRhLlxuXG5OZXh0LCBJJ2xsIG1vdmUgb24gdG8gYHZpcnQva3ZtL2t2bV9tYWluLmNgLiBIZXJlLCB0aGUgcGF0Y2ggcmUtYXJyYW5nZXMgdGhlIGV4ZWN1dGlvbiwgbW92aW5nIGBrdm1fZ21lbV9iaW5kYCBpbnRvIGBrdm1fc2V0X21lbXNsb3RgLiAgSXQgYWxzbyBwYXNzZXMgYGdtZW1fZmRgIGFuZCBgZ21lbV9vZmZzZXRgIHRvIGBrdm1fc2V0X21lbXNsb3RgLCB3aGljaCBnaXZlcyBjb250ZXh0IHRvIHRoZSBiaW5kaW5nIHByb2Nlc3MuIENydWNpYWxseSwgdGhlIHBhdGNoIGFkZHMgZXJyb3IgaGFuZGxpbmcgYWZ0ZXIgdGhlIGNhbGwgdG8gYGt2bV9nbWVtX2JpbmRgIHdpdGhpbiBga3ZtX3NldF9tZW1zbG90YCwgd2hpY2ggaW5jbHVkZXMgY2xlYW51cCB1c2luZyBga3ZtX2FyY2hfZnJlZV9tZW1zbG90YCBhbmQgcG90ZW50aWFsbHkgYGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcGAsIGlmIG5lZWRlZC4gU2ltcGxpZnlpbmcgdGhlIGVycm9yIHBhdGggaW4gYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgYnkgZGVmZXJyaW5nIGBrdm1fZ21lbV91bmJpbmRgIHNvdW5kcyBsaWtlIGEgZ29vZCBvcHRpbWl6YXRpb24sIGFzc3VtaW5nIHRoaXMgZG9lc24ndCBjcmVhdGUgbmV3IHN1YnRsZSBpc3N1ZXMuXG5cbk5vdywgbXkgdGhvdWdodHMgdHVybiB0byB0aGUgb3ZlcmFsbCBjb250ZXh0LiBJIG5lZWQgdG8gdHJhY2UgdGhlIHVzYWdlIG9mIGBrdm1fZ21lbV9iaW5kYCBhbmQgYGt2bV9zZXRfbWVtc2xvdGAuIEkgaGF2ZSB0byB1bmRlcnN0YW5kIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMgYW5kIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyB3aXRoaW4gdGhlIEtWTSBzeXN0ZW0uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCBzdGF0ZSBpc24ndCBnZXR0aW5nIHdyaXR0ZW4gaW50byB0aGUgbWVtc2xvdCBwcmlvciB0byBpbml0aWFsaXphdGlvbi4gSWYgdGhlcmUgYXJlIG5vIGNsZWFyIHdyaXRlIG9wZXJhdGlvbnMgYmVmb3JlIGEgY29uZGl0aW9uYWwgcmVhZCwgSSdkIHdhbnQgdG8gYmUgc3VyZSB0byB0ZXN0IGl0IHdpdGggZnV6emluZy5cblxuT3ZlcmFsbCwgdGhpcyBwYXRjaCBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSByZWZhY3RvciB3aXRoIGFkZGVkIGVycm9yIGhhbmRsaW5nLiBJdCdzIG5vdCBpbW1lZGlhdGVseSBzY3JlYW1pbmcgXCJ1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXR5XCIgYXQgbWUuIFRoZSBleHBsaWNpdCBjbGVhcmluZyBvZiBmaWVsZHMgaW4gdGhlIGVycm9yIHBhdGggc2VlbXMgbGlrZSBhIHBvc2l0aXZlIHN0ZXAuIEhvd2V2ZXIsIHRoZSBtb3ZlIG9mIGBrdm1fZ21lbV9iaW5kYCBhbmQgdGhlIGFsdGVyZWQgZXJyb3IgaGFuZGxpbmcgYXJlIHdoYXQgSSBuZWVkIHRvIHByb2JlIGZ1cnRoZXIgdG8gYmUgY2VydGFpbi4gSSdsbCBuZWVkIHRvIGRvIGEgdGhvcm91Z2ggY29kZSB3YWxrIHRvIGJlIGFic29sdXRlbHkgc3VyZSwgYnV0IEknbSBsZWFuaW5nIHRvd2FyZCBuZWVkaW5nIEtNU0FOIGZ1enppbmcgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBsYXRlbnQgYnVncy4gSSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHRlc3QgaGFybmVzcyB3aXRoIHNjZW5hcmlvcyB0aGF0IGNvdWxkIGxlYWQgdG8gdGhlc2UgZXJyb3IgY29uZGl0aW9ucyB0byBsb29rIGludG8gaXQgZGVlcGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDExLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTQ0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTU6MTEuOTExMTQ2ODUxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDUzNjk5NzYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia3ZtX2dtZW1fYmluZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJ2aXJ0L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jPTU5Mj1pbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYwNS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jOjYwNjppbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy02MDctXFx0XFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1Mi1cXHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYzo2NTM6XFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1NC1cXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9MTA9aW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKTtcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oOjExOmludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEyLVxcdFxcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KTtcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9MTk9c3RhdGljIGlubGluZSB2b2lkIGt2bV9nbWVtX2V4aXQodm9pZCkge307XFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDoyMDpzdGF0aWMgaW5saW5lIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSxcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTIxLVxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz0xODg3PXN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0MS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE5NDI6XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE5NDMtXFx0XFx0aWYgKHIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjEyLjExNjUyMjk5OFoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODkzODgwMDM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgS1ZNIGhhbmRsZXMgZ3Vlc3QgbWVtb3J5LCBwYXJ0aWN1bGFybHkgYXJvdW5kIHRob3NlIGBtZW1mZGAgaW50ZXJhY3Rpb25zLiBSaWdodCwgbGV0J3MgemVybyBpbiBvbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AuIFNwZWNpZmljYWxseSwgSSdtIGdvaW5nIHRvIGJlIGZvY3VzaW5nIG9uIHRoZSBga3ZtX2dtZW1fYmluZGAgYW5kIGBrdm1fZ21lbV91bmJpbmRgIGZ1bmN0aW9ucy4gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgdGhlIGd1ZXN0IG1lbW9yeSBpcyBib3VuZCBhbmQgdW5ib3VuZCB0byB0aGUgaG9zdCdzIG1lbW9yeSBtb2RlbCB1c2luZyBgbWVtZmRgIHNpbmNlIHRoaXMgaXMgYSBjcml0aWNhbCBhc3BlY3Qgb2YgZWZmaWNpZW50IGFuZCBzZWN1cmUgbWVtb3J5IG1hbmFnZW1lbnQuIFdoYXQgYXJlIHRoZSBrZXkgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIG1hbmlwdWxhdGVkIGhlcmU/IFdoYXQncyB0aGUgY29udHJvbCBmbG93PyBJJ20gaG9waW5nIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiBob3cgdGhpcyBtZWNoYW5pc20gYWxsb3dzIGZvciBzaGFyZWQgbWVtb3J5LCBtZW1vcnkgbWlncmF0aW9uLCBhbmQgcHJvdGVjdGlvbiBpbiB0aGUgS1ZNIGVudmlyb25tZW50LiBUaW1lIHRvIGRpZyBpbiBhbmQgcmVtaW5kIG15c2VsZiBvZiB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6NTg3OCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjE0LjAxMDQwNjE3N1oiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjczNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwidmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2MDAsXG4gIFwiTGluZUNvdW50XCI6IDg1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2MDA6XFx0XFx0aWYgKHNpemUgXFx1MDAzYz0gMCB8fCAhUEFHRV9BTElHTkVEKHNpemUpKVxcbiA2MDE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYwMjpcXHRcXG4gNjAzOlxcdFxcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzKTtcXG4gNjA0OlxcdH1cXG4gNjA1OlxcdFxcbiA2MDY6XFx0aW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbiA2MDc6XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXFxuIDYwODpcXHR7XFxuIDYwOTpcXHRcXHR1b2ZmX3Qgc2l6ZSA9IHNsb3QtXFx1MDAzZW5wYWdlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbiA2MTA6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCwgZW5kO1xcbiA2MTE6XFx0XFx0c3RydWN0IGdtZW1fZmlsZSAqZjtcXG4gNjEyOlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIDYxMzpcXHRcXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcXG4gNjE0OlxcdFxcdGludCByID0gLUVJTlZBTDtcXG4gNjE1OlxcdFxcdHZvaWQgKnhhcjtcXG4gNjE2OlxcdFxcbiA2MTc6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpO1xcbiA2MTg6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZihnZm5fdCkgIT0gc2l6ZW9mKHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYpKTtcXG4gNjE5OlxcdFxcbiA2MjA6XFx0XFx0aWYgKFdBUk5fT05fT05DRShzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXFxuIDYyMTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjIyOlxcdFxcbiA2MjM6XFx0XFx0ZmlsZSA9IGZnZXQoZmQpO1xcbiA2MjQ6XFx0XFx0aWYgKCFmaWxlKVxcbiA2MjU6XFx0XFx0XFx0cmV0dXJuIC1FQkFERjtcXG4gNjI2OlxcdFxcbiA2Mjc6XFx0XFx0aWYgKGZpbGUtXFx1MDAzZWZfb3AgIT0gXFx1MDAyNmt2bV9nbWVtX2ZvcHMpXFxuIDYyODpcXHRcXHRcXHRnb3RvIGVycjtcXG4gNjI5OlxcdFxcbiA2MzA6XFx0XFx0ZiA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gNjMxOlxcdFxcdGlmIChmLVxcdTAwM2Vrdm0gIT0ga3ZtKVxcbiA2MzI6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYzMzpcXHRcXG4gNjM0OlxcdFxcdGlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4gNjM1OlxcdFxcbiA2MzY6XFx0XFx0aWYgKCFQQUdFX0FMSUdORUQob2Zmc2V0KSB8fCBvZmZzZXQgKyBzaXplIFxcdTAwM2UgaV9zaXplX3JlYWQoaW5vZGUpKVxcbiA2Mzc6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYzODpcXHRcXG4gNjM5OlxcdFxcdGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NDA6XFx0XFxuIDY0MTpcXHRcXHRzdGFydCA9IG9mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiA2NDI6XFx0XFx0ZW5kID0gc3RhcnQgKyBzbG90LVxcdTAwM2VucGFnZXM7XFxuIDY0MzpcXHRcXG4gNjQ0OlxcdFxcdGlmICgheGFfZW1wdHkoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzKSBcXHUwMDI2XFx1MDAyNlxcbiA2NDU6XFx0XFx0ICAgIHhhX2ZpbmQoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBcXHUwMDI2c3RhcnQsIGVuZCAtIDEsIFhBX1BSRVNFTlQpKSB7XFxuIDY0NjpcXHRcXHRcXHRyID0gLUVFWElTVDtcXG4gNjQ3OlxcdFxcdFxcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuIDY0ODpcXHRcXHRcXHRnb3RvIGVycjtcXG4gNjQ5OlxcdFxcdH1cXG4gNjUwOlxcdFxcbiA2NTE6XFx0XFx0LypcXG4gNjUyOlxcdFxcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cXG4gNjUzOlxcdFxcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XFxuIDY1NDpcXHRcXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4gNjU1OlxcdFxcdCAqL1xcbiA2NTY6XFx0XFx0c2xvdC1cXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcXG4gNjU3OlxcdFxcdHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcXG4gNjU4OlxcdFxcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcXG4gNjU5OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcXG4gNjYwOlxcdFxcbiA2NjE6XFx0XFx0eGFyID0geGFfc3RvcmVfcmFuZ2UoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XFxuIDY2MjpcXHRcXG4gNjYzOlxcdFxcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4gNjY0OlxcdFxcdGlmIChyKSB7XFxuIDY2NTpcXHRcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4gNjY2OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuIDY2NzpcXHRcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gMDtcXG4gNjY4OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY2OTpcXHRcXHR9XFxuIDY3MDpcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NzE6XFx0XFxuIDY3MjpcXHRcXHQvKlxcbiA2NzM6XFx0XFx0ICogRHJvcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBmaWxlLCBldmVuIG9uIHN1Y2Nlc3MuICBUaGUgZmlsZSBwaW5zIEtWTSxcXG4gNjc0OlxcdFxcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICdyb3VuZC4gIEFjdGl2ZSBiaW5kaW5ncyBhcmUgaW52YWxpZGF0ZWQgaWYgdGhlXFxuIDY3NTpcXHRcXHQgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC5cXG4gNjc2OlxcdFxcdCAqL1xcbiA2Nzc6XFx0ZXJyOlxcbiA2Nzg6XFx0XFx0ZnB1dChmaWxlKTtcXG4gNjc5OlxcdFxcdHJldHVybiByO1xcbiA2ODA6XFx0fVxcbiA2ODE6XFx0XFxuIDY4MjpcXHRzdGF0aWMgdm9pZCBfX2t2bV9nbWVtX3VuYmluZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBzdHJ1Y3QgZ21lbV9maWxlICpmKVxcbiA2ODM6XFx0e1xcbiA2ODQ6XFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydCA9IHNsb3QtXFx1MDAzZWdtZW0ucGdvZmY7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjE0LjAxMDUzNjQ0N1oiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjA4Njc4MDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6XG5cbioqRGlnZ2luZyBpbnRvIE1lbW9yeSBNYW5hZ2VtZW50IGluIEtWTSoqXG5cbk9rYXksIHNvIHdlIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgbWVtb3J5IHJlZ2lvbnMgYXJlIGhhbmRsZWQgd2l0aGluIEtWTS4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIG9uIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGZ1bmN0aW9ucy4gVGhlc2UgYXJlIGxpa2VseSB0aGUgY29yZSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgYW5kIGNvbmZpZ3VyaW5nIHRoZSBndWVzdCdzIHBoeXNpY2FsIG1lbW9yeSB3aXRoaW4gdGhlIGhvc3QuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtZW1zbG90cyBhbmQgbWVtb3J5IHJlZ2lvbnMuIFdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGhlcmU/IFdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGFyZSBpbiBwbGFjZSB0byBlbnN1cmUgY29uc2lzdGVuY3kgZHVyaW5nIHRoZXNlIG9wZXJhdGlvbnM/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBiZSBhd2FyZSBvZiwgZXNwZWNpYWxseSByZWdhcmRpbmcgY29uY3VycmVudCBhY2Nlc3MgZnJvbSBkaWZmZXJlbnQgdkNQVXM/IEkgc2hvdWxkIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gaG93IG1lbW9yeSBpcyBhY3R1YWxseSBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIGJ5IEtWTSBmb3IgdGhlIGd1ZXN0LiBJIGJldCB0aGVyZSdzIHNvbWUgaW50ZXJlc3RpbmcgaW50ZXJwbGF5IHdpdGggdGhlIGhvc3QncyBwYWdlIHRhYmxlcyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdCBoZXJlLiBUaW1lIHRvIGRpdmUgaW4gYW5kIHNlZSB3aGF0J3Mgd2hhdCFcblxuXG4iLCJJbnB1dFRva2VucyI6NzQ5NSwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTU6MTYuMjE5MjE3NThaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI5OTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkyMCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkyMDpcXHRcXHQgKlxcbjE5MjE6XFx0XFx0ICogTW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBvbiBhIHRlbXBvcmFyeSwgdW5yZWFjaGFibGUgc2xvdC4gIFRoZSBvbGRcXG4xOTIyOlxcdFxcdCAqIHNsb3QgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGluIGNhc2UgYSBsYXRlciBzdGVwIGZhaWxzIGFuZCB0aGVcXG4xOTIzOlxcdFxcdCAqIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSByZXZlcnRlZC5cXG4xOTI0OlxcdFxcdCAqL1xcbjE5MjU6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5MjY6XFx0XFx0XFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4xOTI3OlxcdFxcdFxcdGlmICghaW52YWxpZF9zbG90KSB7XFxuMTkyODpcXHRcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmt2bS1cXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcXG4xOTI5OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjE5MzA6XFx0XFx0XFx0fVxcbjE5MzE6XFx0XFx0XFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTMyOlxcdFxcdH1cXG4xOTMzOlxcdFxcbjE5MzQ6XFx0XFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTM1OlxcdFxcdGlmIChyKVxcbjE5MzY6XFx0XFx0XFx0Z290byBlcnI7XFxuMTkzNzpcXHRcXG4xOTM4OlxcdFxcdGlmIChuZXcgXFx1MDAyNlxcdTAwMjYgbmV3LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcXG4xOTM5OlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxcbjE5NDA6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQxOlxcdFxcbjE5NDI6XFx0XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG4xOTQzOlxcdFxcdFxcdGlmIChyKVxcbjE5NDQ6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQ1OlxcdFxcdH1cXG4xOTQ2OlxcdFxcbjE5NDc6XFx0XFx0LypcXG4xOTQ4OlxcdFxcdCAqIEZvciBERUxFVEUgYW5kIE1PVkUsIHRoZSB3b3JraW5nIHNsb3QgaXMgbm93IGFjdGl2ZSBhcyB0aGUgSU5WQUxJRFxcbjE5NDk6XFx0XFx0ICogdmVyc2lvbiBvZiB0aGUgb2xkIHNsb3QuICBNT1ZFIGlzIHBhcnRpY3VsYXJseSBzcGVjaWFsIGFzIGl0IHJldXNlc1xcbjE5NTA6XFx0XFx0ICogdGhlIG9sZCBzbG90IGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGUgb2xkIHNsb3QgKGluIHdvcmtpbmdfc2xvdCkuXFxuMTk1MTpcXHRcXHQgKiBGb3IgQ1JFQVRFLCB0aGVyZSBpcyBubyBvbGQgc2xvdC4gIEZvciBERUxFVEUgYW5kIEZMQUdTX09OTFksIHRoZVxcbjE5NTI6XFx0XFx0ICogb2xkIHNsb3QgaXMgZGV0YWNoZWQgYnV0IG90aGVyd2lzZSBwcmVzZXJ2ZWQuXFxuMTk1MzpcXHRcXHQgKi9cXG4xOTU0OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSlcXG4xOTU1OlxcdFxcdFxcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XFxuMTk1NjpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcXG4xOTU3OlxcdFxcdFxcdGt2bV9kZWxldGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTU4OlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcXG4xOTU5OlxcdFxcdFxcdGt2bV9tb3ZlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgaW52YWxpZF9zbG90KTtcXG4xOTYwOlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfRkxBR1NfT05MWSlcXG4xOTYxOlxcdFxcdFxcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcXG4xOTYyOlxcdFxcdGVsc2VcXG4xOTYzOlxcdFxcdFxcdEJVRygpO1xcbjE5NjQ6XFx0XFxuMTk2NTpcXHRcXHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cXG4xOTY2OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXFxuMTk2NzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5Njg6XFx0XFxuMTk2OTpcXHRcXHQvKlxcbjE5NzA6XFx0XFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cXHUwMDNlYXJjaCwgY2hhbmdlcyBhZnRlciBkcm9wcGluZyBzbG90c19hcmNoX2xvY2tcXG4xOTcxOlxcdFxcdCAqIHdpbGwgZGlyZWN0bHkgaGl0IHRoZSBmaW5hbCwgYWN0aXZlIG1lbXNsb3QuICBBcmNoaXRlY3R1cmVzIGFyZVxcbjE5NzI6XFx0XFx0ICogcmVzcG9uc2libGUgZm9yIGtub3dpbmcgdGhhdCBuZXctXFx1MDAzZWFyY2ggbWF5IGJlIHN0YWxlLlxcbjE5NzM6XFx0XFx0ICovXFxuMTk3NDpcXHRcXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTc1OlxcdFxcbjE5NzY6XFx0XFx0cmV0dXJuIDA7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdGVycl9iaW5kOlxcbjE5Nzk6XFx0XFx0aWYgKG5ldykge1xcbjE5ODA6XFx0XFx0XFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcXG4xOTgxOlxcdFxcbjE5ODI6XFx0XFx0XFx0aWYgKG5ldy1cXHUwMDNlZGlydHlfYml0bWFwIFxcdTAwMjZcXHUwMDI2ICghb2xkIHx8ICFvbGQtXFx1MDAzZWRpcnR5X2JpdG1hcCkpXFxuMTk4MzpcXHRcXHRcXHRcXHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcXG4xOTg0OlxcdFxcdH1cXG4xOTg1OlxcdGVycjpcXG4xOTg2OlxcdFxcdC8qXFxuMTk4NzpcXHRcXHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXFxuMTk4ODpcXHRcXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cXG4xOTg5OlxcdFxcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4xOTkwOlxcdFxcdCAqL1xcbjE5OTE6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5OTI6XFx0XFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuMTk5MzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5OTQ6XFx0XFx0fSBlbHNlIHtcXG4xOTk1OlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbjE5OTY6XFx0XFx0fVxcbjE5OTc6XFx0XFx0cmV0dXJuIHI7XFxuMTk5ODpcXHR9XFxuMTk5OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMDk6MTU6MTYuMjE5NDQ5MVoiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2NDAwNjE1NzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzIGFuZCBLTVNBTiBFdmFsdWF0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoLiBNeSBpbml0aWFsIGltcHJlc3Npb24gaXMgdGhhdCBpdCdzIGZvY3VzZWQgb24gaW1wcm92aW5nIHRoZSByb2J1c3RuZXNzIG9mIHRoZSBLVk0gZ3Vlc3RfbWVtZmQgbWVtb3J5IHNsb3Qgc2V0dXAuIEkgc2VlIHRoYXQgaXQncyBwcmltYXJpbHkgcmVmYWN0b3JpbmcgdGhlIGVycm9yIGhhbmRsaW5nIHdpdGhpbiBga3ZtX2dtZW1fYmluZGAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYnJvYWRlciBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCBwcm9jZXNzLiBTcGVjaWZpY2FsbHksIEknbSBub3RpbmcgdGhlIGNoYW5nZXMgaW4gdGhlIGBrdm1fZ21lbV9iaW5kYCBmdW5jdGlvbjogZXJyb3IgaGFuZGxpbmcgYWRkZWQgZm9yIGB4YV9zdG9yZV9yYW5nZWAsIHRoZSBhZGRpdGlvbiBvZiBhIGBXQVJOX09OX09OQ0VgIGNoZWNrLCBhbmQgdGhlIHJlbW92YWwgb2YgYSBgV1JJVEVfT05DRWAuIFRoZSByZW9yZGVyaW5nIG9mIHRoZSBmdW5jdGlvbiBjYWxscyBpcyBhbHNvIHNpZ25pZmljYW50LCBlc3BlY2lhbGx5IHRoZSBzaGlmdCBvZiBga3ZtX2dtZW1fYmluZGAgdG8gYmUgaW5zaWRlIGBrdm1fc2V0X21lbXNsb3RgLiBJbXBvcnRhbnRseSwgdGhpcyBtZWFucyB0aGUgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIHVwIGluIGFuIGltcHJvdmVkIG1hbm5lci5cblxuTm93LCBsZXQncyB0aGluayBhYm91dCBLTVNBTidzIHJvbGUgaGVyZS4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgYWx3YXlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXJzcGFjZS4gSSd2ZSBzY2FubmVkIHRoZSBjaGFuZ2VzIGFuZCBJIGRvbid0IHNlZSBhbnl0aGluZyB0aGF0IHNjcmVhbXMgXCJLTVNBTiByaXNrLlwiIEknbSBsb29raW5nIGZvciBkaXJlY3QgaW50ZXJhY3Rpb25zIHdpdGggdXNlcnNwYWNlIHZpYSBgY29weV90b191c2VyYCBvciBhbnkgY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kZW50IG9uIHVuaW5pdGlhbGl6ZWQgZGF0YS4gU3BlY2lmaWNhbGx5LCBJJ20gY2hlY2tpbmcgZm9yIG5ldyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbmV3IGFsbG9jYXRpb25zLCBvciByZWFkcyB0aGF0IGNvdWxkIGxlYWQgdG8gbWVtb3J5IGNvcnJ1cHRpb24gb3IgaW5mbyBsZWFrcy4gSXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggaXMgY29ycmVjdGluZyBmYWlsdXJlIGhhbmRsaW5nLiBUaGUgcGF0Y2ggc2VlbXMgdG8gYmUgY29ycmVjdGx5IHVzaW5nIHRoZSByZXR1cm4gdmFsdWVzIGZyb20gdGhlIHhhcnJheSBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIGJlaGF2aW9yLCBzbyBubyBjb25jZXJucyB0aGVyZS5cblxuVGhlIGNoYW5nZXMgYXJlIGNlbnRlcmVkIGFyb3VuZCBpbXByb3ZlZCBlcnJvciBoYW5kbGluZyBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgY2xlYW51cCBvbiBlcnJvcnMuIFRoaXMgaXNuJ3Qgd2hlcmUgS01TQU4gdHJhZGl0aW9uYWxseSBzaGluZXMuIFdlIGFyZSBoYW5kbGluZyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uLiBTbywgSSBkb24ndCB0aGluayB0aGlzIGlzIGEgS01TQU4gaXNzdWUuIEtBU0FOIGFuZCB0aGUgdXN1YWwgbWVtb3J5IGRlYnVnZ2luZyB0b29scyBhcmUgbGlrZWx5IHN1ZmZpY2llbnQgZm9yIHRob3NlIGNvbmNlcm5zLCBzdWNoIGFzIGRvdWJsZSBmcmVlcyBvciBVQUYuIFRoZSBwYXRjaCBpdHNlbGYgZG9lc24ndCBpbnRyb2R1Y2UgYW55IG5ldyBzdHJ1Y3R1cmVzLCBjaGFuZ2VzIGluIGRhdGEgbGVuZ3RocywgYnVmZmVyIG92ZXJmbG93cywgb3Igc2hpZnRzIG9mIG9mZnNldHMgdG8gaW50cm9kdWNlIHZ1bG5lcmFiaWxpdGllcy5cblxuTGV0J3MgbWFrZSBzdXJlIEknbSBjcnlzdGFsIGNsZWFyIGluIG15IHJhdGlvbmFsZS4gS01TQU4gdGFyZ2V0cyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3NlcyBhbmQga2VybmVsLXRvLXVzZXIgbGVha3MuIFRoaXMgcGF0Y2ggcHJpbWFyaWx5IG1vZGlmaWVzIHRoZSBlcnJvciBoYW5kbGluZywgZm9jdXNpbmcgb24gdGhlIGNvcnJlY3Qgc2VxdWVuY2UgYW5kIGZhaWx1cmUgaGFuZGxpbmcgb2YgdGhlIGBrdm1fZ21lbV9iaW5kYCBwcm9jZXNzLiBTaW5jZSB0aGlzIGRvZXNuJ3QgZGlyZWN0bHkgaW50cm9kdWNlIGFueSBuZXcgdW5pbml0aWFsaXplZCBkYXRhLCBkb2Vzbid0IGNvcHkgc3RydWN0dXJlcyB0byB1c2Vyc3BhY2UsIGFuZCBmaXhlcyBleGlzdGluZyBlcnJvciBwYXRod2F5cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzbid0IHdhcnJhbnRlZC4gSSBjYW4gY29uZmlybSB0aGF0IE5lZWRzS01TQU4gc2hvdWxkIGJlIGZhbHNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MDczLCJPdXRwdXRUb2tlbnMiOjEzNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY3OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDA5OjE1OjIyLjYyMDA2NzgwNVoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM4NDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG9yZGVyaW5nIGFuZCBlcnJvciBoYW5kbGluZyBvZiBga3ZtX2dtZW1fYmluZCgpYCBkdXJpbmcgS1ZNIG1lbXNsb3QgY3JlYXRpb24gYW5kIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZSgpYC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgc3RydWN0dXJlIGZpZWxkcyB0b3VjaGVkIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQuIEFueSByZXNvdXJjZSBsaWZlY3ljbGUgZXJyb3JzIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlIGluIGVycm9yIHVud2luZCBwYXRocykgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4uIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflow6fq8d[1] Phase: Succeeded StartedAt: 2026-09-05 09:15:34 +0000 UTC FinishedAt: 2026-09-05 09:15:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-05 09:15:34 +0000 UTC FinishedAt: 2026-09-05 09:15:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2] Phase: Succeeded StartedAt: 2026-09-05 09:15:34 +0000 UTC FinishedAt: 2026-09-05 12:59:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-05 09:15:34 +0000 UTC FinishedAt: 2026-09-05 12:59:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-05 09:15:34 +0000 UTC FinishedAt: 2026-09-05 09:15:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-05 09:15:34 +0000 UTC FinishedAt: 2026-09-05 09:15:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-convert-artifact-1284688409/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-05 09:15:44 +0000 UTC FinishedAt: 2026-09-05 09:32:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-05 09:15:44 +0000 UTC FinishedAt: 2026-09-05 09:32:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*4608ec76-a555-432b-82c0-eee60b64ce08,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-convert-artifact-1284688409/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "7f77f9d9-ea5a-4957-b861-a5ef40d35cc0", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-1166798263/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-05 09:15:44 +0000 UTC FinishedAt: 2026-09-05 09:32:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*4608ec76-a555-432b-82c0-eee60b64ce08,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-convert-artifact-1284688409/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "7f77f9d9-ea5a-4957-b861-a5ef40d35cc0", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-1166798263/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-05 09:32:54 +0000 UTC FinishedAt: 2026-09-05 09:32:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-05 09:32:54 +0000 UTC FinishedAt: 2026-09-05 09:32:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-05 09:32:54 +0000 UTC FinishedAt: 2026-09-05 09:33:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-05 09:32:54 +0000 UTC FinishedAt: 2026-09-05 09:32:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-convert-artifact-3859358700/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-05 09:33:05 +0000 UTC FinishedAt: 2026-09-05 09:35:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-05 09:33:05 +0000 UTC FinishedAt: 2026-09-05 09:34:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7f77f9d9-ea5a-4957-b861-a5ef40d35cc0,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-1166798263/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },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-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-05 09:35:03 +0000 UTC FinishedAt: 2026-09-05 09:35:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-05 09:35:03 +0000 UTC FinishedAt: 2026-09-05 09:35:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-05 09:35:03 +0000 UTC FinishedAt: 2026-09-05 09:55:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-05 09:35:03 +0000 UTC FinishedAt: 2026-09-05 09:55:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*4608ec76-a555-432b-82c0-eee60b64ce08,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-convert-artifact-3859358700/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "2e7de731-459f-4bf9-8cfa-7f08fe384513", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-4103076488/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-05 09:35:03 +0000 UTC FinishedAt: 2026-09-05 09:55:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*4608ec76-a555-432b-82c0-eee60b64ce08,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-convert-artifact-3859358700/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "2e7de731-459f-4bf9-8cfa-7f08fe384513", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-4103076488/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-05 09:55:47 +0000 UTC FinishedAt: 2026-09-05 09:55:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-05 09:55:47 +0000 UTC FinishedAt: 2026-09-05 09:55:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-05 09:55:47 +0000 UTC FinishedAt: 2026-09-05 09:57:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-05 09:55:47 +0000 UTC FinishedAt: 2026-09-05 09:57:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2e7de731-459f-4bf9-8cfa-7f08fe384513,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-4103076488/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },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-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-05 09:57:57 +0000 UTC FinishedAt: 2026-09-05 12:59:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-05 09:57:57 +0000 UTC FinishedAt: 2026-09-05 12:59:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*7f77f9d9-ea5a-4957-b861-a5ef40d35cc0,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2e7de731-459f-4bf9-8cfa-7f08fe384513,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-1166798263/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-4103076488/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-05 09:57:57 +0000 UTC FinishedAt: 2026-09-05 09:58:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-05 09:57:57 +0000 UTC FinishedAt: 2026-09-05 09:58:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-convert-artifact-2713594325/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-05 09:57:57 +0000 UTC FinishedAt: 2026-09-05 09:57:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-05 09:57:57 +0000 UTC FinishedAt: 2026-09-05 09:57:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-05 09:57:57 +0000 UTC FinishedAt: 2026-09-05 09:57:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-05 09:58:07 +0000 UTC FinishedAt: 2026-09-05 12:59:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6fq8d[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_INTEL","KVM_AMD","KVM_GUEST_MEMFD"],"series_id":"d3db87e0-2050-4b46-a2eb-96736648f72a","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-05 09:58:07 +0000 UTC FinishedAt: 2026-09-05 12:59:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7f77f9d9-ea5a-4957-b861-a5ef40d35cc0,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2e7de731-459f-4bf9-8cfa-7f08fe384513,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-1166798263/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-build-action-4103076488/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow6fq8d/series-workflow6fq8d-convert-artifact-2713594325/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}