Name: series-workflowbvbzv Phase: Failed StartedAt: 2026-09-11 16:01:44 +0000 UTC FinishedAt: 2026-09-11 16:21:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbvbzv[0] Phase: Succeeded StartedAt: 2026-09-11 16:01:44 +0000 UTC FinishedAt: 2026-09-11 16:21:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbvbzv[0].run-triage Phase: Succeeded StartedAt: 2026-09-11 16:01:44 +0000 UTC FinishedAt: 2026-09-11 16:21:11 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE2OjIwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpZWQgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gYXJjaC9yaXNjdi8gKFJJU0MtViBLVk0gc3Vic3lzdGVtKS4gQmVjYXVzZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhlc2UgY29kZSBwYXRocyBhcmUgZXhjbHVzaXZlIHRvIFJJU0MtViBhbmQgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIG9uIGFtZDY0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNjoyMDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGRhZTYyMTg3OGVkZjc3MmNkODViMDhlZTFlZmZhNTAxMzQ4YzNjNTVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxNjoyMDo0MiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5pbmRleCBhYWYwODBiYTFiNzdhLi5jNjFhMWJiYjI3MmY0IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5AQCAtOCw3ICYjNDM7OCw3IEBAXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFx1MDAzZVxuLVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0cnVjdCBrdm1fZ3N0YWdlIHtcbiBcdHN0cnVjdCBrdm0gKmt2bTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG5AQCAtMTA4LDcgJiM0MzsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKlxuIHtcbiBcdGdzdGFnZS1cdTAwM2Vrdm0gPSBrdm07XG4gXHRnc3RhZ2UtXHUwMDNlZmxhZ3MgPSAwO1xuLVx0Z3N0YWdlLVx1MDAzZXZtaWQgPSBSRUFEX09OQ0Uoa3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHRnc3RhZ2UtXHUwMDNldm1pZCA9XG4mIzQzO1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGdzdGFnZS1cdTAwM2VwZ2QgPSBrdm0tXHUwMDNlYXJjaC5wZ2Q7XG4gXHRnc3RhZ2UtXHUwMDNlcGdkX2xldmVscyA9IGt2bS1cdTAwM2VhcmNoLnBnZF9sZXZlbHM7XG4gfVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmhcbmluZGV4IDU0MzllNzZmMGE5NjAuLmFhZTliOGFjMDg3OGYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmhcbkBAIC0xNiw2ICYjNDM7MTYsNyBAQCBpbnQga3ZtX3Jpc2N2X21tdV9tYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90LFxuIFx0XHQgICAgICBzdHJ1Y3Qga3ZtX2dzdGFnZV9tYXBwaW5nICpvdXRfbWFwKTtcbiBpbnQga3ZtX3Jpc2N2X21tdV9hbGxvY19wZ2Qoc3RydWN0IGt2bSAqa3ZtKTtcbiB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKTtcbiYjNDM7dm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpO1xuIHZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTtcbiBcbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuQEAgLTYsMjEgJiM0Mzs2LDQyIEBAXG4gI2lmbmRlZiBfX1JJU0NWX0tWTV9WTUlEX0hfXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9WTUlEX0hfXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2F0b21pYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgva3ZtX3R5cGVzLmhcdTAwM2VcbiBcbiBzdHJ1Y3Qga3ZtX3ZtaWQge1xuIFx0Lypcbi1cdCAqIFdyaXRlcyB0byB2bWlkX3ZlcnNpb24gYW5kIHZtaWQgaGFwcGVuIHdpdGggdm1pZF9sb2NrIGhlbGRcbi1cdCAqIHdoZXJlYXMgcmVhZHMgaGFwcGVuIHdpdGhvdXQgYW55IGxvY2sgaGVsZC5cbiYjNDM7XHQgKiBTb2Z0d2FyZSBWTUlEOlxuJiM0MztcdCAqXG4mIzQzO1x0ICogICBbIGdlbmVyYXRpb24gfCBoYXJkd2FyZSBWTUlEIF1cbiYjNDM7XHQgKlxuJiM0MztcdCAqIEtlZXAgdGhlIGlkZW50aXR5IDY0LWJpdCBvbiBSVjMyIHNvIHRoYXQgdGhlIGdlbmVyYXRpb24gZG9lcyBub3RcbiYjNDM7XHQgKiB3cmFwIGF0IHRoZSBuYXRpdmUgd29yZCBzaXplLiAgWmVybyBkZW5vdGVzIGFuIHVuYWxsb2NhdGVkIFZNSUQuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBPbmx5IHRoZSBsb3cgaGFyZHdhcmUgVk1JRCBiaXRzIG1heSBiZSB3cml0dGVuIHRvIEhHQVRQXG4mIzQzO1x0ICogb3IgdXNlZCBhcyBhIGhhcmR3YXJlIGZlbmNlIFZNSUQuXG4gXHQgKi9cbi1cdHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uO1xuLVx0dW5zaWduZWQgbG9uZyB2bWlkO1xuJiM0MztcdGF0b21pYzY0X3QgaWQ7XG4gfTtcbiBcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCk7XG4mIzQzO1xuJiM0MztpbnQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KHZvaWQpO1xuJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpO1xuJiM0MztcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKTtcbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpO1xuJiM0MztcbiBib29sIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZChzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQpO1xuJiM0MztcbiB2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTtcbiBcbiYjNDM7LypcbiYjNDM7ICogSW52YWxpZGF0ZSB0aGUgY3VycmVudCBDUFUmIzM5O3MgZmFzdC1wYXRoIFZNSUQgc3RhdGUgd2hpbGUgcHJlc2VydmluZ1xuJiM0MzsgKiB0aGUgb2xkIGlkZW50aXR5IGNvbnNlcnZhdGl2ZWx5IGluIHJlc2VydmVkX3ZtaWRzLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZCk7XG4mIzQzO1xuICNlbmRpZlxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuaW5kZXggODk1NjhjY2NlMDFkZS4uZDZjNmJlNGRmNjFiMSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG5AQCAtMTYsNyAmIzQzOzE2LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX25hY2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9zYmkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdmNwdV92ZWN0b3IuaFx1MDAzZVxuLVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCBrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCk7XG4gXG4gREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa3ZtX3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSk7XG5AQCAtODQsNiAmIzQzOzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcbiBcbiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXG4ge1xuJiM0MztcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpO1xuIFx0a3ZtX3Jpc2N2X2FpYV9kaXNhYmxlKCk7XG4gXHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcbiBcdGt2bV9yaXNjdl9uYWNsX2Rpc2FibGUoKTtcbkBAIC0xMTIsNiAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3Jpc2N2X2NwdV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmdcbiBcdFx0ICogaXMgZW5hYmxlZCBvbiB0aGlzIENQVS5cbiBcdFx0ICovXG4gXHRcdGlmIChfX3RoaXNfY3B1X3JlYWQoa3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpKSB7XG4mIzQzO1x0XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpO1xuIFx0XHRcdGt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTtcbiBcdFx0XHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcbiBcdFx0fVxuQEAgLTEzMCw2ICYjNDM7MTMyLDcgQEAgc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrdm1fcmlzY3ZfY3B1X3BtX25iID0ge1xuIHN0YXRpYyB2b2lkIGt2bV9yaXNjdl90ZWFyZG93bih2b2lkKVxuIHtcbiBcdGt2bV9yaXNjdl9haWFfZXhpdCgpO1xuJiM0MztcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XG4gXHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XG4gXHRrdm1fcmlzY3Zfdl9leGl0KCk7XG4gXHRrdm1fdW5yZWdpc3Rlcl9wZXJmX2NhbGxiYWNrcygpO1xuQEAgLTE4MSw4ICYjNDM7MTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpXG4gXG4gXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7XG4gXG4mIzQzO1x0cmMgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCgpO1xuJiM0MztcdGlmIChyYykge1xuJiM0MztcdFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuJiM0MztcdFx0cmV0dXJuIHJjO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpO1xuIFx0aWYgKHJjIFx1MDAyNlx1MDAyNiByYyAhPSAtRU5PREVWKSB7XG4mIzQzO1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpO1xuIFx0XHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XG4gXHRcdHJldHVybiByYztcbiBcdH1cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS9tbXUuYyBiL2FyY2gvcmlzY3Yva3ZtL21tdS5jXG5pbmRleCA2MDM1YjVlYzk1MDM5Li45YjU5NzA5MmY4ZWM2IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vbW11LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL21tdS5jXG5AQCAtMTUsNyAmIzQzOzE1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbW11LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX25hY2wuaFx1MDAzZVxuLVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgZWFnZXJfcGFnZV9zcGxpdCA9IHRydWU7XG4gbW9kdWxlX3BhcmFtKGVhZ2VyX3BhZ2Vfc3BsaXQsIGJvb2wsIDA2NDQpO1xuIFxuQEAgLTc5NiwxNiAmIzQzOzc5NiwyMyBAQCB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKVxuIFx0a3ZtX21tdV9mcmVlX21lbW9yeV9jYWNoZShcdTAwMjZrdm0tXHUwMDNlYXJjaC5wZ2Rfc3BsaXRfcGFnZV9jYWNoZSk7XG4gfVxuIFxuLXZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuJiM0Mzt2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgdm1pZClcbiB7XG4gXHRzdHJ1Y3Qga3ZtX2FyY2ggKmthID0gXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaDtcbiBcdHVuc2lnbmVkIGxvbmcgaGdhdHAgPSBrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa2EtXHUwMDNlcGdkX2xldmVscylcbiBcdFx0XHQgICAgICBcdTAwM2NcdTAwM2MgSEdBVFBfTU9ERV9TSElGVDtcbiBcbi1cdGhnYXRwIHw9IChSRUFEX09OQ0Uoa2EtXHUwMDNldm1pZC52bWlkKSBcdTAwM2NcdTAwM2MgSEdBVFBfVk1JRF9TSElGVCkgXHUwMDI2IEhHQVRQX1ZNSUQ7XG4mIzQzO1x0aGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpIFx1MDAzY1x1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcdTAwMjYgSEdBVFBfVk1JRDtcbiBcdGhnYXRwIHw9IChrYS1cdTAwM2VwZ2RfcGh5cyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IEhHQVRQX1BQTjtcbiBcbiBcdG5jc3Jfd3JpdGUoQ1NSX0hHQVRQLCBoZ2F0cCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuJiM0Mzt7XG4mIzQzO1x0dTY0IHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCk7XG4mIzQzO1xuJiM0MztcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XG4gXG4gXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKCkpXG4gXHRcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS90bGIuYyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG5pbmRleCAyYWUzNDYzMmNkY2IxLi5iODVlNWJhMjE5OGFhIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdGxiLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG5AQCAtMjI0LDcgJiM0MzsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0ICogZW50cmllcyBieSBWTUlEIHdoZW5ldmVyIHVuZGVybHlpbmcgSG9zdCBDUFUgY2hhbmdlcyBmb3IgYSBWQ1BVLlxuIFx0ICovXG4gXG4tXHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcbiBcbiBcdC8qXG5AQCAtMjQ0LDcgJiM0MzsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xuQEAgLTI1NSw3ICYjNDM7MjU1LDcgQEAgdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfdnZtYV9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcbkBAIC01MzEsOCAmIzQzOzUzMSwxMSBAQCB2b2lkIGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwoc3RydWN0IGt2bSAqa3ZtLFxuIFxuIGludCBrdm1fYXJjaF9mbHVzaF9yZW1vdGVfdGxic19yYW5nZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgdTY0IG5yX3BhZ2VzKVxuIHtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPVxuJiM0MztcdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4mIzQzO1xuIFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcbiBcdFx0XHRcdCAgICAgICBnZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsIG5yX3BhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULFxuLVx0XHRcdFx0ICAgICAgIFBBR0VfU0hJRlQsIFJFQURfT05DRShrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcbiYjNDM7XHRcdFx0XHQgICAgICAgUEFHRV9TSElGVCwgdm1pZCk7XG4gXHRyZXR1cm4gMDtcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbkBAIC05NDMsMTQgJiM0Mzs5NDMsMTQgQEAgaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0cmV0ID0gMTtcbiBcbi1cdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTtcbi1cbiBcdFx0cmV0ID0ga3ZtX3Jpc2N2X2NoZWNrX3ZjcHVfcmVxdWVzdHModmNwdSk7XG4gXHRcdGlmIChyZXQgXHUwMDNjPSAwKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRwcmVlbXB0X2Rpc2FibGUoKTtcbiBcbiYjNDM7XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XG4mIzQzO1xuIFx0XHQvKiBVcGRhdGUgQUlBIEhXIHN0YXRlIGJlZm9yZSBlbnRlcmluZyBndWVzdCAqL1xuIFx0XHRyZXQgPSBrdm1fcmlzY3ZfdmNwdV9haWFfdXBkYXRlKHZjcHUpO1xuIFx0XHRpZiAocmV0IFx1MDAzYz0gMCkge1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuaW5kZXggNTA2YTUxMGI2YmZmMy4uMWJlMzg2YTc4ZTI3ZiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG5AQCAtMTA0LDcgJiM0MzsxMDQsNyBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3JmZW5jZV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1blxuIFx0XHRrdm1fcmlzY3ZfdmNwdV9wbXVfaW5jcl9mdyh2Y3B1LCBTQklfUE1VX0ZXX0ZFTkNFX0lfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQTpcbi1cdFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4mIzQzO1x0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0aWYgKChjcC1cdTAwM2VhMiA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMyA9PSAwKSB8fCBjcC1cdTAwM2VhMyA9PSAtMVVMKVxuIFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdGVsc2VcbkBAIC0xMTMsNyAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuXG4gXHRcdGt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfSEZFTkNFX1ZWTUFfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQV9BU0lEOlxuLVx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHRcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0XHRpZiAoKGNwLVx1MDAzZWEyID09IDAgXHUwMDI2XHUwMDI2IGNwLVx1MDAzZWEzID09IDApIHx8IGNwLVx1MDAzZWEzID09IC0xVUwpXG4gXHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXG4gXHRcdFx0XHRcdFx0ICAgICAgIGNwLVx1MDAzZWE0LCB2bWlkKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG5pbmRleCBkZTU0NGVhM2YyOGRjLi5jYTNlZmU2M2MxY2YxIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG5AQCAtODgsMTQgJiM0Mzs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcbiBcdFx0aWYgKGNwLVx1MDAzZWE3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9GRU5DRV9JKVxuIFx0XHRcdGt2bV9yaXNjdl9mZW5jZV9pKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xuIFx0XHRlbHNlIGlmIChjcC1cdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfU0ZFTkNFX1ZNQSkge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuJiM0MztcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdFx0ZWxzZVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCBjcC1cdTAwM2VhMSxcbiBcdFx0XHRcdFx0XHRcdCAgY3AtXHUwMDNlYTIsIFBBR0VfU0hJRlQsIHZtaWQpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuJiM0MztcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLFxuIFx0XHRcdFx0XHRcdFx0ICAgICAgIGNwLVx1MDAzZWEzLCB2bWlkKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmMgYi9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbmluZGV4IGMxNWJkYjFkZDhiZWYuLmVlZTgzMDZjMTI3MDcgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xuQEAgLTYsMTEgJiM0Mzs2LDE1IEBAXG4gICogICAgIEFudXAgUGF0ZWwgXHUwMDNjYW51cC5wYXRlbEB3ZGMuY29tXHUwMDNlXG4gICovXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdG1hcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVtYXNrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wZXJjcHUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc21wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1faG9zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2Nzci5oXHUwMDNlXG5AQCAtMTgsMjYgJiM0MzsyMiw1NCBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdGxiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbiA9IDE7XG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0O1xuJiM0MztzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2JpdHMgX19yb19hZnRlcl9pbml0O1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodm1pZF9sb2NrKTtcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9jdXJfaWR4ID0gMTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHZtaWRfbG9jayk7XG4mIzQzO1xuJiM0MztzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljNjRfdCwgYWN0aXZlX3ZtaWRzKTtcbiYjNDM7c3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzZXJ2ZWRfdm1pZHMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGNwdW1hc2tfdCB0bGJfZmx1c2hfcGVuZGluZztcbiYjNDM7XG4mIzQzOyNkZWZpbmUgVk1JRF9GSVJTVF9WRVJTSU9OXHRCSVRfVUxMKHZtaWRfYml0cylcbiYjNDM7I2RlZmluZSBOVU1fVk1JRFNcdFx0QklUKHZtaWRfYml0cylcbiYjNDM7I2RlZmluZSBWTUlEX0hXX01BU0tcdFx0KFZNSURfRklSU1RfVkVSU0lPTiAtIDEpXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCB2bWlkX2dlbl9tYXRjaCh1NjQgdm1pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhKCh2bWlkIF4gYXRvbWljNjRfcmVhZChcdTAwMjZ2bWlkX2dlbmVyYXRpb24pKSBcdTAwM2VcdTAwM2Ugdm1pZF9iaXRzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZClcbiYjNDM7e1xuJiM0MztcdGlmICghdm1pZF9iaXRzKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcdTAwMjYgVk1JRF9IV19NQVNLKTtcbiYjNDM7fVxuIFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZClcbiB7XG4tXHQvKiBGaWd1cmUtb3V0IG51bWJlciBvZiBWTUlEIGJpdHMgaW4gSFcgKi9cbiYjNDM7XHQvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgVk1JRCBiaXRzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gKi9cbiBcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXHUwMDNjXHUwMDNjXG4tXHRcdFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcbiYjNDM7XHRcdCAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7XG4gXHR2bWlkX2JpdHMgPSBjc3JfcmVhZChDU1JfSEdBVFApO1xuIFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcdTAwMjYgSEdBVFBfVk1JRCkgXHUwMDNlXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XG4gXHR2bWlkX2JpdHMgPSBmbHNfbG9uZyh2bWlkX2JpdHMpO1xuIFx0Y3NyX3dyaXRlKENTUl9IR0FUUCwgMCk7XG4gXG4tXHQvKiBXZSBwb2xsdXRlZCBsb2NhbCBUTEIgc28gZmx1c2ggYWxsIGd1ZXN0IFRMQiAqL1xuJiM0MztcdC8qIEZsdXNoIHRoZSBsb2NhbCBndWVzdCBUTEIgYWZ0ZXIgcHJvYmluZyBIR0FUUC4gKi9cbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbiBcbi1cdC8qIFdlIGRvbiYjMzk7dCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXG4tXHRpZiAoKDFVTCBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSBcdTAwM2MgbnVtX3Bvc3NpYmxlX2NwdXMoKSlcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFZNSUQgMCBpcyByZXNlcnZlZC4gIER1cmluZyByb2xsb3ZlciBldmVyeSBwb3NzaWJsZSBDUFUgbWF5XG4mIzQzO1x0ICogcmVzZXJ2ZSBvbmUgaGFyZHdhcmUgVk1JRCwgYW5kIHdlIHN0aWxsIG5lZWQgYXQgbGVhc3Qgb25lIFZNSURcbiYjNDM7XHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHZtaWRfYml0cyBcdTAwMjZcdTAwMjYgTlVNX1ZNSURTIC0gMSBcdTAwM2M9IG51bV9wb3NzaWJsZV9jcHVzKCkpXG4gXHRcdHZtaWRfYml0cyA9IDA7XG4gfVxuIFxuQEAgLTQ2LDgwICYjNDM7NzgsMjk1IEBAIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZClcbiBcdHJldHVybiB2bWlkX2JpdHM7XG4gfVxuIFxuJiM0MztpbnQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgY3B1O1xuJiM0MztcbiYjNDM7XHRpZiAoIXZtaWRfYml0cylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHR2bWlkX21hcCA9IGJpdG1hcF96YWxsb2MoTlVNX1ZNSURTLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIXZtaWRfbWFwKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHZtaWRfY3VyX2lkeCA9IDE7XG4mIzQzO1xuJiM0MztcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cbiYjNDM7XHRfX3NldF9iaXQoMCwgdm1pZF9tYXApO1xuJiM0MztcbiYjNDM7XHRhdG9taWM2NF9zZXQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4mIzQzO1x0XHRhdG9taWM2NF9zZXQoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuJiM0MztcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzXG4mIzQzO1x0ICogZmlyc3QgVk1JRCBhY3RpdmF0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGNwdW1hc2tfY29weShcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZywgY3B1X3Bvc3NpYmxlX21hc2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xuJiM0MztcdHZtaWRfbWFwID0gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKVxuIHtcbi1cdC8qIE1hcmsgdGhlIGluaXRpYWwgVk1JRCBhbmQgVk1JRCB2ZXJzaW9uIGludmFsaWQgKi9cbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZF92ZXJzaW9uID0gMDtcbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCA9IDA7XG4mIzQzO1x0YXRvbWljNjRfc2V0KFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQsIDApO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZClcbiB7XG4mIzQzO1x0dTY0IGlkO1xuJiM0MztcbiBcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uKSAhPVxuLVx0XHRcdFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcbiYjNDM7XHRpZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZC1cdTAwM2VpZCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcbiYjNDM7LypcbiYjNDM7ICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW5cbiYjNDM7ICogYWR2YW5jZWQuXG4mIzQzOyAqXG4mIzQzOyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSURcbiYjNDM7ICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxuJiM0MzsgKiB0aGF0IENQVSYjMzk7cyBuZXh0IFZNSUQgYWN0aXZhdGlvbi5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZClcbiB7XG4tXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4mIzQzO1x0dTY0IHZtaWQ7XG4mIzQzO1x0aW50IGNwdTtcbiYjNDM7XG4mIzQzO1x0Yml0bWFwX3plcm8odm1pZF9tYXAsIE5VTV9WTUlEUyk7XG4mIzQzO1x0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuJiM0MztcdFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGUgQ1BVIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYXVnaHQgYnkgYW4gZWFybGllciByb2xsb3ZlclxuJiM0MztcdFx0ICogd2l0aG91dCBwZXJmb3JtaW5nIGFub3RoZXIgYWN0aXZhdGlvbiBzaW5jZSB0aGVuLiAgSW4gdGhhdFxuJiM0MztcdFx0ICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIXZtaWQpXG4mIzQzO1x0XHRcdHZtaWQgPSBwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpO1xuJiM0MztcbiYjNDM7XHRcdGlmICh2bWlkKVxuJiM0MztcdFx0XHRfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksXG4mIzQzO1x0XHRcdFx0ICB2bWlkX21hcCk7XG4mIzQzO1xuJiM0MztcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjcHVtYXNrX2NvcHkoXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcbiB9XG4gXG4tdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiYjNDM7LypcbiYjNDM7ICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXG4mIzQzOyAqXG4mIzQzOyAqIERvIG5vdCBzdG9wIGFmdGVyIHRoZSBmaXJzdCBtYXRjaDogdGhlIHNhbWUgVk0gbWF5IGhhdmUgYmVlbiBhY3RpdmVcbiYjNDM7ICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHU2NCBvbGRfdm1pZCwgdTY0IG5ld192bWlkKVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cdHN0cnVjdCBrdm1fdmNwdSAqdjtcbi1cdHN0cnVjdCBrdm1fdm1pZCAqdm1pZCA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbiYjNDM7XHRib29sIGhpdCA9IGZhbHNlO1xuJiM0MztcdGludCBjcHU7XG4gXG4tXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSlcbi1cdFx0cmV0dXJuO1xuJiM0MztcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbiYjNDM7XHRcdGlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7XG4mIzQzO1x0XHRcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSBuZXdfdm1pZDtcbiYjNDM7XHRcdFx0aGl0ID0gdHJ1ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBoaXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEFsbG9jYXRlL3Byb21vdGUgYSBzb2Z0d2FyZSBWTUlELlxuJiM0MzsgKlxuJiM0MzsgKiB2bWlkX2xvY2sgbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdTY0IG5ld192bWlkX2xvY2tlZChzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNmt2bV92bWlkLVx1MDAzZWlkKTtcbiYjNDM7XHR1NjQgZ2VuZXJhdGlvbiA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uKTtcbiYjNDM7XHR1NjQgbmV3X3ZtaWQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpZHg7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2dm1pZF9sb2NrKTtcbiYjNDM7XHRpZiAodm1pZCkge1xuJiM0MztcdFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcbiYjNDM7XHRcdFx0ICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBvbGQgVk1JRCBpcyBzdGlsbCBwcm90ZWN0ZWQgYnkgb25lIG9yIG1vcmUgQ1BVcy5cbiYjNDM7XHRcdCAqIEtlZXAgdGhlIHNhbWUgaGFyZHdhcmUgVk1JRCBhbmQgb25seSBwcm9tb3RlIGdlbmVyYXRpb24uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh2bWlkLCBuZXdfdm1pZCkpXG4mIzQzO1x0XHRcdHJldHVybiBuZXdfdm1pZDtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lXG4mIzQzO1x0XHQgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XG4mIzQzO1x0XHRpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSlcbiYjNDM7XHRcdFx0cmV0dXJuIG5ld192bWlkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGaW5kIGEgZnJlZSBWTUlEIGluIHRoZSBjdXJyZW50IGdlbmVyYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7XG4mIzQzO1x0aWYgKGlkeCAhPSBOVU1fVk1JRFMpXG4mIzQzO1x0XHRnb3RvIHNldF92bWlkO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcbiYjNDM7XHQgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJiMzOTtzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0Z2VuZXJhdGlvbiAmIzQzOz0gVk1JRF9GSVJTVF9WRVJTSU9OO1xuJiM0MztcbiYjNDM7XHQvKiBTb2Z0d2FyZSBWTUlEIDAgaXMgcmVzZXJ2ZWQgYXMgdGhlIGludmFsaWQgaWRlbnRpZmllci4gKi9cbiYjNDM7XHRpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKVxuJiM0MztcdFx0Z2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjtcbiYjNDM7XG4mIzQzO1x0YXRvbWljNjRfeGNoZyhcdTAwMjZ2bWlkX2dlbmVyYXRpb24sIGdlbmVyYXRpb24pO1xuJiM0MztcdGZsdXNoX2NvbnRleHQoKTtcbiBcbiBcdC8qXG4tXHQgKiBXZSBuZWVkIHRvIHJlLWNoZWNrIHRoZSB2bWlkX3ZlcnNpb24gaGVyZSB0byBlbnN1cmUgdGhhdCBpZlxuLVx0ICogYW5vdGhlciB2Y3B1IGFscmVhZHkgYWxsb2NhdGVkIGEgdmFsaWQgdm1pZCBmb3IgdGhpcyB2bS5cbiYjNDM7XHQgKiBOVU1fVk1JRFMgLSAxIFx1MDAzZSBudW1fcG9zc2libGVfY3B1cygpLCB0aGVyZWZvcmUgcm9sbG92ZXIgbXVzdFxuJiM0MztcdCAqIGxlYXZlIGF0IGxlYXN0IG9uZSBhbGxvY2F0YWJsZSBoYXJkd2FyZSBWTUlELlxuIFx0ICovXG4tXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZ2bWlkX2xvY2spO1xuJiM0MztcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCAxKTtcbiYjNDM7XG4mIzQzO3NldF92bWlkOlxuJiM0MztcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcbiYjNDM7XHR2bWlkX2N1cl9pZHggPSBpZHg7XG4mIzQzO1xuJiM0MztcdHJldHVybiBnZW5lcmF0aW9uIHwgaWR4O1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGt2bV92bWlkICprdm1fdm1pZCA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbiYjNDM7XHRhdG9taWM2NF90ICphY3RpdmU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBmbGFncztcbiYjNDM7XHR1NjQgdm1pZDtcbiYjNDM7XHR1NjQgb2xkX2FjdGl2ZV92bWlkO1xuJiM0MztcdHVuc2lnbmVkIGludCBjcHU7XG4mIzQzO1xuJiM0MztcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm47XG4tXHR9XG4gXG4tXHQvKiBGaXJzdCB1c2VyIG9mIGEgbmV3IFZNSUQgdmVyc2lvbj8gKi9cbi1cdGlmICh1bmxpa2VseSh2bWlkX25leHQgPT0gMCkpIHtcbi1cdFx0V1JJVEVfT05DRSh2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pICYjNDM7IDEpO1xuLVx0XHR2bWlkX25leHQgPSAxO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogYWN0aXZlX3ZtaWRzIGFuZCB0bGJfZmx1c2hfcGVuZGluZyBhcmUgcGVyLUNQVSBzdGF0ZS4gIEtlZXAgdGhlXG4mIzQzO1x0ICogY29tcGxldGUgVk1JRCBhY3RpdmF0aW9uIG9uIHRoZSBzYW1lIENQVS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRsb2NrZGVwX2Fzc2VydF9wcmVlbXB0aW9uX2Rpc2FibGVkKCk7XG4mIzQzO1xuJiM0MztcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcbiYjNDM7XHRhY3RpdmUgPSB0aGlzX2NwdV9wdHIoXHUwMDI2YWN0aXZlX3ZtaWRzKTtcbiYjNDM7XG4mIzQzO1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuJiM0MztcdG9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZhc3QgcGF0aC5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIFRoZSBjbXB4Y2hnIHJhY2VzIHdpdGggZmx1c2hfY29udGV4dCgpJiMzOTtzIHhjaGcgb24gdGhlIHNhbWVcbiYjNDM7XHQgKiBwZXItQ1BVIGF0b21pYy4gIEVpdGhlciB0aGlzIGFjdGl2YXRpb24gaXMgY2FwdHVyZWQgYnkgcm9sbG92ZXIsXG4mIzQzO1x0ICogb3Igcm9sbG92ZXIgY2xlYXJzIGFjdGl2ZSBmaXJzdCBhbmQgdGhlIGNtcHhjaGcgZmFpbHMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKG9sZF9hY3RpdmVfdm1pZCBcdTAwMjZcdTAwMjYgdm1pZF9nZW5fbWF0Y2godm1pZCkpIHtcbiBcdFx0Lypcbi1cdFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxuLVx0XHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxuLVx0XHQgKlxuLVx0XHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3Rcbi1cdFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxuLVx0XHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XG4tXHRcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxuLVx0XHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXG4tXHRcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XG4tXHRcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxuLVx0XHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cbiYjNDM7XHRcdCAqIEhHQVRQIG11c3QgY29udGFpbiB0aGUgc2FtZSBoYXJkd2FyZSBWTUlEIHRoYXQgaXMgcHVibGlzaGVkXG4mIzQzO1x0XHQgKiBpbiBhY3RpdmVfdm1pZHMuXG4gXHRcdCAqL1xuLVx0XHRvbl9lYWNoX2NwdV9tYXNrKGNwdV9vbmxpbmVfbWFzaywgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwsXG4tXHRcdFx0XHQgTlVMTCwgMSk7XG4mIzQzO1x0XHRpZiAob2xkX2FjdGl2ZV92bWlkICE9IHZtaWQpXG4mIzQzO1x0XHRcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGF0b21pYzY0X2NtcHhjaGcoYWN0aXZlLCBvbGRfYWN0aXZlX3ZtaWQsIHZtaWQpID09XG4mIzQzO1x0XHQgICAgb2xkX2FjdGl2ZV92bWlkKVxuJiM0MztcdFx0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHR2bWlkLVx1MDAzZXZtaWQgPSB2bWlkX25leHQ7XG4tXHR2bWlkX25leHQmIzQzOyYjNDM7O1xuLVx0dm1pZF9uZXh0IFx1MDAyNj0gKDEgXHUwMDNjXHUwMDNjIHZtaWRfYml0cykgLSAxO1xuJiM0MztcdHJhd19zcGluX2xvY2tfaXJxc2F2ZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiBcbi1cdFdSSVRFX09OQ0Uodm1pZC1cdTAwM2V2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFJlLXJlYWQgdW5kZXIgdGhlIGFsbG9jYXRvciBsb2NrIGJlY2F1c2UgYW5vdGhlciB2Q1BVIG9mIHRoaXMgVk1cbiYjNDM7XHQgKiBtYXkgYWxyZWFkeSBoYXZlIHByb21vdGVkIG9yIGFsbG9jYXRlZCB0aGUgc2hhcmVkIFZNSUQuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXZtaWRfZ2VuX21hdGNoKHZtaWQpKSB7XG4mIzQzO1x0XHR2bWlkID0gbmV3X3ZtaWRfbG9ja2VkKGt2bV92bWlkKTtcbiYjNDM7XHRcdGF0b21pYzY0X3NldChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCwgdm1pZCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENvbXBsZXRlIHRoaXMgQ1BVJiMzOTtzIGRlZmVycmVkIHJvbGxvdmVyIGludmFsaWRhdGlvbiBiZWZvcmVcbiYjNDM7XHQgKiBpbnN0YWxsaW5nIHRoZSBuZXcgaGFyZHdhcmUgVk1JRC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoY3B1LCBcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZykpXG4mIzQzO1x0XHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogSW5zdGFsbCB0aGUgY3VycmVudCBoYXJkd2FyZSBWTUlEIGJlZm9yZSBwdWJsaXNoaW5nIHRoaXMgQ1BVIGFzXG4mIzQzO1x0ICogYWN0aXZlIHdpdGggdGhlIG5ldyBzb2Z0d2FyZSBWTUlELlxuJiM0MztcdCAqL1xuJiM0MztcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogT25jZSBhY3RpdmVfdm1pZHMgaXMgdmlzaWJsZSwgdGhlIHJlcXVpcmVkIGxvY2FsIGludmFsaWRhdGlvbiBhbmRcbiYjNDM7XHQgKiBIR0FUUCB1cGRhdGUgYXJlIGNvbXBsZXRlLlxuJiM0MztcdCAqL1xuJiM0MztcdGF0b21pYzY0X3NldChhY3RpdmUsIHZtaWQpO1xuJiM0MztcbiYjNDM7XHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiYjNDM7fVxuIFxuLVx0c3Bpbl91bmxvY2soXHUwMDI2dm1pZF9sb2NrKTtcbiYjNDM7LypcbiYjNDM7ICogQ1BVIHZpcnR1YWxpemF0aW9uL0NTUiBzdGF0ZSBpcyBiZWluZyBkaXNjYXJkZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0XG4mIzQzOyAqIGlkZW50aXR5IGluc3RlYWQgb2YgbWFraW5nIGl0cyBoYXJkd2FyZSBWTUlEIGltbWVkaWF0ZWx5IHJldXNhYmxlLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG4mIzQzO1x0dTY0IHZtaWQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IGNwdTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF2bWlkX2JpdHMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcbiYjNDM7XG4mIzQzO1x0Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpO1xuJiM0MztcbiYjNDM7XHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4mIzQzO1xuJiM0MztcdHZtaWQgPSBhdG9taWM2NF94Y2hnKHRoaXNfY3B1X3B0cihcdTAwMjZhY3RpdmVfdm1pZHMpLCAwKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHZtaWQpXG4mIzQzO1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gdm1pZDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZiBhY3RpdmUgd2FzIGFscmVhZHkgemVybywgcmV0YWluIHRoZSBvbGQgcmVzZXJ2ZWQgZW50cnkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y3B1bWFza19zZXRfY3B1KGNwdSwgXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcpO1xuIFxuLVx0LyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi9cbi1cdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXHUwMDNla3ZtKVxuLVx0XHRrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVVBEQVRFX0hHQVRQLCB2KTtcbiYjNDM7XHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiB9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTY6MjA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpZWQgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gYXJjaC9yaXNjdi8gKFJJU0MtViBLVk0gc3Vic3lzdGVtKS4gQmVjYXVzZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhlc2UgY29kZSBwYXRocyBhcmUgZXhjbHVzaXZlIHRvIFJJU0MtViBhbmQgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIG9uIGFtZDY0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGRhZTYyMTg3OGVkZjc3MmNkODViMDhlZTFlZmZhNTAxMzQ4YzNjNTUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIFNlcCAxMSAxNjoyMDo0MiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKaW5kZXggYWFmMDgwYmExYjc3YS4uYzYxYTFiYmIyNzJmNCAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKQEAgLTgsNyAmIzQzOzgsNyBAQAogI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF8KIAogI2luY2x1ZGUgJmx0O2xpbnV4L2t2bV90eXBlcy5oJmd0OwotCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0Owogc3RydWN0IGt2bV9nc3RhZ2UgewogCXN0cnVjdCBrdm0gKmt2bTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTA4LDcgJiM0MzsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKgogewogCWdzdGFnZS0mZ3Q7a3ZtID0ga3ZtOwogCWdzdGFnZS0mZ3Q7ZmxhZ3MgPSAwOwotCWdzdGFnZS0mZ3Q7dm1pZCA9IFJFQURfT05DRShrdm0tJmd0O2FyY2gudm1pZC52bWlkKTsKJiM0MzsJZ3N0YWdlLSZndDt2bWlkID0KJiM0MzsJCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCWdzdGFnZS0mZ3Q7cGdkID0ga3ZtLSZndDthcmNoLnBnZDsKIAlnc3RhZ2UtJmd0O3BnZF9sZXZlbHMgPSBrdm0tJmd0O2FyY2gucGdkX2xldmVsczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmgKaW5kZXggNTQzOWU3NmYwYTk2MC4uYWFlOWI4YWMwODc4ZiAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmgKQEAgLTE2LDYgJiM0MzsxNiw3IEBAIGludCBrdm1fcmlzY3ZfbW11X21hcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsCiAJCSAgICAgIHN0cnVjdCBrdm1fZ3N0YWdlX21hcHBpbmcgKm91dF9tYXApOwogaW50IGt2bV9yaXNjdl9tbXVfYWxsb2NfcGdkKHN0cnVjdCBrdm0gKmt2bSk7CiB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKTsKJiM0Mzt2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgdm1pZCk7CiB2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oCmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmgKQEAgLTYsMjEgJiM0Mzs2LDQyIEBACiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF8KICNkZWZpbmUgX19SSVNDVl9LVk1fVk1JRF9IXwogCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2F0b21pYy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2t2bV90eXBlcy5oJmd0OwogCiBzdHJ1Y3Qga3ZtX3ZtaWQgewogCS8qCi0JICogV3JpdGVzIHRvIHZtaWRfdmVyc2lvbiBhbmQgdm1pZCBoYXBwZW4gd2l0aCB2bWlkX2xvY2sgaGVsZAotCSAqIHdoZXJlYXMgcmVhZHMgaGFwcGVuIHdpdGhvdXQgYW55IGxvY2sgaGVsZC4KJiM0MzsJICogU29mdHdhcmUgVk1JRDoKJiM0MzsJICoKJiM0MzsJICogICBbIGdlbmVyYXRpb24gfCBoYXJkd2FyZSBWTUlEIF0KJiM0MzsJICoKJiM0MzsJICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdAomIzQzOwkgKiB3cmFwIGF0IHRoZSBuYXRpdmUgd29yZCBzaXplLiAgWmVybyBkZW5vdGVzIGFuIHVuYWxsb2NhdGVkIFZNSUQuCiYjNDM7CSAqCiYjNDM7CSAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFAKJiM0MzsJICogb3IgdXNlZCBhcyBhIGhhcmR3YXJlIGZlbmNlIFZNSUQuCiAJICovCi0JdW5zaWduZWQgbG9uZyB2bWlkX3ZlcnNpb247Ci0JdW5zaWduZWQgbG9uZyB2bWlkOwomIzQzOwlhdG9taWM2NF90IGlkOwogfTsKIAogdm9pZCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCh2b2lkKTsKIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCk7CiYjNDM7CiYjNDM7aW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKTsKJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpOwomIzQzOwogaW50IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9pbml0KHN0cnVjdCBrdm0gKmt2bSk7CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZCk7CiYjNDM7CiBib29sIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZChzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQpOwomIzQzOwogdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKJiM0MzsvKgomIzQzOyAqIEludmFsaWRhdGUgdGhlIGN1cnJlbnQgQ1BVJiMzOTtzIGZhc3QtcGF0aCBWTUlEIHN0YXRlIHdoaWxlIHByZXNlcnZpbmcKJiM0MzsgKiB0aGUgb2xkIGlkZW50aXR5IGNvbnNlcnZhdGl2ZWx5IGluIHJlc2VydmVkX3ZtaWRzLgomIzQzOyAqLwomIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpOwomIzQzOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS9tYWluLmMgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmMKaW5kZXggODk1NjhjY2NlMDFkZS4uZDZjNmJlNGRmNjFiMSAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uYwpAQCAtMTYsNyAmIzQzOzE2LDcgQEAKICNpbmNsdWRlICZsdDthc20va3ZtX25hY2wuaCZndDsKICNpbmNsdWRlICZsdDthc20vc2JpLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YXNtL2t2bV92Y3B1X3ZlY3Rvci5oJmd0OwotCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0Owogc3RhdGljIERFRklORV9QRVJfQ1BVKGJvb2wsIGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKTsKIAogREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa3ZtX3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSk7CkBAIC04NCw2ICYjNDM7ODQsNyBAQCBpbnQga3ZtX2FyY2hfZW5hYmxlX3ZpcnR1YWxpemF0aW9uX2NwdSh2b2lkKQogCiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpCiB7CiYjNDM7CWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpOwogCWt2bV9yaXNjdl9haWFfZGlzYWJsZSgpOwogCWt2bV9yaXNjdl9jc3JfY2xlYW51cCgpOwogCWt2bV9yaXNjdl9uYWNsX2Rpc2FibGUoKTsKQEAgLTExMiw2ICYjNDM7MTEzLDcgQEAgc3RhdGljIGludCBrdm1fcmlzY3ZfY3B1X3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZwogCQkgKiBpcyBlbmFibGVkIG9uIHRoaXMgQ1BVLgogCQkgKi8KIAkJaWYgKF9fdGhpc19jcHVfcmVhZChrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCkpIHsKJiM0MzsJCQlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUoKTsKIAkJCWt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTsKIAkJCWt2bV9yaXNjdl9jc3JfY2xlYW51cCgpOwogCQl9CkBAIC0xMzAsNiAmIzQzOzEzMiw3IEBAIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3ZtX3Jpc2N2X2NwdV9wbV9uYiA9IHsKIHN0YXRpYyB2b2lkIGt2bV9yaXNjdl90ZWFyZG93bih2b2lkKQogewogCWt2bV9yaXNjdl9haWFfZXhpdCgpOwomIzQzOwlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpOwogCWt2bV9yaXNjdl9uYWNsX2V4aXQoKTsKIAlrdm1fcmlzY3Zfdl9leGl0KCk7CiAJa3ZtX3VucmVnaXN0ZXJfcGVyZl9jYWxsYmFja3MoKTsKQEAgLTE4MSw4ICYjNDM7MTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpCiAKIAlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7CiAKJiM0MzsJcmMgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCgpOwomIzQzOwlpZiAocmMpIHsKJiM0MzsJCWt2bV9yaXNjdl9uYWNsX2V4aXQoKTsKJiM0MzsJCXJldHVybiByYzsKJiM0MzsJfQomIzQzOwogCXJjID0ga3ZtX3Jpc2N2X2FpYV9pbml0KCk7CiAJaWYgKHJjICZhbXA7JmFtcDsgcmMgIT0gLUVOT0RFVikgewomIzQzOwkJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTsKIAkJa3ZtX3Jpc2N2X25hY2xfZXhpdCgpOwogCQlyZXR1cm4gcmM7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vbW11LmMgYi9hcmNoL3Jpc2N2L2t2bS9tbXUuYwppbmRleCA2MDM1YjVlYzk1MDM5Li45YjU5NzA5MmY4ZWM2IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS9tbXUuYwpAQCAtMTUsNyAmIzQzOzE1LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC9zaWduYWwuaCZndDsKICNpbmNsdWRlICZsdDthc20va3ZtX21tdS5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9rdm1fbmFjbC5oJmd0OwotCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0Owogc3RhdGljIGJvb2wgX19yZWFkX21vc3RseSBlYWdlcl9wYWdlX3NwbGl0ID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbShlYWdlcl9wYWdlX3NwbGl0LCBib29sLCAwNjQ0KTsKIApAQCAtNzk2LDE2ICYjNDM7Nzk2LDIzIEBAIHZvaWQga3ZtX3Jpc2N2X21tdV9mcmVlX3BnZChzdHJ1Y3Qga3ZtICprdm0pCiAJa3ZtX21tdV9mcmVlX21lbW9yeV9jYWNoZSgmYW1wO2t2bS0mZ3Q7YXJjaC5wZ2Rfc3BsaXRfcGFnZV9jYWNoZSk7CiB9CiAKLXZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQomIzQzO3ZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCB2bWlkKQogewogCXN0cnVjdCBrdm1fYXJjaCAqa2EgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaDsKIAl1bnNpZ25lZCBsb25nIGhnYXRwID0ga3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGthLSZndDtwZ2RfbGV2ZWxzKQogCQkJICAgICAgJmx0OyZsdDsgSEdBVFBfTU9ERV9TSElGVDsKIAotCWhnYXRwIHw9IChSRUFEX09OQ0Uoa2EtJmd0O3ZtaWQudm1pZCkgJmx0OyZsdDsgSEdBVFBfVk1JRF9TSElGVCkgJmFtcDsgSEdBVFBfVk1JRDsKJiM0MzsJaGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpICZsdDsmbHQ7IEhHQVRQX1ZNSURfU0hJRlQpICZhbXA7IEhHQVRQX1ZNSUQ7CiAJaGdhdHAgfD0gKGthLSZndDtwZ2RfcGh5cyAmZ3Q7Jmd0OyBQQUdFX1NISUZUKSAmYW1wOyBIR0FUUF9QUE47CiAKIAluY3NyX3dyaXRlKENTUl9IR0FUUCwgaGdhdHApOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKJiM0Mzt7CiYjNDM7CXU2NCB2bWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLmlkKTsKJiM0MzsKJiM0MzsJa3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTsKIAogCWlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHMoKSkKIAkJa3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdGxiLmMgYi9hcmNoL3Jpc2N2L2t2bS90bGIuYwppbmRleCAyYWUzNDYzMmNkY2IxLi5iODVlNWJhMjE5OGFhIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS90bGIuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS90bGIuYwpAQCAtMjI0LDcgJiM0MzsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCSAqIGVudHJpZXMgYnkgVk1JRCB3aGVuZXZlciB1bmRlcmx5aW5nIEhvc3QgQ1BVIGNoYW5nZXMgZm9yIGEgVkNQVS4KIAkgKi8KIAotCXZtaWQgPSBSRUFEX09OQ0UodmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQudm1pZCk7CiYjNDM7CXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAlrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfdm1pZF9hbGwodm1pZCk7CiAKIAkvKgpAQCAtMjQ0LDcgJiM0MzsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCBrdm1fdm1pZCAqdiA9ICZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQ7Ci0JdW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtJmd0O3ZtaWQpOwomIzQzOwl1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7di0mZ3Q7aWQpKTsKIAogCWlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSkKIAkJbmFjbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbChuYWNsX3NobWVtKCksIHZtaWQpOwpAQCAtMjU1LDcgJiM0MzsyNTUsNyBAQCB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB2b2lkIGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGxfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV92bWlkICp2ID0gJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZDsKLQl1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi0mZ3Q7dm1pZCk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2LSZndDtpZCkpOwogCiAJaWYgKGt2bV9yaXNjdl9uYWNsX2F2YWlsYWJsZSgpKQogCQluYWNsX2hmZW5jZV92dm1hX2FsbChuYWNsX3NobWVtKCksIHZtaWQpOwpAQCAtNTMxLDggJiM0Mzs1MzEsMTEgQEAgdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHN0cnVjdCBrdm0gKmt2bSwKIAogaW50IGt2bV9hcmNoX2ZsdXNoX3JlbW90ZV90bGJzX3JhbmdlKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCB1NjQgbnJfcGFnZXMpCiB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdm1pZCA9CiYjNDM7CQlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKJiM0MzsKIAlrdm1fcmlzY3ZfaGZlbmNlX2d2bWFfdm1pZF9ncGEoa3ZtLCAtMVVMLCAwLAogCQkJCSAgICAgICBnZm4gJmx0OyZsdDsgUEFHRV9TSElGVCwgbnJfcGFnZXMgJmx0OyZsdDsgUEFHRV9TSElGVCwKLQkJCQkgICAgICAgUEFHRV9TSElGVCwgUkVBRF9PTkNFKGt2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpKTsKJiM0MzsJCQkJICAgICAgIFBBR0VfU0hJRlQsIHZtaWQpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jCmluZGV4IGUwNjJjYTE5ZjlkOGYuLjg1NTQyYzFhNWVjM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMKQEAgLTk0MywxNCAmIzQzOzk0MywxNCBAQCBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCQkJY29udGludWU7CiAJCXJldCA9IDE7CiAKLQkJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTsKLQogCQlyZXQgPSBrdm1fcmlzY3ZfY2hlY2tfdmNwdV9yZXF1ZXN0cyh2Y3B1KTsKIAkJaWYgKHJldCAmbHQ7PSAwKQogCQkJY29udGludWU7CiAKIAkJcHJlZW1wdF9kaXNhYmxlKCk7CiAKJiM0MzsJCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7CiYjNDM7CiAJCS8qIFVwZGF0ZSBBSUEgSFcgc3RhdGUgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovCiAJCXJldCA9IGt2bV9yaXNjdl92Y3B1X2FpYV91cGRhdGUodmNwdSk7CiAJCWlmIChyZXQgJmx0Oz0gMCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jCmluZGV4IDUwNmE1MTBiNmJmZjMuLjFiZTM4NmE3OGUyN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmMKQEAgLTEwNCw3ICYjNDM7MTA0LDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4KIAkJa3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19GRU5DRV9JX1NFTlQpOwogCQlicmVhazsKIAljYXNlIFNCSV9FWFRfUkZFTkNFX1JFTU9URV9TRkVOQ0VfVk1BOgotCQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwkJdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCQlpZiAoKGNwLSZndDthMiA9PSAwICZhbXA7JmFtcDsgY3AtJmd0O2EzID09IDApIHx8IGNwLSZndDthMyA9PSAtMVVMKQogCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7CiAJCWVsc2UKQEAgLTExMyw3ICYjNDM7MTEzLDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4KIAkJa3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19IRkVOQ0VfVlZNQV9TRU5UKTsKIAkJYnJlYWs7CiAJY2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQV9BU0lEOgotCQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwkJdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCQlpZiAoKGNwLSZndDthMiA9PSAwICZhbXA7JmFtcDsgY3AtJmd0O2EzID09IDApIHx8IGNwLSZndDthMyA9PSAtMVVMKQogCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtJmd0O2t2bSwgaGJhc2UsIGhtYXNrLAogCQkJCQkJICAgICAgIGNwLSZndDthNCwgdm1pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jCmluZGV4IGRlNTQ0ZWEzZjI4ZGMuLmNhM2VmZTYzYzFjZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jCkBAIC04OCwxNCAmIzQzOzg4LDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfdjAxX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAogCQlpZiAoY3AtJmd0O2E3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9GRU5DRV9JKQogCQkJa3ZtX3Jpc2N2X2ZlbmNlX2kodmNwdS0mZ3Q7a3ZtLCBoYmFzZSwgaG1hc2spOwogCQllbHNlIGlmIChjcC0mZ3Q7YTcgPT0gU0JJX0VYVF8wXzFfUkVNT1RFX1NGRU5DRV9WTUEpIHsKLQkJCXZtaWQgPSBSRUFEX09OQ0UodmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQudm1pZCk7CiYjNDM7CQkJdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCQkJaWYgKGNwLSZndDthMSA9PSAwICZhbXA7JmFtcDsgY3AtJmd0O2EyID09IDApCiAJCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7CiAJCQllbHNlCiAJCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywgY3AtJmd0O2ExLAogCQkJCQkJCSAgY3AtJmd0O2EyLCBQQUdFX1NISUZULCB2bWlkKTsKIAkJfSBlbHNlIHsKLQkJCXZtaWQgPSBSRUFEX09OQ0UodmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQudm1pZCk7CiYjNDM7CQkJdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCQkJaWYgKGNwLSZndDthMSA9PSAwICZhbXA7JmFtcDsgY3AtJmd0O2EyID09IDApCiAJCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtJmd0O2t2bSwgaGJhc2UsIGhtYXNrLAogCQkJCQkJCSAgICAgICBjcC0mZ3Q7YTMsIHZtaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jCmluZGV4IGMxNWJkYjFkZDhiZWYuLmVlZTgzMDZjMTI3MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92bWlkLmMKQEAgLTYsMTEgJiM0Mzs2LDE1IEBACiAgKiAgICAgQW51cCBQYXRlbCAmbHQ7YW51cC5wYXRlbEB3ZGMuY29tJmd0OwogICovCiAKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYml0bWFwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYml0b3BzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3B1bWFzay5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2Vycm5vLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZXJyLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3BlcmNwdS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wcmVlbXB0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zbXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9rdm1faG9zdC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9jc3IuaCZndDsKQEAgLTE4LDI2ICYjNDM7MjIsNTQgQEAKICNpbmNsdWRlICZsdDthc20va3ZtX3RsYi5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX3ZlcnNpb24gPSAxOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0OwomIzQzO3N0YXRpYyBhdG9taWM2NF90IHZtaWRfZ2VuZXJhdGlvbjsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm1pZF9tYXA7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2JpdHMgX19yb19hZnRlcl9pbml0Owotc3RhdGljIERFRklORV9TUElOTE9DSyh2bWlkX2xvY2spOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfY3VyX2lkeCA9IDE7CiYjNDM7CiYjNDM7c3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodm1pZF9sb2NrKTsKJiM0MzsKJiM0MztzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljNjRfdCwgYWN0aXZlX3ZtaWRzKTsKJiM0MztzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNlcnZlZF92bWlkcyk7CiYjNDM7CiYjNDM7c3RhdGljIGNwdW1hc2tfdCB0bGJfZmx1c2hfcGVuZGluZzsKJiM0MzsKJiM0MzsjZGVmaW5lIFZNSURfRklSU1RfVkVSU0lPTglCSVRfVUxMKHZtaWRfYml0cykKJiM0MzsjZGVmaW5lIE5VTV9WTUlEUwkJQklUKHZtaWRfYml0cykKJiM0MzsjZGVmaW5lIFZNSURfSFdfTUFTSwkJKFZNSURfRklSU1RfVkVSU0lPTiAtIDEpCiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgdm1pZF9nZW5fbWF0Y2godTY0IHZtaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gISgodm1pZCBeIGF0b21pYzY0X3JlYWQoJmFtcDt2bWlkX2dlbmVyYXRpb24pKSAmZ3Q7Jmd0OyB2bWlkX2JpdHMpOwomIzQzO30KJiM0MzsKJiM0Mzt1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHU2NCB2bWlkKQomIzQzO3sKJiM0MzsJaWYgKCF2bWlkX2JpdHMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuICh1bnNpZ25lZCBsb25nKSh2bWlkICZhbXA7IFZNSURfSFdfTUFTSyk7CiYjNDM7fQogCiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpCiB7Ci0JLyogRmlndXJlLW91dCBudW1iZXIgb2YgVk1JRCBiaXRzIGluIEhXICovCiYjNDM7CS8qIEZpZ3VyZSBvdXQgdGhlIG51bWJlciBvZiBWTUlEIGJpdHMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlLiAqLwogCWNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgJmx0OyZsdDsKLQkJCSAgICAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7CiYjNDM7CQkgICBIR0FUUF9NT0RFX1NISUZUKSB8IEhHQVRQX1ZNSUQpOwogCXZtaWRfYml0cyA9IGNzcl9yZWFkKENTUl9IR0FUUCk7CiAJdm1pZF9iaXRzID0gKHZtaWRfYml0cyAmYW1wOyBIR0FUUF9WTUlEKSAmZ3Q7Jmd0OyBIR0FUUF9WTUlEX1NISUZUOwogCXZtaWRfYml0cyA9IGZsc19sb25nKHZtaWRfYml0cyk7CiAJY3NyX3dyaXRlKENTUl9IR0FUUCwgMCk7CiAKLQkvKiBXZSBwb2xsdXRlZCBsb2NhbCBUTEIgc28gZmx1c2ggYWxsIGd1ZXN0IFRMQiAqLwomIzQzOwkvKiBGbHVzaCB0aGUgbG9jYWwgZ3Vlc3QgVExCIGFmdGVyIHByb2JpbmcgSEdBVFAuICovCiAJa3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpOwogCi0JLyogV2UgZG9uJiMzOTt0IHVzZSBWTUlEIGJpdHMgaWYgdGhleSBhcmUgbm90IHN1ZmZpY2llbnQgKi8KLQlpZiAoKDFVTCAmbHQ7Jmx0OyB2bWlkX2JpdHMpICZsdDsgbnVtX3Bvc3NpYmxlX2NwdXMoKSkKJiM0MzsJLyoKJiM0MzsJICogVk1JRCAwIGlzIHJlc2VydmVkLiAgRHVyaW5nIHJvbGxvdmVyIGV2ZXJ5IHBvc3NpYmxlIENQVSBtYXkKJiM0MzsJICogcmVzZXJ2ZSBvbmUgaGFyZHdhcmUgVk1JRCwgYW5kIHdlIHN0aWxsIG5lZWQgYXQgbGVhc3Qgb25lIFZNSUQKJiM0MzsJICogYXZhaWxhYmxlIGZvciBhIG5ldyBhbGxvY2F0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWYgKHZtaWRfYml0cyAmYW1wOyZhbXA7IE5VTV9WTUlEUyAtIDEgJmx0Oz0gbnVtX3Bvc3NpYmxlX2NwdXMoKSkKIAkJdm1pZF9iaXRzID0gMDsKIH0KIApAQCAtNDYsODAgJiM0Mzs3OCwyOTUgQEAgdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYml0cyh2b2lkKQogCXJldHVybiB2bWlkX2JpdHM7CiB9CiAKJiM0MztpbnQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgY3B1OwomIzQzOwomIzQzOwlpZiAoIXZtaWRfYml0cykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwl2bWlkX21hcCA9IGJpdG1hcF96YWxsb2MoTlVNX1ZNSURTLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCF2bWlkX21hcCkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwl2bWlkX2N1cl9pZHggPSAxOwomIzQzOwomIzQzOwkvKiBIYXJkd2FyZSBWTUlEIDAgaXMgcmVzZXJ2ZWQuICovCiYjNDM7CV9fc2V0X2JpdCgwLCB2bWlkX21hcCk7CiYjNDM7CiYjNDM7CWF0b21pYzY0X3NldCgmYW1wO3ZtaWRfZ2VuZXJhdGlvbiwgVk1JRF9GSVJTVF9WRVJTSU9OKTsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewomIzQzOwkJYXRvbWljNjRfc2V0KCZhbXA7cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApOwomIzQzOwkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRXZlcnkgQ1BVIHBlcmZvcm1zIGFuIGluaXRpYWwgbG9jYWwgaW52YWxpZGF0aW9uIGJlZm9yZSBpdHMKJiM0MzsJICogZmlyc3QgVk1JRCBhY3RpdmF0aW9uLgomIzQzOwkgKi8KJiM0MzsJY3B1bWFza19jb3B5KCZhbXA7dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUodm9pZCkKJiM0Mzt7CiYjNDM7CWJpdG1hcF9mcmVlKHZtaWRfbWFwKTsKJiM0MzsJdm1pZF9tYXAgPSBOVUxMOwomIzQzO30KJiM0MzsKIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pCiB7Ci0JLyogTWFyayB0aGUgaW5pdGlhbCBWTUlEIGFuZCBWTUlEIHZlcnNpb24gaW52YWxpZCAqLwotCWt2bS0mZ3Q7YXJjaC52bWlkLnZtaWRfdmVyc2lvbiA9IDA7Ci0Ja3ZtLSZndDthcmNoLnZtaWQudm1pZCA9IDA7CiYjNDM7CWF0b21pYzY0X3NldCgmYW1wO2t2bS0mZ3Q7YXJjaC52bWlkLmlkLCAwKTsKIAogCXJldHVybiAwOwogfQogCiBib29sIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZChzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQpCiB7CiYjNDM7CXU2NCBpZDsKJiM0MzsKIAlpZiAoIXZtaWRfYml0cykKIAkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIHVubGlrZWx5KFJFQURfT05DRSh2bWlkLSZndDt2bWlkX3ZlcnNpb24pICE9Ci0JCQlSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7CiYjNDM7CWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO3ZtaWQtJmd0O2lkKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHVubGlrZWx5KCF2bWlkX2dlbl9tYXRjaChpZCkpOwogfQogCi1zdGF0aWMgdm9pZCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCh2b2lkICppbmZvKQomIzQzOy8qCiYjNDM7ICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4KJiM0MzsgKiBhZHZhbmNlZC4KJiM0MzsgKgomIzQzOyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSUQKJiM0MzsgKiB3aGljaCBtYXkgc3RpbGwgYmUgdXNlZCBieSBhIENQVSBhbmQgcXVldWUgYSBsb2NhbCBpbnZhbGlkYXRpb24gZm9yCiYjNDM7ICogdGhhdCBDUFUmIzM5O3MgbmV4dCBWTUlEIGFjdGl2YXRpb24uCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKQogewotCWt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTsKJiM0MzsJdTY0IHZtaWQ7CiYjNDM7CWludCBjcHU7CiYjNDM7CiYjNDM7CWJpdG1hcF96ZXJvKHZtaWRfbWFwLCBOVU1fVk1JRFMpOwomIzQzOwlfX3NldF9iaXQoMCwgdm1pZF9tYXApOwomIzQzOwomIzQzOwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiYjNDM7CQl2bWlkID0gYXRvbWljNjRfeGNoZygmYW1wO3Blcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGUgQ1BVIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYXVnaHQgYnkgYW4gZWFybGllciByb2xsb3ZlcgomIzQzOwkJICogd2l0aG91dCBwZXJmb3JtaW5nIGFub3RoZXIgYWN0aXZhdGlvbiBzaW5jZSB0aGVuLiAgSW4gdGhhdAomIzQzOwkJICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LgomIzQzOwkJICovCiYjNDM7CQlpZiAoIXZtaWQpCiYjNDM7CQkJdm1pZCA9IHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSk7CiYjNDM7CiYjNDM7CQlpZiAodm1pZCkKJiM0MzsJCQlfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksCiYjNDM7CQkJCSAgdm1pZF9tYXApOwomIzQzOwomIzQzOwkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY3B1bWFza19jb3B5KCZhbXA7dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTsKIH0KIAotdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKJiM0MzsvKgomIzQzOyAqIFVwZGF0ZSBldmVyeSByZXNlcnZlZCBjb3B5IG9mIGFuIG9sZCBzb2Z0d2FyZSBWTUlELgomIzQzOyAqCiYjNDM7ICogRG8gbm90IHN0b3AgYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoOiB0aGUgc2FtZSBWTSBtYXkgaGF2ZSBiZWVuIGFjdGl2ZQomIzQzOyAqIG9uIG1vcmUgdGhhbiBvbmUgQ1BVIHdoZW4gcm9sbG92ZXIgb2NjdXJyZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgY2hlY2tfdXBkYXRlX3Jlc2VydmVkX3ZtaWQodTY0IG9sZF92bWlkLCB1NjQgbmV3X3ZtaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBpOwotCXN0cnVjdCBrdm1fdmNwdSAqdjsKLQlzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkOwomIzQzOwlib29sIGhpdCA9IGZhbHNlOwomIzQzOwlpbnQgY3B1OwogCi0JaWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpCi0JCXJldHVybjsKJiM0MzsJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewomIzQzOwkJaWYgKHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPT0gb2xkX3ZtaWQpIHsKJiM0MzsJCQlwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gbmV3X3ZtaWQ7CiYjNDM7CQkJaGl0ID0gdHJ1ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gaGl0OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEFsbG9jYXRlL3Byb21vdGUgYSBzb2Z0d2FyZSBWTUlELgomIzQzOyAqCiYjNDM7ICogdm1pZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1NjQgbmV3X3ZtaWRfbG9ja2VkKHN0cnVjdCBrdm1fdm1pZCAqa3ZtX3ZtaWQpCiYjNDM7ewomIzQzOwl1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoJmFtcDtrdm1fdm1pZC0mZ3Q7aWQpOwomIzQzOwl1NjQgZ2VuZXJhdGlvbiA9IGF0b21pYzY0X3JlYWQoJmFtcDt2bWlkX2dlbmVyYXRpb24pOwomIzQzOwl1NjQgbmV3X3ZtaWQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaWR4OwogCi0Jc3Bpbl9sb2NrKCZhbXA7dm1pZF9sb2NrKTsKJiM0MzsJaWYgKHZtaWQpIHsKJiM0MzsJCW5ld192bWlkID0gZ2VuZXJhdGlvbiB8CiYjNDM7CQkJICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLgomIzQzOwkJICogS2VlcCB0aGUgc2FtZSBoYXJkd2FyZSBWTUlEIGFuZCBvbmx5IHByb21vdGUgZ2VuZXJhdGlvbi4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSkKJiM0MzsJCQlyZXR1cm4gbmV3X3ZtaWQ7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lCiYjNDM7CQkgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC4KJiM0MzsJCSAqLwomIzQzOwkJaWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7CiYjNDM7CQlpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSkKJiM0MzsJCQlyZXR1cm4gbmV3X3ZtaWQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7CiYjNDM7CWlmIChpZHggIT0gTlVNX1ZNSURTKQomIzQzOwkJZ290byBzZXRfdm1pZDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTm8gZnJlZSBWTUlELiAgU3RhcnQgYSBuZXcgZ2VuZXJhdGlvbiwgcHJlc2VydmUgYWxsIENQVS1sb2NhbAomIzQzOwkgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJiMzOTtzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uCiYjNDM7CSAqLwomIzQzOwlnZW5lcmF0aW9uICYjNDM7PSBWTUlEX0ZJUlNUX1ZFUlNJT047CiYjNDM7CiYjNDM7CS8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqLwomIzQzOwlpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKQomIzQzOwkJZ2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjsKJiM0MzsKJiM0MzsJYXRvbWljNjRfeGNoZygmYW1wO3ZtaWRfZ2VuZXJhdGlvbiwgZ2VuZXJhdGlvbik7CiYjNDM7CWZsdXNoX2NvbnRleHQoKTsKIAogCS8qCi0JICogV2UgbmVlZCB0byByZS1jaGVjayB0aGUgdm1pZF92ZXJzaW9uIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWYKLQkgKiBhbm90aGVyIHZjcHUgYWxyZWFkeSBhbGxvY2F0ZWQgYSB2YWxpZCB2bWlkIGZvciB0aGlzIHZtLgomIzQzOwkgKiBOVU1fVk1JRFMgLSAxICZndDsgbnVtX3Bvc3NpYmxlX2NwdXMoKSwgdGhlcmVmb3JlIHJvbGxvdmVyIG11c3QKJiM0MzsJICogbGVhdmUgYXQgbGVhc3Qgb25lIGFsbG9jYXRhYmxlIGhhcmR3YXJlIFZNSUQuCiAJICovCi0JaWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpIHsKLQkJc3Bpbl91bmxvY2soJmFtcDt2bWlkX2xvY2spOwomIzQzOwlpZHggPSBmaW5kX25leHRfemVyb19iaXQodm1pZF9tYXAsIE5VTV9WTUlEUywgMSk7CiYjNDM7CiYjNDM7c2V0X3ZtaWQ6CiYjNDM7CV9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTsKJiM0MzsJdm1pZF9jdXJfaWR4ID0gaWR4OwomIzQzOwomIzQzOwlyZXR1cm4gZ2VuZXJhdGlvbiB8IGlkeDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrdm1fdm1pZCAqa3ZtX3ZtaWQgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkOwomIzQzOwlhdG9taWM2NF90ICphY3RpdmU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiYjNDM7CXU2NCB2bWlkOwomIzQzOwl1NjQgb2xkX2FjdGl2ZV92bWlkOwomIzQzOwl1bnNpZ25lZCBpbnQgY3B1OwomIzQzOwomIzQzOwlpZiAoIXZtaWRfYml0cykKIAkJcmV0dXJuOwotCX0KIAotCS8qIEZpcnN0IHVzZXIgb2YgYSBuZXcgVk1JRCB2ZXJzaW9uPyAqLwotCWlmICh1bmxpa2VseSh2bWlkX25leHQgPT0gMCkpIHsKLQkJV1JJVEVfT05DRSh2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pICYjNDM7IDEpOwotCQl2bWlkX25leHQgPSAxOwomIzQzOwkvKgomIzQzOwkgKiBhY3RpdmVfdm1pZHMgYW5kIHRsYl9mbHVzaF9wZW5kaW5nIGFyZSBwZXItQ1BVIHN0YXRlLiAgS2VlcCB0aGUKJiM0MzsJICogY29tcGxldGUgVk1JRCBhY3RpdmF0aW9uIG9uIHRoZSBzYW1lIENQVS4KJiM0MzsJICovCiYjNDM7CWxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTsKJiM0MzsKJiM0MzsJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwomIzQzOwlhY3RpdmUgPSB0aGlzX2NwdV9wdHIoJmFtcDthY3RpdmVfdm1pZHMpOwomIzQzOwomIzQzOwl2bWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO2t2bV92bWlkLSZndDtpZCk7CiYjNDM7CW9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTsKIAomIzQzOwkvKgomIzQzOwkgKiBGYXN0IHBhdGguCiYjNDM7CSAqCiYjNDM7CSAqIFRoZSBjbXB4Y2hnIHJhY2VzIHdpdGggZmx1c2hfY29udGV4dCgpJiMzOTtzIHhjaGcgb24gdGhlIHNhbWUKJiM0MzsJICogcGVyLUNQVSBhdG9taWMuICBFaXRoZXIgdGhpcyBhY3RpdmF0aW9uIGlzIGNhcHR1cmVkIGJ5IHJvbGxvdmVyLAomIzQzOwkgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy4KJiM0MzsJICovCiYjNDM7CWlmIChvbGRfYWN0aXZlX3ZtaWQgJmFtcDsmYW1wOyB2bWlkX2dlbl9tYXRjaCh2bWlkKSkgewogCQkvKgotCQkgKiBXZSByYW4gb3V0IG9mIFZNSURzIHNvIHdlIGluY3JlbWVudCB2bWlkX3ZlcnNpb24gYW5kCi0JCSAqIHN0YXJ0IGFzc2lnbmluZyBWTUlEcyBmcm9tIDEuCi0JCSAqCi0JCSAqIFRoaXMgYWxzbyBtZWFucyBleGlzdGluZyBWTUlEcyBhc3NpZ25tZW50IHRvIGFsbCBHdWVzdAotCQkgKiBpbnN0YW5jZXMgaXMgaW52YWxpZCBhbmQgd2UgaGF2ZSBmb3JjZSBWTUlEIHJlLWFzc2lnbmVtZW50Ci0JCSAqIGZvciBhbGwgR3Vlc3QgaW5zdGFuY2VzLiBUaGUgR3Vlc3QgaW5zdGFuY2VzIHRoYXQgd2VyZSBub3QKLQkJICogcnVubmluZyB3aWxsIGF1dG9tYXRpY2FsbHkgcGljay11cCBuZXcgVk1JRHMgYmVjYXVzZSB3aWxsCi0JCSAqIGNhbGwga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSgpIHdoZW5ldmVyIHRoZXkgZW50ZXIKLQkJICogaW4ta2VybmVsIHJ1biBsb29wLiBGb3IgR3Vlc3QgaW5zdGFuY2VzIHRoYXQgYXJlIGFscmVhZHkKLQkJICogcnVubmluZywgd2UgZm9yY2UgVk0gZXhpdHMgb24gYWxsIGhvc3QgQ1BVcyB1c2luZyBJUEkgYW5kCi0JCSAqIGZsdXNoIGFsbCBHdWVzdCBUTEJzLgomIzQzOwkJICogSEdBVFAgbXVzdCBjb250YWluIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgdGhhdCBpcyBwdWJsaXNoZWQKJiM0MzsJCSAqIGluIGFjdGl2ZV92bWlkcy4KIAkJICovCi0JCW9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCwKLQkJCQkgTlVMTCwgMSk7CiYjNDM7CQlpZiAob2xkX2FjdGl2ZV92bWlkICE9IHZtaWQpCiYjNDM7CQkJa3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTsKJiM0MzsKJiM0MzsJCWlmIChhdG9taWM2NF9jbXB4Y2hnKGFjdGl2ZSwgb2xkX2FjdGl2ZV92bWlkLCB2bWlkKSA9PQomIzQzOwkJICAgIG9sZF9hY3RpdmVfdm1pZCkKJiM0MzsJCQlyZXR1cm47CiAJfQogCi0Jdm1pZC0mZ3Q7dm1pZCA9IHZtaWRfbmV4dDsKLQl2bWlkX25leHQmIzQzOyYjNDM7OwotCXZtaWRfbmV4dCAmYW1wOz0gKDEgJmx0OyZsdDsgdm1pZF9iaXRzKSAtIDE7CiYjNDM7CXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmYW1wO3ZtaWRfbG9jaywgZmxhZ3MpOwogCi0JV1JJVEVfT05DRSh2bWlkLSZndDt2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTsKJiM0MzsJLyoKJiM0MzsJICogUmUtcmVhZCB1bmRlciB0aGUgYWxsb2NhdG9yIGxvY2sgYmVjYXVzZSBhbm90aGVyIHZDUFUgb2YgdGhpcyBWTQomIzQzOwkgKiBtYXkgYWxyZWFkeSBoYXZlIHByb21vdGVkIG9yIGFsbG9jYXRlZCB0aGUgc2hhcmVkIFZNSUQuCiYjNDM7CSAqLwomIzQzOwl2bWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO2t2bV92bWlkLSZndDtpZCk7CiYjNDM7CiYjNDM7CWlmICghdm1pZF9nZW5fbWF0Y2godm1pZCkpIHsKJiM0MzsJCXZtaWQgPSBuZXdfdm1pZF9sb2NrZWQoa3ZtX3ZtaWQpOwomIzQzOwkJYXRvbWljNjRfc2V0KCZhbXA7a3ZtX3ZtaWQtJmd0O2lkLCB2bWlkKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBDb21wbGV0ZSB0aGlzIENQVSYjMzk7cyBkZWZlcnJlZCByb2xsb3ZlciBpbnZhbGlkYXRpb24gYmVmb3JlCiYjNDM7CSAqIGluc3RhbGxpbmcgdGhlIG5ldyBoYXJkd2FyZSBWTUlELgomIzQzOwkgKi8KJiM0MzsJaWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmFtcDt0bGJfZmx1c2hfcGVuZGluZykpCiYjNDM7CQlrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEluc3RhbGwgdGhlIGN1cnJlbnQgaGFyZHdhcmUgVk1JRCBiZWZvcmUgcHVibGlzaGluZyB0aGlzIENQVSBhcwomIzQzOwkgKiBhY3RpdmUgd2l0aCB0aGUgbmV3IHNvZnR3YXJlIFZNSUQuCiYjNDM7CSAqLwomIzQzOwlrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHZjcHUsIHZtaWQpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBPbmNlIGFjdGl2ZV92bWlkcyBpcyB2aXNpYmxlLCB0aGUgcmVxdWlyZWQgbG9jYWwgaW52YWxpZGF0aW9uIGFuZAomIzQzOwkgKiBIR0FUUCB1cGRhdGUgYXJlIGNvbXBsZXRlLgomIzQzOwkgKi8KJiM0MzsJYXRvbWljNjRfc2V0KGFjdGl2ZSwgdm1pZCk7CiYjNDM7CiYjNDM7CXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbXA7dm1pZF9sb2NrLCBmbGFncyk7CiYjNDM7fQogCi0Jc3Bpbl91bmxvY2soJmFtcDt2bWlkX2xvY2spOwomIzQzOy8qCiYjNDM7ICogQ1BVIHZpcnR1YWxpemF0aW9uL0NTUiBzdGF0ZSBpcyBiZWluZyBkaXNjYXJkZWQuCiYjNDM7ICoKJiM0MzsgKiBXaXRoZHJhdyBmYXN0LXBhdGggZWxpZ2liaWxpdHksIGJ1dCBjb25zZXJ2YXRpdmVseSBwcmVzZXJ2ZSB0aGUgbGFzdAomIzQzOyAqIGlkZW50aXR5IGluc3RlYWQgb2YgbWFraW5nIGl0cyBoYXJkd2FyZSBWTUlEIGltbWVkaWF0ZWx5IHJldXNhYmxlLgomIzQzOyAqLwomIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGZsYWdzOwomIzQzOwl1NjQgdm1pZDsKJiM0MzsJdW5zaWduZWQgaW50IGNwdTsKJiM0MzsKJiM0MzsJaWYgKCF2bWlkX2JpdHMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTsKJiM0MzsKJiM0MzsJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwomIzQzOwomIzQzOwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmFtcDt2bWlkX2xvY2ssIGZsYWdzKTsKJiM0MzsKJiM0MzsJdm1pZCA9IGF0b21pYzY0X3hjaGcodGhpc19jcHVfcHRyKCZhbXA7YWN0aXZlX3ZtaWRzKSwgMCk7CiYjNDM7CiYjNDM7CWlmICh2bWlkKQomIzQzOwkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIElmIGFjdGl2ZSB3YXMgYWxyZWFkeSB6ZXJvLCByZXRhaW4gdGhlIG9sZCByZXNlcnZlZCBlbnRyeS4KJiM0MzsJICovCiYjNDM7CWNwdW1hc2tfc2V0X2NwdShjcHUsICZhbXA7dGxiX2ZsdXNoX3BlbmRpbmcpOwogCi0JLyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi8KLQlrdm1fZm9yX2VhY2hfdmNwdShpLCB2LCB2Y3B1LSZndDtrdm0pCi0JCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpOwomIzQzOwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1wO3ZtaWRfbG9jaywgZmxhZ3MpOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNjoyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjMxMQoJCQkJCQkJb3V0cHV0OiA3OAoJCQkJCQkJdGhvdWdodHM6IDg4MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgU3VpdGFiaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IHRoaXMgcGF0Y2guIEl0JiMzOTtzIHRvdWNoaW5nIGEgYnVuY2ggb2YgZmlsZXMgdW5kZXIgYGFyY2gvcmlzY3YvYCwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gS1ZNIOKAkyBga3ZtX2dzdGFnZS5oYCwgYGt2bV9tbXUuaGAsIGBrdm1fdm1pZC5oYCwgYW5kIHZhcmlvdXMgYC5jYCBmaWxlcyBpbiBga3ZtL2AuICBIYW5nIG9uLCB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGBhbWQ2NGA/ICBSaWdodCwgc28gd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBmdXp6YWJsZSBvbiBhbWQ2NC4KCkxldCYjMzk7cyBxdWlja2x5IHJlZmVyZW5jZSB0aGUgbmVnYXRpdmUgY3JpdGVyaWEuIFRoZSBrZXkgcG9pbnQgaXMgJiMzNDtDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuJiMzNDsgIEFuZCB5ZXAsIHRoZSB0YXJnZXQgaXMgYW1kNjQsIGFuZCAqYWxsKiB0aGUgY2hhbmdlZCBmaWxlcyBhcmUgaW4gYGFyY2gvcmlzY3YvYC4gIFRoaXMgaXMgYSBzbGFtIGR1bmsuICBSSVNDLVYgS1ZNIGNvZGUgaXMgKm5vdCogY29tcGlsZWQgb3IgcmVhY2hhYmxlIG9uIGFtZDY0LCBzbyBpdCYjMzk7cyBpcnJlbGV2YW50IGZvciBmdXp6aW5nIG9uIHRoaXMgYXJjaGl0ZWN0dXJlLiBJJiMzOTt2ZSBkb3VibGUtY2hlY2tlZCB0aGUgZ2l0IGRpZmYganVzdCB0byBiZSBjb21wbGV0ZWx5IHN1cmU7IGV2ZXJ5IHNpbmdsZSBmaWxlIHJlc2lkZXMgdW5kZXIgdGhlIGBhcmNoL3Jpc2N2L2AgZGlyZWN0b3J5LgoKT2theSwgc28gdGhpcyBwYXRjaCBmYWxscyBzcXVhcmVseSB1bmRlciB0aGUgJiMzNDt1bnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHMmIzM0OyBjcml0ZXJpYS4gIFNwZWNpZmljYWxseSwgaXQmIzM5O3MgY29kZSBleGNsdXNpdmUgdG8gYSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlLCB3aGljaCBpcyB0aGUgbmVnYXRpdmUgY3JpdGVyaW9uLiBUaGVyZWZvcmUsIHRoaXMgcGF0Y2ggaXNuJiMzOTt0IHdvcnRoIGZ1enppbmcgb24gYW1kNjQuCgpCYXNlZCBvbiB0aGF0LCBJIGNhbiBkZWZpbml0aXZlbHkgc2V0IGBXb3J0aEZ1enppbmdgIHRvIGBmYWxzZWAuIFNpbmNlIHRoaXMgaXMgdW5yZWFjaGFibGUsIG5vIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIG9yIHN5bWJvbHMgYXJlIHJlbGV2YW50LiBUaHVzLCBgRW5hYmxlQ29uZmlnc2AgYW5kIGBGb2N1c1N5bWJvbHNgIHdpbGwgYmUgZW1wdHkgbGlzdHMuIEFuZCBteSByZWFzb25pbmcgd2lsbCBiZSBjb25jaXNlOiAmIzM0O0FsbCBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byBgYXJjaC9yaXNjdi9gIChSSVNDLVYgS1ZNIGltcGxlbWVudGF0aW9uKSwgd2hpY2ggaXMgZXhjbHVzaXZlIHRvIHRoZSBSSVNDLVYgYXJjaGl0ZWN0dXJlLiBTaW5jZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGFuZCBjYW5ub3QgYmUgZnV6emVkLiYjMzQ7ICBJIGp1c3QgdmVyaWZpZWQgdGhlIGZpZWxkcyBmcm9tIHRoZSBzZXQtcmVzdWx0cyB3aXRoIGBFbmFibGVDb25maWdzOiBbXWAsIGBGb2N1c1N5bWJvbHM6IFtdYCwgYFJlYXNvbmluZzogJiMzNDtBbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gYXJjaC9yaXNjdi8gKFJJU0MtViBLVk0gaW1wbGVtZW50YXRpb24pLCB3aGljaCBpcyBleGNsdXNpdmUgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUuIFNpbmNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgYW5kIGNhbm5vdCBiZSBmdXp6ZWQuJiMzNDtgIGFuZCBgV29ydGhGdXp6aW5nOiBmYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTY6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmllZCBmaWxlcyBhcmUgbG9jYXRlZCBpbiBhcmNoL3Jpc2N2LyAoUklTQy1WIEtWTSBzdWJzeXN0ZW0pLiBCZWNhdXNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGVzZSBjb2RlIHBhdGhzIGFyZSBleGNsdXNpdmUgdG8gUklTQy1WIGFuZCBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmllZCBmaWxlcyBhcmUgbG9jYXRlZCBpbiBhcmNoL3Jpc2N2LyAoUklTQy1WIEtWTSBzdWJzeXN0ZW0pLiBCZWNhdXNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGVzZSBjb2RlIHBhdGhzIGFyZSBleGNsdXNpdmUgdG8gUklTQy1WIGFuZCBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE2OjIwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNjoyMDo0My43MTg4NTg0NzVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjIyMDQzNDEwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiQWxsIG1vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGFyY2gvcmlzY3YvIChSSVNDLVYgS1ZNIHN1YnN5c3RlbSkuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGV4Y2x1c2l2ZSB0byBSSVNDLVYgYW5kIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE2OjIwOjQzLjcxODg2MzQxNVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTU2NDkwMzQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZGFlNjIxODc4ZWRmNzcyY2Q4NWIwOGVlMWVmZmE1MDEzNDhjM2M1NVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIFNlcCAxMSAxNjoyMDo0MiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXFxuaW5kZXggYWFmMDgwYmExYjc3YS4uYzYxYTFiYmIyNzJmNCAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXFxuQEAgLTgsNyArOCw3IEBAXFxuICNkZWZpbmUgX19SSVNDVl9LVk1fR1NUQUdFX0hfXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva3ZtX3R5cGVzLmhcXHUwMDNlXFxuLVxcbisjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV92bWlkLmhcXHUwMDNlXFxuIHN0cnVjdCBrdm1fZ3N0YWdlIHtcXG4gXFx0c3RydWN0IGt2bSAqa3ZtO1xcbiBcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbkBAIC0xMDgsNyArMTA4LDggQEAgc3RhdGljIGlubGluZSB2b2lkIGt2bV9yaXNjdl9nc3RhZ2VfaW5pdChzdHJ1Y3Qga3ZtX2dzdGFnZSAqZ3N0YWdlLCBzdHJ1Y3Qga3ZtICpcXG4ge1xcbiBcXHRnc3RhZ2UtXFx1MDAzZWt2bSA9IGt2bTtcXG4gXFx0Z3N0YWdlLVxcdTAwM2VmbGFncyA9IDA7XFxuLVxcdGdzdGFnZS1cXHUwMDNldm1pZCA9IFJFQURfT05DRShrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0Z3N0YWdlLVxcdTAwM2V2bWlkID1cXG4rXFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcXHUwMDI2a3ZtLVxcdTAwM2VhcmNoLnZtaWQuaWQpKTtcXG4gXFx0Z3N0YWdlLVxcdTAwM2VwZ2QgPSBrdm0tXFx1MDAzZWFyY2gucGdkO1xcbiBcXHRnc3RhZ2UtXFx1MDAzZXBnZF9sZXZlbHMgPSBrdm0tXFx1MDAzZWFyY2gucGdkX2xldmVscztcXG4gfVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oXFxuaW5kZXggNTQzOWU3NmYwYTk2MC4uYWFlOWI4YWMwODc4ZiAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oXFxuQEAgLTE2LDYgKzE2LDcgQEAgaW50IGt2bV9yaXNjdl9tbXVfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCxcXG4gXFx0XFx0ICAgICAgc3RydWN0IGt2bV9nc3RhZ2VfbWFwcGluZyAqb3V0X21hcCk7XFxuIGludCBrdm1fcmlzY3ZfbW11X2FsbG9jX3BnZChzdHJ1Y3Qga3ZtICprdm0pO1xcbiB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKTtcXG4rdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpO1xcbiB2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7XFxuIFxcbiAjZW5kaWZcXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oXFxuaW5kZXggZGI2MWIwNTI1YThkMC4uZGRkN2NjMTI1YzNmNiAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcXG5AQCAtNiwyMSArNiw0MiBAQFxcbiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9WTUlEX0hfXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXRvbWljLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFxcdTAwM2VcXG4gXFxuIHN0cnVjdCBrdm1fdm1pZCB7XFxuIFxcdC8qXFxuLVxcdCAqIFdyaXRlcyB0byB2bWlkX3ZlcnNpb24gYW5kIHZtaWQgaGFwcGVuIHdpdGggdm1pZF9sb2NrIGhlbGRcXG4tXFx0ICogd2hlcmVhcyByZWFkcyBoYXBwZW4gd2l0aG91dCBhbnkgbG9jayBoZWxkLlxcbitcXHQgKiBTb2Z0d2FyZSBWTUlEOlxcbitcXHQgKlxcbitcXHQgKiAgIFsgZ2VuZXJhdGlvbiB8IGhhcmR3YXJlIFZNSUQgXVxcbitcXHQgKlxcbitcXHQgKiBLZWVwIHRoZSBpZGVudGl0eSA2NC1iaXQgb24gUlYzMiBzbyB0aGF0IHRoZSBnZW5lcmF0aW9uIGRvZXMgbm90XFxuK1xcdCAqIHdyYXAgYXQgdGhlIG5hdGl2ZSB3b3JkIHNpemUuICBaZXJvIGRlbm90ZXMgYW4gdW5hbGxvY2F0ZWQgVk1JRC5cXG4rXFx0ICpcXG4rXFx0ICogT25seSB0aGUgbG93IGhhcmR3YXJlIFZNSUQgYml0cyBtYXkgYmUgd3JpdHRlbiB0byBIR0FUUFxcbitcXHQgKiBvciB1c2VkIGFzIGEgaGFyZHdhcmUgZmVuY2UgVk1JRC5cXG4gXFx0ICovXFxuLVxcdHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uO1xcbi1cXHR1bnNpZ25lZCBsb25nIHZtaWQ7XFxuK1xcdGF0b21pYzY0X3QgaWQ7XFxuIH07XFxuIFxcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpO1xcbiB1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKHZvaWQpO1xcbitcXG4raW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKTtcXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKTtcXG4rXFxuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pO1xcbitcXG4rdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZCk7XFxuK1xcbiBib29sIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZChzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQpO1xcbitcXG4gdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7XFxuIFxcbisvKlxcbisgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSdzIGZhc3QtcGF0aCBWTUlEIHN0YXRlIHdoaWxlIHByZXNlcnZpbmdcXG4rICogdGhlIG9sZCBpZGVudGl0eSBjb25zZXJ2YXRpdmVseSBpbiByZXNlcnZlZF92bWlkcy5cXG4rICovXFxuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpO1xcbitcXG4gI2VuZGlmXFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xcbmluZGV4IDg5NTY4Y2NjZTAxZGUuLmQ2YzZiZTRkZjYxYjEgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXFxuKysrIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXFxuQEAgLTE2LDcgKzE2LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fbmFjbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3NiaS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV92Y3B1X3ZlY3Rvci5oXFx1MDAzZVxcbi1cXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdm1pZC5oXFx1MDAzZVxcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwga3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpO1xcbiBcXG4gREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa3ZtX3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSk7XFxuQEAgLTg0LDYgKzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcXG4gXFxuIHZvaWQga3ZtX2FyY2hfZGlzYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcXG4ge1xcbitcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUoKTtcXG4gXFx0a3ZtX3Jpc2N2X2FpYV9kaXNhYmxlKCk7XFxuIFxcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xcbiBcXHRrdm1fcmlzY3ZfbmFjbF9kaXNhYmxlKCk7XFxuQEAgLTExMiw2ICsxMTMsNyBAQCBzdGF0aWMgaW50IGt2bV9yaXNjdl9jcHVfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nXFxuIFxcdFxcdCAqIGlzIGVuYWJsZWQgb24gdGhpcyBDUFUuXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRpZiAoX190aGlzX2NwdV9yZWFkKGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKSkge1xcbitcXHRcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUoKTtcXG4gXFx0XFx0XFx0a3ZtX3Jpc2N2X2FpYV9wbV9lbnRlcigpO1xcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcXG4gXFx0XFx0fVxcbkBAIC0xMzAsNiArMTMyLDcgQEAgc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrdm1fcmlzY3ZfY3B1X3BtX25iID0ge1xcbiBzdGF0aWMgdm9pZCBrdm1fcmlzY3ZfdGVhcmRvd24odm9pZClcXG4ge1xcbiBcXHRrdm1fcmlzY3ZfYWlhX2V4aXQoKTtcXG4rXFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTtcXG4gXFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xcbiBcXHRrdm1fcmlzY3Zfdl9leGl0KCk7XFxuIFxcdGt2bV91bnJlZ2lzdGVyX3BlcmZfY2FsbGJhY2tzKCk7XFxuQEAgLTE4MSw4ICsxODQsMTUgQEAgc3RhdGljIGludCBfX2luaXQgcmlzY3Zfa3ZtX2luaXQodm9pZClcXG4gXFxuIFxcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3QoKTtcXG4gXFxuK1xcdHJjID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQoKTtcXG4rXFx0aWYgKHJjKSB7XFxuK1xcdFxcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXHR9XFxuK1xcbiBcXHRyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpO1xcbiBcXHRpZiAocmMgXFx1MDAyNlxcdTAwMjYgcmMgIT0gLUVOT0RFVikge1xcbitcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpO1xcbiBcXHRcXHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XFxuIFxcdFxcdHJldHVybiByYztcXG4gXFx0fVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS9tbXUuYyBiL2FyY2gvcmlzY3Yva3ZtL21tdS5jXFxuaW5kZXggNjAzNWI1ZWM5NTAzOS4uOWI1OTcwOTJmOGVjNiAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL21tdS5jXFxuQEAgLTE1LDcgKzE1LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV9tbXUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fbmFjbC5oXFx1MDAzZVxcbi1cXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdm1pZC5oXFx1MDAzZVxcbiBzdGF0aWMgYm9vbCBfX3JlYWRfbW9zdGx5IGVhZ2VyX3BhZ2Vfc3BsaXQgPSB0cnVlO1xcbiBtb2R1bGVfcGFyYW0oZWFnZXJfcGFnZV9zcGxpdCwgYm9vbCwgMDY0NCk7XFxuIFxcbkBAIC03OTYsMTYgKzc5NiwyMyBAQCB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKVxcbiBcXHRrdm1fbW11X2ZyZWVfbWVtb3J5X2NhY2hlKFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gucGdkX3NwbGl0X3BhZ2VfY2FjaGUpO1xcbiB9XFxuIFxcbi12b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4rdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2g7XFxuIFxcdHVuc2lnbmVkIGxvbmcgaGdhdHAgPSBrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa2EtXFx1MDAzZXBnZF9sZXZlbHMpXFxuIFxcdFxcdFxcdCAgICAgIFxcdTAwM2NcXHUwMDNjIEhHQVRQX01PREVfU0hJRlQ7XFxuIFxcbi1cXHRoZ2F0cCB8PSAoUkVBRF9PTkNFKGthLVxcdTAwM2V2bWlkLnZtaWQpIFxcdTAwM2NcXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFxcdTAwMjYgSEdBVFBfVk1JRDtcXG4rXFx0aGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpIFxcdTAwM2NcXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFxcdTAwMjYgSEdBVFBfVk1JRDtcXG4gXFx0aGdhdHAgfD0gKGthLVxcdTAwM2VwZ2RfcGh5cyBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKSBcXHUwMDI2IEhHQVRQX1BQTjtcXG4gXFxuIFxcdG5jc3Jfd3JpdGUoQ1NSX0hHQVRQLCBoZ2F0cCk7XFxuK31cXG4rXFxuK3ZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbit7XFxuK1xcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcXHUwMDI2dmNwdS1cXHUwMDNla3ZtLVxcdTAwM2VhcmNoLnZtaWQuaWQpO1xcbitcXG4rXFx0a3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTtcXG4gXFxuIFxcdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHMoKSlcXG4gXFx0XFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS90bGIuYyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXFxuaW5kZXggMmFlMzQ2MzJjZGNiMS4uYjg1ZTViYTIxOThhYSAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS90bGIuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXFxuQEAgLTIyNCw3ICsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHQgKiBlbnRyaWVzIGJ5IFZNSUQgd2hlbmV2ZXIgdW5kZXJseWluZyBIb3N0IENQVSBjaGFuZ2VzIGZvciBhIFZDUFUuXFxuIFxcdCAqL1xcbiBcXG4tXFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcXG4gXFxuIFxcdC8qXFxuQEAgLTI0NCw3ICsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV92bWlkICp2ID0gXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkO1xcbi1cXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cXHUwMDNldm1pZCk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnYtXFx1MDAzZWlkKSk7XFxuIFxcbiBcXHRpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpXFxuIFxcdFxcdG5hY2xfaGZlbmNlX2d2bWFfdm1pZF9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcXG5AQCAtMjU1LDcgKzI1NSw3IEBAIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiB7XFxuIFxcdHN0cnVjdCBrdm1fdm1pZCAqdiA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZDtcXG4tXFx0dW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtXFx1MDAzZXZtaWQpO1xcbitcXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZ2LVxcdTAwM2VpZCkpO1xcbiBcXG4gXFx0aWYgKGt2bV9yaXNjdl9uYWNsX2F2YWlsYWJsZSgpKVxcbiBcXHRcXHRuYWNsX2hmZW5jZV92dm1hX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xcbkBAIC01MzEsOCArNTMxLDExIEBAIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbChzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcbiBpbnQga3ZtX2FyY2hfZmx1c2hfcmVtb3RlX3RsYnNfcmFuZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIHU2NCBucl9wYWdlcylcXG4ge1xcbitcXHR1bnNpZ25lZCBsb25nIHZtaWQgPVxcbitcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbitcXG4gXFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIGdmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULCBucl9wYWdlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULFxcbi1cXHRcXHRcXHRcXHQgICAgICAgUEFHRV9TSElGVCwgUkVBRF9PTkNFKGt2bS1cXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcXG4rXFx0XFx0XFx0XFx0ICAgICAgIFBBR0VfU0hJRlQsIHZtaWQpO1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xcbkBAIC05NDMsMTQgKzk0MywxNCBAQCBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0cmV0ID0gMTtcXG4gXFxuLVxcdFxcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XFxuLVxcbiBcXHRcXHRyZXQgPSBrdm1fcmlzY3ZfY2hlY2tfdmNwdV9yZXF1ZXN0cyh2Y3B1KTtcXG4gXFx0XFx0aWYgKHJldCBcXHUwMDNjPSAwKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdHByZWVtcHRfZGlzYWJsZSgpO1xcbiBcXG4rXFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTtcXG4rXFxuIFxcdFxcdC8qIFVwZGF0ZSBBSUEgSFcgc3RhdGUgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovXFxuIFxcdFxcdHJldCA9IGt2bV9yaXNjdl92Y3B1X2FpYV91cGRhdGUodmNwdSk7XFxuIFxcdFxcdGlmIChyZXQgXFx1MDAzYz0gMCkge1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmNcXG5pbmRleCA1MDZhNTEwYjZiZmYzLi4xYmUzODZhNzhlMjdmIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xcbkBAIC0xMDQsNyArMTA0LDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cXG4gXFx0XFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19GRU5DRV9JX1NFTlQpO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQTpcXG4tXFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdGlmICgoY3AtXFx1MDAzZWEyID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEzID09IDApIHx8IGNwLVxcdTAwM2VhMyA9PSAtMVVMKVxcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHZjcHUtXFx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCB2bWlkKTtcXG4gXFx0XFx0ZWxzZVxcbkBAIC0xMTMsNyArMTEzLDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cXG4gXFx0XFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19IRkVOQ0VfVlZNQV9TRU5UKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGNhc2UgU0JJX0VYVF9SRkVOQ0VfUkVNT1RFX1NGRU5DRV9WTUFfQVNJRDpcXG4tXFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdGlmICgoY3AtXFx1MDAzZWEyID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEzID09IDApIHx8IGNwLVxcdTAwM2VhMyA9PSAtMVVMKVxcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYXNpZF9hbGwodmNwdS1cXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBjcC1cXHUwMDNlYTQsIHZtaWQpO1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXFxuaW5kZXggZGU1NDRlYTNmMjhkYy4uY2EzZWZlNjNjMWNmMSAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXFxuQEAgLTg4LDE0ICs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcXG4gXFx0XFx0aWYgKGNwLVxcdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfRkVOQ0VfSSlcXG4gXFx0XFx0XFx0a3ZtX3Jpc2N2X2ZlbmNlX2kodmNwdS1cXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xcbiBcXHRcXHRlbHNlIGlmIChjcC1cXHUwMDNlYTcgPT0gU0JJX0VYVF8wXzFfUkVNT1RFX1NGRU5DRV9WTUEpIHtcXG4tXFx0XFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdFxcdGlmIChjcC1cXHUwMDNlYTEgPT0gMCBcXHUwMDI2XFx1MDAyNiBjcC1cXHUwMDNlYTIgPT0gMClcXG4gXFx0XFx0XFx0XFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XFxuIFxcdFxcdFxcdGVsc2VcXG4gXFx0XFx0XFx0XFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgY3AtXFx1MDAzZWExLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGNwLVxcdTAwM2VhMiwgUEFHRV9TSElGVCwgdm1pZCk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cXHUwMDNla3ZtLVxcdTAwM2VhcmNoLnZtaWQudm1pZCk7XFxuK1xcdFxcdFxcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbiBcXHRcXHRcXHRpZiAoY3AtXFx1MDAzZWExID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEyID09IDApXFxuIFxcdFxcdFxcdFxcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzayxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIGNwLVxcdTAwM2VhMywgdm1pZCk7XFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xcbmluZGV4IGMxNWJkYjFkZDhiZWYuLmVlZTgzMDZjMTI3MDcgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXFxuKysrIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXFxuQEAgLTYsMTEgKzYsMTUgQEBcXG4gICogICAgIEFudXAgUGF0ZWwgXFx1MDAzY2FudXAucGF0ZWxAd2RjLmNvbVxcdTAwM2VcXG4gICovXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0bWFwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaXRvcHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NwdW1hc2suaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Vycm5vLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcGVyY3B1LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmVlbXB0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vY3NyLmhcXHUwMDNlXFxuQEAgLTE4LDI2ICsyMiw1NCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV90bGIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdm1pZC5oXFx1MDAzZVxcbiBcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uID0gMTtcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0O1xcbitzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9iaXRzIF9fcm9fYWZ0ZXJfaW5pdDtcXG4tc3RhdGljIERFRklORV9TUElOTE9DSyh2bWlkX2xvY2spO1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2N1cl9pZHggPSAxO1xcbitcXG4rc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodm1pZF9sb2NrKTtcXG4rXFxuK3N0YXRpYyBERUZJTkVfUEVSX0NQVShhdG9taWM2NF90LCBhY3RpdmVfdm1pZHMpO1xcbitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNlcnZlZF92bWlkcyk7XFxuK1xcbitzdGF0aWMgY3B1bWFza190IHRsYl9mbHVzaF9wZW5kaW5nO1xcbitcXG4rI2RlZmluZSBWTUlEX0ZJUlNUX1ZFUlNJT05cXHRCSVRfVUxMKHZtaWRfYml0cylcXG4rI2RlZmluZSBOVU1fVk1JRFNcXHRcXHRCSVQodm1pZF9iaXRzKVxcbisjZGVmaW5lIFZNSURfSFdfTUFTS1xcdFxcdChWTUlEX0ZJUlNUX1ZFUlNJT04gLSAxKVxcbitcXG4rc3RhdGljIGJvb2wgdm1pZF9nZW5fbWF0Y2godTY0IHZtaWQpXFxuK3tcXG4rXFx0cmV0dXJuICEoKHZtaWQgXiBhdG9taWM2NF9yZWFkKFxcdTAwMjZ2bWlkX2dlbmVyYXRpb24pKSBcXHUwMDNlXFx1MDAzZSB2bWlkX2JpdHMpO1xcbit9XFxuK1xcbit1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHU2NCB2bWlkKVxcbit7XFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcXHUwMDI2IFZNSURfSFdfTUFTSyk7XFxuK31cXG4gXFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZClcXG4ge1xcbi1cXHQvKiBGaWd1cmUtb3V0IG51bWJlciBvZiBWTUlEIGJpdHMgaW4gSFcgKi9cXG4rXFx0LyogRmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIFZNSUQgYml0cyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUuICovXFxuIFxcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXFx1MDAzY1xcdTAwM2NcXG4tXFx0XFx0XFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcXG4rXFx0XFx0ICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcXG4gXFx0dm1pZF9iaXRzID0gY3NyX3JlYWQoQ1NSX0hHQVRQKTtcXG4gXFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcXHUwMDI2IEhHQVRQX1ZNSUQpIFxcdTAwM2VcXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XFxuIFxcdHZtaWRfYml0cyA9IGZsc19sb25nKHZtaWRfYml0cyk7XFxuIFxcdGNzcl93cml0ZShDU1JfSEdBVFAsIDApO1xcbiBcXG4tXFx0LyogV2UgcG9sbHV0ZWQgbG9jYWwgVExCIHNvIGZsdXNoIGFsbCBndWVzdCBUTEIgKi9cXG4rXFx0LyogRmx1c2ggdGhlIGxvY2FsIGd1ZXN0IFRMQiBhZnRlciBwcm9iaW5nIEhHQVRQLiAqL1xcbiBcXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XFxuIFxcbi1cXHQvKiBXZSBkb24ndCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXFxuLVxcdGlmICgoMVVMIFxcdTAwM2NcXHUwMDNjIHZtaWRfYml0cykgXFx1MDAzYyBudW1fcG9zc2libGVfY3B1cygpKVxcbitcXHQvKlxcbitcXHQgKiBWTUlEIDAgaXMgcmVzZXJ2ZWQuICBEdXJpbmcgcm9sbG92ZXIgZXZlcnkgcG9zc2libGUgQ1BVIG1heVxcbitcXHQgKiByZXNlcnZlIG9uZSBoYXJkd2FyZSBWTUlELCBhbmQgd2Ugc3RpbGwgbmVlZCBhdCBsZWFzdCBvbmUgVk1JRFxcbitcXHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXFxuK1xcdCAqL1xcbitcXHRpZiAodm1pZF9iaXRzIFxcdTAwMjZcXHUwMDI2IE5VTV9WTUlEUyAtIDEgXFx1MDAzYz0gbnVtX3Bvc3NpYmxlX2NwdXMoKSlcXG4gXFx0XFx0dm1pZF9iaXRzID0gMDtcXG4gfVxcbiBcXG5AQCAtNDYsODAgKzc4LDI5NSBAQCB1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKHZvaWQpXFxuIFxcdHJldHVybiB2bWlkX2JpdHM7XFxuIH1cXG4gXFxuK2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZClcXG4re1xcbitcXHRpbnQgY3B1O1xcbitcXG4rXFx0aWYgKCF2bWlkX2JpdHMpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0dm1pZF9tYXAgPSBiaXRtYXBfemFsbG9jKE5VTV9WTUlEUywgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghdm1pZF9tYXApXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0dm1pZF9jdXJfaWR4ID0gMTtcXG4rXFxuK1xcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cXG4rXFx0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcXG4rXFxuK1xcdGF0b21pYzY0X3NldChcXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xcbitcXG4rXFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xcbitcXHRcXHRhdG9taWM2NF9zZXQoXFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzXFxuK1xcdCAqIGZpcnN0IFZNSUQgYWN0aXZhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGNwdW1hc2tfY29weShcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpXFxuK3tcXG4rXFx0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xcbitcXHR2bWlkX21hcCA9IE5VTEw7XFxuK31cXG4rXFxuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pXFxuIHtcXG4tXFx0LyogTWFyayB0aGUgaW5pdGlhbCBWTUlEIGFuZCBWTUlEIHZlcnNpb24gaW52YWxpZCAqL1xcbi1cXHRrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkX3ZlcnNpb24gPSAwO1xcbi1cXHRrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkID0gMDtcXG4rXFx0YXRvbWljNjRfc2V0KFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCwgMCk7XFxuIFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKVxcbiB7XFxuK1xcdHU2NCBpZDtcXG4rXFxuIFxcdGlmICghdm1pZF9iaXRzKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcbi1cXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXFx1MDAzZXZtaWRfdmVyc2lvbikgIT1cXG4tXFx0XFx0XFx0UkVBRF9PTkNFKHZtaWRfdmVyc2lvbikpO1xcbitcXHRpZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNnZtaWQtXFx1MDAzZWlkKTtcXG4rXFxuK1xcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcXG4rLypcXG4rICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW5cXG4rICogYWR2YW5jZWQuXFxuKyAqXFxuKyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSURcXG4rICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxcbisgKiB0aGF0IENQVSdzIG5leHQgVk1JRCBhY3RpdmF0aW9uLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKVxcbiB7XFxuLVxcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcXG4rXFx0dTY0IHZtaWQ7XFxuK1xcdGludCBjcHU7XFxuK1xcbitcXHRiaXRtYXBfemVybyh2bWlkX21hcCwgTlVNX1ZNSURTKTtcXG4rXFx0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcXG4rXFxuK1xcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcXG4rXFx0XFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBDUFUgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNhdWdodCBieSBhbiBlYXJsaWVyIHJvbGxvdmVyXFxuK1xcdFxcdCAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbm90aGVyIGFjdGl2YXRpb24gc2luY2UgdGhlbi4gIEluIHRoYXRcXG4rXFx0XFx0ICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCF2bWlkKVxcbitcXHRcXHRcXHR2bWlkID0gcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KTtcXG4rXFxuK1xcdFxcdGlmICh2bWlkKVxcbitcXHRcXHRcXHRfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksXFxuK1xcdFxcdFxcdFxcdCAgdm1pZF9tYXApO1xcbitcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XFxuK1xcdH1cXG4rXFxuK1xcdGNwdW1hc2tfY29weShcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4gfVxcbiBcXG4tdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4rLypcXG4rICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXFxuKyAqXFxuKyAqIERvIG5vdCBzdG9wIGFmdGVyIHRoZSBmaXJzdCBtYXRjaDogdGhlIHNhbWUgVk0gbWF5IGhhdmUgYmVlbiBhY3RpdmVcXG4rICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cXG4rICovXFxuK3N0YXRpYyBib29sIGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHU2NCBvbGRfdm1pZCwgdTY0IG5ld192bWlkKVxcbiB7XFxuLVxcdHVuc2lnbmVkIGxvbmcgaTtcXG4tXFx0c3RydWN0IGt2bV92Y3B1ICp2O1xcbi1cXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSBcXHUwMDI2dmNwdS1cXHUwMDNla3ZtLVxcdTAwM2VhcmNoLnZtaWQ7XFxuK1xcdGJvb2wgaGl0ID0gZmFsc2U7XFxuK1xcdGludCBjcHU7XFxuIFxcbi1cXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSlcXG4tXFx0XFx0cmV0dXJuO1xcbitcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuK1xcdFxcdGlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7XFxuK1xcdFxcdFxcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSBuZXdfdm1pZDtcXG4rXFx0XFx0XFx0aGl0ID0gdHJ1ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gaGl0O1xcbit9XFxuK1xcbisvKlxcbisgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC5cXG4rICpcXG4rICogdm1pZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLlxcbisgKi9cXG4rc3RhdGljIHU2NCBuZXdfdm1pZF9sb2NrZWQoc3RydWN0IGt2bV92bWlkICprdm1fdm1pZClcXG4re1xcbitcXHR1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNmt2bV92bWlkLVxcdTAwM2VpZCk7XFxuK1xcdHU2NCBnZW5lcmF0aW9uID0gYXRvbWljNjRfcmVhZChcXHUwMDI2dm1pZF9nZW5lcmF0aW9uKTtcXG4rXFx0dTY0IG5ld192bWlkO1xcbitcXHR1bnNpZ25lZCBsb25nIGlkeDtcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2dm1pZF9sb2NrKTtcXG4rXFx0aWYgKHZtaWQpIHtcXG4rXFx0XFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcXG4rXFx0XFx0XFx0ICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaGUgb2xkIFZNSUQgaXMgc3RpbGwgcHJvdGVjdGVkIGJ5IG9uZSBvciBtb3JlIENQVXMuXFxuK1xcdFxcdCAqIEtlZXAgdGhlIHNhbWUgaGFyZHdhcmUgVk1JRCBhbmQgb25seSBwcm9tb3RlIGdlbmVyYXRpb24uXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoY2hlY2tfdXBkYXRlX3Jlc2VydmVkX3ZtaWQodm1pZCwgbmV3X3ZtaWQpKVxcbitcXHRcXHRcXHRyZXR1cm4gbmV3X3ZtaWQ7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaGUgVk0gaGFkIGEgVk1JRCBpbiBhbiBvbGRlciBnZW5lcmF0aW9uLiAgUmV1c2UgdGhlIHNhbWVcXG4rXFx0XFx0ICogaGFyZHdhcmUgbnVtYmVyIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNsYWltZWQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZHggPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKTtcXG4rXFx0XFx0aWYgKCFfX3Rlc3RfYW5kX3NldF9iaXQoaWR4LCB2bWlkX21hcCkpXFxuK1xcdFxcdFxcdHJldHVybiBuZXdfdm1pZDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLlxcbitcXHQgKi9cXG4rXFx0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7XFxuK1xcdGlmIChpZHggIT0gTlVNX1ZNSURTKVxcbitcXHRcXHRnb3RvIHNldF92bWlkO1xcbitcXG4rXFx0LypcXG4rXFx0ICogTm8gZnJlZSBWTUlELiAgU3RhcnQgYSBuZXcgZ2VuZXJhdGlvbiwgcHJlc2VydmUgYWxsIENQVS1sb2NhbFxcbitcXHQgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJ3MgZmx1c2ggdW50aWwgaXRzIG5leHQgYWN0aXZhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGdlbmVyYXRpb24gKz0gVk1JRF9GSVJTVF9WRVJTSU9OO1xcbitcXG4rXFx0LyogU29mdHdhcmUgVk1JRCAwIGlzIHJlc2VydmVkIGFzIHRoZSBpbnZhbGlkIGlkZW50aWZpZXIuICovXFxuK1xcdGlmICh1bmxpa2VseSghZ2VuZXJhdGlvbikpXFxuK1xcdFxcdGdlbmVyYXRpb24gPSBWTUlEX0ZJUlNUX1ZFUlNJT047XFxuK1xcbitcXHRhdG9taWM2NF94Y2hnKFxcdTAwMjZ2bWlkX2dlbmVyYXRpb24sIGdlbmVyYXRpb24pO1xcbitcXHRmbHVzaF9jb250ZXh0KCk7XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBXZSBuZWVkIHRvIHJlLWNoZWNrIHRoZSB2bWlkX3ZlcnNpb24gaGVyZSB0byBlbnN1cmUgdGhhdCBpZlxcbi1cXHQgKiBhbm90aGVyIHZjcHUgYWxyZWFkeSBhbGxvY2F0ZWQgYSB2YWxpZCB2bWlkIGZvciB0aGlzIHZtLlxcbitcXHQgKiBOVU1fVk1JRFMgLSAxIFxcdTAwM2UgbnVtX3Bvc3NpYmxlX2NwdXMoKSwgdGhlcmVmb3JlIHJvbGxvdmVyIG11c3RcXG4rXFx0ICogbGVhdmUgYXQgbGVhc3Qgb25lIGFsbG9jYXRhYmxlIGhhcmR3YXJlIFZNSUQuXFxuIFxcdCAqL1xcbi1cXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2dm1pZF9sb2NrKTtcXG4rXFx0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIDEpO1xcbitcXG4rc2V0X3ZtaWQ6XFxuK1xcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcXG4rXFx0dm1pZF9jdXJfaWR4ID0gaWR4O1xcbitcXG4rXFx0cmV0dXJuIGdlbmVyYXRpb24gfCBpZHg7XFxuK31cXG4rXFxuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuK3tcXG4rXFx0c3RydWN0IGt2bV92bWlkICprdm1fdm1pZCA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZDtcXG4rXFx0YXRvbWljNjRfdCAqYWN0aXZlO1xcbitcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbitcXHR1NjQgdm1pZDtcXG4rXFx0dTY0IG9sZF9hY3RpdmVfdm1pZDtcXG4rXFx0dW5zaWduZWQgaW50IGNwdTtcXG4rXFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbiBcXHRcXHRyZXR1cm47XFxuLVxcdH1cXG4gXFxuLVxcdC8qIEZpcnN0IHVzZXIgb2YgYSBuZXcgVk1JRCB2ZXJzaW9uPyAqL1xcbi1cXHRpZiAodW5saWtlbHkodm1pZF9uZXh0ID09IDApKSB7XFxuLVxcdFxcdFdSSVRFX09OQ0Uodm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSArIDEpO1xcbi1cXHRcXHR2bWlkX25leHQgPSAxO1xcbitcXHQvKlxcbitcXHQgKiBhY3RpdmVfdm1pZHMgYW5kIHRsYl9mbHVzaF9wZW5kaW5nIGFyZSBwZXItQ1BVIHN0YXRlLiAgS2VlcCB0aGVcXG4rXFx0ICogY29tcGxldGUgVk1JRCBhY3RpdmF0aW9uIG9uIHRoZSBzYW1lIENQVS5cXG4rXFx0ICovXFxuK1xcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcXG4rXFxuK1xcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcXG4rXFx0YWN0aXZlID0gdGhpc19jcHVfcHRyKFxcdTAwMjZhY3RpdmVfdm1pZHMpO1xcbitcXG4rXFx0dm1pZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNmt2bV92bWlkLVxcdTAwM2VpZCk7XFxuK1xcdG9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEZhc3QgcGF0aC5cXG4rXFx0ICpcXG4rXFx0ICogVGhlIGNtcHhjaGcgcmFjZXMgd2l0aCBmbHVzaF9jb250ZXh0KCkncyB4Y2hnIG9uIHRoZSBzYW1lXFxuK1xcdCAqIHBlci1DUFUgYXRvbWljLiAgRWl0aGVyIHRoaXMgYWN0aXZhdGlvbiBpcyBjYXB0dXJlZCBieSByb2xsb3ZlcixcXG4rXFx0ICogb3Igcm9sbG92ZXIgY2xlYXJzIGFjdGl2ZSBmaXJzdCBhbmQgdGhlIGNtcHhjaGcgZmFpbHMuXFxuK1xcdCAqL1xcbitcXHRpZiAob2xkX2FjdGl2ZV92bWlkIFxcdTAwMjZcXHUwMDI2IHZtaWRfZ2VuX21hdGNoKHZtaWQpKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIHJhbiBvdXQgb2YgVk1JRHMgc28gd2UgaW5jcmVtZW50IHZtaWRfdmVyc2lvbiBhbmRcXG4tXFx0XFx0ICogc3RhcnQgYXNzaWduaW5nIFZNSURzIGZyb20gMS5cXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogVGhpcyBhbHNvIG1lYW5zIGV4aXN0aW5nIFZNSURzIGFzc2lnbm1lbnQgdG8gYWxsIEd1ZXN0XFxuLVxcdFxcdCAqIGluc3RhbmNlcyBpcyBpbnZhbGlkIGFuZCB3ZSBoYXZlIGZvcmNlIFZNSUQgcmUtYXNzaWduZW1lbnRcXG4tXFx0XFx0ICogZm9yIGFsbCBHdWVzdCBpbnN0YW5jZXMuIFRoZSBHdWVzdCBpbnN0YW5jZXMgdGhhdCB3ZXJlIG5vdFxcbi1cXHRcXHQgKiBydW5uaW5nIHdpbGwgYXV0b21hdGljYWxseSBwaWNrLXVwIG5ldyBWTUlEcyBiZWNhdXNlIHdpbGxcXG4tXFx0XFx0ICogY2FsbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKCkgd2hlbmV2ZXIgdGhleSBlbnRlclxcbi1cXHRcXHQgKiBpbi1rZXJuZWwgcnVuIGxvb3AuIEZvciBHdWVzdCBpbnN0YW5jZXMgdGhhdCBhcmUgYWxyZWFkeVxcbi1cXHRcXHQgKiBydW5uaW5nLCB3ZSBmb3JjZSBWTSBleGl0cyBvbiBhbGwgaG9zdCBDUFVzIHVzaW5nIElQSSBhbmRcXG4tXFx0XFx0ICogZmx1c2ggYWxsIEd1ZXN0IFRMQnMuXFxuK1xcdFxcdCAqIEhHQVRQIG11c3QgY29udGFpbiB0aGUgc2FtZSBoYXJkd2FyZSBWTUlEIHRoYXQgaXMgcHVibGlzaGVkXFxuK1xcdFxcdCAqIGluIGFjdGl2ZV92bWlkcy5cXG4gXFx0XFx0ICovXFxuLVxcdFxcdG9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCxcXG4tXFx0XFx0XFx0XFx0IE5VTEwsIDEpO1xcbitcXHRcXHRpZiAob2xkX2FjdGl2ZV92bWlkICE9IHZtaWQpXFxuK1xcdFxcdFxcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XFxuK1xcbitcXHRcXHRpZiAoYXRvbWljNjRfY21weGNoZyhhY3RpdmUsIG9sZF9hY3RpdmVfdm1pZCwgdm1pZCkgPT1cXG4rXFx0XFx0ICAgIG9sZF9hY3RpdmVfdm1pZClcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuIFxcbi1cXHR2bWlkLVxcdTAwM2V2bWlkID0gdm1pZF9uZXh0O1xcbi1cXHR2bWlkX25leHQrKztcXG4tXFx0dm1pZF9uZXh0IFxcdTAwMjY9ICgxIFxcdTAwM2NcXHUwMDNjIHZtaWRfYml0cykgLSAxO1xcbitcXHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xcbiBcXG4tXFx0V1JJVEVfT05DRSh2bWlkLVxcdTAwM2V2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcXG4rXFx0LypcXG4rXFx0ICogUmUtcmVhZCB1bmRlciB0aGUgYWxsb2NhdG9yIGxvY2sgYmVjYXVzZSBhbm90aGVyIHZDUFUgb2YgdGhpcyBWTVxcbitcXHQgKiBtYXkgYWxyZWFkeSBoYXZlIHByb21vdGVkIG9yIGFsbG9jYXRlZCB0aGUgc2hhcmVkIFZNSUQuXFxuK1xcdCAqL1xcbitcXHR2bWlkID0gYXRvbWljNjRfcmVhZChcXHUwMDI2a3ZtX3ZtaWQtXFx1MDAzZWlkKTtcXG4rXFxuK1xcdGlmICghdm1pZF9nZW5fbWF0Y2godm1pZCkpIHtcXG4rXFx0XFx0dm1pZCA9IG5ld192bWlkX2xvY2tlZChrdm1fdm1pZCk7XFxuK1xcdFxcdGF0b21pYzY0X3NldChcXHUwMDI2a3ZtX3ZtaWQtXFx1MDAzZWlkLCB2bWlkKTtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQ29tcGxldGUgdGhpcyBDUFUncyBkZWZlcnJlZCByb2xsb3ZlciBpbnZhbGlkYXRpb24gYmVmb3JlXFxuK1xcdCAqIGluc3RhbGxpbmcgdGhlIG5ldyBoYXJkd2FyZSBWTUlELlxcbitcXHQgKi9cXG4rXFx0aWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgXFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKSlcXG4rXFx0XFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSW5zdGFsbCB0aGUgY3VycmVudCBoYXJkd2FyZSBWTUlEIGJlZm9yZSBwdWJsaXNoaW5nIHRoaXMgQ1BVIGFzXFxuK1xcdCAqIGFjdGl2ZSB3aXRoIHRoZSBuZXcgc29mdHdhcmUgVk1JRC5cXG4rXFx0ICovXFxuK1xcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBPbmNlIGFjdGl2ZV92bWlkcyBpcyB2aXNpYmxlLCB0aGUgcmVxdWlyZWQgbG9jYWwgaW52YWxpZGF0aW9uIGFuZFxcbitcXHQgKiBIR0FUUCB1cGRhdGUgYXJlIGNvbXBsZXRlLlxcbitcXHQgKi9cXG4rXFx0YXRvbWljNjRfc2V0KGFjdGl2ZSwgdm1pZCk7XFxuK1xcbitcXHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XFxuK31cXG4gXFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZ2bWlkX2xvY2spO1xcbisvKlxcbisgKiBDUFUgdmlydHVhbGl6YXRpb24vQ1NSIHN0YXRlIGlzIGJlaW5nIGRpc2NhcmRlZC5cXG4rICpcXG4rICogV2l0aGRyYXcgZmFzdC1wYXRoIGVsaWdpYmlsaXR5LCBidXQgY29uc2VydmF0aXZlbHkgcHJlc2VydmUgdGhlIGxhc3RcXG4rICogaWRlbnRpdHkgaW5zdGVhZCBvZiBtYWtpbmcgaXRzIGhhcmR3YXJlIFZNSUQgaW1tZWRpYXRlbHkgcmV1c2FibGUuXFxuKyAqL1xcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSh2b2lkKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XFxuK1xcdHU2NCB2bWlkO1xcbitcXHR1bnNpZ25lZCBpbnQgY3B1O1xcbitcXG4rXFx0aWYgKCF2bWlkX2JpdHMpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcXG4rXFxuK1xcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcXG4rXFxuK1xcdHJhd19zcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XFxuK1xcbitcXHR2bWlkID0gYXRvbWljNjRfeGNoZyh0aGlzX2NwdV9wdHIoXFx1MDAyNmFjdGl2ZV92bWlkcyksIDApO1xcbitcXG4rXFx0aWYgKHZtaWQpXFxuK1xcdFxcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSB2bWlkO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSWYgYWN0aXZlIHdhcyBhbHJlYWR5IHplcm8sIHJldGFpbiB0aGUgb2xkIHJlc2VydmVkIGVudHJ5LlxcbitcXHQgKi9cXG4rXFx0Y3B1bWFza19zZXRfY3B1KGNwdSwgXFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKTtcXG4gXFxuLVxcdC8qIFJlcXVlc3QgRy1zdGFnZSBwYWdlIHRhYmxlIHVwZGF0ZSBmb3IgYWxsIFZDUFVzICovXFxuLVxcdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXFx1MDAzZWt2bSlcXG4tXFx0XFx0a3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1VQREFURV9IR0FUUCwgdik7XFxuK1xcdHJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKFxcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcXG4gfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNjoyMDo0NC4yNzYxMzA4NloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTU2NjMxNTAxNjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiQWxsIG1vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGFyY2gvcmlzY3YvIChSSVNDLVYgS1ZNIHN1YnN5c3RlbSkuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGV4Y2x1c2l2ZSB0byBSSVNDLVYgYW5kIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZGFlNjIxODc4ZWRmNzcyY2Q4NWIwOGVlMWVmZmE1MDEzNDhjM2M1NVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDE2OjIwOjQyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaFxuaW5kZXggYWFmMDgwYmExYjc3YS4uYzYxYTFiYmIyNzJmNCAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaFxuQEAgLTgsNyArOCw3IEBAXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFx1MDAzZVxuLVxuKyNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdm1pZC5oXHUwMDNlXG4gc3RydWN0IGt2bV9nc3RhZ2Uge1xuIFx0c3RydWN0IGt2bSAqa3ZtO1xuIFx0dW5zaWduZWQgbG9uZyBmbGFncztcbkBAIC0xMDgsNyArMTA4LDggQEAgc3RhdGljIGlubGluZSB2b2lkIGt2bV9yaXNjdl9nc3RhZ2VfaW5pdChzdHJ1Y3Qga3ZtX2dzdGFnZSAqZ3N0YWdlLCBzdHJ1Y3Qga3ZtICpcbiB7XG4gXHRnc3RhZ2UtXHUwMDNla3ZtID0ga3ZtO1xuIFx0Z3N0YWdlLVx1MDAzZWZsYWdzID0gMDtcbi1cdGdzdGFnZS1cdTAwM2V2bWlkID0gUkVBRF9PTkNFKGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4rXHRnc3RhZ2UtXHUwMDNldm1pZCA9XG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0Z3N0YWdlLVx1MDAzZXBnZCA9IGt2bS1cdTAwM2VhcmNoLnBnZDtcbiBcdGdzdGFnZS1cdTAwM2VwZ2RfbGV2ZWxzID0ga3ZtLVx1MDAzZWFyY2gucGdkX2xldmVscztcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaFxuaW5kZXggNTQzOWU3NmYwYTk2MC4uYWFlOWI4YWMwODc4ZiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaFxuQEAgLTE2LDYgKzE2LDcgQEAgaW50IGt2bV9yaXNjdl9tbXVfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCxcbiBcdFx0ICAgICAgc3RydWN0IGt2bV9nc3RhZ2VfbWFwcGluZyAqb3V0X21hcCk7XG4gaW50IGt2bV9yaXNjdl9tbXVfYWxsb2NfcGdkKHN0cnVjdCBrdm0gKmt2bSk7XG4gdm9pZCBrdm1fcmlzY3ZfbW11X2ZyZWVfcGdkKHN0cnVjdCBrdm0gKmt2bSk7XG4rdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpO1xuIHZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTtcbiBcbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuQEAgLTYsMjEgKzYsNDIgQEBcbiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV90eXBlcy5oXHUwMDNlXG4gXG4gc3RydWN0IGt2bV92bWlkIHtcbiBcdC8qXG4tXHQgKiBXcml0ZXMgdG8gdm1pZF92ZXJzaW9uIGFuZCB2bWlkIGhhcHBlbiB3aXRoIHZtaWRfbG9jayBoZWxkXG4tXHQgKiB3aGVyZWFzIHJlYWRzIGhhcHBlbiB3aXRob3V0IGFueSBsb2NrIGhlbGQuXG4rXHQgKiBTb2Z0d2FyZSBWTUlEOlxuK1x0ICpcbitcdCAqICAgWyBnZW5lcmF0aW9uIHwgaGFyZHdhcmUgVk1JRCBdXG4rXHQgKlxuK1x0ICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdFxuK1x0ICogd3JhcCBhdCB0aGUgbmF0aXZlIHdvcmQgc2l6ZS4gIFplcm8gZGVub3RlcyBhbiB1bmFsbG9jYXRlZCBWTUlELlxuK1x0ICpcbitcdCAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFBcbitcdCAqIG9yIHVzZWQgYXMgYSBoYXJkd2FyZSBmZW5jZSBWTUlELlxuIFx0ICovXG4tXHR1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbjtcbi1cdHVuc2lnbmVkIGxvbmcgdm1pZDtcbitcdGF0b21pYzY0X3QgaWQ7XG4gfTtcbiBcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCk7XG4rXG4raW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKTtcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpO1xuK1xuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pO1xuK1xuK3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpO1xuK1xuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZCk7XG4rXG4gdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7XG4gXG4rLypcbisgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSdzIGZhc3QtcGF0aCBWTUlEIHN0YXRlIHdoaWxlIHByZXNlcnZpbmdcbisgKiB0aGUgb2xkIGlkZW50aXR5IGNvbnNlcnZhdGl2ZWx5IGluIHJlc2VydmVkX3ZtaWRzLlxuKyAqL1xuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpO1xuK1xuICNlbmRpZlxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuaW5kZXggODk1NjhjY2NlMDFkZS4uZDZjNmJlNGRmNjFiMSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG5AQCAtMTYsNyArMTYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbmFjbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NiaS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92Y3B1X3ZlY3Rvci5oXHUwMDNlXG4tXG4rI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92bWlkLmhcdTAwM2VcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwga3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpO1xuIFxuIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpO1xuQEAgLTg0LDYgKzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcbiBcbiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXG4ge1xuK1x0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XG4gXHRrdm1fcmlzY3ZfYWlhX2Rpc2FibGUoKTtcbiBcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZGlzYWJsZSgpO1xuQEAgLTExMiw2ICsxMTMsNyBAQCBzdGF0aWMgaW50IGt2bV9yaXNjdl9jcHVfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nXG4gXHRcdCAqIGlzIGVuYWJsZWQgb24gdGhpcyBDUFUuXG4gXHRcdCAqL1xuIFx0XHRpZiAoX190aGlzX2NwdV9yZWFkKGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKSkge1xuK1x0XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpO1xuIFx0XHRcdGt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTtcbiBcdFx0XHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcbiBcdFx0fVxuQEAgLTEzMCw2ICsxMzIsNyBAQCBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9yaXNjdl9jcHVfcG1fbmIgPSB7XG4gc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3RlYXJkb3duKHZvaWQpXG4ge1xuIFx0a3ZtX3Jpc2N2X2FpYV9leGl0KCk7XG4rXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuIFx0a3ZtX3Jpc2N2X3ZfZXhpdCgpO1xuIFx0a3ZtX3VucmVnaXN0ZXJfcGVyZl9jYWxsYmFja3MoKTtcbkBAIC0xODEsOCArMTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpXG4gXG4gXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7XG4gXG4rXHRyYyA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KCk7XG4rXHRpZiAocmMpIHtcbitcdFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuK1x0XHRyZXR1cm4gcmM7XG4rXHR9XG4rXG4gXHRyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpO1xuIFx0aWYgKHJjIFx1MDAyNlx1MDAyNiByYyAhPSAtRU5PREVWKSB7XG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XG4gXHRcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcbiBcdFx0cmV0dXJuIHJjO1xuIFx0fVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21tdS5jIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbmluZGV4IDYwMzViNWVjOTUwMzkuLjliNTk3MDkyZjhlYzYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbkBAIC0xNSw3ICsxNSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX21tdS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV9uYWNsLmhcdTAwM2Vcbi1cbisjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgZWFnZXJfcGFnZV9zcGxpdCA9IHRydWU7XG4gbW9kdWxlX3BhcmFtKGVhZ2VyX3BhZ2Vfc3BsaXQsIGJvb2wsIDA2NDQpO1xuIFxuQEAgLTc5NiwxNiArNzk2LDIzIEBAIHZvaWQga3ZtX3Jpc2N2X21tdV9mcmVlX3BnZChzdHJ1Y3Qga3ZtICprdm0pXG4gXHRrdm1fbW11X2ZyZWVfbWVtb3J5X2NhY2hlKFx1MDAyNmt2bS1cdTAwM2VhcmNoLnBnZF9zcGxpdF9wYWdlX2NhY2hlKTtcbiB9XG4gXG4tdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4rdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpXG4ge1xuIFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2g7XG4gXHR1bnNpZ25lZCBsb25nIGhnYXRwID0ga3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGthLVx1MDAzZXBnZF9sZXZlbHMpXG4gXHRcdFx0ICAgICAgXHUwMDNjXHUwMDNjIEhHQVRQX01PREVfU0hJRlQ7XG4gXG4tXHRoZ2F0cCB8PSAoUkVBRF9PTkNFKGthLVx1MDAzZXZtaWQudm1pZCkgXHUwMDNjXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFx1MDAyNiBIR0FUUF9WTUlEO1xuK1x0aGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpIFx1MDAzY1x1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcdTAwMjYgSEdBVFBfVk1JRDtcbiBcdGhnYXRwIHw9IChrYS1cdTAwM2VwZ2RfcGh5cyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IEhHQVRQX1BQTjtcbiBcbiBcdG5jc3Jfd3JpdGUoQ1NSX0hHQVRQLCBoZ2F0cCk7XG4rfVxuK1xuK3ZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuK3tcbitcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpO1xuK1xuK1x0a3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTtcbiBcbiBcdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHMoKSlcbiBcdFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3RsYi5jIGIvYXJjaC9yaXNjdi9rdm0vdGxiLmNcbmluZGV4IDJhZTM0NjMyY2RjYjEuLmI4NWU1YmEyMTk4YWEgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS90bGIuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vdGxiLmNcbkBAIC0yMjQsNyArMjI0LDcgQEAgdm9pZCBrdm1fcmlzY3ZfbG9jYWxfdGxiX3Nhbml0aXplKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdCAqIGVudHJpZXMgYnkgVk1JRCB3aGVuZXZlciB1bmRlcmx5aW5nIEhvc3QgQ1BVIGNoYW5nZXMgZm9yIGEgVkNQVS5cbiBcdCAqL1xuIFxuLVx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4rXHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcbiBcbiBcdC8qXG5AQCAtMjQ0LDcgKzI0NCw3IEBAIHZvaWQga3ZtX3Jpc2N2X2ZlbmNlX2lfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbiBcdHN0cnVjdCBrdm1fdm1pZCAqdiA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbi1cdHVuc2lnbmVkIGxvbmcgdm1pZCA9IFJFQURfT05DRSh2LVx1MDAzZXZtaWQpO1xuK1x0dW5zaWduZWQgbG9uZyB2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2LVx1MDAzZWlkKSk7XG4gXG4gXHRpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpXG4gXHRcdG5hY2xfaGZlbmNlX2d2bWFfdm1pZF9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcbkBAIC0yNTUsNyArMjU1LDcgQEAgdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbitcdHVuc2lnbmVkIGxvbmcgdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2di1cdTAwM2VpZCkpO1xuIFxuIFx0aWYgKGt2bV9yaXNjdl9uYWNsX2F2YWlsYWJsZSgpKVxuIFx0XHRuYWNsX2hmZW5jZV92dm1hX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xuQEAgLTUzMSw4ICs1MzEsMTEgQEAgdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHN0cnVjdCBrdm0gKmt2bSxcbiBcbiBpbnQga3ZtX2FyY2hfZmx1c2hfcmVtb3RlX3RsYnNfcmFuZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIHU2NCBucl9wYWdlcylcbiB7XG4rXHR1bnNpZ25lZCBsb25nIHZtaWQgPVxuK1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbitcbiBcdGt2bV9yaXNjdl9oZmVuY2VfZ3ZtYV92bWlkX2dwYShrdm0sIC0xVUwsIDAsXG4gXHRcdFx0XHQgICAgICAgZ2ZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULCBucl9wYWdlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbi1cdFx0XHRcdCAgICAgICBQQUdFX1NISUZULCBSRUFEX09OQ0Uoa3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKSk7XG4rXHRcdFx0XHQgICAgICAgUEFHRV9TSElGVCwgdm1pZCk7XG4gXHRyZXR1cm4gMDtcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbkBAIC05NDMsMTQgKzk0MywxNCBAQCBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRyZXQgPSAxO1xuIFxuLVx0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHZjcHUpO1xuLVxuIFx0XHRyZXQgPSBrdm1fcmlzY3ZfY2hlY2tfdmNwdV9yZXF1ZXN0cyh2Y3B1KTtcbiBcdFx0aWYgKHJldCBcdTAwM2M9IDApXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdHByZWVtcHRfZGlzYWJsZSgpO1xuIFxuK1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHZjcHUpO1xuK1xuIFx0XHQvKiBVcGRhdGUgQUlBIEhXIHN0YXRlIGJlZm9yZSBlbnRlcmluZyBndWVzdCAqL1xuIFx0XHRyZXQgPSBrdm1fcmlzY3ZfdmNwdV9haWFfdXBkYXRlKHZjcHUpO1xuIFx0XHRpZiAocmV0IFx1MDAzYz0gMCkge1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuaW5kZXggNTA2YTUxMGI2YmZmMy4uMWJlMzg2YTc4ZTI3ZiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG5AQCAtMTA0LDcgKzEwNCw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuXG4gXHRcdGt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfRkVOQ0VfSV9TRU5UKTtcbiBcdFx0YnJlYWs7XG4gXHRjYXNlIFNCSV9FWFRfUkZFTkNFX1JFTU9URV9TRkVOQ0VfVk1BOlxuLVx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4gXHRcdGlmICgoY3AtXHUwMDNlYTIgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTMgPT0gMCkgfHwgY3AtXHUwMDNlYTMgPT0gLTFVTClcbiBcdFx0XHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssIHZtaWQpO1xuIFx0XHRlbHNlXG5AQCAtMTEzLDcgKzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuXG4gXHRcdGt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfSEZFTkNFX1ZWTUFfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQV9BU0lEOlxuLVx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4gXHRcdGlmICgoY3AtXHUwMDNlYTIgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTMgPT0gMCkgfHwgY3AtXHUwMDNlYTMgPT0gLTFVTClcbiBcdFx0XHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYXNpZF9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzayxcbiBcdFx0XHRcdFx0XHQgICAgICAgY3AtXHUwMDNlYTQsIHZtaWQpO1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNcbmluZGV4IGRlNTQ0ZWEzZjI4ZGMuLmNhM2VmZTYzYzFjZjEgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNcbkBAIC04OCwxNCArODgsMTQgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF92MDFfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4sXG4gXHRcdGlmIChjcC1cdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfRkVOQ0VfSSlcbiBcdFx0XHRrdm1fcmlzY3ZfZmVuY2VfaSh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrKTtcbiBcdFx0ZWxzZSBpZiAoY3AtXHUwMDNlYTcgPT0gU0JJX0VYVF8wXzFfUkVNT1RFX1NGRU5DRV9WTUEpIHtcbi1cdFx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdFx0ZWxzZVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCBjcC1cdTAwM2VhMSxcbiBcdFx0XHRcdFx0XHRcdCAgY3AtXHUwMDNlYTIsIFBBR0VfU0hJRlQsIHZtaWQpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuK1x0XHRcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0XHRcdGlmIChjcC1cdTAwM2VhMSA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMiA9PSAwKVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXG4gXHRcdFx0XHRcdFx0XHQgICAgICAgY3AtXHUwMDNlYTMsIHZtaWQpO1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xuaW5kZXggYzE1YmRiMWRkOGJlZi4uZWVlODMwNmMxMjcwNyAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXG5AQCAtNiwxMSArNiwxNSBAQFxuICAqICAgICBBbnVwIFBhdGVsIFx1MDAzY2FudXAucGF0ZWxAd2RjLmNvbVx1MDAzZVxuICAqL1xuIFxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdG1hcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVtYXNrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3BlcmNwdS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcHJlZW1wdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc21wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1faG9zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2Nzci5oXHUwMDNlXG5AQCAtMTgsMjYgKzIyLDU0IEBAXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV90bGIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdm1pZC5oXHUwMDNlXG4gXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uID0gMTtcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX25leHQ7XG4rc3RhdGljIGF0b21pYzY0X3Qgdm1pZF9nZW5lcmF0aW9uO1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2JpdHMgX19yb19hZnRlcl9pbml0O1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodm1pZF9sb2NrKTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2N1cl9pZHggPSAxO1xuK1xuK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHZtaWRfbG9jayk7XG4rXG4rc3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pYzY0X3QsIGFjdGl2ZV92bWlkcyk7XG4rc3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzZXJ2ZWRfdm1pZHMpO1xuK1xuK3N0YXRpYyBjcHVtYXNrX3QgdGxiX2ZsdXNoX3BlbmRpbmc7XG4rXG4rI2RlZmluZSBWTUlEX0ZJUlNUX1ZFUlNJT05cdEJJVF9VTEwodm1pZF9iaXRzKVxuKyNkZWZpbmUgTlVNX1ZNSURTXHRcdEJJVCh2bWlkX2JpdHMpXG4rI2RlZmluZSBWTUlEX0hXX01BU0tcdFx0KFZNSURfRklSU1RfVkVSU0lPTiAtIDEpXG4rXG4rc3RhdGljIGJvb2wgdm1pZF9nZW5fbWF0Y2godTY0IHZtaWQpXG4re1xuK1x0cmV0dXJuICEoKHZtaWQgXiBhdG9taWM2NF9yZWFkKFx1MDAyNnZtaWRfZ2VuZXJhdGlvbikpIFx1MDAzZVx1MDAzZSB2bWlkX2JpdHMpO1xuK31cbitcbit1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHU2NCB2bWlkKVxuK3tcbitcdGlmICghdm1pZF9iaXRzKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcdTAwMjYgVk1JRF9IV19NQVNLKTtcbit9XG4gXG4gdm9pZCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCh2b2lkKVxuIHtcbi1cdC8qIEZpZ3VyZS1vdXQgbnVtYmVyIG9mIFZNSUQgYml0cyBpbiBIVyAqL1xuK1x0LyogRmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIFZNSUQgYml0cyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUuICovXG4gXHRjc3Jfd3JpdGUoQ1NSX0hHQVRQLCAoa3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGt2bV9yaXNjdl9nc3RhZ2VfbWF4X3BnZF9sZXZlbHMpIFx1MDAzY1x1MDAzY1xuLVx0XHRcdCAgICAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7XG4rXHRcdCAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7XG4gXHR2bWlkX2JpdHMgPSBjc3JfcmVhZChDU1JfSEdBVFApO1xuIFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcdTAwMjYgSEdBVFBfVk1JRCkgXHUwMDNlXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XG4gXHR2bWlkX2JpdHMgPSBmbHNfbG9uZyh2bWlkX2JpdHMpO1xuIFx0Y3NyX3dyaXRlKENTUl9IR0FUUCwgMCk7XG4gXG4tXHQvKiBXZSBwb2xsdXRlZCBsb2NhbCBUTEIgc28gZmx1c2ggYWxsIGd1ZXN0IFRMQiAqL1xuK1x0LyogRmx1c2ggdGhlIGxvY2FsIGd1ZXN0IFRMQiBhZnRlciBwcm9iaW5nIEhHQVRQLiAqL1xuIFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xuIFxuLVx0LyogV2UgZG9uJ3QgdXNlIFZNSUQgYml0cyBpZiB0aGV5IGFyZSBub3Qgc3VmZmljaWVudCAqL1xuLVx0aWYgKCgxVUwgXHUwMDNjXHUwMDNjIHZtaWRfYml0cykgXHUwMDNjIG51bV9wb3NzaWJsZV9jcHVzKCkpXG4rXHQvKlxuK1x0ICogVk1JRCAwIGlzIHJlc2VydmVkLiAgRHVyaW5nIHJvbGxvdmVyIGV2ZXJ5IHBvc3NpYmxlIENQVSBtYXlcbitcdCAqIHJlc2VydmUgb25lIGhhcmR3YXJlIFZNSUQsIGFuZCB3ZSBzdGlsbCBuZWVkIGF0IGxlYXN0IG9uZSBWTUlEXG4rXHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXG4rXHQgKi9cbitcdGlmICh2bWlkX2JpdHMgXHUwMDI2XHUwMDI2IE5VTV9WTUlEUyAtIDEgXHUwMDNjPSBudW1fcG9zc2libGVfY3B1cygpKVxuIFx0XHR2bWlkX2JpdHMgPSAwO1xuIH1cbiBcbkBAIC00Niw4MCArNzgsMjk1IEBAIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZClcbiBcdHJldHVybiB2bWlkX2JpdHM7XG4gfVxuIFxuK2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZClcbit7XG4rXHRpbnQgY3B1O1xuK1xuK1x0aWYgKCF2bWlkX2JpdHMpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0dm1pZF9tYXAgPSBiaXRtYXBfemFsbG9jKE5VTV9WTUlEUywgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIXZtaWRfbWFwKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdHZtaWRfY3VyX2lkeCA9IDE7XG4rXG4rXHQvKiBIYXJkd2FyZSBWTUlEIDAgaXMgcmVzZXJ2ZWQuICovXG4rXHRfX3NldF9iaXQoMCwgdm1pZF9tYXApO1xuK1xuK1x0YXRvbWljNjRfc2V0KFx1MDAyNnZtaWRfZ2VuZXJhdGlvbiwgVk1JRF9GSVJTVF9WRVJTSU9OKTtcbitcbitcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbitcdFx0YXRvbWljNjRfc2V0KFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcbitcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRXZlcnkgQ1BVIHBlcmZvcm1zIGFuIGluaXRpYWwgbG9jYWwgaW52YWxpZGF0aW9uIGJlZm9yZSBpdHNcbitcdCAqIGZpcnN0IFZNSUQgYWN0aXZhdGlvbi5cbitcdCAqL1xuK1x0Y3B1bWFza19jb3B5KFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nLCBjcHVfcG9zc2libGVfbWFzayk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKVxuK3tcbitcdGJpdG1hcF9mcmVlKHZtaWRfbWFwKTtcbitcdHZtaWRfbWFwID0gTlVMTDtcbit9XG4rXG4gaW50IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9pbml0KHN0cnVjdCBrdm0gKmt2bSlcbiB7XG4tXHQvKiBNYXJrIHRoZSBpbml0aWFsIFZNSUQgYW5kIFZNSUQgdmVyc2lvbiBpbnZhbGlkICovXG4tXHRrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWRfdmVyc2lvbiA9IDA7XG4tXHRrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQgPSAwO1xuK1x0YXRvbWljNjRfc2V0KFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQsIDApO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZClcbiB7XG4rXHR1NjQgaWQ7XG4rXG4gXHRpZiAoIXZtaWRfYml0cylcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuLVx0cmV0dXJuIHVubGlrZWx5KFJFQURfT05DRSh2bWlkLVx1MDAzZXZtaWRfdmVyc2lvbikgIT1cbi1cdFx0XHRSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7XG4rXHRpZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZC1cdTAwM2VpZCk7XG4rXG4rXHRyZXR1cm4gdW5saWtlbHkoIXZtaWRfZ2VuX21hdGNoKGlkKSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9fbG9jYWxfaGZlbmNlX2d2bWFfYWxsKHZvaWQgKmluZm8pXG4rLypcbisgKiBDYWxsZWQgd2l0aCB2bWlkX2xvY2sgaGVsZCBhZnRlciB2bWlkX2dlbmVyYXRpb24gaGFzIGFscmVhZHkgYmVlblxuKyAqIGFkdmFuY2VkLlxuKyAqXG4rICogTm8gcmVtb3RlIENQVSBpcyBpbnRlcnJ1cHRlZCBoZXJlLiAgSW5zdGVhZCwgcHJlc2VydmUgZXZlcnkgVk1JRFxuKyAqIHdoaWNoIG1heSBzdGlsbCBiZSB1c2VkIGJ5IGEgQ1BVIGFuZCBxdWV1ZSBhIGxvY2FsIGludmFsaWRhdGlvbiBmb3JcbisgKiB0aGF0IENQVSdzIG5leHQgVk1JRCBhY3RpdmF0aW9uLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZClcbiB7XG4tXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4rXHR1NjQgdm1pZDtcbitcdGludCBjcHU7XG4rXG4rXHRiaXRtYXBfemVybyh2bWlkX21hcCwgTlVNX1ZNSURTKTtcbitcdF9fc2V0X2JpdCgwLCB2bWlkX21hcCk7XG4rXG4rXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4rXHRcdHZtaWQgPSBhdG9taWM2NF94Y2hnKFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIENQVSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFuIGVhcmxpZXIgcm9sbG92ZXJcbitcdFx0ICogd2l0aG91dCBwZXJmb3JtaW5nIGFub3RoZXIgYWN0aXZhdGlvbiBzaW5jZSB0aGVuLiAgSW4gdGhhdFxuK1x0XHQgKiBjYXNlIHJlc2VydmVkX3ZtaWRzIGlzIHRoZSBvbmx5IHJlY29yZCBvZiB0aGUgb2xkIGNvbnRleHQuXG4rXHRcdCAqL1xuK1x0XHRpZiAoIXZtaWQpXG4rXHRcdFx0dm1pZCA9IHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSk7XG4rXG4rXHRcdGlmICh2bWlkKVxuK1x0XHRcdF9fc2V0X2JpdChrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKSxcbitcdFx0XHRcdCAgdm1pZF9tYXApO1xuK1xuK1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gdm1pZDtcbitcdH1cbitcbitcdGNwdW1hc2tfY29weShcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZywgY3B1X3Bvc3NpYmxlX21hc2spO1xuIH1cbiBcbi12b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuKy8qXG4rICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXG4rICpcbisgKiBEbyBub3Qgc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2g6IHRoZSBzYW1lIFZNIG1heSBoYXZlIGJlZW4gYWN0aXZlXG4rICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cbisgKi9cbitzdGF0aWMgYm9vbCBjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh1NjQgb2xkX3ZtaWQsIHU2NCBuZXdfdm1pZClcbiB7XG4tXHR1bnNpZ25lZCBsb25nIGk7XG4tXHRzdHJ1Y3Qga3ZtX3ZjcHUgKnY7XG4tXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4rXHRib29sIGhpdCA9IGZhbHNlO1xuK1x0aW50IGNwdTtcbiBcbi1cdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHZtaWQpKVxuLVx0XHRyZXR1cm47XG4rXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4rXHRcdGlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7XG4rXHRcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IG5ld192bWlkO1xuK1x0XHRcdGhpdCA9IHRydWU7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldHVybiBoaXQ7XG4rfVxuK1xuKy8qXG4rICogQWxsb2NhdGUvcHJvbW90ZSBhIHNvZnR3YXJlIFZNSUQuXG4rICpcbisgKiB2bWlkX2xvY2sgbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIuXG4rICovXG4rc3RhdGljIHU2NCBuZXdfdm1pZF9sb2NrZWQoc3RydWN0IGt2bV92bWlkICprdm1fdm1pZClcbit7XG4rXHR1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuK1x0dTY0IGdlbmVyYXRpb24gPSBhdG9taWM2NF9yZWFkKFx1MDAyNnZtaWRfZ2VuZXJhdGlvbik7XG4rXHR1NjQgbmV3X3ZtaWQ7XG4rXHR1bnNpZ25lZCBsb25nIGlkeDtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZ2bWlkX2xvY2spO1xuK1x0aWYgKHZtaWQpIHtcbitcdFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcbitcdFx0XHQgICBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKTtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLlxuK1x0XHQgKiBLZWVwIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgYW5kIG9ubHkgcHJvbW90ZSBnZW5lcmF0aW9uLlxuK1x0XHQgKi9cbitcdFx0aWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSlcbitcdFx0XHRyZXR1cm4gbmV3X3ZtaWQ7XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoZSBWTSBoYWQgYSBWTUlEIGluIGFuIG9sZGVyIGdlbmVyYXRpb24uICBSZXVzZSB0aGUgc2FtZVxuK1x0XHQgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC5cbitcdFx0ICovXG4rXHRcdGlkeCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpO1xuK1x0XHRpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSlcbitcdFx0XHRyZXR1cm4gbmV3X3ZtaWQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLlxuK1x0ICovXG4rXHRpZHggPSBmaW5kX25leHRfemVyb19iaXQodm1pZF9tYXAsIE5VTV9WTUlEUywgdm1pZF9jdXJfaWR4KTtcbitcdGlmIChpZHggIT0gTlVNX1ZNSURTKVxuK1x0XHRnb3RvIHNldF92bWlkO1xuK1xuK1x0LypcbitcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcbitcdCAqIHVzZXJzLCBhbmQgZGVmZXIgZWFjaCBDUFUncyBmbHVzaCB1bnRpbCBpdHMgbmV4dCBhY3RpdmF0aW9uLlxuK1x0ICovXG4rXHRnZW5lcmF0aW9uICs9IFZNSURfRklSU1RfVkVSU0lPTjtcbitcbitcdC8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqL1xuK1x0aWYgKHVubGlrZWx5KCFnZW5lcmF0aW9uKSlcbitcdFx0Z2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjtcbitcbitcdGF0b21pYzY0X3hjaGcoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBnZW5lcmF0aW9uKTtcbitcdGZsdXNoX2NvbnRleHQoKTtcbiBcbiBcdC8qXG4tXHQgKiBXZSBuZWVkIHRvIHJlLWNoZWNrIHRoZSB2bWlkX3ZlcnNpb24gaGVyZSB0byBlbnN1cmUgdGhhdCBpZlxuLVx0ICogYW5vdGhlciB2Y3B1IGFscmVhZHkgYWxsb2NhdGVkIGEgdmFsaWQgdm1pZCBmb3IgdGhpcyB2bS5cbitcdCAqIE5VTV9WTUlEUyAtIDEgXHUwMDNlIG51bV9wb3NzaWJsZV9jcHVzKCksIHRoZXJlZm9yZSByb2xsb3ZlciBtdXN0XG4rXHQgKiBsZWF2ZSBhdCBsZWFzdCBvbmUgYWxsb2NhdGFibGUgaGFyZHdhcmUgVk1JRC5cbiBcdCAqL1xuLVx0aWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2dm1pZF9sb2NrKTtcbitcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCAxKTtcbitcbitzZXRfdm1pZDpcbitcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcbitcdHZtaWRfY3VyX2lkeCA9IGlkeDtcbitcbitcdHJldHVybiBnZW5lcmF0aW9uIHwgaWR4O1xuK31cbitcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuK3tcbitcdHN0cnVjdCBrdm1fdm1pZCAqa3ZtX3ZtaWQgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4rXHRhdG9taWM2NF90ICphY3RpdmU7XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuK1x0dTY0IHZtaWQ7XG4rXHR1NjQgb2xkX2FjdGl2ZV92bWlkO1xuK1x0dW5zaWduZWQgaW50IGNwdTtcbitcbitcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm47XG4tXHR9XG4gXG4tXHQvKiBGaXJzdCB1c2VyIG9mIGEgbmV3IFZNSUQgdmVyc2lvbj8gKi9cbi1cdGlmICh1bmxpa2VseSh2bWlkX25leHQgPT0gMCkpIHtcbi1cdFx0V1JJVEVfT05DRSh2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pICsgMSk7XG4tXHRcdHZtaWRfbmV4dCA9IDE7XG4rXHQvKlxuK1x0ICogYWN0aXZlX3ZtaWRzIGFuZCB0bGJfZmx1c2hfcGVuZGluZyBhcmUgcGVyLUNQVSBzdGF0ZS4gIEtlZXAgdGhlXG4rXHQgKiBjb21wbGV0ZSBWTUlEIGFjdGl2YXRpb24gb24gdGhlIHNhbWUgQ1BVLlxuK1x0ICovXG4rXHRsb2NrZGVwX2Fzc2VydF9wcmVlbXB0aW9uX2Rpc2FibGVkKCk7XG4rXG4rXHRjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7XG4rXHRhY3RpdmUgPSB0aGlzX2NwdV9wdHIoXHUwMDI2YWN0aXZlX3ZtaWRzKTtcbitcbitcdHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNmt2bV92bWlkLVx1MDAzZWlkKTtcbitcdG9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTtcbiBcbitcdC8qXG4rXHQgKiBGYXN0IHBhdGguXG4rXHQgKlxuK1x0ICogVGhlIGNtcHhjaGcgcmFjZXMgd2l0aCBmbHVzaF9jb250ZXh0KCkncyB4Y2hnIG9uIHRoZSBzYW1lXG4rXHQgKiBwZXItQ1BVIGF0b21pYy4gIEVpdGhlciB0aGlzIGFjdGl2YXRpb24gaXMgY2FwdHVyZWQgYnkgcm9sbG92ZXIsXG4rXHQgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy5cbitcdCAqL1xuK1x0aWYgKG9sZF9hY3RpdmVfdm1pZCBcdTAwMjZcdTAwMjYgdm1pZF9nZW5fbWF0Y2godm1pZCkpIHtcbiBcdFx0Lypcbi1cdFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxuLVx0XHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxuLVx0XHQgKlxuLVx0XHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3Rcbi1cdFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxuLVx0XHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XG4tXHRcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxuLVx0XHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXG4tXHRcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XG4tXHRcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxuLVx0XHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cbitcdFx0ICogSEdBVFAgbXVzdCBjb250YWluIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgdGhhdCBpcyBwdWJsaXNoZWRcbitcdFx0ICogaW4gYWN0aXZlX3ZtaWRzLlxuIFx0XHQgKi9cbi1cdFx0b25fZWFjaF9jcHVfbWFzayhjcHVfb25saW5lX21hc2ssIF9fbG9jYWxfaGZlbmNlX2d2bWFfYWxsLFxuLVx0XHRcdFx0IE5VTEwsIDEpO1xuK1x0XHRpZiAob2xkX2FjdGl2ZV92bWlkICE9IHZtaWQpXG4rXHRcdFx0a3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTtcbitcbitcdFx0aWYgKGF0b21pYzY0X2NtcHhjaGcoYWN0aXZlLCBvbGRfYWN0aXZlX3ZtaWQsIHZtaWQpID09XG4rXHRcdCAgICBvbGRfYWN0aXZlX3ZtaWQpXG4rXHRcdFx0cmV0dXJuO1xuIFx0fVxuIFxuLVx0dm1pZC1cdTAwM2V2bWlkID0gdm1pZF9uZXh0O1xuLVx0dm1pZF9uZXh0Kys7XG4tXHR2bWlkX25leHQgXHUwMDI2PSAoMSBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSAtIDE7XG4rXHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4gXG4tXHRXUklURV9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7XG4rXHQvKlxuK1x0ICogUmUtcmVhZCB1bmRlciB0aGUgYWxsb2NhdG9yIGxvY2sgYmVjYXVzZSBhbm90aGVyIHZDUFUgb2YgdGhpcyBWTVxuK1x0ICogbWF5IGFscmVhZHkgaGF2ZSBwcm9tb3RlZCBvciBhbGxvY2F0ZWQgdGhlIHNoYXJlZCBWTUlELlxuK1x0ICovXG4rXHR2bWlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCk7XG4rXG4rXHRpZiAoIXZtaWRfZ2VuX21hdGNoKHZtaWQpKSB7XG4rXHRcdHZtaWQgPSBuZXdfdm1pZF9sb2NrZWQoa3ZtX3ZtaWQpO1xuK1x0XHRhdG9taWM2NF9zZXQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQsIHZtaWQpO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIENvbXBsZXRlIHRoaXMgQ1BVJ3MgZGVmZXJyZWQgcm9sbG92ZXIgaW52YWxpZGF0aW9uIGJlZm9yZVxuK1x0ICogaW5zdGFsbGluZyB0aGUgbmV3IGhhcmR3YXJlIFZNSUQuXG4rXHQgKi9cbitcdGlmIChjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsIFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKSlcbitcdFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xuK1xuK1x0LypcbitcdCAqIEluc3RhbGwgdGhlIGN1cnJlbnQgaGFyZHdhcmUgVk1JRCBiZWZvcmUgcHVibGlzaGluZyB0aGlzIENQVSBhc1xuK1x0ICogYWN0aXZlIHdpdGggdGhlIG5ldyBzb2Z0d2FyZSBWTUlELlxuK1x0ICovXG4rXHRrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHZjcHUsIHZtaWQpO1xuK1xuK1x0LypcbitcdCAqIE9uY2UgYWN0aXZlX3ZtaWRzIGlzIHZpc2libGUsIHRoZSByZXF1aXJlZCBsb2NhbCBpbnZhbGlkYXRpb24gYW5kXG4rXHQgKiBIR0FUUCB1cGRhdGUgYXJlIGNvbXBsZXRlLlxuK1x0ICovXG4rXHRhdG9taWM2NF9zZXQoYWN0aXZlLCB2bWlkKTtcbitcbitcdHJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xuK31cbiBcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnZtaWRfbG9jayk7XG4rLypcbisgKiBDUFUgdmlydHVhbGl6YXRpb24vQ1NSIHN0YXRlIGlzIGJlaW5nIGRpc2NhcmRlZC5cbisgKlxuKyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0XG4rICogaWRlbnRpdHkgaW5zdGVhZCBvZiBtYWtpbmcgaXRzIGhhcmR3YXJlIFZNSUQgaW1tZWRpYXRlbHkgcmV1c2FibGUuXG4rICovXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuK1x0dTY0IHZtaWQ7XG4rXHR1bnNpZ25lZCBpbnQgY3B1O1xuK1xuK1x0aWYgKCF2bWlkX2JpdHMpXG4rXHRcdHJldHVybjtcbitcbitcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcbitcbitcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcbitcbitcdHJhd19zcGluX2xvY2tfaXJxc2F2ZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbitcbitcdHZtaWQgPSBhdG9taWM2NF94Y2hnKHRoaXNfY3B1X3B0cihcdTAwMjZhY3RpdmVfdm1pZHMpLCAwKTtcbitcbitcdGlmICh2bWlkKVxuK1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gdm1pZDtcbitcbitcdC8qXG4rXHQgKiBJZiBhY3RpdmUgd2FzIGFscmVhZHkgemVybywgcmV0YWluIHRoZSBvbGQgcmVzZXJ2ZWQgZW50cnkuXG4rXHQgKi9cbitcdGNwdW1hc2tfc2V0X2NwdShjcHUsIFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKTtcbiBcbi1cdC8qIFJlcXVlc3QgRy1zdGFnZSBwYWdlIHRhYmxlIHVwZGF0ZSBmb3IgYWxsIFZDUFVzICovXG4tXHRrdm1fZm9yX2VhY2hfdmNwdShpLCB2LCB2Y3B1LVx1MDAzZWt2bSlcbi1cdFx0a3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1VQREFURV9IR0FUUCwgdik7XG4rXHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNjoyMDo0NC4yNzYxMzI3WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTU2NjMxMjIxNzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIFBhdGNoIGZvciBGdXp6aW5nIFN1aXRhYmlsaXR5KipcblxuT2theSwgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBwYXRjaC4gSXQncyB0b3VjaGluZyBhIGJ1bmNoIG9mIGZpbGVzIHVuZGVyIGBhcmNoL3Jpc2N2L2AsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIEtWTSDigJMgYGt2bV9nc3RhZ2UuaGAsIGBrdm1fbW11LmhgLCBga3ZtX3ZtaWQuaGAsIGFuZCB2YXJpb3VzIGAuY2AgZmlsZXMgaW4gYGt2bS9gLiAgSGFuZyBvbiwgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBgYW1kNjRgPyAgUmlnaHQsIHNvIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgZnV6emFibGUgb24gYW1kNjQuXG5cbkxldCdzIHF1aWNrbHkgcmVmZXJlbmNlIHRoZSBuZWdhdGl2ZSBjcml0ZXJpYS4gVGhlIGtleSBwb2ludCBpcyBcIkNvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cIiAgQW5kIHllcCwgdGhlIHRhcmdldCBpcyBhbWQ2NCwgYW5kICphbGwqIHRoZSBjaGFuZ2VkIGZpbGVzIGFyZSBpbiBgYXJjaC9yaXNjdi9gLiAgVGhpcyBpcyBhIHNsYW0gZHVuay4gIFJJU0MtViBLVk0gY29kZSBpcyAqbm90KiBjb21waWxlZCBvciByZWFjaGFibGUgb24gYW1kNjQsIHNvIGl0J3MgaXJyZWxldmFudCBmb3IgZnV6emluZyBvbiB0aGlzIGFyY2hpdGVjdHVyZS4gSSd2ZSBkb3VibGUtY2hlY2tlZCB0aGUgZ2l0IGRpZmYganVzdCB0byBiZSBjb21wbGV0ZWx5IHN1cmU7IGV2ZXJ5IHNpbmdsZSBmaWxlIHJlc2lkZXMgdW5kZXIgdGhlIGBhcmNoL3Jpc2N2L2AgZGlyZWN0b3J5LlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGZhbGxzIHNxdWFyZWx5IHVuZGVyIHRoZSBcInVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoc1wiIGNyaXRlcmlhLiAgU3BlY2lmaWNhbGx5LCBpdCdzIGNvZGUgZXhjbHVzaXZlIHRvIGEgZGlmZmVyZW50IGFyY2hpdGVjdHVyZSwgd2hpY2ggaXMgdGhlIG5lZ2F0aXZlIGNyaXRlcmlvbi4gVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGlzbid0IHdvcnRoIGZ1enppbmcgb24gYW1kNjQuXG5cbkJhc2VkIG9uIHRoYXQsIEkgY2FuIGRlZmluaXRpdmVseSBzZXQgYFdvcnRoRnV6emluZ2AgdG8gYGZhbHNlYC4gU2luY2UgdGhpcyBpcyB1bnJlYWNoYWJsZSwgbm8gc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgb3Igc3ltYm9scyBhcmUgcmVsZXZhbnQuIFRodXMsIGBFbmFibGVDb25maWdzYCBhbmQgYEZvY3VzU3ltYm9sc2Agd2lsbCBiZSBlbXB0eSBsaXN0cy4gQW5kIG15IHJlYXNvbmluZyB3aWxsIGJlIGNvbmNpc2U6IFwiQWxsIGNoYW5nZXMgYXJlIGNvbmZpbmVkIHRvIGBhcmNoL3Jpc2N2L2AgKFJJU0MtViBLVk0gaW1wbGVtZW50YXRpb24pLCB3aGljaCBpcyBleGNsdXNpdmUgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUuIFNpbmNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgYW5kIGNhbm5vdCBiZSBmdXp6ZWQuXCIgIEkganVzdCB2ZXJpZmllZCB0aGUgZmllbGRzIGZyb20gdGhlIHNldC1yZXN1bHRzIHdpdGggYEVuYWJsZUNvbmZpZ3M6IFtdYCwgYEZvY3VzU3ltYm9sczogW11gLCBgUmVhc29uaW5nOiBcIkFsbCBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byBhcmNoL3Jpc2N2LyAoUklTQy1WIEtWTSBpbXBsZW1lbnRhdGlvbiksIHdoaWNoIGlzIGV4Y2x1c2l2ZSB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZS4gU2luY2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBhbmQgY2Fubm90IGJlIGZ1enplZC5cImAgYW5kIGBXb3J0aEZ1enppbmc6IGZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIzMTEsIk91dHB1dFRva2VucyI6NzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4ODAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNjoyMDo1OS45MzkyNTgxMTNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwNzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiQWxsIG1vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGFyY2gvcmlzY3YvIChSSVNDLVYgS1ZNIHN1YnN5c3RlbSkuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGV4Y2x1c2l2ZSB0byBSSVNDLVYgYW5kIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiQWxsIG1vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGFyY2gvcmlzY3YvIChSSVNDLVYgS1ZNIHN1YnN5c3RlbSkuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGV4Y2x1c2l2ZSB0byBSSVNDLVYgYW5kIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE2OjIwOjU5LjkzOTI4Mzk1M1oiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflowbvbzv[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-11 16:01:44 +0000 UTC FinishedAt: 2026-09-11 16:21:02 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE2OjIwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpZWQgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gYXJjaC9yaXNjdi8gKFJJU0MtViBLVk0gc3Vic3lzdGVtKS4gQmVjYXVzZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhlc2UgY29kZSBwYXRocyBhcmUgZXhjbHVzaXZlIHRvIFJJU0MtViBhbmQgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIG9uIGFtZDY0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNjoyMDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGRhZTYyMTg3OGVkZjc3MmNkODViMDhlZTFlZmZhNTAxMzQ4YzNjNTVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxNjoyMDo0MiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5pbmRleCBhYWYwODBiYTFiNzdhLi5jNjFhMWJiYjI3MmY0IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG5AQCAtOCw3ICYjNDM7OCw3IEBAXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFx1MDAzZVxuLVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0cnVjdCBrdm1fZ3N0YWdlIHtcbiBcdHN0cnVjdCBrdm0gKmt2bTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG5AQCAtMTA4LDcgJiM0MzsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKlxuIHtcbiBcdGdzdGFnZS1cdTAwM2Vrdm0gPSBrdm07XG4gXHRnc3RhZ2UtXHUwMDNlZmxhZ3MgPSAwO1xuLVx0Z3N0YWdlLVx1MDAzZXZtaWQgPSBSRUFEX09OQ0Uoa3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHRnc3RhZ2UtXHUwMDNldm1pZCA9XG4mIzQzO1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGdzdGFnZS1cdTAwM2VwZ2QgPSBrdm0tXHUwMDNlYXJjaC5wZ2Q7XG4gXHRnc3RhZ2UtXHUwMDNlcGdkX2xldmVscyA9IGt2bS1cdTAwM2VhcmNoLnBnZF9sZXZlbHM7XG4gfVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmhcbmluZGV4IDU0MzllNzZmMGE5NjAuLmFhZTliOGFjMDg3OGYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmhcbkBAIC0xNiw2ICYjNDM7MTYsNyBAQCBpbnQga3ZtX3Jpc2N2X21tdV9tYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90LFxuIFx0XHQgICAgICBzdHJ1Y3Qga3ZtX2dzdGFnZV9tYXBwaW5nICpvdXRfbWFwKTtcbiBpbnQga3ZtX3Jpc2N2X21tdV9hbGxvY19wZ2Qoc3RydWN0IGt2bSAqa3ZtKTtcbiB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKTtcbiYjNDM7dm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpO1xuIHZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTtcbiBcbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuQEAgLTYsMjEgJiM0Mzs2LDQyIEBAXG4gI2lmbmRlZiBfX1JJU0NWX0tWTV9WTUlEX0hfXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9WTUlEX0hfXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2F0b21pYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgva3ZtX3R5cGVzLmhcdTAwM2VcbiBcbiBzdHJ1Y3Qga3ZtX3ZtaWQge1xuIFx0Lypcbi1cdCAqIFdyaXRlcyB0byB2bWlkX3ZlcnNpb24gYW5kIHZtaWQgaGFwcGVuIHdpdGggdm1pZF9sb2NrIGhlbGRcbi1cdCAqIHdoZXJlYXMgcmVhZHMgaGFwcGVuIHdpdGhvdXQgYW55IGxvY2sgaGVsZC5cbiYjNDM7XHQgKiBTb2Z0d2FyZSBWTUlEOlxuJiM0MztcdCAqXG4mIzQzO1x0ICogICBbIGdlbmVyYXRpb24gfCBoYXJkd2FyZSBWTUlEIF1cbiYjNDM7XHQgKlxuJiM0MztcdCAqIEtlZXAgdGhlIGlkZW50aXR5IDY0LWJpdCBvbiBSVjMyIHNvIHRoYXQgdGhlIGdlbmVyYXRpb24gZG9lcyBub3RcbiYjNDM7XHQgKiB3cmFwIGF0IHRoZSBuYXRpdmUgd29yZCBzaXplLiAgWmVybyBkZW5vdGVzIGFuIHVuYWxsb2NhdGVkIFZNSUQuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBPbmx5IHRoZSBsb3cgaGFyZHdhcmUgVk1JRCBiaXRzIG1heSBiZSB3cml0dGVuIHRvIEhHQVRQXG4mIzQzO1x0ICogb3IgdXNlZCBhcyBhIGhhcmR3YXJlIGZlbmNlIFZNSUQuXG4gXHQgKi9cbi1cdHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uO1xuLVx0dW5zaWduZWQgbG9uZyB2bWlkO1xuJiM0MztcdGF0b21pYzY0X3QgaWQ7XG4gfTtcbiBcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCk7XG4mIzQzO1xuJiM0MztpbnQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KHZvaWQpO1xuJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpO1xuJiM0MztcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKTtcbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpO1xuJiM0MztcbiBib29sIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZChzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQpO1xuJiM0MztcbiB2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTtcbiBcbiYjNDM7LypcbiYjNDM7ICogSW52YWxpZGF0ZSB0aGUgY3VycmVudCBDUFUmIzM5O3MgZmFzdC1wYXRoIFZNSUQgc3RhdGUgd2hpbGUgcHJlc2VydmluZ1xuJiM0MzsgKiB0aGUgb2xkIGlkZW50aXR5IGNvbnNlcnZhdGl2ZWx5IGluIHJlc2VydmVkX3ZtaWRzLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZCk7XG4mIzQzO1xuICNlbmRpZlxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuaW5kZXggODk1NjhjY2NlMDFkZS4uZDZjNmJlNGRmNjFiMSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG5AQCAtMTYsNyAmIzQzOzE2LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX25hY2wuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9zYmkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdmNwdV92ZWN0b3IuaFx1MDAzZVxuLVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCBrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCk7XG4gXG4gREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa3ZtX3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSk7XG5AQCAtODQsNiAmIzQzOzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcbiBcbiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXG4ge1xuJiM0MztcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpO1xuIFx0a3ZtX3Jpc2N2X2FpYV9kaXNhYmxlKCk7XG4gXHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcbiBcdGt2bV9yaXNjdl9uYWNsX2Rpc2FibGUoKTtcbkBAIC0xMTIsNiAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3Jpc2N2X2NwdV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmdcbiBcdFx0ICogaXMgZW5hYmxlZCBvbiB0aGlzIENQVS5cbiBcdFx0ICovXG4gXHRcdGlmIChfX3RoaXNfY3B1X3JlYWQoa3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpKSB7XG4mIzQzO1x0XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpO1xuIFx0XHRcdGt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTtcbiBcdFx0XHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcbiBcdFx0fVxuQEAgLTEzMCw2ICYjNDM7MTMyLDcgQEAgc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrdm1fcmlzY3ZfY3B1X3BtX25iID0ge1xuIHN0YXRpYyB2b2lkIGt2bV9yaXNjdl90ZWFyZG93bih2b2lkKVxuIHtcbiBcdGt2bV9yaXNjdl9haWFfZXhpdCgpO1xuJiM0MztcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XG4gXHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XG4gXHRrdm1fcmlzY3Zfdl9leGl0KCk7XG4gXHRrdm1fdW5yZWdpc3Rlcl9wZXJmX2NhbGxiYWNrcygpO1xuQEAgLTE4MSw4ICYjNDM7MTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpXG4gXG4gXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7XG4gXG4mIzQzO1x0cmMgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCgpO1xuJiM0MztcdGlmIChyYykge1xuJiM0MztcdFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuJiM0MztcdFx0cmV0dXJuIHJjO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpO1xuIFx0aWYgKHJjIFx1MDAyNlx1MDAyNiByYyAhPSAtRU5PREVWKSB7XG4mIzQzO1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpO1xuIFx0XHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XG4gXHRcdHJldHVybiByYztcbiBcdH1cbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS9tbXUuYyBiL2FyY2gvcmlzY3Yva3ZtL21tdS5jXG5pbmRleCA2MDM1YjVlYzk1MDM5Li45YjU5NzA5MmY4ZWM2IDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vbW11LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL21tdS5jXG5AQCAtMTUsNyAmIzQzOzE1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbW11LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX25hY2wuaFx1MDAzZVxuLVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgZWFnZXJfcGFnZV9zcGxpdCA9IHRydWU7XG4gbW9kdWxlX3BhcmFtKGVhZ2VyX3BhZ2Vfc3BsaXQsIGJvb2wsIDA2NDQpO1xuIFxuQEAgLTc5NiwxNiAmIzQzOzc5NiwyMyBAQCB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKVxuIFx0a3ZtX21tdV9mcmVlX21lbW9yeV9jYWNoZShcdTAwMjZrdm0tXHUwMDNlYXJjaC5wZ2Rfc3BsaXRfcGFnZV9jYWNoZSk7XG4gfVxuIFxuLXZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuJiM0Mzt2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgdm1pZClcbiB7XG4gXHRzdHJ1Y3Qga3ZtX2FyY2ggKmthID0gXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaDtcbiBcdHVuc2lnbmVkIGxvbmcgaGdhdHAgPSBrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa2EtXHUwMDNlcGdkX2xldmVscylcbiBcdFx0XHQgICAgICBcdTAwM2NcdTAwM2MgSEdBVFBfTU9ERV9TSElGVDtcbiBcbi1cdGhnYXRwIHw9IChSRUFEX09OQ0Uoa2EtXHUwMDNldm1pZC52bWlkKSBcdTAwM2NcdTAwM2MgSEdBVFBfVk1JRF9TSElGVCkgXHUwMDI2IEhHQVRQX1ZNSUQ7XG4mIzQzO1x0aGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpIFx1MDAzY1x1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcdTAwMjYgSEdBVFBfVk1JRDtcbiBcdGhnYXRwIHw9IChrYS1cdTAwM2VwZ2RfcGh5cyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IEhHQVRQX1BQTjtcbiBcbiBcdG5jc3Jfd3JpdGUoQ1NSX0hHQVRQLCBoZ2F0cCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuJiM0Mzt7XG4mIzQzO1x0dTY0IHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCk7XG4mIzQzO1xuJiM0MztcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XG4gXG4gXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKCkpXG4gXHRcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS90bGIuYyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG5pbmRleCAyYWUzNDYzMmNkY2IxLi5iODVlNWJhMjE5OGFhIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdGxiLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXG5AQCAtMjI0LDcgJiM0MzsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0ICogZW50cmllcyBieSBWTUlEIHdoZW5ldmVyIHVuZGVybHlpbmcgSG9zdCBDUFUgY2hhbmdlcyBmb3IgYSBWQ1BVLlxuIFx0ICovXG4gXG4tXHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcbiBcbiBcdC8qXG5AQCAtMjQ0LDcgJiM0MzsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xuQEAgLTI1NSw3ICYjNDM7MjU1LDcgQEAgdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnYtXHUwMDNlaWQpKTtcbiBcbiBcdGlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSlcbiBcdFx0bmFjbF9oZmVuY2VfdnZtYV9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcbkBAIC01MzEsOCAmIzQzOzUzMSwxMSBAQCB2b2lkIGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwoc3RydWN0IGt2bSAqa3ZtLFxuIFxuIGludCBrdm1fYXJjaF9mbHVzaF9yZW1vdGVfdGxic19yYW5nZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgdTY0IG5yX3BhZ2VzKVxuIHtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtaWQgPVxuJiM0MztcdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4mIzQzO1xuIFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcbiBcdFx0XHRcdCAgICAgICBnZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsIG5yX3BhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULFxuLVx0XHRcdFx0ICAgICAgIFBBR0VfU0hJRlQsIFJFQURfT05DRShrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcbiYjNDM7XHRcdFx0XHQgICAgICAgUEFHRV9TSElGVCwgdm1pZCk7XG4gXHRyZXR1cm4gMDtcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbkBAIC05NDMsMTQgJiM0Mzs5NDMsMTQgQEAgaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0cmV0ID0gMTtcbiBcbi1cdFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTtcbi1cbiBcdFx0cmV0ID0ga3ZtX3Jpc2N2X2NoZWNrX3ZjcHVfcmVxdWVzdHModmNwdSk7XG4gXHRcdGlmIChyZXQgXHUwMDNjPSAwKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRwcmVlbXB0X2Rpc2FibGUoKTtcbiBcbiYjNDM7XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XG4mIzQzO1xuIFx0XHQvKiBVcGRhdGUgQUlBIEhXIHN0YXRlIGJlZm9yZSBlbnRlcmluZyBndWVzdCAqL1xuIFx0XHRyZXQgPSBrdm1fcmlzY3ZfdmNwdV9haWFfdXBkYXRlKHZjcHUpO1xuIFx0XHRpZiAocmV0IFx1MDAzYz0gMCkge1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuaW5kZXggNTA2YTUxMGI2YmZmMy4uMWJlMzg2YTc4ZTI3ZiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG5AQCAtMTA0LDcgJiM0MzsxMDQsNyBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3JmZW5jZV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1blxuIFx0XHRrdm1fcmlzY3ZfdmNwdV9wbXVfaW5jcl9mdyh2Y3B1LCBTQklfUE1VX0ZXX0ZFTkNFX0lfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQTpcbi1cdFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4mIzQzO1x0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0aWYgKChjcC1cdTAwM2VhMiA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMyA9PSAwKSB8fCBjcC1cdTAwM2VhMyA9PSAtMVVMKVxuIFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdGVsc2VcbkBAIC0xMTMsNyAmIzQzOzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuXG4gXHRcdGt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfSEZFTkNFX1ZWTUFfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQV9BU0lEOlxuLVx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbiYjNDM7XHRcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0XHRpZiAoKGNwLVx1MDAzZWEyID09IDAgXHUwMDI2XHUwMDI2IGNwLVx1MDAzZWEzID09IDApIHx8IGNwLVx1MDAzZWEzID09IC0xVUwpXG4gXHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXG4gXHRcdFx0XHRcdFx0ICAgICAgIGNwLVx1MDAzZWE0LCB2bWlkKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG5pbmRleCBkZTU0NGVhM2YyOGRjLi5jYTNlZmU2M2MxY2YxIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXG5AQCAtODgsMTQgJiM0Mzs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcbiBcdFx0aWYgKGNwLVx1MDAzZWE3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9GRU5DRV9JKVxuIFx0XHRcdGt2bV9yaXNjdl9mZW5jZV9pKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xuIFx0XHRlbHNlIGlmIChjcC1cdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfU0ZFTkNFX1ZNQSkge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuJiM0MztcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdFx0ZWxzZVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCBjcC1cdTAwM2VhMSxcbiBcdFx0XHRcdFx0XHRcdCAgY3AtXHUwMDNlYTIsIFBBR0VfU0hJRlQsIHZtaWQpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuJiM0MztcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLFxuIFx0XHRcdFx0XHRcdFx0ICAgICAgIGNwLVx1MDAzZWEzLCB2bWlkKTtcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmMgYi9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbmluZGV4IGMxNWJkYjFkZDhiZWYuLmVlZTgzMDZjMTI3MDcgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92bWlkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xuQEAgLTYsMTEgJiM0Mzs2LDE1IEBAXG4gICogICAgIEFudXAgUGF0ZWwgXHUwMDNjYW51cC5wYXRlbEB3ZGMuY29tXHUwMDNlXG4gICovXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdG1hcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVtYXNrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wZXJjcHUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmVlbXB0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc21wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1faG9zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2Nzci5oXHUwMDNlXG5AQCAtMTgsMjYgJiM0MzsyMiw1NCBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdGxiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbiA9IDE7XG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0O1xuJiM0MztzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2JpdHMgX19yb19hZnRlcl9pbml0O1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodm1pZF9sb2NrKTtcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9jdXJfaWR4ID0gMTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHZtaWRfbG9jayk7XG4mIzQzO1xuJiM0MztzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljNjRfdCwgYWN0aXZlX3ZtaWRzKTtcbiYjNDM7c3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzZXJ2ZWRfdm1pZHMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGNwdW1hc2tfdCB0bGJfZmx1c2hfcGVuZGluZztcbiYjNDM7XG4mIzQzOyNkZWZpbmUgVk1JRF9GSVJTVF9WRVJTSU9OXHRCSVRfVUxMKHZtaWRfYml0cylcbiYjNDM7I2RlZmluZSBOVU1fVk1JRFNcdFx0QklUKHZtaWRfYml0cylcbiYjNDM7I2RlZmluZSBWTUlEX0hXX01BU0tcdFx0KFZNSURfRklSU1RfVkVSU0lPTiAtIDEpXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCB2bWlkX2dlbl9tYXRjaCh1NjQgdm1pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhKCh2bWlkIF4gYXRvbWljNjRfcmVhZChcdTAwMjZ2bWlkX2dlbmVyYXRpb24pKSBcdTAwM2VcdTAwM2Ugdm1pZF9iaXRzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZClcbiYjNDM7e1xuJiM0MztcdGlmICghdm1pZF9iaXRzKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcdTAwMjYgVk1JRF9IV19NQVNLKTtcbiYjNDM7fVxuIFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZClcbiB7XG4tXHQvKiBGaWd1cmUtb3V0IG51bWJlciBvZiBWTUlEIGJpdHMgaW4gSFcgKi9cbiYjNDM7XHQvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgVk1JRCBiaXRzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gKi9cbiBcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXHUwMDNjXHUwMDNjXG4tXHRcdFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcbiYjNDM7XHRcdCAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7XG4gXHR2bWlkX2JpdHMgPSBjc3JfcmVhZChDU1JfSEdBVFApO1xuIFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcdTAwMjYgSEdBVFBfVk1JRCkgXHUwMDNlXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XG4gXHR2bWlkX2JpdHMgPSBmbHNfbG9uZyh2bWlkX2JpdHMpO1xuIFx0Y3NyX3dyaXRlKENTUl9IR0FUUCwgMCk7XG4gXG4tXHQvKiBXZSBwb2xsdXRlZCBsb2NhbCBUTEIgc28gZmx1c2ggYWxsIGd1ZXN0IFRMQiAqL1xuJiM0MztcdC8qIEZsdXNoIHRoZSBsb2NhbCBndWVzdCBUTEIgYWZ0ZXIgcHJvYmluZyBIR0FUUC4gKi9cbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcbiBcbi1cdC8qIFdlIGRvbiYjMzk7dCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXG4tXHRpZiAoKDFVTCBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSBcdTAwM2MgbnVtX3Bvc3NpYmxlX2NwdXMoKSlcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFZNSUQgMCBpcyByZXNlcnZlZC4gIER1cmluZyByb2xsb3ZlciBldmVyeSBwb3NzaWJsZSBDUFUgbWF5XG4mIzQzO1x0ICogcmVzZXJ2ZSBvbmUgaGFyZHdhcmUgVk1JRCwgYW5kIHdlIHN0aWxsIG5lZWQgYXQgbGVhc3Qgb25lIFZNSURcbiYjNDM7XHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHZtaWRfYml0cyBcdTAwMjZcdTAwMjYgTlVNX1ZNSURTIC0gMSBcdTAwM2M9IG51bV9wb3NzaWJsZV9jcHVzKCkpXG4gXHRcdHZtaWRfYml0cyA9IDA7XG4gfVxuIFxuQEAgLTQ2LDgwICYjNDM7NzgsMjk1IEBAIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZClcbiBcdHJldHVybiB2bWlkX2JpdHM7XG4gfVxuIFxuJiM0MztpbnQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgY3B1O1xuJiM0MztcbiYjNDM7XHRpZiAoIXZtaWRfYml0cylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHR2bWlkX21hcCA9IGJpdG1hcF96YWxsb2MoTlVNX1ZNSURTLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIXZtaWRfbWFwKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHZtaWRfY3VyX2lkeCA9IDE7XG4mIzQzO1xuJiM0MztcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cbiYjNDM7XHRfX3NldF9iaXQoMCwgdm1pZF9tYXApO1xuJiM0MztcbiYjNDM7XHRhdG9taWM2NF9zZXQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4mIzQzO1x0XHRhdG9taWM2NF9zZXQoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuJiM0MztcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzXG4mIzQzO1x0ICogZmlyc3QgVk1JRCBhY3RpdmF0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGNwdW1hc2tfY29weShcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZywgY3B1X3Bvc3NpYmxlX21hc2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xuJiM0MztcdHZtaWRfbWFwID0gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiBpbnQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2luaXQoc3RydWN0IGt2bSAqa3ZtKVxuIHtcbi1cdC8qIE1hcmsgdGhlIGluaXRpYWwgVk1JRCBhbmQgVk1JRCB2ZXJzaW9uIGludmFsaWQgKi9cbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZF92ZXJzaW9uID0gMDtcbi1cdGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCA9IDA7XG4mIzQzO1x0YXRvbWljNjRfc2V0KFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQsIDApO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZClcbiB7XG4mIzQzO1x0dTY0IGlkO1xuJiM0MztcbiBcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4tXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uKSAhPVxuLVx0XHRcdFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcbiYjNDM7XHRpZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZC1cdTAwM2VpZCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcbiYjNDM7LypcbiYjNDM7ICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW5cbiYjNDM7ICogYWR2YW5jZWQuXG4mIzQzOyAqXG4mIzQzOyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSURcbiYjNDM7ICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxuJiM0MzsgKiB0aGF0IENQVSYjMzk7cyBuZXh0IFZNSUQgYWN0aXZhdGlvbi5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZClcbiB7XG4tXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4mIzQzO1x0dTY0IHZtaWQ7XG4mIzQzO1x0aW50IGNwdTtcbiYjNDM7XG4mIzQzO1x0Yml0bWFwX3plcm8odm1pZF9tYXAsIE5VTV9WTUlEUyk7XG4mIzQzO1x0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuJiM0MztcdFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXHUwMDI2cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGUgQ1BVIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYXVnaHQgYnkgYW4gZWFybGllciByb2xsb3ZlclxuJiM0MztcdFx0ICogd2l0aG91dCBwZXJmb3JtaW5nIGFub3RoZXIgYWN0aXZhdGlvbiBzaW5jZSB0aGVuLiAgSW4gdGhhdFxuJiM0MztcdFx0ICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIXZtaWQpXG4mIzQzO1x0XHRcdHZtaWQgPSBwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpO1xuJiM0MztcbiYjNDM7XHRcdGlmICh2bWlkKVxuJiM0MztcdFx0XHRfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksXG4mIzQzO1x0XHRcdFx0ICB2bWlkX21hcCk7XG4mIzQzO1xuJiM0MztcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjcHVtYXNrX2NvcHkoXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcbiB9XG4gXG4tdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiYjNDM7LypcbiYjNDM7ICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXG4mIzQzOyAqXG4mIzQzOyAqIERvIG5vdCBzdG9wIGFmdGVyIHRoZSBmaXJzdCBtYXRjaDogdGhlIHNhbWUgVk0gbWF5IGhhdmUgYmVlbiBhY3RpdmVcbiYjNDM7ICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHU2NCBvbGRfdm1pZCwgdTY0IG5ld192bWlkKVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cdHN0cnVjdCBrdm1fdmNwdSAqdjtcbi1cdHN0cnVjdCBrdm1fdm1pZCAqdm1pZCA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbiYjNDM7XHRib29sIGhpdCA9IGZhbHNlO1xuJiM0MztcdGludCBjcHU7XG4gXG4tXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSlcbi1cdFx0cmV0dXJuO1xuJiM0MztcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbiYjNDM7XHRcdGlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7XG4mIzQzO1x0XHRcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSBuZXdfdm1pZDtcbiYjNDM7XHRcdFx0aGl0ID0gdHJ1ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBoaXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEFsbG9jYXRlL3Byb21vdGUgYSBzb2Z0d2FyZSBWTUlELlxuJiM0MzsgKlxuJiM0MzsgKiB2bWlkX2xvY2sgbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdTY0IG5ld192bWlkX2xvY2tlZChzdHJ1Y3Qga3ZtX3ZtaWQgKmt2bV92bWlkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNmt2bV92bWlkLVx1MDAzZWlkKTtcbiYjNDM7XHR1NjQgZ2VuZXJhdGlvbiA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZF9nZW5lcmF0aW9uKTtcbiYjNDM7XHR1NjQgbmV3X3ZtaWQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpZHg7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2dm1pZF9sb2NrKTtcbiYjNDM7XHRpZiAodm1pZCkge1xuJiM0MztcdFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcbiYjNDM7XHRcdFx0ICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBvbGQgVk1JRCBpcyBzdGlsbCBwcm90ZWN0ZWQgYnkgb25lIG9yIG1vcmUgQ1BVcy5cbiYjNDM7XHRcdCAqIEtlZXAgdGhlIHNhbWUgaGFyZHdhcmUgVk1JRCBhbmQgb25seSBwcm9tb3RlIGdlbmVyYXRpb24uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh2bWlkLCBuZXdfdm1pZCkpXG4mIzQzO1x0XHRcdHJldHVybiBuZXdfdm1pZDtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lXG4mIzQzO1x0XHQgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XG4mIzQzO1x0XHRpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSlcbiYjNDM7XHRcdFx0cmV0dXJuIG5ld192bWlkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGaW5kIGEgZnJlZSBWTUlEIGluIHRoZSBjdXJyZW50IGdlbmVyYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7XG4mIzQzO1x0aWYgKGlkeCAhPSBOVU1fVk1JRFMpXG4mIzQzO1x0XHRnb3RvIHNldF92bWlkO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcbiYjNDM7XHQgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJiMzOTtzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0Z2VuZXJhdGlvbiAmIzQzOz0gVk1JRF9GSVJTVF9WRVJTSU9OO1xuJiM0MztcbiYjNDM7XHQvKiBTb2Z0d2FyZSBWTUlEIDAgaXMgcmVzZXJ2ZWQgYXMgdGhlIGludmFsaWQgaWRlbnRpZmllci4gKi9cbiYjNDM7XHRpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKVxuJiM0MztcdFx0Z2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjtcbiYjNDM7XG4mIzQzO1x0YXRvbWljNjRfeGNoZyhcdTAwMjZ2bWlkX2dlbmVyYXRpb24sIGdlbmVyYXRpb24pO1xuJiM0MztcdGZsdXNoX2NvbnRleHQoKTtcbiBcbiBcdC8qXG4tXHQgKiBXZSBuZWVkIHRvIHJlLWNoZWNrIHRoZSB2bWlkX3ZlcnNpb24gaGVyZSB0byBlbnN1cmUgdGhhdCBpZlxuLVx0ICogYW5vdGhlciB2Y3B1IGFscmVhZHkgYWxsb2NhdGVkIGEgdmFsaWQgdm1pZCBmb3IgdGhpcyB2bS5cbiYjNDM7XHQgKiBOVU1fVk1JRFMgLSAxIFx1MDAzZSBudW1fcG9zc2libGVfY3B1cygpLCB0aGVyZWZvcmUgcm9sbG92ZXIgbXVzdFxuJiM0MztcdCAqIGxlYXZlIGF0IGxlYXN0IG9uZSBhbGxvY2F0YWJsZSBoYXJkd2FyZSBWTUlELlxuIFx0ICovXG4tXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZ2bWlkX2xvY2spO1xuJiM0MztcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCAxKTtcbiYjNDM7XG4mIzQzO3NldF92bWlkOlxuJiM0MztcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcbiYjNDM7XHR2bWlkX2N1cl9pZHggPSBpZHg7XG4mIzQzO1xuJiM0MztcdHJldHVybiBnZW5lcmF0aW9uIHwgaWR4O1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGt2bV92bWlkICprdm1fdm1pZCA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbiYjNDM7XHRhdG9taWM2NF90ICphY3RpdmU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBmbGFncztcbiYjNDM7XHR1NjQgdm1pZDtcbiYjNDM7XHR1NjQgb2xkX2FjdGl2ZV92bWlkO1xuJiM0MztcdHVuc2lnbmVkIGludCBjcHU7XG4mIzQzO1xuJiM0MztcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm47XG4tXHR9XG4gXG4tXHQvKiBGaXJzdCB1c2VyIG9mIGEgbmV3IFZNSUQgdmVyc2lvbj8gKi9cbi1cdGlmICh1bmxpa2VseSh2bWlkX25leHQgPT0gMCkpIHtcbi1cdFx0V1JJVEVfT05DRSh2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pICYjNDM7IDEpO1xuLVx0XHR2bWlkX25leHQgPSAxO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogYWN0aXZlX3ZtaWRzIGFuZCB0bGJfZmx1c2hfcGVuZGluZyBhcmUgcGVyLUNQVSBzdGF0ZS4gIEtlZXAgdGhlXG4mIzQzO1x0ICogY29tcGxldGUgVk1JRCBhY3RpdmF0aW9uIG9uIHRoZSBzYW1lIENQVS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRsb2NrZGVwX2Fzc2VydF9wcmVlbXB0aW9uX2Rpc2FibGVkKCk7XG4mIzQzO1xuJiM0MztcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcbiYjNDM7XHRhY3RpdmUgPSB0aGlzX2NwdV9wdHIoXHUwMDI2YWN0aXZlX3ZtaWRzKTtcbiYjNDM7XG4mIzQzO1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuJiM0MztcdG9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZhc3QgcGF0aC5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIFRoZSBjbXB4Y2hnIHJhY2VzIHdpdGggZmx1c2hfY29udGV4dCgpJiMzOTtzIHhjaGcgb24gdGhlIHNhbWVcbiYjNDM7XHQgKiBwZXItQ1BVIGF0b21pYy4gIEVpdGhlciB0aGlzIGFjdGl2YXRpb24gaXMgY2FwdHVyZWQgYnkgcm9sbG92ZXIsXG4mIzQzO1x0ICogb3Igcm9sbG92ZXIgY2xlYXJzIGFjdGl2ZSBmaXJzdCBhbmQgdGhlIGNtcHhjaGcgZmFpbHMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKG9sZF9hY3RpdmVfdm1pZCBcdTAwMjZcdTAwMjYgdm1pZF9nZW5fbWF0Y2godm1pZCkpIHtcbiBcdFx0Lypcbi1cdFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxuLVx0XHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxuLVx0XHQgKlxuLVx0XHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3Rcbi1cdFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxuLVx0XHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XG4tXHRcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxuLVx0XHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXG4tXHRcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XG4tXHRcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxuLVx0XHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cbiYjNDM7XHRcdCAqIEhHQVRQIG11c3QgY29udGFpbiB0aGUgc2FtZSBoYXJkd2FyZSBWTUlEIHRoYXQgaXMgcHVibGlzaGVkXG4mIzQzO1x0XHQgKiBpbiBhY3RpdmVfdm1pZHMuXG4gXHRcdCAqL1xuLVx0XHRvbl9lYWNoX2NwdV9tYXNrKGNwdV9vbmxpbmVfbWFzaywgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwsXG4tXHRcdFx0XHQgTlVMTCwgMSk7XG4mIzQzO1x0XHRpZiAob2xkX2FjdGl2ZV92bWlkICE9IHZtaWQpXG4mIzQzO1x0XHRcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGF0b21pYzY0X2NtcHhjaGcoYWN0aXZlLCBvbGRfYWN0aXZlX3ZtaWQsIHZtaWQpID09XG4mIzQzO1x0XHQgICAgb2xkX2FjdGl2ZV92bWlkKVxuJiM0MztcdFx0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHR2bWlkLVx1MDAzZXZtaWQgPSB2bWlkX25leHQ7XG4tXHR2bWlkX25leHQmIzQzOyYjNDM7O1xuLVx0dm1pZF9uZXh0IFx1MDAyNj0gKDEgXHUwMDNjXHUwMDNjIHZtaWRfYml0cykgLSAxO1xuJiM0MztcdHJhd19zcGluX2xvY2tfaXJxc2F2ZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiBcbi1cdFdSSVRFX09OQ0Uodm1pZC1cdTAwM2V2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFJlLXJlYWQgdW5kZXIgdGhlIGFsbG9jYXRvciBsb2NrIGJlY2F1c2UgYW5vdGhlciB2Q1BVIG9mIHRoaXMgVk1cbiYjNDM7XHQgKiBtYXkgYWxyZWFkeSBoYXZlIHByb21vdGVkIG9yIGFsbG9jYXRlZCB0aGUgc2hhcmVkIFZNSUQuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXZtaWRfZ2VuX21hdGNoKHZtaWQpKSB7XG4mIzQzO1x0XHR2bWlkID0gbmV3X3ZtaWRfbG9ja2VkKGt2bV92bWlkKTtcbiYjNDM7XHRcdGF0b21pYzY0X3NldChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCwgdm1pZCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENvbXBsZXRlIHRoaXMgQ1BVJiMzOTtzIGRlZmVycmVkIHJvbGxvdmVyIGludmFsaWRhdGlvbiBiZWZvcmVcbiYjNDM7XHQgKiBpbnN0YWxsaW5nIHRoZSBuZXcgaGFyZHdhcmUgVk1JRC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoY3B1LCBcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZykpXG4mIzQzO1x0XHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogSW5zdGFsbCB0aGUgY3VycmVudCBoYXJkd2FyZSBWTUlEIGJlZm9yZSBwdWJsaXNoaW5nIHRoaXMgQ1BVIGFzXG4mIzQzO1x0ICogYWN0aXZlIHdpdGggdGhlIG5ldyBzb2Z0d2FyZSBWTUlELlxuJiM0MztcdCAqL1xuJiM0MztcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogT25jZSBhY3RpdmVfdm1pZHMgaXMgdmlzaWJsZSwgdGhlIHJlcXVpcmVkIGxvY2FsIGludmFsaWRhdGlvbiBhbmRcbiYjNDM7XHQgKiBIR0FUUCB1cGRhdGUgYXJlIGNvbXBsZXRlLlxuJiM0MztcdCAqL1xuJiM0MztcdGF0b21pYzY0X3NldChhY3RpdmUsIHZtaWQpO1xuJiM0MztcbiYjNDM7XHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiYjNDM7fVxuIFxuLVx0c3Bpbl91bmxvY2soXHUwMDI2dm1pZF9sb2NrKTtcbiYjNDM7LypcbiYjNDM7ICogQ1BVIHZpcnR1YWxpemF0aW9uL0NTUiBzdGF0ZSBpcyBiZWluZyBkaXNjYXJkZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0XG4mIzQzOyAqIGlkZW50aXR5IGluc3RlYWQgb2YgbWFraW5nIGl0cyBoYXJkd2FyZSBWTUlEIGltbWVkaWF0ZWx5IHJldXNhYmxlLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG4mIzQzO1x0dTY0IHZtaWQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IGNwdTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF2bWlkX2JpdHMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcbiYjNDM7XG4mIzQzO1x0Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpO1xuJiM0MztcbiYjNDM7XHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4mIzQzO1xuJiM0MztcdHZtaWQgPSBhdG9taWM2NF94Y2hnKHRoaXNfY3B1X3B0cihcdTAwMjZhY3RpdmVfdm1pZHMpLCAwKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHZtaWQpXG4mIzQzO1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gdm1pZDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZiBhY3RpdmUgd2FzIGFscmVhZHkgemVybywgcmV0YWluIHRoZSBvbGQgcmVzZXJ2ZWQgZW50cnkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y3B1bWFza19zZXRfY3B1KGNwdSwgXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcpO1xuIFxuLVx0LyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi9cbi1cdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXHUwMDNla3ZtKVxuLVx0XHRrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVVBEQVRFX0hHQVRQLCB2KTtcbiYjNDM7XHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiB9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTY6MjA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpZWQgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gYXJjaC9yaXNjdi8gKFJJU0MtViBLVk0gc3Vic3lzdGVtKS4gQmVjYXVzZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhlc2UgY29kZSBwYXRocyBhcmUgZXhjbHVzaXZlIHRvIFJJU0MtViBhbmQgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIG9uIGFtZDY0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGRhZTYyMTg3OGVkZjc3MmNkODViMDhlZTFlZmZhNTAxMzQ4YzNjNTUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIFNlcCAxMSAxNjoyMDo0MiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKaW5kZXggYWFmMDgwYmExYjc3YS4uYzYxYTFiYmIyNzJmNCAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmgKQEAgLTgsNyAmIzQzOzgsNyBAQAogI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF8KIAogI2luY2x1ZGUgJmx0O2xpbnV4L2t2bV90eXBlcy5oJmd0OwotCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0Owogc3RydWN0IGt2bV9nc3RhZ2UgewogCXN0cnVjdCBrdm0gKmt2bTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTA4LDcgJiM0MzsxMDgsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3Jpc2N2X2dzdGFnZV9pbml0KHN0cnVjdCBrdm1fZ3N0YWdlICpnc3RhZ2UsIHN0cnVjdCBrdm0gKgogewogCWdzdGFnZS0mZ3Q7a3ZtID0ga3ZtOwogCWdzdGFnZS0mZ3Q7ZmxhZ3MgPSAwOwotCWdzdGFnZS0mZ3Q7dm1pZCA9IFJFQURfT05DRShrdm0tJmd0O2FyY2gudm1pZC52bWlkKTsKJiM0MzsJZ3N0YWdlLSZndDt2bWlkID0KJiM0MzsJCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCWdzdGFnZS0mZ3Q7cGdkID0ga3ZtLSZndDthcmNoLnBnZDsKIAlnc3RhZ2UtJmd0O3BnZF9sZXZlbHMgPSBrdm0tJmd0O2FyY2gucGdkX2xldmVsczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmgKaW5kZXggNTQzOWU3NmYwYTk2MC4uYWFlOWI4YWMwODc4ZiAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmgKQEAgLTE2LDYgJiM0MzsxNiw3IEBAIGludCBrdm1fcmlzY3ZfbW11X21hcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsCiAJCSAgICAgIHN0cnVjdCBrdm1fZ3N0YWdlX21hcHBpbmcgKm91dF9tYXApOwogaW50IGt2bV9yaXNjdl9tbXVfYWxsb2NfcGdkKHN0cnVjdCBrdm0gKmt2bSk7CiB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKTsKJiM0Mzt2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgdm1pZCk7CiB2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oCmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmgKQEAgLTYsMjEgJiM0Mzs2LDQyIEBACiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF8KICNkZWZpbmUgX19SSVNDVl9LVk1fVk1JRF9IXwogCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2F0b21pYy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2t2bV90eXBlcy5oJmd0OwogCiBzdHJ1Y3Qga3ZtX3ZtaWQgewogCS8qCi0JICogV3JpdGVzIHRvIHZtaWRfdmVyc2lvbiBhbmQgdm1pZCBoYXBwZW4gd2l0aCB2bWlkX2xvY2sgaGVsZAotCSAqIHdoZXJlYXMgcmVhZHMgaGFwcGVuIHdpdGhvdXQgYW55IGxvY2sgaGVsZC4KJiM0MzsJICogU29mdHdhcmUgVk1JRDoKJiM0MzsJICoKJiM0MzsJICogICBbIGdlbmVyYXRpb24gfCBoYXJkd2FyZSBWTUlEIF0KJiM0MzsJICoKJiM0MzsJICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdAomIzQzOwkgKiB3cmFwIGF0IHRoZSBuYXRpdmUgd29yZCBzaXplLiAgWmVybyBkZW5vdGVzIGFuIHVuYWxsb2NhdGVkIFZNSUQuCiYjNDM7CSAqCiYjNDM7CSAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFAKJiM0MzsJICogb3IgdXNlZCBhcyBhIGhhcmR3YXJlIGZlbmNlIFZNSUQuCiAJICovCi0JdW5zaWduZWQgbG9uZyB2bWlkX3ZlcnNpb247Ci0JdW5zaWduZWQgbG9uZyB2bWlkOwomIzQzOwlhdG9taWM2NF90IGlkOwogfTsKIAogdm9pZCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCh2b2lkKTsKIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCk7CiYjNDM7CiYjNDM7aW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKTsKJiM0Mzt2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpOwomIzQzOwogaW50IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9pbml0KHN0cnVjdCBrdm0gKmt2bSk7CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZCk7CiYjNDM7CiBib29sIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZChzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQpOwomIzQzOwogdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKJiM0MzsvKgomIzQzOyAqIEludmFsaWRhdGUgdGhlIGN1cnJlbnQgQ1BVJiMzOTtzIGZhc3QtcGF0aCBWTUlEIHN0YXRlIHdoaWxlIHByZXNlcnZpbmcKJiM0MzsgKiB0aGUgb2xkIGlkZW50aXR5IGNvbnNlcnZhdGl2ZWx5IGluIHJlc2VydmVkX3ZtaWRzLgomIzQzOyAqLwomIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpOwomIzQzOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS9tYWluLmMgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmMKaW5kZXggODk1NjhjY2NlMDFkZS4uZDZjNmJlNGRmNjFiMSAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uYwpAQCAtMTYsNyAmIzQzOzE2LDcgQEAKICNpbmNsdWRlICZsdDthc20va3ZtX25hY2wuaCZndDsKICNpbmNsdWRlICZsdDthc20vc2JpLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YXNtL2t2bV92Y3B1X3ZlY3Rvci5oJmd0OwotCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0Owogc3RhdGljIERFRklORV9QRVJfQ1BVKGJvb2wsIGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKTsKIAogREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa3ZtX3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSk7CkBAIC04NCw2ICYjNDM7ODQsNyBAQCBpbnQga3ZtX2FyY2hfZW5hYmxlX3ZpcnR1YWxpemF0aW9uX2NwdSh2b2lkKQogCiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpCiB7CiYjNDM7CWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpOwogCWt2bV9yaXNjdl9haWFfZGlzYWJsZSgpOwogCWt2bV9yaXNjdl9jc3JfY2xlYW51cCgpOwogCWt2bV9yaXNjdl9uYWNsX2Rpc2FibGUoKTsKQEAgLTExMiw2ICYjNDM7MTEzLDcgQEAgc3RhdGljIGludCBrdm1fcmlzY3ZfY3B1X3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZwogCQkgKiBpcyBlbmFibGVkIG9uIHRoaXMgQ1BVLgogCQkgKi8KIAkJaWYgKF9fdGhpc19jcHVfcmVhZChrdm1fcmlzY3ZfdmlydHVhbGl6YXRpb25fZW5hYmxlZCkpIHsKJiM0MzsJCQlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUoKTsKIAkJCWt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTsKIAkJCWt2bV9yaXNjdl9jc3JfY2xlYW51cCgpOwogCQl9CkBAIC0xMzAsNiAmIzQzOzEzMiw3IEBAIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3ZtX3Jpc2N2X2NwdV9wbV9uYiA9IHsKIHN0YXRpYyB2b2lkIGt2bV9yaXNjdl90ZWFyZG93bih2b2lkKQogewogCWt2bV9yaXNjdl9haWFfZXhpdCgpOwomIzQzOwlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpOwogCWt2bV9yaXNjdl9uYWNsX2V4aXQoKTsKIAlrdm1fcmlzY3Zfdl9leGl0KCk7CiAJa3ZtX3VucmVnaXN0ZXJfcGVyZl9jYWxsYmFja3MoKTsKQEAgLTE4MSw4ICYjNDM7MTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpCiAKIAlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7CiAKJiM0MzsJcmMgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCgpOwomIzQzOwlpZiAocmMpIHsKJiM0MzsJCWt2bV9yaXNjdl9uYWNsX2V4aXQoKTsKJiM0MzsJCXJldHVybiByYzsKJiM0MzsJfQomIzQzOwogCXJjID0ga3ZtX3Jpc2N2X2FpYV9pbml0KCk7CiAJaWYgKHJjICZhbXA7JmFtcDsgcmMgIT0gLUVOT0RFVikgewomIzQzOwkJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTsKIAkJa3ZtX3Jpc2N2X25hY2xfZXhpdCgpOwogCQlyZXR1cm4gcmM7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vbW11LmMgYi9hcmNoL3Jpc2N2L2t2bS9tbXUuYwppbmRleCA2MDM1YjVlYzk1MDM5Li45YjU5NzA5MmY4ZWM2IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS9tbXUuYwpAQCAtMTUsNyAmIzQzOzE1LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC9zaWduYWwuaCZndDsKICNpbmNsdWRlICZsdDthc20va3ZtX21tdS5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9rdm1fbmFjbC5oJmd0OwotCiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0Owogc3RhdGljIGJvb2wgX19yZWFkX21vc3RseSBlYWdlcl9wYWdlX3NwbGl0ID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbShlYWdlcl9wYWdlX3NwbGl0LCBib29sLCAwNjQ0KTsKIApAQCAtNzk2LDE2ICYjNDM7Nzk2LDIzIEBAIHZvaWQga3ZtX3Jpc2N2X21tdV9mcmVlX3BnZChzdHJ1Y3Qga3ZtICprdm0pCiAJa3ZtX21tdV9mcmVlX21lbW9yeV9jYWNoZSgmYW1wO2t2bS0mZ3Q7YXJjaC5wZ2Rfc3BsaXRfcGFnZV9jYWNoZSk7CiB9CiAKLXZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQomIzQzO3ZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCB2bWlkKQogewogCXN0cnVjdCBrdm1fYXJjaCAqa2EgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaDsKIAl1bnNpZ25lZCBsb25nIGhnYXRwID0ga3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGthLSZndDtwZ2RfbGV2ZWxzKQogCQkJICAgICAgJmx0OyZsdDsgSEdBVFBfTU9ERV9TSElGVDsKIAotCWhnYXRwIHw9IChSRUFEX09OQ0Uoa2EtJmd0O3ZtaWQudm1pZCkgJmx0OyZsdDsgSEdBVFBfVk1JRF9TSElGVCkgJmFtcDsgSEdBVFBfVk1JRDsKJiM0MzsJaGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpICZsdDsmbHQ7IEhHQVRQX1ZNSURfU0hJRlQpICZhbXA7IEhHQVRQX1ZNSUQ7CiAJaGdhdHAgfD0gKGthLSZndDtwZ2RfcGh5cyAmZ3Q7Jmd0OyBQQUdFX1NISUZUKSAmYW1wOyBIR0FUUF9QUE47CiAKIAluY3NyX3dyaXRlKENTUl9IR0FUUCwgaGdhdHApOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKJiM0Mzt7CiYjNDM7CXU2NCB2bWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLmlkKTsKJiM0MzsKJiM0MzsJa3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTsKIAogCWlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHMoKSkKIAkJa3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdGxiLmMgYi9hcmNoL3Jpc2N2L2t2bS90bGIuYwppbmRleCAyYWUzNDYzMmNkY2IxLi5iODVlNWJhMjE5OGFhIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L2t2bS90bGIuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS90bGIuYwpAQCAtMjI0LDcgJiM0MzsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCSAqIGVudHJpZXMgYnkgVk1JRCB3aGVuZXZlciB1bmRlcmx5aW5nIEhvc3QgQ1BVIGNoYW5nZXMgZm9yIGEgVkNQVS4KIAkgKi8KIAotCXZtaWQgPSBSRUFEX09OQ0UodmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQudm1pZCk7CiYjNDM7CXZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKIAlrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfdm1pZF9hbGwodm1pZCk7CiAKIAkvKgpAQCAtMjQ0LDcgJiM0MzsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCBrdm1fdm1pZCAqdiA9ICZhbXA7dmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQ7Ci0JdW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtJmd0O3ZtaWQpOwomIzQzOwl1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7di0mZ3Q7aWQpKTsKIAogCWlmIChrdm1fcmlzY3ZfbmFjbF9hdmFpbGFibGUoKSkKIAkJbmFjbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbChuYWNsX3NobWVtKCksIHZtaWQpOwpAQCAtMjU1LDcgJiM0MzsyNTUsNyBAQCB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB2b2lkIGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGxfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV92bWlkICp2ID0gJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZDsKLQl1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi0mZ3Q7dm1pZCk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2LSZndDtpZCkpOwogCiAJaWYgKGt2bV9yaXNjdl9uYWNsX2F2YWlsYWJsZSgpKQogCQluYWNsX2hmZW5jZV92dm1hX2FsbChuYWNsX3NobWVtKCksIHZtaWQpOwpAQCAtNTMxLDggJiM0Mzs1MzEsMTEgQEAgdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHN0cnVjdCBrdm0gKmt2bSwKIAogaW50IGt2bV9hcmNoX2ZsdXNoX3JlbW90ZV90bGJzX3JhbmdlKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCB1NjQgbnJfcGFnZXMpCiB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdm1pZCA9CiYjNDM7CQlrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKCZhbXA7a3ZtLSZndDthcmNoLnZtaWQuaWQpKTsKJiM0MzsKIAlrdm1fcmlzY3ZfaGZlbmNlX2d2bWFfdm1pZF9ncGEoa3ZtLCAtMVVMLCAwLAogCQkJCSAgICAgICBnZm4gJmx0OyZsdDsgUEFHRV9TSElGVCwgbnJfcGFnZXMgJmx0OyZsdDsgUEFHRV9TSElGVCwKLQkJCQkgICAgICAgUEFHRV9TSElGVCwgUkVBRF9PTkNFKGt2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpKTsKJiM0MzsJCQkJICAgICAgIFBBR0VfU0hJRlQsIHZtaWQpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jCmluZGV4IGUwNjJjYTE5ZjlkOGYuLjg1NTQyYzFhNWVjM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMKQEAgLTk0MywxNCAmIzQzOzk0MywxNCBAQCBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCQkJY29udGludWU7CiAJCXJldCA9IDE7CiAKLQkJa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTsKLQogCQlyZXQgPSBrdm1fcmlzY3ZfY2hlY2tfdmNwdV9yZXF1ZXN0cyh2Y3B1KTsKIAkJaWYgKHJldCAmbHQ7PSAwKQogCQkJY29udGludWU7CiAKIAkJcHJlZW1wdF9kaXNhYmxlKCk7CiAKJiM0MzsJCWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7CiYjNDM7CiAJCS8qIFVwZGF0ZSBBSUEgSFcgc3RhdGUgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovCiAJCXJldCA9IGt2bV9yaXNjdl92Y3B1X2FpYV91cGRhdGUodmNwdSk7CiAJCWlmIChyZXQgJmx0Oz0gMCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jCmluZGV4IDUwNmE1MTBiNmJmZjMuLjFiZTM4NmE3OGUyN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmMKQEAgLTEwNCw3ICYjNDM7MTA0LDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4KIAkJa3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19GRU5DRV9JX1NFTlQpOwogCQlicmVhazsKIAljYXNlIFNCSV9FWFRfUkZFTkNFX1JFTU9URV9TRkVOQ0VfVk1BOgotCQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwkJdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCQlpZiAoKGNwLSZndDthMiA9PSAwICZhbXA7JmFtcDsgY3AtJmd0O2EzID09IDApIHx8IGNwLSZndDthMyA9PSAtMVVMKQogCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7CiAJCWVsc2UKQEAgLTExMyw3ICYjNDM7MTEzLDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4KIAkJa3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19IRkVOQ0VfVlZNQV9TRU5UKTsKIAkJYnJlYWs7CiAJY2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQV9BU0lEOgotCQl2bWlkID0gUkVBRF9PTkNFKHZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkLnZtaWQpOwomIzQzOwkJdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCQlpZiAoKGNwLSZndDthMiA9PSAwICZhbXA7JmFtcDsgY3AtJmd0O2EzID09IDApIHx8IGNwLSZndDthMyA9PSAtMVVMKQogCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtJmd0O2t2bSwgaGJhc2UsIGhtYXNrLAogCQkJCQkJICAgICAgIGNwLSZndDthNCwgdm1pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jCmluZGV4IGRlNTQ0ZWEzZjI4ZGMuLmNhM2VmZTYzYzFjZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jCkBAIC04OCwxNCAmIzQzOzg4LDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfdjAxX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAogCQlpZiAoY3AtJmd0O2E3ID09IFNCSV9FWFRfMF8xX1JFTU9URV9GRU5DRV9JKQogCQkJa3ZtX3Jpc2N2X2ZlbmNlX2kodmNwdS0mZ3Q7a3ZtLCBoYmFzZSwgaG1hc2spOwogCQllbHNlIGlmIChjcC0mZ3Q7YTcgPT0gU0JJX0VYVF8wXzFfUkVNT1RFX1NGRU5DRV9WTUEpIHsKLQkJCXZtaWQgPSBSRUFEX09OQ0UodmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQudm1pZCk7CiYjNDM7CQkJdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCQkJaWYgKGNwLSZndDthMSA9PSAwICZhbXA7JmFtcDsgY3AtJmd0O2EyID09IDApCiAJCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7CiAJCQllbHNlCiAJCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LSZndDtrdm0sIGhiYXNlLCBobWFzaywgY3AtJmd0O2ExLAogCQkJCQkJCSAgY3AtJmd0O2EyLCBQQUdFX1NISUZULCB2bWlkKTsKIAkJfSBlbHNlIHsKLQkJCXZtaWQgPSBSRUFEX09OQ0UodmNwdS0mZ3Q7a3ZtLSZndDthcmNoLnZtaWQudm1pZCk7CiYjNDM7CQkJdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoJmFtcDt2Y3B1LSZndDtrdm0tJmd0O2FyY2gudm1pZC5pZCkpOwogCQkJaWYgKGNwLSZndDthMSA9PSAwICZhbXA7JmFtcDsgY3AtJmd0O2EyID09IDApCiAJCQkJa3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtJmd0O2t2bSwgaGJhc2UsIGhtYXNrLAogCQkJCQkJCSAgICAgICBjcC0mZ3Q7YTMsIHZtaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jCmluZGV4IGMxNWJkYjFkZDhiZWYuLmVlZTgzMDZjMTI3MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3Jpc2N2L2t2bS92bWlkLmMKQEAgLTYsMTEgJiM0Mzs2LDE1IEBACiAgKiAgICAgQW51cCBQYXRlbCAmbHQ7YW51cC5wYXRlbEB3ZGMuY29tJmd0OwogICovCiAKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYml0bWFwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYml0b3BzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3B1bWFzay5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2Vycm5vLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZXJyLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3BlcmNwdS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wcmVlbXB0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zbXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9rdm1faG9zdC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9jc3IuaCZndDsKQEAgLTE4LDI2ICYjNDM7MjIsNTQgQEAKICNpbmNsdWRlICZsdDthc20va3ZtX3RsYi5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9rdm1fdm1pZC5oJmd0OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX3ZlcnNpb24gPSAxOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0OwomIzQzO3N0YXRpYyBhdG9taWM2NF90IHZtaWRfZ2VuZXJhdGlvbjsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm1pZF9tYXA7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2JpdHMgX19yb19hZnRlcl9pbml0Owotc3RhdGljIERFRklORV9TUElOTE9DSyh2bWlkX2xvY2spOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHZtaWRfY3VyX2lkeCA9IDE7CiYjNDM7CiYjNDM7c3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodm1pZF9sb2NrKTsKJiM0MzsKJiM0MztzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljNjRfdCwgYWN0aXZlX3ZtaWRzKTsKJiM0MztzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNlcnZlZF92bWlkcyk7CiYjNDM7CiYjNDM7c3RhdGljIGNwdW1hc2tfdCB0bGJfZmx1c2hfcGVuZGluZzsKJiM0MzsKJiM0MzsjZGVmaW5lIFZNSURfRklSU1RfVkVSU0lPTglCSVRfVUxMKHZtaWRfYml0cykKJiM0MzsjZGVmaW5lIE5VTV9WTUlEUwkJQklUKHZtaWRfYml0cykKJiM0MzsjZGVmaW5lIFZNSURfSFdfTUFTSwkJKFZNSURfRklSU1RfVkVSU0lPTiAtIDEpCiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgdm1pZF9nZW5fbWF0Y2godTY0IHZtaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gISgodm1pZCBeIGF0b21pYzY0X3JlYWQoJmFtcDt2bWlkX2dlbmVyYXRpb24pKSAmZ3Q7Jmd0OyB2bWlkX2JpdHMpOwomIzQzO30KJiM0MzsKJiM0Mzt1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHU2NCB2bWlkKQomIzQzO3sKJiM0MzsJaWYgKCF2bWlkX2JpdHMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuICh1bnNpZ25lZCBsb25nKSh2bWlkICZhbXA7IFZNSURfSFdfTUFTSyk7CiYjNDM7fQogCiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpCiB7Ci0JLyogRmlndXJlLW91dCBudW1iZXIgb2YgVk1JRCBiaXRzIGluIEhXICovCiYjNDM7CS8qIEZpZ3VyZSBvdXQgdGhlIG51bWJlciBvZiBWTUlEIGJpdHMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlLiAqLwogCWNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgJmx0OyZsdDsKLQkJCSAgICAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7CiYjNDM7CQkgICBIR0FUUF9NT0RFX1NISUZUKSB8IEhHQVRQX1ZNSUQpOwogCXZtaWRfYml0cyA9IGNzcl9yZWFkKENTUl9IR0FUUCk7CiAJdm1pZF9iaXRzID0gKHZtaWRfYml0cyAmYW1wOyBIR0FUUF9WTUlEKSAmZ3Q7Jmd0OyBIR0FUUF9WTUlEX1NISUZUOwogCXZtaWRfYml0cyA9IGZsc19sb25nKHZtaWRfYml0cyk7CiAJY3NyX3dyaXRlKENTUl9IR0FUUCwgMCk7CiAKLQkvKiBXZSBwb2xsdXRlZCBsb2NhbCBUTEIgc28gZmx1c2ggYWxsIGd1ZXN0IFRMQiAqLwomIzQzOwkvKiBGbHVzaCB0aGUgbG9jYWwgZ3Vlc3QgVExCIGFmdGVyIHByb2JpbmcgSEdBVFAuICovCiAJa3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpOwogCi0JLyogV2UgZG9uJiMzOTt0IHVzZSBWTUlEIGJpdHMgaWYgdGhleSBhcmUgbm90IHN1ZmZpY2llbnQgKi8KLQlpZiAoKDFVTCAmbHQ7Jmx0OyB2bWlkX2JpdHMpICZsdDsgbnVtX3Bvc3NpYmxlX2NwdXMoKSkKJiM0MzsJLyoKJiM0MzsJICogVk1JRCAwIGlzIHJlc2VydmVkLiAgRHVyaW5nIHJvbGxvdmVyIGV2ZXJ5IHBvc3NpYmxlIENQVSBtYXkKJiM0MzsJICogcmVzZXJ2ZSBvbmUgaGFyZHdhcmUgVk1JRCwgYW5kIHdlIHN0aWxsIG5lZWQgYXQgbGVhc3Qgb25lIFZNSUQKJiM0MzsJICogYXZhaWxhYmxlIGZvciBhIG5ldyBhbGxvY2F0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWYgKHZtaWRfYml0cyAmYW1wOyZhbXA7IE5VTV9WTUlEUyAtIDEgJmx0Oz0gbnVtX3Bvc3NpYmxlX2NwdXMoKSkKIAkJdm1pZF9iaXRzID0gMDsKIH0KIApAQCAtNDYsODAgJiM0Mzs3OCwyOTUgQEAgdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYml0cyh2b2lkKQogCXJldHVybiB2bWlkX2JpdHM7CiB9CiAKJiM0MztpbnQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgY3B1OwomIzQzOwomIzQzOwlpZiAoIXZtaWRfYml0cykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwl2bWlkX21hcCA9IGJpdG1hcF96YWxsb2MoTlVNX1ZNSURTLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCF2bWlkX21hcCkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwl2bWlkX2N1cl9pZHggPSAxOwomIzQzOwomIzQzOwkvKiBIYXJkd2FyZSBWTUlEIDAgaXMgcmVzZXJ2ZWQuICovCiYjNDM7CV9fc2V0X2JpdCgwLCB2bWlkX21hcCk7CiYjNDM7CiYjNDM7CWF0b21pYzY0X3NldCgmYW1wO3ZtaWRfZ2VuZXJhdGlvbiwgVk1JRF9GSVJTVF9WRVJTSU9OKTsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewomIzQzOwkJYXRvbWljNjRfc2V0KCZhbXA7cGVyX2NwdShhY3RpdmVfdm1pZHMsIGNwdSksIDApOwomIzQzOwkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRXZlcnkgQ1BVIHBlcmZvcm1zIGFuIGluaXRpYWwgbG9jYWwgaW52YWxpZGF0aW9uIGJlZm9yZSBpdHMKJiM0MzsJICogZmlyc3QgVk1JRCBhY3RpdmF0aW9uLgomIzQzOwkgKi8KJiM0MzsJY3B1bWFza19jb3B5KCZhbXA7dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUodm9pZCkKJiM0Mzt7CiYjNDM7CWJpdG1hcF9mcmVlKHZtaWRfbWFwKTsKJiM0MzsJdm1pZF9tYXAgPSBOVUxMOwomIzQzO30KJiM0MzsKIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pCiB7Ci0JLyogTWFyayB0aGUgaW5pdGlhbCBWTUlEIGFuZCBWTUlEIHZlcnNpb24gaW52YWxpZCAqLwotCWt2bS0mZ3Q7YXJjaC52bWlkLnZtaWRfdmVyc2lvbiA9IDA7Ci0Ja3ZtLSZndDthcmNoLnZtaWQudm1pZCA9IDA7CiYjNDM7CWF0b21pYzY0X3NldCgmYW1wO2t2bS0mZ3Q7YXJjaC52bWlkLmlkLCAwKTsKIAogCXJldHVybiAwOwogfQogCiBib29sIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZChzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQpCiB7CiYjNDM7CXU2NCBpZDsKJiM0MzsKIAlpZiAoIXZtaWRfYml0cykKIAkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIHVubGlrZWx5KFJFQURfT05DRSh2bWlkLSZndDt2bWlkX3ZlcnNpb24pICE9Ci0JCQlSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7CiYjNDM7CWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO3ZtaWQtJmd0O2lkKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHVubGlrZWx5KCF2bWlkX2dlbl9tYXRjaChpZCkpOwogfQogCi1zdGF0aWMgdm9pZCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCh2b2lkICppbmZvKQomIzQzOy8qCiYjNDM7ICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4KJiM0MzsgKiBhZHZhbmNlZC4KJiM0MzsgKgomIzQzOyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSUQKJiM0MzsgKiB3aGljaCBtYXkgc3RpbGwgYmUgdXNlZCBieSBhIENQVSBhbmQgcXVldWUgYSBsb2NhbCBpbnZhbGlkYXRpb24gZm9yCiYjNDM7ICogdGhhdCBDUFUmIzM5O3MgbmV4dCBWTUlEIGFjdGl2YXRpb24uCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKQogewotCWt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTsKJiM0MzsJdTY0IHZtaWQ7CiYjNDM7CWludCBjcHU7CiYjNDM7CiYjNDM7CWJpdG1hcF96ZXJvKHZtaWRfbWFwLCBOVU1fVk1JRFMpOwomIzQzOwlfX3NldF9iaXQoMCwgdm1pZF9tYXApOwomIzQzOwomIzQzOwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiYjNDM7CQl2bWlkID0gYXRvbWljNjRfeGNoZygmYW1wO3Blcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGUgQ1BVIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYXVnaHQgYnkgYW4gZWFybGllciByb2xsb3ZlcgomIzQzOwkJICogd2l0aG91dCBwZXJmb3JtaW5nIGFub3RoZXIgYWN0aXZhdGlvbiBzaW5jZSB0aGVuLiAgSW4gdGhhdAomIzQzOwkJICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LgomIzQzOwkJICovCiYjNDM7CQlpZiAoIXZtaWQpCiYjNDM7CQkJdm1pZCA9IHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSk7CiYjNDM7CiYjNDM7CQlpZiAodm1pZCkKJiM0MzsJCQlfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksCiYjNDM7CQkJCSAgdm1pZF9tYXApOwomIzQzOwomIzQzOwkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY3B1bWFza19jb3B5KCZhbXA7dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTsKIH0KIAotdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKJiM0MzsvKgomIzQzOyAqIFVwZGF0ZSBldmVyeSByZXNlcnZlZCBjb3B5IG9mIGFuIG9sZCBzb2Z0d2FyZSBWTUlELgomIzQzOyAqCiYjNDM7ICogRG8gbm90IHN0b3AgYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoOiB0aGUgc2FtZSBWTSBtYXkgaGF2ZSBiZWVuIGFjdGl2ZQomIzQzOyAqIG9uIG1vcmUgdGhhbiBvbmUgQ1BVIHdoZW4gcm9sbG92ZXIgb2NjdXJyZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgY2hlY2tfdXBkYXRlX3Jlc2VydmVkX3ZtaWQodTY0IG9sZF92bWlkLCB1NjQgbmV3X3ZtaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBpOwotCXN0cnVjdCBrdm1fdmNwdSAqdjsKLQlzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkOwomIzQzOwlib29sIGhpdCA9IGZhbHNlOwomIzQzOwlpbnQgY3B1OwogCi0JaWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpCi0JCXJldHVybjsKJiM0MzsJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewomIzQzOwkJaWYgKHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPT0gb2xkX3ZtaWQpIHsKJiM0MzsJCQlwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gbmV3X3ZtaWQ7CiYjNDM7CQkJaGl0ID0gdHJ1ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gaGl0OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEFsbG9jYXRlL3Byb21vdGUgYSBzb2Z0d2FyZSBWTUlELgomIzQzOyAqCiYjNDM7ICogdm1pZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1NjQgbmV3X3ZtaWRfbG9ja2VkKHN0cnVjdCBrdm1fdm1pZCAqa3ZtX3ZtaWQpCiYjNDM7ewomIzQzOwl1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoJmFtcDtrdm1fdm1pZC0mZ3Q7aWQpOwomIzQzOwl1NjQgZ2VuZXJhdGlvbiA9IGF0b21pYzY0X3JlYWQoJmFtcDt2bWlkX2dlbmVyYXRpb24pOwomIzQzOwl1NjQgbmV3X3ZtaWQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaWR4OwogCi0Jc3Bpbl9sb2NrKCZhbXA7dm1pZF9sb2NrKTsKJiM0MzsJaWYgKHZtaWQpIHsKJiM0MzsJCW5ld192bWlkID0gZ2VuZXJhdGlvbiB8CiYjNDM7CQkJICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLgomIzQzOwkJICogS2VlcCB0aGUgc2FtZSBoYXJkd2FyZSBWTUlEIGFuZCBvbmx5IHByb21vdGUgZ2VuZXJhdGlvbi4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSkKJiM0MzsJCQlyZXR1cm4gbmV3X3ZtaWQ7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIFZNIGhhZCBhIFZNSUQgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbi4gIFJldXNlIHRoZSBzYW1lCiYjNDM7CQkgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC4KJiM0MzsJCSAqLwomIzQzOwkJaWR4ID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7CiYjNDM7CQlpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSkKJiM0MzsJCQlyZXR1cm4gbmV3X3ZtaWQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7CiYjNDM7CWlmIChpZHggIT0gTlVNX1ZNSURTKQomIzQzOwkJZ290byBzZXRfdm1pZDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogTm8gZnJlZSBWTUlELiAgU3RhcnQgYSBuZXcgZ2VuZXJhdGlvbiwgcHJlc2VydmUgYWxsIENQVS1sb2NhbAomIzQzOwkgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJiMzOTtzIGZsdXNoIHVudGlsIGl0cyBuZXh0IGFjdGl2YXRpb24uCiYjNDM7CSAqLwomIzQzOwlnZW5lcmF0aW9uICYjNDM7PSBWTUlEX0ZJUlNUX1ZFUlNJT047CiYjNDM7CiYjNDM7CS8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqLwomIzQzOwlpZiAodW5saWtlbHkoIWdlbmVyYXRpb24pKQomIzQzOwkJZ2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjsKJiM0MzsKJiM0MzsJYXRvbWljNjRfeGNoZygmYW1wO3ZtaWRfZ2VuZXJhdGlvbiwgZ2VuZXJhdGlvbik7CiYjNDM7CWZsdXNoX2NvbnRleHQoKTsKIAogCS8qCi0JICogV2UgbmVlZCB0byByZS1jaGVjayB0aGUgdm1pZF92ZXJzaW9uIGhlcmUgdG8gZW5zdXJlIHRoYXQgaWYKLQkgKiBhbm90aGVyIHZjcHUgYWxyZWFkeSBhbGxvY2F0ZWQgYSB2YWxpZCB2bWlkIGZvciB0aGlzIHZtLgomIzQzOwkgKiBOVU1fVk1JRFMgLSAxICZndDsgbnVtX3Bvc3NpYmxlX2NwdXMoKSwgdGhlcmVmb3JlIHJvbGxvdmVyIG11c3QKJiM0MzsJICogbGVhdmUgYXQgbGVhc3Qgb25lIGFsbG9jYXRhYmxlIGhhcmR3YXJlIFZNSUQuCiAJICovCi0JaWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpIHsKLQkJc3Bpbl91bmxvY2soJmFtcDt2bWlkX2xvY2spOwomIzQzOwlpZHggPSBmaW5kX25leHRfemVyb19iaXQodm1pZF9tYXAsIE5VTV9WTUlEUywgMSk7CiYjNDM7CiYjNDM7c2V0X3ZtaWQ6CiYjNDM7CV9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTsKJiM0MzsJdm1pZF9jdXJfaWR4ID0gaWR4OwomIzQzOwomIzQzOwlyZXR1cm4gZ2VuZXJhdGlvbiB8IGlkeDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrdm1fdm1pZCAqa3ZtX3ZtaWQgPSAmYW1wO3ZjcHUtJmd0O2t2bS0mZ3Q7YXJjaC52bWlkOwomIzQzOwlhdG9taWM2NF90ICphY3RpdmU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiYjNDM7CXU2NCB2bWlkOwomIzQzOwl1NjQgb2xkX2FjdGl2ZV92bWlkOwomIzQzOwl1bnNpZ25lZCBpbnQgY3B1OwomIzQzOwomIzQzOwlpZiAoIXZtaWRfYml0cykKIAkJcmV0dXJuOwotCX0KIAotCS8qIEZpcnN0IHVzZXIgb2YgYSBuZXcgVk1JRCB2ZXJzaW9uPyAqLwotCWlmICh1bmxpa2VseSh2bWlkX25leHQgPT0gMCkpIHsKLQkJV1JJVEVfT05DRSh2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pICYjNDM7IDEpOwotCQl2bWlkX25leHQgPSAxOwomIzQzOwkvKgomIzQzOwkgKiBhY3RpdmVfdm1pZHMgYW5kIHRsYl9mbHVzaF9wZW5kaW5nIGFyZSBwZXItQ1BVIHN0YXRlLiAgS2VlcCB0aGUKJiM0MzsJICogY29tcGxldGUgVk1JRCBhY3RpdmF0aW9uIG9uIHRoZSBzYW1lIENQVS4KJiM0MzsJICovCiYjNDM7CWxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTsKJiM0MzsKJiM0MzsJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwomIzQzOwlhY3RpdmUgPSB0aGlzX2NwdV9wdHIoJmFtcDthY3RpdmVfdm1pZHMpOwomIzQzOwomIzQzOwl2bWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO2t2bV92bWlkLSZndDtpZCk7CiYjNDM7CW9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTsKIAomIzQzOwkvKgomIzQzOwkgKiBGYXN0IHBhdGguCiYjNDM7CSAqCiYjNDM7CSAqIFRoZSBjbXB4Y2hnIHJhY2VzIHdpdGggZmx1c2hfY29udGV4dCgpJiMzOTtzIHhjaGcgb24gdGhlIHNhbWUKJiM0MzsJICogcGVyLUNQVSBhdG9taWMuICBFaXRoZXIgdGhpcyBhY3RpdmF0aW9uIGlzIGNhcHR1cmVkIGJ5IHJvbGxvdmVyLAomIzQzOwkgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy4KJiM0MzsJICovCiYjNDM7CWlmIChvbGRfYWN0aXZlX3ZtaWQgJmFtcDsmYW1wOyB2bWlkX2dlbl9tYXRjaCh2bWlkKSkgewogCQkvKgotCQkgKiBXZSByYW4gb3V0IG9mIFZNSURzIHNvIHdlIGluY3JlbWVudCB2bWlkX3ZlcnNpb24gYW5kCi0JCSAqIHN0YXJ0IGFzc2lnbmluZyBWTUlEcyBmcm9tIDEuCi0JCSAqCi0JCSAqIFRoaXMgYWxzbyBtZWFucyBleGlzdGluZyBWTUlEcyBhc3NpZ25tZW50IHRvIGFsbCBHdWVzdAotCQkgKiBpbnN0YW5jZXMgaXMgaW52YWxpZCBhbmQgd2UgaGF2ZSBmb3JjZSBWTUlEIHJlLWFzc2lnbmVtZW50Ci0JCSAqIGZvciBhbGwgR3Vlc3QgaW5zdGFuY2VzLiBUaGUgR3Vlc3QgaW5zdGFuY2VzIHRoYXQgd2VyZSBub3QKLQkJICogcnVubmluZyB3aWxsIGF1dG9tYXRpY2FsbHkgcGljay11cCBuZXcgVk1JRHMgYmVjYXVzZSB3aWxsCi0JCSAqIGNhbGwga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSgpIHdoZW5ldmVyIHRoZXkgZW50ZXIKLQkJICogaW4ta2VybmVsIHJ1biBsb29wLiBGb3IgR3Vlc3QgaW5zdGFuY2VzIHRoYXQgYXJlIGFscmVhZHkKLQkJICogcnVubmluZywgd2UgZm9yY2UgVk0gZXhpdHMgb24gYWxsIGhvc3QgQ1BVcyB1c2luZyBJUEkgYW5kCi0JCSAqIGZsdXNoIGFsbCBHdWVzdCBUTEJzLgomIzQzOwkJICogSEdBVFAgbXVzdCBjb250YWluIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgdGhhdCBpcyBwdWJsaXNoZWQKJiM0MzsJCSAqIGluIGFjdGl2ZV92bWlkcy4KIAkJICovCi0JCW9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCwKLQkJCQkgTlVMTCwgMSk7CiYjNDM7CQlpZiAob2xkX2FjdGl2ZV92bWlkICE9IHZtaWQpCiYjNDM7CQkJa3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTsKJiM0MzsKJiM0MzsJCWlmIChhdG9taWM2NF9jbXB4Y2hnKGFjdGl2ZSwgb2xkX2FjdGl2ZV92bWlkLCB2bWlkKSA9PQomIzQzOwkJICAgIG9sZF9hY3RpdmVfdm1pZCkKJiM0MzsJCQlyZXR1cm47CiAJfQogCi0Jdm1pZC0mZ3Q7dm1pZCA9IHZtaWRfbmV4dDsKLQl2bWlkX25leHQmIzQzOyYjNDM7OwotCXZtaWRfbmV4dCAmYW1wOz0gKDEgJmx0OyZsdDsgdm1pZF9iaXRzKSAtIDE7CiYjNDM7CXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmYW1wO3ZtaWRfbG9jaywgZmxhZ3MpOwogCi0JV1JJVEVfT05DRSh2bWlkLSZndDt2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTsKJiM0MzsJLyoKJiM0MzsJICogUmUtcmVhZCB1bmRlciB0aGUgYWxsb2NhdG9yIGxvY2sgYmVjYXVzZSBhbm90aGVyIHZDUFUgb2YgdGhpcyBWTQomIzQzOwkgKiBtYXkgYWxyZWFkeSBoYXZlIHByb21vdGVkIG9yIGFsbG9jYXRlZCB0aGUgc2hhcmVkIFZNSUQuCiYjNDM7CSAqLwomIzQzOwl2bWlkID0gYXRvbWljNjRfcmVhZCgmYW1wO2t2bV92bWlkLSZndDtpZCk7CiYjNDM7CiYjNDM7CWlmICghdm1pZF9nZW5fbWF0Y2godm1pZCkpIHsKJiM0MzsJCXZtaWQgPSBuZXdfdm1pZF9sb2NrZWQoa3ZtX3ZtaWQpOwomIzQzOwkJYXRvbWljNjRfc2V0KCZhbXA7a3ZtX3ZtaWQtJmd0O2lkLCB2bWlkKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBDb21wbGV0ZSB0aGlzIENQVSYjMzk7cyBkZWZlcnJlZCByb2xsb3ZlciBpbnZhbGlkYXRpb24gYmVmb3JlCiYjNDM7CSAqIGluc3RhbGxpbmcgdGhlIG5ldyBoYXJkd2FyZSBWTUlELgomIzQzOwkgKi8KJiM0MzsJaWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmFtcDt0bGJfZmx1c2hfcGVuZGluZykpCiYjNDM7CQlrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEluc3RhbGwgdGhlIGN1cnJlbnQgaGFyZHdhcmUgVk1JRCBiZWZvcmUgcHVibGlzaGluZyB0aGlzIENQVSBhcwomIzQzOwkgKiBhY3RpdmUgd2l0aCB0aGUgbmV3IHNvZnR3YXJlIFZNSUQuCiYjNDM7CSAqLwomIzQzOwlrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHZjcHUsIHZtaWQpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBPbmNlIGFjdGl2ZV92bWlkcyBpcyB2aXNpYmxlLCB0aGUgcmVxdWlyZWQgbG9jYWwgaW52YWxpZGF0aW9uIGFuZAomIzQzOwkgKiBIR0FUUCB1cGRhdGUgYXJlIGNvbXBsZXRlLgomIzQzOwkgKi8KJiM0MzsJYXRvbWljNjRfc2V0KGFjdGl2ZSwgdm1pZCk7CiYjNDM7CiYjNDM7CXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbXA7dm1pZF9sb2NrLCBmbGFncyk7CiYjNDM7fQogCi0Jc3Bpbl91bmxvY2soJmFtcDt2bWlkX2xvY2spOwomIzQzOy8qCiYjNDM7ICogQ1BVIHZpcnR1YWxpemF0aW9uL0NTUiBzdGF0ZSBpcyBiZWluZyBkaXNjYXJkZWQuCiYjNDM7ICoKJiM0MzsgKiBXaXRoZHJhdyBmYXN0LXBhdGggZWxpZ2liaWxpdHksIGJ1dCBjb25zZXJ2YXRpdmVseSBwcmVzZXJ2ZSB0aGUgbGFzdAomIzQzOyAqIGlkZW50aXR5IGluc3RlYWQgb2YgbWFraW5nIGl0cyBoYXJkd2FyZSBWTUlEIGltbWVkaWF0ZWx5IHJldXNhYmxlLgomIzQzOyAqLwomIzQzO3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGZsYWdzOwomIzQzOwl1NjQgdm1pZDsKJiM0MzsJdW5zaWduZWQgaW50IGNwdTsKJiM0MzsKJiM0MzsJaWYgKCF2bWlkX2JpdHMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTsKJiM0MzsKJiM0MzsJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwomIzQzOwomIzQzOwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmFtcDt2bWlkX2xvY2ssIGZsYWdzKTsKJiM0MzsKJiM0MzsJdm1pZCA9IGF0b21pYzY0X3hjaGcodGhpc19jcHVfcHRyKCZhbXA7YWN0aXZlX3ZtaWRzKSwgMCk7CiYjNDM7CiYjNDM7CWlmICh2bWlkKQomIzQzOwkJcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIElmIGFjdGl2ZSB3YXMgYWxyZWFkeSB6ZXJvLCByZXRhaW4gdGhlIG9sZCByZXNlcnZlZCBlbnRyeS4KJiM0MzsJICovCiYjNDM7CWNwdW1hc2tfc2V0X2NwdShjcHUsICZhbXA7dGxiX2ZsdXNoX3BlbmRpbmcpOwogCi0JLyogUmVxdWVzdCBHLXN0YWdlIHBhZ2UgdGFibGUgdXBkYXRlIGZvciBhbGwgVkNQVXMgKi8KLQlrdm1fZm9yX2VhY2hfdmNwdShpLCB2LCB2Y3B1LSZndDtrdm0pCi0JCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9VUERBVEVfSEdBVFAsIHYpOwomIzQzOwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1wO3ZtaWRfbG9jaywgZmxhZ3MpOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNjoyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjMxMQoJCQkJCQkJb3V0cHV0OiA3OAoJCQkJCQkJdGhvdWdodHM6IDg4MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgU3VpdGFiaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IHRoaXMgcGF0Y2guIEl0JiMzOTtzIHRvdWNoaW5nIGEgYnVuY2ggb2YgZmlsZXMgdW5kZXIgYGFyY2gvcmlzY3YvYCwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gS1ZNIOKAkyBga3ZtX2dzdGFnZS5oYCwgYGt2bV9tbXUuaGAsIGBrdm1fdm1pZC5oYCwgYW5kIHZhcmlvdXMgYC5jYCBmaWxlcyBpbiBga3ZtL2AuICBIYW5nIG9uLCB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGBhbWQ2NGA/ICBSaWdodCwgc28gd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBmdXp6YWJsZSBvbiBhbWQ2NC4KCkxldCYjMzk7cyBxdWlja2x5IHJlZmVyZW5jZSB0aGUgbmVnYXRpdmUgY3JpdGVyaWEuIFRoZSBrZXkgcG9pbnQgaXMgJiMzNDtDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuJiMzNDsgIEFuZCB5ZXAsIHRoZSB0YXJnZXQgaXMgYW1kNjQsIGFuZCAqYWxsKiB0aGUgY2hhbmdlZCBmaWxlcyBhcmUgaW4gYGFyY2gvcmlzY3YvYC4gIFRoaXMgaXMgYSBzbGFtIGR1bmsuICBSSVNDLVYgS1ZNIGNvZGUgaXMgKm5vdCogY29tcGlsZWQgb3IgcmVhY2hhYmxlIG9uIGFtZDY0LCBzbyBpdCYjMzk7cyBpcnJlbGV2YW50IGZvciBmdXp6aW5nIG9uIHRoaXMgYXJjaGl0ZWN0dXJlLiBJJiMzOTt2ZSBkb3VibGUtY2hlY2tlZCB0aGUgZ2l0IGRpZmYganVzdCB0byBiZSBjb21wbGV0ZWx5IHN1cmU7IGV2ZXJ5IHNpbmdsZSBmaWxlIHJlc2lkZXMgdW5kZXIgdGhlIGBhcmNoL3Jpc2N2L2AgZGlyZWN0b3J5LgoKT2theSwgc28gdGhpcyBwYXRjaCBmYWxscyBzcXVhcmVseSB1bmRlciB0aGUgJiMzNDt1bnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHMmIzM0OyBjcml0ZXJpYS4gIFNwZWNpZmljYWxseSwgaXQmIzM5O3MgY29kZSBleGNsdXNpdmUgdG8gYSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlLCB3aGljaCBpcyB0aGUgbmVnYXRpdmUgY3JpdGVyaW9uLiBUaGVyZWZvcmUsIHRoaXMgcGF0Y2ggaXNuJiMzOTt0IHdvcnRoIGZ1enppbmcgb24gYW1kNjQuCgpCYXNlZCBvbiB0aGF0LCBJIGNhbiBkZWZpbml0aXZlbHkgc2V0IGBXb3J0aEZ1enppbmdgIHRvIGBmYWxzZWAuIFNpbmNlIHRoaXMgaXMgdW5yZWFjaGFibGUsIG5vIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIG9yIHN5bWJvbHMgYXJlIHJlbGV2YW50LiBUaHVzLCBgRW5hYmxlQ29uZmlnc2AgYW5kIGBGb2N1c1N5bWJvbHNgIHdpbGwgYmUgZW1wdHkgbGlzdHMuIEFuZCBteSByZWFzb25pbmcgd2lsbCBiZSBjb25jaXNlOiAmIzM0O0FsbCBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byBgYXJjaC9yaXNjdi9gIChSSVNDLVYgS1ZNIGltcGxlbWVudGF0aW9uKSwgd2hpY2ggaXMgZXhjbHVzaXZlIHRvIHRoZSBSSVNDLVYgYXJjaGl0ZWN0dXJlLiBTaW5jZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGFuZCBjYW5ub3QgYmUgZnV6emVkLiYjMzQ7ICBJIGp1c3QgdmVyaWZpZWQgdGhlIGZpZWxkcyBmcm9tIHRoZSBzZXQtcmVzdWx0cyB3aXRoIGBFbmFibGVDb25maWdzOiBbXWAsIGBGb2N1c1N5bWJvbHM6IFtdYCwgYFJlYXNvbmluZzogJiMzNDtBbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gYXJjaC9yaXNjdi8gKFJJU0MtViBLVk0gaW1wbGVtZW50YXRpb24pLCB3aGljaCBpcyBleGNsdXNpdmUgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUuIFNpbmNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgYW5kIGNhbm5vdCBiZSBmdXp6ZWQuJiMzNDtgIGFuZCBgV29ydGhGdXp6aW5nOiBmYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTY6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmllZCBmaWxlcyBhcmUgbG9jYXRlZCBpbiBhcmNoL3Jpc2N2LyAoUklTQy1WIEtWTSBzdWJzeXN0ZW0pLiBCZWNhdXNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGVzZSBjb2RlIHBhdGhzIGFyZSBleGNsdXNpdmUgdG8gUklTQy1WIGFuZCBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmllZCBmaWxlcyBhcmUgbG9jYXRlZCBpbiBhcmNoL3Jpc2N2LyAoUklTQy1WIEtWTSBzdWJzeXN0ZW0pLiBCZWNhdXNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGVzZSBjb2RlIHBhdGhzIGFyZSBleGNsdXNpdmUgdG8gUklTQy1WIGFuZCBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE2OjIwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNjoyMDo0My43MTg4NTg0NzVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjIyMDQzNDEwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiQWxsIG1vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGFyY2gvcmlzY3YvIChSSVNDLVYgS1ZNIHN1YnN5c3RlbSkuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGV4Y2x1c2l2ZSB0byBSSVNDLVYgYW5kIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE2OjIwOjQzLjcxODg2MzQxNVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTU2NDkwMzQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZGFlNjIxODc4ZWRmNzcyY2Q4NWIwOGVlMWVmZmE1MDEzNDhjM2M1NVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIFNlcCAxMSAxNjoyMDo0MiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXFxuaW5kZXggYWFmMDgwYmExYjc3YS4uYzYxYTFiYmIyNzJmNCAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXFxuQEAgLTgsNyArOCw3IEBAXFxuICNkZWZpbmUgX19SSVNDVl9LVk1fR1NUQUdFX0hfXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva3ZtX3R5cGVzLmhcXHUwMDNlXFxuLVxcbisjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV92bWlkLmhcXHUwMDNlXFxuIHN0cnVjdCBrdm1fZ3N0YWdlIHtcXG4gXFx0c3RydWN0IGt2bSAqa3ZtO1xcbiBcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbkBAIC0xMDgsNyArMTA4LDggQEAgc3RhdGljIGlubGluZSB2b2lkIGt2bV9yaXNjdl9nc3RhZ2VfaW5pdChzdHJ1Y3Qga3ZtX2dzdGFnZSAqZ3N0YWdlLCBzdHJ1Y3Qga3ZtICpcXG4ge1xcbiBcXHRnc3RhZ2UtXFx1MDAzZWt2bSA9IGt2bTtcXG4gXFx0Z3N0YWdlLVxcdTAwM2VmbGFncyA9IDA7XFxuLVxcdGdzdGFnZS1cXHUwMDNldm1pZCA9IFJFQURfT05DRShrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0Z3N0YWdlLVxcdTAwM2V2bWlkID1cXG4rXFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcXHUwMDI2a3ZtLVxcdTAwM2VhcmNoLnZtaWQuaWQpKTtcXG4gXFx0Z3N0YWdlLVxcdTAwM2VwZ2QgPSBrdm0tXFx1MDAzZWFyY2gucGdkO1xcbiBcXHRnc3RhZ2UtXFx1MDAzZXBnZF9sZXZlbHMgPSBrdm0tXFx1MDAzZWFyY2gucGdkX2xldmVscztcXG4gfVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oXFxuaW5kZXggNTQzOWU3NmYwYTk2MC4uYWFlOWI4YWMwODc4ZiAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaFxcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oXFxuQEAgLTE2LDYgKzE2LDcgQEAgaW50IGt2bV9yaXNjdl9tbXVfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCxcXG4gXFx0XFx0ICAgICAgc3RydWN0IGt2bV9nc3RhZ2VfbWFwcGluZyAqb3V0X21hcCk7XFxuIGludCBrdm1fcmlzY3ZfbW11X2FsbG9jX3BnZChzdHJ1Y3Qga3ZtICprdm0pO1xcbiB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKTtcXG4rdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpO1xcbiB2b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7XFxuIFxcbiAjZW5kaWZcXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fdm1pZC5oXFxuaW5kZXggZGI2MWIwNTI1YThkMC4uZGRkN2NjMTI1YzNmNiAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcXG5AQCAtNiwyMSArNiw0MiBAQFxcbiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9WTUlEX0hfXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXRvbWljLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFxcdTAwM2VcXG4gXFxuIHN0cnVjdCBrdm1fdm1pZCB7XFxuIFxcdC8qXFxuLVxcdCAqIFdyaXRlcyB0byB2bWlkX3ZlcnNpb24gYW5kIHZtaWQgaGFwcGVuIHdpdGggdm1pZF9sb2NrIGhlbGRcXG4tXFx0ICogd2hlcmVhcyByZWFkcyBoYXBwZW4gd2l0aG91dCBhbnkgbG9jayBoZWxkLlxcbitcXHQgKiBTb2Z0d2FyZSBWTUlEOlxcbitcXHQgKlxcbitcXHQgKiAgIFsgZ2VuZXJhdGlvbiB8IGhhcmR3YXJlIFZNSUQgXVxcbitcXHQgKlxcbitcXHQgKiBLZWVwIHRoZSBpZGVudGl0eSA2NC1iaXQgb24gUlYzMiBzbyB0aGF0IHRoZSBnZW5lcmF0aW9uIGRvZXMgbm90XFxuK1xcdCAqIHdyYXAgYXQgdGhlIG5hdGl2ZSB3b3JkIHNpemUuICBaZXJvIGRlbm90ZXMgYW4gdW5hbGxvY2F0ZWQgVk1JRC5cXG4rXFx0ICpcXG4rXFx0ICogT25seSB0aGUgbG93IGhhcmR3YXJlIFZNSUQgYml0cyBtYXkgYmUgd3JpdHRlbiB0byBIR0FUUFxcbitcXHQgKiBvciB1c2VkIGFzIGEgaGFyZHdhcmUgZmVuY2UgVk1JRC5cXG4gXFx0ICovXFxuLVxcdHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uO1xcbi1cXHR1bnNpZ25lZCBsb25nIHZtaWQ7XFxuK1xcdGF0b21pYzY0X3QgaWQ7XFxuIH07XFxuIFxcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpO1xcbiB1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKHZvaWQpO1xcbitcXG4raW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKTtcXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKTtcXG4rXFxuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pO1xcbitcXG4rdW5zaWduZWQgbG9uZyBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh1NjQgdm1pZCk7XFxuK1xcbiBib29sIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZChzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQpO1xcbitcXG4gdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7XFxuIFxcbisvKlxcbisgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSdzIGZhc3QtcGF0aCBWTUlEIHN0YXRlIHdoaWxlIHByZXNlcnZpbmdcXG4rICogdGhlIG9sZCBpZGVudGl0eSBjb25zZXJ2YXRpdmVseSBpbiByZXNlcnZlZF92bWlkcy5cXG4rICovXFxuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpO1xcbitcXG4gI2VuZGlmXFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xcbmluZGV4IDg5NTY4Y2NjZTAxZGUuLmQ2YzZiZTRkZjYxYjEgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXFxuKysrIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXFxuQEAgLTE2LDcgKzE2LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fbmFjbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3NiaS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV92Y3B1X3ZlY3Rvci5oXFx1MDAzZVxcbi1cXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdm1pZC5oXFx1MDAzZVxcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwga3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpO1xcbiBcXG4gREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa3ZtX3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSk7XFxuQEAgLTg0LDYgKzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcXG4gXFxuIHZvaWQga3ZtX2FyY2hfZGlzYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcXG4ge1xcbitcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUoKTtcXG4gXFx0a3ZtX3Jpc2N2X2FpYV9kaXNhYmxlKCk7XFxuIFxcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xcbiBcXHRrdm1fcmlzY3ZfbmFjbF9kaXNhYmxlKCk7XFxuQEAgLTExMiw2ICsxMTMsNyBAQCBzdGF0aWMgaW50IGt2bV9yaXNjdl9jcHVfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nXFxuIFxcdFxcdCAqIGlzIGVuYWJsZWQgb24gdGhpcyBDUFUuXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRpZiAoX190aGlzX2NwdV9yZWFkKGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKSkge1xcbitcXHRcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUoKTtcXG4gXFx0XFx0XFx0a3ZtX3Jpc2N2X2FpYV9wbV9lbnRlcigpO1xcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcXG4gXFx0XFx0fVxcbkBAIC0xMzAsNiArMTMyLDcgQEAgc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrdm1fcmlzY3ZfY3B1X3BtX25iID0ge1xcbiBzdGF0aWMgdm9pZCBrdm1fcmlzY3ZfdGVhcmRvd24odm9pZClcXG4ge1xcbiBcXHRrdm1fcmlzY3ZfYWlhX2V4aXQoKTtcXG4rXFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2ZyZWUoKTtcXG4gXFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xcbiBcXHRrdm1fcmlzY3Zfdl9leGl0KCk7XFxuIFxcdGt2bV91bnJlZ2lzdGVyX3BlcmZfY2FsbGJhY2tzKCk7XFxuQEAgLTE4MSw4ICsxODQsMTUgQEAgc3RhdGljIGludCBfX2luaXQgcmlzY3Zfa3ZtX2luaXQodm9pZClcXG4gXFxuIFxcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3QoKTtcXG4gXFxuK1xcdHJjID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQoKTtcXG4rXFx0aWYgKHJjKSB7XFxuK1xcdFxcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXHR9XFxuK1xcbiBcXHRyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpO1xcbiBcXHRpZiAocmMgXFx1MDAyNlxcdTAwMjYgcmMgIT0gLUVOT0RFVikge1xcbitcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpO1xcbiBcXHRcXHRrdm1fcmlzY3ZfbmFjbF9leGl0KCk7XFxuIFxcdFxcdHJldHVybiByYztcXG4gXFx0fVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS9tbXUuYyBiL2FyY2gvcmlzY3Yva3ZtL21tdS5jXFxuaW5kZXggNjAzNWI1ZWM5NTAzOS4uOWI1OTcwOTJmOGVjNiAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL21tdS5jXFxuQEAgLTE1LDcgKzE1LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV9tbXUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fbmFjbC5oXFx1MDAzZVxcbi1cXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdm1pZC5oXFx1MDAzZVxcbiBzdGF0aWMgYm9vbCBfX3JlYWRfbW9zdGx5IGVhZ2VyX3BhZ2Vfc3BsaXQgPSB0cnVlO1xcbiBtb2R1bGVfcGFyYW0oZWFnZXJfcGFnZV9zcGxpdCwgYm9vbCwgMDY0NCk7XFxuIFxcbkBAIC03OTYsMTYgKzc5NiwyMyBAQCB2b2lkIGt2bV9yaXNjdl9tbXVfZnJlZV9wZ2Qoc3RydWN0IGt2bSAqa3ZtKVxcbiBcXHRrdm1fbW11X2ZyZWVfbWVtb3J5X2NhY2hlKFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gucGdkX3NwbGl0X3BhZ2VfY2FjaGUpO1xcbiB9XFxuIFxcbi12b2lkIGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4rdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2g7XFxuIFxcdHVuc2lnbmVkIGxvbmcgaGdhdHAgPSBrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa2EtXFx1MDAzZXBnZF9sZXZlbHMpXFxuIFxcdFxcdFxcdCAgICAgIFxcdTAwM2NcXHUwMDNjIEhHQVRQX01PREVfU0hJRlQ7XFxuIFxcbi1cXHRoZ2F0cCB8PSAoUkVBRF9PTkNFKGthLVxcdTAwM2V2bWlkLnZtaWQpIFxcdTAwM2NcXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFxcdTAwMjYgSEdBVFBfVk1JRDtcXG4rXFx0aGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpIFxcdTAwM2NcXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFxcdTAwMjYgSEdBVFBfVk1JRDtcXG4gXFx0aGdhdHAgfD0gKGthLVxcdTAwM2VwZ2RfcGh5cyBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKSBcXHUwMDI2IEhHQVRQX1BQTjtcXG4gXFxuIFxcdG5jc3Jfd3JpdGUoQ1NSX0hHQVRQLCBoZ2F0cCk7XFxuK31cXG4rXFxuK3ZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbit7XFxuK1xcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcXHUwMDI2dmNwdS1cXHUwMDNla3ZtLVxcdTAwM2VhcmNoLnZtaWQuaWQpO1xcbitcXG4rXFx0a3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTtcXG4gXFxuIFxcdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHMoKSlcXG4gXFx0XFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS90bGIuYyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXFxuaW5kZXggMmFlMzQ2MzJjZGNiMS4uYjg1ZTViYTIxOThhYSAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS90bGIuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jXFxuQEAgLTIyNCw3ICsyMjQsNyBAQCB2b2lkIGt2bV9yaXNjdl9sb2NhbF90bGJfc2FuaXRpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHQgKiBlbnRyaWVzIGJ5IFZNSUQgd2hlbmV2ZXIgdW5kZXJseWluZyBIb3N0IENQVSBjaGFuZ2VzIGZvciBhIFZDUFUuXFxuIFxcdCAqL1xcbiBcXG4tXFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcXG4gXFxuIFxcdC8qXFxuQEAgLTI0NCw3ICsyNDQsNyBAQCB2b2lkIGt2bV9yaXNjdl9mZW5jZV9pX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiB2b2lkIGt2bV9yaXNjdl90bGJfZmx1c2hfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV92bWlkICp2ID0gXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkO1xcbi1cXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cXHUwMDNldm1pZCk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnYtXFx1MDAzZWlkKSk7XFxuIFxcbiBcXHRpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpXFxuIFxcdFxcdG5hY2xfaGZlbmNlX2d2bWFfdm1pZF9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcXG5AQCAtMjU1LDcgKzI1NSw3IEBAIHZvaWQga3ZtX3Jpc2N2X3RsYl9mbHVzaF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4gdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiB7XFxuIFxcdHN0cnVjdCBrdm1fdm1pZCAqdiA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZDtcXG4tXFx0dW5zaWduZWQgbG9uZyB2bWlkID0gUkVBRF9PTkNFKHYtXFx1MDAzZXZtaWQpO1xcbitcXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZ2LVxcdTAwM2VpZCkpO1xcbiBcXG4gXFx0aWYgKGt2bV9yaXNjdl9uYWNsX2F2YWlsYWJsZSgpKVxcbiBcXHRcXHRuYWNsX2hmZW5jZV92dm1hX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xcbkBAIC01MzEsOCArNTMxLDExIEBAIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbChzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcbiBpbnQga3ZtX2FyY2hfZmx1c2hfcmVtb3RlX3RsYnNfcmFuZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIHU2NCBucl9wYWdlcylcXG4ge1xcbitcXHR1bnNpZ25lZCBsb25nIHZtaWQgPVxcbitcXHRcXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbitcXG4gXFx0a3ZtX3Jpc2N2X2hmZW5jZV9ndm1hX3ZtaWRfZ3BhKGt2bSwgLTFVTCwgMCxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIGdmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULCBucl9wYWdlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULFxcbi1cXHRcXHRcXHRcXHQgICAgICAgUEFHRV9TSElGVCwgUkVBRF9PTkNFKGt2bS1cXHUwMDNlYXJjaC52bWlkLnZtaWQpKTtcXG4rXFx0XFx0XFx0XFx0ICAgICAgIFBBR0VfU0hJRlQsIHZtaWQpO1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1LmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHUuY1xcbkBAIC05NDMsMTQgKzk0MywxNCBAQCBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0cmV0ID0gMTtcXG4gXFxuLVxcdFxcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUodmNwdSk7XFxuLVxcbiBcXHRcXHRyZXQgPSBrdm1fcmlzY3ZfY2hlY2tfdmNwdV9yZXF1ZXN0cyh2Y3B1KTtcXG4gXFx0XFx0aWYgKHJldCBcXHUwMDNjPSAwKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdHByZWVtcHRfZGlzYWJsZSgpO1xcbiBcXG4rXFx0XFx0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZSh2Y3B1KTtcXG4rXFxuIFxcdFxcdC8qIFVwZGF0ZSBBSUEgSFcgc3RhdGUgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovXFxuIFxcdFxcdHJldCA9IGt2bV9yaXNjdl92Y3B1X2FpYV91cGRhdGUodmNwdSk7XFxuIFxcdFxcdGlmIChyZXQgXFx1MDAzYz0gMCkge1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmMgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV9yZXBsYWNlLmNcXG5pbmRleCA1MDZhNTEwYjZiZmYzLi4xYmUzODZhNzhlMjdmIDEwMDY0NFxcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xcbkBAIC0xMDQsNyArMTA0LDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cXG4gXFx0XFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19GRU5DRV9JX1NFTlQpO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQTpcXG4tXFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdGlmICgoY3AtXFx1MDAzZWEyID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEzID09IDApIHx8IGNwLVxcdTAwM2VhMyA9PSAtMVVMKVxcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHZjcHUtXFx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCB2bWlkKTtcXG4gXFx0XFx0ZWxzZVxcbkBAIC0xMTMsNyArMTEzLDcgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF9yZmVuY2VfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW5cXG4gXFx0XFx0a3ZtX3Jpc2N2X3ZjcHVfcG11X2luY3JfZncodmNwdSwgU0JJX1BNVV9GV19IRkVOQ0VfVlZNQV9TRU5UKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGNhc2UgU0JJX0VYVF9SRkVOQ0VfUkVNT1RFX1NGRU5DRV9WTUFfQVNJRDpcXG4tXFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdGlmICgoY3AtXFx1MDAzZWEyID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEzID09IDApIHx8IGNwLVxcdTAwM2VhMyA9PSAtMVVMKVxcbiBcXHRcXHRcXHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYXNpZF9hbGwodmNwdS1cXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBjcC1cXHUwMDNlYTQsIHZtaWQpO1xcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXFxuaW5kZXggZGU1NDRlYTNmMjhkYy4uY2EzZWZlNjNjMWNmMSAxMDA2NDRcXG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xcbisrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jXFxuQEAgLTg4LDE0ICs4OCwxNCBAQCBzdGF0aWMgaW50IGt2bV9zYmlfZXh0X3YwMV9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bixcXG4gXFx0XFx0aWYgKGNwLVxcdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfRkVOQ0VfSSlcXG4gXFx0XFx0XFx0a3ZtX3Jpc2N2X2ZlbmNlX2kodmNwdS1cXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2spO1xcbiBcXHRcXHRlbHNlIGlmIChjcC1cXHUwMDNlYTcgPT0gU0JJX0VYVF8wXzFfUkVNT1RFX1NGRU5DRV9WTUEpIHtcXG4tXFx0XFx0XFx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkKTtcXG4rXFx0XFx0XFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXFx1MDAyNnZjcHUtXFx1MDAzZWt2bS1cXHUwMDNlYXJjaC52bWlkLmlkKSk7XFxuIFxcdFxcdFxcdGlmIChjcC1cXHUwMDNlYTEgPT0gMCBcXHUwMDI2XFx1MDAyNiBjcC1cXHUwMDNlYTIgPT0gMClcXG4gXFx0XFx0XFx0XFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbCh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XFxuIFxcdFxcdFxcdGVsc2VcXG4gXFx0XFx0XFx0XFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgY3AtXFx1MDAzZWExLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGNwLVxcdTAwM2VhMiwgUEFHRV9TSElGVCwgdm1pZCk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cXHUwMDNla3ZtLVxcdTAwM2VhcmNoLnZtaWQudm1pZCk7XFxuK1xcdFxcdFxcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCkpO1xcbiBcXHRcXHRcXHRpZiAoY3AtXFx1MDAzZWExID09IDAgXFx1MDAyNlxcdTAwMjYgY3AtXFx1MDAzZWEyID09IDApXFxuIFxcdFxcdFxcdFxcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hc2lkX2FsbCh2Y3B1LVxcdTAwM2Vrdm0sIGhiYXNlLCBobWFzayxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIGNwLVxcdTAwM2VhMywgdm1pZCk7XFxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xcbmluZGV4IGMxNWJkYjFkZDhiZWYuLmVlZTgzMDZjMTI3MDcgMTAwNjQ0XFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXFxuKysrIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXFxuQEAgLTYsMTEgKzYsMTUgQEBcXG4gICogICAgIEFudXAgUGF0ZWwgXFx1MDAzY2FudXAucGF0ZWxAd2RjLmNvbVxcdTAwM2VcXG4gICovXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0bWFwLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaXRvcHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NwdW1hc2suaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Vycm5vLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcGVyY3B1LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmVlbXB0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t2bV9ob3N0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vY3NyLmhcXHUwMDNlXFxuQEAgLTE4LDI2ICsyMiw1NCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2t2bV90bGIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9rdm1fdm1pZC5oXFx1MDAzZVxcbiBcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uID0gMTtcXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9uZXh0O1xcbitzdGF0aWMgYXRvbWljNjRfdCB2bWlkX2dlbmVyYXRpb247XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcXG4gc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF9iaXRzIF9fcm9fYWZ0ZXJfaW5pdDtcXG4tc3RhdGljIERFRklORV9TUElOTE9DSyh2bWlkX2xvY2spO1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2N1cl9pZHggPSAxO1xcbitcXG4rc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodm1pZF9sb2NrKTtcXG4rXFxuK3N0YXRpYyBERUZJTkVfUEVSX0NQVShhdG9taWM2NF90LCBhY3RpdmVfdm1pZHMpO1xcbitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNlcnZlZF92bWlkcyk7XFxuK1xcbitzdGF0aWMgY3B1bWFza190IHRsYl9mbHVzaF9wZW5kaW5nO1xcbitcXG4rI2RlZmluZSBWTUlEX0ZJUlNUX1ZFUlNJT05cXHRCSVRfVUxMKHZtaWRfYml0cylcXG4rI2RlZmluZSBOVU1fVk1JRFNcXHRcXHRCSVQodm1pZF9iaXRzKVxcbisjZGVmaW5lIFZNSURfSFdfTUFTS1xcdFxcdChWTUlEX0ZJUlNUX1ZFUlNJT04gLSAxKVxcbitcXG4rc3RhdGljIGJvb2wgdm1pZF9nZW5fbWF0Y2godTY0IHZtaWQpXFxuK3tcXG4rXFx0cmV0dXJuICEoKHZtaWQgXiBhdG9taWM2NF9yZWFkKFxcdTAwMjZ2bWlkX2dlbmVyYXRpb24pKSBcXHUwMDNlXFx1MDAzZSB2bWlkX2JpdHMpO1xcbit9XFxuK1xcbit1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHU2NCB2bWlkKVxcbit7XFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcXHUwMDI2IFZNSURfSFdfTUFTSyk7XFxuK31cXG4gXFxuIHZvaWQgX19pbml0IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9kZXRlY3Qodm9pZClcXG4ge1xcbi1cXHQvKiBGaWd1cmUtb3V0IG51bWJlciBvZiBWTUlEIGJpdHMgaW4gSFcgKi9cXG4rXFx0LyogRmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIFZNSUQgYml0cyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUuICovXFxuIFxcdGNzcl93cml0ZShDU1JfSEdBVFAsIChrdm1fcmlzY3ZfZ3N0YWdlX21vZGUoa3ZtX3Jpc2N2X2dzdGFnZV9tYXhfcGdkX2xldmVscykgXFx1MDAzY1xcdTAwM2NcXG4tXFx0XFx0XFx0ICAgICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcXG4rXFx0XFx0ICAgSEdBVFBfTU9ERV9TSElGVCkgfCBIR0FUUF9WTUlEKTtcXG4gXFx0dm1pZF9iaXRzID0gY3NyX3JlYWQoQ1NSX0hHQVRQKTtcXG4gXFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcXHUwMDI2IEhHQVRQX1ZNSUQpIFxcdTAwM2VcXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XFxuIFxcdHZtaWRfYml0cyA9IGZsc19sb25nKHZtaWRfYml0cyk7XFxuIFxcdGNzcl93cml0ZShDU1JfSEdBVFAsIDApO1xcbiBcXG4tXFx0LyogV2UgcG9sbHV0ZWQgbG9jYWwgVExCIHNvIGZsdXNoIGFsbCBndWVzdCBUTEIgKi9cXG4rXFx0LyogRmx1c2ggdGhlIGxvY2FsIGd1ZXN0IFRMQiBhZnRlciBwcm9iaW5nIEhHQVRQLiAqL1xcbiBcXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XFxuIFxcbi1cXHQvKiBXZSBkb24ndCB1c2UgVk1JRCBiaXRzIGlmIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50ICovXFxuLVxcdGlmICgoMVVMIFxcdTAwM2NcXHUwMDNjIHZtaWRfYml0cykgXFx1MDAzYyBudW1fcG9zc2libGVfY3B1cygpKVxcbitcXHQvKlxcbitcXHQgKiBWTUlEIDAgaXMgcmVzZXJ2ZWQuICBEdXJpbmcgcm9sbG92ZXIgZXZlcnkgcG9zc2libGUgQ1BVIG1heVxcbitcXHQgKiByZXNlcnZlIG9uZSBoYXJkd2FyZSBWTUlELCBhbmQgd2Ugc3RpbGwgbmVlZCBhdCBsZWFzdCBvbmUgVk1JRFxcbitcXHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXFxuK1xcdCAqL1xcbitcXHRpZiAodm1pZF9iaXRzIFxcdTAwMjZcXHUwMDI2IE5VTV9WTUlEUyAtIDEgXFx1MDAzYz0gbnVtX3Bvc3NpYmxlX2NwdXMoKSlcXG4gXFx0XFx0dm1pZF9iaXRzID0gMDtcXG4gfVxcbiBcXG5AQCAtNDYsODAgKzc4LDI5NSBAQCB1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9iaXRzKHZvaWQpXFxuIFxcdHJldHVybiB2bWlkX2JpdHM7XFxuIH1cXG4gXFxuK2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZClcXG4re1xcbitcXHRpbnQgY3B1O1xcbitcXG4rXFx0aWYgKCF2bWlkX2JpdHMpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0dm1pZF9tYXAgPSBiaXRtYXBfemFsbG9jKE5VTV9WTUlEUywgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghdm1pZF9tYXApXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0dm1pZF9jdXJfaWR4ID0gMTtcXG4rXFxuK1xcdC8qIEhhcmR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZC4gKi9cXG4rXFx0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcXG4rXFxuK1xcdGF0b21pYzY0X3NldChcXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBWTUlEX0ZJUlNUX1ZFUlNJT04pO1xcbitcXG4rXFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xcbitcXHRcXHRhdG9taWM2NF9zZXQoXFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV2ZXJ5IENQVSBwZXJmb3JtcyBhbiBpbml0aWFsIGxvY2FsIGludmFsaWRhdGlvbiBiZWZvcmUgaXRzXFxuK1xcdCAqIGZpcnN0IFZNSUQgYWN0aXZhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGNwdW1hc2tfY29weShcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpXFxuK3tcXG4rXFx0Yml0bWFwX2ZyZWUodm1pZF9tYXApO1xcbitcXHR2bWlkX21hcCA9IE5VTEw7XFxuK31cXG4rXFxuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pXFxuIHtcXG4tXFx0LyogTWFyayB0aGUgaW5pdGlhbCBWTUlEIGFuZCBWTUlEIHZlcnNpb24gaW52YWxpZCAqL1xcbi1cXHRrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkX3ZlcnNpb24gPSAwO1xcbi1cXHRrdm0tXFx1MDAzZWFyY2gudm1pZC52bWlkID0gMDtcXG4rXFx0YXRvbWljNjRfc2V0KFxcdTAwMjZrdm0tXFx1MDAzZWFyY2gudm1pZC5pZCwgMCk7XFxuIFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gYm9vbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQoc3RydWN0IGt2bV92bWlkICp2bWlkKVxcbiB7XFxuK1xcdHU2NCBpZDtcXG4rXFxuIFxcdGlmICghdm1pZF9iaXRzKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcbi1cXHRyZXR1cm4gdW5saWtlbHkoUkVBRF9PTkNFKHZtaWQtXFx1MDAzZXZtaWRfdmVyc2lvbikgIT1cXG4tXFx0XFx0XFx0UkVBRF9PTkNFKHZtaWRfdmVyc2lvbikpO1xcbitcXHRpZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNnZtaWQtXFx1MDAzZWlkKTtcXG4rXFxuK1xcdHJldHVybiB1bmxpa2VseSghdm1pZF9nZW5fbWF0Y2goaWQpKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX19sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwodm9pZCAqaW5mbylcXG4rLypcXG4rICogQ2FsbGVkIHdpdGggdm1pZF9sb2NrIGhlbGQgYWZ0ZXIgdm1pZF9nZW5lcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW5cXG4rICogYWR2YW5jZWQuXFxuKyAqXFxuKyAqIE5vIHJlbW90ZSBDUFUgaXMgaW50ZXJydXB0ZWQgaGVyZS4gIEluc3RlYWQsIHByZXNlcnZlIGV2ZXJ5IFZNSURcXG4rICogd2hpY2ggbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBDUFUgYW5kIHF1ZXVlIGEgbG9jYWwgaW52YWxpZGF0aW9uIGZvclxcbisgKiB0aGF0IENQVSdzIG5leHQgVk1JRCBhY3RpdmF0aW9uLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKVxcbiB7XFxuLVxcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV9hbGwoKTtcXG4rXFx0dTY0IHZtaWQ7XFxuK1xcdGludCBjcHU7XFxuK1xcbitcXHRiaXRtYXBfemVybyh2bWlkX21hcCwgTlVNX1ZNSURTKTtcXG4rXFx0X19zZXRfYml0KDAsIHZtaWRfbWFwKTtcXG4rXFxuK1xcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcXG4rXFx0XFx0dm1pZCA9IGF0b21pYzY0X3hjaGcoXFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBDUFUgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNhdWdodCBieSBhbiBlYXJsaWVyIHJvbGxvdmVyXFxuK1xcdFxcdCAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbm90aGVyIGFjdGl2YXRpb24gc2luY2UgdGhlbi4gIEluIHRoYXRcXG4rXFx0XFx0ICogY2FzZSByZXNlcnZlZF92bWlkcyBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIG9sZCBjb250ZXh0LlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCF2bWlkKVxcbitcXHRcXHRcXHR2bWlkID0gcGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KTtcXG4rXFxuK1xcdFxcdGlmICh2bWlkKVxcbitcXHRcXHRcXHRfX3NldF9iaXQoa3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCksXFxuK1xcdFxcdFxcdFxcdCAgdm1pZF9tYXApO1xcbitcXG4rXFx0XFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IHZtaWQ7XFxuK1xcdH1cXG4rXFxuK1xcdGNwdW1hc2tfY29weShcXHUwMDI2dGxiX2ZsdXNoX3BlbmRpbmcsIGNwdV9wb3NzaWJsZV9tYXNrKTtcXG4gfVxcbiBcXG4tdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcXG4rLypcXG4rICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXFxuKyAqXFxuKyAqIERvIG5vdCBzdG9wIGFmdGVyIHRoZSBmaXJzdCBtYXRjaDogdGhlIHNhbWUgVk0gbWF5IGhhdmUgYmVlbiBhY3RpdmVcXG4rICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cXG4rICovXFxuK3N0YXRpYyBib29sIGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHU2NCBvbGRfdm1pZCwgdTY0IG5ld192bWlkKVxcbiB7XFxuLVxcdHVuc2lnbmVkIGxvbmcgaTtcXG4tXFx0c3RydWN0IGt2bV92Y3B1ICp2O1xcbi1cXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSBcXHUwMDI2dmNwdS1cXHUwMDNla3ZtLVxcdTAwM2VhcmNoLnZtaWQ7XFxuK1xcdGJvb2wgaGl0ID0gZmFsc2U7XFxuK1xcdGludCBjcHU7XFxuIFxcbi1cXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSlcXG4tXFx0XFx0cmV0dXJuO1xcbitcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuK1xcdFxcdGlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7XFxuK1xcdFxcdFxcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSBuZXdfdm1pZDtcXG4rXFx0XFx0XFx0aGl0ID0gdHJ1ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gaGl0O1xcbit9XFxuK1xcbisvKlxcbisgKiBBbGxvY2F0ZS9wcm9tb3RlIGEgc29mdHdhcmUgVk1JRC5cXG4rICpcXG4rICogdm1pZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLlxcbisgKi9cXG4rc3RhdGljIHU2NCBuZXdfdm1pZF9sb2NrZWQoc3RydWN0IGt2bV92bWlkICprdm1fdm1pZClcXG4re1xcbitcXHR1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNmt2bV92bWlkLVxcdTAwM2VpZCk7XFxuK1xcdHU2NCBnZW5lcmF0aW9uID0gYXRvbWljNjRfcmVhZChcXHUwMDI2dm1pZF9nZW5lcmF0aW9uKTtcXG4rXFx0dTY0IG5ld192bWlkO1xcbitcXHR1bnNpZ25lZCBsb25nIGlkeDtcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2dm1pZF9sb2NrKTtcXG4rXFx0aWYgKHZtaWQpIHtcXG4rXFx0XFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcXG4rXFx0XFx0XFx0ICAga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodm1pZCk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaGUgb2xkIFZNSUQgaXMgc3RpbGwgcHJvdGVjdGVkIGJ5IG9uZSBvciBtb3JlIENQVXMuXFxuK1xcdFxcdCAqIEtlZXAgdGhlIHNhbWUgaGFyZHdhcmUgVk1JRCBhbmQgb25seSBwcm9tb3RlIGdlbmVyYXRpb24uXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoY2hlY2tfdXBkYXRlX3Jlc2VydmVkX3ZtaWQodm1pZCwgbmV3X3ZtaWQpKVxcbitcXHRcXHRcXHRyZXR1cm4gbmV3X3ZtaWQ7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaGUgVk0gaGFkIGEgVk1JRCBpbiBhbiBvbGRlciBnZW5lcmF0aW9uLiAgUmV1c2UgdGhlIHNhbWVcXG4rXFx0XFx0ICogaGFyZHdhcmUgbnVtYmVyIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNsYWltZWQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZHggPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKTtcXG4rXFx0XFx0aWYgKCFfX3Rlc3RfYW5kX3NldF9iaXQoaWR4LCB2bWlkX21hcCkpXFxuK1xcdFxcdFxcdHJldHVybiBuZXdfdm1pZDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLlxcbitcXHQgKi9cXG4rXFx0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIHZtaWRfY3VyX2lkeCk7XFxuK1xcdGlmIChpZHggIT0gTlVNX1ZNSURTKVxcbitcXHRcXHRnb3RvIHNldF92bWlkO1xcbitcXG4rXFx0LypcXG4rXFx0ICogTm8gZnJlZSBWTUlELiAgU3RhcnQgYSBuZXcgZ2VuZXJhdGlvbiwgcHJlc2VydmUgYWxsIENQVS1sb2NhbFxcbitcXHQgKiB1c2VycywgYW5kIGRlZmVyIGVhY2ggQ1BVJ3MgZmx1c2ggdW50aWwgaXRzIG5leHQgYWN0aXZhdGlvbi5cXG4rXFx0ICovXFxuK1xcdGdlbmVyYXRpb24gKz0gVk1JRF9GSVJTVF9WRVJTSU9OO1xcbitcXG4rXFx0LyogU29mdHdhcmUgVk1JRCAwIGlzIHJlc2VydmVkIGFzIHRoZSBpbnZhbGlkIGlkZW50aWZpZXIuICovXFxuK1xcdGlmICh1bmxpa2VseSghZ2VuZXJhdGlvbikpXFxuK1xcdFxcdGdlbmVyYXRpb24gPSBWTUlEX0ZJUlNUX1ZFUlNJT047XFxuK1xcbitcXHRhdG9taWM2NF94Y2hnKFxcdTAwMjZ2bWlkX2dlbmVyYXRpb24sIGdlbmVyYXRpb24pO1xcbitcXHRmbHVzaF9jb250ZXh0KCk7XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBXZSBuZWVkIHRvIHJlLWNoZWNrIHRoZSB2bWlkX3ZlcnNpb24gaGVyZSB0byBlbnN1cmUgdGhhdCBpZlxcbi1cXHQgKiBhbm90aGVyIHZjcHUgYWxyZWFkeSBhbGxvY2F0ZWQgYSB2YWxpZCB2bWlkIGZvciB0aGlzIHZtLlxcbitcXHQgKiBOVU1fVk1JRFMgLSAxIFxcdTAwM2UgbnVtX3Bvc3NpYmxlX2NwdXMoKSwgdGhlcmVmb3JlIHJvbGxvdmVyIG11c3RcXG4rXFx0ICogbGVhdmUgYXQgbGVhc3Qgb25lIGFsbG9jYXRhYmxlIGhhcmR3YXJlIFZNSUQuXFxuIFxcdCAqL1xcbi1cXHRpZiAoIWt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF92ZXJfY2hhbmdlZCh2bWlkKSkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2dm1pZF9sb2NrKTtcXG4rXFx0aWR4ID0gZmluZF9uZXh0X3plcm9fYml0KHZtaWRfbWFwLCBOVU1fVk1JRFMsIDEpO1xcbitcXG4rc2V0X3ZtaWQ6XFxuK1xcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcXG4rXFx0dm1pZF9jdXJfaWR4ID0gaWR4O1xcbitcXG4rXFx0cmV0dXJuIGdlbmVyYXRpb24gfCBpZHg7XFxuK31cXG4rXFxuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXFxuK3tcXG4rXFx0c3RydWN0IGt2bV92bWlkICprdm1fdm1pZCA9IFxcdTAwMjZ2Y3B1LVxcdTAwM2Vrdm0tXFx1MDAzZWFyY2gudm1pZDtcXG4rXFx0YXRvbWljNjRfdCAqYWN0aXZlO1xcbitcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbitcXHR1NjQgdm1pZDtcXG4rXFx0dTY0IG9sZF9hY3RpdmVfdm1pZDtcXG4rXFx0dW5zaWduZWQgaW50IGNwdTtcXG4rXFxuK1xcdGlmICghdm1pZF9iaXRzKVxcbiBcXHRcXHRyZXR1cm47XFxuLVxcdH1cXG4gXFxuLVxcdC8qIEZpcnN0IHVzZXIgb2YgYSBuZXcgVk1JRCB2ZXJzaW9uPyAqL1xcbi1cXHRpZiAodW5saWtlbHkodm1pZF9uZXh0ID09IDApKSB7XFxuLVxcdFxcdFdSSVRFX09OQ0Uodm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSArIDEpO1xcbi1cXHRcXHR2bWlkX25leHQgPSAxO1xcbitcXHQvKlxcbitcXHQgKiBhY3RpdmVfdm1pZHMgYW5kIHRsYl9mbHVzaF9wZW5kaW5nIGFyZSBwZXItQ1BVIHN0YXRlLiAgS2VlcCB0aGVcXG4rXFx0ICogY29tcGxldGUgVk1JRCBhY3RpdmF0aW9uIG9uIHRoZSBzYW1lIENQVS5cXG4rXFx0ICovXFxuK1xcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcXG4rXFxuK1xcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcXG4rXFx0YWN0aXZlID0gdGhpc19jcHVfcHRyKFxcdTAwMjZhY3RpdmVfdm1pZHMpO1xcbitcXG4rXFx0dm1pZCA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNmt2bV92bWlkLVxcdTAwM2VpZCk7XFxuK1xcdG9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEZhc3QgcGF0aC5cXG4rXFx0ICpcXG4rXFx0ICogVGhlIGNtcHhjaGcgcmFjZXMgd2l0aCBmbHVzaF9jb250ZXh0KCkncyB4Y2hnIG9uIHRoZSBzYW1lXFxuK1xcdCAqIHBlci1DUFUgYXRvbWljLiAgRWl0aGVyIHRoaXMgYWN0aXZhdGlvbiBpcyBjYXB0dXJlZCBieSByb2xsb3ZlcixcXG4rXFx0ICogb3Igcm9sbG92ZXIgY2xlYXJzIGFjdGl2ZSBmaXJzdCBhbmQgdGhlIGNtcHhjaGcgZmFpbHMuXFxuK1xcdCAqL1xcbitcXHRpZiAob2xkX2FjdGl2ZV92bWlkIFxcdTAwMjZcXHUwMDI2IHZtaWRfZ2VuX21hdGNoKHZtaWQpKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIHJhbiBvdXQgb2YgVk1JRHMgc28gd2UgaW5jcmVtZW50IHZtaWRfdmVyc2lvbiBhbmRcXG4tXFx0XFx0ICogc3RhcnQgYXNzaWduaW5nIFZNSURzIGZyb20gMS5cXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogVGhpcyBhbHNvIG1lYW5zIGV4aXN0aW5nIFZNSURzIGFzc2lnbm1lbnQgdG8gYWxsIEd1ZXN0XFxuLVxcdFxcdCAqIGluc3RhbmNlcyBpcyBpbnZhbGlkIGFuZCB3ZSBoYXZlIGZvcmNlIFZNSUQgcmUtYXNzaWduZW1lbnRcXG4tXFx0XFx0ICogZm9yIGFsbCBHdWVzdCBpbnN0YW5jZXMuIFRoZSBHdWVzdCBpbnN0YW5jZXMgdGhhdCB3ZXJlIG5vdFxcbi1cXHRcXHQgKiBydW5uaW5nIHdpbGwgYXV0b21hdGljYWxseSBwaWNrLXVwIG5ldyBWTUlEcyBiZWNhdXNlIHdpbGxcXG4tXFx0XFx0ICogY2FsbCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKCkgd2hlbmV2ZXIgdGhleSBlbnRlclxcbi1cXHRcXHQgKiBpbi1rZXJuZWwgcnVuIGxvb3AuIEZvciBHdWVzdCBpbnN0YW5jZXMgdGhhdCBhcmUgYWxyZWFkeVxcbi1cXHRcXHQgKiBydW5uaW5nLCB3ZSBmb3JjZSBWTSBleGl0cyBvbiBhbGwgaG9zdCBDUFVzIHVzaW5nIElQSSBhbmRcXG4tXFx0XFx0ICogZmx1c2ggYWxsIEd1ZXN0IFRMQnMuXFxuK1xcdFxcdCAqIEhHQVRQIG11c3QgY29udGFpbiB0aGUgc2FtZSBoYXJkd2FyZSBWTUlEIHRoYXQgaXMgcHVibGlzaGVkXFxuK1xcdFxcdCAqIGluIGFjdGl2ZV92bWlkcy5cXG4gXFx0XFx0ICovXFxuLVxcdFxcdG9uX2VhY2hfY3B1X21hc2soY3B1X29ubGluZV9tYXNrLCBfX2xvY2FsX2hmZW5jZV9ndm1hX2FsbCxcXG4tXFx0XFx0XFx0XFx0IE5VTEwsIDEpO1xcbitcXHRcXHRpZiAob2xkX2FjdGl2ZV92bWlkICE9IHZtaWQpXFxuK1xcdFxcdFxcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XFxuK1xcbitcXHRcXHRpZiAoYXRvbWljNjRfY21weGNoZyhhY3RpdmUsIG9sZF9hY3RpdmVfdm1pZCwgdm1pZCkgPT1cXG4rXFx0XFx0ICAgIG9sZF9hY3RpdmVfdm1pZClcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuIFxcbi1cXHR2bWlkLVxcdTAwM2V2bWlkID0gdm1pZF9uZXh0O1xcbi1cXHR2bWlkX25leHQrKztcXG4tXFx0dm1pZF9uZXh0IFxcdTAwMjY9ICgxIFxcdTAwM2NcXHUwMDNjIHZtaWRfYml0cykgLSAxO1xcbitcXHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xcbiBcXG4tXFx0V1JJVEVfT05DRSh2bWlkLVxcdTAwM2V2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pKTtcXG4rXFx0LypcXG4rXFx0ICogUmUtcmVhZCB1bmRlciB0aGUgYWxsb2NhdG9yIGxvY2sgYmVjYXVzZSBhbm90aGVyIHZDUFUgb2YgdGhpcyBWTVxcbitcXHQgKiBtYXkgYWxyZWFkeSBoYXZlIHByb21vdGVkIG9yIGFsbG9jYXRlZCB0aGUgc2hhcmVkIFZNSUQuXFxuK1xcdCAqL1xcbitcXHR2bWlkID0gYXRvbWljNjRfcmVhZChcXHUwMDI2a3ZtX3ZtaWQtXFx1MDAzZWlkKTtcXG4rXFxuK1xcdGlmICghdm1pZF9nZW5fbWF0Y2godm1pZCkpIHtcXG4rXFx0XFx0dm1pZCA9IG5ld192bWlkX2xvY2tlZChrdm1fdm1pZCk7XFxuK1xcdFxcdGF0b21pYzY0X3NldChcXHUwMDI2a3ZtX3ZtaWQtXFx1MDAzZWlkLCB2bWlkKTtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQ29tcGxldGUgdGhpcyBDUFUncyBkZWZlcnJlZCByb2xsb3ZlciBpbnZhbGlkYXRpb24gYmVmb3JlXFxuK1xcdCAqIGluc3RhbGxpbmcgdGhlIG5ldyBoYXJkd2FyZSBWTUlELlxcbitcXHQgKi9cXG4rXFx0aWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgXFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKSlcXG4rXFx0XFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSW5zdGFsbCB0aGUgY3VycmVudCBoYXJkd2FyZSBWTUlEIGJlZm9yZSBwdWJsaXNoaW5nIHRoaXMgQ1BVIGFzXFxuK1xcdCAqIGFjdGl2ZSB3aXRoIHRoZSBuZXcgc29mdHdhcmUgVk1JRC5cXG4rXFx0ICovXFxuK1xcdGt2bV9yaXNjdl9tbXVfdXBkYXRlX2hnYXRwX3ZtaWQodmNwdSwgdm1pZCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBPbmNlIGFjdGl2ZV92bWlkcyBpcyB2aXNpYmxlLCB0aGUgcmVxdWlyZWQgbG9jYWwgaW52YWxpZGF0aW9uIGFuZFxcbitcXHQgKiBIR0FUUCB1cGRhdGUgYXJlIGNvbXBsZXRlLlxcbitcXHQgKi9cXG4rXFx0YXRvbWljNjRfc2V0KGFjdGl2ZSwgdm1pZCk7XFxuK1xcbitcXHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XFxuK31cXG4gXFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZ2bWlkX2xvY2spO1xcbisvKlxcbisgKiBDUFUgdmlydHVhbGl6YXRpb24vQ1NSIHN0YXRlIGlzIGJlaW5nIGRpc2NhcmRlZC5cXG4rICpcXG4rICogV2l0aGRyYXcgZmFzdC1wYXRoIGVsaWdpYmlsaXR5LCBidXQgY29uc2VydmF0aXZlbHkgcHJlc2VydmUgdGhlIGxhc3RcXG4rICogaWRlbnRpdHkgaW5zdGVhZCBvZiBtYWtpbmcgaXRzIGhhcmR3YXJlIFZNSUQgaW1tZWRpYXRlbHkgcmV1c2FibGUuXFxuKyAqL1xcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSh2b2lkKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XFxuK1xcdHU2NCB2bWlkO1xcbitcXHR1bnNpZ25lZCBpbnQgY3B1O1xcbitcXG4rXFx0aWYgKCF2bWlkX2JpdHMpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcXG4rXFxuK1xcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcXG4rXFxuK1xcdHJhd19zcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XFxuK1xcbitcXHR2bWlkID0gYXRvbWljNjRfeGNoZyh0aGlzX2NwdV9wdHIoXFx1MDAyNmFjdGl2ZV92bWlkcyksIDApO1xcbitcXG4rXFx0aWYgKHZtaWQpXFxuK1xcdFxcdHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSkgPSB2bWlkO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSWYgYWN0aXZlIHdhcyBhbHJlYWR5IHplcm8sIHJldGFpbiB0aGUgb2xkIHJlc2VydmVkIGVudHJ5LlxcbitcXHQgKi9cXG4rXFx0Y3B1bWFza19zZXRfY3B1KGNwdSwgXFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKTtcXG4gXFxuLVxcdC8qIFJlcXVlc3QgRy1zdGFnZSBwYWdlIHRhYmxlIHVwZGF0ZSBmb3IgYWxsIFZDUFVzICovXFxuLVxcdGt2bV9mb3JfZWFjaF92Y3B1KGksIHYsIHZjcHUtXFx1MDAzZWt2bSlcXG4tXFx0XFx0a3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1VQREFURV9IR0FUUCwgdik7XFxuK1xcdHJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKFxcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcXG4gfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNjoyMDo0NC4yNzYxMzA4NloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTU2NjMxNTAxNjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiQWxsIG1vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGFyY2gvcmlzY3YvIChSSVNDLVYgS1ZNIHN1YnN5c3RlbSkuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGV4Y2x1c2l2ZSB0byBSSVNDLVYgYW5kIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZGFlNjIxODc4ZWRmNzcyY2Q4NWIwOGVlMWVmZmE1MDEzNDhjM2M1NVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDE2OjIwOjQyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fZ3N0YWdlLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaFxuaW5kZXggYWFmMDgwYmExYjc3YS4uYzYxYTFiYmIyNzJmNCAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX2dzdGFnZS5oXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9nc3RhZ2UuaFxuQEAgLTgsNyArOCw3IEBAXG4gI2RlZmluZSBfX1JJU0NWX0tWTV9HU1RBR0VfSF9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fdHlwZXMuaFx1MDAzZVxuLVxuKyNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdm1pZC5oXHUwMDNlXG4gc3RydWN0IGt2bV9nc3RhZ2Uge1xuIFx0c3RydWN0IGt2bSAqa3ZtO1xuIFx0dW5zaWduZWQgbG9uZyBmbGFncztcbkBAIC0xMDgsNyArMTA4LDggQEAgc3RhdGljIGlubGluZSB2b2lkIGt2bV9yaXNjdl9nc3RhZ2VfaW5pdChzdHJ1Y3Qga3ZtX2dzdGFnZSAqZ3N0YWdlLCBzdHJ1Y3Qga3ZtICpcbiB7XG4gXHRnc3RhZ2UtXHUwMDNla3ZtID0ga3ZtO1xuIFx0Z3N0YWdlLVx1MDAzZWZsYWdzID0gMDtcbi1cdGdzdGFnZS1cdTAwM2V2bWlkID0gUkVBRF9PTkNFKGt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4rXHRnc3RhZ2UtXHUwMDNldm1pZCA9XG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0Z3N0YWdlLVx1MDAzZXBnZCA9IGt2bS1cdTAwM2VhcmNoLnBnZDtcbiBcdGdzdGFnZS1cdTAwM2VwZ2RfbGV2ZWxzID0ga3ZtLVx1MDAzZWFyY2gucGdkX2xldmVscztcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1fbW11LmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaFxuaW5kZXggNTQzOWU3NmYwYTk2MC4uYWFlOWI4YWMwODc4ZiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX21tdS5oXG4rKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9tbXUuaFxuQEAgLTE2LDYgKzE2LDcgQEAgaW50IGt2bV9yaXNjdl9tbXVfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCxcbiBcdFx0ICAgICAgc3RydWN0IGt2bV9nc3RhZ2VfbWFwcGluZyAqb3V0X21hcCk7XG4gaW50IGt2bV9yaXNjdl9tbXVfYWxsb2NfcGdkKHN0cnVjdCBrdm0gKmt2bSk7XG4gdm9pZCBrdm1fcmlzY3ZfbW11X2ZyZWVfcGdkKHN0cnVjdCBrdm0gKmt2bSk7XG4rdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpO1xuIHZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTtcbiBcbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbmluZGV4IGRiNjFiMDUyNWE4ZDAuLmRkZDdjYzEyNWMzZjYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV92bWlkLmhcbisrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20va3ZtX3ZtaWQuaFxuQEAgLTYsMjEgKzYsNDIgQEBcbiAjaWZuZGVmIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiAjZGVmaW5lIF9fUklTQ1ZfS1ZNX1ZNSURfSF9cbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bV90eXBlcy5oXHUwMDNlXG4gXG4gc3RydWN0IGt2bV92bWlkIHtcbiBcdC8qXG4tXHQgKiBXcml0ZXMgdG8gdm1pZF92ZXJzaW9uIGFuZCB2bWlkIGhhcHBlbiB3aXRoIHZtaWRfbG9jayBoZWxkXG4tXHQgKiB3aGVyZWFzIHJlYWRzIGhhcHBlbiB3aXRob3V0IGFueSBsb2NrIGhlbGQuXG4rXHQgKiBTb2Z0d2FyZSBWTUlEOlxuK1x0ICpcbitcdCAqICAgWyBnZW5lcmF0aW9uIHwgaGFyZHdhcmUgVk1JRCBdXG4rXHQgKlxuK1x0ICogS2VlcCB0aGUgaWRlbnRpdHkgNjQtYml0IG9uIFJWMzIgc28gdGhhdCB0aGUgZ2VuZXJhdGlvbiBkb2VzIG5vdFxuK1x0ICogd3JhcCBhdCB0aGUgbmF0aXZlIHdvcmQgc2l6ZS4gIFplcm8gZGVub3RlcyBhbiB1bmFsbG9jYXRlZCBWTUlELlxuK1x0ICpcbitcdCAqIE9ubHkgdGhlIGxvdyBoYXJkd2FyZSBWTUlEIGJpdHMgbWF5IGJlIHdyaXR0ZW4gdG8gSEdBVFBcbitcdCAqIG9yIHVzZWQgYXMgYSBoYXJkd2FyZSBmZW5jZSBWTUlELlxuIFx0ICovXG4tXHR1bnNpZ25lZCBsb25nIHZtaWRfdmVyc2lvbjtcbi1cdHVuc2lnbmVkIGxvbmcgdm1pZDtcbitcdGF0b21pYzY0X3QgaWQ7XG4gfTtcbiBcbiB2b2lkIF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZCk7XG4rXG4raW50IF9faW5pdCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfaW5pdCh2b2lkKTtcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKHZvaWQpO1xuK1xuIGludCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pO1xuK1xuK3Vuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQodTY0IHZtaWQpO1xuK1xuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZCk7XG4rXG4gdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7XG4gXG4rLypcbisgKiBJbnZhbGlkYXRlIHRoZSBjdXJyZW50IENQVSdzIGZhc3QtcGF0aCBWTUlEIHN0YXRlIHdoaWxlIHByZXNlcnZpbmdcbisgKiB0aGUgb2xkIGlkZW50aXR5IGNvbnNlcnZhdGl2ZWx5IGluIHJlc2VydmVkX3ZtaWRzLlxuKyAqL1xuK3ZvaWQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKHZvaWQpO1xuK1xuICNlbmRpZlxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuaW5kZXggODk1NjhjY2NlMDFkZS4uZDZjNmJlNGRmNjFiMSAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL21haW4uY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vbWFpbi5jXG5AQCAtMTYsNyArMTYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fbmFjbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NiaS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92Y3B1X3ZlY3Rvci5oXHUwMDNlXG4tXG4rI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV92bWlkLmhcdTAwM2VcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwga3ZtX3Jpc2N2X3ZpcnR1YWxpemF0aW9uX2VuYWJsZWQpO1xuIFxuIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpO1xuQEAgLTg0LDYgKzg0LDcgQEAgaW50IGt2bV9hcmNoX2VuYWJsZV92aXJ0dWFsaXphdGlvbl9jcHUodm9pZClcbiBcbiB2b2lkIGt2bV9hcmNoX2Rpc2FibGVfdmlydHVhbGl6YXRpb25fY3B1KHZvaWQpXG4ge1xuK1x0a3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2NwdV9pbnZhbGlkYXRlKCk7XG4gXHRrdm1fcmlzY3ZfYWlhX2Rpc2FibGUoKTtcbiBcdGt2bV9yaXNjdl9jc3JfY2xlYW51cCgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZGlzYWJsZSgpO1xuQEAgLTExMiw2ICsxMTMsNyBAQCBzdGF0aWMgaW50IGt2bV9yaXNjdl9jcHVfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nXG4gXHRcdCAqIGlzIGVuYWJsZWQgb24gdGhpcyBDUFUuXG4gXHRcdCAqL1xuIFx0XHRpZiAoX190aGlzX2NwdV9yZWFkKGt2bV9yaXNjdl92aXJ0dWFsaXphdGlvbl9lbmFibGVkKSkge1xuK1x0XHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9jcHVfaW52YWxpZGF0ZSgpO1xuIFx0XHRcdGt2bV9yaXNjdl9haWFfcG1fZW50ZXIoKTtcbiBcdFx0XHRrdm1fcmlzY3ZfY3NyX2NsZWFudXAoKTtcbiBcdFx0fVxuQEAgLTEzMCw2ICsxMzIsNyBAQCBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9yaXNjdl9jcHVfcG1fbmIgPSB7XG4gc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3RlYXJkb3duKHZvaWQpXG4ge1xuIFx0a3ZtX3Jpc2N2X2FpYV9leGl0KCk7XG4rXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSgpO1xuIFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuIFx0a3ZtX3Jpc2N2X3ZfZXhpdCgpO1xuIFx0a3ZtX3VucmVnaXN0ZXJfcGVyZl9jYWxsYmFja3MoKTtcbkBAIC0xODEsOCArMTg0LDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHJpc2N2X2t2bV9pbml0KHZvaWQpXG4gXG4gXHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfZGV0ZWN0KCk7XG4gXG4rXHRyYyA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19pbml0KCk7XG4rXHRpZiAocmMpIHtcbitcdFx0a3ZtX3Jpc2N2X25hY2xfZXhpdCgpO1xuK1x0XHRyZXR1cm4gcmM7XG4rXHR9XG4rXG4gXHRyYyA9IGt2bV9yaXNjdl9haWFfaW5pdCgpO1xuIFx0aWYgKHJjIFx1MDAyNlx1MDAyNiByYyAhPSAtRU5PREVWKSB7XG4rXHRcdGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9hbGxvY19mcmVlKCk7XG4gXHRcdGt2bV9yaXNjdl9uYWNsX2V4aXQoKTtcbiBcdFx0cmV0dXJuIHJjO1xuIFx0fVxuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL21tdS5jIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbmluZGV4IDYwMzViNWVjOTUwMzkuLjliNTk3MDkyZjhlYzYgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS9tbXUuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vbW11LmNcbkBAIC0xNSw3ICsxNSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX21tdS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV9uYWNsLmhcdTAwM2Vcbi1cbisjaW5jbHVkZSBcdTAwM2Nhc20va3ZtX3ZtaWQuaFx1MDAzZVxuIHN0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgZWFnZXJfcGFnZV9zcGxpdCA9IHRydWU7XG4gbW9kdWxlX3BhcmFtKGVhZ2VyX3BhZ2Vfc3BsaXQsIGJvb2wsIDA2NDQpO1xuIFxuQEAgLTc5NiwxNiArNzk2LDIzIEBAIHZvaWQga3ZtX3Jpc2N2X21tdV9mcmVlX3BnZChzdHJ1Y3Qga3ZtICprdm0pXG4gXHRrdm1fbW11X2ZyZWVfbWVtb3J5X2NhY2hlKFx1MDAyNmt2bS1cdTAwM2VhcmNoLnBnZF9zcGxpdF9wYWdlX2NhY2hlKTtcbiB9XG4gXG4tdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4rdm9pZCBrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZtaWQpXG4ge1xuIFx0c3RydWN0IGt2bV9hcmNoICprYSA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2g7XG4gXHR1bnNpZ25lZCBsb25nIGhnYXRwID0ga3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGthLVx1MDAzZXBnZF9sZXZlbHMpXG4gXHRcdFx0ICAgICAgXHUwMDNjXHUwMDNjIEhHQVRQX01PREVfU0hJRlQ7XG4gXG4tXHRoZ2F0cCB8PSAoUkVBRF9PTkNFKGthLVx1MDAzZXZtaWQudm1pZCkgXHUwMDNjXHUwMDNjIEhHQVRQX1ZNSURfU0hJRlQpIFx1MDAyNiBIR0FUUF9WTUlEO1xuK1x0aGdhdHAgfD0gKGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpIFx1MDAzY1x1MDAzYyBIR0FUUF9WTUlEX1NISUZUKSBcdTAwMjYgSEdBVFBfVk1JRDtcbiBcdGhnYXRwIHw9IChrYS1cdTAwM2VwZ2RfcGh5cyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDI2IEhHQVRQX1BQTjtcbiBcbiBcdG5jc3Jfd3JpdGUoQ1NSX0hHQVRQLCBoZ2F0cCk7XG4rfVxuK1xuK3ZvaWQga3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuK3tcbitcdHU2NCB2bWlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpO1xuK1xuK1x0a3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTtcbiBcbiBcdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHMoKSlcbiBcdFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3RsYi5jIGIvYXJjaC9yaXNjdi9rdm0vdGxiLmNcbmluZGV4IDJhZTM0NjMyY2RjYjEuLmI4NWU1YmEyMTk4YWEgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS90bGIuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vdGxiLmNcbkBAIC0yMjQsNyArMjI0LDcgQEAgdm9pZCBrdm1fcmlzY3ZfbG9jYWxfdGxiX3Nhbml0aXplKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiBcdCAqIGVudHJpZXMgYnkgVk1JRCB3aGVuZXZlciB1bmRlcmx5aW5nIEhvc3QgQ1BVIGNoYW5nZXMgZm9yIGEgVkNQVS5cbiBcdCAqL1xuIFxuLVx0dm1pZCA9IFJFQURfT05DRSh2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQudm1pZCk7XG4rXHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTtcbiBcbiBcdC8qXG5AQCAtMjQ0LDcgKzI0NCw3IEBAIHZvaWQga3ZtX3Jpc2N2X2ZlbmNlX2lfcHJvY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpXG4gdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHtcbiBcdHN0cnVjdCBrdm1fdm1pZCAqdiA9IFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZDtcbi1cdHVuc2lnbmVkIGxvbmcgdm1pZCA9IFJFQURfT05DRSh2LVx1MDAzZXZtaWQpO1xuK1x0dW5zaWduZWQgbG9uZyB2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2LVx1MDAzZWlkKSk7XG4gXG4gXHRpZiAoa3ZtX3Jpc2N2X25hY2xfYXZhaWxhYmxlKCkpXG4gXHRcdG5hY2xfaGZlbmNlX2d2bWFfdm1pZF9hbGwobmFjbF9zaG1lbSgpLCB2bWlkKTtcbkBAIC0yNTUsNyArMjU1LDcgQEAgdm9pZCBrdm1fcmlzY3ZfdGxiX2ZsdXNoX3Byb2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIHZvaWQga3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FsbF9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSlcbiB7XG4gXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnYgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4tXHR1bnNpZ25lZCBsb25nIHZtaWQgPSBSRUFEX09OQ0Uodi1cdTAwM2V2bWlkKTtcbitcdHVuc2lnbmVkIGxvbmcgdm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2di1cdTAwM2VpZCkpO1xuIFxuIFx0aWYgKGt2bV9yaXNjdl9uYWNsX2F2YWlsYWJsZSgpKVxuIFx0XHRuYWNsX2hmZW5jZV92dm1hX2FsbChuYWNsX3NobWVtKCksIHZtaWQpO1xuQEAgLTUzMSw4ICs1MzEsMTEgQEAgdm9pZCBrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHN0cnVjdCBrdm0gKmt2bSxcbiBcbiBpbnQga3ZtX2FyY2hfZmx1c2hfcmVtb3RlX3RsYnNfcmFuZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIHU2NCBucl9wYWdlcylcbiB7XG4rXHR1bnNpZ25lZCBsb25nIHZtaWQgPVxuK1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbitcbiBcdGt2bV9yaXNjdl9oZmVuY2VfZ3ZtYV92bWlkX2dwYShrdm0sIC0xVUwsIDAsXG4gXHRcdFx0XHQgICAgICAgZ2ZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULCBucl9wYWdlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbi1cdFx0XHRcdCAgICAgICBQQUdFX1NISUZULCBSRUFEX09OQ0Uoa3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKSk7XG4rXHRcdFx0XHQgICAgICAgUEFHRV9TSElGVCwgdm1pZCk7XG4gXHRyZXR1cm4gMDtcbiB9XG5kaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG5pbmRleCBlMDYyY2ExOWY5ZDhmLi44NTU0MmMxYTVlYzNmIDEwMDY0NFxuLS0tIGEvYXJjaC9yaXNjdi9rdm0vdmNwdS5jXG4rKysgYi9hcmNoL3Jpc2N2L2t2bS92Y3B1LmNcbkBAIC05NDMsMTQgKzk0MywxNCBAQCBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRyZXQgPSAxO1xuIFxuLVx0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHZjcHUpO1xuLVxuIFx0XHRyZXQgPSBrdm1fcmlzY3ZfY2hlY2tfdmNwdV9yZXF1ZXN0cyh2Y3B1KTtcbiBcdFx0aWYgKHJldCBcdTAwM2M9IDApXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdHByZWVtcHRfZGlzYWJsZSgpO1xuIFxuK1x0XHRrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdXBkYXRlKHZjcHUpO1xuK1xuIFx0XHQvKiBVcGRhdGUgQUlBIEhXIHN0YXRlIGJlZm9yZSBlbnRlcmluZyBndWVzdCAqL1xuIFx0XHRyZXQgPSBrdm1fcmlzY3ZfdmNwdV9haWFfdXBkYXRlKHZjcHUpO1xuIFx0XHRpZiAocmV0IFx1MDAzYz0gMCkge1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuaW5kZXggNTA2YTUxMGI2YmZmMy4uMWJlMzg2YTc4ZTI3ZiAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3JlcGxhY2UuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfcmVwbGFjZS5jXG5AQCAtMTA0LDcgKzEwNCw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuXG4gXHRcdGt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfRkVOQ0VfSV9TRU5UKTtcbiBcdFx0YnJlYWs7XG4gXHRjYXNlIFNCSV9FWFRfUkZFTkNFX1JFTU9URV9TRkVOQ0VfVk1BOlxuLVx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4gXHRcdGlmICgoY3AtXHUwMDNlYTIgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTMgPT0gMCkgfHwgY3AtXHUwMDNlYTMgPT0gLTFVTClcbiBcdFx0XHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYWxsKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssIHZtaWQpO1xuIFx0XHRlbHNlXG5AQCAtMTEzLDcgKzExMyw3IEBAIHN0YXRpYyBpbnQga3ZtX3NiaV9leHRfcmZlbmNlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuXG4gXHRcdGt2bV9yaXNjdl92Y3B1X3BtdV9pbmNyX2Z3KHZjcHUsIFNCSV9QTVVfRldfSEZFTkNFX1ZWTUFfU0VOVCk7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBTQklfRVhUX1JGRU5DRV9SRU1PVEVfU0ZFTkNFX1ZNQV9BU0lEOlxuLVx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdFx0dm1pZCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKGF0b21pYzY0X3JlYWQoXHUwMDI2dmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLmlkKSk7XG4gXHRcdGlmICgoY3AtXHUwMDNlYTIgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTMgPT0gMCkgfHwgY3AtXHUwMDNlYTMgPT0gLTFVTClcbiBcdFx0XHRrdm1fcmlzY3ZfaGZlbmNlX3Z2bWFfYXNpZF9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzayxcbiBcdFx0XHRcdFx0XHQgICAgICAgY3AtXHUwMDNlYTQsIHZtaWQpO1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZjcHVfc2JpX3YwMS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNcbmluZGV4IGRlNTQ0ZWEzZjI4ZGMuLmNhM2VmZTYzYzFjZjEgMTAwNjQ0XG4tLS0gYS9hcmNoL3Jpc2N2L2t2bS92Y3B1X3NiaV92MDEuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vdmNwdV9zYmlfdjAxLmNcbkBAIC04OCwxNCArODgsMTQgQEAgc3RhdGljIGludCBrdm1fc2JpX2V4dF92MDFfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4sXG4gXHRcdGlmIChjcC1cdTAwM2VhNyA9PSBTQklfRVhUXzBfMV9SRU1PVEVfRkVOQ0VfSSlcbiBcdFx0XHRrdm1fcmlzY3ZfZmVuY2VfaSh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrKTtcbiBcdFx0ZWxzZSBpZiAoY3AtXHUwMDNlYTcgPT0gU0JJX0VYVF8wXzFfUkVNT1RFX1NGRU5DRV9WTUEpIHtcbi1cdFx0XHR2bWlkID0gUkVBRF9PTkNFKHZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC52bWlkKTtcbitcdFx0XHR2bWlkID0ga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2h3aWQoYXRvbWljNjRfcmVhZChcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQuaWQpKTtcbiBcdFx0XHRpZiAoY3AtXHUwMDNlYTEgPT0gMCBcdTAwMjZcdTAwMjYgY3AtXHUwMDNlYTIgPT0gMClcbiBcdFx0XHRcdGt2bV9yaXNjdl9oZmVuY2VfdnZtYV9hbGwodmNwdS1cdTAwM2Vrdm0sIGhiYXNlLCBobWFzaywgdm1pZCk7XG4gXHRcdFx0ZWxzZVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2d2YSh2Y3B1LVx1MDAzZWt2bSwgaGJhc2UsIGhtYXNrLCBjcC1cdTAwM2VhMSxcbiBcdFx0XHRcdFx0XHRcdCAgY3AtXHUwMDNlYTIsIFBBR0VfU0hJRlQsIHZtaWQpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZtaWQgPSBSRUFEX09OQ0UodmNwdS1cdTAwM2Vrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQpO1xuK1x0XHRcdHZtaWQgPSBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZChhdG9taWM2NF9yZWFkKFx1MDAyNnZjcHUtXHUwMDNla3ZtLVx1MDAzZWFyY2gudm1pZC5pZCkpO1xuIFx0XHRcdGlmIChjcC1cdTAwM2VhMSA9PSAwIFx1MDAyNlx1MDAyNiBjcC1cdTAwM2VhMiA9PSAwKVxuIFx0XHRcdFx0a3ZtX3Jpc2N2X2hmZW5jZV92dm1hX2FzaWRfYWxsKHZjcHUtXHUwMDNla3ZtLCBoYmFzZSwgaG1hc2ssXG4gXHRcdFx0XHRcdFx0XHQgICAgICAgY3AtXHUwMDNlYTMsIHZtaWQpO1xuZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xuaW5kZXggYzE1YmRiMWRkOGJlZi4uZWVlODMwNmMxMjcwNyAxMDA2NDRcbi0tLSBhL2FyY2gvcmlzY3Yva3ZtL3ZtaWQuY1xuKysrIGIvYXJjaC9yaXNjdi9rdm0vdm1pZC5jXG5AQCAtNiwxMSArNiwxNSBAQFxuICAqICAgICBBbnVwIFBhdGVsIFx1MDAzY2FudXAucGF0ZWxAd2RjLmNvbVx1MDAzZVxuICAqL1xuIFxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdG1hcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVtYXNrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3BlcmNwdS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcHJlZW1wdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc21wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1faG9zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2Nzci5oXHUwMDNlXG5AQCAtMTgsMjYgKzIyLDU0IEBAXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2t2bV90bGIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9rdm1fdm1pZC5oXHUwMDNlXG4gXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgdm1pZF92ZXJzaW9uID0gMTtcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX25leHQ7XG4rc3RhdGljIGF0b21pYzY0X3Qgdm1pZF9nZW5lcmF0aW9uO1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bWlkX21hcDtcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2JpdHMgX19yb19hZnRlcl9pbml0O1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodm1pZF9sb2NrKTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWlkX2N1cl9pZHggPSAxO1xuK1xuK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHZtaWRfbG9jayk7XG4rXG4rc3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pYzY0X3QsIGFjdGl2ZV92bWlkcyk7XG4rc3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzZXJ2ZWRfdm1pZHMpO1xuK1xuK3N0YXRpYyBjcHVtYXNrX3QgdGxiX2ZsdXNoX3BlbmRpbmc7XG4rXG4rI2RlZmluZSBWTUlEX0ZJUlNUX1ZFUlNJT05cdEJJVF9VTEwodm1pZF9iaXRzKVxuKyNkZWZpbmUgTlVNX1ZNSURTXHRcdEJJVCh2bWlkX2JpdHMpXG4rI2RlZmluZSBWTUlEX0hXX01BU0tcdFx0KFZNSURfRklSU1RfVkVSU0lPTiAtIDEpXG4rXG4rc3RhdGljIGJvb2wgdm1pZF9nZW5fbWF0Y2godTY0IHZtaWQpXG4re1xuK1x0cmV0dXJuICEoKHZtaWQgXiBhdG9taWM2NF9yZWFkKFx1MDAyNnZtaWRfZ2VuZXJhdGlvbikpIFx1MDAzZVx1MDAzZSB2bWlkX2JpdHMpO1xuK31cbitcbit1bnNpZ25lZCBsb25nIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHU2NCB2bWlkKVxuK3tcbitcdGlmICghdm1pZF9iaXRzKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiAodW5zaWduZWQgbG9uZykodm1pZCBcdTAwMjYgVk1JRF9IV19NQVNLKTtcbit9XG4gXG4gdm9pZCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2RldGVjdCh2b2lkKVxuIHtcbi1cdC8qIEZpZ3VyZS1vdXQgbnVtYmVyIG9mIFZNSUQgYml0cyBpbiBIVyAqL1xuK1x0LyogRmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIFZNSUQgYml0cyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUuICovXG4gXHRjc3Jfd3JpdGUoQ1NSX0hHQVRQLCAoa3ZtX3Jpc2N2X2dzdGFnZV9tb2RlKGt2bV9yaXNjdl9nc3RhZ2VfbWF4X3BnZF9sZXZlbHMpIFx1MDAzY1x1MDAzY1xuLVx0XHRcdCAgICAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7XG4rXHRcdCAgIEhHQVRQX01PREVfU0hJRlQpIHwgSEdBVFBfVk1JRCk7XG4gXHR2bWlkX2JpdHMgPSBjc3JfcmVhZChDU1JfSEdBVFApO1xuIFx0dm1pZF9iaXRzID0gKHZtaWRfYml0cyBcdTAwMjYgSEdBVFBfVk1JRCkgXHUwMDNlXHUwMDNlIEhHQVRQX1ZNSURfU0hJRlQ7XG4gXHR2bWlkX2JpdHMgPSBmbHNfbG9uZyh2bWlkX2JpdHMpO1xuIFx0Y3NyX3dyaXRlKENTUl9IR0FUUCwgMCk7XG4gXG4tXHQvKiBXZSBwb2xsdXRlZCBsb2NhbCBUTEIgc28gZmx1c2ggYWxsIGd1ZXN0IFRMQiAqL1xuK1x0LyogRmx1c2ggdGhlIGxvY2FsIGd1ZXN0IFRMQiBhZnRlciBwcm9iaW5nIEhHQVRQLiAqL1xuIFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xuIFxuLVx0LyogV2UgZG9uJ3QgdXNlIFZNSUQgYml0cyBpZiB0aGV5IGFyZSBub3Qgc3VmZmljaWVudCAqL1xuLVx0aWYgKCgxVUwgXHUwMDNjXHUwMDNjIHZtaWRfYml0cykgXHUwMDNjIG51bV9wb3NzaWJsZV9jcHVzKCkpXG4rXHQvKlxuK1x0ICogVk1JRCAwIGlzIHJlc2VydmVkLiAgRHVyaW5nIHJvbGxvdmVyIGV2ZXJ5IHBvc3NpYmxlIENQVSBtYXlcbitcdCAqIHJlc2VydmUgb25lIGhhcmR3YXJlIFZNSUQsIGFuZCB3ZSBzdGlsbCBuZWVkIGF0IGxlYXN0IG9uZSBWTUlEXG4rXHQgKiBhdmFpbGFibGUgZm9yIGEgbmV3IGFsbG9jYXRpb24uXG4rXHQgKi9cbitcdGlmICh2bWlkX2JpdHMgXHUwMDI2XHUwMDI2IE5VTV9WTUlEUyAtIDEgXHUwMDNjPSBudW1fcG9zc2libGVfY3B1cygpKVxuIFx0XHR2bWlkX2JpdHMgPSAwO1xuIH1cbiBcbkBAIC00Niw4MCArNzgsMjk1IEBAIHVuc2lnbmVkIGxvbmcga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHModm9pZClcbiBcdHJldHVybiB2bWlkX2JpdHM7XG4gfVxuIFxuK2ludCBfX2luaXQga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2FsbG9jX2luaXQodm9pZClcbit7XG4rXHRpbnQgY3B1O1xuK1xuK1x0aWYgKCF2bWlkX2JpdHMpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0dm1pZF9tYXAgPSBiaXRtYXBfemFsbG9jKE5VTV9WTUlEUywgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIXZtaWRfbWFwKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdHZtaWRfY3VyX2lkeCA9IDE7XG4rXG4rXHQvKiBIYXJkd2FyZSBWTUlEIDAgaXMgcmVzZXJ2ZWQuICovXG4rXHRfX3NldF9iaXQoMCwgdm1pZF9tYXApO1xuK1xuK1x0YXRvbWljNjRfc2V0KFx1MDAyNnZtaWRfZ2VuZXJhdGlvbiwgVk1JRF9GSVJTVF9WRVJTSU9OKTtcbitcbitcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbitcdFx0YXRvbWljNjRfc2V0KFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcbitcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IDA7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRXZlcnkgQ1BVIHBlcmZvcm1zIGFuIGluaXRpYWwgbG9jYWwgaW52YWxpZGF0aW9uIGJlZm9yZSBpdHNcbitcdCAqIGZpcnN0IFZNSUQgYWN0aXZhdGlvbi5cbitcdCAqL1xuK1x0Y3B1bWFza19jb3B5KFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nLCBjcHVfcG9zc2libGVfbWFzayk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfYWxsb2NfZnJlZSh2b2lkKVxuK3tcbitcdGJpdG1hcF9mcmVlKHZtaWRfbWFwKTtcbitcdHZtaWRfbWFwID0gTlVMTDtcbit9XG4rXG4gaW50IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9pbml0KHN0cnVjdCBrdm0gKmt2bSlcbiB7XG4tXHQvKiBNYXJrIHRoZSBpbml0aWFsIFZNSUQgYW5kIFZNSUQgdmVyc2lvbiBpbnZhbGlkICovXG4tXHRrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWRfdmVyc2lvbiA9IDA7XG4tXHRrdm0tXHUwMDNlYXJjaC52bWlkLnZtaWQgPSAwO1xuK1x0YXRvbWljNjRfc2V0KFx1MDAyNmt2bS1cdTAwM2VhcmNoLnZtaWQuaWQsIDApO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuIGJvb2wga3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHN0cnVjdCBrdm1fdm1pZCAqdm1pZClcbiB7XG4rXHR1NjQgaWQ7XG4rXG4gXHRpZiAoIXZtaWRfYml0cylcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuLVx0cmV0dXJuIHVubGlrZWx5KFJFQURfT05DRSh2bWlkLVx1MDAzZXZtaWRfdmVyc2lvbikgIT1cbi1cdFx0XHRSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7XG4rXHRpZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2dm1pZC1cdTAwM2VpZCk7XG4rXG4rXHRyZXR1cm4gdW5saWtlbHkoIXZtaWRfZ2VuX21hdGNoKGlkKSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9fbG9jYWxfaGZlbmNlX2d2bWFfYWxsKHZvaWQgKmluZm8pXG4rLypcbisgKiBDYWxsZWQgd2l0aCB2bWlkX2xvY2sgaGVsZCBhZnRlciB2bWlkX2dlbmVyYXRpb24gaGFzIGFscmVhZHkgYmVlblxuKyAqIGFkdmFuY2VkLlxuKyAqXG4rICogTm8gcmVtb3RlIENQVSBpcyBpbnRlcnJ1cHRlZCBoZXJlLiAgSW5zdGVhZCwgcHJlc2VydmUgZXZlcnkgVk1JRFxuKyAqIHdoaWNoIG1heSBzdGlsbCBiZSB1c2VkIGJ5IGEgQ1BVIGFuZCBxdWV1ZSBhIGxvY2FsIGludmFsaWRhdGlvbiBmb3JcbisgKiB0aGF0IENQVSdzIG5leHQgVk1JRCBhY3RpdmF0aW9uLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGZsdXNoX2NvbnRleHQodm9pZClcbiB7XG4tXHRrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX2d2bWFfYWxsKCk7XG4rXHR1NjQgdm1pZDtcbitcdGludCBjcHU7XG4rXG4rXHRiaXRtYXBfemVybyh2bWlkX21hcCwgTlVNX1ZNSURTKTtcbitcdF9fc2V0X2JpdCgwLCB2bWlkX21hcCk7XG4rXG4rXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4rXHRcdHZtaWQgPSBhdG9taWM2NF94Y2hnKFx1MDAyNnBlcl9jcHUoYWN0aXZlX3ZtaWRzLCBjcHUpLCAwKTtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIENQVSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFuIGVhcmxpZXIgcm9sbG92ZXJcbitcdFx0ICogd2l0aG91dCBwZXJmb3JtaW5nIGFub3RoZXIgYWN0aXZhdGlvbiBzaW5jZSB0aGVuLiAgSW4gdGhhdFxuK1x0XHQgKiBjYXNlIHJlc2VydmVkX3ZtaWRzIGlzIHRoZSBvbmx5IHJlY29yZCBvZiB0aGUgb2xkIGNvbnRleHQuXG4rXHRcdCAqL1xuK1x0XHRpZiAoIXZtaWQpXG4rXHRcdFx0dm1pZCA9IHBlcl9jcHUocmVzZXJ2ZWRfdm1pZHMsIGNwdSk7XG4rXG4rXHRcdGlmICh2bWlkKVxuK1x0XHRcdF9fc2V0X2JpdChrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKSxcbitcdFx0XHRcdCAgdm1pZF9tYXApO1xuK1xuK1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gdm1pZDtcbitcdH1cbitcbitcdGNwdW1hc2tfY29weShcdTAwMjZ0bGJfZmx1c2hfcGVuZGluZywgY3B1X3Bvc3NpYmxlX21hc2spO1xuIH1cbiBcbi12b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuKy8qXG4rICogVXBkYXRlIGV2ZXJ5IHJlc2VydmVkIGNvcHkgb2YgYW4gb2xkIHNvZnR3YXJlIFZNSUQuXG4rICpcbisgKiBEbyBub3Qgc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2g6IHRoZSBzYW1lIFZNIG1heSBoYXZlIGJlZW4gYWN0aXZlXG4rICogb24gbW9yZSB0aGFuIG9uZSBDUFUgd2hlbiByb2xsb3ZlciBvY2N1cnJlZC5cbisgKi9cbitzdGF0aWMgYm9vbCBjaGVja191cGRhdGVfcmVzZXJ2ZWRfdm1pZCh1NjQgb2xkX3ZtaWQsIHU2NCBuZXdfdm1pZClcbiB7XG4tXHR1bnNpZ25lZCBsb25nIGk7XG4tXHRzdHJ1Y3Qga3ZtX3ZjcHUgKnY7XG4tXHRzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4rXHRib29sIGhpdCA9IGZhbHNlO1xuK1x0aW50IGNwdTtcbiBcbi1cdGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX3Zlcl9jaGFuZ2VkKHZtaWQpKVxuLVx0XHRyZXR1cm47XG4rXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4rXHRcdGlmIChwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID09IG9sZF92bWlkKSB7XG4rXHRcdFx0cGVyX2NwdShyZXNlcnZlZF92bWlkcywgY3B1KSA9IG5ld192bWlkO1xuK1x0XHRcdGhpdCA9IHRydWU7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldHVybiBoaXQ7XG4rfVxuK1xuKy8qXG4rICogQWxsb2NhdGUvcHJvbW90ZSBhIHNvZnR3YXJlIFZNSUQuXG4rICpcbisgKiB2bWlkX2xvY2sgbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIuXG4rICovXG4rc3RhdGljIHU2NCBuZXdfdm1pZF9sb2NrZWQoc3RydWN0IGt2bV92bWlkICprdm1fdm1pZClcbit7XG4rXHR1NjQgdm1pZCA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQpO1xuK1x0dTY0IGdlbmVyYXRpb24gPSBhdG9taWM2NF9yZWFkKFx1MDAyNnZtaWRfZ2VuZXJhdGlvbik7XG4rXHR1NjQgbmV3X3ZtaWQ7XG4rXHR1bnNpZ25lZCBsb25nIGlkeDtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZ2bWlkX2xvY2spO1xuK1x0aWYgKHZtaWQpIHtcbitcdFx0bmV3X3ZtaWQgPSBnZW5lcmF0aW9uIHxcbitcdFx0XHQgICBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfaHdpZCh2bWlkKTtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIG9sZCBWTUlEIGlzIHN0aWxsIHByb3RlY3RlZCBieSBvbmUgb3IgbW9yZSBDUFVzLlxuK1x0XHQgKiBLZWVwIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgYW5kIG9ubHkgcHJvbW90ZSBnZW5lcmF0aW9uLlxuK1x0XHQgKi9cbitcdFx0aWYgKGNoZWNrX3VwZGF0ZV9yZXNlcnZlZF92bWlkKHZtaWQsIG5ld192bWlkKSlcbitcdFx0XHRyZXR1cm4gbmV3X3ZtaWQ7XG4rXG4rXHRcdC8qXG4rXHRcdCAqIFRoZSBWTSBoYWQgYSBWTUlEIGluIGFuIG9sZGVyIGdlbmVyYXRpb24uICBSZXVzZSB0aGUgc2FtZVxuK1x0XHQgKiBoYXJkd2FyZSBudW1iZXIgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2xhaW1lZC5cbitcdFx0ICovXG4rXHRcdGlkeCA9IGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF9od2lkKHZtaWQpO1xuK1x0XHRpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChpZHgsIHZtaWRfbWFwKSlcbitcdFx0XHRyZXR1cm4gbmV3X3ZtaWQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRmluZCBhIGZyZWUgVk1JRCBpbiB0aGUgY3VycmVudCBnZW5lcmF0aW9uLlxuK1x0ICovXG4rXHRpZHggPSBmaW5kX25leHRfemVyb19iaXQodm1pZF9tYXAsIE5VTV9WTUlEUywgdm1pZF9jdXJfaWR4KTtcbitcdGlmIChpZHggIT0gTlVNX1ZNSURTKVxuK1x0XHRnb3RvIHNldF92bWlkO1xuK1xuK1x0LypcbitcdCAqIE5vIGZyZWUgVk1JRC4gIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24sIHByZXNlcnZlIGFsbCBDUFUtbG9jYWxcbitcdCAqIHVzZXJzLCBhbmQgZGVmZXIgZWFjaCBDUFUncyBmbHVzaCB1bnRpbCBpdHMgbmV4dCBhY3RpdmF0aW9uLlxuK1x0ICovXG4rXHRnZW5lcmF0aW9uICs9IFZNSURfRklSU1RfVkVSU0lPTjtcbitcbitcdC8qIFNvZnR3YXJlIFZNSUQgMCBpcyByZXNlcnZlZCBhcyB0aGUgaW52YWxpZCBpZGVudGlmaWVyLiAqL1xuK1x0aWYgKHVubGlrZWx5KCFnZW5lcmF0aW9uKSlcbitcdFx0Z2VuZXJhdGlvbiA9IFZNSURfRklSU1RfVkVSU0lPTjtcbitcbitcdGF0b21pYzY0X3hjaGcoXHUwMDI2dm1pZF9nZW5lcmF0aW9uLCBnZW5lcmF0aW9uKTtcbitcdGZsdXNoX2NvbnRleHQoKTtcbiBcbiBcdC8qXG4tXHQgKiBXZSBuZWVkIHRvIHJlLWNoZWNrIHRoZSB2bWlkX3ZlcnNpb24gaGVyZSB0byBlbnN1cmUgdGhhdCBpZlxuLVx0ICogYW5vdGhlciB2Y3B1IGFscmVhZHkgYWxsb2NhdGVkIGEgdmFsaWQgdm1pZCBmb3IgdGhpcyB2bS5cbitcdCAqIE5VTV9WTUlEUyAtIDEgXHUwMDNlIG51bV9wb3NzaWJsZV9jcHVzKCksIHRoZXJlZm9yZSByb2xsb3ZlciBtdXN0XG4rXHQgKiBsZWF2ZSBhdCBsZWFzdCBvbmUgYWxsb2NhdGFibGUgaGFyZHdhcmUgVk1JRC5cbiBcdCAqL1xuLVx0aWYgKCFrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfdmVyX2NoYW5nZWQodm1pZCkpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2dm1pZF9sb2NrKTtcbitcdGlkeCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2bWlkX21hcCwgTlVNX1ZNSURTLCAxKTtcbitcbitzZXRfdm1pZDpcbitcdF9fc2V0X2JpdChpZHgsIHZtaWRfbWFwKTtcbitcdHZtaWRfY3VyX2lkeCA9IGlkeDtcbitcbitcdHJldHVybiBnZW5lcmF0aW9uIHwgaWR4O1xuK31cbitcbit2b2lkIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuK3tcbitcdHN0cnVjdCBrdm1fdm1pZCAqa3ZtX3ZtaWQgPSBcdTAwMjZ2Y3B1LVx1MDAzZWt2bS1cdTAwM2VhcmNoLnZtaWQ7XG4rXHRhdG9taWM2NF90ICphY3RpdmU7XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuK1x0dTY0IHZtaWQ7XG4rXHR1NjQgb2xkX2FjdGl2ZV92bWlkO1xuK1x0dW5zaWduZWQgaW50IGNwdTtcbitcbitcdGlmICghdm1pZF9iaXRzKVxuIFx0XHRyZXR1cm47XG4tXHR9XG4gXG4tXHQvKiBGaXJzdCB1c2VyIG9mIGEgbmV3IFZNSUQgdmVyc2lvbj8gKi9cbi1cdGlmICh1bmxpa2VseSh2bWlkX25leHQgPT0gMCkpIHtcbi1cdFx0V1JJVEVfT05DRSh2bWlkX3ZlcnNpb24sIFJFQURfT05DRSh2bWlkX3ZlcnNpb24pICsgMSk7XG4tXHRcdHZtaWRfbmV4dCA9IDE7XG4rXHQvKlxuK1x0ICogYWN0aXZlX3ZtaWRzIGFuZCB0bGJfZmx1c2hfcGVuZGluZyBhcmUgcGVyLUNQVSBzdGF0ZS4gIEtlZXAgdGhlXG4rXHQgKiBjb21wbGV0ZSBWTUlEIGFjdGl2YXRpb24gb24gdGhlIHNhbWUgQ1BVLlxuK1x0ICovXG4rXHRsb2NrZGVwX2Fzc2VydF9wcmVlbXB0aW9uX2Rpc2FibGVkKCk7XG4rXG4rXHRjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7XG4rXHRhY3RpdmUgPSB0aGlzX2NwdV9wdHIoXHUwMDI2YWN0aXZlX3ZtaWRzKTtcbitcbitcdHZtaWQgPSBhdG9taWM2NF9yZWFkKFx1MDAyNmt2bV92bWlkLVx1MDAzZWlkKTtcbitcdG9sZF9hY3RpdmVfdm1pZCA9IGF0b21pYzY0X3JlYWQoYWN0aXZlKTtcbiBcbitcdC8qXG4rXHQgKiBGYXN0IHBhdGguXG4rXHQgKlxuK1x0ICogVGhlIGNtcHhjaGcgcmFjZXMgd2l0aCBmbHVzaF9jb250ZXh0KCkncyB4Y2hnIG9uIHRoZSBzYW1lXG4rXHQgKiBwZXItQ1BVIGF0b21pYy4gIEVpdGhlciB0aGlzIGFjdGl2YXRpb24gaXMgY2FwdHVyZWQgYnkgcm9sbG92ZXIsXG4rXHQgKiBvciByb2xsb3ZlciBjbGVhcnMgYWN0aXZlIGZpcnN0IGFuZCB0aGUgY21weGNoZyBmYWlscy5cbitcdCAqL1xuK1x0aWYgKG9sZF9hY3RpdmVfdm1pZCBcdTAwMjZcdTAwMjYgdm1pZF9nZW5fbWF0Y2godm1pZCkpIHtcbiBcdFx0Lypcbi1cdFx0ICogV2UgcmFuIG91dCBvZiBWTUlEcyBzbyB3ZSBpbmNyZW1lbnQgdm1pZF92ZXJzaW9uIGFuZFxuLVx0XHQgKiBzdGFydCBhc3NpZ25pbmcgVk1JRHMgZnJvbSAxLlxuLVx0XHQgKlxuLVx0XHQgKiBUaGlzIGFsc28gbWVhbnMgZXhpc3RpbmcgVk1JRHMgYXNzaWdubWVudCB0byBhbGwgR3Vlc3Rcbi1cdFx0ICogaW5zdGFuY2VzIGlzIGludmFsaWQgYW5kIHdlIGhhdmUgZm9yY2UgVk1JRCByZS1hc3NpZ25lbWVudFxuLVx0XHQgKiBmb3IgYWxsIEd1ZXN0IGluc3RhbmNlcy4gVGhlIEd1ZXN0IGluc3RhbmNlcyB0aGF0IHdlcmUgbm90XG4tXHRcdCAqIHJ1bm5pbmcgd2lsbCBhdXRvbWF0aWNhbGx5IHBpY2stdXAgbmV3IFZNSURzIGJlY2F1c2Ugd2lsbFxuLVx0XHQgKiBjYWxsIGt2bV9yaXNjdl9nc3RhZ2Vfdm1pZF91cGRhdGUoKSB3aGVuZXZlciB0aGV5IGVudGVyXG4tXHRcdCAqIGluLWtlcm5lbCBydW4gbG9vcC4gRm9yIEd1ZXN0IGluc3RhbmNlcyB0aGF0IGFyZSBhbHJlYWR5XG4tXHRcdCAqIHJ1bm5pbmcsIHdlIGZvcmNlIFZNIGV4aXRzIG9uIGFsbCBob3N0IENQVXMgdXNpbmcgSVBJIGFuZFxuLVx0XHQgKiBmbHVzaCBhbGwgR3Vlc3QgVExCcy5cbitcdFx0ICogSEdBVFAgbXVzdCBjb250YWluIHRoZSBzYW1lIGhhcmR3YXJlIFZNSUQgdGhhdCBpcyBwdWJsaXNoZWRcbitcdFx0ICogaW4gYWN0aXZlX3ZtaWRzLlxuIFx0XHQgKi9cbi1cdFx0b25fZWFjaF9jcHVfbWFzayhjcHVfb25saW5lX21hc2ssIF9fbG9jYWxfaGZlbmNlX2d2bWFfYWxsLFxuLVx0XHRcdFx0IE5VTEwsIDEpO1xuK1x0XHRpZiAob2xkX2FjdGl2ZV92bWlkICE9IHZtaWQpXG4rXHRcdFx0a3ZtX3Jpc2N2X21tdV91cGRhdGVfaGdhdHBfdm1pZCh2Y3B1LCB2bWlkKTtcbitcbitcdFx0aWYgKGF0b21pYzY0X2NtcHhjaGcoYWN0aXZlLCBvbGRfYWN0aXZlX3ZtaWQsIHZtaWQpID09XG4rXHRcdCAgICBvbGRfYWN0aXZlX3ZtaWQpXG4rXHRcdFx0cmV0dXJuO1xuIFx0fVxuIFxuLVx0dm1pZC1cdTAwM2V2bWlkID0gdm1pZF9uZXh0O1xuLVx0dm1pZF9uZXh0Kys7XG4tXHR2bWlkX25leHQgXHUwMDI2PSAoMSBcdTAwM2NcdTAwM2Mgdm1pZF9iaXRzKSAtIDE7XG4rXHRyYXdfc3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dm1pZF9sb2NrLCBmbGFncyk7XG4gXG4tXHRXUklURV9PTkNFKHZtaWQtXHUwMDNldm1pZF92ZXJzaW9uLCBSRUFEX09OQ0Uodm1pZF92ZXJzaW9uKSk7XG4rXHQvKlxuK1x0ICogUmUtcmVhZCB1bmRlciB0aGUgYWxsb2NhdG9yIGxvY2sgYmVjYXVzZSBhbm90aGVyIHZDUFUgb2YgdGhpcyBWTVxuK1x0ICogbWF5IGFscmVhZHkgaGF2ZSBwcm9tb3RlZCBvciBhbGxvY2F0ZWQgdGhlIHNoYXJlZCBWTUlELlxuK1x0ICovXG4rXHR2bWlkID0gYXRvbWljNjRfcmVhZChcdTAwMjZrdm1fdm1pZC1cdTAwM2VpZCk7XG4rXG4rXHRpZiAoIXZtaWRfZ2VuX21hdGNoKHZtaWQpKSB7XG4rXHRcdHZtaWQgPSBuZXdfdm1pZF9sb2NrZWQoa3ZtX3ZtaWQpO1xuK1x0XHRhdG9taWM2NF9zZXQoXHUwMDI2a3ZtX3ZtaWQtXHUwMDNlaWQsIHZtaWQpO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIENvbXBsZXRlIHRoaXMgQ1BVJ3MgZGVmZXJyZWQgcm9sbG92ZXIgaW52YWxpZGF0aW9uIGJlZm9yZVxuK1x0ICogaW5zdGFsbGluZyB0aGUgbmV3IGhhcmR3YXJlIFZNSUQuXG4rXHQgKi9cbitcdGlmIChjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsIFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKSlcbitcdFx0a3ZtX3Jpc2N2X2xvY2FsX2hmZW5jZV9ndm1hX2FsbCgpO1xuK1xuK1x0LypcbitcdCAqIEluc3RhbGwgdGhlIGN1cnJlbnQgaGFyZHdhcmUgVk1JRCBiZWZvcmUgcHVibGlzaGluZyB0aGlzIENQVSBhc1xuK1x0ICogYWN0aXZlIHdpdGggdGhlIG5ldyBzb2Z0d2FyZSBWTUlELlxuK1x0ICovXG4rXHRrdm1fcmlzY3ZfbW11X3VwZGF0ZV9oZ2F0cF92bWlkKHZjcHUsIHZtaWQpO1xuK1xuK1x0LypcbitcdCAqIE9uY2UgYWN0aXZlX3ZtaWRzIGlzIHZpc2libGUsIHRoZSByZXF1aXJlZCBsb2NhbCBpbnZhbGlkYXRpb24gYW5kXG4rXHQgKiBIR0FUUCB1cGRhdGUgYXJlIGNvbXBsZXRlLlxuK1x0ICovXG4rXHRhdG9taWM2NF9zZXQoYWN0aXZlLCB2bWlkKTtcbitcbitcdHJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNnZtaWRfbG9jaywgZmxhZ3MpO1xuK31cbiBcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnZtaWRfbG9jayk7XG4rLypcbisgKiBDUFUgdmlydHVhbGl6YXRpb24vQ1NSIHN0YXRlIGlzIGJlaW5nIGRpc2NhcmRlZC5cbisgKlxuKyAqIFdpdGhkcmF3IGZhc3QtcGF0aCBlbGlnaWJpbGl0eSwgYnV0IGNvbnNlcnZhdGl2ZWx5IHByZXNlcnZlIHRoZSBsYXN0XG4rICogaWRlbnRpdHkgaW5zdGVhZCBvZiBtYWtpbmcgaXRzIGhhcmR3YXJlIFZNSUQgaW1tZWRpYXRlbHkgcmV1c2FibGUuXG4rICovXG4rdm9pZCBrdm1fcmlzY3ZfZ3N0YWdlX3ZtaWRfY3B1X2ludmFsaWRhdGUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuK1x0dTY0IHZtaWQ7XG4rXHR1bnNpZ25lZCBpbnQgY3B1O1xuK1xuK1x0aWYgKCF2bWlkX2JpdHMpXG4rXHRcdHJldHVybjtcbitcbitcdGxvY2tkZXBfYXNzZXJ0X3ByZWVtcHRpb25fZGlzYWJsZWQoKTtcbitcbitcdGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTtcbitcbitcdHJhd19zcGluX2xvY2tfaXJxc2F2ZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbitcbitcdHZtaWQgPSBhdG9taWM2NF94Y2hnKHRoaXNfY3B1X3B0cihcdTAwMjZhY3RpdmVfdm1pZHMpLCAwKTtcbitcbitcdGlmICh2bWlkKVxuK1x0XHRwZXJfY3B1KHJlc2VydmVkX3ZtaWRzLCBjcHUpID0gdm1pZDtcbitcbitcdC8qXG4rXHQgKiBJZiBhY3RpdmUgd2FzIGFscmVhZHkgemVybywgcmV0YWluIHRoZSBvbGQgcmVzZXJ2ZWQgZW50cnkuXG4rXHQgKi9cbitcdGNwdW1hc2tfc2V0X2NwdShjcHUsIFx1MDAyNnRsYl9mbHVzaF9wZW5kaW5nKTtcbiBcbi1cdC8qIFJlcXVlc3QgRy1zdGFnZSBwYWdlIHRhYmxlIHVwZGF0ZSBmb3IgYWxsIFZDUFVzICovXG4tXHRrdm1fZm9yX2VhY2hfdmNwdShpLCB2LCB2Y3B1LVx1MDAzZWt2bSlcbi1cdFx0a3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1VQREFURV9IR0FUUCwgdik7XG4rXHRyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ2bWlkX2xvY2ssIGZsYWdzKTtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNjoyMDo0NC4yNzYxMzI3WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTU2NjMxMjIxNzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIFBhdGNoIGZvciBGdXp6aW5nIFN1aXRhYmlsaXR5KipcblxuT2theSwgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBwYXRjaC4gSXQncyB0b3VjaGluZyBhIGJ1bmNoIG9mIGZpbGVzIHVuZGVyIGBhcmNoL3Jpc2N2L2AsIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIEtWTSDigJMgYGt2bV9nc3RhZ2UuaGAsIGBrdm1fbW11LmhgLCBga3ZtX3ZtaWQuaGAsIGFuZCB2YXJpb3VzIGAuY2AgZmlsZXMgaW4gYGt2bS9gLiAgSGFuZyBvbiwgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBgYW1kNjRgPyAgUmlnaHQsIHNvIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgZnV6emFibGUgb24gYW1kNjQuXG5cbkxldCdzIHF1aWNrbHkgcmVmZXJlbmNlIHRoZSBuZWdhdGl2ZSBjcml0ZXJpYS4gVGhlIGtleSBwb2ludCBpcyBcIkNvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cIiAgQW5kIHllcCwgdGhlIHRhcmdldCBpcyBhbWQ2NCwgYW5kICphbGwqIHRoZSBjaGFuZ2VkIGZpbGVzIGFyZSBpbiBgYXJjaC9yaXNjdi9gLiAgVGhpcyBpcyBhIHNsYW0gZHVuay4gIFJJU0MtViBLVk0gY29kZSBpcyAqbm90KiBjb21waWxlZCBvciByZWFjaGFibGUgb24gYW1kNjQsIHNvIGl0J3MgaXJyZWxldmFudCBmb3IgZnV6emluZyBvbiB0aGlzIGFyY2hpdGVjdHVyZS4gSSd2ZSBkb3VibGUtY2hlY2tlZCB0aGUgZ2l0IGRpZmYganVzdCB0byBiZSBjb21wbGV0ZWx5IHN1cmU7IGV2ZXJ5IHNpbmdsZSBmaWxlIHJlc2lkZXMgdW5kZXIgdGhlIGBhcmNoL3Jpc2N2L2AgZGlyZWN0b3J5LlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGZhbGxzIHNxdWFyZWx5IHVuZGVyIHRoZSBcInVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoc1wiIGNyaXRlcmlhLiAgU3BlY2lmaWNhbGx5LCBpdCdzIGNvZGUgZXhjbHVzaXZlIHRvIGEgZGlmZmVyZW50IGFyY2hpdGVjdHVyZSwgd2hpY2ggaXMgdGhlIG5lZ2F0aXZlIGNyaXRlcmlvbi4gVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGlzbid0IHdvcnRoIGZ1enppbmcgb24gYW1kNjQuXG5cbkJhc2VkIG9uIHRoYXQsIEkgY2FuIGRlZmluaXRpdmVseSBzZXQgYFdvcnRoRnV6emluZ2AgdG8gYGZhbHNlYC4gU2luY2UgdGhpcyBpcyB1bnJlYWNoYWJsZSwgbm8gc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgb3Igc3ltYm9scyBhcmUgcmVsZXZhbnQuIFRodXMsIGBFbmFibGVDb25maWdzYCBhbmQgYEZvY3VzU3ltYm9sc2Agd2lsbCBiZSBlbXB0eSBsaXN0cy4gQW5kIG15IHJlYXNvbmluZyB3aWxsIGJlIGNvbmNpc2U6IFwiQWxsIGNoYW5nZXMgYXJlIGNvbmZpbmVkIHRvIGBhcmNoL3Jpc2N2L2AgKFJJU0MtViBLVk0gaW1wbGVtZW50YXRpb24pLCB3aGljaCBpcyBleGNsdXNpdmUgdG8gdGhlIFJJU0MtViBhcmNoaXRlY3R1cmUuIFNpbmNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgYW5kIGNhbm5vdCBiZSBmdXp6ZWQuXCIgIEkganVzdCB2ZXJpZmllZCB0aGUgZmllbGRzIGZyb20gdGhlIHNldC1yZXN1bHRzIHdpdGggYEVuYWJsZUNvbmZpZ3M6IFtdYCwgYEZvY3VzU3ltYm9sczogW11gLCBgUmVhc29uaW5nOiBcIkFsbCBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byBhcmNoL3Jpc2N2LyAoUklTQy1WIEtWTSBpbXBsZW1lbnRhdGlvbiksIHdoaWNoIGlzIGV4Y2x1c2l2ZSB0byB0aGUgUklTQy1WIGFyY2hpdGVjdHVyZS4gU2luY2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBhbmQgY2Fubm90IGJlIGZ1enplZC5cImAgYW5kIGBXb3J0aEZ1enppbmc6IGZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIzMTEsIk91dHB1dFRva2VucyI6NzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4ODAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNjoyMDo1OS45MzkyNTgxMTNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwNzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiQWxsIG1vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGFyY2gvcmlzY3YvIChSSVNDLVYgS1ZNIHN1YnN5c3RlbSkuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGV4Y2x1c2l2ZSB0byBSSVNDLVYgYW5kIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiQWxsIG1vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGFyY2gvcmlzY3YvIChSSVNDLVYgS1ZNIHN1YnN5c3RlbSkuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQsIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGV4Y2x1c2l2ZSB0byBSSVNDLVYgYW5kIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE2OjIwOjU5LjkzOTI4Mzk1M1oiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflowbvbzv[1] Phase: Running StartedAt: 2026-09-11 16:21:11 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbvbzv[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-11 16:21:11 +0000 UTC FinishedAt: 2026-09-11 16:21:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}