Name: series-workflowlzzkd Phase: Succeeded StartedAt: 2026-09-03 18:52:23 +0000 UTC FinishedAt: 2026-09-03 22:46:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[0] Phase: Succeeded StartedAt: 2026-09-03 18:52:23 +0000 UTC FinishedAt: 2026-09-03 19:09:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[0].run-triage Phase: Succeeded StartedAt: 2026-09-03 18:52:23 +0000 UTC FinishedAt: 2026-09-03 19:09:13 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "e539025ff1f7351a42788c5a88aab59c26f5131b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "NUMA" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "e539025ff1f7351a42788c5a88aab59c26f5131b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "NUMA" ], "series_id": "78619b4c-8664-4bef-833f-0917bd20ca92" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "kvm_gmem_create", "kvm_gmem_bind_node", "mempolicy_create", "mpol_set_shared_policy_range", "mpol_set_shared_policy" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtOVU1BJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7a3ZtX2dtZW1fY3JlYXRlJiMzNDssCiAgICAmIzM0O2t2bV9nbWVtX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDttZW1wb2xpY3lfY3JlYXRlJiMzNDssCiAgICAmIzM0O21wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UmIzM0OywKICAgICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZyBpbiBLVk0mIzM5O3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cblxuS01TQU4gdnMgS0FTQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cbi0gSW4gdGhpcyBwYXRjaCwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCByZWFkcyB1c2VyIGFyZ3VtZW50cyB2aWEgYGNvcHlfZnJvbV91c2VyYCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBpbnRlZ2VyOyBubyBrZXJuZWwgc3RydWN0dXJlcywgcGFkZGluZywgb3IgYnVmZmVycyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZS5cbi0gQWxsIG5ld2x5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgc3RhY2sgYW5kIGhlYXAgdmFyaWFibGVzIChlLmcuLCBgbm9kZW1hc2tfdCBub2Rlc2AgaW5pdGlhbGl6ZWQgdmlhIGBpbml0X25vZGVtYXNrX29mX25vZGUoKWAsIGBzY3JhdGNoYCBpbml0aWFsaXplZCB2aWEgYE5PREVNQVNLX1NDUkFUQ0goKWAsIGFuZCBgc3RydWN0IHNwX25vZGVgL2BzdHJ1Y3QgbWVtcG9saWN5YCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRocm91Z2ggc3RhbmRhcmQgbW0gaGVscGVycykgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cbi0gQW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgTlVNQSBwb2xpY3kgcmVmZXJlbmNlIGNvdW50aW5nLCBsaWZlY3ljbGUgaXNzdWVzLCBvciBhbGxvY2F0aW9uIGZhaWx1cmVzKSBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIHRoZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSBmbGFnIGluIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGFuZCBhZGRzIHRoZSBtZW1wb2xpY3kgaGVscGVycyBtZW1wb2xpY3lfY3JlYXRlKCkgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKS4gVGhlc2UgY2hhbmdlcyBtb2RpZnkgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBpbiBtbS9tZW1wb2xpY3kuYyBhbmQgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYWU2ODk1NWE1OTIzZDI1ZTllMGFmOTU2OTQzMDU3OWU5NGM0MGY5ZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDMgMTk6MDc6MTUgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG5pbmRleCAwM2JmYzkyODY0YjZlLi43MzhlMjc2NjMzYzFlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhcbkBAIC03MzksNiAmIzQzOzczOSw5IEBAIHN0YXRpYyBpbmxpbmUgdTY0IGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moc3RydWN0IGt2bSAqa3ZtKVxuIFx0aWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKVxuIFx0XHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEO1xuIFxuJiM0MztcdGlmIChJU19FTkFCTEVEKENPTkZJR19OVU1BKSlcbiYjNDM7XHRcdGZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFO1xuJiM0MztcbiBcdHJldHVybiBmbGFncztcbiB9XG4gI2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbmluZGV4IDY1YzczMmQ0NDBkMmYuLjM5ODMxODE3NWNlYzcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG5AQCAtMTI0LDEwICYjNDM7MTI0LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpO1xuIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiBpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4mIzQzO1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiB2b2lkIG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCk7XG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0XHRcdCAgICBwZ29mZl90IGlkeCk7XG4gXG4mIzQzO3N0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeV9jcmVhdGUodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgbm9kZW1hc2tfdCAqbm9kZXMpO1xuJiM0MztcbiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTtcbiBzdHJ1Y3QgbWVtcG9saWN5ICpfX2dldF92bWFfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHBnb2ZmX3QgKmlseCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG5pbmRleCBhYzJkNzdkMTQ5NjM1Li44ZDNhZTdlMmVhZDhlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbkBAIC0xNjU4LDExICYjNDM7MTY1OCwxNCBAQCBzdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHtcbiAjZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcdF9JT1dSKEtWTUlPLCAgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpXG4gI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcdFx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXG4gI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEXHQoMVVMTCBcdTAwM2NcdTAwM2MgMSlcbiYjNDM7I2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERVx0KDFVTEwgXHUwMDNjXHUwMDNjIDIpXG4gXG4gc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQge1xuIFx0X191NjQgc2l6ZTtcbiBcdF9fdTY0IGZsYWdzO1xuLVx0X191NjQgcmVzZXJ2ZWRbNl07XG4mIzQzO1x0X191MzIgbm9kZTtcbiYjNDM7XHRfX3UzMiBwYWQ7XG4mIzQzO1x0X191NjQgcmVzZXJ2ZWRbNV07XG4gfTtcbiBcbiAjZGVmaW5lIEtWTV9QUkVfRkFVTFRfTUVNT1JZXHRfSU9XUihLVk1JTywgMHhkNSwgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5KVxuZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmNcbmluZGV4IDJhZDBhNWYxODI4MGEuLmNlMTBjZTQzNzQ2NDMgMTAwNjQ0XG4tLS0gYS9tbS9tZW1wb2xpY3kuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtcG9saWN5LmNcbkBAIC0xMDg1LDcgJiM0MzsxMDg1LDQ1IEBAIHN0YXRpYyBpbnQgbWJpbmRfcmFuZ2Uoc3RydWN0IHZtYV9pdGVyYXRvciAqdm1pLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTtcbiB9XG4gXG4tLyogU2V0IHRoZSBwcm9jZXNzIG1lbW9yeSBwb2xpY3kgKi9cbiYjNDM7LyoqXG4mIzQzOyAqIG1lbXBvbGljeV9jcmVhdGUgLSBidWlsZCBhIHZhbGlkYXRlZCwgY3B1c2V0LWNvbnRleHR1YWxpc2VkIG1lbXBvbGljeVxuJiM0MzsgKiBAbW9kZTogTVBPTF8qIG1vZGVcbiYjNDM7ICogQGZsYWdzOiBNUE9MX0ZfKiBmbGFnc1xuJiM0MzsgKiBAbm9kZXM6IHRhcmdldCBub2RlbWFzaywgb3IgTlVMTCAoaW50ZXJwcmV0ZWQgcGVyIEBtb2RlOyBzZWUgbXBvbF9uZXcoKSlcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlcyBhIG5ldyBwb2xpY3kgYW5kIGNvbnN0cmFpbnMgaXQgdG8gdGhlIHRhc2smIzM5O3MgY3B1c2V0LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuJiM0MztcdFx0bm9kZW1hc2tfdCAqbm9kZXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4mIzQzO1x0Tk9ERU1BU0tfU0NSQVRDSChzY3JhdGNoKTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAoIXNjcmF0Y2gpXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiYjNDM7XG4mIzQzO1x0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcbiYjNDM7XHRpZiAoSVNfRVJSKHBvbCkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0dGFza19sb2NrKGN1cnJlbnQpO1xuJiM0MztcdGVyciA9IG1wb2xfc2V0X25vZGVtYXNrKHBvbCwgbm9kZXMsIHNjcmF0Y2gpO1xuJiM0MztcdHRhc2tfdW5sb2NrKGN1cnJlbnQpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdG1wb2xfcHV0KHBvbCk7XG4mIzQzO1x0XHRwb2wgPSBFUlJfUFRSKGVycik7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xuJiM0MztcdHJldHVybiBwb2w7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtZW1wb2xpY3lfY3JlYXRlLCBcJiMzNDtrdm1cJiMzNDspO1xuJiM0MztcbiBzdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuIFx0XHRcdCAgICAgbm9kZW1hc2tfdCAqbm9kZXMpXG4ge1xuQEAgLTMyNzQsMjQgJiM0MzszMzEyLDQ3IEBAIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2hhcmVkX3BvbGljeV9pbml0LCBcJiMzNDtrdm1cJiMzNDspO1xuIFxuLWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbi1cdFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuJiM0MzsvKipcbiYjNDM7ICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxuJiM0MzsgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWVcbiYjNDM7ICogQHN0YXJ0OiBmaXJzdCBwYWdlIG9mZnNldCAoaW5jbHVzaXZlKVxuJiM0MzsgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSlcbiYjNDM7ICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZVxuJiM0MzsgKlxuJiM0MzsgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS5cbiYjNDM7ICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LlxuJiM0MzsgKlxuJiM0MzsgKiBVbmxpa2UgbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgpLCBubyBWTUEgaXMgcmVxdWlyZWQsIHNvIGEgcmFuZ2UgdGhhdFxuJiM0MzsgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4mIzQzO1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4ge1xuLVx0Y29uc3QgcGdvZmZfdCBwZ29mZiA9IHZtYV9zdGFydF9wZ29mZih2bWEpO1xuLVx0Y29uc3QgcGdvZmZfdCBwZ29mZl9lbmQgPSB2bWFfZW5kX3Bnb2ZmKHZtYSk7XG4gXHRzdHJ1Y3Qgc3Bfbm9kZSAqbmV3ID0gTlVMTDtcbiBcdGludCBlcnI7XG4gXG4gXHRpZiAocG9sKSB7XG4tXHRcdG5ldyA9IHNwX2FsbG9jKHBnb2ZmLCBwZ29mZl9lbmQsIHBvbCk7XG4mIzQzO1x0XHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xuIFx0XHRpZiAoIW5ldylcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdH1cbi1cdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgcGdvZmYsIHBnb2ZmX2VuZCwgbmV3KTtcbiYjNDM7XHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XG4gXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG4gXHRcdHNwX2ZyZWUobmV3KTtcbiBcdHJldHVybiBlcnI7XG4gfVxuJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UsIFwmIzM0O2t2bVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4mIzQzO1x0XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVx1MDAzZXZtX3Bnb2ZmLFxuJiM0MztcdFx0XHRcdFx0ICAgdm1hLVx1MDAzZXZtX3Bnb2ZmICYjNDM7IHZtYV9wYWdlcyh2bWEpLCBwb2wpO1xuJiM0Mzt9XG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5LCBcJiMzNDtrdm1cJiMzNDspO1xuIFxuIC8qIEZyZWUgYSBiYWNraW5nIHBvbGljeSBzdG9yZSBvbiBpbm9kZSBkZWxldGUuICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcbmluZGV4IDIyMzNkODcxYTM4ZjQuLmIzMzNjYjQyZmFiMjkgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jXG5AQCAtMjUsNiAmIzQzOzI1LDMxIEBAXG4gXG4gc3RhdGljIHNpemVfdCBwYWdlX3NpemU7XG4gXG4mIzQzO3N0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgIHUzMiBub2RlLCB1MzIgcGFkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgZ3Vlc3RfbWVtZmQgPSB7XG4mIzQzO1x0XHQuc2l6ZSA9IHNpemUsXG4mIzQzO1x0XHQuZmxhZ3MgPSBmbGFncyxcbiYjNDM7XHRcdC5ub2RlID0gbm9kZSxcbiYjNDM7XHRcdC5wYWQgPSBwYWQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFx1MDAyNmd1ZXN0X21lbWZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBjcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsIHUzMiBub2RlKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRpZiAoIShmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpKVxuJiM0MztcdFx0cmV0dXJuIHZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgc2l6ZSwgZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHNpemUsIGZsYWdzLCBub2RlLCAwKTtcbiYjNDM7XHRURVNUX0FTU0VSVChmZCBcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xuJiM0MztcdHJldHVybiBmZDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCB0ZXN0X2ZpbGVfcmVhZF93cml0ZShpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKVxuIHtcbiBcdGNoYXIgYnVmWzY0XTtcbkBAIC0xNzEsNiAmIzQzOzE5Niw4MyBAQCBzdGF0aWMgdm9pZCB0ZXN0X251bWFfYWxsb2NhdGlvbihpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKVxuIFx0a3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgaGFzX2JpbmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiB2bV9jaGVja19jYXAodm0sIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MpIFx1MDAyNlxuJiM0MztcdCAgICAgICBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGVfaW52YWxpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRpZiAoIWhhc19iaW5kX25vZGUodm0pKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHQgICAgICAgZmxhZ3MgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSwgMCwgMSk7XG4mIzQzO1x0VEVTVF9BU1NFUlQoZmQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCxcbiYjNDM7XHRcdCAgICBcJiMzNDtndWVzdF9tZW1mZCgpIHdpdGggbm9uLXplcm8gcGFkIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIDEgXHUwMDNjXHUwMDNjIDIwLCAwKTtcbiYjNDM7XHRURVNUX0FTU0VSVChmZCBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRUlOVkFMLFxuJiM0MztcdFx0ICAgIFwmIzM0O2d1ZXN0X21lbWZkKCkgd2l0aCBvdXQtb2YtcmFuZ2Ugbm9kZSBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLCBmbGFncywgMSwgMCk7XG4mIzQzO1x0VEVTVF9BU1NFUlQoZmQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCxcbiYjNDM7XHRcdCAgICBcJiMzNDtndWVzdF9tZW1mZCgpIHdpdGggYSBub2RlIGJ1dCBubyBCSU5EX05PREUgZmxhZyBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUsIGludCBub2RlKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBvdGhlcl9tYXNrID0gMVVMIFx1MDAzY1x1MDAzYyAobm9kZSA/IDAgOiAxKTtcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIG1heG5vZGUgPSBCSVRTX1BFUl9UWVBFKG90aGVyX21hc2spO1xuJiM0MztcdGJvb2wgc3RlZXJfYXdheSA9IGlzX211bHRpX251bWFfbm9kZV9zeXN0ZW0oKTtcbiYjNDM7XHR2b2lkICpwYWdlc1s0XTtcbiYjNDM7XHRpbnQgc3RhdHVzWzRdO1xuJiM0MztcdGNoYXIgKm1lbTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0bWVtID0ga3ZtX21tYXAodG90YWxfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQpO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0cGFnZXNbaV0gPSBtZW0gJiM0MzsgcGFnZV9zaXplICogaTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBCaW5kIG9uIGEgZGlmZmVyZW50IG5vZGUgaWYgcG9zc2libGUgb3JkZXIgdG8gY2hlY2sgd2hldGhlciBmYXVsdGluZ1xuJiM0MztcdCAqIGhhcHBlbnMgYXMgZGVzaXJlZC4gV2l0aG91dCBhIHNlY29uZCBub2RlIHVzZSB0aGUgbG9jYWwgbm9kZSBhbmRcbiYjNDM7XHQgKiBqdXN0IGdldCBjb3ZlcmFnZSBvZiBjcmVhdGUvbW1hcC9mYXVsdCBwYXRocy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoc3RlZXJfYXdheSlcbiYjNDM7XHRcdGt2bV9zZXRfbWVtcG9saWN5KE1QT0xfQklORCwgXHUwMDI2b3RoZXJfbWFzaywgbWF4bm9kZSk7XG4mIzQzO1xuJiM0MztcdC8qIERlbGliZXJhdGVseSBubyBtYmluZCgpIG9uIHRoaXMgbWFwcGluZy4gKi9cbiYjNDM7XHRtZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRURVNUX0FTU0VSVChzdGF0dXNbaV0gPT0gbm9kZSxcbiYjNDM7XHRcdFx0ICAgIFwmIzM0O0V4cGVjdGVkIHBhZ2UgJWQgb24gbm9kZSAlZCwgZ290IGl0IG9uIG5vZGUgJWRcJiMzNDssXG4mIzQzO1x0XHRcdCAgICBpLCBub2RlLCBzdGF0dXNbaV0pO1xuJiM0MztcbiYjNDM7XHQvKiBEcm9wcGVkIG1lbW9yeSBzaG91bGQgZmF1bHQgYmFjayBvbnRvIHRoZSBzYW1lIG5vZGUgKi9cbiYjNDM7XHRrdm1fZmFsbG9jYXRlKGZkLCBGQUxMT0NfRkxfUFVOQ0hfSE9MRSB8IEZBTExPQ19GTF9LRUVQX1NJWkUsIDAsXG4mIzQzO1x0XHQgICAgICB0b3RhbF9zaXplKTtcbiYjNDM7XHRtZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRURVNUX0FTU0VSVChzdGF0dXNbaV0gPT0gbm9kZSxcbiYjNDM7XHRcdFx0ICAgIFwmIzM0O0V4cGVjdGVkIHBhZ2UgJWQgYmFjayBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZFwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIGksIG5vZGUsIHN0YXR1c1tpXSk7XG4mIzQzO1xuJiM0MztcdGlmIChzdGVlcl9hd2F5KVxuJiM0MztcdFx0a3ZtX3NldF9tZW1wb2xpY3koTVBPTF9ERUZBVUxULCBOVUxMLCAwKTtcbiYjNDM7XG4mIzQzO1x0a3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIHRlc3RfY29sbGFwc2UoaW50IGZkLCB1NjQgZmxhZ3MpXG4ge1xuIFx0Y29uc3Qgc2l6ZV90IHBtZF9zaXplID0gZ2V0X3RyYW5zX2h1Z2VwYWdlc3ooKTtcbkBAIC00MDQsNiAmIzQzOzUwNiwxMCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKVxuIFx0aW50IGZkO1xuIFxuIFx0Zm9yIChmbGFnID0gQklUKDApOyBmbGFnOyBmbGFnIFx1MDAzY1x1MDAzYz0gMSkge1xuJiM0MztcdFx0LyogQklORF9OT0RFIGRlcGVuZHMgb24gYSB2YWxpZCBub2RlIGZpZWxkLCB0ZXN0IHNlcGFyYXRlbHkgKi9cbiYjNDM7XHRcdGlmIChmbGFnID09IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4gXHRcdGZkID0gX192bV9jcmVhdGVfZ3Vlc3RfbWVtZmQodm0sIHBhZ2Vfc2l6ZSwgZmxhZyk7XG4gXHRcdGlmIChmbGFnIFx1MDAyNiB2YWxpZF9mbGFncykge1xuIFx0XHRcdFRFU1RfQVNTRVJUKGZkIFx1MDAzZT0gMCxcbkBAIC00MTgsMzAgJiM0Mzs1MjQsNDAgQEAgc3RhdGljIHZvaWQgdGVzdF9ndWVzdF9tZW1mZF9mbGFncyhzdHJ1Y3Qga3ZtX3ZtICp2bSlcbiBcdH1cbiB9XG4gXG4tI2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGFyZ3MuLi4pXHRcXFxuLWRvIHtcdFx0XHRcdFx0XHRcdFx0XHRcXFxuLVx0aW50IGZkID0gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzKTtcdFxcXG4tXHRcdFx0XHRcdFx0XHRcdFx0XFxcbi1cdHRlc3RfIyNfX3Rlc3QoYXJncyk7XHRcdFx0XHRcdFx0XFxcbi1cdGNsb3NlKGZkKTtcdFx0XHRcdFx0XHRcdFxcXG4mIzQzOyNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUsIGFyZ3MuLi4pIFxcXG4mIzQzO2RvIHtcdFx0XHRcdFx0XHRcdFx0XHQgICBcXFxuJiM0MztcdGludCBmZCA9IGNyZWF0ZV9ndWVzdF9tZW1mZChfX3ZtLCBfX2dtZW1fc2l6ZSwgX19mbGFncywgX19ub2RlKTsgICBcXFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0XHQgICBcXFxuJiM0MztcdHRlc3RfIyNfX3Rlc3QoYXJncyk7XHRcdFx0XHRcdFx0ICAgXFxcbiYjNDM7XHRjbG9zZShmZCk7XHRcdFx0XHRcdFx0XHQgICBcXFxuIH0gd2hpbGUgKDApXG4gXG4gI2RlZmluZSBfX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKVx0XHRcdFxcXG4tXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGZkLCBfX2dtZW1fc2l6ZSlcbiYjNDM7XHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsIGZkLCBfX2dtZW1fc2l6ZSlcbiBcbiAjZGVmaW5lIGdtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXHRcdFx0XHRcXFxuIFx0X19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KVxuIFxuICNkZWZpbmUgX19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcdFx0XFxcbi1cdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX192bSwgZmQsIF9fZ21lbV9zaXplKVxuJiM0MztcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgMCxcdFx0XFxcbiYjNDM7XHRcdCAgICAgIF9fdm0sIGZkLCBfX2dtZW1fc2l6ZSlcbiBcbiAjZGVmaW5lIGdtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXHRcdFx0XHRcXFxuIFx0X19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KVxuIFxuJiM0MzsjZGVmaW5lIF9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX19ub2RlKVx0XFxcbiYjNDM7XHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSxcdFx0XHRcdFx0XFxcbiYjNDM7XHRcdCAgICAgIChfX2ZsYWdzKSB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFx0XHRcXFxuJiM0MztcdFx0ICAgICAgX19nbWVtX3NpemUsIF9fbm9kZSwgZmQsIF9fZ21lbV9zaXplLCBfX25vZGUpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIGdtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgX19ub2RlKVx0XHRcdFxcXG4mIzQzO1x0X19nbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIHBhZ2Vfc2l6ZSAqIDQsIF9fbm9kZSlcbiYjNDM7XG4gc3RhdGljIHZvaWQgX190ZXN0X2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgZmxhZ3MpXG4ge1xuIFx0dGVzdF9jcmVhdGVfZ3Vlc3RfbWVtZmRfbXVsdGlwbGUodm0pO1xuIFx0dGVzdF9jcmVhdGVfZ3Vlc3RfbWVtZmRfaW52YWxpZF9zaXplcyh2bSwgZmxhZ3MpO1xuJiM0MztcdHRlc3RfYmluZF9ub2RlX2ludmFsaWQodm0sIGZsYWdzKTtcbiBcbiBcdGdtZW1fdGVzdChmaWxlX3JlYWRfd3JpdGUsIHZtLCBmbGFncyk7XG4gXG5AQCAtNDUyLDYgJiM0Mzs1NjgsOCBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcbiBcdFx0XHRnbWVtX3Rlc3QobW1hcF9zdXBwb3J0ZWQsIHZtLCBmbGFncyk7XG4gXHRcdFx0Z21lbV90ZXN0KGZhdWx0X292ZXJmbG93LCB2bSwgZmxhZ3MpO1xuIFx0XHRcdGdtZW1fdGVzdChudW1hX2FsbG9jYXRpb24sIHZtLCBmbGFncyk7XG4mIzQzO1x0XHRcdGlmIChoYXNfYmluZF9ub2RlKHZtKSlcbiYjNDM7XHRcdFx0XHRnbWVtX3Rlc3Rfbm9kZShiaW5kX25vZGUsIHZtLCBmbGFncywgMCk7XG4gXHRcdFx0X19nbWVtX3Rlc3QoY29sbGFwc2UsIHZtLCBmbGFncywgcG1kX3NpemUpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdGdtZW1fdGVzdChmYXVsdF9wcml2YXRlLCB2bSwgZmxhZ3MpO1xuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCA2MjVlNjJlMWEwMzE4Li5kYzlmMDcxZGQ5NjliIDEwMDY0NFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuQEAgLTQyMyw2ICYjNDM7NDIzLDMxIEBAIHN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICprdm1fZ21lbV9nZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0ICovXG4gXHRyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgcGdvZmYpO1xuIH1cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xuJiM0MztcdG5vZGVtYXNrX3Qgbm9kZXM7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuJiM0MztcdHBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCBcdTAwMjZub2Rlcyk7XG4mIzQzO1x0aWYgKElTX0VSUihwb2wpKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgMCxcbiYjNDM7XHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbiYjNDM7XHRtcG9sX3B1dChwb2wpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7I2Vsc2VcbiYjNDM7c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7fVxuICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0ge1xuQEAgLTUyMCw3ICYjNDM7NTQ1LDcgQEAgYm9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXG4mIzQzO3N0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzLCBpbnQgbm9kZSlcbiB7XG4gXHRzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9IFwmIzM0O1trdm0tZ21lbV1cJiMzNDs7XG4gXHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xuQEAgLTU2MSw2ICYjNDM7NTg2LDEyIEBAIHN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxuIFxuIFx0R01FTV9JKGlub2RlKS1cdTAwM2VmbGFncyA9IGZsYWdzO1xuIFxuJiM0MztcdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbiYjNDM7XHRcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XG4mIzQzO1x0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRnb3RvIGVycl9pbm9kZTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0ZmlsZSA9IGFsbG9jX2ZpbGVfcHNldWRvKGlub2RlLCBrdm1fZ21lbV9tbnQsIG5hbWUsIE9fUkRXUiwgXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XG4gXHRpZiAoSVNfRVJSKGZpbGUpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoZmlsZSk7XG5AQCAtNTkzLDYgJiM0Mzs2MjQsNyBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4ge1xuIFx0bG9mZl90IHNpemUgPSBhcmdzLVx1MDAzZXNpemU7XG4gXHR1NjQgZmxhZ3MgPSBhcmdzLVx1MDAzZWZsYWdzO1xuJiM0MztcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuIFxuIFx0aWYgKGZsYWdzIFx1MDAyNiB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC02MDAsNyAmIzQzOzYzMiwxNSBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4gXHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xuJiM0MztcdFx0aWYgKGFyZ3MtXHUwMDNlcGFkIHx8IGFyZ3MtXHUwMDNlbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHRub2RlID0gYXJncy1cdTAwM2Vub2RlO1xuJiM0MztcdH0gZWxzZSBpZiAoYXJncy1cdTAwM2Vub2RlIHx8IGFyZ3MtXHUwMDNlcGFkKSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzLCBub2RlKTtcbiB9XG4gXG4gaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtOVU1BJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7a3ZtX2dtZW1fY3JlYXRlJiMzNDssCiAgICAmIzM0O2t2bV9nbWVtX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDttZW1wb2xpY3lfY3JlYXRlJiMzNDssCiAgICAmIzM0O21wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UmIzM0OywKICAgICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIE5VTUEgbm9kZSBiaW5kaW5nIHN1cHBvcnQgZm9yIEtWTSBndWVzdF9tZW1mZCB2aWEgdGhlIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIGZsYWcgaW4gS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgYW5kIGFkZHMgdGhlIG1lbXBvbGljeSBoZWxwZXJzIG1lbXBvbGljeV9jcmVhdGUoKSBhbmQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSgpLiBUaGVzZSBjaGFuZ2VzIG1vZGlmeSByZWFjaGFibGUga2VybmVsIGxvZ2ljIGluIG1tL21lbXBvbGljeS5jIGFuZCB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBhZTY4OTU1YTU5MjNkMjVlOWUwYWY5NTY5NDMwNTc5ZTk0YzQwZjlmCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMyAxOTowNzoxNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAppbmRleCAwM2JmYzkyODY0YjZlLi43MzhlMjc2NjMzYzFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCkBAIC03MzksNiAmIzQzOzczOSw5IEBAIHN0YXRpYyBpbmxpbmUgdTY0IGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moc3RydWN0IGt2bSAqa3ZtKQogCWlmICgha3ZtIHx8IGt2bV9hcmNoX3N1cHBvcnRzX2dtZW1faW5pdF9zaGFyZWQoa3ZtKSkKIAkJZmxhZ3MgfD0gR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRDsKIAomIzQzOwlpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQSkpCiYjNDM7CQlmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTsKJiM0MzsKIAlyZXR1cm4gZmxhZ3M7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IDY1YzczMmQ0NDBkMmYuLjM5ODMxODE3NWNlYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTI0LDEwICYjNDM7MTI0LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpOwogdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpOwogaW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAogCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpOwomIzQzO2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCwKJiM0MzsJCQkJIHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTsKIHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKTsKIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAogCQkJCQkgICAgcGdvZmZfdCBpZHgpOwogCiYjNDM7c3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncywKJiM0MzsJCQkJICAgbm9kZW1hc2tfdCAqbm9kZXMpOwomIzQzOwogc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBzdHJ1Y3QgbWVtcG9saWN5ICpfX2dldF92bWFfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIGFkZHIsIHBnb2ZmX3QgKmlseCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmggYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgKaW5kZXggYWMyZDc3ZDE0OTYzNS4uOGQzYWU3ZTJlYWQ4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaApAQCAtMTY1OCwxMSAmIzQzOzE2NTgsMTQgQEAgc3RydWN0IGt2bV9tZW1vcnlfYXR0cmlidXRlcyB7CiAjZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQJX0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCkKICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQCQkoMVVMTCAmbHQ7Jmx0OyAwKQogI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVECSgxVUxMICZsdDsmbHQ7IDEpCiYjNDM7I2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERQkoMVVMTCAmbHQ7Jmx0OyAyKQogCiBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCB7CiAJX191NjQgc2l6ZTsKIAlfX3U2NCBmbGFnczsKLQlfX3U2NCByZXNlcnZlZFs2XTsKJiM0MzsJX191MzIgbm9kZTsKJiM0MzsJX191MzIgcGFkOwomIzQzOwlfX3U2NCByZXNlcnZlZFs1XTsKIH07CiAKICNkZWZpbmUgS1ZNX1BSRV9GQVVMVF9NRU1PUlkJX0lPV1IoS1ZNSU8sIDB4ZDUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSkKZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggMmFkMGE1ZjE4MjgwYS4uY2UxMGNlNDM3NDY0MyAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtcG9saWN5LmMKQEAgLTEwODUsNyAmIzQzOzEwODUsNDUgQEAgc3RhdGljIGludCBtYmluZF9yYW5nZShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCXJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTsKIH0KIAotLyogU2V0IHRoZSBwcm9jZXNzIG1lbW9yeSBwb2xpY3kgKi8KJiM0MzsvKioKJiM0MzsgKiBtZW1wb2xpY3lfY3JlYXRlIC0gYnVpbGQgYSB2YWxpZGF0ZWQsIGNwdXNldC1jb250ZXh0dWFsaXNlZCBtZW1wb2xpY3kKJiM0MzsgKiBAbW9kZTogTVBPTF8qIG1vZGUKJiM0MzsgKiBAZmxhZ3M6IE1QT0xfRl8qIGZsYWdzCiYjNDM7ICogQG5vZGVzOiB0YXJnZXQgbm9kZW1hc2ssIG9yIE5VTEwgKGludGVycHJldGVkIHBlciBAbW9kZTsgc2VlIG1wb2xfbmV3KCkpCiYjNDM7ICoKJiM0MzsgKiBDcmVhdGVzIGEgbmV3IHBvbGljeSBhbmQgY29uc3RyYWlucyBpdCB0byB0aGUgdGFzayYjMzk7cyBjcHVzZXQuCiYjNDM7ICoKJiM0MzsgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgcG9saWN5IChOVUxMIGZvciBhIGRlZmF1bHQgcG9saWN5KSwgb3IgYW4gRVJSX1BUUiBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeV9jcmVhdGUodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsCiYjNDM7CQlub2RlbWFza190ICpub2RlcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1wb2xpY3kgKnBvbDsKJiM0MzsJTk9ERU1BU0tfU0NSQVRDSChzY3JhdGNoKTsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKCFzY3JhdGNoKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiYjNDM7CiYjNDM7CXBvbCA9IG1wb2xfbmV3KG1vZGUsIGZsYWdzLCBub2Rlcyk7CiYjNDM7CWlmIChJU19FUlIocG9sKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwl0YXNrX2xvY2soY3VycmVudCk7CiYjNDM7CWVyciA9IG1wb2xfc2V0X25vZGVtYXNrKHBvbCwgbm9kZXMsIHNjcmF0Y2gpOwomIzQzOwl0YXNrX3VubG9jayhjdXJyZW50KTsKJiM0MzsJaWYgKGVycikgewomIzQzOwkJbXBvbF9wdXQocG9sKTsKJiM0MzsJCXBvbCA9IEVSUl9QVFIoZXJyKTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJTk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpOwomIzQzOwlyZXR1cm4gcG9sOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsICYjMzQ7a3ZtJiMzNDspOwomIzQzOwogc3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncywKIAkJCSAgICAgbm9kZW1hc2tfdCAqbm9kZXMpCiB7CkBAIC0zMjc0LDI0ICYjNDM7MzMxMiw0NyBAQCB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCkKIH0KIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zaGFyZWRfcG9saWN5X2luaXQsICYjMzQ7a3ZtJiMzNDspOwogCi1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCi0JCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKQomIzQzOy8qKgomIzQzOyAqIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgLSBpbnN0YWxsIEBwb2wgb3ZlciBbQHN0YXJ0LCBAZW5kKSBvZiBAc3AKJiM0MzsgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWUKJiM0MzsgKiBAc3RhcnQ6IGZpcnN0IHBhZ2Ugb2Zmc2V0IChpbmNsdXNpdmUpCiYjNDM7ICogQGVuZDogICBsYXN0IHBhZ2Ugb2Zmc2V0IChleGNsdXNpdmUpCiYjNDM7ICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZQomIzQzOyAqCiYjNDM7ICogSW5zdGFsbHMgQHBvbCBvdmVyIHRoZSBnaXZlbiByYW5nZSwgcmVwbGFjaW5nIGFueSBvdmVybGFwcGluZyBwb2xpY3kuCiYjNDM7ICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLgomIzQzOyAqCiYjNDM7ICogVGhlIHBvbGljeSBpcyBub3QgcmVjb25zdHJ1Y3RlZCwgc28gdGhlIHBvbGljeSBpcyBwcmVzZXJ2ZWQgZXhhY3RseS4KJiM0MzsgKgomIzQzOyAqIFVubGlrZSBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCksIG5vIFZNQSBpcyByZXF1aXJlZCwgc28gYSByYW5nZSB0aGF0CiYjNDM7ICogaXMgbmV2ZXIgbWFwcGVkIGludG8gYSBWTUEgY2FuIGJlIGNvdmVyZWQsIGluY2x1ZGluZyB0aGUgd2hvbGUgZmlsZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsCiYjNDM7CQkJCSBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKQogewotCWNvbnN0IHBnb2ZmX3QgcGdvZmYgPSB2bWFfc3RhcnRfcGdvZmYodm1hKTsKLQljb25zdCBwZ29mZl90IHBnb2ZmX2VuZCA9IHZtYV9lbmRfcGdvZmYodm1hKTsKIAlzdHJ1Y3Qgc3Bfbm9kZSAqbmV3ID0gTlVMTDsKIAlpbnQgZXJyOwogCiAJaWYgKHBvbCkgewotCQluZXcgPSBzcF9hbGxvYyhwZ29mZiwgcGdvZmZfZW5kLCBwb2wpOwomIzQzOwkJbmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTsKIAkJaWYgKCFuZXcpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZXJyID0gc2hhcmVkX3BvbGljeV9yZXBsYWNlKHNwLCBwZ29mZiwgcGdvZmZfZW5kLCBuZXcpOwomIzQzOwllcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7CiAJaWYgKGVyciAmYW1wOyZhbXA7IG5ldykKIAkJc3BfZnJlZShuZXcpOwogCXJldHVybiBlcnI7CiB9CiYjNDM7RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlLCAmIzM0O2t2bSYjMzQ7KTsKJiM0MzsKJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCiYjNDM7CQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbCkKJiM0Mzt7CiYjNDM7CXJldHVybiBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHNwLCB2bWEtJmd0O3ZtX3Bnb2ZmLAomIzQzOwkJCQkJICAgdm1hLSZndDt2bV9wZ29mZiAmIzQzOyB2bWFfcGFnZXModm1hKSwgcG9sKTsKJiM0Mzt9CiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3ksICYjMzQ7a3ZtJiMzNDspOwogCiAvKiBGcmVlIGEgYmFja2luZyBwb2xpY3kgc3RvcmUgb24gaW5vZGUgZGVsZXRlLiAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMKaW5kZXggMjIzM2Q4NzFhMzhmNC4uYjMzM2NiNDJmYWIyOSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jCkBAIC0yNSw2ICYjNDM7MjUsMzEgQEAKIAogc3RhdGljIHNpemVfdCBwYWdlX3NpemU7CiAKJiM0MztzdGF0aWMgaW50IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsCiYjNDM7CQkJCSAgICAgdTMyIG5vZGUsIHUzMiBwYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZCA9IHsKJiM0MzsJCS5zaXplID0gc2l6ZSwKJiM0MzsJCS5mbGFncyA9IGZsYWdzLAomIzQzOwkJLm5vZGUgPSBub2RlLAomIzQzOwkJLnBhZCA9IHBhZCwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsICZhbXA7Z3Vlc3RfbWVtZmQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncywgdTMyIG5vZGUpCiYjNDM7ewomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWlmICghKGZsYWdzICZhbXA7IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSkKJiM0MzsJCXJldHVybiB2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQodm0sIHNpemUsIGZsYWdzKTsKJiM0MzsKJiM0MzsJZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7CiYjNDM7CVRFU1RfQVNTRVJUKGZkICZndDs9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpOwomIzQzOwlyZXR1cm4gZmQ7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdGVzdF9maWxlX3JlYWRfd3JpdGUoaW50IGZkLCBzaXplX3QgdG90YWxfc2l6ZSkKIHsKIAljaGFyIGJ1Zls2NF07CkBAIC0xNzEsNiAmIzQzOzE5Niw4MyBAQCBzdGF0aWMgdm9pZCB0ZXN0X251bWFfYWxsb2NhdGlvbihpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKQogCWt2bV9tdW5tYXAobWVtLCB0b3RhbF9zaXplKTsKIH0KIAomIzQzO3N0YXRpYyBib29sIGhhc19iaW5kX25vZGUoc3RydWN0IGt2bV92bSAqdm0pCiYjNDM7ewomIzQzOwlyZXR1cm4gdm1fY2hlY2tfY2FwKHZtLCBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTKSAmYW1wOwomIzQzOwkgICAgICAgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlX2ludmFsaWQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncykKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJaWYgKCFoYXNfYmluZF9ub2RlKHZtKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsCiYjNDM7CQkJCSAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLCAwLCAxKTsKJiM0MzsJVEVTVF9BU1NFUlQoZmQgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gPT0gRUlOVkFMLAomIzQzOwkJICAgICYjMzQ7Z3Vlc3RfbWVtZmQoKSB3aXRoIG5vbi16ZXJvIHBhZCBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTCYjMzQ7KTsKJiM0MzsKJiM0MzsJZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsCiYjNDM7CQkJCSAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLAomIzQzOwkJCQkgICAgICAgMSAmbHQ7Jmx0OyAyMCwgMCk7CiYjNDM7CVRFU1RfQVNTRVJUKGZkICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vID09IEVJTlZBTCwKJiM0MzsJCSAgICAmIzM0O2d1ZXN0X21lbWZkKCkgd2l0aCBvdXQtb2YtcmFuZ2Ugbm9kZSBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTCYjMzQ7KTsKJiM0MzsKJiM0MzsJZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsIGZsYWdzLCAxLCAwKTsKJiM0MzsJVEVTVF9BU1NFUlQoZmQgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gPT0gRUlOVkFMLAomIzQzOwkJICAgICYjMzQ7Z3Vlc3RfbWVtZmQoKSB3aXRoIGEgbm9kZSBidXQgbm8gQklORF9OT0RFIGZsYWcgc2hvdWxkIGZhaWwgd2l0aCBFSU5WQUwmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUsIGludCBub2RlKQomIzQzO3sKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBvdGhlcl9tYXNrID0gMVVMICZsdDsmbHQ7IChub2RlID8gMCA6IDEpOwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIG1heG5vZGUgPSBCSVRTX1BFUl9UWVBFKG90aGVyX21hc2spOwomIzQzOwlib29sIHN0ZWVyX2F3YXkgPSBpc19tdWx0aV9udW1hX25vZGVfc3lzdGVtKCk7CiYjNDM7CXZvaWQgKnBhZ2VzWzRdOwomIzQzOwlpbnQgc3RhdHVzWzRdOwomIzQzOwljaGFyICptZW07CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwltZW0gPSBrdm1fbW1hcCh0b3RhbF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0OyBpJiM0MzsmIzQzOykKJiM0MzsJCXBhZ2VzW2ldID0gbWVtICYjNDM7IHBhZ2Vfc2l6ZSAqIGk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEJpbmQgb24gYSBkaWZmZXJlbnQgbm9kZSBpZiBwb3NzaWJsZSBvcmRlciB0byBjaGVjayB3aGV0aGVyIGZhdWx0aW5nCiYjNDM7CSAqIGhhcHBlbnMgYXMgZGVzaXJlZC4gV2l0aG91dCBhIHNlY29uZCBub2RlIHVzZSB0aGUgbG9jYWwgbm9kZSBhbmQKJiM0MzsJICoganVzdCBnZXQgY292ZXJhZ2Ugb2YgY3JlYXRlL21tYXAvZmF1bHQgcGF0aHMuCiYjNDM7CSAqLwomIzQzOwlpZiAoc3RlZXJfYXdheSkKJiM0MzsJCWt2bV9zZXRfbWVtcG9saWN5KE1QT0xfQklORCwgJmFtcDtvdGhlcl9tYXNrLCBtYXhub2RlKTsKJiM0MzsKJiM0MzsJLyogRGVsaWJlcmF0ZWx5IG5vIG1iaW5kKCkgb24gdGhpcyBtYXBwaW5nLiAqLwomIzQzOwltZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTsKJiM0MzsKJiM0MzsJa3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0OyBpJiM0MzsmIzQzOykKJiM0MzsJCVRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLAomIzQzOwkJCSAgICAmIzM0O0V4cGVjdGVkIHBhZ2UgJWQgb24gbm9kZSAlZCwgZ290IGl0IG9uIG5vZGUgJWQmIzM0OywKJiM0MzsJCQkgICAgaSwgbm9kZSwgc3RhdHVzW2ldKTsKJiM0MzsKJiM0MzsJLyogRHJvcHBlZCBtZW1vcnkgc2hvdWxkIGZhdWx0IGJhY2sgb250byB0aGUgc2FtZSBub2RlICovCiYjNDM7CWt2bV9mYWxsb2NhdGUoZmQsIEZBTExPQ19GTF9QVU5DSF9IT0xFIHwgRkFMTE9DX0ZMX0tFRVBfU0laRSwgMCwKJiM0MzsJCSAgICAgIHRvdGFsX3NpemUpOwomIzQzOwltZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTsKJiM0MzsKJiM0MzsJa3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0OyBpJiM0MzsmIzQzOykKJiM0MzsJCVRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLAomIzQzOwkJCSAgICAmIzM0O0V4cGVjdGVkIHBhZ2UgJWQgYmFjayBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZCYjMzQ7LAomIzQzOwkJCSAgICBpLCBub2RlLCBzdGF0dXNbaV0pOwomIzQzOwomIzQzOwlpZiAoc3RlZXJfYXdheSkKJiM0MzsJCWt2bV9zZXRfbWVtcG9saWN5KE1QT0xfREVGQVVMVCwgTlVMTCwgMCk7CiYjNDM7CiYjNDM7CWt2bV9tdW5tYXAobWVtLCB0b3RhbF9zaXplKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCB0ZXN0X2NvbGxhcHNlKGludCBmZCwgdTY0IGZsYWdzKQogewogCWNvbnN0IHNpemVfdCBwbWRfc2l6ZSA9IGdldF90cmFuc19odWdlcGFnZXN6KCk7CkBAIC00MDQsNiAmIzQzOzUwNiwxMCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKQogCWludCBmZDsKIAogCWZvciAoZmxhZyA9IEJJVCgwKTsgZmxhZzsgZmxhZyAmbHQ7Jmx0Oz0gMSkgewomIzQzOwkJLyogQklORF9OT0RFIGRlcGVuZHMgb24gYSB2YWxpZCBub2RlIGZpZWxkLCB0ZXN0IHNlcGFyYXRlbHkgKi8KJiM0MzsJCWlmIChmbGFnID09IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwogCQlmZCA9IF9fdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHZtLCBwYWdlX3NpemUsIGZsYWcpOwogCQlpZiAoZmxhZyAmYW1wOyB2YWxpZF9mbGFncykgewogCQkJVEVTVF9BU1NFUlQoZmQgJmd0Oz0gMCwKQEAgLTQxOCwzMCAmIzQzOzUyNCw0MCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKQogCX0KIH0KIAotI2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGFyZ3MuLi4pCVwKLWRvIHsJCQkJCQkJCQlcCi0JaW50IGZkID0gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzKTsJXAotCQkJCQkJCQkJXAotCXRlc3RfIyNfX3Rlc3QoYXJncyk7CQkJCQkJXAotCWNsb3NlKGZkKTsJCQkJCQkJXAomIzQzOyNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUsIGFyZ3MuLi4pIFwKJiM0MztkbyB7CQkJCQkJCQkJICAgXAomIzQzOwlpbnQgZmQgPSBjcmVhdGVfZ3Vlc3RfbWVtZmQoX192bSwgX19nbWVtX3NpemUsIF9fZmxhZ3MsIF9fbm9kZSk7ICAgXAomIzQzOwkJCQkJCQkJCSAgIFwKJiM0MzsJdGVzdF8jI19fdGVzdChhcmdzKTsJCQkJCQkgICBcCiYjNDM7CWNsb3NlKGZkKTsJCQkJCQkJICAgXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBfX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKQkJCVwKLQlfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGZkLCBfX2dtZW1fc2l6ZSkKJiM0MzsJX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCAwLCBmZCwgX19nbWVtX3NpemUpCiAKICNkZWZpbmUgZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncykJCQkJXAogCV9fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNCkKIAogI2RlZmluZSBfX2dtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKQkJXAotCV9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX192bSwgZmQsIF9fZ21lbV9zaXplKQomIzQzOwlfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsCQlcCiYjNDM7CQkgICAgICBfX3ZtLCBmZCwgX19nbWVtX3NpemUpCiAKICNkZWZpbmUgZ21lbV90ZXN0X3ZtKF9fdGVzdCwgX192bSwgX19mbGFncykJCQkJXAogCV9fZ21lbV90ZXN0X3ZtKF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNCkKIAomIzQzOyNkZWZpbmUgX19nbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUpCVwKJiM0MzsJX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sCQkJCQlcCiYjNDM7CQkgICAgICAoX19mbGFncykgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSwJCVwKJiM0MzsJCSAgICAgIF9fZ21lbV9zaXplLCBfX25vZGUsIGZkLCBfX2dtZW1fc2l6ZSwgX19ub2RlKQomIzQzOwomIzQzOyNkZWZpbmUgZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX25vZGUpCQkJXAomIzQzOwlfX2dtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNCwgX19ub2RlKQomIzQzOwogc3RhdGljIHZvaWQgX190ZXN0X2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgZmxhZ3MpCiB7CiAJdGVzdF9jcmVhdGVfZ3Vlc3RfbWVtZmRfbXVsdGlwbGUodm0pOwogCXRlc3RfY3JlYXRlX2d1ZXN0X21lbWZkX2ludmFsaWRfc2l6ZXModm0sIGZsYWdzKTsKJiM0MzsJdGVzdF9iaW5kX25vZGVfaW52YWxpZCh2bSwgZmxhZ3MpOwogCiAJZ21lbV90ZXN0KGZpbGVfcmVhZF93cml0ZSwgdm0sIGZsYWdzKTsKIApAQCAtNDUyLDYgJiM0Mzs1NjgsOCBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncykKIAkJCWdtZW1fdGVzdChtbWFwX3N1cHBvcnRlZCwgdm0sIGZsYWdzKTsKIAkJCWdtZW1fdGVzdChmYXVsdF9vdmVyZmxvdywgdm0sIGZsYWdzKTsKIAkJCWdtZW1fdGVzdChudW1hX2FsbG9jYXRpb24sIHZtLCBmbGFncyk7CiYjNDM7CQkJaWYgKGhhc19iaW5kX25vZGUodm0pKQomIzQzOwkJCQlnbWVtX3Rlc3Rfbm9kZShiaW5kX25vZGUsIHZtLCBmbGFncywgMCk7CiAJCQlfX2dtZW1fdGVzdChjb2xsYXBzZSwgdm0sIGZsYWdzLCBwbWRfc2l6ZSk7CiAJCX0gZWxzZSB7CiAJCQlnbWVtX3Rlc3QoZmF1bHRfcHJpdmF0ZSwgdm0sIGZsYWdzKTsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCmluZGV4IDYyNWU2MmUxYTAzMTguLmRjOWYwNzFkZDk2OWIgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwpAQCAtNDIzLDYgJiM0Mzs0MjMsMzEgQEAgc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKmt2bV9nbWVtX2dldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJICovCiAJcmV0dXJuIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoJmFtcDtHTUVNX0koaW5vZGUpLSZndDtwb2xpY3ksIHBnb2ZmKTsKIH0KJiM0MzsKJiM0MztzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1wb2xpY3kgKnBvbDsKJiM0MzsJbm9kZW1hc2tfdCBub2RlczsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKCh1bnNpZ25lZCBpbnQpbm9kZSAmZ3Q7PSBNQVhfTlVNTk9ERVMpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaW5pdF9ub2RlbWFza19vZl9ub2RlKCZhbXA7bm9kZXMsIG5vZGUpOwomIzQzOwlwb2wgPSBtZW1wb2xpY3lfY3JlYXRlKE1QT0xfQklORCwgMCwgJmFtcDtub2Rlcyk7CiYjNDM7CWlmIChJU19FUlIocG9sKSkKJiM0MzsJCXJldHVybiBQVFJfRVJSKHBvbCk7CiYjNDM7CiYjNDM7CWVyciA9IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoJmFtcDtHTUVNX0koaW5vZGUpLSZndDtwb2xpY3ksIDAsCiYjNDM7CQkJCQkgIE1BWF9MRlNfRklMRVNJWkUgJmd0OyZndDsgUEFHRV9TSElGVCwgcG9sKTsKJiM0MzsJbXBvbF9wdXQocG9sKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7I2Vsc2UKJiM0MztzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSkKJiM0Mzt7CiYjNDM7CXJldHVybiAtRUlOVkFMOwomIzQzO30KICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9nbWVtX3ZtX29wcyA9IHsKQEAgLTUyMCw3ICYjNDM7NTQ1LDcgQEAgYm9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pCiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKQomIzQzO3N0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAlzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICYjMzQ7W2t2bS1nbWVtXSYjMzQ7OwogCXN0cnVjdCBnbWVtX2ZpbGUgKmY7CkBAIC01NjEsNiAmIzQzOzU4NiwxMiBAQCBzdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncykKIAogCUdNRU1fSShpbm9kZSktJmd0O2ZsYWdzID0gZmxhZ3M7CiAKJiM0MzsJaWYgKGZsYWdzICZhbXA7IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7CiYjNDM7CQllcnIgPSBrdm1fZ21lbV9iaW5kX25vZGUoaW5vZGUsIG5vZGUpOwomIzQzOwkJaWYgKGVycikKJiM0MzsJCQlnb3RvIGVycl9pbm9kZTsKJiM0MzsJfQomIzQzOwogCWZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsICZhbXA7a3ZtX2dtZW1fZm9wcyk7CiAJaWYgKElTX0VSUihmaWxlKSkgewogCQllcnIgPSBQVFJfRVJSKGZpbGUpOwpAQCAtNTkzLDYgJiM0Mzs2MjQsNyBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpCiB7CiAJbG9mZl90IHNpemUgPSBhcmdzLSZndDtzaXplOwogCXU2NCBmbGFncyA9IGFyZ3MtJmd0O2ZsYWdzOwomIzQzOwlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTsKIAogCWlmIChmbGFncyAmYW1wOyB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYwMCw3ICYjNDM7NjMyLDE1IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncykKIAlpZiAoc2l6ZSAmbHQ7PSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MpOwomIzQzOwlpZiAoZmxhZ3MgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHsKJiM0MzsJCWlmIChhcmdzLSZndDtwYWQgfHwgYXJncy0mZ3Q7bm9kZSAmZ3Q7PSBNQVhfTlVNTk9ERVMpCiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQlub2RlID0gYXJncy0mZ3Q7bm9kZTsKJiM0MzsJfSBlbHNlIGlmIChhcmdzLSZndDtub2RlIHx8IGFyZ3MtJmd0O3BhZCkgewomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MsIG5vZGUpOwogfQogCiBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg2NDgKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiA2NTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBHdWVzdCBNZW1mZCBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBpdCYjMzk7cyBhaW1lZCBhdCBhbWQ2NCwgd2hpY2ggaXMgZ29vZDsgaXQmIzM5O3MgYSBjb21tb24gdGFyZ2V0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGJlaW5nIGNoYW5nZWQgYW5kIHdoeSwgdG8gZmlndXJlIG91dCBpZiBpdCYjMzk7cyB3b3J0aCBmdXp6aW5nLgoKTG9va2luZyBhdCB0aGUgZmlsZSBtb2RpZmljYXRpb25zLCBpdCBzZWVtcyB0aGUgY29yZSBpcyB0aGUgYWRkaXRpb24gb2YgTlVNQSBub2RlIGJpbmRpbmcgZm9yIGd1ZXN0IG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIChndWVzdF9tZW1mZCkuCgoqICAgYGluY2x1ZGUvbGludXgva3ZtX2hvc3QuaGAgaXMgZW5hYmxpbmcgYSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGlmIE5VTUEgaXMgZW5hYmxlZCB3aGVuIGdldHRpbmcgc3VwcG9ydGVkIGZsYWdzLgoqICAgYGluY2x1ZGUvbGludXgvbWVtcG9saWN5LmhgIHNob3dzIG5ldyBmdW5jdGlvbnMgYmVpbmcgYWRkZWQgcmVsYXRlZCB0byBtZW1vcnkgcG9saWN5LCBwYXJ0aWN1bGFybHkgc2hhcmVkIHBvbGljeSByYW5nZXMsIHdpdGggdGhlIGRlY2xhcmF0aW9uIG9mIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBhbmQgYG1lbXBvbGljeV9jcmVhdGVgLiBUaGVzZSBhcmUgaW1wb3J0YW50LgoqICAgYGluY2x1ZGUvdWFwaS9saW51eC9rdm0uaGAgZGVmaW5lcyB0aGUgZmxhZyBpdHNlbGYgYW5kIHVwZGF0ZXMgdGhlIGBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUgdG8gaW5jbHVkZSBhIGBub2RlYCBmaWVsZCwgd2hpY2ggSSB3b3VsZCBleHBlY3QuCiogICBgbW0vbWVtcG9saWN5LmNgIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRob3NlIG5ldyBtZW1wb2xpY3kgZnVuY3Rpb25zLCBhbmQgaW1wb3J0YW50bHksIGl0JiMzOTtzIG1vZGlmeWluZyBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeWAgdG8gdXNlIHRoZSBuZXcgc2hhcmVkIHJhbmdlIGZ1bmN0aW9uLiBUaGF0JiMzOTtzIGEga2V5IGFyZWEuCiogICBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuY2AgYWRkcyB0ZXN0cyBmb3IgdGhpcyBub2RlIGJpbmRpbmcuIEFsd2F5cyBnb29kIHRvIHNlZSB0ZXN0aW5nLgoqICAgYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGltcGxlbWVudHMgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGFuZCB1cGRhdGVzIHRoZSBjcmVhdGlvbiBmdW5jdGlvbnMgdG8gdGFrZSB0aGUgZmxhZyBpbnRvIGFjY291bnQuCgpTbywgdGhpcyBpcyBhIHByZXR0eSBzZWxmLWNvbnRhaW5lZCBzZXQgb2YgY2hhbmdlczsgaXQmIzM5O3MgYWRkaW5nIHRoZSBhYmlsaXR5IHRvIGJpbmQgZ3Vlc3QgbWVtZmRzIHRvIHNwZWNpZmljIE5VTUEgbm9kZXMuCgpOb3csIHRoZSBpbXBvcnRhbnQgcGFydDogaXMgdGhpcyBmdXp6YWJsZT8gSSBrbm93IGAvZGV2L2t2bWAgaW9jdGxzIChgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGApIGFyZSBjb3JlIGFuZCByZWFjaGFibGUgZnJvbSB0aGUgdXNlcnNwYWNlLCBhbmQgdGhhdCBtZW1wb2xpY3kgY2hhbmdlcyBhcmUgaW4gY29yZSBtZW1vcnkgbWFuYWdlbWVudC4gVGhpcyBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBpbiBhIHN0YW5kYXJkIFFFTVUvc3l6a2FsbGVyIGVudmlyb25tZW50LiBJJiMzOTttIHNlZWluZyB0aGF0IE5VTUEgcG9saWNpZXMgYW5kIGd1ZXN0IG1lbWZkIGFyZSBjb3JlIGtlcm5lbCBzdWJzeXN0ZW1zLiBUaGlzIGxvb2tzIGxpa2UgYSBzb2xpZCAmIzM0O1dvcnRoRnV6emluZyA9IHRydWUmIzM0OyBzY2VuYXJpby4KCk5leHQsIEkgbmVlZCB0byB2ZXJpZnkgS2NvbmZpZyBkZXBlbmRlbmNpZXMuIEkmIzM5O20gZXhwZWN0aW5nIGBLVk1gIChvciBgS1ZNX0lOVEVMYC9gS1ZNX0FNRGAsIGJ1dCBgS1ZNYCBpcyBwcmV0dHkgc3RhbmRhcmQpIGFuZCBgTlVNQWAgdG8gYmUgcmVxdWlyZWQuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZmlsZXMgdG8gc2VlIHRoZSBkZXBlbmRlbmNpZXMsIGVzcGVjaWFsbHkgd2hlcmUgZ3Vlc3RfbWVtZmQgYW5kIG1lbXBvbGljeSBkZXBlbmQgb24gZWFjaCBvdGhlci4gVGhhdCYjMzk7cyB0aGUgbmV4dCBzdGVwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0tWTV9DUkVBVEVfR1VFU1RfTUVNRkQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7RG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0PTYzNTc9aW4gZmxhZ3MgdG8gaGF2ZSBLVk0gYmluZCB0aGUgbWVtb3J5IHJlZ2lvbiB0byBhIGdpdmVuIGd1ZXN0X21lbWZkIHJhbmdlIG9mXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjM1OC1bZ3Vlc3RfbWVtZmRfb2Zmc2V0LCBndWVzdF9tZW1mZF9vZmZzZXQgJiM0MzsgbWVtb3J5X3NpemVdLiAgVGhlIHRhcmdldCBndWVzdF9tZW1mZFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjYzNTk6bXVzdCBwb2ludCBhdCBhIGZpbGUgY3JlYXRlZCB2aWEgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBvbiB0aGUgY3VycmVudCBWTSwgYW5kXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjM2MC10aGUgdGFyZ2V0IHJhbmdlIG11c3Qgbm90IGJlIGJvdW5kIHRvIGFueSBvdGhlciBtZW1vcnkgcmVnaW9uLiAgQWxsIHN0YW5kYXJkXG4tLVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0PTY0MzA9VGhlIFwmIzM0O2ZsYWdzXCYjMzQ7IGZpZWxkIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBhbmQgbXVzdCBiZSAmIzM5OzAmIzM5Oy5cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDMxLVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0MzI6NC4xNDIgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0MzMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDQwLVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0NDE6S1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBjcmVhdGVzIGFuIGFub255bW91cyBmaWxlIGFuZCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ0Mi10aGF0IHJlZmVycyB0byBpdC4gIGd1ZXN0X21lbWZkIGZpbGVzIGFyZSByb3VnaGx5IGFuYWxvZ291cyB0byBmaWxlcyBjcmVhdGVkXG4tLVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0PTY0NzM9VGhlIGNhcGFiaWxpdHkgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUyBlbnVtZXJhdGVzIHRoZSBgZmxhZ3NgIHRoYXQgY2FuIGJlXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q6NjQ3NDpzcGVjaWZpZWQgdmlhIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQuICBDdXJyZW50bHkgZGVmaW5lZCBmbGFnczpcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDc1LVxuLS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDc5LSAgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRCBNYWtlIGFsbCBtZW1vcnkgaW4gdGhlIGZpbGUgc2hhcmVkIGR1cmluZ1xuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0ODA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgKG1lbW9yeSBmaWxlcyBjcmVhdGVkXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ4MS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBJTklUX1NIQVJFRCB3aWxsIGJlIG1hcmtlZCBwcml2YXRlKS5cbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZz04Mz1jb25maWcgS1ZNX1NXX1BST1RFQ1RFRF9WTVxuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTkwLVx0ICBwcm90ZWN0ZWQgVk1zIGFyZSBwdXJlbHkgYSBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyB2ZWhpY2xlIGZvclxuYXJjaC94ODYva3ZtL0tjb25maWc6OTE6XHQgIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQuICBBdHRlbXB0aW5nIHRvIHJ1biBhIFwmIzM0O3JlYWxcJiMzNDsgVk0gd29ya2xvYWQgYXMgYVxuYXJjaC94ODYva3ZtL0tjb25maWctOTItXHQgIHNvZnR3YXJlLXByb3RlY3RlZCBWTSB3aWxsIGZhaWwgbWlzZXJhYmx5LlxuLS1cbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaD0xNjQ5PXN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xuLS1cbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjU3LVxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oOjE2NTg6I2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTktI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcdFx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXG4tLVxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oPTE2NDU9c3RydWN0IGt2bV9tZW1vcnlfYXR0cmlidXRlcyB7XG4tLVxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTMtXG50b29scy9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmg6MTY1NDojZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcdF9JT1dSKEtWTUlPLCAgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpXG50b29scy9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1NS0jZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFx0XHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jPTI4PXN0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTM3LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYzozODpcdHJldHVybiBfX3ZtX2lvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZndWVzdF9tZW1mZCk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTM5LX1cbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jPTQxPXN0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSlcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTQ4LVx0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jOjQ5Olx0VEVTVF9BU1NFUlQoZmQgXHUwMDNlPSAwLCBLVk1fSU9DVExfRVJST1IoS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgZmQpKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMtNTAtXHRyZXR1cm4gZmQ7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaD02Njc9c3RhdGljIGlubGluZSBpbnQgX192bV9jcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLFxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjc0LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaDo2NzU6XHRyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXHUwMDI2Z3Vlc3RfbWVtZmQpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02NzYtfVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg9Njc4PXN0YXRpYyBpbmxpbmUgaW50IHZtX2NyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02ODItXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oOjY4MzpcdFRFU1RfQVNTRVJUKGZkIFx1MDAzZT0gMCwgS1ZNX0lPQ1RMX0VSUk9SKEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGZkKSk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oLTY4NC1cdHJldHVybiBmZDtcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTUxNjc9c3RhdGljIGxvbmcga3ZtX3ZtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM4Ny0jaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxudmlydC9rdm0va3ZtX21haW4uYzo1Mzg4Olx0Y2FzZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEOiB7XG52aXJ0L2t2bS9rdm1fbWFpbi5jLTUzODktXHRcdHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIGd1ZXN0X21lbWZkO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNjgwCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipLVk0gQ29uZmlndXJhdGlvbiBEZWVwIERpdmUqKgoKT2theSwgdGltZSB0byBkaWcgaW50byB0aGUgS1ZNIGNvbmZpZ3VyYXRpb24uIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiBgQ09ORklHX0tWTV9HVUVTVF9NRU1GRGAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBjdXJyZW50IHN0YXR1cyBhbmQgaW1wbGljYXRpb25zLiBCZXlvbmQgdGhhdCwgSSBuZWVkIHRvIGNoZWNrIG91dCBhbnkgb3RoZXIgS2NvbmZpZ3MgdGhhdCBhcmUgb2J2aW91c2x5IHJlbGF0ZWQgdG8gaXQuIFRoZXJlJiMzOTtzIGFsbW9zdCBjZXJ0YWlubHkgYSB3ZWIgb2YgZGVwZW5kZW5jaWVzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBJIG5lZWQgdG8gbWFwIG91dCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIHNwZWNpZmljIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQsIGhvdyBpdCBhZmZlY3RzIHRoZSBndWVzdCBlbnZpcm9ubWVudCwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIGtub2JzIHRoYXQgbWlnaHQgYmUgd29ydGggYWRqdXN0aW5nLiBJdCYjMzk7cyB0aW1lIHRvIGJ1aWxkIGEgc29saWQgbWVudGFsIG1vZGVsIG9mIHRoZSByZWxldmFudCBLY29uZmlnIGxhbmRzY2FwZS4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgY29kZSB0ZWxsIHVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLVk1fR1VFU1RfTUVNRkQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7dmlydC9rdm0vS2NvbmZpZz0xMDM9Y29uZmlnIEtWTV9HRU5FUklDX01FTU9SWV9BVFRSSUJVVEVTXG4tLVxudmlydC9rdm0vS2NvbmZpZy0xMDUtXG52aXJ0L2t2bS9LY29uZmlnOjEwNjpjb25maWcgS1ZNX0dVRVNUX01FTUZEXG52aXJ0L2t2bS9LY29uZmlnLTEwNy0gICAgICAgc2VsZWN0IFhBUlJBWV9NVUxUSVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExOTgyCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIEtWTSBDb25maWd1cmF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGB2aXJ0L2t2bS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTA2LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgcGFydGljdWxhciBvcHRpb24gaXMgaGFuZGxlZC4gSSBzdXNwZWN0IHdlJiMzOTtyZSBsb29raW5nIGF0IGEgS2NvbmZpZyBzeW1ib2wgcmVsYXRlZCB0byBhIHNwZWNpZmljIHZpcnR1YWxpemF0aW9uIGZlYXR1cmUgb3IgZGV2aWNlLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgSSBtaWdodCBiZSBsb29raW5nIGZvciBkZXBlbmRlbmNpZXMsIGRlZmF1bHQgdmFsdWVzLCBvciBwZXJoYXBzIGV2ZW4gY29tbWVudHMgY2xhcmlmeWluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGlzIG9wdGlvbi4gTXkgZ29hbCBoZXJlIGlzIHRvIGdyYXNwIHRoZSBjb25maWd1cmFiaWxpdHkgb2YgdGhpcyBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aGUgS1ZNIHNldHVwIGFuZCBpdHMgcG90ZW50aWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZSBvciBmdW5jdGlvbmFsaXR5LiBJIHdpbGwgcGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmZWF0dXJlcyBvciBoYXJkd2FyZSwgbG9va2luZyBmb3IgYW55IGVkZ2UgY2FzZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA5MDpcdFxuICA5MTpcdGNvbmZpZyBIQVZFX0tWTV9QTV9OT1RJRklFUlxuICA5MjpcdCAgICAgICBib29sXG4gIDkzOlx0XG4gIDk0Olx0Y29uZmlnIEtWTV9HRU5FUklDX0hBUkRXQVJFX0VOQUJMSU5HXG4gIDk1Olx0ICAgICAgIGJvb2xcbiAgOTY6XHRcbiAgOTc6XHRjb25maWcgS1ZNX0VMSURFX1RMQl9GTFVTSF9JRl9ZT1VOR1xuICA5ODpcdCAgICAgICBib29sXG4gIDk5Olx0XG4gMTAwOlx0Y29uZmlnIEtWTV9NTVVfTE9DS0xFU1NfQUdJTkdcbiAxMDE6XHQgICAgICAgYm9vbFxuIDEwMjpcdFxuIDEwMzpcdGNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xuIDEwNDpcdCAgICAgICBib29sXG4gMTA1Olx0XG4gMTA2Olx0Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxuIDEwNzpcdCAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXG4gMTA4Olx0ICAgICAgIGJvb2xcbiAxMDk6XHRcbiAxMTA6XHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcbiAxMTE6XHQgICAgICAgYm9vbFxuIDExMjpcdCAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxuIDExMzpcdFxuIDExNDpcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fUkVDTEFJTVxuIDExNTpcdCAgICAgICBib29sXG4gMTE2Olx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4gMTE3Olx0XG4gMTE4Olx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9JTlZBTElEQVRFXG4gMTE5Olx0ICAgICAgIGJvb2xcbiAxMjA6XHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbiAxMjE6XHRcbiAxMjI6XHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1BPUFVMQVRFXG4gMTIzOlx0ICAgICAgIGJvb2xcbiAxMjQ6XHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjY0MAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIFNlbGVjdGlvbiBvZiBgS1ZNX0dVRVNUX01FTUZEYCoqCgpPa2F5LCBzbyBzb21lb25lJiMzOTtzIGp1c3QgcGlja2VkIGBLVk1fR1VFU1RfTUVNRkRgLiBMZXQgbWUgcXVpY2tseSBicmVhayBkb3duIHdoYXQgdGhhdCBpbXBsaWVzIGluIHRlcm1zIG9mIGtlcm5lbCBiZWhhdmlvciBhbmQgcG90ZW50aWFsIGltcGxpY2F0aW9ucy4gRmlyc3Qgb2ZmLCB0aGlzIG1lYW5zIHRoZXkmIzM5O3JlIGFpbWluZyBmb3IgYSBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIGludGVyZmFjZSwgd2hpY2gsICp0ZWNobmljYWxseSosIGlzbiYjMzk7dCBuZXcg4oCTIGJ1dCBpdHMgYXBwbGljYXRpb24gb3IgdGhlICpyZWFzb24qIGZvciBpdHMgdXNlIHdhcnJhbnRzIGRlZXBlciBzY3J1dGlueS4KCk15IGltbWVkaWF0ZSBxdWVzdGlvbnMgYXJlOiBXaGF0JiMzOTtzIHRoZSAqc3BlY2lmaWMqIHVzZSBjYXNlIHByb21wdGluZyB0aGlzIHNlbGVjdGlvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBtZW1vcnktYmFja2VkIGd1ZXN0PyBPciBpcyB0aGlzIHBhcnQgb2Ygc29tZSBtb3JlIGludHJpY2F0ZSBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneT8gQXJlIHRoZXkgdGFyZ2V0aW5nIHBlcmZvcm1hbmNlIGdhaW5zIHZpYSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBmcm9tIHVzZXJzcGFjZSwgd2hpY2ggd291bGQgYmUgYW4gb2J2aW91cyBhbmQgZ2VuZXJhbGx5IHVuZGVyc3Rvb2QgcmVhc29uPyBPciBpcyBpdCBzb21ldGhpbmcgbW9yZSBzdWJ0bGU/CgpUaGVuLCBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBzZWN1cml0eSBwb3N0dXJlLiBVc2luZyBndWVzdCBtZW1mZHMgaW50cm9kdWNlcyBwb3RlbnRpYWwgYXR0YWNrIHN1cmZhY2UgY29uc2lkZXJhdGlvbnMg4oCTIGFyZSBhcHByb3ByaWF0ZSBzYWZlZ3VhcmRzIGluIHBsYWNlIHRvIG1pdGlnYXRlIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBtYW5pcHVsYXRpbmcgZ3Vlc3QgbWVtb3J5IGZyb20gdXNlcnNwYWNlIG9yIGV2ZW4gZnJvbSB0aGUgaG9zdCBzaWRlPyBXZSBuZWVkIHRvIHZlcmlmeSB0aGF0IHdlJiMzOTtyZSBwcm9wZXJseSBjb25zaWRlcmluZyBhbmQgaGFyZGVuaW5nIGFsbCB0aGUgYXNzb2NpYXRlZCBhc3BlY3RzIG9mIHRoaXMgYXJjaGl0ZWN0dXJlLgoKRnJvbSBhIHBlcmZvcm1hbmNlIHBlcnNwZWN0aXZlLCBJJiMzOTtsbCBuZWVkIHRvIGRyaWxsIGRvd24gaW50byB0aGUgaW1wbGljYXRpb25zIG9uIG1lbW9yeSBvdmVyaGVhZC4gSXMgdGhlIGdhaW4gaW4gZGlyZWN0IG1lbW9yeSBhY2Nlc3Mgd29ydGggYW55IGludHJvZHVjZWQgb3ZlcmhlYWQgZnJvbSB0aGUgZXh0cmEgYm9va2tlZXBpbmcgdGhhdCB3b3VsZCBiZSBpbnRyb2R1Y2VkPyBJIG5lZWQgdG8gYW5hbHl6ZSBpdHMgaW1wYWN0IG9uIG1lbW9yeSBhbGxvY2F0aW9uLCBkZWFsbG9jYXRpb24sIGFuZCB0aGUgY29udGV4dCBzd2l0Y2hpbmcg4oCTIGlzIHRoZSB0cmFkZS1vZmYgaW4gbGF0ZW5jeSwgd2hpY2ggdGhpcyBpbnRlcmZhY2UgY2FuIGhhdmUsIGJlaW5nIHByb3Blcmx5IGFzc2Vzc2VkPwoKVWx0aW1hdGVseSwgdGhlICYjMzk7d2h5JiMzOTsgaXMgd2hhdCBJIHJlYWxseSBuZWVkIHRvIGdldCBhdC4gQXJlIHRoZXJlIGFueSBleGlzdGluZyBkZXBlbmRlbmNpZXM/IEFyZSB0aGV5IHJlbHlpbmcgb24gdGhpcyBmZWF0dXJlIGFzIGEgbWVhbnMgb2YgcmVkdWNpbmcgbWVtb3J5IGNvcHkgb3ZlcmhlYWQsIHN1cHBvcnRpbmcgc2hhcmVkIG1lbW9yeSwgb3IgbWF5YmUgZXZlbiBlbmFibGluZyBsaXZlIG1pZ3JhdGlvbiBvcHRpbWl6YXRpb25zPyBPciBhcmUgdGhleSBqdXN0IGV4cGVyaW1lbnRpbmc/IEVpdGhlciB3YXksIEkmIzM5O2xsIGJlIGludGVyZXN0ZWQgdG8gc2VlIGhvdyB0aGV5IGxldmVyYWdlIHRoaXMsIGFuZCBpZiBpdCYjMzk7cyBkb25lIGNvcnJlY3RseSwgaWYgdGhpcyBzZWxlY3Rpb24gaXMgcGFydCBvZiBhIGxhcmdlciwgY29oZXJlbnQgYXJjaGl0ZWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzZWxlY3QgS1ZNX0dVRVNUX01FTUZEJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvYXJtNjQva3ZtL0tjb25maWc9MjA9bWVudWNvbmZpZyBLVk1cbi0tXG5hcmNoL2FybTY0L2t2bS9LY29uZmlnLTM4LVx0c2VsZWN0IEdVRVNUX1BFUkZfRVZFTlRTIGlmIFBFUkZfRVZFTlRTXG5hcmNoL2FybTY0L2t2bS9LY29uZmlnOjM5Olx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRFxuYXJjaC9hcm02NC9rdm0vS2NvbmZpZy00MC1cdGhlbHBcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZz0yMD1jb25maWcgS1ZNX1g4NlxuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTQ5LVx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo1MDpcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkQgaWYgWDg2XzY0XG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy01MS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMzMTEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiA5NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGFuIGV4cGVydCBpbiBteSBmaWVsZDoKCioqSW52ZXN0aWdhdGluZyBLVk0gYW5kIE1lbW9yeSBNYW5hZ2VtZW50IG9uIHg4Nl82NCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgaG93IEtWTSBoYW5kbGVzIG1lbW9yeSBvbiB4ODZfNjQuIFNwZWNpZmljYWxseSwgSSBrbm93IHRoYXQgb24gdGhpcyBhcmNoaXRlY3R1cmUsIHRoZSBLVk0gY29yZSAob3IgaXRzIHNwZWNpZmljIEludGVsL0FNRC9YODYgdmFyaWFudHMpIHR5cGljYWxseSBsZXZlcmFnZXMgYEtWTV9HVUVTVF9NRU1GRGAuIEJ1dCBJJiMzOTttIGN1cmlvdXMgYWJvdXQgdGhlIGludGVyYWN0aW9uIHdpdGggTlVNQS4gVGhhdCYjMzk7cyBhbHdheXMgYSBjcml0aWNhbCBjb25zaWRlcmF0aW9uIGZvciBwZXJmb3JtYW5jZSBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50LCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgYXJlIHNwZWNpZmljIGJlaGF2aW9ycyBvciBjb25maWd1cmF0aW9ucyByZWxhdGluZyB0byBLVk0gYW5kIE5vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MuCgpNeSBuZXh0IHN0ZXAgaXMgY2xlYXI6IEkgbmVlZCB0byBkaWcgaW50byB0aGUga2VybmVsIHNvdXJjZSBjb2RlLiBJJiMzOTtsbCBjaGVjayBgbW0vbWVtcG9saWN5LmNgIGFuZCBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgdG8gc2VlIGhvdyB0aGUgTlVNQSBjb25maWd1cmF0aW9uIChgQ09ORklHX05VTUFgKSBpcyBiZWluZyBoYW5kbGVkLCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byBndWVzdCBtZW1vcnkgYmFja2VkIGJ5IGBtZW1mZGAuIEkgYW50aWNpcGF0ZSB0aGVyZSB3aWxsIGJlIG51YW5jZXMgaW4gbWVtb3J5IGFsbG9jYXRpb24gYW5kIHBsYWNlbWVudCBzdHJhdGVnaWVzIHJlbGF0ZWQgdG8gTlVNQSBub2RlcyB3aGVuIEtWTSBhbmQgYG1lbWZkYCBhcmUgaW52b2x2ZWQuIFRoaXMgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgc3RhcnRpbmcgcG9pbnQgdG8gYmVnaW4gYSBtdWNoIGRlZXBlciBpbnZlc3RpZ2F0aW9uIGludG8gdGhlIGludGVyYWN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfTlVNQSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtcbkZ1bGwgb3V0cHV0IGlzIHRvbyBsb25nLCBzaG93aW5nIDUwMCBvdXQgb2YgODM3IGxpbmVzLlxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxuXG5tbS9NYWtlZmlsZT04Nj1vYmotJChDT05GSUdfSFVHRVRMQl9QQUdFX09QVElNSVpFX1ZNRU1NQVApXHQmIzQzOz0gaHVnZXRsYl92bWVtbWFwLm9cbm1tL01ha2VmaWxlOjg3Om9iai0kKENPTkZJR19OVU1BKSBcdCYjNDM7PSBtZW1wb2xpY3kub1xubW0vTWFrZWZpbGUtODgtb2JqLSQoQ09ORklHX1NQQVJTRU1FTSlcdCYjNDM7PSBzcGFyc2Uub1xuLS1cbm1tL01ha2VmaWxlPTk5PW9iai0kKENPTkZJR19NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlLm9cbm1tL01ha2VmaWxlOjEwMDpvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vXG5tbS9NYWtlZmlsZS0xMDEtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG4tLVxubW0vTWFrZWZpbGU9MTIyPW9iai0kKENPTkZJR19DTUEpXHQmIzQzOz0gY21hLm9cbm1tL01ha2VmaWxlOjEyMzpvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG51bWEub1xubW0vTWFrZWZpbGU6MTI0Om9iai0kKENPTkZJR19OVU1BX01FTUJMS1MpICYjNDM7PSBudW1hX21lbWJsa3Mub1xubW0vTWFrZWZpbGU6MTI1Om9iai0kKENPTkZJR19OVU1BX0VNVSkgJiM0Mzs9IG51bWFfZW11bGF0aW9uLm9cbm1tL01ha2VmaWxlLTEyNi1vYmotJChDT05GSUdfR0VORVJJQ19BUkNIX05VTUEpICYjNDM7PSBhcmNoX251bWEub1xuLS1cbm1tL2FyY2hfbnVtYS5jPTU4PUVYUE9SVF9TWU1CT0woY3B1bWFza19vZl9ub2RlKTtcbi0tXG5tbS9hcmNoX251bWEuYy02MS1cbm1tL2FyY2hfbnVtYS5jOjYyOiNpZm5kZWYgQ09ORklHX05VTUFfRU1VXG5tbS9hcmNoX251bWEuYy02My1zdGF0aWMgdm9pZCBudW1hX3VwZGF0ZV9jcHUodW5zaWduZWQgaW50IGNwdSwgYm9vbCByZW1vdmUpXG4tLVxubW0vYXJjaF9udW1hLmM9MzIyPXZvaWQgX19pbml0IGFyY2hfbnVtYV9pbml0KHZvaWQpXG4tLVxubW0vYXJjaF9udW1hLmMtMzMzLVxubW0vYXJjaF9udW1hLmM6MzM0OiNpZmRlZiBDT05GSUdfTlVNQV9FTVVcbm1tL2FyY2hfbnVtYS5jLTMzNS12b2lkIF9faW5pdCBudW1hX2VtdV91cGRhdGVfY3B1X3RvX25vZGUoaW50ICplbXVfbmlkX3RvX3BoeXMsXG4tLVxubW0vYXJjaF9udW1hLmM9MzYwPXZvaWQgZGVidWdfY3B1bWFza19zZXRfY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCBub2RlLCBib29sIGVuYWJsZSlcbi0tXG5tbS9hcmNoX251bWEuYy0zODItfVxubW0vYXJjaF9udW1hLmM6MzgzOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi9cbi0tXG5tbS9jbWEuYz00MzY9c3RhdGljIGludCBfX2luaXQgX19jbWFfZGVjbGFyZV9jb250aWd1b3VzX25pZChwaHlzX2FkZHJfdCAqYmFzZXAsXG4tLVxubW0vY21hLmMtNDU5LVxubW0vY21hLmM6NDYwOlx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19OVU1BKSlcbm1tL2NtYS5jLTQ2MS1cdFx0bmlkID0gTlVNQV9OT19OT0RFO1xuLS1cbm1tL2NvbXBhY3Rpb24uYz0zMDA1PXN0YXRpYyBpbnQgc3lzY3RsX2NvbXBhY3Rpb25faGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxuLS1cbm1tL2NvbXBhY3Rpb24uYy0zMDIyLVxubW0vY29tcGFjdGlvbi5jOjMwMjM6I2lmIGRlZmluZWQoQ09ORklHX1NZU0ZTKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfTlVNQSlcbm1tL2NvbXBhY3Rpb24uYy0zMDI0LXN0YXRpYyBzc2l6ZV90IGNvbXBhY3Rfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LFxuLS1cbm1tL2NvbXBhY3Rpb24uYz0zMDQ2PXZvaWQgY29tcGFjdGlvbl91bnJlZ2lzdGVyX25vZGUoc3RydWN0IG5vZGUgKm5vZGUpXG4tLVxubW0vY29tcGFjdGlvbi5jLTMwNDktfVxubW0vY29tcGFjdGlvbi5jOjMwNTA6I2VuZGlmIC8qIENPTkZJR19TWVNGUyBcdTAwMjZcdTAwMjYgQ09ORklHX05VTUEgKi9cbm1tL2NvbXBhY3Rpb24uYy0zMDUxLVxuLS1cbm1tL2RhbW9uL2NvcmUuYz0yODkzPXN0YXRpYyBpbmxpbmUgdTY0IGRhbW9zX2dldF9zb21lX21lbV9wc2lfdG90YWwodm9pZClcbi0tXG5tbS9kYW1vbi9jb3JlLmMtMjg5OS1cbm1tL2RhbW9uL2NvcmUuYzoyOTAwOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vZGFtb24vY29yZS5jLTI5MDEtc3RhdGljIGJvb2wgaW52YWxpZF9tZW1fbm9kZShpbnQgbmlkKVxuLS1cbm1tL2RhbW9uL2NvcmUuYz0zMDgxPXN0YXRpYyB1bnNpZ25lZCBsb25nIGRhbW9zX2dldF9ub2RlX2VsaWdpYmxlX21lbV9icChzdHJ1Y3QgZGFtb25fY3R4ICpjLFxuLS1cbm1tL2RhbW9uL2NvcmUuYy0zMDg2LSNlbmRpZiAvKiBDT05GSUdfREFNT05fUEFERFIgKi9cbm1tL2RhbW9uL2NvcmUuYzozMDg3OiNlbHNlIC8qIENPTkZJR19OVU1BICovXG5tbS9kYW1vbi9jb3JlLmMtMzA4OC1zdGF0aWMgX19rZXJuZWxfdWxvbmdfdCBkYW1vc19nZXRfbm9kZV9tZW1fYnAoXG4tLVxubW0vZGFtb24vY29yZS5jPTMxMDA9c3RhdGljIHVuc2lnbmVkIGxvbmcgZGFtb3NfZ2V0X25vZGVfZWxpZ2libGVfbWVtX2JwKHN0cnVjdCBkYW1vbl9jdHggKmMsXG4tLVxubW0vZGFtb24vY29yZS5jLTMxMDQtfVxubW0vZGFtb24vY29yZS5jOjMxMDU6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXG5tbS9kYW1vbi9jb3JlLmMtMzEwNi1cbi0tXG5tbS9kZWJ1Zy5jPTE3MT12b2lkIGR1bXBfbW0oY29uc3Qgc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4tLVxubW0vZGVidWcuYy0xOTEtI2VuZGlmXG5tbS9kZWJ1Zy5jOjE5MjojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9kZWJ1Zy5jLTE5My1cdFx0XCYjMzQ7bnVtYV9uZXh0X3NjYW4gJWx1IG51bWFfc2Nhbl9vZmZzZXQgJWx1IG51bWFfc2Nhbl9zZXEgJWRcXG5cJiMzNDtcbi0tXG5tbS9kZWJ1Zy5jLTIyMC0jZW5kaWZcbm1tL2RlYnVnLmM6MjIxOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcbm1tL2RlYnVnLmMtMjIyLVx0XHRtbS1cdTAwM2VudW1hX25leHRfc2NhbiwgbW0tXHUwMDNlbnVtYV9zY2FuX29mZnNldCwgbW0tXHUwMDNlbnVtYV9zY2FuX3NlcSxcbi0tXG5tbS9maWxlbWFwLmM9OTk2PUVYUE9SVF9TWU1CT0xfR1BMKGZpbGVtYXBfYWRkX2ZvbGlvKTtcbm1tL2ZpbGVtYXAuYy05OTctXG5tbS9maWxlbWFwLmM6OTk4OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vZmlsZW1hcC5jLTk5OS1zdHJ1Y3QgZm9saW8gKmZpbGVtYXBfYWxsb2NfZm9saW9fbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuLS1cbm1tL2h1Z2V0bGIuYz0yMjM4PXN0YXRpYyBub2RlbWFza190ICpwb2xpY3lfbWJpbmRfbm9kZW1hc2soZ2ZwX3QgZ2ZwKVxubW0vaHVnZXRsYi5jLTIyMzkte1xubW0vaHVnZXRsYi5jOjIyNDA6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiLmMtMjI0MS1cdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7XG4tLVxubW0vaHVnZXRsYi5jPTI5Nzc9c3RydWN0IGZvbGlvICphbGxvY19odWdldGxiX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2V0bGIuYy0zMDUyLVx0XHQubmlkID0gbmlkLFxubW0vaHVnZXRsYi5jOjMwNTM6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiLmMtMzA1NC1cdFx0Lm1vZGUgPSBtcG9sID8gbXBvbC1cdTAwM2Vtb2RlIDogTVBPTF9ERUZBVUxULFxuLS1cbm1tL2h1Z2V0bGJfY21hLmM9MjY9c3RhdGljIHVuc2lnbmVkIGludCBodWdldGxiX2NtYV9wZXJjZW50X2luX25vZGVbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhO1xubW0vaHVnZXRsYl9jbWEuYy0yNy1cbm1tL2h1Z2V0bGJfY21hLmM6Mjg6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX2NtYS5jLTI5LXN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgbWVtYmxvY2tfbm9kZV9tZW1vcnlfc2l6ZShpbnQgbmlkKVxuLS1cbm1tL2h1Z2V0bGJfc3lzY3RsLmM9NTM9c3RhdGljIGludCBodWdldGxiX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4tLVxubW0vaHVnZXRsYl9zeXNjdGwuYy02MC1cbm1tL2h1Z2V0bGJfc3lzY3RsLmM6NjE6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX3N5c2N0bC5jLTYyLXN0YXRpYyBpbnQgaHVnZXRsYl9tZW1wb2xpY3lfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcbi0tXG5tbS9odWdldGxiX3N5c2N0bC5jLTY3LX1cbm1tL2h1Z2V0bGJfc3lzY3RsLmM6Njg6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXG5tbS9odWdldGxiX3N5c2N0bC5jLTY5LVxuLS1cbm1tL2h1Z2V0bGJfc3lzY3RsLmM9OTk9c3RhdGljIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgaHVnZXRsYl90YWJsZVtdID0ge1xuLS1cbm1tL2h1Z2V0bGJfc3lzY3RsLmMtMTA2LVx0fSxcbm1tL2h1Z2V0bGJfc3lzY3RsLmM6MTA3OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vaHVnZXRsYl9zeXNjdGwuYy0xMDgtXHR7XG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jPTg2PUhTVEFURV9BVFRSKG5yX2h1Z2VwYWdlcyk7XG5tbS9odWdldGxiX3N5c2ZzLmMtODctXG5tbS9odWdldGxiX3N5c2ZzLmM6ODg6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX3N5c2ZzLmMtODktXG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jPTI4MD1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaHN0YXRlX2F0dHJzW10gPSB7XG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jLTI4NS1cdFx1MDAyNnN1cnBsdXNfaHVnZXBhZ2VzX2F0dHIuYXR0cixcbm1tL2h1Z2V0bGJfc3lzZnMuYzoyODY6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX3N5c2ZzLmMtMjg3LVx0XHUwMDI2bnJfaHVnZXBhZ2VzX21lbXBvbGljeV9hdHRyLmF0dHIsXG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jPTMwNj1zdGF0aWMgaW50IGh1Z2V0bGJfc3lzZnNfYWRkX2hzdGF0ZShzdHJ1Y3QgaHN0YXRlICpoLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LFxuLS1cbm1tL2h1Z2V0bGJfc3lzZnMuYy0zMzgtXG5tbS9odWdldGxiX3N5c2ZzLmM6MzM5OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vaHVnZXRsYl9zeXNmcy5jLTM0MC1zdGF0aWMgYm9vbCBodWdldGxiX3N5c2ZzX2luaXRpYWxpemVkIF9fcm9fYWZ0ZXJfaW5pdDtcbi0tXG5tbS9odWdldGxiX3N5c2ZzLmM9NDYxPXN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX3JlZ2lzdGVyX2FsbF9ub2Rlcyh2b2lkKVxuLS1cbm1tL2h1Z2V0bGJfc3lzZnMuYy00NjctfVxubW0vaHVnZXRsYl9zeXNmcy5jOjQ2ODojZWxzZVx0LyogIUNPTkZJR19OVU1BICovXG5tbS9odWdldGxiX3N5c2ZzLmMtNDY5LVxuLS1cbm1tL2h1Z2V0bGJfc3lzZnMuYz00ODI9dm9pZCBfX2luaXQgaHVnZXRsYl9zeXNmc19pbml0KHZvaWQpXG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jLTQ5Ny1cbm1tL2h1Z2V0bGJfc3lzZnMuYzo0OTg6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX3N5c2ZzLmMtNDk5LVx0aHVnZXRsYl9zeXNmc19pbml0aWFsaXplZCA9IHRydWU7XG4tLVxubW0vaW50ZXJuYWwuaD03Nj11bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL2ludGVybmFsLmgtODEtXG5tbS9pbnRlcm5hbC5oOjgyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vaW50ZXJuYWwuaC04My1leHRlcm4gaW50IHN5c2N0bF9taW5fdW5tYXBwZWRfcmF0aW87XG4tLVxubW0vaW50ZXJuYWwuaD0xMTI4PXN0YXRpYyBpbmxpbmUgdm9pZCBtbG9ja19kcmFpbl9yZW1vdGUoaW50IGNwdSkgeyB9XG4tLVxubW0vaW50ZXJuYWwuaC0xMTMwLVxubW0vaW50ZXJuYWwuaDoxMTMxOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vaW50ZXJuYWwuaC0xMTMyLWV4dGVybiBpbnQgbm9kZV9yZWNsYWltX21vZGU7XG4tLVxubW0vaW50ZXJuYWwuaD0xMjM5PXN0YXRpYyBpbmxpbmUgYm9vbCB2bWFfaXNfc2luZ2xlX3RocmVhZGVkX3ByaXZhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4tLVxubW0vaW50ZXJuYWwuaC0xMjQ2LVxubW0vaW50ZXJuYWwuaDoxMjQ3OiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcbm1tL2ludGVybmFsLmgtMTI0OC1ib29sIGZvbGlvX2Nhbl9tYXBfcHJvdF9udW1hKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYz0xMDI3PXN0YXRpYyBpbmxpbmUgZ2ZwX3QgYWxsb2NfaHVnZXBhZ2Vfa2h1Z2VwYWdlZF9nZnBtYXNrKHZvaWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwMzEtXG5tbS9raHVnZXBhZ2VkLmM6MTAzMjojaWZkZWYgQ09ORklHX05VTUFcbm1tL2todWdlcGFnZWQuYy0xMDMzLXN0YXRpYyBpbnQgY29sbGFwc2VfZmluZF90YXJnZXRfbm9kZShzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4tLVxubW0va3NtLmMtNTAtXG5tbS9rc20uYzo1MTojaWZkZWYgQ09ORklHX05VTUFcbm1tL2tzbS5jLTUyLSNkZWZpbmUgTlVNQSh4KVx0XHQoeClcbi0tXG5tbS9rc20uYz0xNTk9c3RydWN0IGtzbV9zdGFibGVfbm9kZSB7XG4tLVxubW0va3NtLmMtMTgxLVx0aW50IHJtYXBfaGxpc3RfbGVuO1xubW0va3NtLmM6MTgyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0va3NtLmMtMTgzLVx0aW50IG5pZDtcbi0tXG5tbS9rc20uYz0yMDI9c3RydWN0IGtzbV9ybWFwX2l0ZW0ge1xuLS1cbm1tL2tzbS5jLTIwNS1cdFx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYTtcdC8qIGZvciByZXZlcnNlIG1hcHBpbmcsIHdoZW4gc3RhYmxlICovXG5tbS9rc20uYzoyMDY6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9rc20uYy0yMDctXHRcdGludCBuaWQ7XHRcdC8qIHdoZW4gbm9kZSBvZiB1bnN0YWJsZSB0cmVlICovXG4tLVxubW0va3NtLmM9NDY5PXN0YXRpYyB2b2lkIGFkdmlzb3Jfc3RvcF9zY2FuKHZvaWQpXG4tLVxubW0va3NtLmMtNDc0LVxubW0va3NtLmM6NDc1OiNpZmRlZiBDT05GSUdfTlVNQVxubW0va3NtLmMtNDc2LS8qIFplcm9lZCB3aGVuIG1lcmdpbmcgYWNyb3NzIG5vZGVzIGlzIG5vdCBhbGxvd2VkICovXG4tLVxubW0va3NtLmM9ODU3PXN0YXRpYyBzdHJ1Y3Qga3NtX3N0YWJsZV9ub2RlICphbGxvY19zdGFibGVfbm9kZV9jaGFpbihzdHJ1Y3Qga3NtX3N0YWJsZV9ub2RlICpkdXAsXG4tLVxubW0va3NtLmMtODY1LVx0XHRjaGFpbi1cdTAwM2VybWFwX2hsaXN0X2xlbiA9IFNUQUJMRV9OT0RFX0NIQUlOO1xubW0va3NtLmM6ODY2OiNpZiBkZWZpbmVkIChDT05GSUdfREVCVUdfVk0pIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19OVU1BKVxubW0va3NtLmMtODY3LVx0XHRjaGFpbi1cdTAwM2VuaWQgPSBOVU1BX05PX05PREU7IC8qIGRlYnVnICovXG4tLVxubW0va3NtLmM9MzU5NT1LU01fQVRUUihydW4pO1xubW0va3NtLmMtMzU5Ni1cbm1tL2tzbS5jOjM1OTc6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9rc20uYy0zNTk4LXN0YXRpYyBzc2l6ZV90IG1lcmdlX2Fjcm9zc19ub2Rlc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxuLS1cbm1tL2tzbS5jPTM5ODE9c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmtzbV9hdHRyc1tdID0ge1xuLS1cbm1tL2tzbS5jLTM5OTItXHRcdTAwMjZmdWxsX3NjYW5zX2F0dHIuYXR0cixcbm1tL2tzbS5jOjM5OTM6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9rc20uYy0zOTk0LVx0XHUwMDI2bWVyZ2VfYWNyb3NzX25vZGVzX2F0dHIuYXR0cixcbi0tXG5tbS9tZW1ibG9jay5jLTEwNS1cbm1tL21lbWJsb2NrLmM6MTA2OiNpZm5kZWYgQ09ORklHX05VTUFcbm1tL21lbWJsb2NrLmMtMTA3LXN0cnVjdCBwZ2xpc3RfZGF0YSBfX3JlZmRhdGEgY29udGlnX3BhZ2VfZGF0YTtcbi0tXG5tbS9tZW1ibG9jay5jPTYxMD1zdGF0aWMgaW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19hZGRfcmFuZ2Uoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUsXG4tLVxubW0vbWVtYmxvY2suYy02NjYtXHRcdGlmIChyYmFzZSBcdTAwM2UgYmFzZSkge1xubW0vbWVtYmxvY2suYzo2Njc6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tZW1ibG9jay5jLTY2OC1cdFx0XHRXQVJOX09OKG5pZCAhPSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSk7XG4tLVxubW0vbWVtYmxvY2suYz0xNDg5PWludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfc2V0X25vZGUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSxcbi0tXG5tbS9tZW1ibG9jay5jLTE0OTEte1xubW0vbWVtYmxvY2suYzoxNDkyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtYmxvY2suYy0xNDkzLVx0aW50IHN0YXJ0X3JnbiwgZW5kX3Jnbjtcbi0tXG5tbS9tZW1ibG9jay5jPTIxOTI9c3RhdGljIHZvaWQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2R1bXAoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUpXG4tLVxubW0vbWVtYmxvY2suYy0yMjA3LVx0XHRmbGFncyA9IHJnbi1cdTAwM2VmbGFncztcbm1tL21lbWJsb2NrLmM6MjIwODojaWZkZWYgQ09ORklHX05VTUFcbm1tL21lbWJsb2NrLmMtMjIwOS1cdFx0aWYgKG51bWFfdmFsaWRfbm9kZShtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSkpXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE2OTk9c3RhdGljIHNzaXplX3QgbWVtX2Nncm91cF9yZXNldChzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmJ1Zixcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTczNS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNzM2OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtY29udHJvbC12MS5jLTE3MzctXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE3ODA9c3RhdGljIGludCBtZW1jZ19udW1hX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4tLVxubW0vbWVtY29udHJvbC12MS5jLTE4MjMtfVxubW0vbWVtY29udHJvbC12MS5jOjE4MjQ6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXG5tbS9tZW1jb250cm9sLXYxLmMtMTgyNS1cbi0tXG5tbS9tZW1jb250cm9sLXYxLmM9MjAyOD1zdHJ1Y3QgY2Z0eXBlIG1lbV9jZ3JvdXBfbGVnYWN5X2ZpbGVzW10gPSB7XG4tLVxubW0vbWVtY29udHJvbC12MS5jLTIwOTMtXHR9LFxubW0vbWVtY29udHJvbC12MS5jOjIwOTQ6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tZW1jb250cm9sLXYxLmMtMjA5NS1cdHtcbi0tXG5tbS9tZW1jb250cm9sLmM9Mzc4PXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWVtY2dfbm9kZV9zdGF0X2l0ZW1zW10gPSB7XG4tLVxubW0vbWVtY29udHJvbC5jLTQwOS0jZW5kaWZcbm1tL21lbWNvbnRyb2wuYzo0MTA6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xubW0vbWVtY29udHJvbC5jLTQxMS1cdFBHUFJPTU9URV9TVUNDRVNTLFxuLS1cbm1tL21lbWNvbnRyb2wuYz01OTg9c3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtZW1jZ192bV9ldmVudF9zdGF0W10gPSB7XG4tLVxubW0vbWVtY29udHJvbC5jLTYyNS0jZW5kaWZcbm1tL21lbWNvbnRyb2wuYzo2MjY6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xubW0vbWVtY29udHJvbC5jLTYyNy1cdE5VTUFfUEFHRV9NSUdSQVRFLFxuLS1cbm1tL21lbWNvbnRyb2wuYz0xNTkxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWVtb3J5X3N0YXQgbWVtb3J5X3N0YXRzW10gPSB7XG4tLVxubW0vbWVtY29udHJvbC5jLTE2NTAtXHR7IFwmIzM0O3BncmVmaWxsXCYjMzQ7LFx0XHRcdFBHUkVGSUxMXHRcdH0sXG5tbS9tZW1jb250cm9sLmM6MTY1MTojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tZW1jb250cm9sLmMtMTY1Mi1cdHsgXCYjMzQ7cGdwcm9tb3RlX3N1Y2Nlc3NcJiMzNDssXHRcdFBHUFJPTU9URV9TVUNDRVNTXHR9LFxuLS1cbm1tL21lbWNvbnRyb2wuYz0xNjczPXN0YXRpYyBpbnQgbWVtY2dfcGFnZV9zdGF0ZV9vdXRwdXRfdW5pdChpbnQgaXRlbSlcbi0tXG5tbS9tZW1jb250cm9sLmMtMTcwMi1cdGNhc2UgUEdSRUZJTEw6XG5tbS9tZW1jb250cm9sLmM6MTcwMzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tZW1jb250cm9sLmMtMTcwNC1cdGNhc2UgUEdQUk9NT1RFX1NVQ0NFU1M6XG4tLVxubW0vbWVtY29udHJvbC5jPTUwMzE9aW50IG1lbW9yeV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuLS1cbm1tL21lbWNvbnRyb2wuYy01MDQ1LVxubW0vbWVtY29udHJvbC5jOjUwNDY6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tZW1jb250cm9sLmMtNTA0Ny1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbHJ1dmVjX3BhZ2Vfc3RhdGVfb3V0cHV0KHN0cnVjdCBscnV2ZWMgKmxydXZlYyxcbi0tXG5tbS9tZW1jb250cm9sLmM9NTEyOD1zdGF0aWMgc3RydWN0IGNmdHlwZSBtZW1vcnlfZmlsZXNbXSA9IHtcbi0tXG5tbS9tZW1jb250cm9sLmMtNTE4MS1cdH0sXG5tbS9tZW1jb250cm9sLmM6NTE4MjojaWZkZWYgQ09ORklHX05VTUFcbm1tL21lbWNvbnRyb2wuYy01MTgzLVx0e1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTQ5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3RpZXJfc3Vic3lzID0ge1xuLS1cbm1tL21lbW9yeS10aWVycy5jLTUzLVxubW0vbWVtb3J5LXRpZXJzLmM6NTQ6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xubW0vbWVtb3J5LXRpZXJzLmMtNTUtLyoqXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NjU9Ym9vbCBmb2xpb191c2VfYWNjZXNzX3RpbWUoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9tZW1vcnktdGllcnMuYy03MS1cbm1tL21lbW9yeS10aWVycy5jOjcyOiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbW9yeS10aWVycy5jLTczLXN0YXRpYyBpbnQgdG9wX3RpZXJfYWRpc3RhbmNlO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTEzMT1zdGF0aWMgc3RydWN0IGRlbW90aW9uX25vZGVzICpub2RlX2RlbW90aW9uIF9fcmVhZF9tb3N0bHk7XG5tbS9tZW1vcnktdGllcnMuYzoxMzI6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xubW0vbWVtb3J5LXRpZXJzLmMtMTMzLVxuLS1cbm1tL21lbW9yeS10aWVycy5jPTI2MD1zdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpfX25vZGVfZ2V0X21lbW9yeV90aWVyKGludCBub2RlKVxuLS1cbm1tL21lbW9yeS10aWVycy5jLTI3NS1cbm1tL21lbW9yeS10aWVycy5jOjI3NjojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy0yNzctYm9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NTIxPXN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxubW0vbWVtb3J5LXRpZXJzLmM6NTIyOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cbm1tL21lbW9yeS10aWVycy5jLTUyMy1cbi0tXG5tbS9tZW1vcnktdGllcnMuYz05MDY9c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3RpZXJfaW5pdCh2b2lkKVxuLS1cbm1tL21lbW9yeS10aWVycy5jLTkxMy1cbm1tL21lbW9yeS10aWVycy5jOjkxNDojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy05MTUtXHRub2RlX2RlbW90aW9uID0ga3phbGxvY19vYmpzKHN0cnVjdCBkZW1vdGlvbl9ub2RlcywgbnJfbm9kZV9pZHMpO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTkzOT1ib29sIG51bWFfZGVtb3Rpb25fZW5hYmxlZCA9IGZhbHNlO1xubW0vbWVtb3J5LXRpZXJzLmMtOTQwLVxubW0vbWVtb3J5LXRpZXJzLmM6OTQxOiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbW9yeS10aWVycy5jLTk0Mi0jaWZkZWYgQ09ORklHX1NZU0ZTXG4tLVxubW0vbWVtb3J5LmM9NjExNz1pbnQgbnVtYV9taWdyYXRlX2NoZWNrKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9mYXVsdCAqdm1mLFxuLS1cbm1tL21lbW9yeS5jLTYxNTItXHRjb3VudF92bV9udW1hX2V2ZW50KE5VTUFfSElOVF9GQVVMVFMpO1xubW0vbWVtb3J5LmM6NjE1MzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tZW1vcnkuYy02MTU0LVx0Y291bnRfbWVtY2dfZm9saW9fZXZlbnRzKGZvbGlvLCBOVU1BX0hJTlRfRkFVTFRTLCAxKTtcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE4Nj1NT0RVTEVfUEFSTV9ERVNDKGF1dG9fbW92YWJsZV9yYXRpbyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5Mi0gKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTkzOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xOTQtc3RhdGljIGJvb2wgYXV0b19tb3ZhYmxlX251bWFfYXdhcmUgX19yZWFkX21vc3RseSA9IHRydWU7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xOTY9TU9EVUxFX1BBUk1fREVTQyhhdXRvX21vdmFibGVfbnVtYV9hd2FyZSxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5OC1cdFx0XCYjMzQ7XFxcJiMzNDthdXRvLW1vdmFibGVcXFwmIzM0OyBvbmxpbmUgcG9saWN5LiBEZWZhdWx0OiB0cnVlXCYjMzQ7KTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTk5OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMDAtXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz05NjA9c3RhdGljIHN0cnVjdCB6b25lICphdXRvX21vdmFibGVfem9uZV9mb3JfcGZuKGludCBuaWQsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDA5LVxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMDEwOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDExLVx0aWYgKGF1dG9fbW92YWJsZV9udW1hX2F3YXJlIFx1MDAyNlx1MDAyNlxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxMy1cdFx0Z290byBrZXJuZWxfem9uZTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTAxNDojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxNS1cbi0tXG5tbS9tZW1wb2xpY3kuYz03OTM9c3RhdGljIGludCBxdWV1ZV9mb2xpb3NfaHVnZXRsYihwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGhtYXNrLFxuLS1cbm1tL21lbXBvbGljeS5jLTg0Mi1cbm1tL21lbXBvbGljeS5jOjg0MzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tZW1wb2xpY3kuYy04NDQtLyoqXG4tLVxubW0vbWVtcG9saWN5LmM9OTEyPXVuc2lnbmVkIGxvbmcgY2hhbmdlX3Byb3RfbnVtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9tZW1wb2xpY3kuYy05MjktfVxubW0vbWVtcG9saWN5LmM6OTMwOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi9cbm1tL21lbXBvbGljeS5jLTkzMS1cbi0tXG5tbS9tZW1wb2xpY3kuYz0xMjA3PXN0YXRpYyBsb25nIGRvX2dldF9tZW1wb2xpY3koaW50ICpwb2xpY3ksIG5vZGVtYXNrX3QgKm5tYXNrLFxuLS1cbm1tL21lbXBvbGljeS5jLTEzMDctXG5tbS9tZW1wb2xpY3kuYzoxMzA4OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbXBvbGljeS5jLTEzMDktc3RhdGljIGJvb2wgbWlncmF0ZV9mb2xpb19hZGQoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqZm9saW9saXN0LFxuLS1cbm1tL21lbXBvbGljeS5jPTMzNzU9RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX2ZyZWVfc2hhcmVkX3BvbGljeSwgXCYjMzQ7a3ZtXCYjMzQ7KTtcbm1tL21lbXBvbGljeS5jLTMzNzYtXG5tbS9tZW1wb2xpY3kuYzozMzc3OiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcbm1tL21lbXBvbGljeS5jLTMzNzgtc3RhdGljIGludCBfX2luaXRkYXRhIG51bWFiYWxhbmNpbmdfb3ZlcnJpZGU7XG4tLVxubW0vbWVtcG9saWN5LmM9MzM4MD1zdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfbnVtYWJhbGFuY2luZ19lbmFibGUodm9pZClcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMzgzLVxubW0vbWVtcG9saWN5LmM6MzM4NDpcdGlmIChJU19FTkFCTEVEKENPTkZJR19OVU1BX0JBTEFOQ0lOR19ERUZBVUxUX0VOQUJMRUQpKVxubW0vbWVtcG9saWN5LmMtMzM4NS1cdFx0bnVtYWJhbGFuY2luZ19kZWZhdWx0ID0gdHJ1ZTtcbi0tXG5tbS9tZW1wb2xpY3kuYz0zNDE5PXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgY2hlY2tfbnVtYWJhbGFuY2luZ19lbmFibGUodm9pZClcbi0tXG5tbS9tZW1wb2xpY3kuYy0zNDIxLX1cbm1tL21lbXBvbGljeS5jOjM0MjI6I2VuZGlmIC8qIENPTkZJR19OVU1BX0JBTEFOQ0lORyAqL1xubW0vbWVtcG9saWN5LmMtMzQyMy1cbi0tXG5tbS9taWdyYXRlLmM9MjE5Nz1zdHJ1Y3QgZm9saW8gKmFsbG9jX21pZ3JhdGlvbl90YXJnZXQoc3RydWN0IGZvbGlvICpzcmMsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSlcbi0tXG5tbS9taWdyYXRlLmMtMjIzNS1cbm1tL21pZ3JhdGUuYzoyMjM2OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21pZ3JhdGUuYy0yMjM3LXN0YXRpYyBpbnQgc3RvcmVfc3RhdHVzKGludCBfX3VzZXIgKnN0YXR1cywgaW50IHN0YXJ0LCBpbnQgdmFsdWUsIGludCBucilcbi0tXG5tbS9taWdyYXRlLmM9MjYzMz1TWVNDQUxMX0RFRklORTYobW92ZV9wYWdlcywgcGlkX3QsIHBpZCwgdW5zaWduZWQgbG9uZywgbnJfcGFnZXMsXG4tLVxubW0vbWlncmF0ZS5jLTI2MzktfVxubW0vbWlncmF0ZS5jOjI2NDA6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xubW0vbWlncmF0ZS5jLTI2NDEtXG5tbS9taWdyYXRlLmM6MjY0MjojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9taWdyYXRlLmMtMjY0My0vKlxuLS1cbm1tL21pZ3JhdGUuYz0yNzU1PWludCBtaWdyYXRlX21pc3BsYWNlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbm9kZSlcbi0tXG5tbS9taWdyYXRlLmMtMjc4MS19XG5tbS9taWdyYXRlLmM6Mjc4MjojZW5kaWYgLyogQ09ORklHX05VTUFfQkFMQU5DSU5HICovXG4tLVxubW0vbW1faW5pdC5jLTQ1LVxubW0vbW1faW5pdC5jOjQ2OiNpZm5kZWYgQ09ORklHX05VTUFcbm1tL21tX2luaXQuYy00Ny11bnNpZ25lZCBsb25nIG1heF9tYXBucjtcbi0tXG5tbS9tbV9pbml0LmM9NTk2PXZvaWQgX19tZW1pbml0IF9faW5pdF9zaW5nbGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwZm4sXG4tLVxubW0vbW1faW5pdC5jLTYxMy1cbm1tL21tX2luaXQuYzo2MTQ6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tbV9pbml0LmMtNjE1LS8qXG4tLVxubW0vbW1faW5pdC5jPTY3OD1zdGF0aWMgaW5saW5lIHZvaWQgZml4dXBfaGFzaGRpc3Qodm9pZCkge31cbm1tL21tX2luaXQuYzo2Nzk6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXG5tbS9tbV9pbml0LmMtNjgwLVxuLS1cbm1tL21tem9uZS5jPTQ2PXN0YXRpYyBpbmxpbmUgaW50IHpyZWZfaW5fbm9kZW1hc2soc3RydWN0IHpvbmVyZWYgKnpyZWYsXG4tLVxubW0vbW16b25lLmMtNDgte1xubW0vbW16b25lLmM6NDk6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tbXpvbmUuYy01MC1cdHJldHVybiBub2RlX2lzc2V0KHpvbmVsaXN0X25vZGVfaWR4KHpyZWYpLCAqbm9kZXMpO1xuLS1cbm1tL21tem9uZS5jLTUyLVx0cmV0dXJuIDE7XG5tbS9tbXpvbmUuYzo1MzojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbm1tL21tem9uZS5jLTU0LX1cbi0tXG5tbS9tbXpvbmUuYz03Nj12b2lkIGxydXZlY19pbml0KHN0cnVjdCBscnV2ZWMgKmxydXZlYylcbi0tXG5tbS9tbXpvbmUuYy05Ny1cbm1tL21tem9uZS5jOjk4OiNpZiBkZWZpbmVkKENPTkZJR19OVU1BX0JBTEFOQ0lORykgXHUwMDI2XHUwMDI2ICFkZWZpbmVkKExBU1RfQ1BVUElEX05PVF9JTl9QQUdFX0ZMQUdTKVxubW0vbW16b25lLmMtOTktaW50IGZvbGlvX3hjaGdfbGFzdF9jcHVwaWQoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IGNwdXBpZClcbi0tXG5tbS9tcHJvdGVjdC5jPTY4Nj1sb25nIGNoYW5nZV9wcm90ZWN0aW9uKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsXG4tLVxubW0vbXByb3RlY3QuYy03MDMtXG5tbS9tcHJvdGVjdC5jOjcwNDojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tcHJvdGVjdC5jLTcwNS1cdC8qXG4tLVxubW0vbnVtYV9tZW1ibGtzLmM9NTA2PWludCBfX2luaXQgbnVtYV9maWxsX21lbWJsa3ModTY0IHN0YXJ0LCB1NjQgZW5kKVxuLS1cbm1tL251bWFfbWVtYmxrcy5jLTU1NS1cbm1tL251bWFfbWVtYmxrcy5jOjU1NjojaWZkZWYgQ09ORklHX05VTUFfS0VFUF9NRU1JTkZPXG5tbS9udW1hX21lbWJsa3MuYy01NTctc3RhdGljIGludCBtZW1pbmZvX3RvX25pZChzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSwgdTY0IHN0YXJ0KVxuLS1cbm1tL251bWFfbWVtYmxrcy5jPTU5MT1FWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7XG5tbS9udW1hX21lbWJsa3MuYy01OTItXG5tbS9udW1hX21lbWJsa3MuYzo1OTM6I2VuZGlmIC8qIENPTkZJR19OVU1BX0tFRVBfTUVNSU5GTyAqL1xuLS1cbm1tL29vbV9raWxsLmM9NzI9c3RhdGljIGlubGluZSBib29sIGlzX21lbWNnX29vbShzdHJ1Y3Qgb29tX2NvbnRyb2wgKm9jKVxuLS1cbm1tL29vbV9raWxsLmMtNzYtXG5tbS9vb21fa2lsbC5jOjc3OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vb29tX2tpbGwuYy03OC0vKipcbi0tXG5tbS9vb21fa2lsbC5jPTEyMj1zdGF0aWMgYm9vbCBvb21fY3B1c2V0X2VsaWdpYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3Qgb29tX2NvbnRyb2wgKm9jKVxuLS1cbm1tL29vbV9raWxsLmMtMTI1LX1cbm1tL29vbV9raWxsLmM6MTI2OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xubW0vb29tX2tpbGwuYy0xMjctXG4tLVxubW0vb29tX2tpbGwuYz0yNDk9c3RhdGljIGVudW0gb29tX2NvbnN0cmFpbnQgY29uc3RyYWluZWRfYWxsb2Moc3RydWN0IG9vbV9jb250cm9sICpvYylcbi0tXG5tbS9vb21fa2lsbC5jLTI2NC1cbm1tL29vbV9raWxsLmM6MjY1Olx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19OVU1BKSlcbm1tL29vbV9raWxsLmMtMjY2LVx0XHRyZXR1cm4gQ09OU1RSQUlOVF9OT05FO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xNjc9RVhQT1JUX1BFUl9DUFVfU1lNQk9MKG51bWFfbm9kZSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTE2OS1cbm1tL3BhZ2VfYWxsb2MuYzoxNzA6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtMTcxLURFRklORV9TVEFUSUNfS0VZX1RSVUUodm1fbnVtYV9zdGF0X2tleSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTE5NT1ub2RlbWFza190IG5vZGVfc3RhdGVzW05SX05PREVfU1RBVEVTXSBfX3JlYWRfbW9zdGx5ID0ge1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xOTctXHRbTl9PTkxJTkVdID0geyB7IFswXSA9IDFVTCB9IH0sXG5tbS9wYWdlX2FsbG9jLmM6MTk4OiNpZm5kZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0xOTktXHRbTl9OT1JNQUxfTUVNT1JZXSA9IHsgeyBbMF0gPSAxVUwgfSB9LFxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0yNTU4PWJvb2wgZGVjYXlfcGNwX2hpZ2goc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3ApXG4tLVxubW0vcGFnZV9hbGxvYy5jLTI1OTAtXG5tbS9wYWdlX2FsbG9jLmM6MjU5MTojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0yNTkyLS8qXG4tLVxubW0vcGFnZV9hbGxvYy5jPTMxNzk9c3RhdGljIGlubGluZSB2b2lkIHpvbmVfc3RhdGlzdGljcyhzdHJ1Y3Qgem9uZSAqcHJlZmVycmVkX3pvbmUsIHN0cnVjdCB6b25lICp6LFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0zMTgxLXtcbm1tL3BhZ2VfYWxsb2MuYzozMTgyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vcGFnZV9hbGxvYy5jLTMxODMtXHRlbnVtIG51bWFfc3RhdF9pdGVtIGxvY2FsX3N0YXQgPSBOVU1BX0xPQ0FMO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0zNjY1PXN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX3dhdGVybWFya19mYXN0KHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM3MDktXG5tbS9wYWdlX2FsbG9jLmM6MzcxMDojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0zNzExLWludCBfX3JlYWRfbW9zdGx5IG5vZGVfcmVjbGFpbV9kaXN0YW5jZSA9IFJFQ0xBSU1fRElTVEFOQ0U7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTM3MTM9c3RhdGljIGJvb2wgem9uZV9hbGxvd3NfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqbG9jYWxfem9uZSwgc3RydWN0IHpvbmUgKnpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM3MTctfVxubW0vcGFnZV9hbGxvYy5jOjM3MTg6I2Vsc2VcdC8qIENPTkZJR19OVU1BICovXG5tbS9wYWdlX2FsbG9jLmMtMzcxOS1zdGF0aWMgYm9vbCB6b25lX2FsbG93c19yZWNsYWltKHN0cnVjdCB6b25lICpsb2NhbF96b25lLCBzdHJ1Y3Qgem9uZSAqem9uZSlcblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTkyNgoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDQwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czoKCioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQqKgoKQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUgZ3V0cyBvZiBob3cgS1ZNIGhhbmRsZXMgZ3Vlc3QgbWVtb3J5LCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLiBJIG5lZWQgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaG93IG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIGFyZSBiZWluZyBtYW5hZ2VkLCBlc3BlY2lhbGx5IGFyb3VuZCB0aGUgY3J1Y2lhbCBmdW5jdGlvbnMgYGt2bV9nbWVtX2JpbmRfbm9kZWAgYW5kIGBrdm1fZ21lbV9jcmVhdGVgLiBVbmRlcnN0YW5kaW5nIHRoZXNlIGZ1bmN0aW9ucyBpcyBrZXkgdG8gc2VlaW5nIGhvdyBndWVzdCBtZW1vcnkgaXMgYWxsb2NhdGVkLCBib3VuZCB0byBwaHlzaWNhbCBtZW1vcnksIGFuZCBnZW5lcmFsbHkgaW50ZXJhY3RlZCB3aXRoIHdpdGhpbiB0aGUgS1ZNIGZyYW1ld29yay4gSSBuZWVkIHRvIHRyYWNlIHRoZSBmbG93LCBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIGFueSBudWFuY2VzIGluIGhvdyBtZW1vcnkgcmVnaW9ucyBhcmUgaGFuZGxlZCBhbmQgaG93IGBtZW1mZGBzIGFyZSBsZXZlcmFnZWQgZm9yIGd1ZXN0IG1lbW9yeS4gTGV0JiMzOTtzIHNlZSBob3cgZWZmaWNpZW50bHkgYW5kIHNlY3VyZWx5IHRoaXMgaXMgYWxsIGltcGxlbWVudGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQxNTpcdFx0LypcbiA0MTY6XHRcdCAqIFJldHVybiB0aGUgbWVtb3J5IHBvbGljeSBmb3IgdGhpcyBpbmRleCwgb3IgTlVMTCBpZiBub25lIGlzIHNldC5cbiA0MTc6XHRcdCAqXG4gNDE4Olx0XHQgKiBSZXR1cm5pbmcgTlVMTCwgZS5nLiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRhc2smIzM5O3MgbWVtb3J5IHBvbGljeSwgaXNcbiA0MTk6XHRcdCAqIGltcG9ydGFudCBmb3IgdGhlIC5nZXRfcG9saWN5IGtlcm5lbCBBQkk6IGl0IGluZGljYXRlcyB0aGF0IG5vXG4gNDIwOlx0XHQgKiBleHBsaWNpdCBwb2xpY3kgaGFzIGJlZW4gc2V0IHZpYSBtYmluZCgpIGZvciB0aGlzIG1lbW9yeS4gVGhlIGNhbGxlclxuIDQyMTpcdFx0ICogY2FuIHRoZW4gcmVwbGFjZSBOVUxMIHdpdGggdGhlIGRlZmF1bHQgbWVtb3J5IHBvbGljeSBpbnN0ZWFkIG9mIHRoZVxuIDQyMjpcdFx0ICogY3VycmVudCB0YXNrJiMzOTtzIG1lbW9yeSBwb2xpY3kuXG4gNDIzOlx0XHQgKi9cbiA0MjQ6XHRcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCBwZ29mZik7XG4gNDI1Olx0fVxuIDQyNjpcdFxuIDQyNzpcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuIDQyODpcdHtcbiA0Mjk6XHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcbiA0MzA6XHRcdG5vZGVtYXNrX3Qgbm9kZXM7XG4gNDMxOlx0XHRpbnQgZXJyO1xuIDQzMjpcdFxuIDQzMzpcdFx0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiA0MzQ6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNDM1Olx0XG4gNDM2Olx0XHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuIDQzNzpcdFx0cG9sID0gbWVtcG9saWN5X2NyZWF0ZShNUE9MX0JJTkQsIDAsIFx1MDAyNm5vZGVzKTtcbiA0Mzg6XHRcdGlmIChJU19FUlIocG9sKSlcbiA0Mzk6XHRcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbiA0NDA6XHRcbiA0NDE6XHRcdGVyciA9IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2Vwb2xpY3ksIDAsXG4gNDQyOlx0XHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbiA0NDM6XHRcdG1wb2xfcHV0KHBvbCk7XG4gNDQ0Olx0XHRyZXR1cm4gZXJyO1xuIDQ0NTpcdH1cbiA0NDY6XHQjZWxzZVxuIDQ0NzpcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuIDQ0ODpcdHtcbiA0NDk6XHRcdHJldHVybiAtRUlOVkFMO1xuIDQ1MDpcdH1cbiA0NTE6XHQjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbiA0NTI6XHRcbiA0NTM6XHRzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9nbWVtX3ZtX29wcyA9IHtcbiA0NTQ6XHRcdC5mYXVsdFx0XHQ9IGt2bV9nbWVtX2ZhdWx0X3VzZXJfbWFwcGluZyxcbiA0NTU6XHQjaWZkZWYgQ09ORklHX05VTUFcbiA0NTY6XHRcdC5nZXRfcG9saWN5XHQ9IGt2bV9nbWVtX2dldF9wb2xpY3ksXG4gNDU3Olx0XHQuc2V0X3BvbGljeVx0PSBrdm1fZ21lbV9zZXRfcG9saWN5LFxuIDQ1ODpcdCNlbmRpZlxuIDQ1OTpcdH07XG4gNDYwOlx0XG4gNDYxOlx0c3RhdGljIGludCBrdm1fZ21lbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbiA0NjI6XHR7XG4gNDYzOlx0XHRpZiAoIWt2bV9nbWVtX3N1cHBvcnRzX21tYXAoZmlsZV9pbm9kZShmaWxlKSkpXG4gNDY0Olx0XHRcdHJldHVybiAtRU5PREVWO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjk3MgoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGFuYWx5c2lzIG9mIHRoZSBwcm92aWRlZCB0ZXh0LCByZW5kZXJlZCBpbiB0aGUgZmlyc3QgcGVyc29uLCBhc3N1bWluZyBJJiMzOTttIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6CgoqKkRpdmluZyBpbnRvIEd1ZXN0IE1lbW9yeSBNYW5hZ2VtZW50IGluIEtWTSoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBndWVzdCBtZW1vcnkgbWFuYWdlbWVudCB3aXRoaW4gS1ZNLCBzcGVjaWZpY2FsbHkgdGhlIGBndWVzdF9tZW1mZC5jYCBmaWxlLiBNeSBhdHRlbnRpb24gaXMgZHJhd24gdG8gdGhlIHJlZ2lvbiBhcm91bmQgbGluZXMgNTQwIHRocm91Z2ggNjQ1LiBUaGF0IHN1Z2dlc3RzIHdlJiMzOTtyZSBsb29raW5nIGF0IGEgY3JpdGljYWwgc2VjdGlvbiDigJMgbWF5YmUgc29tZSBhbGxvY2F0aW9uIG9yIGRlYWxsb2NhdGlvbiBsb2dpYywgcGVyaGFwcyByZWxhdGVkIHRvIG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGUgZ3Vlc3QuIE15IGluaXRpYWwgaHlwb3RoZXNpcyBpcyB0aGF0IHdlJiMzOTtyZSBsaWtlbHkgZGVhbGluZyB3aXRoIGVpdGhlcjogdGhlIGhhbmRsaW5nIG9mIHNoYXJlZCBtZW1vcnkgcmVnaW9ucywgb3IgZ3Vlc3QgbWVtb3J5IG1hcHBpbmcvdW5tYXBwaW5nLCBvciBwZXJoYXBzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbW9yeS1iYWNrZWQgZmlsZSBkZXNjcmlwdG9yIHdpdGhpbiB0aGUgZ3Vlc3QgY29udGV4dC4gVGhlIHNwZWNpZmljIGxpbmVzIHNob3VsZCByZXZlYWwgd2hpY2ggb25lLiBJIGFudGljaXBhdGUgdGhpcyBzZWN0aW9uIHdvdWxkIGludm9sdmUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgVk1NLCBwb3NzaWJseSBhcm91bmQgcGFnZSB0YWJsZXMsIG1lbW9yeSByZWdpb25zLCBhbmQgZXZlbnQgaGFuZGxpbmcgdGhhdCBpcyByZWxhdGVkIHRvIHRoYXQuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayB2ZXJ5IGNsb3NlbHkgYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBiZWluZyBtYW5pcHVsYXRlZCBhbmQgdGhlIGNvbnRyb2wgZmxvdyB0byBmdWxseSB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBJIGV4cGVjdCB0byBiZSB1c2luZyBteSBrbm93bGVkZ2Ugb2YgS1ZNIGludGVybmFscyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdGVjaG5pcXVlcyB0byBmdWxseSB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgdGFraW5nIHBsYWNlIGluIHRoZXNlIGxpbmVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1NDA6XHRcdC5zZXRhdHRyXHQ9IGt2bV9nbWVtX3NldGF0dHIsXG4gNTQxOlx0fTtcbiA1NDI6XHRcbiA1NDM6XHRib29sIF9fd2VhayBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKHN0cnVjdCBrdm0gKmt2bSlcbiA1NDQ6XHR7XG4gNTQ1Olx0XHRyZXR1cm4gdHJ1ZTtcbiA1NDY6XHR9XG4gNTQ3Olx0XG4gNTQ4Olx0c3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKVxuIDU0OTpcdHtcbiA1NTA6XHRcdHN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gXCYjMzQ7W2t2bS1nbWVtXVwmIzM0OztcbiA1NTE6XHRcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XG4gNTUyOlx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIDU1MzpcdFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gNTU0Olx0XHRpbnQgZmQsIGVycjtcbiA1NTU6XHRcbiA1NTY6XHRcdGZkID0gZ2V0X3VudXNlZF9mZF9mbGFncygwKTtcbiA1NTc6XHRcdGlmIChmZCBcdTAwM2MgMClcbiA1NTg6XHRcdFx0cmV0dXJuIGZkO1xuIDU1OTpcdFxuIDU2MDpcdFx0ZiA9IGt6YWxsb2Nfb2JqKCpmKTtcbiA1NjE6XHRcdGlmICghZikge1xuIDU2MjpcdFx0XHRlcnIgPSAtRU5PTUVNO1xuIDU2MzpcdFx0XHRnb3RvIGVycl9mZDtcbiA1NjQ6XHRcdH1cbiA1NjU6XHRcbiA1NjY6XHRcdC8qIF9fZnB1dCgpIHdpbGwgdGFrZSBjYXJlIG9mIGZvcHNfcHV0KCkuICovXG4gNTY3Olx0XHRpZiAoIWZvcHNfZ2V0KFx1MDAyNmt2bV9nbWVtX2ZvcHMpKSB7XG4gNTY4Olx0XHRcdGVyciA9IC1FTk9FTlQ7XG4gNTY5Olx0XHRcdGdvdG8gZXJyX2dtZW07XG4gNTcwOlx0XHR9XG4gNTcxOlx0XG4gNTcyOlx0XHRpbm9kZSA9IGFub25faW5vZGVfbWFrZV9zZWN1cmVfaW5vZGUoa3ZtX2dtZW1fbW50LVx1MDAzZW1udF9zYiwgbmFtZSwgTlVMTCk7XG4gNTczOlx0XHRpZiAoSVNfRVJSKGlub2RlKSkge1xuIDU3NDpcdFx0XHRlcnIgPSBQVFJfRVJSKGlub2RlKTtcbiA1NzU6XHRcdFx0Z290byBlcnJfZm9wcztcbiA1NzY6XHRcdH1cbiA1Nzc6XHRcbiA1Nzg6XHRcdGlub2RlLVx1MDAzZWlfb3AgPSBcdTAwMjZrdm1fZ21lbV9pb3BzO1xuIDU3OTpcdFx0aW5vZGUtXHUwMDNlaV9tYXBwaW5nLVx1MDAzZWFfb3BzID0gXHUwMDI2a3ZtX2dtZW1fYW9wcztcbiA1ODA6XHRcdGlub2RlLVx1MDAzZWlfbW9kZSB8PSBTX0lGUkVHO1xuIDU4MTpcdFx0aW5vZGUtXHUwMDNlaV9zaXplID0gc2l6ZTtcbiA1ODI6XHRcdG1hcHBpbmdfc2V0X2dmcF9tYXNrKGlub2RlLVx1MDAzZWlfbWFwcGluZywgR0ZQX0hJR0hVU0VSKTtcbiA1ODM6XHRcdG1hcHBpbmdfc2V0X2luYWNjZXNzaWJsZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDU4NDpcdFx0LyogVW5tb3ZhYmxlIG1hcHBpbmdzIGFyZSBzdXBwb3NlZCB0byBiZSBtYXJrZWQgdW5ldmljdGFibGUgYXMgd2VsbC4gKi9cbiA1ODU6XHRcdFdBUk5fT05fT05DRSghbWFwcGluZ191bmV2aWN0YWJsZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpKTtcbiA1ODY6XHRcbiA1ODc6XHRcdEdNRU1fSShpbm9kZSktXHUwMDNlZmxhZ3MgPSBmbGFncztcbiA1ODg6XHRcbiA1ODk6XHRcdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbiA1OTA6XHRcdFx0ZXJyID0ga3ZtX2dtZW1fYmluZF9ub2RlKGlub2RlLCBub2RlKTtcbiA1OTE6XHRcdFx0aWYgKGVycilcbiA1OTI6XHRcdFx0XHRnb3RvIGVycl9pbm9kZTtcbiA1OTM6XHRcdH1cbiA1OTQ6XHRcbiA1OTU6XHRcdGZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsIFx1MDAyNmt2bV9nbWVtX2ZvcHMpO1xuIDU5NjpcdFx0aWYgKElTX0VSUihmaWxlKSkge1xuIDU5NzpcdFx0XHRlcnIgPSBQVFJfRVJSKGZpbGUpO1xuIDU5ODpcdFx0XHRnb3RvIGVycl9pbm9kZTtcbiA1OTk6XHRcdH1cbiA2MDA6XHRcbiA2MDE6XHRcdGZpbGUtXHUwMDNlZl9mbGFncyB8PSBPX0xBUkdFRklMRTtcbiA2MDI6XHRcdGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gZjtcbiA2MDM6XHRcbiA2MDQ6XHRcdGt2bV9nZXRfa3ZtKGt2bSk7XG4gNjA1Olx0XHRmLVx1MDAzZWt2bSA9IGt2bTtcbiA2MDY6XHRcdHhhX2luaXQoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncyk7XG4gNjA3Olx0XHRsaXN0X2FkZChcdTAwMjZmLVx1MDAzZWVudHJ5LCBcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZWdtZW1fZmlsZV9saXN0KTtcbiA2MDg6XHRcbiA2MDk6XHRcdGZkX2luc3RhbGwoZmQsIGZpbGUpO1xuIDYxMDpcdFx0cmV0dXJuIGZkO1xuIDYxMTpcdFxuIDYxMjpcdGVycl9pbm9kZTpcbiA2MTM6XHRcdGlwdXQoaW5vZGUpO1xuIDYxNDpcdGVycl9mb3BzOlxuIDYxNTpcdFx0Zm9wc19wdXQoXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XG4gNjE2Olx0ZXJyX2dtZW06XG4gNjE3Olx0XHRrZnJlZShmKTtcbiA2MTg6XHRlcnJfZmQ6XG4gNjE5Olx0XHRwdXRfdW51c2VkX2ZkKGZkKTtcbiA2MjA6XHRcdHJldHVybiBlcnI7XG4gNjIxOlx0fVxuIDYyMjpcdFxuIDYyMzpcdGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbiA2MjQ6XHR7XG4gNjI1Olx0XHRsb2ZmX3Qgc2l6ZSA9IGFyZ3MtXHUwMDNlc2l6ZTtcbiA2MjY6XHRcdHU2NCBmbGFncyA9IGFyZ3MtXHUwMDNlZmxhZ3M7XG4gNjI3Olx0XHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcbiA2Mjg6XHRcbiA2Mjk6XHRcdGlmIChmbGFncyBcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcbiA2MzA6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjMxOlx0XG4gNjMyOlx0XHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiA2MzM6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjM0Olx0XG4gNjM1Olx0XHRpZiAoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XG4gNjM2Olx0XHRcdGlmIChhcmdzLVx1MDAzZXBhZCB8fCBhcmdzLVx1MDAzZW5vZGUgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4gNjM3Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjM4Olx0XHRcdG5vZGUgPSBhcmdzLVx1MDAzZW5vZGU7XG4gNjM5Olx0XHR9IGVsc2UgaWYgKGFyZ3MtXHUwMDNlbm9kZSB8fCBhcmdzLVx1MDAzZXBhZCkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDc5MwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIEkgZGVsdmUgaW50byB0aGUgY29kZToKCioqRGl2aW5nIGludG8gYG1tL21lbXBvbGljeS5jYCoqCgpPa2F5LCBsZXQmIzM5O3Mgem9vbSBpbiBvbiBgbW0vbWVtcG9saWN5LmNgLiBJIG5lZWQgdG8gcmV2aWV3IHRoaXMgc2VjdGlvbiBjYXJlZnVsbHkuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBmdW5jdGlvbnMgYG1lbXBvbGljeV9jcmVhdGVgLCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAsIGFuZCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeWAuIFRoZXNlIGFyZSBrZXkgd2hlbiB5b3UgYXJlIGxvb2tpbmcgYXQgaG93IG1lbW9yeSBwb2xpY2llcyBhcmUgaGFuZGxlZCBhbmQgc2hhcmVkIGFjcm9zcyB0aGUgc3lzdGVtLiBUbyBnZXQgdGhlIGRldGFpbHMsIEkgc2hvdWxkIHJlYWQgbGluZXMgMTA4MCB0aHJvdWdoIDExMzAsIGFuZCB0aGVuIEkgd2FudCB0byBqdW1wIGRvd24gdG8gbGluZXMgMzMwMCB0aHJvdWdoIDMzNzAuIFRoYXQgd2lsbCBnaXZlIG1lIGEgc29saWQgdmlldyBvZiB0aGUgcGVydGluZW50IGxvZ2ljLiBJJiMzOTttIGZvY3VzaW5nIG9uIHRoZXNlIHJlZ2lvbnMgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgY29yZSBmdW5jdGlvbnMgaW50ZXJhY3Qgd2l0aGluIHRoZSBsYXJnZXIgbWVtb3J5IG1hbmFnZW1lbnQgZnJhbWV3b3JrLiBMZXQmIzM5O3Mgc2VlIHdoYXQgaW50ZXJlc3RpbmcgdGlkYml0cyBhcmUgaGlkZGVuIGluIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTA4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1NQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMDgwOlx0XHR2bWEgPSAgdm1hX21vZGlmeV9wb2xpY3kodm1pLCAqcHJldiwgdm1hLCB2bXN0YXJ0LCB2bWVuZCwgbmV3X3BvbCk7XG4xMDgxOlx0XHRpZiAoSVNfRVJSKHZtYSkpXG4xMDgyOlx0XHRcdHJldHVybiBQVFJfRVJSKHZtYSk7XG4xMDgzOlx0XG4xMDg0Olx0XHQqcHJldiA9IHZtYTtcbjEwODU6XHRcdHJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTtcbjEwODY6XHR9XG4xMDg3Olx0XG4xMDg4Olx0LyoqXG4xMDg5Olx0ICogbWVtcG9saWN5X2NyZWF0ZSAtIGJ1aWxkIGEgdmFsaWRhdGVkLCBjcHVzZXQtY29udGV4dHVhbGlzZWQgbWVtcG9saWN5XG4xMDkwOlx0ICogQG1vZGU6IE1QT0xfKiBtb2RlXG4xMDkxOlx0ICogQGZsYWdzOiBNUE9MX0ZfKiBmbGFnc1xuMTA5MjpcdCAqIEBub2RlczogdGFyZ2V0IG5vZGVtYXNrLCBvciBOVUxMIChpbnRlcnByZXRlZCBwZXIgQG1vZGU7IHNlZSBtcG9sX25ldygpKVxuMTA5MzpcdCAqXG4xMDk0Olx0ICogQ3JlYXRlcyBhIG5ldyBwb2xpY3kgYW5kIGNvbnN0cmFpbnMgaXQgdG8gdGhlIHRhc2smIzM5O3MgY3B1c2V0LlxuMTA5NTpcdCAqXG4xMDk2Olx0ICogVGhlIGNhbGxlciBvd25zIHRoZSByZXR1cm5lZCByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cbjEwOTc6XHQgKlxuMTA5ODpcdCAqIFJldHVybjogdGhlIHBvbGljeSAoTlVMTCBmb3IgYSBkZWZhdWx0IHBvbGljeSksIG9yIGFuIEVSUl9QVFIgb24gZmFpbHVyZS5cbjEwOTk6XHQgKi9cbjExMDA6XHRzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuMTEwMTpcdFx0XHRub2RlbWFza190ICpub2RlcylcbjExMDI6XHR7XG4xMTAzOlx0XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4xMTA0Olx0XHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xuMTEwNTpcdFx0aW50IGVycjtcbjExMDY6XHRcbjExMDc6XHRcdGlmICghc2NyYXRjaClcbjExMDg6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4xMTA5Olx0XG4xMTEwOlx0XHRwb2wgPSBtcG9sX25ldyhtb2RlLCBmbGFncywgbm9kZXMpO1xuMTExMTpcdFx0aWYgKElTX0VSUihwb2wpKVxuMTExMjpcdFx0XHRnb3RvIG91dDtcbjExMTM6XHRcbjExMTQ6XHRcdHRhc2tfbG9jayhjdXJyZW50KTtcbjExMTU6XHRcdGVyciA9IG1wb2xfc2V0X25vZGVtYXNrKHBvbCwgbm9kZXMsIHNjcmF0Y2gpO1xuMTExNjpcdFx0dGFza191bmxvY2soY3VycmVudCk7XG4xMTE3Olx0XHRpZiAoZXJyKSB7XG4xMTE4Olx0XHRcdG1wb2xfcHV0KHBvbCk7XG4xMTE5Olx0XHRcdHBvbCA9IEVSUl9QVFIoZXJyKTtcbjExMjA6XHRcdH1cbjExMjE6XHRvdXQ6XG4xMTIyOlx0XHROT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7XG4xMTIzOlx0XHRyZXR1cm4gcG9sO1xuMTEyNDpcdH1cbjExMjU6XHRFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsIFwmIzM0O2t2bVwmIzM0Oyk7XG4xMTI2Olx0XG4xMTI3Olx0c3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbjExMjg6XHRcdFx0XHQgICAgIG5vZGVtYXNrX3QgKm5vZGVzKVxuMTEyOTpcdHtcbjExMzA6XHRcdHN0cnVjdCBtZW1wb2xpY3kgKm5ldywgKm9sZDtcbjExMzE6XHRcdE5PREVNQVNLX1NDUkFUQ0goc2NyYXRjaCk7XG4xMTMyOlx0XHRpbnQgcmV0O1xuMTEzMzpcdFxuMTEzNDpcdFx0aWYgKCFzY3JhdGNoKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTkwOQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG1tL21lbXBvbGljeS5jYCoqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBtZW1vcnkgcG9saWN5IGltcGxlbWVudGF0aW9uLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGhpbiBsaW5lcyAzMzAwLTMzNzAgb2YgYG1tL21lbXBvbGljeS5jYC4gQmFzZWQgb24gY29udGV4dCwgSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBzZWN0aW9uIHRvIGRlYWwgd2l0aC4uLiB3ZWxsLCBiYXNlZCBvbiB0aGUgZnVuY3Rpb24gbmFtZXMgSSBrbm93LCBtYXliZSBpdCYjMzk7cyByZWxhdGVkIHRvIE5VTUEgYmFsYW5jaW5nIG9yIHNvbWUgc3BlY2lmaWMgbWVtb3J5IGFsbG9jYXRpb24gcG9saWN5IGhhbmRsaW5nLiBJ4oCZbGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleGFjdCBmdW5jdGlvbiBvciBmdW5jdGlvbnMgd2l0aGluIHRoYXQgcmFuZ2UuIEl0IGNvdWxkIGJlIHNvbWUgY29yZSBsb2dpYyBpbiBgbXBvbF94eHhgIGZhbWlseS4gCgpNeSBpbW1lZGlhdGUgZm9jdXMgd2lsbCBiZSB0byBkZXRlcm1pbmUgdGhlICp3aHkqIGFuZCAqaG93KiBvZiB0aGUgY29kZSBpbiB0aGF0IGJsb2NrLiBXaGF0IGlzIHRoZSBvYmplY3RpdmUgb2YgdGhpcyBjb2RlPyBXaGF0IHNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyBvciB2YXJpYWJsZXMgaXMgaXQgd29ya2luZyB3aXRoPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBsb29rIGZvciBpbW1lZGlhdGVseT8gSSYjMzk7bGwgcHJvYmFibHkgc3RhcnQgYnkgZ3JlcHBpbmcgZm9yIGFueSByZWxhdGVkIHN5bWJvbHMgb3IgY29tbWVudHMgdG8gdW5kZXJzdGFuZCB0aGUgcHVycG9zZSBiZWZvcmUgZGl2aW5nIGludG8gaW5kaXZpZHVhbCBsaW5lcy4gSSYjMzk7bSBob3BpbmcgdGhlcmUmIzM5O3MgYSBnb29kIGV4cGxhbmF0aW9uIG9yIHJlbGV2YW50IGNvbW1lbnRzLiBJdCBpcyBhIGxhcmdlIHJhbmdlLCBzbyBpdCBtdXN0IGJlIGEgc2lnbmlmaWNhbnQgc2VjdGlvbiBvZiBjb2RlLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IHJlYWRpbmchCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtcG9saWN5LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMzAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDY1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzMzMDA6XHRcbjMzMDE6XHRcdFx0LyogYWxsb2Mgbm9kZSBjb3ZlcmluZyBlbnRpcmUgZmlsZTsgYWRkcyByZWYgdG8gZmlsZSYjMzk7cyBucG9sICovXG4zMzAyOlx0XHRcdHNuID0gc3BfYWxsb2MoMCwgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgbnBvbCk7XG4zMzAzOlx0XHRcdGlmIChzbilcbjMzMDQ6XHRcdFx0XHRzcF9pbnNlcnQoc3AsIHNuKTtcbjMzMDU6XHRwdXRfbnBvbDpcbjMzMDY6XHRcdFx0bXBvbF9wdXQobnBvbCk7XHQvKiBkcm9wIGluaXRpYWwgcmVmIG9uIGZpbGUmIzM5O3MgbnBvbCAqL1xuMzMwNzpcdGZyZWVfc2NyYXRjaDpcbjMzMDg6XHRcdFx0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xuMzMwOTpcdHB1dF9tcG9sOlxuMzMxMDpcdFx0XHRtcG9sX3B1dChtcG9sKTtcdC8qIGRyb3Agb3VyIGluY29taW5nIHJlZiBvbiBzYiBtcG9sICovXG4zMzExOlx0XHR9XG4zMzEyOlx0fVxuMzMxMzpcdEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zaGFyZWRfcG9saWN5X2luaXQsIFwmIzM0O2t2bVwmIzM0Oyk7XG4zMzE0Olx0XG4zMzE1Olx0LyoqXG4zMzE2Olx0ICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxuMzMxNzpcdCAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZVxuMzMxODpcdCAqIEBzdGFydDogZmlyc3QgcGFnZSBvZmZzZXQgKGluY2x1c2l2ZSlcbjMzMTk6XHQgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSlcbjMzMjA6XHQgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlXG4zMzIxOlx0ICpcbjMzMjI6XHQgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS5cbjMzMjM6XHQgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuXG4zMzI0Olx0ICpcbjMzMjU6XHQgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LlxuMzMyNjpcdCAqXG4zMzI3Olx0ICogVW5saWtlIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koKSwgbm8gVk1BIGlzIHJlcXVpcmVkLCBzbyBhIHJhbmdlIHRoYXRcbjMzMjg6XHQgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLlxuMzMyOTpcdCAqXG4zMzMwOlx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuMzMzMTpcdCAqL1xuMzMzMjpcdGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcbjMzMzM6XHRcdFx0XHRcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuMzMzNDpcdHtcbjMzMzU6XHRcdHN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMO1xuMzMzNjpcdFx0aW50IGVycjtcbjMzMzc6XHRcbjMzMzg6XHRcdGlmIChwb2wpIHtcbjMzMzk6XHRcdFx0bmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTtcbjMzNDA6XHRcdFx0aWYgKCFuZXcpXG4zMzQxOlx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4zMzQyOlx0XHR9XG4zMzQzOlx0XHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XG4zMzQ0Olx0XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG4zMzQ1Olx0XHRcdHNwX2ZyZWUobmV3KTtcbjMzNDY6XHRcdHJldHVybiBlcnI7XG4zMzQ3Olx0fVxuMzM0ODpcdEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgXCYjMzQ7a3ZtXCYjMzQ7KTtcbjMzNDk6XHRcbjMzNTA6XHRpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4zMzUxOlx0XHRcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbjMzNTI6XHR7XG4zMzUzOlx0XHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVx1MDAzZXZtX3Bnb2ZmLFxuMzM1NDpcdFx0XHRcdFx0XHQgICB2bWEtXHUwMDNldm1fcGdvZmYgJiM0Mzsgdm1hX3BhZ2VzKHZtYSksIHBvbCk7XG4zMzU1Olx0fVxuMzM1NjpcdEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgXCYjMzQ7a3ZtXCYjMzQ7KTtcbjMzNTc6XHRcbjMzNTg6XHQvKiBGcmVlIGEgYmFja2luZyBwb2xpY3kgc3RvcmUgb24gaW5vZGUgZGVsZXRlLiAqL1xuMzM1OTpcdHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKVxuMzM2MDpcdHtcbjMzNjE6XHRcdHN0cnVjdCBzcF9ub2RlICpuO1xuMzM2MjpcdFx0c3RydWN0IHJiX25vZGUgKm5leHQ7XG4zMzYzOlx0XG4zMzY0Olx0XHRpZiAoIXNwLVx1MDAzZXJvb3QucmJfbm9kZSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjczMTIKCQkJCQkJCW91dHB1dDogMTg2CgkJCQkJCQl0aG91Z2h0czogNjAzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIEtWTSBHdWVzdCBNZW1vcnkgYW5kIE5VTUEgSW50ZWdyYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiB0aGUgYEZvY3VzU3ltYm9sc2AgYW5kIGBFbmFibGVDb25maWdzYCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjb2RlLiBJdCBzZWVtcyBsaWtlIHRoZSBjb3JlIGNoYW5nZXMgcmV2b2x2ZSBhcm91bmQgS1ZNJiMzOTtzIGBndWVzdF9tZW1mZGAgYW5kIE5VTUEgbWVtb3J5IG1hbmFnZW1lbnQuCgpJIHNlZSB0aGF0IGBFbmFibGVDb25maWdzYCBpbmNsdWRlIGBLVk1gICh3aXRoIGl0cyBkZXBlbmRlbmNpZXMpIGFuZCBgTlVNQWAuIFRoaXMgaW1tZWRpYXRlbHkgcG9pbnRzIHRvIHRoZSBhcmVhIG9mIGludGVyZXN0OiB0aGUgaW50ZXJwbGF5IG9mIEtWTSB2aXJ0dWFsaXphdGlvbiBhbmQgTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2Vzcy4gVGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QgcHJvdmlkZXMgc3BlY2lmaWMgZnVuY3Rpb24gbmFtZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb3IgaW50cm9kdWNlZDogYGt2bV9nbWVtX2NyZWF0ZWAsIGBrdm1fZ21lbV9iaW5kX25vZGVgLCBgbWVtcG9saWN5X2NyZWF0ZWAsIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCwgYW5kIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5YC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBzdHJvbmcgaW5kaWNhdG9ycyBvZiB0aGUga2V5IGNoYW5nZXMuCgpOb3csIGxldCYjMzk7cyBkcmlsbCBkb3duIGZ1cnRoZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjYWxsIGZsb3cgYW5kIGRlcGVuZGVuY2llcy4gSSBjYW4gc2VlIHRoYXQgYGt2bV9nbWVtX2NyZWF0ZWAgaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGlzIHRoZSBlbnRyeSBwb2ludCwgYW5kIGl0IGNhbGxzIGBfX2t2bV9nbWVtX2NyZWF0ZWAsIHdoaWNoIHRoZW4gY2FsbHMgYGt2bV9nbWVtX2JpbmRfbm9kZWAuIFRoaXMgdGVsbHMgbWUgdGhlIGNyZWF0aW9uIHByb2Nlc3MgaXMga2V5LCB3aXRoIGEgYmluZGluZyBvcGVyYXRpb24gaGFwcGVuaW5nIGFzIHBhcnQgb2YgaXQuIFRoZSBgbWVtcG9saWN5YCBmdW5jdGlvbnMgYXJlIG5ldyBvciBtb2RpZmllZCBpbiBgbW0vbWVtcG9saWN5LmNgLCBzdWdnZXN0aW5nIG1lbW9yeSBwb2xpY3kgY29udHJvbHMgYXJlIGJlaW5nIGFkZGVkIG9yIGF1Z21lbnRlZC4KCkFyZSB0aGVzZSBmdW5jdGlvbnMgZ2VuZXJhbD8gTm8sIHRoZXkmIzM5O3JlIG5vdCBjb3JlIGtlcm5lbCBob3QtcGF0aHMuIFRoZXkgYXJlIHNwZWNpZmljIHRvIHRoZSBLVk0gZ3Vlc3QgbWVtZmQgYW5kIHNoYXJlZCBtZW1wb2xpY2llcy4gSSB3YW50IHRvIGVtcGhhc2l6ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgc3BlY2lmaWMgdG8gS1ZNIGd1ZXN0IG1lbWZkIGFuZCBzaGFyZWQgbWVtcG9saWNpZXMuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVzZSBhcmUgbm90IHViaXF1aXRvdXMgaG90LXBhdGhzIHRoYXQgbWF5IGNhdXNlIHdpZGUtc3ByZWFkIHBlcmZvcm1hbmNlIGlzc3Vlcy4KCkkgY29uZmlybSB0aGF0IHRoaXMgaXMgb24gYW1kNjQsIGFuZCB0aGUgY29uZmlndXJhdGlvbiBpcyBndWFyZGVkIGJ5IGBDT05GSUdfS1ZNYCAoYW5kIGBDT05GSUdfS1ZNX0lOVEVMYCBvciBgQ09ORklHX0tWTV9BTURgKSwgd2hpY2ggaW4gdHVybiBzZWxlY3RzIGBDT05GSUdfS1ZNX0dVRVNUX01FTUZEYC4gYENPTkZJR19OVU1BYCBpcyBhbHNvIGltcG9ydGFudCBhcyBpdCBlbmFibGVzIE5VTUEgbWVtcG9saWN5IHN1cHBvcnQgd2l0aGluIHRoZSBndWVzdF9tZW1mZCBjb2RlLCB3aGljaCBpcyBleHBlY3RlZC4KCldpdGggdGhpcyBpbiBtaW5kLCB0aGUgYHNldC1yZXN1bHRzYCBwYXJhbWV0ZXJzIGFyZSBjbGVhci4gVGhpcyBwYXRjaCBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgY2FuIHJlYXNvbiB0aGF0IHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIGEgbmV3IGZsYWcgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCwgYW5kIGltcGxlbWVudHMgbWVtcG9saWN5IGhlbHBlcnMgYG1lbXBvbGljeV9jcmVhdGVgIGFuZCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgcmVhY2hhYmxlIHZpYSBLVk0gZ3Vlc3RfbWVtZmQgY3JlYXRpb24gaW9jdGwuIEkmIzM5O2xsIG5lZWQgdG8gdXNlIGBbJiMzNDtrdm1fZ21lbV9jcmVhdGUmIzM0OywgJiMzNDtrdm1fZ21lbV9iaW5kX25vZGUmIzM0OywgJiMzNDttZW1wb2xpY3lfY3JlYXRlJiMzNDssICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSYjMzQ7LCAmIzM0O21wb2xfc2V0X3NoYXJlZF9wb2xpY3kmIzM0O11gIGFzIG15IGBGb2N1c1N5bWJvbHNgIGFuZCBgWyYjMzQ7S1ZNJiMzNDssICYjMzQ7TlVNQSYjMzQ7XWAgYXMgYEVuYWJsZUNvbmZpZ3NgIGZvciBwcm9wZXIgdGVzdGluZy4gTm93LCBsZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O05VTUEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9jcmVhdGUmIzM0OywKICAgICYjMzQ7a3ZtX2dtZW1fYmluZF9ub2RlJiMzNDssCiAgICAmIzM0O21lbXBvbGljeV9jcmVhdGUmIzM0OywKICAgICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSYjMzQ7LAogICAgJiMzNDttcG9sX3NldF9zaGFyZWRfcG9saWN5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgTlVNQSBub2RlIGJpbmRpbmcgc3VwcG9ydCBmb3IgS1ZNIGd1ZXN0X21lbWZkIHZpYSB0aGUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgZmxhZyBpbiBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBhbmQgYWRkcyB0aGUgbWVtcG9saWN5IGhlbHBlcnMgbWVtcG9saWN5X2NyZWF0ZSgpIGFuZCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKCkuIFRoZXNlIGNoYW5nZXMgbW9kaWZ5IHJlYWNoYWJsZSBrZXJuZWwgbG9naWMgaW4gbW0vbWVtcG9saWN5LmMgYW5kIHZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O05VTUEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9jcmVhdGUmIzM0OywKICAgICYjMzQ7a3ZtX2dtZW1fYmluZF9ub2RlJiMzNDssCiAgICAmIzM0O21lbXBvbGljeV9jcmVhdGUmIzM0OywKICAgICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSYjMzQ7LAogICAgJiMzNDttcG9sX3NldF9zaGFyZWRfcG9saWN5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgTlVNQSBub2RlIGJpbmRpbmcgc3VwcG9ydCBmb3IgS1ZNIGd1ZXN0X21lbWZkIHZpYSB0aGUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgZmxhZyBpbiBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBhbmQgYWRkcyB0aGUgbWVtcG9saWN5IGhlbHBlcnMgbWVtcG9saWN5X2NyZWF0ZSgpIGFuZCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKCkuIFRoZXNlIGNoYW5nZXMgbW9kaWZ5IHJlYWNoYWJsZSBrZXJuZWwgbG9naWMgaW4gbW0vbWVtcG9saWN5LmMgYW5kIHZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZyBpbiBLVk0mIzM5O3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cblxuS01TQU4gdnMgS0FTQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cbi0gSW4gdGhpcyBwYXRjaCwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCByZWFkcyB1c2VyIGFyZ3VtZW50cyB2aWEgYGNvcHlfZnJvbV91c2VyYCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBpbnRlZ2VyOyBubyBrZXJuZWwgc3RydWN0dXJlcywgcGFkZGluZywgb3IgYnVmZmVycyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZS5cbi0gQWxsIG5ld2x5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgc3RhY2sgYW5kIGhlYXAgdmFyaWFibGVzIChlLmcuLCBgbm9kZW1hc2tfdCBub2Rlc2AgaW5pdGlhbGl6ZWQgdmlhIGBpbml0X25vZGVtYXNrX29mX25vZGUoKWAsIGBzY3JhdGNoYCBpbml0aWFsaXplZCB2aWEgYE5PREVNQVNLX1NDUkFUQ0goKWAsIGFuZCBgc3RydWN0IHNwX25vZGVgL2BzdHJ1Y3QgbWVtcG9saWN5YCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRocm91Z2ggc3RhbmRhcmQgbW0gaGVscGVycykgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cbi0gQW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgTlVNQSBwb2xpY3kgcmVmZXJlbmNlIGNvdW50aW5nLCBsaWZlY3ljbGUgaXNzdWVzLCBvciBhbGxvY2F0aW9uIGZhaWx1cmVzKSBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGFlNjg5NTVhNTkyM2QyNWU5ZTBhZjk1Njk0MzA1NzllOTRjNDBmOWYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IFNlcCAzIDE5OjA3OjE1IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCmluZGV4IDAzYmZjOTI4NjRiNmUuLjczOGUyNzY2MzNjMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKQEAgLTczOSw2ICYjNDM7NzM5LDkgQEAgc3RhdGljIGlubGluZSB1NjQga3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhzdHJ1Y3Qga3ZtICprdm0pCiAJaWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKQogCQlmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEOwogCiYjNDM7CWlmIChJU19FTkFCTEVEKENPTkZJR19OVU1BKSkKJiM0MzsJCWZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFOwomIzQzOwogCXJldHVybiBmbGFnczsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKaW5kZXggNjVjNzMyZDQ0MGQyZi4uMzk4MzE4MTc1Y2VjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCkBAIC0xMjQsMTAgJiM0MzsxMjQsMTUgQEAgaW50IHZtYV9kdXBfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdCk7CiB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7CiBpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCiAJCQkgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7CiYjNDM7aW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LAomIzQzOwkJCQkgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpOwogdm9pZCBtcG9sX2ZyZWVfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3ApOwogc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCiAJCQkJCSAgICBwZ29mZl90IGlkeCk7CiAKJiM0MztzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAomIzQzOwkJCQkgICBub2RlbWFza190ICpub2Rlcyk7CiYjNDM7CiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIHN0cnVjdCBtZW1wb2xpY3kgKl9fZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgYWRkciwgcGdvZmZfdCAqaWx4KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaAppbmRleCBhYzJkNzdkMTQ5NjM1Li44ZDNhZTdlMmVhZDhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oCkBAIC0xNjU4LDExICYjNDM7MTY1OCwxNCBAQCBzdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHsKICNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRAlfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKQogI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVAJCSgxVUxMICZsdDsmbHQ7IDApCiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQJKDFVTEwgJmx0OyZsdDsgMSkKJiM0MzsjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFCSgxVUxMICZsdDsmbHQ7IDIpCiAKIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIHsKIAlfX3U2NCBzaXplOwogCV9fdTY0IGZsYWdzOwotCV9fdTY0IHJlc2VydmVkWzZdOwomIzQzOwlfX3UzMiBub2RlOwomIzQzOwlfX3UzMiBwYWQ7CiYjNDM7CV9fdTY0IHJlc2VydmVkWzVdOwogfTsKIAogI2RlZmluZSBLVk1fUFJFX0ZBVUxUX01FTU9SWQlfSU9XUihLVk1JTywgMHhkNSwgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5KQpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCAyYWQwYTVmMTgyODBhLi5jZTEwY2U0Mzc0NjQzIDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9tZW1wb2xpY3kuYwpAQCAtMTA4NSw3ICYjNDM7MTA4NSw0NSBAQCBzdGF0aWMgaW50IG1iaW5kX3JhbmdlKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcmV0dXJuIHZtYV9yZXBsYWNlX3BvbGljeSh2bWEsIG5ld19wb2wpOwogfQogCi0vKiBTZXQgdGhlIHByb2Nlc3MgbWVtb3J5IHBvbGljeSAqLwomIzQzOy8qKgomIzQzOyAqIG1lbXBvbGljeV9jcmVhdGUgLSBidWlsZCBhIHZhbGlkYXRlZCwgY3B1c2V0LWNvbnRleHR1YWxpc2VkIG1lbXBvbGljeQomIzQzOyAqIEBtb2RlOiBNUE9MXyogbW9kZQomIzQzOyAqIEBmbGFnczogTVBPTF9GXyogZmxhZ3MKJiM0MzsgKiBAbm9kZXM6IHRhcmdldCBub2RlbWFzaywgb3IgTlVMTCAoaW50ZXJwcmV0ZWQgcGVyIEBtb2RlOyBzZWUgbXBvbF9uZXcoKSkKJiM0MzsgKgomIzQzOyAqIENyZWF0ZXMgYSBuZXcgcG9saWN5IGFuZCBjb25zdHJhaW5zIGl0IHRvIHRoZSB0YXNrJiMzOTtzIGNwdXNldC4KJiM0MzsgKgomIzQzOyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlIGFuZCBmcmVlcyBpdCB3aXRoIG1wb2xfcHV0KCkuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7c3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncywKJiM0MzsJCW5vZGVtYXNrX3QgKm5vZGVzKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbXBvbGljeSAqcG9sOwomIzQzOwlOT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoIXNjcmF0Y2gpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsKJiM0MzsJcG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTsKJiM0MzsJaWYgKElTX0VSUihwb2wpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXRhc2tfbG9jayhjdXJyZW50KTsKJiM0MzsJZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBub2Rlcywgc2NyYXRjaCk7CiYjNDM7CXRhc2tfdW5sb2NrKGN1cnJlbnQpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQltcG9sX3B1dChwb2wpOwomIzQzOwkJcG9sID0gRVJSX1BUUihlcnIpOwomIzQzOwl9CiYjNDM7b3V0OgomIzQzOwlOT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7CiYjNDM7CXJldHVybiBwb2w7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobWVtcG9saWN5X2NyZWF0ZSwgJiMzNDtrdm0mIzM0Oyk7CiYjNDM7CiBzdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAogCQkJICAgICBub2RlbWFza190ICpub2RlcykKIHsKQEAgLTMyNzQsMjQgJiM0MzszMzEyLDQ3IEBAIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKQogfQogRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCwgJiMzNDtrdm0mIzM0Oyk7CiAKLWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwKLQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpCiYjNDM7LyoqCiYjNDM7ICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcAomIzQzOyAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZQomIzQzOyAqIEBzdGFydDogZmlyc3QgcGFnZSBvZmZzZXQgKGluY2x1c2l2ZSkKJiM0MzsgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSkKJiM0MzsgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlCiYjNDM7ICoKJiM0MzsgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS4KJiM0MzsgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuCiYjNDM7ICoKJiM0MzsgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LgomIzQzOyAqCiYjNDM7ICogVW5saWtlIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koKSwgbm8gVk1BIGlzIHJlcXVpcmVkLCBzbyBhIHJhbmdlIHRoYXQKJiM0MzsgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gYWxsb2NhdGlvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCwKJiM0MzsJCQkJIHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpCiB7Ci0JY29uc3QgcGdvZmZfdCBwZ29mZiA9IHZtYV9zdGFydF9wZ29mZih2bWEpOwotCWNvbnN0IHBnb2ZmX3QgcGdvZmZfZW5kID0gdm1hX2VuZF9wZ29mZih2bWEpOwogCXN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMOwogCWludCBlcnI7CiAKIAlpZiAocG9sKSB7Ci0JCW5ldyA9IHNwX2FsbG9jKHBnb2ZmLCBwZ29mZl9lbmQsIHBvbCk7CiYjNDM7CQluZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpOwogCQlpZiAoIW5ldykKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KLQllcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHBnb2ZmLCBwZ29mZl9lbmQsIG5ldyk7CiYjNDM7CWVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgc3RhcnQsIGVuZCwgbmV3KTsKIAlpZiAoZXJyICZhbXA7JmFtcDsgbmV3KQogCQlzcF9mcmVlKG5ldyk7CiAJcmV0dXJuIGVycjsKIH0KJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UsICYjMzQ7a3ZtJiMzNDspOwomIzQzOwomIzQzO2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwKJiM0MzsJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKQomIzQzO3sKJiM0MzsJcmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS0mZ3Q7dm1fcGdvZmYsCiYjNDM7CQkJCQkgICB2bWEtJmd0O3ZtX3Bnb2ZmICYjNDM7IHZtYV9wYWdlcyh2bWEpLCBwb2wpOwomIzQzO30KIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgJiMzNDtrdm0mIzM0Oyk7CiAKIC8qIEZyZWUgYSBiYWNraW5nIHBvbGljeSBzdG9yZSBvbiBpbm9kZSBkZWxldGUuICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYwppbmRleCAyMjMzZDg3MWEzOGY0Li5iMzMzY2I0MmZhYjI5IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMKQEAgLTI1LDYgJiM0MzsyNSwzMSBAQAogCiBzdGF0aWMgc2l6ZV90IHBhZ2Vfc2l6ZTsKIAomIzQzO3N0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncywKJiM0MzsJCQkJICAgICB1MzIgbm9kZSwgdTMyIHBhZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIGd1ZXN0X21lbWZkID0gewomIzQzOwkJLnNpemUgPSBzaXplLAomIzQzOwkJLmZsYWdzID0gZmxhZ3MsCiYjNDM7CQkubm9kZSA9IG5vZGUsCiYjNDM7CQkucGFkID0gcGFkLAomIzQzOwl9OwomIzQzOwomIzQzOwlyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgJmFtcDtndWVzdF9tZW1mZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJaWYgKCEoZmxhZ3MgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpKQomIzQzOwkJcmV0dXJuIHZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgc2l6ZSwgZmxhZ3MpOwomIzQzOwomIzQzOwlmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHNpemUsIGZsYWdzLCBub2RlLCAwKTsKJiM0MzsJVEVTVF9BU1NFUlQoZmQgJmd0Oz0gMCwgS1ZNX0lPQ1RMX0VSUk9SKEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGZkKSk7CiYjNDM7CXJldHVybiBmZDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCB0ZXN0X2ZpbGVfcmVhZF93cml0ZShpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKQogewogCWNoYXIgYnVmWzY0XTsKQEAgLTE3MSw2ICYjNDM7MTk2LDgzIEBAIHN0YXRpYyB2b2lkIHRlc3RfbnVtYV9hbGxvY2F0aW9uKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpCiAJa3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpOwogfQogCiYjNDM7c3RhdGljIGJvb2wgaGFzX2JpbmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSkKJiM0Mzt7CiYjNDM7CXJldHVybiB2bV9jaGVja19jYXAodm0sIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MpICZhbXA7CiYjNDM7CSAgICAgICBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGVfaW52YWxpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKQomIzQzO3sKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwlpZiAoIWhhc19iaW5kX25vZGUodm0pKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSwKJiM0MzsJCQkJICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsIDAsIDEpOwomIzQzOwlURVNUX0FTU0VSVChmZCAmbHQ7IDAgJmFtcDsmYW1wOyBlcnJubyA9PSBFSU5WQUwsCiYjNDM7CQkgICAgJiMzNDtndWVzdF9tZW1mZCgpIHdpdGggbm9uLXplcm8gcGFkIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMJiMzNDspOwomIzQzOwomIzQzOwlmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSwKJiM0MzsJCQkJICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsCiYjNDM7CQkJCSAgICAgICAxICZsdDsmbHQ7IDIwLCAwKTsKJiM0MzsJVEVTVF9BU1NFUlQoZmQgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gPT0gRUlOVkFMLAomIzQzOwkJICAgICYjMzQ7Z3Vlc3RfbWVtZmQoKSB3aXRoIG91dC1vZi1yYW5nZSBub2RlIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMJiMzNDspOwomIzQzOwomIzQzOwlmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSwgZmxhZ3MsIDEsIDApOwomIzQzOwlURVNUX0FTU0VSVChmZCAmbHQ7IDAgJmFtcDsmYW1wOyBlcnJubyA9PSBFSU5WQUwsCiYjNDM7CQkgICAgJiMzNDtndWVzdF9tZW1mZCgpIHdpdGggYSBub2RlIGJ1dCBubyBCSU5EX05PREUgZmxhZyBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTCYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGUoaW50IGZkLCBzaXplX3QgdG90YWxfc2l6ZSwgaW50IG5vZGUpCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIG90aGVyX21hc2sgPSAxVUwgJmx0OyZsdDsgKG5vZGUgPyAwIDogMSk7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4bm9kZSA9IEJJVFNfUEVSX1RZUEUob3RoZXJfbWFzayk7CiYjNDM7CWJvb2wgc3RlZXJfYXdheSA9IGlzX211bHRpX251bWFfbm9kZV9zeXN0ZW0oKTsKJiM0MzsJdm9pZCAqcGFnZXNbNF07CiYjNDM7CWludCBzdGF0dXNbNF07CiYjNDM7CWNoYXIgKm1lbTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CW1lbSA9IGt2bV9tbWFwKHRvdGFsX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJcGFnZXNbaV0gPSBtZW0gJiM0MzsgcGFnZV9zaXplICogaTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQmluZCBvbiBhIGRpZmZlcmVudCBub2RlIGlmIHBvc3NpYmxlIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgZmF1bHRpbmcKJiM0MzsJICogaGFwcGVucyBhcyBkZXNpcmVkLiBXaXRob3V0IGEgc2Vjb25kIG5vZGUgdXNlIHRoZSBsb2NhbCBub2RlIGFuZAomIzQzOwkgKiBqdXN0IGdldCBjb3ZlcmFnZSBvZiBjcmVhdGUvbW1hcC9mYXVsdCBwYXRocy4KJiM0MzsJICovCiYjNDM7CWlmIChzdGVlcl9hd2F5KQomIzQzOwkJa3ZtX3NldF9tZW1wb2xpY3koTVBPTF9CSU5ELCAmYW1wO290aGVyX21hc2ssIG1heG5vZGUpOwomIzQzOwomIzQzOwkvKiBEZWxpYmVyYXRlbHkgbm8gbWJpbmQoKSBvbiB0aGlzIG1hcHBpbmcuICovCiYjNDM7CW1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpOwomIzQzOwomIzQzOwlrdm1fbW92ZV9wYWdlcygwLCA0LCBwYWdlcywgTlVMTCwgc3RhdHVzLCAwKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJVEVTVF9BU1NFUlQoc3RhdHVzW2ldID09IG5vZGUsCiYjNDM7CQkJICAgICYjMzQ7RXhwZWN0ZWQgcGFnZSAlZCBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZCYjMzQ7LAomIzQzOwkJCSAgICBpLCBub2RlLCBzdGF0dXNbaV0pOwomIzQzOwomIzQzOwkvKiBEcm9wcGVkIG1lbW9yeSBzaG91bGQgZmF1bHQgYmFjayBvbnRvIHRoZSBzYW1lIG5vZGUgKi8KJiM0MzsJa3ZtX2ZhbGxvY2F0ZShmZCwgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpFLCAwLAomIzQzOwkJICAgICAgdG90YWxfc2l6ZSk7CiYjNDM7CW1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpOwomIzQzOwomIzQzOwlrdm1fbW92ZV9wYWdlcygwLCA0LCBwYWdlcywgTlVMTCwgc3RhdHVzLCAwKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJVEVTVF9BU1NFUlQoc3RhdHVzW2ldID09IG5vZGUsCiYjNDM7CQkJICAgICYjMzQ7RXhwZWN0ZWQgcGFnZSAlZCBiYWNrIG9uIG5vZGUgJWQsIGdvdCBpdCBvbiBub2RlICVkJiMzNDssCiYjNDM7CQkJICAgIGksIG5vZGUsIHN0YXR1c1tpXSk7CiYjNDM7CiYjNDM7CWlmIChzdGVlcl9hd2F5KQomIzQzOwkJa3ZtX3NldF9tZW1wb2xpY3koTVBPTF9ERUZBVUxULCBOVUxMLCAwKTsKJiM0MzsKJiM0MzsJa3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIHRlc3RfY29sbGFwc2UoaW50IGZkLCB1NjQgZmxhZ3MpCiB7CiAJY29uc3Qgc2l6ZV90IHBtZF9zaXplID0gZ2V0X3RyYW5zX2h1Z2VwYWdlc3ooKTsKQEAgLTQwNCw2ICYjNDM7NTA2LDEwIEBAIHN0YXRpYyB2b2lkIHRlc3RfZ3Vlc3RfbWVtZmRfZmxhZ3Moc3RydWN0IGt2bV92bSAqdm0pCiAJaW50IGZkOwogCiAJZm9yIChmbGFnID0gQklUKDApOyBmbGFnOyBmbGFnICZsdDsmbHQ7PSAxKSB7CiYjNDM7CQkvKiBCSU5EX05PREUgZGVwZW5kcyBvbiBhIHZhbGlkIG5vZGUgZmllbGQsIHRlc3Qgc2VwYXJhdGVseSAqLwomIzQzOwkJaWYgKGZsYWcgPT0gR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiAJCWZkID0gX192bV9jcmVhdGVfZ3Vlc3RfbWVtZmQodm0sIHBhZ2Vfc2l6ZSwgZmxhZyk7CiAJCWlmIChmbGFnICZhbXA7IHZhbGlkX2ZsYWdzKSB7CiAJCQlURVNUX0FTU0VSVChmZCAmZ3Q7PSAwLApAQCAtNDE4LDMwICYjNDM7NTI0LDQwIEBAIHN0YXRpYyB2b2lkIHRlc3RfZ3Vlc3RfbWVtZmRfZmxhZ3Moc3RydWN0IGt2bV92bSAqdm0pCiAJfQogfQogCi0jZGVmaW5lIF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgYXJncy4uLikJXAotZG8gewkJCQkJCQkJCVwKLQlpbnQgZmQgPSB2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQoX192bSwgX19nbWVtX3NpemUsIF9fZmxhZ3MpOwlcCi0JCQkJCQkJCQlcCi0JdGVzdF8jI19fdGVzdChhcmdzKTsJCQkJCQlcCi0JY2xvc2UoZmQpOwkJCQkJCQlcCiYjNDM7I2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIF9fbm9kZSwgYXJncy4uLikgXAomIzQzO2RvIHsJCQkJCQkJCQkgICBcCiYjNDM7CWludCBmZCA9IGNyZWF0ZV9ndWVzdF9tZW1mZChfX3ZtLCBfX2dtZW1fc2l6ZSwgX19mbGFncywgX19ub2RlKTsgICBcCiYjNDM7CQkJCQkJCQkJICAgXAomIzQzOwl0ZXN0XyMjX190ZXN0KGFyZ3MpOwkJCQkJCSAgIFwKJiM0MzsJY2xvc2UoZmQpOwkJCQkJCQkgICBcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIF9fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUpCQkJXAotCV9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgZmQsIF9fZ21lbV9zaXplKQomIzQzOwlfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsIGZkLCBfX2dtZW1fc2l6ZSkKIAogI2RlZmluZSBnbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzKQkJCQlcCiAJX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KQogCiAjZGVmaW5lIF9fZ21lbV90ZXN0X3ZtKF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUpCQlcCi0JX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX3ZtLCBmZCwgX19nbWVtX3NpemUpCiYjNDM7CV9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgMCwJCVwKJiM0MzsJCSAgICAgIF9fdm0sIGZkLCBfX2dtZW1fc2l6ZSkKIAogI2RlZmluZSBnbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzKQkJCQlcCiAJX19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KQogCiYjNDM7I2RlZmluZSBfX2dtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIF9fbm9kZSkJXAomIzQzOwlfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwJCQkJCVwKJiM0MzsJCSAgICAgIChfX2ZsYWdzKSB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLAkJXAomIzQzOwkJICAgICAgX19nbWVtX3NpemUsIF9fbm9kZSwgZmQsIF9fZ21lbV9zaXplLCBfX25vZGUpCiYjNDM7CiYjNDM7I2RlZmluZSBnbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fbm9kZSkJCQlcCiYjNDM7CV9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0LCBfX25vZGUpCiYjNDM7CiBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncykKIHsKIAl0ZXN0X2NyZWF0ZV9ndWVzdF9tZW1mZF9tdWx0aXBsZSh2bSk7CiAJdGVzdF9jcmVhdGVfZ3Vlc3RfbWVtZmRfaW52YWxpZF9zaXplcyh2bSwgZmxhZ3MpOwomIzQzOwl0ZXN0X2JpbmRfbm9kZV9pbnZhbGlkKHZtLCBmbGFncyk7CiAKIAlnbWVtX3Rlc3QoZmlsZV9yZWFkX3dyaXRlLCB2bSwgZmxhZ3MpOwogCkBAIC00NTIsNiAmIzQzOzU2OCw4IEBAIHN0YXRpYyB2b2lkIF9fdGVzdF9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKQogCQkJZ21lbV90ZXN0KG1tYXBfc3VwcG9ydGVkLCB2bSwgZmxhZ3MpOwogCQkJZ21lbV90ZXN0KGZhdWx0X292ZXJmbG93LCB2bSwgZmxhZ3MpOwogCQkJZ21lbV90ZXN0KG51bWFfYWxsb2NhdGlvbiwgdm0sIGZsYWdzKTsKJiM0MzsJCQlpZiAoaGFzX2JpbmRfbm9kZSh2bSkpCiYjNDM7CQkJCWdtZW1fdGVzdF9ub2RlKGJpbmRfbm9kZSwgdm0sIGZsYWdzLCAwKTsKIAkJCV9fZ21lbV90ZXN0KGNvbGxhcHNlLCB2bSwgZmxhZ3MsIHBtZF9zaXplKTsKIAkJfSBlbHNlIHsKIAkJCWdtZW1fdGVzdChmYXVsdF9wcml2YXRlLCB2bSwgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKaW5kZXggNjI1ZTYyZTFhMDMxOC4uZGM5ZjA3MWRkOTY5YiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCkBAIC00MjMsNiAmIzQzOzQyMywzMSBAQCBzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqa3ZtX2dtZW1fZ2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkgKi8KIAlyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cCgmYW1wO0dNRU1fSShpbm9kZSktJmd0O3BvbGljeSwgcGdvZmYpOwogfQomIzQzOwomIzQzO3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbXBvbGljeSAqcG9sOwomIzQzOwlub2RlbWFza190IG5vZGVzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoKHVuc2lnbmVkIGludClub2RlICZndDs9IE1BWF9OVU1OT0RFUykKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpbml0X25vZGVtYXNrX29mX25vZGUoJmFtcDtub2Rlcywgbm9kZSk7CiYjNDM7CXBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCAmYW1wO25vZGVzKTsKJiM0MzsJaWYgKElTX0VSUihwb2wpKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIocG9sKTsKJiM0MzsKJiM0MzsJZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSgmYW1wO0dNRU1fSShpbm9kZSktJmd0O3BvbGljeSwgMCwKJiM0MzsJCQkJCSAgTUFYX0xGU19GSUxFU0laRSAmZ3Q7Jmd0OyBQQUdFX1NISUZULCBwb2wpOwomIzQzOwltcG9sX3B1dChwb2wpOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsjZWxzZQomIzQzO3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FSU5WQUw7CiYjNDM7fQogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0gewpAQCAtNTIwLDcgJiM0Mzs1NDUsNyBAQCBib29sIF9fd2VhayBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKHN0cnVjdCBrdm0gKmt2bSkKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpCiYjNDM7c3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gJiMzNDtba3ZtLWdtZW1dJiMzNDs7CiAJc3RydWN0IGdtZW1fZmlsZSAqZjsKQEAgLTU2MSw2ICYjNDM7NTg2LDEyIEBAIHN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKQogCiAJR01FTV9JKGlub2RlKS0mZ3Q7ZmxhZ3MgPSBmbGFnczsKIAomIzQzOwlpZiAoZmxhZ3MgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHsKJiM0MzsJCWVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7CiYjNDM7CQlpZiAoZXJyKQomIzQzOwkJCWdvdG8gZXJyX2lub2RlOwomIzQzOwl9CiYjNDM7CiAJZmlsZSA9IGFsbG9jX2ZpbGVfcHNldWRvKGlub2RlLCBrdm1fZ21lbV9tbnQsIG5hbWUsIE9fUkRXUiwgJmFtcDtrdm1fZ21lbV9mb3BzKTsKIAlpZiAoSVNfRVJSKGZpbGUpKSB7CiAJCWVyciA9IFBUUl9FUlIoZmlsZSk7CkBAIC01OTMsNiAmIzQzOzYyNCw3IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncykKIHsKIAlsb2ZmX3Qgc2l6ZSA9IGFyZ3MtJmd0O3NpemU7CiAJdTY0IGZsYWdzID0gYXJncy0mZ3Q7ZmxhZ3M7CiYjNDM7CWludCBub2RlID0gTlVNQV9OT19OT0RFOwogCiAJaWYgKGZsYWdzICZhbXA7IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjAwLDcgJiM0Mzs2MzIsMTUgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKQogCWlmIChzaXplICZsdDs9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7CiYjNDM7CWlmIChmbGFncyAmYW1wOyBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkgewomIzQzOwkJaWYgKGFyZ3MtJmd0O3BhZCB8fCBhcmdzLSZndDtub2RlICZndDs9IE1BWF9OVU1OT0RFUykKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCW5vZGUgPSBhcmdzLSZndDtub2RlOwomIzQzOwl9IGVsc2UgaWYgKGFyZ3MtJmd0O25vZGUgfHwgYXJncy0mZ3Q7cGFkKSB7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncywgbm9kZSk7CiB9CiAKIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc4NjAKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiA1MDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gUmlzayBBc3Nlc3NtZW50IGZvciBhIEtWTSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggd2l0aCBLTVNBTiBpbiBtaW5kLCBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmVzLiBGaXJzdCwgSSBuZWVkIHRvIG1ldGhvZGljYWxseSBnbyB0aHJvdWdoIHRoZSBkaWZmLgoKMS4gIEluIGBpbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhgLCB3ZSYjMzk7cmUgYWRkaW5nIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgd2l0aGluIGBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzYCBidXQgb25seSBpZiBOVU1BIGlzIGVuYWJsZWQuIE1ha2VzIHNlbnNlLgoKMi4gIGBpbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oYCBqdXN0IGRlY2xhcmVzIHNvbWUgbWVtcG9saWN5IGZ1bmN0aW9ucyAtIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBhbmQgYG1lbXBvbGljeV9jcmVhdGVgLiBOb3RoaW5nIGltbWVkaWF0ZWx5IGNvbmNlcm5pbmcgdGhlcmUsIGl0IGlzIGp1c3QgZGVjbGFyaW5nIHRob3NlIGZ1bmN0aW9ucy4KCjMuICBUaGUgYGluY2x1ZGUvdWFwaS9saW51eC9rdm0uaGAgaXMgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4gV2UmIzM5O3ZlIGdvdCBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGRlZmluZWQsIHdoaWNoIGlzIHJlbGV2YW50IGZvciBOVU1BLiAgTW9yZSBpbXBvcnRhbnRseSwgdGhlIGBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZGAgaGFzIGJlZW4gKm1vZGlmaWVkKi4gIFdlIGFyZSByZXBsYWNpbmcgdGhlIHJlc2VydmVkIHNwYWNlIHRvIGFkZCBhIGBub2RlYCBhbmQgYSBgcGFkYCBtZW1iZXIsIGJ1dCBrZWVwaW5nIHRoZSBzdHJ1Y3Qgc2l6ZSBjb25zdGFudCBhdCA2NCBieXRlcy4gVGhlIGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHNpbmNlIHRoZSBzaXplIGlzIHRoZSBzYW1lLCBubyBtZW1vcnkgcmlza3Mgc2hvdWxkIGJlIGFwcGFyZW50LiBIb3dldmVyLCBub3cgSSBhbSB3b25kZXJpbmcgaWYgYGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmRgIGlzIGNvcGllZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiB0aGUgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGlvY3RsIGNhbGwuIEkgbmVlZCB0byBrbm93IHRoaXMgdG8gYmUgc3VyZSB0aGVyZSYjMzk7cyBubyBsZWFrIG9mIGtlcm5lbCBtZW1vcnkuCgpXYWl0ISBRdWljayBzYW5pdHkgY2hlY2suIElzIHRoZSBpb2N0bCBgX0lPV1JgIG9yIGBfSU9XYD8gQW5kIHllcywgYCNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBfSU9XUihLVk1JTywgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpYCBjb25maXJtcyB0aGF0IGl0JiMzOTtzIHJlYWQvd3JpdGUuIEkgbmVlZCB0byBiZSAqc3VyZSogYWJvdXQgdGhpcyByZWFkIGJhY2suIEkgYW0gZ29pbmcgdG8gaGF2ZSB0byBncmVwIGZvciBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW4gdGhlIEtWTSBjb2RlIG5vdyB0byBzZWUgdGhlIGlvY3RsIGltcGxlbWVudGF0aW9uLiBUaGlzIHdpbGwgYmUgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIGlmIHRoZXJlJiMzOTtzIGFueSBwb3RlbnRpYWwgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgZHVlIHRvIHRoZSBzdHJ1Y3R1cmUgY2hhbmdlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtLVk1fQ1JFQVRFX0dVRVNUX01FTUZEJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02MzU3PWluIGZsYWdzIHRvIGhhdmUgS1ZNIGJpbmQgdGhlIG1lbW9yeSByZWdpb24gdG8gYSBnaXZlbiBndWVzdF9tZW1mZCByYW5nZSBvZlxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTYzNTgtW2d1ZXN0X21lbWZkX29mZnNldCwgZ3Vlc3RfbWVtZmRfb2Zmc2V0ICYjNDM7IG1lbW9yeV9zaXplXS4gIFRoZSB0YXJnZXQgZ3Vlc3RfbWVtZmRcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2MzU5Om11c3QgcG9pbnQgYXQgYSBmaWxlIGNyZWF0ZWQgdmlhIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgb24gdGhlIGN1cnJlbnQgVk0sIGFuZFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTYzNjAtdGhlIHRhcmdldCByYW5nZSBtdXN0IG5vdCBiZSBib3VuZCB0byBhbnkgb3RoZXIgbWVtb3J5IHJlZ2lvbi4gIEFsbCBzdGFuZGFyZFxuLS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02NDMwPVRoZSBcJiMzNDtmbGFnc1wmIzM0OyBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgYW5kIG11c3QgYmUgJiMzOTswJiMzOTsuXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQzMS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDMyOjQuMTQyIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi0tXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ0MC1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDQxOktWTV9DUkVBVEVfR1VFU1RfTUVNRkQgY3JlYXRlcyBhbiBhbm9ueW1vdXMgZmlsZSBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvclxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0NDItdGhhdCByZWZlcnMgdG8gaXQuICBndWVzdF9tZW1mZCBmaWxlcyBhcmUgcm91Z2hseSBhbmFsb2dvdXMgdG8gZmlsZXMgY3JlYXRlZFxuLS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02NDczPVRoZSBjYXBhYmlsaXR5IEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MgZW51bWVyYXRlcyB0aGUgYGZsYWdzYCB0aGF0IGNhbiBiZVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0NzQ6c3BlY2lmaWVkIHZpYSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELiAgQ3VycmVudGx5IGRlZmluZWQgZmxhZ3M6XG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ3NS1cbi0tXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ3OS0gIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQgTWFrZSBhbGwgbWVtb3J5IGluIHRoZSBmaWxlIHNoYXJlZCBkdXJpbmdcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDgwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIChtZW1vcnkgZmlsZXMgY3JlYXRlZFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0ODEtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgSU5JVF9TSEFSRUQgd2lsbCBiZSBtYXJrZWQgcHJpdmF0ZSkuXG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWc9ODM9Y29uZmlnIEtWTV9TV19QUk9URUNURURfVk1cbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy05MC1cdCAgcHJvdGVjdGVkIFZNcyBhcmUgcHVyZWx5IGEgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcgdmVoaWNsZSBmb3JcbmFyY2gveDg2L2t2bS9LY29uZmlnOjkxOlx0ICBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELiAgQXR0ZW1wdGluZyB0byBydW4gYSBcJiMzNDtyZWFsXCYjMzQ7IFZNIHdvcmtsb2FkIGFzIGFcbmFyY2gveDg2L2t2bS9LY29uZmlnLTkyLVx0ICBzb2Z0d2FyZS1wcm90ZWN0ZWQgVk0gd2lsbCBmYWlsIG1pc2VyYWJseS5cbi0tXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmg9MTY0OT1zdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHtcbi0tXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1Ny1cbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaDoxNjU4OiNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjU5LSNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQXHRcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVxuLS1cbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaD0xNjQ1PXN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xuLS1cbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjUzLVxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oOjE2NTQ6I2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTUtI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcdFx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYz0yOD1zdGF0aWMgaW50IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy0zNy1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmM6Mzg6XHRyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXHUwMDI2Z3Vlc3RfbWVtZmQpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy0zOS19XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYz00MT1zdGF0aWMgaW50IGNyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncywgdTMyIG5vZGUpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy00OC1cdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgc2l6ZSwgZmxhZ3MsIG5vZGUsIDApO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYzo0OTpcdFRFU1RfQVNTRVJUKGZkIFx1MDAzZT0gMCwgS1ZNX0lPQ1RMX0VSUk9SKEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGZkKSk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTUwLVx0cmV0dXJuIGZkO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg9NjY3PXN0YXRpYyBpbmxpbmUgaW50IF9fdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSxcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oLTY3NC1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg6Njc1Olx0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFx1MDAyNmd1ZXN0X21lbWZkKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjc2LX1cbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oPTY3OD1zdGF0aWMgaW5saW5lIGludCB2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLFxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjgyLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaDo2ODM6XHRURVNUX0FTU0VSVChmZCBcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02ODQtXHRyZXR1cm4gZmQ7XG4tLVxudmlydC9rdm0va3ZtX21haW4uYz01MTY3PXN0YXRpYyBsb25nIGt2bV92bV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTUzODctI2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL2t2bV9tYWluLmM6NTM4ODpcdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xudmlydC9rdm0va3ZtX21haW4uYy01Mzg5LVx0XHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA2MzQKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIEtWTSBDb3JlOiBBIExpbmUgb2YgSW5xdWlyeSoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIGRlbHZlIGludG8gdGhlIEtWTSBjb3JlLCBzcGVjaWZpY2FsbHkgdGhlIGBrdm1fbWFpbi5jYCBmaWxlLiBHaXZlbiBteSBleHBlcnRpc2UsIEkgYWxyZWFkeSBoYXZlIGEgcHJldHR5IGdvb2QgbWVudGFsIG1hcCBvZiB0aGlzIGNvZGUsIGJ1dCBJIG5lZWQgdG8gcGlucG9pbnQgYSBzcGVjaWZpYyBhcmVhLiBMZXQmIzM5O3Mgc3RhcnQgYnkgemVyb2luZyBpbiBvbiBsaW5lIDUzODguIE15IGluaXRpYWwgYXBwcm9hY2ggd2lsbCBiZSBhIHN0cmFpZ2h0Zm9yd2FyZCBleGFtaW5hdGlvbiBvZiB0aGF0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4gTGV0JiMzOTtzIHVzZSBgcmVhZC1maWxlYCB0byBnZXQgYSBnb29kIGxvb2sgYXQgdGhlIGNvZGUgYXJvdW5kIHRoYXQgYXJlYS4gSG9wZWZ1bGx5LCB0aGF0IHdpbGwgZ2l2ZSBtZSBlbm91Z2ggY29udGV4dCB0byBiZWdpbiBhIG1vcmUgbnVhbmNlZCBpbnZlc3RpZ2F0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2t2bV9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MzgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzUzODA6XHRcdFx0YnJlYWs7XG41MzgxOlx0XHRjYXNlIEtWTV9SRVNFVF9ESVJUWV9SSU5HUzpcbjUzODI6XHRcdFx0ciA9IGt2bV92bV9pb2N0bF9yZXNldF9kaXJ0eV9wYWdlcyhrdm0pO1xuNTM4MzpcdFx0XHRicmVhaztcbjUzODQ6XHRcdGNhc2UgS1ZNX0dFVF9TVEFUU19GRDpcbjUzODU6XHRcdFx0ciA9IGt2bV92bV9pb2N0bF9nZXRfc3RhdHNfZmQoa3ZtKTtcbjUzODY6XHRcdFx0YnJlYWs7XG41Mzg3Olx0I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbjUzODg6XHRcdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xuNTM4OTpcdFx0XHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZDtcbjUzOTA6XHRcbjUzOTE6XHRcdFx0ciA9IC1FRkFVTFQ7XG41MzkyOlx0XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZndWVzdF9tZW1mZCwgYXJncCwgc2l6ZW9mKGd1ZXN0X21lbWZkKSkpXG41MzkzOlx0XHRcdFx0Z290byBvdXQ7XG41Mzk0Olx0XG41Mzk1Olx0XHRcdHIgPSBrdm1fZ21lbV9jcmVhdGUoa3ZtLCBcdTAwMjZndWVzdF9tZW1mZCk7XG41Mzk2Olx0XHRcdGJyZWFrO1xuNTM5NzpcdFx0fVxuNTM5ODpcdCNlbmRpZlxuNTM5OTpcdFx0ZGVmYXVsdDpcbjU0MDA6XHRcdFx0ciA9IGt2bV9hcmNoX3ZtX2lvY3RsKGZpbHAsIGlvY3RsLCBhcmcpO1xuNTQwMTpcdFx0fVxuNTQwMjpcdG91dDpcbjU0MDM6XHRcdHJldHVybiByO1xuNTQwNDpcdH1cbjU0MDU6XHRcbjU0MDY6XHQjaWZkZWYgQ09ORklHX0tWTV9DT01QQVRcbjU0MDc6XHRzdHJ1Y3QgY29tcGF0X2t2bV9kaXJ0eV9sb2cge1xuNTQwODpcdFx0X191MzIgc2xvdDtcbjU0MDk6XHRcdF9fdTMyIHBhZGRpbmcxO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTMwMAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDEyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtWTSBHdWVzdCBNZW1vcnkgRmlsZSBDcmVhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIHRoaXMgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGNhbGwuIFJpZ2h0IG9mZiB0aGUgYmF0LCBpdCYjMzk7cyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiBGcm9tIHdoYXQgSSBjYW4gc2VlLCBhbGwgaXQmIzM5O3MgZG9pbmcgaXMgYSBzaW1wbGUgYGNvcHlfZnJvbV91c2VyYCBvcGVyYXRpb24g4oCTIGp1c3QgZ3JhYmJpbmcgdGhlIGBndWVzdF9tZW1mZGAgc3RydWN0dXJlIGZyb20gdXNlcnNwYWNlIGFuZCBwYXNzaW5nIGl0IG92ZXIuIE5vIGRhdGEgaXMgYmVpbmcgcmV0dXJuZWQgYmFjayB0byB0aGUgdXNlciwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgdG8gbm90ZS4gCgpOb3csIHRoZSByZWFsIG1lYXQgb2YgdGhlIG9wZXJhdGlvbiBoYXMgZ290IHRvIGJlIHdpdGhpbiBga3ZtX2dtZW1fY3JlYXRlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGF0IGZ1bmN0aW9uIGRvZXMgd2l0aCB0aGUgYGd1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUuIFRoaXMgYWxzbyBtZWFucyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLCBzbyBsZXQmIzM5O3MgZ2V0IGludG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29weV90b191c2VyJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNjU5CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogNDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBob3cgSSYjMzk7ZCBhcHByb2FjaCBzdW1tYXJpemluZyB0aGUgcHJvbXB0LCBrZWVwaW5nIGluIG1pbmQgbXkgb3duIGV4cGVydC1sZXZlbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBmaWVsZDoKCioqSW52ZXN0aWdhdGluZyBHdWVzdCBNZW1vcnkgTWFuYWdlbWVudCBpbiBLVk0qKgoKQWxyaWdodCwgSSBuZWVkIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHNvbWV0aGluZyByZWxhdGVkIHRvIGd1ZXN0IG1lbW9yeSBtYW5hZ2VtZW50IHdpdGhpbiBLVk0uIFNwZWNpZmljYWxseSwgSSBzaG91bGQgcHJvYmFibHkgemVybyBpbiBvbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYXMgYSBnb29kIHBsYWNlIHRvIHN0YXJ0LiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIGxvZ2ljIHJlbGF0ZWQgdG8gYG1lbWZkYC1iYWNrZWQgZ3Vlc3QgbWVtb3J5IHNob3VsZCByZXNpZGUuIEkmIzM5O20gdGhpbmtpbmcgSSBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiBiaW5kaW5nIG1lbW9yeSBub2RlcywgY3JlYXRpbmcgZ3Vlc3QgbWVtb3J5IHJlZ2lvbnMgdXNpbmcgYG1lbWZkYCwgYW5kIHJlbGF0ZWQgb3BlcmF0aW9ucyDigJMgc3BlY2lmaWNhbGx5LCBmdW5jdGlvbnMgbGlrZSBga3ZtX2dtZW1fYmluZF9ub2RlYCwgYGt2bV9nbWVtX2NyZWF0ZWAsIGFuZCBhbnkgcmVsYXRlZCBpbmZyYXN0cnVjdHVyZS4gSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQgbWFuYWdlZCBmcm9tIHRoZSBob3N0JiMzOTtzIHBlcnNwZWN0aXZlLCBidXQgYWxzbyBob3cgaXQgYXBwZWFycyBhbmQgYmVoYXZlcyB3aXRoaW4gdGhlIGd1ZXN0LiBVbmRlcnN0YW5kaW5nIHRoZXNlIGludGVyYWN0aW9ucyBpcyBrZXkgdG8gcGlucG9pbnRpbmcgYW55IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBtZW1vcnktcmVsYXRlZCBpc3N1ZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDIwOlx0XHQgKiBleHBsaWNpdCBwb2xpY3kgaGFzIGJlZW4gc2V0IHZpYSBtYmluZCgpIGZvciB0aGlzIG1lbW9yeS4gVGhlIGNhbGxlclxuIDQyMTpcdFx0ICogY2FuIHRoZW4gcmVwbGFjZSBOVUxMIHdpdGggdGhlIGRlZmF1bHQgbWVtb3J5IHBvbGljeSBpbnN0ZWFkIG9mIHRoZVxuIDQyMjpcdFx0ICogY3VycmVudCB0YXNrJiMzOTtzIG1lbW9yeSBwb2xpY3kuXG4gNDIzOlx0XHQgKi9cbiA0MjQ6XHRcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCBwZ29mZik7XG4gNDI1Olx0fVxuIDQyNjpcdFxuIDQyNzpcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuIDQyODpcdHtcbiA0Mjk6XHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcbiA0MzA6XHRcdG5vZGVtYXNrX3Qgbm9kZXM7XG4gNDMxOlx0XHRpbnQgZXJyO1xuIDQzMjpcdFxuIDQzMzpcdFx0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiA0MzQ6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNDM1Olx0XG4gNDM2Olx0XHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuIDQzNzpcdFx0cG9sID0gbWVtcG9saWN5X2NyZWF0ZShNUE9MX0JJTkQsIDAsIFx1MDAyNm5vZGVzKTtcbiA0Mzg6XHRcdGlmIChJU19FUlIocG9sKSlcbiA0Mzk6XHRcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbiA0NDA6XHRcbiA0NDE6XHRcdGVyciA9IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2Vwb2xpY3ksIDAsXG4gNDQyOlx0XHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbiA0NDM6XHRcdG1wb2xfcHV0KHBvbCk7XG4gNDQ0Olx0XHRyZXR1cm4gZXJyO1xuIDQ0NTpcdH1cbiA0NDY6XHQjZWxzZVxuIDQ0NzpcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuIDQ0ODpcdHtcbiA0NDk6XHRcdHJldHVybiAtRUlOVkFMO1xuIDQ1MDpcdH1cbiA0NTE6XHQjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbiA0NTI6XHRcbiA0NTM6XHRzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9nbWVtX3ZtX29wcyA9IHtcbiA0NTQ6XHRcdC5mYXVsdFx0XHQ9IGt2bV9nbWVtX2ZhdWx0X3VzZXJfbWFwcGluZyxcbiA0NTU6XHQjaWZkZWYgQ09ORklHX05VTUFcbiA0NTY6XHRcdC5nZXRfcG9saWN5XHQ9IGt2bV9nbWVtX2dldF9wb2xpY3ksXG4gNDU3Olx0XHQuc2V0X3BvbGljeVx0PSBrdm1fZ21lbV9zZXRfcG9saWN5LFxuIDQ1ODpcdCNlbmRpZlxuIDQ1OTpcdH07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNTg1CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYG1lbXBvbGljeS5jYCBDb2RlKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgbWVtcG9saWN5LmNgIGNvZGUgc25pcHBldC4gTXkgaW5pdGlhbCBmb2N1cyBpcyB0aGUgYG1lbXBvbGljeV9jcmVhdGVgIGZ1bmN0aW9uLiBJIHNlZSBpdCBjcmVhdGVzIGEgbmV3IG1lbW9yeSBwb2xpY3kgc3RydWN0dXJlLiBUaGUgaW5wdXQgcGFyYW1ldGVycywgYG1vZGVgLCBgZmxhZ3NgLCBhbmQgYG5vZGVzYCwgYXJlIHByZXR0eSBzdGFuZGFyZDsgdGhleSBkZWZpbmUgdGhlIGJlaGF2aW9yIGFuZCBub2RlIGFmZmluaXR5IG9mIHRoZSBwb2xpY3kuCgpUaGUgY29yZSBvZiBpdCBpcyBjYWxsaW5nIGBtcG9sX25ld2AgdG8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGBzdHJ1Y3QgbWVtcG9saWN5YC4gVGhlbiwgY3J1Y2lhbGx5LCB0aGVyZSYjMzk7cyBhIGxvY2sgYXJvdW5kIGBtcG9sX3NldF9ub2RlbWFza2AuIFRoYXQmIzM5O3MgaW50ZXJlc3RpbmcsIHN1Z2dlc3RpbmcgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3VlcyBhbmQgdGhlIG5lZWQgZm9yIGNhcmVmdWwgbm9kZSBtYXNrIHVwZGF0ZXMuIFRoZSB1c2Ugb2YgYSBzY3JhdGNoIG5vZGVtYXNrIGFuZCBlcnJvciBoYW5kbGluZyBhcm91bmQgdGhlIGBtcG9sX3NldF9ub2RlbWFza2AgY2FsbCBpcyB0eXBpY2FsOyBpdCYjMzk7cyB3aGF0IEkmIzM5O2QgZXhwZWN0LiBUaGUgYG1wb2xfcHV0YCBvbiBlcnJvciBpcyBhIGdvb2QgcHJhY3RpY2UgZm9yIHJlc291cmNlIG1hbmFnZW1lbnQsIGVuc3VyaW5nIHRoYXQgdGhlIGNyZWF0ZWQgcG9saWN5IGRvZXNuJiMzOTt0IGxlYWsgaWYgdGhlIHNldCBvcGVyYXRpb24gZmFpbHMuCgpNeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSBgbXBvbF9uZXdgIGFuZCBgbXBvbF9zZXRfbm9kZW1hc2tgLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgYHN0cnVjdCBtZW1wb2xpY3lgIGlzIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQsIGFuZCB3aGF0IHRoZSBgbXBvbF9zZXRfbm9kZW1hc2tgIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGRvaW5nIHVuZGVyIHRoZSBob29kLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gaW50ZXJlc3RlZCBpbiBob3cgaXQgaGFuZGxlcyB0aGUgcHJvdmlkZWQgYG5vZGVzYCBtYXNrIGFuZCBhbnkgcG90ZW50aWFsIGludGVyYWN0aW9ucyB3aXRoIHRoZSBzeXN0ZW0mIzM5O3MgbWVtb3J5IG1hbmFnZW1lbnQgc3RydWN0dXJlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgbG9ja2luZyBhcyB3ZWxsLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGhvdyBpdCBhY3R1YWxseSBzZXRzIHRoZSBub2RlbWFzayB0byBrbm93IGlmIHRoZXJlIGlzIGFuIGlzc3VlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcG9sX25ld3xtcG9sX3NldF9ub2RlbWFzayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jPTM4OD1zdGF0aWMgdm9pZCBtcG9sX3JlbGF0aXZlX25vZGVtYXNrKG5vZGVtYXNrX3QgKnJldCwgY29uc3Qgbm9kZW1hc2tfdCAqb3JpZyxcbi0tXG5tbS9tZW1wb2xpY3kuYy0zOTUtXG5tbS9tZW1wb2xpY3kuYzozOTY6c3RhdGljIGludCBtcG9sX25ld19ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxubW0vbWVtcG9saWN5LmMtMzk3LXtcbi0tXG5tbS9tZW1wb2xpY3kuYy00MDMtXG5tbS9tZW1wb2xpY3kuYzo0MDQ6c3RhdGljIGludCBtcG9sX25ld19wcmVmZXJyZWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBjb25zdCBub2RlbWFza190ICpub2Rlcylcbm1tL21lbXBvbGljeS5jLTQwNS17XG4tLVxubW0vbWVtcG9saWN5LmMtNDE0LS8qXG5tbS9tZW1wb2xpY3kuYzo0MTU6ICogbXBvbF9zZXRfbm9kZW1hc2sgaXMgY2FsbGVkIGFmdGVyIG1wb2xfbmV3KCkgdG8gc2V0IHVwIHRoZSBub2RlbWFzaywgaWZcbm1tL21lbXBvbGljeS5jOjQxNjogKiBhbnksIGZvciB0aGUgbmV3IHBvbGljeS4gIG1wb2xfbmV3KCkgaGFzIGFscmVhZHkgdmFsaWRhdGVkIHRoZSBub2Rlc1xubW0vbWVtcG9saWN5LmMtNDE3LSAqIHBhcmFtZXRlciB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvbGljeSBtb2RlIGFuZCBmbGFncy5cbi0tXG5tbS9tZW1wb2xpY3kuYy00MjEtICovXG5tbS9tZW1wb2xpY3kuYzo0MjI6c3RhdGljIGludCBtcG9sX3NldF9ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsXG5tbS9tZW1wb2xpY3kuYy00MjMtXHRcdCAgICAgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMsIHN0cnVjdCBub2RlbWFza19zY3JhdGNoICpuc2MpXG4tLVxubW0vbWVtcG9saWN5LmMtNDU2LSAqIFRoaXMgZnVuY3Rpb24ganVzdCBjcmVhdGVzIGEgbmV3IHBvbGljeSwgZG9lcyBzb21lIGNoZWNrIGFuZCBzaW1wbGVcbm1tL21lbXBvbGljeS5jOjQ1NzogKiBpbml0aWFsaXphdGlvbi4gWW91IG11c3QgaW52b2tlIG1wb2xfc2V0X25vZGVtYXNrKCkgdG8gc2V0IG5vZGVzLlxubW0vbWVtcG9saWN5LmMtNDU4LSAqL1xubW0vbWVtcG9saWN5LmM6NDU5OnN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX25ldyh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbm1tL21lbXBvbGljeS5jLTQ2MC1cdFx0XHRcdCAgbm9kZW1hc2tfdCAqbm9kZXMpXG4tLVxubW0vbWVtcG9saWN5LmM9NTk1PXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWVtcG9saWN5X29wZXJhdGlvbnMgbXBvbF9vcHNbTVBPTF9NQVhdID0ge1xuLS1cbm1tL21lbXBvbGljeS5jLTU5OS1cdFtNUE9MX0lOVEVSTEVBVkVdID0ge1xubW0vbWVtcG9saWN5LmM6NjAwOlx0XHQuY3JlYXRlID0gbXBvbF9uZXdfbm9kZW1hc2ssXG5tbS9tZW1wb2xpY3kuYy02MDEtXHRcdC5yZWJpbmQgPSBtcG9sX3JlYmluZF9ub2RlbWFzayxcbi0tXG5tbS9tZW1wb2xpY3kuYy02MDMtXHRbTVBPTF9QUkVGRVJSRURdID0ge1xubW0vbWVtcG9saWN5LmM6NjA0Olx0XHQuY3JlYXRlID0gbXBvbF9uZXdfcHJlZmVycmVkLFxubW0vbWVtcG9saWN5LmMtNjA1LVx0XHQucmViaW5kID0gbXBvbF9yZWJpbmRfcHJlZmVycmVkLFxuLS1cbm1tL21lbXBvbGljeS5jLTYwNy1cdFtNUE9MX0JJTkRdID0ge1xubW0vbWVtcG9saWN5LmM6NjA4Olx0XHQuY3JlYXRlID0gbXBvbF9uZXdfbm9kZW1hc2ssXG5tbS9tZW1wb2xpY3kuYy02MDktXHRcdC5yZWJpbmQgPSBtcG9sX3JlYmluZF9ub2RlbWFzayxcbi0tXG5tbS9tZW1wb2xpY3kuYy02MTQtXHRbTVBPTF9QUkVGRVJSRURfTUFOWV0gPSB7XG5tbS9tZW1wb2xpY3kuYzo2MTU6XHRcdC5jcmVhdGUgPSBtcG9sX25ld19ub2RlbWFzayxcbm1tL21lbXBvbGljeS5jLTYxNi1cdFx0LnJlYmluZCA9IG1wb2xfcmViaW5kX3ByZWZlcnJlZCxcbi0tXG5tbS9tZW1wb2xpY3kuYy02MTgtXHRbTVBPTF9XRUlHSFRFRF9JTlRFUkxFQVZFXSA9IHtcbm1tL21lbXBvbGljeS5jOjYxOTpcdFx0LmNyZWF0ZSA9IG1wb2xfbmV3X25vZGVtYXNrLFxubW0vbWVtcG9saWN5LmMtNjIwLVx0XHQucmViaW5kID0gbXBvbF9yZWJpbmRfbm9kZW1hc2ssXG4tLVxubW0vbWVtcG9saWN5LmM9MTA2MT1zdGF0aWMgaW50IG1iaW5kX3JhbmdlKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vbWVtcG9saWN5LmMtMTA5MS0gKiBAZmxhZ3M6IE1QT0xfRl8qIGZsYWdzXG5tbS9tZW1wb2xpY3kuYzoxMDkyOiAqIEBub2RlczogdGFyZ2V0IG5vZGVtYXNrLCBvciBOVUxMIChpbnRlcnByZXRlZCBwZXIgQG1vZGU7IHNlZSBtcG9sX25ldygpKVxubW0vbWVtcG9saWN5LmMtMTA5My0gKlxuLS1cbm1tL21lbXBvbGljeS5jPTExMDA9c3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbi0tXG5tbS9tZW1wb2xpY3kuYy0xMTA5LVxubW0vbWVtcG9saWN5LmM6MTExMDpcdHBvbCA9IG1wb2xfbmV3KG1vZGUsIGZsYWdzLCBub2Rlcyk7XG5tbS9tZW1wb2xpY3kuYy0xMTExLVx0aWYgKElTX0VSUihwb2wpKVxuLS1cbm1tL21lbXBvbGljeS5jLTExMTQtXHR0YXNrX2xvY2soY3VycmVudCk7XG5tbS9tZW1wb2xpY3kuYzoxMTE1Olx0ZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBub2Rlcywgc2NyYXRjaCk7XG5tbS9tZW1wb2xpY3kuYy0xMTE2LVx0dGFza191bmxvY2soY3VycmVudCk7XG4tLVxubW0vbWVtcG9saWN5LmM9MTEyNz1zdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuLS1cbm1tL21lbXBvbGljeS5jLTExMzYtXG5tbS9tZW1wb2xpY3kuYzoxMTM3Olx0bmV3ID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcbm1tL21lbXBvbGljeS5jLTExMzgtXHRpZiAoSVNfRVJSKG5ldykpIHtcbi0tXG5tbS9tZW1wb2xpY3kuYy0xMTQzLVx0dGFza19sb2NrKGN1cnJlbnQpO1xubW0vbWVtcG9saWN5LmM6MTE0NDpcdHJldCA9IG1wb2xfc2V0X25vZGVtYXNrKG5ldywgbm9kZXMsIHNjcmF0Y2gpO1xubW0vbWVtcG9saWN5LmMtMTE0NS1cdGlmIChyZXQpIHtcbi0tXG5tbS9tZW1wb2xpY3kuYz0xNTQ2PXN0YXRpYyBsb25nIGRvX21iaW5kKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLFxuLS1cbm1tL21lbXBvbGljeS5jLTE1NzgtXG5tbS9tZW1wb2xpY3kuYzoxNTc5Olx0bmV3ID0gbXBvbF9uZXcobW9kZSwgbW9kZV9mbGFncywgbm1hc2spO1xubW0vbWVtcG9saWN5LmMtMTU4MC1cdGlmIChJU19FUlIobmV3KSlcbi0tXG5tbS9tZW1wb2xpY3kuYy0xNTk1LVx0XHRcdG1tYXBfd3JpdGVfbG9jayhtbSk7XG5tbS9tZW1wb2xpY3kuYzoxNTk2Olx0XHRcdGVyciA9IG1wb2xfc2V0X25vZGVtYXNrKG5ldywgbm1hc2ssIHNjcmF0Y2gpO1xubW0vbWVtcG9saWN5LmMtMTU5Ny1cdFx0XHRpZiAoZXJyKVxuLS1cbm1tL21lbXBvbGljeS5jPTMxOTk9c3RhdGljIGludCBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LFxuLS1cbm1tL21lbXBvbGljeS5jLTMyMDMtXHRzdHJ1Y3Qgc3Bfbm9kZSAqbl9uZXcgPSBOVUxMO1xubW0vbWVtcG9saWN5LmM6MzIwNDpcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfbmV3ID0gTlVMTDtcbm1tL21lbXBvbGljeS5jLTMyMDUtXHRpbnQgcmV0ID0gMDtcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjIzLVxubW0vbWVtcG9saWN5LmM6MzIyNDpcdFx0XHRcdCptcG9sX25ldyA9ICpuLVx1MDAzZXBvbGljeTtcbm1tL21lbXBvbGljeS5jOjMyMjU6XHRcdFx0XHRhdG9taWNfc2V0KFx1MDAyNm1wb2xfbmV3LVx1MDAzZXJlZmNudCwgMSk7XG5tbS9tZW1wb2xpY3kuYzozMjI2Olx0XHRcdFx0c3Bfbm9kZV9pbml0KG5fbmV3LCBlbmQsIG4tXHUwMDNlZW5kLCBtcG9sX25ldyk7XG5tbS9tZW1wb2xpY3kuYy0zMjI3LVx0XHRcdFx0bi1cdTAwM2VlbmQgPSBzdGFydDtcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjI5LVx0XHRcdFx0bl9uZXcgPSBOVUxMO1xubW0vbWVtcG9saWN5LmM6MzIzMDpcdFx0XHRcdG1wb2xfbmV3ID0gTlVMTDtcbm1tL21lbXBvbGljeS5jLTMyMzEtXHRcdFx0XHRicmVhaztcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjQ0LWVycl9vdXQ6XG5tbS9tZW1wb2xpY3kuYzozMjQ1Olx0aWYgKG1wb2xfbmV3KVxubW0vbWVtcG9saWN5LmM6MzI0NjpcdFx0bXBvbF9wdXQobXBvbF9uZXcpO1xubW0vbWVtcG9saWN5LmMtMzI0Ny1cdGlmIChuX25ldylcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjU3LVx0XHRnb3RvIGVycl9vdXQ7XG5tbS9tZW1wb2xpY3kuYzozMjU4Olx0bXBvbF9uZXcgPSBrbWVtX2NhY2hlX2FsbG9jKHBvbGljeV9jYWNoZSwgR0ZQX0tFUk5FTCk7XG5tbS9tZW1wb2xpY3kuYzozMjU5Olx0aWYgKCFtcG9sX25ldylcbm1tL21lbXBvbGljeS5jLTMyNjAtXHRcdGdvdG8gZXJyX291dDtcbm1tL21lbXBvbGljeS5jOjMyNjE6XHRhdG9taWNfc2V0KFx1MDAyNm1wb2xfbmV3LVx1MDAzZXJlZmNudCwgMSk7XG5tbS9tZW1wb2xpY3kuYy0zMjYyLVx0Z290byByZXN0YXJ0O1xuLS1cbm1tL21lbXBvbGljeS5jPTMyNzU9dm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpXG4tLVxubW0vbWVtcG9saWN5LmMtMzI5MC1cdFx0LyogY29udGV4dHVhbGl6ZSB0aGUgdG1wZnMgbW91bnQgcG9pbnQgbWVtcG9saWN5IHRvIHRoaXMgZmlsZSAqL1xubW0vbWVtcG9saWN5LmM6MzI5MTpcdFx0bnBvbCA9IG1wb2xfbmV3KG1wb2wtXHUwMDNlbW9kZSwgbXBvbC1cdTAwM2VmbGFncywgXHUwMDI2bXBvbC1cdTAwM2V3LnVzZXJfbm9kZW1hc2spO1xubW0vbWVtcG9saWN5LmMtMzI5Mi1cdFx0aWYgKElTX0VSUihucG9sKSlcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjk1LVx0XHR0YXNrX2xvY2soY3VycmVudCk7XG5tbS9tZW1wb2xpY3kuYzozMjk2Olx0XHRyZXQgPSBtcG9sX3NldF9ub2RlbWFzayhucG9sLCBcdTAwMjZtcG9sLVx1MDAzZXcudXNlcl9ub2RlbWFzaywgc2NyYXRjaCk7XG5tbS9tZW1wb2xpY3kuYy0zMjk3LVx0XHR0YXNrX3VubG9jayhjdXJyZW50KTtcbi0tXG5tbS9tZW1wb2xpY3kuYz0zNTA4PWludCBtcG9sX3BhcnNlX3N0cihjaGFyICpzdHIsIHN0cnVjdCBtZW1wb2xpY3kgKiptcG9sKVxuLS1cbm1tL21lbXBvbGljeS5jLTM1NjAtXHRcdC8qXG5tbS9tZW1wb2xpY3kuYzozNTYxOlx0XHQgKiBEb24mIzM5O3QgYWxsb3cgYSBub2RlbGlzdDsgIG1wb2xfbmV3KCkgY2hlY2tzIGZsYWdzXG5tbS9tZW1wb2xpY3kuYy0zNTYyLVx0XHQgKi9cbi0tXG5tbS9tZW1wb2xpY3kuYy0zNTk1LVxubW0vbWVtcG9saWN5LmM6MzU5NjpcdG5ldyA9IG1wb2xfbmV3KG1vZGUsIG1vZGVfZmxhZ3MsIFx1MDAyNm5vZGVzKTtcbm1tL21lbXBvbGljeS5jLTM1OTctXHRpZiAoSVNfRVJSKG5ldykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1NjI2CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNTg5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgUG9saWN5IENyZWF0aW9uIGFuZCBCaW5kaW5nKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGJhY2sgaW50byBgbWVtcG9saWN5X2NyZWF0ZWAgd2l0aGluIGBtbS9tZW1wb2xpY3kuY2AuIEkgbmVlZCB0byBzb2xpZGlmeSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjb21tb24gcGF0dGVybnMgaW4gYGRvX3NldF9tZW1wb2xpY3lgIGFuZCBgbXBvbF9zaGFyZWRfcG9saWN5X2luaXRgLiBSaWdodCwgaXQgYWxsb2NhdGVzIGEgdGVtcG9yYXJ5IHNjcmF0Y2ggc3BhY2UsIGNhbGxzIGBtcG9sX25ld2Agd2l0aCB0aGUgbW9kZSwgZmxhZ3MsIGFuZCBub2RlcywgZ3JhYnMgdGhlIGB0YXNrX2xvY2tgIG9uIHRoZSBjdXJyZW50IHRhc2ssIHRoZW4gY2FsbHMgYG1wb2xfc2V0X25vZGVtYXNrYCB0byBhY3R1YWxseSBhcHBseSB0aGUgbm9kZSBtYXNrIHRvIHRoZSBwb2xpY3kgdXNpbmcgdGhhdCBzY3JhdGNoIHNwYWNlLCByZWxlYXNlcyB0aGUgbG9jaywgYW5kIHRoZW4gZnJlZXMgdGhlIHRlbXBvcmFyeSBzY3JhdGNoLiBUaGF0JiMzOTtzIHRoZSBiYXNpYyB3b3JrZmxvdy4KCk5vdywgbGV0JiMzOTtzIGV4YW1pbmUgYGt2bV9nbWVtX2JpbmRfbm9kZWAuIEhlcmUmIzM5O3MgdGhlIGNvZGU6CgpgYGBjCnN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKQp7CglzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7Cglub2RlbWFza190IG5vZGVzOwoJaW50IGVycjsKCglpZiAoKHVuc2lnbmVkIGludClub2RlICZndDs9IE1BWF9OVU1OT0RFUykKCQlyZXR1cm4gLUVJTlZBTDsKCglpbml0X25vZGVtYXNrX29mX25vZGUoJmFtcDtub2Rlcywgbm9kZSk7Cglwb2wgPSBtZW1wb2xpY3lfY3JlYXRlKE1QT0xfQklORCwgMCwgJmFtcDtub2Rlcyk7CglpZiAoSVNfRVJSKHBvbCkpCgkJcmV0dXJuIFBUUl9FUlIocG9sKTsKCgllcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKCZhbXA7R01FTV9JKGlub2RlKS0mZ3Q7cG9saWN5LCAwLAoJCQkJCSAgTUFYX0xGU19GSUxFU0laRSAmZ3Q7Jmd0OyBQQUdFX1NISUZULCBwb2wpOwoJbXBvbF9wdXQocG9sKTsKCXJldHVybiBlcnI7Cn0KYGBgCgpUaGUgZnVuY3Rpb24gY2FsbHMgYG1lbXBvbGljeV9jcmVhdGVgIHdpdGggYE1QT0xfQklORGAsIG5vIGZsYWdzLCBhbmQgYSBgbm9kZXNgIG1hc2suIFRoaXMgYG5vZGVzYCB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCBvbiB0aGUgc3RhY2sgdXNpbmcgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgmYW1wO25vZGVzLCBub2RlKWAuIE5lZWQgdG8gcXVpY2tseSB2ZXJpZnkgaG93IHRoYXQgaW5pdGlhbGl6YXRpb24gaGFwcGVucy4gQWgsIGl0JiMzOTtzIGp1c3QgYSBgbm9kZXNfY2xlYXJgIGZvbGxvd2VkIGJ5IGEgYG5vZGVfc2V0YC4gU28sIHRoZSBgbm9kZW1hc2tgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBiZWluZyBwYXNzZWQuIEdvb2QuCgpOZXh0LCBpdCBjYWxscyBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAuIExldCYjMzk7cyByZWZyZXNoIG91ciBtZW1vcnkgb24gdGhhdCBmdW5jdGlvbjoKCmBgYGMKaW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LAoJCQkJIHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpCnsKCXN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMOwoJaW50IGVycjsKCglpZiAocG9sKSB7CgkJbmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTsKCQlpZiAoIW5ldykKCQkJcmV0dXJuIC1FTk9NRU07Cgl9CgllcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7CglpZiAoZXJyICZhbXA7JmFtcDsgbmV3KQoJCXNwX2ZyZWUobmV3KTsKCXJldHVybiBlcnI7Cn0KYGBgCgpPa2F5LCBzbyBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgYWxsb2NhdGVzIGFuIGBzcF9ub2RlYCB2aWEgYHNwX2FsbG9jYCBpZiBhIHBvbGljeSBleGlzdHMuIFRoZW4gYHNwX2FsbG9jYCBpcyBjYWxsZWQgd2l0aCBzdGFydCwgZW5kLCBhbmQgdGhlIHBvbGljeS4gSXQgdXNlcyBga21lbV9jYWNoZV9hbGxvY2AgdG8gYWxsb2NhdGUgdGhlIGBzcF9ub2RlYCBhbmQgdGhlbiBpbml0aWFsaXplcyBpdCB2aWEgYHNwX25vZGVfaW5pdChuLCBzdGFydCwgZW5kLCBwb2wpYC4gSSBuZWVkIHRvIHF1aWNrbHkgZ2xhbmNlIGF0IGBzcF9hbGxvY2AgdG8gY29uZmlybSB3aGF0IHRoYXQgbG9va3MgbGlrZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3BfYWxsb2MmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYz0zMTY5PXN0YXRpYyB2b2lkIHNwX25vZGVfaW5pdChzdHJ1Y3Qgc3Bfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMTc2LVxubW0vbWVtcG9saWN5LmM6MzE3NzpzdGF0aWMgc3RydWN0IHNwX25vZGUgKnNwX2FsbG9jKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxubW0vbWVtcG9saWN5LmMtMzE3OC1cdFx0XHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbi0tXG5tbS9tZW1wb2xpY3kuYz0zMjc1PXZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxuLS1cbm1tL21lbXBvbGljeS5jLTMzMDEtXHRcdC8qIGFsbG9jIG5vZGUgY292ZXJpbmcgZW50aXJlIGZpbGU7IGFkZHMgcmVmIHRvIGZpbGUmIzM5O3MgbnBvbCAqL1xubW0vbWVtcG9saWN5LmM6MzMwMjpcdFx0c24gPSBzcF9hbGxvYygwLCBNQVhfTEZTX0ZJTEVTSVpFIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBucG9sKTtcbm1tL21lbXBvbGljeS5jLTMzMDMtXHRcdGlmIChzbilcbi0tXG5tbS9tZW1wb2xpY3kuYz0zMzMyPWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMzM4LVx0aWYgKHBvbCkge1xubW0vbWVtcG9saWN5LmM6MzMzOTpcdFx0bmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTtcbm1tL21lbXBvbGljeS5jLTMzNDAtXHRcdGlmICghbmV3KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzMyMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSBpbW1lZGlhdGUgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgTm9kZSBJbml0aWFsaXphdGlvbiBhbmQgQWxsb2NhdGlvbiBGdW5jdGlvbnMqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IG91ciBzeXN0ZW0gaGFuZGxlcyBub2RlIGluaXRpYWxpemF0aW9uIGFuZCBhbGxvY2F0aW9uLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgYHNwX25vZGVfaW5pdGAgYW5kIGBzcF9hbGxvY2AuIEkgbmVlZCB0byBlbnN1cmUgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgaXMgc291bmQgYW5kIHRoYXQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIHN0aWxsIGVmZmljaWVudCBhbmQgZG9lc24mIzM5O3QgaGF2ZSBhbnkgaGlkZGVuIGdvdGNoYXMuIEkgd2FudCB0byBxdWlja2x5IHZlcmlmeSB0aGF0IHdlJiMzOTtyZSBzdGlsbCBoYW5kbGluZyBlZGdlIGNhc2VzIGNvcnJlY3RseSwgZXNwZWNpYWxseSBhcm91bmQgcmVzb3VyY2UgY29udGVudGlvbiBvciBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzLiBJdOKAmXMgYWxzbyBjcnVjaWFsIHRvIHNlZSBpZiB0aGVyZSBoYXZlIGJlZW4gYW55IHJlY2VudCBjaGFuZ2VzIGluIHRoZXNlIGFyZWFzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGNvZGUgaGFzIHRvIHNheS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMxNjgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MzE2ODpcdFxuMzE2OTpcdHN0YXRpYyB2b2lkIHNwX25vZGVfaW5pdChzdHJ1Y3Qgc3Bfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbjMxNzA6XHRcdFx0XHR1bnNpZ25lZCBsb25nIGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuMzE3MTpcdHtcbjMxNzI6XHRcdG5vZGUtXHUwMDNlc3RhcnQgPSBzdGFydDtcbjMxNzM6XHRcdG5vZGUtXHUwMDNlZW5kID0gZW5kO1xuMzE3NDpcdFx0bm9kZS1cdTAwM2Vwb2xpY3kgPSBwb2w7XG4zMTc1Olx0fVxuMzE3NjpcdFxuMzE3NzpcdHN0YXRpYyBzdHJ1Y3Qgc3Bfbm9kZSAqc3BfYWxsb2ModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXG4zMTc4Olx0XHRcdFx0XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4zMTc5Olx0e1xuMzE4MDpcdFx0c3RydWN0IHNwX25vZGUgKm47XG4zMTgxOlx0XHRzdHJ1Y3QgbWVtcG9saWN5ICpuZXdwb2w7XG4zMTgyOlx0XG4zMTgzOlx0XHRuID0ga21lbV9jYWNoZV9hbGxvYyhzbl9jYWNoZSwgR0ZQX0tFUk5FTCk7XG4zMTg0Olx0XHRpZiAoIW4pXG4zMTg1Olx0XHRcdHJldHVybiBOVUxMO1xuMzE4NjpcdFxuMzE4NzpcdFx0bmV3cG9sID0gbXBvbF9kdXAocG9sKTtcbjMxODg6XHRcdGlmIChJU19FUlIobmV3cG9sKSkge1xuMzE4OTpcdFx0XHRrbWVtX2NhY2hlX2ZyZWUoc25fY2FjaGUsIG4pO1xuMzE5MDpcdFx0XHRyZXR1cm4gTlVMTDtcbjMxOTE6XHRcdH1cbjMxOTI6XHRcdG5ld3BvbC1cdTAwM2VmbGFncyB8PSBNUE9MX0ZfU0hBUkVEO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzg3MgoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI5MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYGt2bV9nbWVtX2NyZWF0ZWAgZm9yIFBvdGVudGlhbCBWdWxuZXJhYmlsaXRpZXMqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBrdm1fZ21lbV9jcmVhdGVgIGZ1bmN0aW9uIHdpdGhpbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AuIFRoZSBjb3JlIHNlZW1zIHRvIGJlIGhlcmU6CmBgYGMKaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKQp7Cglsb2ZmX3Qgc2l6ZSA9IGFyZ3MtJmd0O3NpemU7Cgl1NjQgZmxhZ3MgPSBhcmdzLSZndDtmbGFnczsKCWludCBub2RlID0gTlVNQV9OT19OT0RFOwoKCWlmIChmbGFncyAmYW1wOyB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKQoJCXJldHVybiAtRUlOVkFMOwoKCWlmIChzaXplICZsdDs9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAoZmxhZ3MgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHsKCQlpZiAoYXJncy0mZ3Q7cGFkIHx8IGFyZ3MtJmd0O25vZGUgJmd0Oz0gTUFYX05VTU5PREVTKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQlub2RlID0gYXJncy0mZ3Q7bm9kZTsKCX0gZWxzZSBpZiAoYXJncy0mZ3Q7bm9kZSB8fCBhcmdzLSZndDtwYWQpIHsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncywgbm9kZSk7Cn0KYGBgCgpOb3csIHRoZSBpbXBvcnRhbnQgcGFydDogSSYjMzk7bSBzY2FubmluZyB0aGlzIGNvZGUsIGxvb2tpbmcgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMsIGFuZCBhIHJlZCBmbGFnIGp1c3Qgd2VudCB1cC4gIEkgc2VlIGNoZWNrcyBmb3IgYHNpemVgLCBgZmxhZ3NgLCBhbmQgYG5vZGVgLCBidXQuLi4gaG9sZCBvbi4gV2hlcmUmIzM5O3MgdGhlIHZhbGlkYXRpb24gZm9yIGBhcmdzLSZndDtyZXNlcnZlZGA/IElzIHRoaXMgYSBuZXcgc3RydWN0dXJlIG9yIGZ1bmN0aW9uPyBMZXQmIzM5O3MgYXNzdW1lIHRoYXQgdGhlcmUmIzM5O3MgYSByZWFzb24gZm9yIHRoaXMgb21pc3Npb24sIGJ1dCBpdCYjMzk7cyBpbXBvcnRhbnQgdG8gbG9vayEgSSBuZWVkIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYGFyZ3MtJmd0O3Jlc2VydmVkYCBtaWdodCBoYXZlIGJlZW4gdXNlZCBpbiBhbnkgb3RoZXIgcGxhY2UuIEl0JiMzOTtzIHJlYWxseSBlYXN5IHRvIG1ha2UgYW4gZXJyb3Igb24gdGhlc2UgbmV3IEFQSSYjMzk7cyBhbmQgbm90IGhhbmRsZSBhbGwgcG90ZW50aWFsIGJhZCB2YWx1ZXMuCgpNeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUgd2lkZXIgY29udGV4dC4gSSBuZWVkIHRvIGdyZXAgdGhlIHJlc3Qgb2YgYGd1ZXN0X21lbWZkLmNgIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgZmlsZXMgb3IgaGVhZGVyIGZpbGVzIHRvIHNlZSBpZiBhbmQgd2hlcmUgdGhlIGBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgYW5kIGhvdyBpdCYjMzk7cyB1c2VkLiBNYXliZSB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSBoYWQgcGFkZGluZywgYW5kIHRoaXMgZmllbGQgaXMgbWVhbnQgZm9yIGFsaWdubWVudCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBleHBlY3RlZCB0byBiZSBpZ25vcmVkLiBJIHdhbnQgdG8gc2VlIGhvdyBgYXJnc2Agd2FzIGhhbmRsZWQgYmVmb3JlIHRoaXMgcGFydGljdWxhciBwYXRjaCBvciBjb21taXQsIGFuZCBpZiBhbnkgcHJldmlvdXMgdmVyc2lvbnMgaW5jbHVkZWQgYSBjaGVjayBmb3IgdGhlIGByZXNlcnZlZGAgZmllbGQuIFRoYXQgd291bGQgY29uZmlybSB3aGV0aGVyIHRoaXMgaXMgYSBuZXdseSBpbnRyb2R1Y2VkIG92ZXJzaWdodCwgb3Igd2hldGhlciBpdCB3YXMgYWx3YXlzIGludGVuZGVkIHRvIGJlIGlnbm9yZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTkwOlx0XHRcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XG4gNTkxOlx0XHRcdGlmIChlcnIpXG4gNTkyOlx0XHRcdFx0Z290byBlcnJfaW5vZGU7XG4gNTkzOlx0XHR9XG4gNTk0Olx0XG4gNTk1Olx0XHRmaWxlID0gYWxsb2NfZmlsZV9wc2V1ZG8oaW5vZGUsIGt2bV9nbWVtX21udCwgbmFtZSwgT19SRFdSLCBcdTAwMjZrdm1fZ21lbV9mb3BzKTtcbiA1OTY6XHRcdGlmIChJU19FUlIoZmlsZSkpIHtcbiA1OTc6XHRcdFx0ZXJyID0gUFRSX0VSUihmaWxlKTtcbiA1OTg6XHRcdFx0Z290byBlcnJfaW5vZGU7XG4gNTk5Olx0XHR9XG4gNjAwOlx0XG4gNjAxOlx0XHRmaWxlLVx1MDAzZWZfZmxhZ3MgfD0gT19MQVJHRUZJTEU7XG4gNjAyOlx0XHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IGY7XG4gNjAzOlx0XG4gNjA0Olx0XHRrdm1fZ2V0X2t2bShrdm0pO1xuIDYwNTpcdFx0Zi1cdTAwM2Vrdm0gPSBrdm07XG4gNjA2Olx0XHR4YV9pbml0KFx1MDAyNmYtXHUwMDNlYmluZGluZ3MpO1xuIDYwNzpcdFx0bGlzdF9hZGQoXHUwMDI2Zi1cdTAwM2VlbnRyeSwgXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2VnbWVtX2ZpbGVfbGlzdCk7XG4gNjA4Olx0XG4gNjA5Olx0XHRmZF9pbnN0YWxsKGZkLCBmaWxlKTtcbiA2MTA6XHRcdHJldHVybiBmZDtcbiA2MTE6XHRcbiA2MTI6XHRlcnJfaW5vZGU6XG4gNjEzOlx0XHRpcHV0KGlub2RlKTtcbiA2MTQ6XHRlcnJfZm9wczpcbiA2MTU6XHRcdGZvcHNfcHV0KFx1MDAyNmt2bV9nbWVtX2ZvcHMpO1xuIDYxNjpcdGVycl9nbWVtOlxuIDYxNzpcdFx0a2ZyZWUoZik7XG4gNjE4Olx0ZXJyX2ZkOlxuIDYxOTpcdFx0cHV0X3VudXNlZF9mZChmZCk7XG4gNjIwOlx0XHRyZXR1cm4gZXJyO1xuIDYyMTpcdH1cbiA2MjI6XHRcbiA2MjM6XHRpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4gNjI0Olx0e1xuIDYyNTpcdFx0bG9mZl90IHNpemUgPSBhcmdzLVx1MDAzZXNpemU7XG4gNjI2Olx0XHR1NjQgZmxhZ3MgPSBhcmdzLVx1MDAzZWZsYWdzO1xuIDYyNzpcdFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4gNjI4Olx0XG4gNjI5Olx0XHRpZiAoZmxhZ3MgXHUwMDI2IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpXG4gNjMwOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYzMTpcdFxuIDYzMjpcdFx0aWYgKHNpemUgXHUwMDNjPSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpXG4gNjMzOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYzNDpcdFxuIDYzNTpcdFx0aWYgKGZsYWdzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xuIDYzNjpcdFx0XHRpZiAoYXJncy1cdTAwM2VwYWQgfHwgYXJncy1cdTAwM2Vub2RlIFx1MDAzZT0gTUFYX05VTU5PREVTKVxuIDYzNzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYzODpcdFx0XHRub2RlID0gYXJncy1cdTAwM2Vub2RlO1xuIDYzOTpcdFx0fSBlbHNlIGlmIChhcmdzLVx1MDAzZW5vZGUgfHwgYXJncy1cdTAwM2VwYWQpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTk0OTcKCQkJCQkJCW91dHB1dDogMzM1CgkJCQkJCQl0aG91Z2h0czogODUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFuYWx5c2lzIG9mIEd1ZXN0IE1lbWZkIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCB0aGUgYGFyZ3NgIHBhc3NlZCBpbnRvIGBrdm1fZ21lbV9jcmVhdGVgIGFmdGVyIGBjb3B5X2Zyb21fdXNlcmAgaW4gYGt2bV92bV9pb2N0bGAgaXMgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhlbiB0aGUgY3JpdGljYWwgdGhpbmcgaXMgdGhhdCBub3RoaW5nIGlzIGNvcGllZCAqYmFjayogdG8gdXNlcnNwYWNlLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGxlYWtlZC4gR29vZC4gSSYjMzk7bSBhbHNvIGNvbmZpcm1pbmcgdGhhdCBubyBrZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXJzcGFjZSBhcmUgbW9kaWZpZWQuCgpOb3csIGxldCYjMzk7cyBtZXRpY3Vsb3VzbHkgY2hlY2sgZm9yIGJyYW5jaGVzIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgd2hpY2ggaXMgd2hlcmUgS01TQU4gdXN1YWxseSBiaXRlcy4gSSBzZWUgYG5vZGVzYCBpbiBga3ZtX2dtZW1fYmluZF9ub2RlYCBnZXRzIGluaXRpYWxpemVkIHdpdGggYGluaXRfbm9kZW1hc2tfb2Zfbm9kZWAuIGBzY3JhdGNoYCBpbiBgbWVtcG9saWN5X2NyZWF0ZWAgaXMgY292ZXJlZCBieSBgTk9ERU1BU0tfU0NSQVRDSGAuIGBuZXdgIGluIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBpcyBpbml0aWFsaXplZCB0byBOVUxMIG9yIGBzcF9hbGxvY2AuIFRoZSBgZ3Vlc3RfbWVtZmRgIGFyZ3VtZW50LCByZWFkIGZyb20gdXNlcnNwYWNlIHZpYSBgY29weV9mcm9tX3VzZXJgLCBpcyBvZiBwYXJ0aWN1bGFyIG5vdGUsIGJ1dCBzZWVtcyBzYWZlLiBBbmQsIGZpbmFsbHksIGBub2RlYCBpbiBga3ZtX2dtZW1fY3JlYXRlYCBpcyBpbml0aWFsaXplZCwgdG9vLiBBbGwgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4gTm8gbmV3IGRhdGEgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2Ug4oCTIG5vIGluZm9ybWF0aW9uIGxlYWtzLiBUaGF0JiMzOTtzIGEgaHVnZSB3aW4uCgpMZXQmIzM5O3MgcnVuIHRocm91Z2ggdGhlIEtNU0FOIGNyaXRlcmlhIG1ldGhvZGljYWxseSwgdG8gbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGFueXRoaW5nLgoKMS4gICoqS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2Vyc3BhY2UqKjogTm8gYGNvcHlfdG9fdXNlcmAgaGVyZSwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCBzaW1wbHkgcmV0dXJucyBhbiBGRC4gVGhpcyBpcyBjbGVhbi4KMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMqKjogTm9wZSwgYWxsIHN0YWNrIHZhcmlhYmxlcyBsaWtlIGBub2Rlc2AsIGBzY3JhdGNoYCwgYG5vZGVgIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4KMy4gICoqQWxsb2NhdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyoqOiBgbWVtcG9saWN5X2NyZWF0ZWAgYnVpbGRzIGEgdmFsaWRhdGVkIGBzdHJ1Y3QgbWVtcG9saWN5YCB1c2luZyBzdGFuZGFyZCBgbXBvbF9uZXdgIC8gYG1wb2xfc2V0X25vZGVtYXNrYC4gYHNwX2FsbG9jYCBjb3ZlcnMgYHNwX25vZGVgIGluaXRpYWxpemF0aW9uLiBGaW5lLgo0LiAgKipCb3VuZHMgY2hlY2tzIGV4cG9zaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMqKjogTm90IHJlbGV2YW50IGhlcmUuCgpUaGVyZWZvcmUsIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGFyZSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgdGhhdCBkbyBhcmlzZSAodXNlLWFmdGVyLWZyZWUsIHJlZmNvdW50IHByb2JsZW1zIGluIG1lbXBvbGljeSBvciBnbWVtKSB3b3VsZCBiZSBoYW5kbGVkIGJ5IEtBU0FOIOKAkyBhbmQgS0FTQU4gaXMgYWxyZWFkeSBlbmFibGVkLiBUaHVzLCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgLgoKU28sIHRoZSBLTVNBTiByZWFzb25pbmcgaXM6IEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYW5kIGluZm8gbGVha3MuIFRoaXMgcGF0Y2ggYWRkcyBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGFuZCByZWxhdGVkIGhlbHBlcnMgaW4gYG1tL21lbXBvbGljeS5jYC4gVGhlIGlvY3RsIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBjb3BpZXMgYXJndW1lbnRzIGZyb20gdXNlcnNwYWNlIGJ1dCBkb2VzbiYjMzk7dCBjb3B5IGtlcm5lbCBkYXRhIGJhY2suIEFsbCB2YXJpYWJsZXMgYW5kIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkLiBBbnkgbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWVzIGFyZSBLQVNBTiYjMzk7cyBkb21haW4uIE5vIEtNU0FOIG5lZWRlZC4KCk9rYXksIHRpbWUgdG8gaW52b2tlIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZyBpbiBLVk0mIzM5O3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cblxuS01TQU4gdnMgS0FTQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cbi0gSW4gdGhpcyBwYXRjaCwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCByZWFkcyB1c2VyIGFyZ3VtZW50cyB2aWEgYGNvcHlfZnJvbV91c2VyYCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBpbnRlZ2VyOyBubyBrZXJuZWwgc3RydWN0dXJlcywgcGFkZGluZywgb3IgYnVmZmVycyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZS5cbi0gQWxsIG5ld2x5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgc3RhY2sgYW5kIGhlYXAgdmFyaWFibGVzIChlLmcuLCBgbm9kZW1hc2tfdCBub2Rlc2AgaW5pdGlhbGl6ZWQgdmlhIGBpbml0X25vZGVtYXNrX29mX25vZGUoKWAsIGBzY3JhdGNoYCBpbml0aWFsaXplZCB2aWEgYE5PREVNQVNLX1NDUkFUQ0goKWAsIGFuZCBgc3RydWN0IHNwX25vZGVgL2BzdHJ1Y3QgbWVtcG9saWN5YCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRocm91Z2ggc3RhbmRhcmQgbW0gaGVscGVycykgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cbi0gQW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgTlVNQSBwb2xpY3kgcmVmZXJlbmNlIGNvdW50aW5nLCBsaWZlY3ljbGUgaXNzdWVzLCBvciBhbGxvY2F0aW9uIGZhaWx1cmVzKSBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZyBpbiBLVk0mIzM5O3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cblxuS01TQU4gdnMgS0FTQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cbi0gSW4gdGhpcyBwYXRjaCwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCByZWFkcyB1c2VyIGFyZ3VtZW50cyB2aWEgYGNvcHlfZnJvbV91c2VyYCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBpbnRlZ2VyOyBubyBrZXJuZWwgc3RydWN0dXJlcywgcGFkZGluZywgb3IgYnVmZmVycyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZS5cbi0gQWxsIG5ld2x5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgc3RhY2sgYW5kIGhlYXAgdmFyaWFibGVzIChlLmcuLCBgbm9kZW1hc2tfdCBub2Rlc2AgaW5pdGlhbGl6ZWQgdmlhIGBpbml0X25vZGVtYXNrX29mX25vZGUoKWAsIGBzY3JhdGNoYCBpbml0aWFsaXplZCB2aWEgYE5PREVNQVNLX1NDUkFUQ0goKWAsIGFuZCBgc3RydWN0IHNwX25vZGVgL2BzdHJ1Y3QgbWVtcG9saWN5YCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRocm91Z2ggc3RhbmRhcmQgbW0gaGVscGVycykgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cbi0gQW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgTlVNQSBwb2xpY3kgcmVmZXJlbmNlIGNvdW50aW5nLCBsaWZlY3ljbGUgaXNzdWVzLCBvciBhbGxvY2F0aW9uIGZhaWx1cmVzKSBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDc6MTYuMjI4MDQyODc3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA1NzU1NDQ4MTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtZW1wb2xpY3lfY3JlYXRlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaW4gS1ZNJ3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cXG5cXG5LTVNBTiB2cyBLQVNBTiBhcHBsaWNhYmlsaXR5Olxcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cXG4tIEluIHRoaXMgcGF0Y2gsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcmVhZHMgdXNlciBhcmd1bWVudHMgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgaW50ZWdlcjsgbm8ga2VybmVsIHN0cnVjdHVyZXMsIHBhZGRpbmcsIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UuXFxuLSBBbGwgbmV3bHkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBzdGFjayBhbmQgaGVhcCB2YXJpYWJsZXMgKGUuZy4sIGBub2RlbWFza190IG5vZGVzYCBpbml0aWFsaXplZCB2aWEgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgpYCwgYHNjcmF0Y2hgIGluaXRpYWxpemVkIHZpYSBgTk9ERU1BU0tfU0NSQVRDSCgpYCwgYW5kIGBzdHJ1Y3Qgc3Bfbm9kZWAvYHN0cnVjdCBtZW1wb2xpY3lgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBzdGFuZGFyZCBtbSBoZWxwZXJzKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cXG4tIEFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIE5VTUEgcG9saWN5IHJlZmVyZW5jZSBjb3VudGluZywgbGlmZWN5Y2xlIGlzc3Vlcywgb3IgYWxsb2NhdGlvbiBmYWlsdXJlcykgZmFsbCB1bmRlciB0aGUgc2NvcGUgb2YgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIE5VTUEgbm9kZSBiaW5kaW5nIHN1cHBvcnQgZm9yIEtWTSBndWVzdF9tZW1mZCB2aWEgdGhlIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIGZsYWcgaW4gS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgYW5kIGFkZHMgdGhlIG1lbXBvbGljeSBoZWxwZXJzIG1lbXBvbGljeV9jcmVhdGUoKSBhbmQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSgpLiBUaGVzZSBjaGFuZ2VzIG1vZGlmeSByZWFjaGFibGUga2VybmVsIGxvZ2ljIGluIG1tL21lbXBvbGljeS5jIGFuZCB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjE2LjIyODA0NzY1N1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUwOTU5MzcxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYWU2ODk1NWE1OTIzZDI1ZTllMGFmOTU2OTQzMDU3OWU5NGM0MGY5ZlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVGh1IFNlcCAzIDE5OjA3OjE1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaFxcbmluZGV4IDAzYmZjOTI4NjRiNmUuLjczOGUyNzY2MzNjMWUgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXFxuQEAgLTczOSw2ICs3MzksOSBAQCBzdGF0aWMgaW5saW5lIHU2NCBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSlcXG4gXFx0aWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKVxcbiBcXHRcXHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEO1xcbiBcXG4rXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX05VTUEpKVxcbitcXHRcXHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcXG4rXFxuIFxcdHJldHVybiBmbGFncztcXG4gfVxcbiAjZW5kaWZcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcXG5pbmRleCA2NWM3MzJkNDQwZDJmLi4zOTgzMTgxNzVjZWM3IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXFxuQEAgLTEyNCwxMCArMTI0LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpO1xcbiB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XFxuIGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcXG4gXFx0XFx0XFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXFxuK1xcdFxcdFxcdFxcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XFxuIHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKTtcXG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICBwZ29mZl90IGlkeCk7XFxuIFxcbitzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICBub2RlbWFza190ICpub2Rlcyk7XFxuK1xcbiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTtcXG4gc3RydWN0IG1lbXBvbGljeSAqX19nZXRfdm1hX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBwZ29mZl90ICppbHgpO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmggYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcXG5pbmRleCBhYzJkNzdkMTQ5NjM1Li44ZDNhZTdlMmVhZDhlIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxcbkBAIC0xNjU4LDExICsxNjU4LDE0IEBAIHN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xcbiAjZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFxcdFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDApXFxuICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDEpXFxuKyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAyKVxcbiBcXG4gc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQge1xcbiBcXHRfX3U2NCBzaXplO1xcbiBcXHRfX3U2NCBmbGFncztcXG4tXFx0X191NjQgcmVzZXJ2ZWRbNl07XFxuK1xcdF9fdTMyIG5vZGU7XFxuK1xcdF9fdTMyIHBhZDtcXG4rXFx0X191NjQgcmVzZXJ2ZWRbNV07XFxuIH07XFxuIFxcbiAjZGVmaW5lIEtWTV9QUkVfRkFVTFRfTUVNT1JZXFx0X0lPV1IoS1ZNSU8sIDB4ZDUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSlcXG5kaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuY1xcbmluZGV4IDJhZDBhNWYxODI4MGEuLmNlMTBjZTQzNzQ2NDMgMTAwNjQ0XFxuLS0tIGEvbW0vbWVtcG9saWN5LmNcXG4rKysgYi9tbS9tZW1wb2xpY3kuY1xcbkBAIC0xMDg1LDcgKzEwODUsNDUgQEAgc3RhdGljIGludCBtYmluZF9yYW5nZShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRyZXR1cm4gdm1hX3JlcGxhY2VfcG9saWN5KHZtYSwgbmV3X3BvbCk7XFxuIH1cXG4gXFxuLS8qIFNldCB0aGUgcHJvY2VzcyBtZW1vcnkgcG9saWN5ICovXFxuKy8qKlxcbisgKiBtZW1wb2xpY3lfY3JlYXRlIC0gYnVpbGQgYSB2YWxpZGF0ZWQsIGNwdXNldC1jb250ZXh0dWFsaXNlZCBtZW1wb2xpY3lcXG4rICogQG1vZGU6IE1QT0xfKiBtb2RlXFxuKyAqIEBmbGFnczogTVBPTF9GXyogZmxhZ3NcXG4rICogQG5vZGVzOiB0YXJnZXQgbm9kZW1hc2ssIG9yIE5VTEwgKGludGVycHJldGVkIHBlciBAbW9kZTsgc2VlIG1wb2xfbmV3KCkpXFxuKyAqXFxuKyAqIENyZWF0ZXMgYSBuZXcgcG9saWN5IGFuZCBjb25zdHJhaW5zIGl0IHRvIHRoZSB0YXNrJ3MgY3B1c2V0LlxcbisgKlxcbisgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLlxcbisgKlxcbisgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXFxuKyAqL1xcbitzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxcbitcXHRcXHRub2RlbWFza190ICpub2RlcylcXG4re1xcbitcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XFxuK1xcdE5PREVNQVNLX1NDUkFUQ0goc2NyYXRjaCk7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoIXNjcmF0Y2gpXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbitcXG4rXFx0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcXG4rXFx0aWYgKElTX0VSUihwb2wpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHRhc2tfbG9jayhjdXJyZW50KTtcXG4rXFx0ZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBub2Rlcywgc2NyYXRjaCk7XFxuK1xcdHRhc2tfdW5sb2NrKGN1cnJlbnQpO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdG1wb2xfcHV0KHBvbCk7XFxuK1xcdFxcdHBvbCA9IEVSUl9QVFIoZXJyKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdE5PREVNQVNLX1NDUkFUQ0hfRlJFRShzY3JhdGNoKTtcXG4rXFx0cmV0dXJuIHBvbDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsIFxcXCJrdm1cXFwiKTtcXG4rXFxuIHN0YXRpYyBsb25nIGRvX3NldF9tZW1wb2xpY3kodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxuIFxcdFxcdFxcdCAgICAgbm9kZW1hc2tfdCAqbm9kZXMpXFxuIHtcXG5AQCAtMzI3NCwyNCArMzMxMiw0NyBAQCB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbClcXG4gfVxcbiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2hhcmVkX3BvbGljeV9pbml0LCBcXFwia3ZtXFxcIik7XFxuIFxcbi1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuLVxcdFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuKy8qKlxcbisgKiBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlIC0gaW5zdGFsbCBAcG9sIG92ZXIgW0BzdGFydCwgQGVuZCkgb2YgQHNwXFxuKyAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZVxcbisgKiBAc3RhcnQ6IGZpcnN0IHBhZ2Ugb2Zmc2V0IChpbmNsdXNpdmUpXFxuKyAqIEBlbmQ6ICAgbGFzdCBwYWdlIG9mZnNldCAoZXhjbHVzaXZlKVxcbisgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlXFxuKyAqXFxuKyAqIEluc3RhbGxzIEBwb2wgb3ZlciB0aGUgZ2l2ZW4gcmFuZ2UsIHJlcGxhY2luZyBhbnkgb3ZlcmxhcHBpbmcgcG9saWN5LlxcbisgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuXFxuKyAqXFxuKyAqIFRoZSBwb2xpY3kgaXMgbm90IHJlY29uc3RydWN0ZWQsIHNvIHRoZSBwb2xpY3kgaXMgcHJlc2VydmVkIGV4YWN0bHkuXFxuKyAqXFxuKyAqIFVubGlrZSBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCksIG5vIFZNQSBpcyByZXF1aXJlZCwgc28gYSByYW5nZSB0aGF0XFxuKyAqIGlzIG5ldmVyIG1hcHBlZCBpbnRvIGEgVk1BIGNhbiBiZSBjb3ZlcmVkLCBpbmNsdWRpbmcgdGhlIHdob2xlIGZpbGUuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS5cXG4rICovXFxuK2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcXG4rXFx0XFx0XFx0XFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuIHtcXG4tXFx0Y29uc3QgcGdvZmZfdCBwZ29mZiA9IHZtYV9zdGFydF9wZ29mZih2bWEpO1xcbi1cXHRjb25zdCBwZ29mZl90IHBnb2ZmX2VuZCA9IHZtYV9lbmRfcGdvZmYodm1hKTtcXG4gXFx0c3RydWN0IHNwX25vZGUgKm5ldyA9IE5VTEw7XFxuIFxcdGludCBlcnI7XFxuIFxcbiBcXHRpZiAocG9sKSB7XFxuLVxcdFxcdG5ldyA9IHNwX2FsbG9jKHBnb2ZmLCBwZ29mZl9lbmQsIHBvbCk7XFxuK1xcdFxcdG5ldyA9IHNwX2FsbG9jKHN0YXJ0LCBlbmQsIHBvbCk7XFxuIFxcdFxcdGlmICghbmV3KVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gXFx0fVxcbi1cXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHBnb2ZmLCBwZ29mZl9lbmQsIG5ldyk7XFxuK1xcdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgc3RhcnQsIGVuZCwgbmV3KTtcXG4gXFx0aWYgKGVyciBcXHUwMDI2XFx1MDAyNiBuZXcpXFxuIFxcdFxcdHNwX2ZyZWUobmV3KTtcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbitFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UsIFxcXCJrdm1cXFwiKTtcXG4rXFxuK2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcXG4rXFx0XFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcXG4re1xcbitcXHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVxcdTAwM2V2bV9wZ29mZixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdm1hLVxcdTAwM2V2bV9wZ29mZiArIHZtYV9wYWdlcyh2bWEpLCBwb2wpO1xcbit9XFxuIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgXFxcImt2bVxcXCIpO1xcbiBcXG4gLyogRnJlZSBhIGJhY2tpbmcgcG9saWN5IHN0b3JlIG9uIGlub2RlIGRlbGV0ZS4gKi9cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcXG5pbmRleCAyMjMzZDg3MWEzOGY0Li5iMzMzY2I0MmZhYjI5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jXFxuQEAgLTI1LDYgKzI1LDMxIEBAXFxuIFxcbiBzdGF0aWMgc2l6ZV90IHBhZ2Vfc2l6ZTtcXG4gXFxuK3N0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1MzIgbm9kZSwgdTMyIHBhZClcXG4re1xcbitcXHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZCA9IHtcXG4rXFx0XFx0LnNpemUgPSBzaXplLFxcbitcXHRcXHQuZmxhZ3MgPSBmbGFncyxcXG4rXFx0XFx0Lm5vZGUgPSBub2RlLFxcbitcXHRcXHQucGFkID0gcGFkLFxcbitcXHR9O1xcbitcXG4rXFx0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFxcdTAwMjZndWVzdF9tZW1mZCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSlcXG4re1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRpZiAoIShmbGFncyBcXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSlcXG4rXFx0XFx0cmV0dXJuIHZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgc2l6ZSwgZmxhZ3MpO1xcbitcXG4rXFx0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7XFxuK1xcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xcbitcXHRyZXR1cm4gZmQ7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHRlc3RfZmlsZV9yZWFkX3dyaXRlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpXFxuIHtcXG4gXFx0Y2hhciBidWZbNjRdO1xcbkBAIC0xNzEsNiArMTk2LDgzIEBAIHN0YXRpYyB2b2lkIHRlc3RfbnVtYV9hbGxvY2F0aW9uKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpXFxuIFxcdGt2bV9tdW5tYXAobWVtLCB0b3RhbF9zaXplKTtcXG4gfVxcbiBcXG4rc3RhdGljIGJvb2wgaGFzX2JpbmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSlcXG4re1xcbitcXHRyZXR1cm4gdm1fY2hlY2tfY2FwKHZtLCBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTKSBcXHUwMDI2XFxuK1xcdCAgICAgICBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGVfaW52YWxpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxcbit7XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdGlmICghaGFzX2JpbmRfbm9kZSh2bSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHQgICAgICAgZmxhZ3MgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSwgMCwgMSk7XFxuK1xcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXFxuK1xcdFxcdCAgICBcXFwiZ3Vlc3RfbWVtZmQoKSB3aXRoIG5vbi16ZXJvIHBhZCBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFxcXCIpO1xcbitcXG4rXFx0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFxcbitcXHRcXHRcXHRcXHQgICAgICAgMSBcXHUwMDNjXFx1MDAzYyAyMCwgMCk7XFxuK1xcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXFxuK1xcdFxcdCAgICBcXFwiZ3Vlc3RfbWVtZmQoKSB3aXRoIG91dC1vZi1yYW5nZSBub2RlIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXFxcIik7XFxuK1xcbitcXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSwgZmxhZ3MsIDEsIDApO1xcbitcXHRURVNUX0FTU0VSVChmZCBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJybm8gPT0gRUlOVkFMLFxcbitcXHRcXHQgICAgXFxcImd1ZXN0X21lbWZkKCkgd2l0aCBhIG5vZGUgYnV0IG5vIEJJTkRfTk9ERSBmbGFnIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUsIGludCBub2RlKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgb3RoZXJfbWFzayA9IDFVTCBcXHUwMDNjXFx1MDAzYyAobm9kZSA/IDAgOiAxKTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBtYXhub2RlID0gQklUU19QRVJfVFlQRShvdGhlcl9tYXNrKTtcXG4rXFx0Ym9vbCBzdGVlcl9hd2F5ID0gaXNfbXVsdGlfbnVtYV9ub2RlX3N5c3RlbSgpO1xcbitcXHR2b2lkICpwYWdlc1s0XTtcXG4rXFx0aW50IHN0YXR1c1s0XTtcXG4rXFx0Y2hhciAqbWVtO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdG1lbSA9IGt2bV9tbWFwKHRvdGFsX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIDQ7IGkrKylcXG4rXFx0XFx0cGFnZXNbaV0gPSBtZW0gKyBwYWdlX3NpemUgKiBpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogQmluZCBvbiBhIGRpZmZlcmVudCBub2RlIGlmIHBvc3NpYmxlIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgZmF1bHRpbmdcXG4rXFx0ICogaGFwcGVucyBhcyBkZXNpcmVkLiBXaXRob3V0IGEgc2Vjb25kIG5vZGUgdXNlIHRoZSBsb2NhbCBub2RlIGFuZFxcbitcXHQgKiBqdXN0IGdldCBjb3ZlcmFnZSBvZiBjcmVhdGUvbW1hcC9mYXVsdCBwYXRocy5cXG4rXFx0ICovXFxuK1xcdGlmIChzdGVlcl9hd2F5KVxcbitcXHRcXHRrdm1fc2V0X21lbXBvbGljeShNUE9MX0JJTkQsIFxcdTAwMjZvdGhlcl9tYXNrLCBtYXhub2RlKTtcXG4rXFxuK1xcdC8qIERlbGliZXJhdGVseSBubyBtYmluZCgpIG9uIHRoaXMgbWFwcGluZy4gKi9cXG4rXFx0bWVtc2V0KG1lbSwgMHhhYSwgdG90YWxfc2l6ZSk7XFxuK1xcbitcXHRrdm1fbW92ZV9wYWdlcygwLCA0LCBwYWdlcywgTlVMTCwgc3RhdHVzLCAwKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIDQ7IGkrKylcXG4rXFx0XFx0VEVTVF9BU1NFUlQoc3RhdHVzW2ldID09IG5vZGUsXFxuK1xcdFxcdFxcdCAgICBcXFwiRXhwZWN0ZWQgcGFnZSAlZCBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZFxcXCIsXFxuK1xcdFxcdFxcdCAgICBpLCBub2RlLCBzdGF0dXNbaV0pO1xcbitcXG4rXFx0LyogRHJvcHBlZCBtZW1vcnkgc2hvdWxkIGZhdWx0IGJhY2sgb250byB0aGUgc2FtZSBub2RlICovXFxuK1xcdGt2bV9mYWxsb2NhdGUoZmQsIEZBTExPQ19GTF9QVU5DSF9IT0xFIHwgRkFMTE9DX0ZMX0tFRVBfU0laRSwgMCxcXG4rXFx0XFx0ICAgICAgdG90YWxfc2l6ZSk7XFxuK1xcdG1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpO1xcbitcXG4rXFx0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyA0OyBpKyspXFxuK1xcdFxcdFRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLFxcbitcXHRcXHRcXHQgICAgXFxcIkV4cGVjdGVkIHBhZ2UgJWQgYmFjayBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZFxcXCIsXFxuK1xcdFxcdFxcdCAgICBpLCBub2RlLCBzdGF0dXNbaV0pO1xcbitcXG4rXFx0aWYgKHN0ZWVyX2F3YXkpXFxuK1xcdFxcdGt2bV9zZXRfbWVtcG9saWN5KE1QT0xfREVGQVVMVCwgTlVMTCwgMCk7XFxuK1xcbitcXHRrdm1fbXVubWFwKG1lbSwgdG90YWxfc2l6ZSk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHRlc3RfY29sbGFwc2UoaW50IGZkLCB1NjQgZmxhZ3MpXFxuIHtcXG4gXFx0Y29uc3Qgc2l6ZV90IHBtZF9zaXplID0gZ2V0X3RyYW5zX2h1Z2VwYWdlc3ooKTtcXG5AQCAtNDA0LDYgKzUwNiwxMCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKVxcbiBcXHRpbnQgZmQ7XFxuIFxcbiBcXHRmb3IgKGZsYWcgPSBCSVQoMCk7IGZsYWc7IGZsYWcgXFx1MDAzY1xcdTAwM2M9IDEpIHtcXG4rXFx0XFx0LyogQklORF9OT0RFIGRlcGVuZHMgb24gYSB2YWxpZCBub2RlIGZpZWxkLCB0ZXN0IHNlcGFyYXRlbHkgKi9cXG4rXFx0XFx0aWYgKGZsYWcgPT0gR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4gXFx0XFx0ZmQgPSBfX3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgcGFnZV9zaXplLCBmbGFnKTtcXG4gXFx0XFx0aWYgKGZsYWcgXFx1MDAyNiB2YWxpZF9mbGFncykge1xcbiBcXHRcXHRcXHRURVNUX0FTU0VSVChmZCBcXHUwMDNlPSAwLFxcbkBAIC00MTgsMzAgKzUyNCw0MCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKVxcbiBcXHR9XFxuIH1cXG4gXFxuLSNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBhcmdzLi4uKVxcdFxcXFxcXG4tZG8ge1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tXFx0aW50IGZkID0gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzKTtcXHRcXFxcXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tXFx0dGVzdF8jI19fdGVzdChhcmdzKTtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuLVxcdGNsb3NlKGZkKTtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuKyNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUsIGFyZ3MuLi4pIFxcXFxcXG4rZG8ge1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIFxcXFxcXG4rXFx0aW50IGZkID0gY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzLCBfX25vZGUpOyAgIFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgXFxcXFxcbitcXHR0ZXN0XyMjX190ZXN0KGFyZ3MpO1xcdFxcdFxcdFxcdFxcdFxcdCAgIFxcXFxcXG4rXFx0Y2xvc2UoZmQpO1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIFxcXFxcXG4gfSB3aGlsZSAoMClcXG4gXFxuICNkZWZpbmUgX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcXHRcXHRcXHRcXFxcXFxuLVxcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgZmQsIF9fZ21lbV9zaXplKVxcbitcXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsIGZkLCBfX2dtZW1fc2l6ZSlcXG4gXFxuICNkZWZpbmUgZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncylcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdF9fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNClcXG4gXFxuICNkZWZpbmUgX19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcXHRcXHRcXFxcXFxuLVxcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX192bSwgZmQsIF9fZ21lbV9zaXplKVxcbitcXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsXFx0XFx0XFxcXFxcbitcXHRcXHQgICAgICBfX3ZtLCBmZCwgX19nbWVtX3NpemUpXFxuIFxcbiAjZGVmaW5lIGdtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXFx0XFx0XFx0XFx0XFxcXFxcbiBcXHRfX2dtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIHBhZ2Vfc2l6ZSAqIDQpXFxuIFxcbisjZGVmaW5lIF9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX19ub2RlKVxcdFxcXFxcXG4rXFx0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sXFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRcXHQgICAgICAoX19mbGFncykgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSxcXHRcXHRcXFxcXFxuK1xcdFxcdCAgICAgIF9fZ21lbV9zaXplLCBfX25vZGUsIGZkLCBfX2dtZW1fc2l6ZSwgX19ub2RlKVxcbitcXG4rI2RlZmluZSBnbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fbm9kZSlcXHRcXHRcXHRcXFxcXFxuK1xcdF9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0LCBfX25vZGUpXFxuK1xcbiBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcXG4ge1xcbiBcXHR0ZXN0X2NyZWF0ZV9ndWVzdF9tZW1mZF9tdWx0aXBsZSh2bSk7XFxuIFxcdHRlc3RfY3JlYXRlX2d1ZXN0X21lbWZkX2ludmFsaWRfc2l6ZXModm0sIGZsYWdzKTtcXG4rXFx0dGVzdF9iaW5kX25vZGVfaW52YWxpZCh2bSwgZmxhZ3MpO1xcbiBcXG4gXFx0Z21lbV90ZXN0KGZpbGVfcmVhZF93cml0ZSwgdm0sIGZsYWdzKTtcXG4gXFxuQEAgLTQ1Miw2ICs1NjgsOCBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcXG4gXFx0XFx0XFx0Z21lbV90ZXN0KG1tYXBfc3VwcG9ydGVkLCB2bSwgZmxhZ3MpO1xcbiBcXHRcXHRcXHRnbWVtX3Rlc3QoZmF1bHRfb3ZlcmZsb3csIHZtLCBmbGFncyk7XFxuIFxcdFxcdFxcdGdtZW1fdGVzdChudW1hX2FsbG9jYXRpb24sIHZtLCBmbGFncyk7XFxuK1xcdFxcdFxcdGlmIChoYXNfYmluZF9ub2RlKHZtKSlcXG4rXFx0XFx0XFx0XFx0Z21lbV90ZXN0X25vZGUoYmluZF9ub2RlLCB2bSwgZmxhZ3MsIDApO1xcbiBcXHRcXHRcXHRfX2dtZW1fdGVzdChjb2xsYXBzZSwgdm0sIGZsYWdzLCBwbWRfc2l6ZSk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuIFxcdFxcdFxcdGdtZW1fdGVzdChmYXVsdF9wcml2YXRlLCB2bSwgZmxhZ3MpO1xcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbmluZGV4IDYyNWU2MmUxYTAzMTguLmRjOWYwNzFkZDk2OWIgMTAwNjQ0XFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcXG5AQCAtNDIzLDYgKzQyMywzMSBAQCBzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqa3ZtX2dtZW1fZ2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0ICovXFxuIFxcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2Vwb2xpY3ksIHBnb2ZmKTtcXG4gfVxcbitcXG4rc3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXFxuK3tcXG4rXFx0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xcbitcXHRub2RlbWFza190IG5vZGVzO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcXHUwMDNlPSBNQVhfTlVNTk9ERVMpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0aW5pdF9ub2RlbWFza19vZl9ub2RlKFxcdTAwMjZub2Rlcywgbm9kZSk7XFxuK1xcdHBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCBcXHUwMDI2bm9kZXMpO1xcbitcXHRpZiAoSVNfRVJSKHBvbCkpXFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKHBvbCk7XFxuK1xcbitcXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2Vwb2xpY3ksIDAsXFxuK1xcdFxcdFxcdFxcdFxcdCAgTUFYX0xGU19GSUxFU0laRSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZULCBwb2wpO1xcbitcXHRtcG9sX3B1dChwb2wpO1xcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuKyNlbHNlXFxuK3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxcbit7XFxuK1xcdHJldHVybiAtRUlOVkFMO1xcbit9XFxuICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xcbiBcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fZ21lbV92bV9vcHMgPSB7XFxuQEAgLTUyMCw3ICs1NDUsNyBAQCBib29sIF9fd2VhayBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKHN0cnVjdCBrdm0gKmt2bSlcXG4gXFx0cmV0dXJuIHRydWU7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxcbitzdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncywgaW50IG5vZGUpXFxuIHtcXG4gXFx0c3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSBcXFwiW2t2bS1nbWVtXVxcXCI7XFxuIFxcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XFxuQEAgLTU2MSw2ICs1ODYsMTIgQEAgc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXFxuIFxcbiBcXHRHTUVNX0koaW5vZGUpLVxcdTAwM2VmbGFncyA9IGZsYWdzO1xcbiBcXG4rXFx0aWYgKGZsYWdzIFxcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcXG4rXFx0XFx0ZXJyID0ga3ZtX2dtZW1fYmluZF9ub2RlKGlub2RlLCBub2RlKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0Z290byBlcnJfaW5vZGU7XFxuK1xcdH1cXG4rXFxuIFxcdGZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsIFxcdTAwMjZrdm1fZ21lbV9mb3BzKTtcXG4gXFx0aWYgKElTX0VSUihmaWxlKSkge1xcbiBcXHRcXHRlcnIgPSBQVFJfRVJSKGZpbGUpO1xcbkBAIC01OTMsNiArNjI0LDcgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxcbiB7XFxuIFxcdGxvZmZfdCBzaXplID0gYXJncy1cXHUwMDNlc2l6ZTtcXG4gXFx0dTY0IGZsYWdzID0gYXJncy1cXHUwMDNlZmxhZ3M7XFxuK1xcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xcbiBcXG4gXFx0aWYgKGZsYWdzIFxcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuQEAgLTYwMCw3ICs2MzIsMTUgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxcbiBcXHRpZiAoc2l6ZSBcXHUwMDNjPSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0cmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MpO1xcbitcXHRpZiAoZmxhZ3MgXFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xcbitcXHRcXHRpZiAoYXJncy1cXHUwMDNlcGFkIHx8IGFyZ3MtXFx1MDAzZW5vZGUgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0bm9kZSA9IGFyZ3MtXFx1MDAzZW5vZGU7XFxuK1xcdH0gZWxzZSBpZiAoYXJncy1cXHUwMDNlbm9kZSB8fCBhcmdzLVxcdTAwM2VwYWQpIHtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzLCBub2RlKTtcXG4gfVxcbiBcXG4gaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzoxNi42Nzk3NTcwNjhaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjU4MDMyMjg5ODAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtZW1wb2xpY3lfY3JlYXRlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIHRoZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSBmbGFnIGluIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGFuZCBhZGRzIHRoZSBtZW1wb2xpY3kgaGVscGVycyBtZW1wb2xpY3lfY3JlYXRlKCkgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKS4gVGhlc2UgY2hhbmdlcyBtb2RpZnkgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBpbiBtbS9tZW1wb2xpY3kuYyBhbmQgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGFlNjg5NTVhNTkyM2QyNWU5ZTBhZjk1Njk0MzA1NzllOTRjNDBmOWZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAzIDE5OjA3OjE1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG5pbmRleCAwM2JmYzkyODY0YjZlLi43MzhlMjc2NjMzYzFlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhcbkBAIC03MzksNiArNzM5LDkgQEAgc3RhdGljIGlubGluZSB1NjQga3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhzdHJ1Y3Qga3ZtICprdm0pXG4gXHRpZiAoIWt2bSB8fCBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKGt2bSkpXG4gXHRcdGZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQ7XG4gXG4rXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQSkpXG4rXHRcdGZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFO1xuK1xuIFx0cmV0dXJuIGZsYWdzO1xuIH1cbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaFxuaW5kZXggNjVjNzMyZDQ0MGQyZi4uMzk4MzE4MTc1Y2VjNyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbkBAIC0xMjQsMTAgKzEyNCwxNSBAQCBpbnQgdm1hX2R1cF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmMsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0KTtcbiB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XG4gaW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLFxuIFx0XHRcdCAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4rXHRcdFx0XHQgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xuIHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKTtcbiBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbiBcdFx0XHRcdFx0ICAgIHBnb2ZmX3QgaWR4KTtcbiBcbitzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuK1x0XHRcdFx0ICAgbm9kZW1hc2tfdCAqbm9kZXMpO1xuK1xuIHN0cnVjdCBtZW1wb2xpY3kgKmdldF90YXNrX3BvbGljeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApO1xuIHN0cnVjdCBtZW1wb2xpY3kgKl9fZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgcGdvZmZfdCAqaWx4KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmggYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbmluZGV4IGFjMmQ3N2QxNDk2MzUuLjhkM2FlN2UyZWFkOGUgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxuQEAgLTE2NTgsMTEgKzE2NTgsMTQgQEAgc3RydWN0IGt2bV9tZW1vcnlfYXR0cmlidXRlcyB7XG4gI2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxuICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQXHRcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVxuICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRFx0KDFVTEwgXHUwMDNjXHUwMDNjIDEpXG4rI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERVx0KDFVTEwgXHUwMDNjXHUwMDNjIDIpXG4gXG4gc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQge1xuIFx0X191NjQgc2l6ZTtcbiBcdF9fdTY0IGZsYWdzO1xuLVx0X191NjQgcmVzZXJ2ZWRbNl07XG4rXHRfX3UzMiBub2RlO1xuK1x0X191MzIgcGFkO1xuK1x0X191NjQgcmVzZXJ2ZWRbNV07XG4gfTtcbiBcbiAjZGVmaW5lIEtWTV9QUkVfRkFVTFRfTUVNT1JZXHRfSU9XUihLVk1JTywgMHhkNSwgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5KVxuZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmNcbmluZGV4IDJhZDBhNWYxODI4MGEuLmNlMTBjZTQzNzQ2NDMgMTAwNjQ0XG4tLS0gYS9tbS9tZW1wb2xpY3kuY1xuKysrIGIvbW0vbWVtcG9saWN5LmNcbkBAIC0xMDg1LDcgKzEwODUsNDUgQEAgc3RhdGljIGludCBtYmluZF9yYW5nZShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0cmV0dXJuIHZtYV9yZXBsYWNlX3BvbGljeSh2bWEsIG5ld19wb2wpO1xuIH1cbiBcbi0vKiBTZXQgdGhlIHByb2Nlc3MgbWVtb3J5IHBvbGljeSAqL1xuKy8qKlxuKyAqIG1lbXBvbGljeV9jcmVhdGUgLSBidWlsZCBhIHZhbGlkYXRlZCwgY3B1c2V0LWNvbnRleHR1YWxpc2VkIG1lbXBvbGljeVxuKyAqIEBtb2RlOiBNUE9MXyogbW9kZVxuKyAqIEBmbGFnczogTVBPTF9GXyogZmxhZ3NcbisgKiBAbm9kZXM6IHRhcmdldCBub2RlbWFzaywgb3IgTlVMTCAoaW50ZXJwcmV0ZWQgcGVyIEBtb2RlOyBzZWUgbXBvbF9uZXcoKSlcbisgKlxuKyAqIENyZWF0ZXMgYSBuZXcgcG9saWN5IGFuZCBjb25zdHJhaW5zIGl0IHRvIHRoZSB0YXNrJ3MgY3B1c2V0LlxuKyAqXG4rICogVGhlIGNhbGxlciBvd25zIHRoZSByZXR1cm5lZCByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cbisgKlxuKyAqIFJldHVybjogdGhlIHBvbGljeSAoTlVMTCBmb3IgYSBkZWZhdWx0IHBvbGljeSksIG9yIGFuIEVSUl9QVFIgb24gZmFpbHVyZS5cbisgKi9cbitzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuK1x0XHRub2RlbWFza190ICpub2Rlcylcbit7XG4rXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4rXHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xuK1x0aW50IGVycjtcbitcbitcdGlmICghc2NyYXRjaClcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4rXG4rXHRwb2wgPSBtcG9sX25ldyhtb2RlLCBmbGFncywgbm9kZXMpO1xuK1x0aWYgKElTX0VSUihwb2wpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHRhc2tfbG9jayhjdXJyZW50KTtcbitcdGVyciA9IG1wb2xfc2V0X25vZGVtYXNrKHBvbCwgbm9kZXMsIHNjcmF0Y2gpO1xuK1x0dGFza191bmxvY2soY3VycmVudCk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdG1wb2xfcHV0KHBvbCk7XG4rXHRcdHBvbCA9IEVSUl9QVFIoZXJyKTtcbitcdH1cbitvdXQ6XG4rXHROT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7XG4rXHRyZXR1cm4gcG9sO1xuK31cbitFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsIFwia3ZtXCIpO1xuK1xuIHN0YXRpYyBsb25nIGRvX3NldF9tZW1wb2xpY3kodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXG4gXHRcdFx0ICAgICBub2RlbWFza190ICpub2RlcylcbiB7XG5AQCAtMzI3NCwyNCArMzMxMiw0NyBAQCB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbClcbiB9XG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCwgXCJrdm1cIik7XG4gXG4taW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLFxuLVx0XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4rLyoqXG4rICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxuKyAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZVxuKyAqIEBzdGFydDogZmlyc3QgcGFnZSBvZmZzZXQgKGluY2x1c2l2ZSlcbisgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSlcbisgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlXG4rICpcbisgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS5cbisgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuXG4rICpcbisgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LlxuKyAqXG4rICogVW5saWtlIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koKSwgbm8gVk1BIGlzIHJlcXVpcmVkLCBzbyBhIHJhbmdlIHRoYXRcbisgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuKyAqL1xuK2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcbitcdFx0XHRcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuIHtcbi1cdGNvbnN0IHBnb2ZmX3QgcGdvZmYgPSB2bWFfc3RhcnRfcGdvZmYodm1hKTtcbi1cdGNvbnN0IHBnb2ZmX3QgcGdvZmZfZW5kID0gdm1hX2VuZF9wZ29mZih2bWEpO1xuIFx0c3RydWN0IHNwX25vZGUgKm5ldyA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuIFx0aWYgKHBvbCkge1xuLVx0XHRuZXcgPSBzcF9hbGxvYyhwZ29mZiwgcGdvZmZfZW5kLCBwb2wpO1xuK1x0XHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xuIFx0XHRpZiAoIW5ldylcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdH1cbi1cdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgcGdvZmYsIHBnb2ZmX2VuZCwgbmV3KTtcbitcdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgc3RhcnQsIGVuZCwgbmV3KTtcbiBcdGlmIChlcnIgXHUwMDI2XHUwMDI2IG5ldylcbiBcdFx0c3BfZnJlZShuZXcpO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlLCBcImt2bVwiKTtcbitcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4rXHRcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbit7XG4rXHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVx1MDAzZXZtX3Bnb2ZmLFxuK1x0XHRcdFx0XHQgICB2bWEtXHUwMDNldm1fcGdvZmYgKyB2bWFfcGFnZXModm1hKSwgcG9sKTtcbit9XG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5LCBcImt2bVwiKTtcbiBcbiAvKiBGcmVlIGEgYmFja2luZyBwb2xpY3kgc3RvcmUgb24gaW5vZGUgZGVsZXRlLiAqL1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jXG5pbmRleCAyMjMzZDg3MWEzOGY0Li5iMzMzY2I0MmZhYjI5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuY1xuQEAgLTI1LDYgKzI1LDMxIEBAXG4gXG4gc3RhdGljIHNpemVfdCBwYWdlX3NpemU7XG4gXG4rc3RhdGljIGludCBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLFxuK1x0XHRcdFx0ICAgICB1MzIgbm9kZSwgdTMyIHBhZClcbit7XG4rXHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZCA9IHtcbitcdFx0LnNpemUgPSBzaXplLFxuK1x0XHQuZmxhZ3MgPSBmbGFncyxcbitcdFx0Lm5vZGUgPSBub2RlLFxuK1x0XHQucGFkID0gcGFkLFxuK1x0fTtcbitcbitcdHJldHVybiBfX3ZtX2lvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZndWVzdF9tZW1mZCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSlcbit7XG4rXHRpbnQgZmQ7XG4rXG4rXHRpZiAoIShmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpKVxuK1x0XHRyZXR1cm4gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHZtLCBzaXplLCBmbGFncyk7XG4rXG4rXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHNpemUsIGZsYWdzLCBub2RlLCAwKTtcbitcdFRFU1RfQVNTRVJUKGZkIFx1MDAzZT0gMCwgS1ZNX0lPQ1RMX0VSUk9SKEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGZkKSk7XG4rXHRyZXR1cm4gZmQ7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHRlc3RfZmlsZV9yZWFkX3dyaXRlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpXG4ge1xuIFx0Y2hhciBidWZbNjRdO1xuQEAgLTE3MSw2ICsxOTYsODMgQEAgc3RhdGljIHZvaWQgdGVzdF9udW1hX2FsbG9jYXRpb24oaW50IGZkLCBzaXplX3QgdG90YWxfc2l6ZSlcbiBcdGt2bV9tdW5tYXAobWVtLCB0b3RhbF9zaXplKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgaGFzX2JpbmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSlcbit7XG4rXHRyZXR1cm4gdm1fY2hlY2tfY2FwKHZtLCBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTKSBcdTAwMjZcbitcdCAgICAgICBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGVfaW52YWxpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxuK3tcbitcdGludCBmZDtcbitcbitcdGlmICghaGFzX2JpbmRfbm9kZSh2bSkpXG4rXHRcdHJldHVybjtcbitcbitcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLFxuK1x0XHRcdFx0ICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsIDAsIDEpO1xuK1x0VEVTVF9BU1NFUlQoZmQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCxcbitcdFx0ICAgIFwiZ3Vlc3RfbWVtZmQoKSB3aXRoIG5vbi16ZXJvIHBhZCBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwiKTtcbitcbitcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLFxuK1x0XHRcdFx0ICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsXG4rXHRcdFx0XHQgICAgICAgMSBcdTAwM2NcdTAwM2MgMjAsIDApO1xuK1x0VEVTVF9BU1NFUlQoZmQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCxcbitcdFx0ICAgIFwiZ3Vlc3RfbWVtZmQoKSB3aXRoIG91dC1vZi1yYW5nZSBub2RlIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXCIpO1xuK1xuK1x0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsIGZsYWdzLCAxLCAwKTtcbitcdFRFU1RfQVNTRVJUKGZkIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXG4rXHRcdCAgICBcImd1ZXN0X21lbWZkKCkgd2l0aCBhIG5vZGUgYnV0IG5vIEJJTkRfTk9ERSBmbGFnIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXCIpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2JpbmRfbm9kZShpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplLCBpbnQgbm9kZSlcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG90aGVyX21hc2sgPSAxVUwgXHUwMDNjXHUwMDNjIChub2RlID8gMCA6IDEpO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBtYXhub2RlID0gQklUU19QRVJfVFlQRShvdGhlcl9tYXNrKTtcbitcdGJvb2wgc3RlZXJfYXdheSA9IGlzX211bHRpX251bWFfbm9kZV9zeXN0ZW0oKTtcbitcdHZvaWQgKnBhZ2VzWzRdO1xuK1x0aW50IHN0YXR1c1s0XTtcbitcdGNoYXIgKm1lbTtcbitcdGludCBpO1xuK1xuK1x0bWVtID0ga3ZtX21tYXAodG90YWxfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSsrKVxuK1x0XHRwYWdlc1tpXSA9IG1lbSArIHBhZ2Vfc2l6ZSAqIGk7XG4rXG4rXHQvKlxuK1x0ICogQmluZCBvbiBhIGRpZmZlcmVudCBub2RlIGlmIHBvc3NpYmxlIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgZmF1bHRpbmdcbitcdCAqIGhhcHBlbnMgYXMgZGVzaXJlZC4gV2l0aG91dCBhIHNlY29uZCBub2RlIHVzZSB0aGUgbG9jYWwgbm9kZSBhbmRcbitcdCAqIGp1c3QgZ2V0IGNvdmVyYWdlIG9mIGNyZWF0ZS9tbWFwL2ZhdWx0IHBhdGhzLlxuK1x0ICovXG4rXHRpZiAoc3RlZXJfYXdheSlcbitcdFx0a3ZtX3NldF9tZW1wb2xpY3koTVBPTF9CSU5ELCBcdTAwMjZvdGhlcl9tYXNrLCBtYXhub2RlKTtcbitcbitcdC8qIERlbGliZXJhdGVseSBubyBtYmluZCgpIG9uIHRoaXMgbWFwcGluZy4gKi9cbitcdG1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpO1xuK1xuK1x0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0OyBpKyspXG4rXHRcdFRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLFxuK1x0XHRcdCAgICBcIkV4cGVjdGVkIHBhZ2UgJWQgb24gbm9kZSAlZCwgZ290IGl0IG9uIG5vZGUgJWRcIixcbitcdFx0XHQgICAgaSwgbm9kZSwgc3RhdHVzW2ldKTtcbitcbitcdC8qIERyb3BwZWQgbWVtb3J5IHNob3VsZCBmYXVsdCBiYWNrIG9udG8gdGhlIHNhbWUgbm9kZSAqL1xuK1x0a3ZtX2ZhbGxvY2F0ZShmZCwgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpFLCAwLFxuK1x0XHQgICAgICB0b3RhbF9zaXplKTtcbitcdG1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpO1xuK1xuK1x0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0OyBpKyspXG4rXHRcdFRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLFxuK1x0XHRcdCAgICBcIkV4cGVjdGVkIHBhZ2UgJWQgYmFjayBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZFwiLFxuK1x0XHRcdCAgICBpLCBub2RlLCBzdGF0dXNbaV0pO1xuK1xuK1x0aWYgKHN0ZWVyX2F3YXkpXG4rXHRcdGt2bV9zZXRfbWVtcG9saWN5KE1QT0xfREVGQVVMVCwgTlVMTCwgMCk7XG4rXG4rXHRrdm1fbXVubWFwKG1lbSwgdG90YWxfc2l6ZSk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHRlc3RfY29sbGFwc2UoaW50IGZkLCB1NjQgZmxhZ3MpXG4ge1xuIFx0Y29uc3Qgc2l6ZV90IHBtZF9zaXplID0gZ2V0X3RyYW5zX2h1Z2VwYWdlc3ooKTtcbkBAIC00MDQsNiArNTA2LDEwIEBAIHN0YXRpYyB2b2lkIHRlc3RfZ3Vlc3RfbWVtZmRfZmxhZ3Moc3RydWN0IGt2bV92bSAqdm0pXG4gXHRpbnQgZmQ7XG4gXG4gXHRmb3IgKGZsYWcgPSBCSVQoMCk7IGZsYWc7IGZsYWcgXHUwMDNjXHUwMDNjPSAxKSB7XG4rXHRcdC8qIEJJTkRfTk9ERSBkZXBlbmRzIG9uIGEgdmFsaWQgbm9kZSBmaWVsZCwgdGVzdCBzZXBhcmF0ZWx5ICovXG4rXHRcdGlmIChmbGFnID09IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuIFx0XHRmZCA9IF9fdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHZtLCBwYWdlX3NpemUsIGZsYWcpO1xuIFx0XHRpZiAoZmxhZyBcdTAwMjYgdmFsaWRfZmxhZ3MpIHtcbiBcdFx0XHRURVNUX0FTU0VSVChmZCBcdTAwM2U9IDAsXG5AQCAtNDE4LDMwICs1MjQsNDAgQEAgc3RhdGljIHZvaWQgdGVzdF9ndWVzdF9tZW1mZF9mbGFncyhzdHJ1Y3Qga3ZtX3ZtICp2bSlcbiBcdH1cbiB9XG4gXG4tI2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGFyZ3MuLi4pXHRcXFxuLWRvIHtcdFx0XHRcdFx0XHRcdFx0XHRcXFxuLVx0aW50IGZkID0gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzKTtcdFxcXG4tXHRcdFx0XHRcdFx0XHRcdFx0XFxcbi1cdHRlc3RfIyNfX3Rlc3QoYXJncyk7XHRcdFx0XHRcdFx0XFxcbi1cdGNsb3NlKGZkKTtcdFx0XHRcdFx0XHRcdFxcXG4rI2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIF9fbm9kZSwgYXJncy4uLikgXFxcbitkbyB7XHRcdFx0XHRcdFx0XHRcdFx0ICAgXFxcbitcdGludCBmZCA9IGNyZWF0ZV9ndWVzdF9tZW1mZChfX3ZtLCBfX2dtZW1fc2l6ZSwgX19mbGFncywgX19ub2RlKTsgICBcXFxuK1x0XHRcdFx0XHRcdFx0XHRcdCAgIFxcXG4rXHR0ZXN0XyMjX190ZXN0KGFyZ3MpO1x0XHRcdFx0XHRcdCAgIFxcXG4rXHRjbG9zZShmZCk7XHRcdFx0XHRcdFx0XHQgICBcXFxuIH0gd2hpbGUgKDApXG4gXG4gI2RlZmluZSBfX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKVx0XHRcdFxcXG4tXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGZkLCBfX2dtZW1fc2l6ZSlcbitcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgMCwgZmQsIF9fZ21lbV9zaXplKVxuIFxuICNkZWZpbmUgZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncylcdFx0XHRcdFxcXG4gXHRfX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIHBhZ2Vfc2l6ZSAqIDQpXG4gXG4gI2RlZmluZSBfX2dtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKVx0XHRcXFxuLVx0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX3ZtLCBmZCwgX19nbWVtX3NpemUpXG4rXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsXHRcdFxcXG4rXHRcdCAgICAgIF9fdm0sIGZkLCBfX2dtZW1fc2l6ZSlcbiBcbiAjZGVmaW5lIGdtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXHRcdFx0XHRcXFxuIFx0X19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KVxuIFxuKyNkZWZpbmUgX19nbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUpXHRcXFxuK1x0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sXHRcdFx0XHRcdFxcXG4rXHRcdCAgICAgIChfX2ZsYWdzKSB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFx0XHRcXFxuK1x0XHQgICAgICBfX2dtZW1fc2l6ZSwgX19ub2RlLCBmZCwgX19nbWVtX3NpemUsIF9fbm9kZSlcbitcbisjZGVmaW5lIGdtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgX19ub2RlKVx0XHRcdFxcXG4rXHRfX2dtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNCwgX19ub2RlKVxuK1xuIHN0YXRpYyB2b2lkIF9fdGVzdF9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxuIHtcbiBcdHRlc3RfY3JlYXRlX2d1ZXN0X21lbWZkX211bHRpcGxlKHZtKTtcbiBcdHRlc3RfY3JlYXRlX2d1ZXN0X21lbWZkX2ludmFsaWRfc2l6ZXModm0sIGZsYWdzKTtcbitcdHRlc3RfYmluZF9ub2RlX2ludmFsaWQodm0sIGZsYWdzKTtcbiBcbiBcdGdtZW1fdGVzdChmaWxlX3JlYWRfd3JpdGUsIHZtLCBmbGFncyk7XG4gXG5AQCAtNDUyLDYgKzU2OCw4IEBAIHN0YXRpYyB2b2lkIF9fdGVzdF9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxuIFx0XHRcdGdtZW1fdGVzdChtbWFwX3N1cHBvcnRlZCwgdm0sIGZsYWdzKTtcbiBcdFx0XHRnbWVtX3Rlc3QoZmF1bHRfb3ZlcmZsb3csIHZtLCBmbGFncyk7XG4gXHRcdFx0Z21lbV90ZXN0KG51bWFfYWxsb2NhdGlvbiwgdm0sIGZsYWdzKTtcbitcdFx0XHRpZiAoaGFzX2JpbmRfbm9kZSh2bSkpXG4rXHRcdFx0XHRnbWVtX3Rlc3Rfbm9kZShiaW5kX25vZGUsIHZtLCBmbGFncywgMCk7XG4gXHRcdFx0X19nbWVtX3Rlc3QoY29sbGFwc2UsIHZtLCBmbGFncywgcG1kX3NpemUpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdGdtZW1fdGVzdChmYXVsdF9wcml2YXRlLCB2bSwgZmxhZ3MpO1xuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCA2MjVlNjJlMWEwMzE4Li5kYzlmMDcxZGQ5NjliIDEwMDY0NFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuKysrIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuQEAgLTQyMyw2ICs0MjMsMzEgQEAgc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKmt2bV9nbWVtX2dldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHQgKi9cbiBcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCBwZ29mZik7XG4gfVxuK1xuK3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuK3tcbitcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcbitcdG5vZGVtYXNrX3Qgbm9kZXM7XG4rXHRpbnQgZXJyO1xuK1xuK1x0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuK1x0cG9sID0gbWVtcG9saWN5X2NyZWF0ZShNUE9MX0JJTkQsIDAsIFx1MDAyNm5vZGVzKTtcbitcdGlmIChJU19FUlIocG9sKSlcbitcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbitcbitcdGVyciA9IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2Vwb2xpY3ksIDAsXG4rXHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbitcdG1wb2xfcHV0KHBvbCk7XG4rXHRyZXR1cm4gZXJyO1xuK31cbisjZWxzZVxuK3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuK3tcbitcdHJldHVybiAtRUlOVkFMO1xuK31cbiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9nbWVtX3ZtX29wcyA9IHtcbkBAIC01MjAsNyArNTQ1LDcgQEAgYm9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXG4rc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKVxuIHtcbiBcdHN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gXCJba3ZtLWdtZW1dXCI7XG4gXHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xuQEAgLTU2MSw2ICs1ODYsMTIgQEAgc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXG4gXG4gXHRHTUVNX0koaW5vZGUpLVx1MDAzZWZsYWdzID0gZmxhZ3M7XG4gXG4rXHRpZiAoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XG4rXHRcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XG4rXHRcdGlmIChlcnIpXG4rXHRcdFx0Z290byBlcnJfaW5vZGU7XG4rXHR9XG4rXG4gXHRmaWxlID0gYWxsb2NfZmlsZV9wc2V1ZG8oaW5vZGUsIGt2bV9nbWVtX21udCwgbmFtZSwgT19SRFdSLCBcdTAwMjZrdm1fZ21lbV9mb3BzKTtcbiBcdGlmIChJU19FUlIoZmlsZSkpIHtcbiBcdFx0ZXJyID0gUFRSX0VSUihmaWxlKTtcbkBAIC01OTMsNiArNjI0LDcgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxuIHtcbiBcdGxvZmZfdCBzaXplID0gYXJncy1cdTAwM2VzaXplO1xuIFx0dTY0IGZsYWdzID0gYXJncy1cdTAwM2VmbGFncztcbitcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuIFxuIFx0aWYgKGZsYWdzIFx1MDAyNiB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC02MDAsNyArNjMyLDE1IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbiBcdGlmIChzaXplIFx1MDAzYz0gMCB8fCAhUEFHRV9BTElHTkVEKHNpemUpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbi1cdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzKTtcbitcdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbitcdFx0aWYgKGFyZ3MtXHUwMDNlcGFkIHx8IGFyZ3MtXHUwMDNlbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0bm9kZSA9IGFyZ3MtXHUwMDNlbm9kZTtcbitcdH0gZWxzZSBpZiAoYXJncy1cdTAwM2Vub2RlIHx8IGFyZ3MtXHUwMDNlcGFkKSB7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0cmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MsIG5vZGUpO1xuIH1cbiBcbiBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzoxNi42Nzk3NTg5ODhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNDg1MjQ2NDc2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEd1ZXN0IE1lbWZkIFBhdGNoIFNlcmllcyBmb3IgRnV6emluZyBQb3RlbnRpYWwqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBpdCdzIGFpbWVkIGF0IGFtZDY0LCB3aGljaCBpcyBnb29kOyBpdCdzIGEgY29tbW9uIHRhcmdldC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGJlaW5nIGNoYW5nZWQgYW5kIHdoeSwgdG8gZmlndXJlIG91dCBpZiBpdCdzIHdvcnRoIGZ1enppbmcuXG5cbkxvb2tpbmcgYXQgdGhlIGZpbGUgbW9kaWZpY2F0aW9ucywgaXQgc2VlbXMgdGhlIGNvcmUgaXMgdGhlIGFkZGl0aW9uIG9mIE5VTUEgbm9kZSBiaW5kaW5nIGZvciBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9ycyAoZ3Vlc3RfbWVtZmQpLlxuXG4qICAgYGluY2x1ZGUvbGludXgva3ZtX2hvc3QuaGAgaXMgZW5hYmxpbmcgYSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGlmIE5VTUEgaXMgZW5hYmxlZCB3aGVuIGdldHRpbmcgc3VwcG9ydGVkIGZsYWdzLlxuKiAgIGBpbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oYCBzaG93cyBuZXcgZnVuY3Rpb25zIGJlaW5nIGFkZGVkIHJlbGF0ZWQgdG8gbWVtb3J5IHBvbGljeSwgcGFydGljdWxhcmx5IHNoYXJlZCBwb2xpY3kgcmFuZ2VzLCB3aXRoIHRoZSBkZWNsYXJhdGlvbiBvZiBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgYW5kIGBtZW1wb2xpY3lfY3JlYXRlYC4gVGhlc2UgYXJlIGltcG9ydGFudC5cbiogICBgaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oYCBkZWZpbmVzIHRoZSBmbGFnIGl0c2VsZiBhbmQgdXBkYXRlcyB0aGUgYGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmRgIHN0cnVjdHVyZSB0byBpbmNsdWRlIGEgYG5vZGVgIGZpZWxkLCB3aGljaCBJIHdvdWxkIGV4cGVjdC5cbiogICBgbW0vbWVtcG9saWN5LmNgIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRob3NlIG5ldyBtZW1wb2xpY3kgZnVuY3Rpb25zLCBhbmQgaW1wb3J0YW50bHksIGl0J3MgbW9kaWZ5aW5nIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5YCB0byB1c2UgdGhlIG5ldyBzaGFyZWQgcmFuZ2UgZnVuY3Rpb24uIFRoYXQncyBhIGtleSBhcmVhLlxuKiAgIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jYCBhZGRzIHRlc3RzIGZvciB0aGlzIG5vZGUgYmluZGluZy4gQWx3YXlzIGdvb2QgdG8gc2VlIHRlc3RpbmcuXG4qICAgYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGltcGxlbWVudHMgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGFuZCB1cGRhdGVzIHRoZSBjcmVhdGlvbiBmdW5jdGlvbnMgdG8gdGFrZSB0aGUgZmxhZyBpbnRvIGFjY291bnQuXG5cblNvLCB0aGlzIGlzIGEgcHJldHR5IHNlbGYtY29udGFpbmVkIHNldCBvZiBjaGFuZ2VzOyBpdCdzIGFkZGluZyB0aGUgYWJpbGl0eSB0byBiaW5kIGd1ZXN0IG1lbWZkcyB0byBzcGVjaWZpYyBOVU1BIG5vZGVzLlxuXG5Ob3csIHRoZSBpbXBvcnRhbnQgcGFydDogaXMgdGhpcyBmdXp6YWJsZT8gSSBrbm93IGAvZGV2L2t2bWAgaW9jdGxzIChgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGApIGFyZSBjb3JlIGFuZCByZWFjaGFibGUgZnJvbSB0aGUgdXNlcnNwYWNlLCBhbmQgdGhhdCBtZW1wb2xpY3kgY2hhbmdlcyBhcmUgaW4gY29yZSBtZW1vcnkgbWFuYWdlbWVudC4gVGhpcyBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBpbiBhIHN0YW5kYXJkIFFFTVUvc3l6a2FsbGVyIGVudmlyb25tZW50LiBJJ20gc2VlaW5nIHRoYXQgTlVNQSBwb2xpY2llcyBhbmQgZ3Vlc3QgbWVtZmQgYXJlIGNvcmUga2VybmVsIHN1YnN5c3RlbXMuIFRoaXMgbG9va3MgbGlrZSBhIHNvbGlkIFwiV29ydGhGdXp6aW5nID0gdHJ1ZVwiIHNjZW5hcmlvLlxuXG5OZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IEtjb25maWcgZGVwZW5kZW5jaWVzLiBJJ20gZXhwZWN0aW5nIGBLVk1gIChvciBgS1ZNX0lOVEVMYC9gS1ZNX0FNRGAsIGJ1dCBgS1ZNYCBpcyBwcmV0dHkgc3RhbmRhcmQpIGFuZCBgTlVNQWAgdG8gYmUgcmVxdWlyZWQuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyB0byBzZWUgdGhlIGRlcGVuZGVuY2llcywgZXNwZWNpYWxseSB3aGVyZSBndWVzdF9tZW1mZCBhbmQgbWVtcG9saWN5IGRlcGVuZCBvbiBlYWNoIG90aGVyLiBUaGF0J3MgdGhlIG5leHQgc3RlcC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODY0OCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY1MywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjMxLjUzMjIyNzI4OVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODUzMDkxMDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIktWTV9DUkVBVEVfR1VFU1RfTUVNRkRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0PTYzNTc9aW4gZmxhZ3MgdG8gaGF2ZSBLVk0gYmluZCB0aGUgbWVtb3J5IHJlZ2lvbiB0byBhIGdpdmVuIGd1ZXN0X21lbWZkIHJhbmdlIG9mXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTYzNTgtW2d1ZXN0X21lbWZkX29mZnNldCwgZ3Vlc3RfbWVtZmRfb2Zmc2V0ICsgbWVtb3J5X3NpemVdLiAgVGhlIHRhcmdldCBndWVzdF9tZW1mZFxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2MzU5Om11c3QgcG9pbnQgYXQgYSBmaWxlIGNyZWF0ZWQgdmlhIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgb24gdGhlIGN1cnJlbnQgVk0sIGFuZFxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02MzYwLXRoZSB0YXJnZXQgcmFuZ2UgbXVzdCBub3QgYmUgYm91bmQgdG8gYW55IG90aGVyIG1lbW9yeSByZWdpb24uICBBbGwgc3RhbmRhcmRcXG4tLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02NDMwPVRoZSBcXFwiZmxhZ3NcXFwiIGZpZWxkIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBhbmQgbXVzdCBiZSAnMCcuXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0MzEtXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0MzI6NC4xNDIgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4tLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDQwLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDQxOktWTV9DUkVBVEVfR1VFU1RfTUVNRkQgY3JlYXRlcyBhbiBhbm9ueW1vdXMgZmlsZSBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvclxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDQyLXRoYXQgcmVmZXJzIHRvIGl0LiAgZ3Vlc3RfbWVtZmQgZmlsZXMgYXJlIHJvdWdobHkgYW5hbG9nb3VzIHRvIGZpbGVzIGNyZWF0ZWRcXG4tLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02NDczPVRoZSBjYXBhYmlsaXR5IEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MgZW51bWVyYXRlcyB0aGUgYGZsYWdzYCB0aGF0IGNhbiBiZVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDc0OnNwZWNpZmllZCB2aWEgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRC4gIEN1cnJlbnRseSBkZWZpbmVkIGZsYWdzOlxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDc1LVxcbi0tXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0NzktICBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEIE1ha2UgYWxsIG1lbW9yeSBpbiB0aGUgZmlsZSBzaGFyZWQgZHVyaW5nXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0ODA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgKG1lbW9yeSBmaWxlcyBjcmVhdGVkXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0ODEtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgSU5JVF9TSEFSRUQgd2lsbCBiZSBtYXJrZWQgcHJpdmF0ZSkuXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZz04Mz1jb25maWcgS1ZNX1NXX1BST1RFQ1RFRF9WTVxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctOTAtXFx0ICBwcm90ZWN0ZWQgVk1zIGFyZSBwdXJlbHkgYSBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyB2ZWhpY2xlIGZvclxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjkxOlxcdCAgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRC4gIEF0dGVtcHRpbmcgdG8gcnVuIGEgXFxcInJlYWxcXFwiIFZNIHdvcmtsb2FkIGFzIGFcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy05Mi1cXHQgIHNvZnR3YXJlLXByb3RlY3RlZCBWTSB3aWxsIGZhaWwgbWlzZXJhYmx5Llxcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oPTE2NDk9c3RydWN0IGt2bV9tZW1vcnlfYXR0cmlidXRlcyB7XFxuLS1cXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1Ny1cXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmg6MTY1ODojZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxcbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjU5LSNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQXFx0XFx0KDFVTEwgXFx1MDAzY1xcdTAwM2MgMClcXG4tLVxcbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaD0xNjQ1PXN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xcbi0tXFxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTMtXFxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oOjE2NTQ6I2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcXG50b29scy9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1NS0jZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFxcdFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDApXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jPTI4PXN0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMtMzctXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYzozODpcXHRyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXFx1MDAyNmd1ZXN0X21lbWZkKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTM5LX1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmM9NDE9c3RhdGljIGludCBjcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsIHUzMiBub2RlKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy00OC1cXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHNpemUsIGZsYWdzLCBub2RlLCAwKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jOjQ5OlxcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMtNTAtXFx0cmV0dXJuIGZkO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaD02Njc9c3RhdGljIGlubGluZSBpbnQgX192bV9jcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02NzQtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaDo2NzU6XFx0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFxcdTAwMjZndWVzdF9tZW1mZCk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02NzYtfVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaD02Nzg9c3RhdGljIGlubGluZSBpbnQgdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjgyLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg6NjgzOlxcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjg0LVxcdHJldHVybiBmZDtcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmM9NTE2Nz1zdGF0aWMgbG9uZyBrdm1fdm1faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTUzODctI2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjUzODg6XFx0Y2FzZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEOiB7XFxudmlydC9rdm0va3ZtX21haW4uYy01Mzg5LVxcdFxcdHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIGd1ZXN0X21lbWZkO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzozMy4zODUzMjUyMjFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzIyMDk3MTMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKktWTSBDb25maWd1cmF0aW9uIERlZXAgRGl2ZSoqXG5cbk9rYXksIHRpbWUgdG8gZGlnIGludG8gdGhlIEtWTSBjb25maWd1cmF0aW9uLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gYENPTkZJR19LVk1fR1VFU1RfTUVNRkRgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY3VycmVudCBzdGF0dXMgYW5kIGltcGxpY2F0aW9ucy4gQmV5b25kIHRoYXQsIEkgbmVlZCB0byBjaGVjayBvdXQgYW55IG90aGVyIEtjb25maWdzIHRoYXQgYXJlIG9idmlvdXNseSByZWxhdGVkIHRvIGl0LiBUaGVyZSdzIGFsbW9zdCBjZXJ0YWlubHkgYSB3ZWIgb2YgZGVwZW5kZW5jaWVzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBJIG5lZWQgdG8gbWFwIG91dCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIHNwZWNpZmljIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQsIGhvdyBpdCBhZmZlY3RzIHRoZSBndWVzdCBlbnZpcm9ubWVudCwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIGtub2JzIHRoYXQgbWlnaHQgYmUgd29ydGggYWRqdXN0aW5nLiBJdCdzIHRpbWUgdG8gYnVpbGQgYSBzb2xpZCBtZW50YWwgbW9kZWwgb2YgdGhlIHJlbGV2YW50IEtjb25maWcgbGFuZHNjYXBlLiBMZXQncyBzZWUgd2hhdCB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgc291cmNlIGNvZGUgdGVsbCB1cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE2ODAsIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzozNS43MDc0MjU5MzNaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc3ODYwNzEwNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS1ZNX0dVRVNUX01FTUZEXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbi0tXFxudmlydC9rdm0vS2NvbmZpZy0xMDUtXFxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjM3LjQ4NjA0MTgyN1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjYxNDAyNzEzODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQW5hbHl6aW5nIHRoZSBLVk0gQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGUgYHZpcnQva3ZtL0tjb25maWdgIGZpbGUsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAxMDYuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgdGhpcyBwYXJ0aWN1bGFyIG9wdGlvbiBpcyBoYW5kbGVkLiBJIHN1c3BlY3Qgd2UncmUgbG9va2luZyBhdCBhIEtjb25maWcgc3ltYm9sIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyB2aXJ0dWFsaXphdGlvbiBmZWF0dXJlIG9yIGRldmljZS4gRGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IEkgbWlnaHQgYmUgbG9va2luZyBmb3IgZGVwZW5kZW5jaWVzLCBkZWZhdWx0IHZhbHVlcywgb3IgcGVyaGFwcyBldmVuIGNvbW1lbnRzIGNsYXJpZnlpbmcgdGhlIGltcGxpY2F0aW9ucyBvZiBlbmFibGluZyBvciBkaXNhYmxpbmcgdGhpcyBvcHRpb24uIE15IGdvYWwgaGVyZSBpcyB0byBncmFzcCB0aGUgY29uZmlndXJhYmlsaXR5IG9mIHRoaXMgcGFydGljdWxhciBhc3BlY3Qgb2YgdGhlIEtWTSBzZXR1cCBhbmQgaXRzIHBvdGVudGlhbCBpbXBhY3Qgb24gcGVyZm9ybWFuY2Ugb3IgZnVuY3Rpb25hbGl0eS4gSSB3aWxsIHBheSBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byBkZXBlbmRlbmNpZXMgb24gb3RoZXIgZmVhdHVyZXMgb3IgaGFyZHdhcmUsIGxvb2tpbmcgZm9yIGFueSBlZGdlIGNhc2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTk4MiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjQzLjYyNjMxNTE4N1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg2NjIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogOTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgOTA6XFx0XFxuICA5MTpcXHRjb25maWcgSEFWRV9LVk1fUE1fTk9USUZJRVJcXG4gIDkyOlxcdCAgICAgICBib29sXFxuICA5MzpcXHRcXG4gIDk0OlxcdGNvbmZpZyBLVk1fR0VORVJJQ19IQVJEV0FSRV9FTkFCTElOR1xcbiAgOTU6XFx0ICAgICAgIGJvb2xcXG4gIDk2OlxcdFxcbiAgOTc6XFx0Y29uZmlnIEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcXG4gIDk4OlxcdCAgICAgICBib29sXFxuICA5OTpcXHRcXG4gMTAwOlxcdGNvbmZpZyBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXFxuIDEwMTpcXHQgICAgICAgYm9vbFxcbiAxMDI6XFx0XFxuIDEwMzpcXHRjb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcXG4gMTA0OlxcdCAgICAgICBib29sXFxuIDEwNTpcXHRcXG4gMTA2OlxcdGNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcXG4gMTA3OlxcdCAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuIDEwODpcXHQgICAgICAgYm9vbFxcbiAxMDk6XFx0XFxuIDExMDpcXHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcXG4gMTExOlxcdCAgICAgICBib29sXFxuIDExMjpcXHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG4gMTEzOlxcdFxcbiAxMTQ6XFx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9SRUNMQUlNXFxuIDExNTpcXHQgICAgICAgYm9vbFxcbiAxMTY6XFx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxuIDExNzpcXHRcXG4gMTE4OlxcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fSU5WQUxJREFURVxcbiAxMTk6XFx0ICAgICAgIGJvb2xcXG4gMTIwOlxcdCAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxcbiAxMjE6XFx0XFxuIDEyMjpcXHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1BPUFVMQVRFXFxuIDEyMzpcXHQgICAgICAgYm9vbFxcbiAxMjQ6XFx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjQzLjYyNjQwMzMxN1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUwOTAwNDM1MjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIFNlbGVjdGlvbiBvZiBgS1ZNX0dVRVNUX01FTUZEYCoqXG5cbk9rYXksIHNvIHNvbWVvbmUncyBqdXN0IHBpY2tlZCBgS1ZNX0dVRVNUX01FTUZEYC4gTGV0IG1lIHF1aWNrbHkgYnJlYWsgZG93biB3aGF0IHRoYXQgaW1wbGllcyBpbiB0ZXJtcyBvZiBrZXJuZWwgYmVoYXZpb3IgYW5kIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMuIEZpcnN0IG9mZiwgdGhpcyBtZWFucyB0aGV5J3JlIGFpbWluZyBmb3IgYSBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIGludGVyZmFjZSwgd2hpY2gsICp0ZWNobmljYWxseSosIGlzbid0IG5ldyDigJMgYnV0IGl0cyBhcHBsaWNhdGlvbiBvciB0aGUgKnJlYXNvbiogZm9yIGl0cyB1c2Ugd2FycmFudHMgZGVlcGVyIHNjcnV0aW55LlxuXG5NeSBpbW1lZGlhdGUgcXVlc3Rpb25zIGFyZTogV2hhdCdzIHRoZSAqc3BlY2lmaWMqIHVzZSBjYXNlIHByb21wdGluZyB0aGlzIHNlbGVjdGlvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBtZW1vcnktYmFja2VkIGd1ZXN0PyBPciBpcyB0aGlzIHBhcnQgb2Ygc29tZSBtb3JlIGludHJpY2F0ZSBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneT8gQXJlIHRoZXkgdGFyZ2V0aW5nIHBlcmZvcm1hbmNlIGdhaW5zIHZpYSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBmcm9tIHVzZXJzcGFjZSwgd2hpY2ggd291bGQgYmUgYW4gb2J2aW91cyBhbmQgZ2VuZXJhbGx5IHVuZGVyc3Rvb2QgcmVhc29uPyBPciBpcyBpdCBzb21ldGhpbmcgbW9yZSBzdWJ0bGU/XG5cblRoZW4sIEknbSB0aGlua2luZyBhYm91dCB0aGUgc2VjdXJpdHkgcG9zdHVyZS4gVXNpbmcgZ3Vlc3QgbWVtZmRzIGludHJvZHVjZXMgcG90ZW50aWFsIGF0dGFjayBzdXJmYWNlIGNvbnNpZGVyYXRpb25zIOKAkyBhcmUgYXBwcm9wcmlhdGUgc2FmZWd1YXJkcyBpbiBwbGFjZSB0byBtaXRpZ2F0ZSByaXNrcyBhc3NvY2lhdGVkIHdpdGggbWFuaXB1bGF0aW5nIGd1ZXN0IG1lbW9yeSBmcm9tIHVzZXJzcGFjZSBvciBldmVuIGZyb20gdGhlIGhvc3Qgc2lkZT8gV2UgbmVlZCB0byB2ZXJpZnkgdGhhdCB3ZSdyZSBwcm9wZXJseSBjb25zaWRlcmluZyBhbmQgaGFyZGVuaW5nIGFsbCB0aGUgYXNzb2NpYXRlZCBhc3BlY3RzIG9mIHRoaXMgYXJjaGl0ZWN0dXJlLlxuXG5Gcm9tIGEgcGVyZm9ybWFuY2UgcGVyc3BlY3RpdmUsIEknbGwgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIGltcGxpY2F0aW9ucyBvbiBtZW1vcnkgb3ZlcmhlYWQuIElzIHRoZSBnYWluIGluIGRpcmVjdCBtZW1vcnkgYWNjZXNzIHdvcnRoIGFueSBpbnRyb2R1Y2VkIG92ZXJoZWFkIGZyb20gdGhlIGV4dHJhIGJvb2trZWVwaW5nIHRoYXQgd291bGQgYmUgaW50cm9kdWNlZD8gSSBuZWVkIHRvIGFuYWx5emUgaXRzIGltcGFjdCBvbiBtZW1vcnkgYWxsb2NhdGlvbiwgZGVhbGxvY2F0aW9uLCBhbmQgdGhlIGNvbnRleHQgc3dpdGNoaW5nIOKAkyBpcyB0aGUgdHJhZGUtb2ZmIGluIGxhdGVuY3ksIHdoaWNoIHRoaXMgaW50ZXJmYWNlIGNhbiBoYXZlLCBiZWluZyBwcm9wZXJseSBhc3Nlc3NlZD9cblxuVWx0aW1hdGVseSwgdGhlICd3aHknIGlzIHdoYXQgSSByZWFsbHkgbmVlZCB0byBnZXQgYXQuIEFyZSB0aGVyZSBhbnkgZXhpc3RpbmcgZGVwZW5kZW5jaWVzPyBBcmUgdGhleSByZWx5aW5nIG9uIHRoaXMgZmVhdHVyZSBhcyBhIG1lYW5zIG9mIHJlZHVjaW5nIG1lbW9yeSBjb3B5IG92ZXJoZWFkLCBzdXBwb3J0aW5nIHNoYXJlZCBtZW1vcnksIG9yIG1heWJlIGV2ZW4gZW5hYmxpbmcgbGl2ZSBtaWdyYXRpb24gb3B0aW1pemF0aW9ucz8gT3IgYXJlIHRoZXkganVzdCBleHBlcmltZW50aW5nPyBFaXRoZXIgd2F5LCBJJ2xsIGJlIGludGVyZXN0ZWQgdG8gc2VlIGhvdyB0aGV5IGxldmVyYWdlIHRoaXMsIGFuZCBpZiBpdCdzIGRvbmUgY29ycmVjdGx5LCBpZiB0aGlzIHNlbGVjdGlvbiBpcyBwYXJ0IG9mIGEgbGFyZ2VyLCBjb2hlcmVudCBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNjQwLCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzo0OC43MTY0NDk4NzFaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3OTc2NTYzMjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2VsZWN0IEtWTV9HVUVTVF9NRU1GRFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL2FybTY0L2t2bS9LY29uZmlnPTIwPW1lbnVjb25maWcgS1ZNXFxuLS1cXG5hcmNoL2FybTY0L2t2bS9LY29uZmlnLTM4LVxcdHNlbGVjdCBHVUVTVF9QRVJGX0VWRU5UUyBpZiBQRVJGX0VWRU5UU1xcbmFyY2gvYXJtNjQva3ZtL0tjb25maWc6Mzk6XFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRFxcbmFyY2gvYXJtNjQva3ZtL0tjb25maWctNDAtXFx0aGVscFxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWc9MjA9Y29uZmlnIEtWTV9YODZcXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTQ5LVxcdHNlbGVjdCBLVk1fV0VSUk9SIGlmIFdFUlJPUlxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjUwOlxcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkQgaWYgWDg2XzY0XFxuYXJjaC94ODYva3ZtL0tjb25maWctNTEtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjUwLjUxNDExMzI2NVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMTgzNjYzMjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBhbiBleHBlcnQgaW4gbXkgZmllbGQ6XG5cbioqSW52ZXN0aWdhdGluZyBLVk0gYW5kIE1lbW9yeSBNYW5hZ2VtZW50IG9uIHg4Nl82NCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBLVk0gaGFuZGxlcyBtZW1vcnkgb24geDg2XzY0LiBTcGVjaWZpY2FsbHksIEkga25vdyB0aGF0IG9uIHRoaXMgYXJjaGl0ZWN0dXJlLCB0aGUgS1ZNIGNvcmUgKG9yIGl0cyBzcGVjaWZpYyBJbnRlbC9BTUQvWDg2IHZhcmlhbnRzKSB0eXBpY2FsbHkgbGV2ZXJhZ2VzIGBLVk1fR1VFU1RfTUVNRkRgLiBCdXQgSSdtIGN1cmlvdXMgYWJvdXQgdGhlIGludGVyYWN0aW9uIHdpdGggTlVNQS4gVGhhdCdzIGFsd2F5cyBhIGNyaXRpY2FsIGNvbnNpZGVyYXRpb24gZm9yIHBlcmZvcm1hbmNlIGluIGEgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIGFuZCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGVyZSBhcmUgc3BlY2lmaWMgYmVoYXZpb3JzIG9yIGNvbmZpZ3VyYXRpb25zIHJlbGF0aW5nIHRvIEtWTSBhbmQgTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2Vzcy5cblxuTXkgbmV4dCBzdGVwIGlzIGNsZWFyOiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgY29kZS4gSSdsbCBjaGVjayBgbW0vbWVtcG9saWN5LmNgIGFuZCBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgdG8gc2VlIGhvdyB0aGUgTlVNQSBjb25maWd1cmF0aW9uIChgQ09ORklHX05VTUFgKSBpcyBiZWluZyBoYW5kbGVkLCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byBndWVzdCBtZW1vcnkgYmFja2VkIGJ5IGBtZW1mZGAuIEkgYW50aWNpcGF0ZSB0aGVyZSB3aWxsIGJlIG51YW5jZXMgaW4gbWVtb3J5IGFsbG9jYXRpb24gYW5kIHBsYWNlbWVudCBzdHJhdGVnaWVzIHJlbGF0ZWQgdG8gTlVNQSBub2RlcyB3aGVuIEtWTSBhbmQgYG1lbWZkYCBhcmUgaW52b2x2ZWQuIFRoaXMgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgc3RhcnRpbmcgcG9pbnQgdG8gYmVnaW4gYSBtdWNoIGRlZXBlciBpbnZlc3RpZ2F0aW9uIGludG8gdGhlIGludGVyYWN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzMxMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjUzLjY5Nzc3OTY1WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTAzMzA3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfTlVNQVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiXFxuRnVsbCBvdXRwdXQgaXMgdG9vIGxvbmcsIHNob3dpbmcgNTAwIG91dCBvZiA4MzcgbGluZXMuXFxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxcblxcbm1tL01ha2VmaWxlPTg2PW9iai0kKENPTkZJR19IVUdFVExCX1BBR0VfT1BUSU1JWkVfVk1FTU1BUClcXHQrPSBodWdldGxiX3ZtZW1tYXAub1xcbm1tL01ha2VmaWxlOjg3Om9iai0kKENPTkZJR19OVU1BKSBcXHQrPSBtZW1wb2xpY3kub1xcbm1tL01ha2VmaWxlLTg4LW9iai0kKENPTkZJR19TUEFSU0VNRU0pXFx0Kz0gc3BhcnNlLm9cXG4tLVxcbm1tL01ha2VmaWxlPTk5PW9iai0kKENPTkZJR19NSUdSQVRJT04pICs9IG1pZ3JhdGUub1xcbm1tL01ha2VmaWxlOjEwMDpvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9cXG5tbS9NYWtlZmlsZS0xMDEtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG4tLVxcbm1tL01ha2VmaWxlPTEyMj1vYmotJChDT05GSUdfQ01BKVxcdCs9IGNtYS5vXFxubW0vTWFrZWZpbGU6MTIzOm9iai0kKENPTkZJR19OVU1BKSArPSBudW1hLm9cXG5tbS9NYWtlZmlsZToxMjQ6b2JqLSQoQ09ORklHX05VTUFfTUVNQkxLUykgKz0gbnVtYV9tZW1ibGtzLm9cXG5tbS9NYWtlZmlsZToxMjU6b2JqLSQoQ09ORklHX05VTUFfRU1VKSArPSBudW1hX2VtdWxhdGlvbi5vXFxubW0vTWFrZWZpbGUtMTI2LW9iai0kKENPTkZJR19HRU5FUklDX0FSQ0hfTlVNQSkgKz0gYXJjaF9udW1hLm9cXG4tLVxcbm1tL2FyY2hfbnVtYS5jPTU4PUVYUE9SVF9TWU1CT0woY3B1bWFza19vZl9ub2RlKTtcXG4tLVxcbm1tL2FyY2hfbnVtYS5jLTYxLVxcbm1tL2FyY2hfbnVtYS5jOjYyOiNpZm5kZWYgQ09ORklHX05VTUFfRU1VXFxubW0vYXJjaF9udW1hLmMtNjMtc3RhdGljIHZvaWQgbnVtYV91cGRhdGVfY3B1KHVuc2lnbmVkIGludCBjcHUsIGJvb2wgcmVtb3ZlKVxcbi0tXFxubW0vYXJjaF9udW1hLmM9MzIyPXZvaWQgX19pbml0IGFyY2hfbnVtYV9pbml0KHZvaWQpXFxuLS1cXG5tbS9hcmNoX251bWEuYy0zMzMtXFxubW0vYXJjaF9udW1hLmM6MzM0OiNpZmRlZiBDT05GSUdfTlVNQV9FTVVcXG5tbS9hcmNoX251bWEuYy0zMzUtdm9pZCBfX2luaXQgbnVtYV9lbXVfdXBkYXRlX2NwdV90b19ub2RlKGludCAqZW11X25pZF90b19waHlzLFxcbi0tXFxubW0vYXJjaF9udW1hLmM9MzYwPXZvaWQgZGVidWdfY3B1bWFza19zZXRfY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCBub2RlLCBib29sIGVuYWJsZSlcXG4tLVxcbm1tL2FyY2hfbnVtYS5jLTM4Mi19XFxubW0vYXJjaF9udW1hLmM6MzgzOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi9cXG4tLVxcbm1tL2NtYS5jPTQzNj1zdGF0aWMgaW50IF9faW5pdCBfX2NtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbmlkKHBoeXNfYWRkcl90ICpiYXNlcCxcXG4tLVxcbm1tL2NtYS5jLTQ1OS1cXG5tbS9jbWEuYzo0NjA6XFx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19OVU1BKSlcXG5tbS9jbWEuYy00NjEtXFx0XFx0bmlkID0gTlVNQV9OT19OT0RFO1xcbi0tXFxubW0vY29tcGFjdGlvbi5jPTMwMDU9c3RhdGljIGludCBzeXNjdGxfY29tcGFjdGlvbl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXFxuLS1cXG5tbS9jb21wYWN0aW9uLmMtMzAyMi1cXG5tbS9jb21wYWN0aW9uLmM6MzAyMzojaWYgZGVmaW5lZChDT05GSUdfU1lTRlMpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX05VTUEpXFxubW0vY29tcGFjdGlvbi5jLTMwMjQtc3RhdGljIHNzaXplX3QgY29tcGFjdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuLS1cXG5tbS9jb21wYWN0aW9uLmM9MzA0Nj12b2lkIGNvbXBhY3Rpb25fdW5yZWdpc3Rlcl9ub2RlKHN0cnVjdCBub2RlICpub2RlKVxcbi0tXFxubW0vY29tcGFjdGlvbi5jLTMwNDktfVxcbm1tL2NvbXBhY3Rpb24uYzozMDUwOiNlbmRpZiAvKiBDT05GSUdfU1lTRlMgXFx1MDAyNlxcdTAwMjYgQ09ORklHX05VTUEgKi9cXG5tbS9jb21wYWN0aW9uLmMtMzA1MS1cXG4tLVxcbm1tL2RhbW9uL2NvcmUuYz0yODkzPXN0YXRpYyBpbmxpbmUgdTY0IGRhbW9zX2dldF9zb21lX21lbV9wc2lfdG90YWwodm9pZClcXG4tLVxcbm1tL2RhbW9uL2NvcmUuYy0yODk5LVxcbm1tL2RhbW9uL2NvcmUuYzoyOTAwOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2RhbW9uL2NvcmUuYy0yOTAxLXN0YXRpYyBib29sIGludmFsaWRfbWVtX25vZGUoaW50IG5pZClcXG4tLVxcbm1tL2RhbW9uL2NvcmUuYz0zMDgxPXN0YXRpYyB1bnNpZ25lZCBsb25nIGRhbW9zX2dldF9ub2RlX2VsaWdpYmxlX21lbV9icChzdHJ1Y3QgZGFtb25fY3R4ICpjLFxcbi0tXFxubW0vZGFtb24vY29yZS5jLTMwODYtI2VuZGlmIC8qIENPTkZJR19EQU1PTl9QQUREUiAqL1xcbm1tL2RhbW9uL2NvcmUuYzozMDg3OiNlbHNlIC8qIENPTkZJR19OVU1BICovXFxubW0vZGFtb24vY29yZS5jLTMwODgtc3RhdGljIF9fa2VybmVsX3Vsb25nX3QgZGFtb3NfZ2V0X25vZGVfbWVtX2JwKFxcbi0tXFxubW0vZGFtb24vY29yZS5jPTMxMDA9c3RhdGljIHVuc2lnbmVkIGxvbmcgZGFtb3NfZ2V0X25vZGVfZWxpZ2libGVfbWVtX2JwKHN0cnVjdCBkYW1vbl9jdHggKmMsXFxuLS1cXG5tbS9kYW1vbi9jb3JlLmMtMzEwNC19XFxubW0vZGFtb24vY29yZS5jOjMxMDU6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxubW0vZGFtb24vY29yZS5jLTMxMDYtXFxuLS1cXG5tbS9kZWJ1Zy5jPTE3MT12b2lkIGR1bXBfbW0oY29uc3Qgc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuLS1cXG5tbS9kZWJ1Zy5jLTE5MS0jZW5kaWZcXG5tbS9kZWJ1Zy5jOjE5MjojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vZGVidWcuYy0xOTMtXFx0XFx0XFxcIm51bWFfbmV4dF9zY2FuICVsdSBudW1hX3NjYW5fb2Zmc2V0ICVsdSBudW1hX3NjYW5fc2VxICVkXFxcXG5cXFwiXFxuLS1cXG5tbS9kZWJ1Zy5jLTIyMC0jZW5kaWZcXG5tbS9kZWJ1Zy5jOjIyMTojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vZGVidWcuYy0yMjItXFx0XFx0bW0tXFx1MDAzZW51bWFfbmV4dF9zY2FuLCBtbS1cXHUwMDNlbnVtYV9zY2FuX29mZnNldCwgbW0tXFx1MDAzZW51bWFfc2Nhbl9zZXEsXFxuLS1cXG5tbS9maWxlbWFwLmM9OTk2PUVYUE9SVF9TWU1CT0xfR1BMKGZpbGVtYXBfYWRkX2ZvbGlvKTtcXG5tbS9maWxlbWFwLmMtOTk3LVxcbm1tL2ZpbGVtYXAuYzo5OTg6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vZmlsZW1hcC5jLTk5OS1zdHJ1Y3QgZm9saW8gKmZpbGVtYXBfYWxsb2NfZm9saW9fbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxcbi0tXFxubW0vaHVnZXRsYi5jPTIyMzg9c3RhdGljIG5vZGVtYXNrX3QgKnBvbGljeV9tYmluZF9ub2RlbWFzayhnZnBfdCBnZnApXFxubW0vaHVnZXRsYi5jLTIyMzkte1xcbm1tL2h1Z2V0bGIuYzoyMjQwOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGIuYy0yMjQxLVxcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7XFxuLS1cXG5tbS9odWdldGxiLmM9Mjk3Nz1zdHJ1Y3QgZm9saW8gKmFsbG9jX2h1Z2V0bGJfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdldGxiLmMtMzA1Mi1cXHRcXHQubmlkID0gbmlkLFxcbm1tL2h1Z2V0bGIuYzozMDUzOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGIuYy0zMDU0LVxcdFxcdC5tb2RlID0gbXBvbCA/IG1wb2wtXFx1MDAzZW1vZGUgOiBNUE9MX0RFRkFVTFQsXFxuLS1cXG5tbS9odWdldGxiX2NtYS5jPTI2PXN0YXRpYyB1bnNpZ25lZCBpbnQgaHVnZXRsYl9jbWFfcGVyY2VudF9pbl9ub2RlW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTtcXG5tbS9odWdldGxiX2NtYS5jLTI3LVxcbm1tL2h1Z2V0bGJfY21hLmM6Mjg6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaHVnZXRsYl9jbWEuYy0yOS1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IG1lbWJsb2NrX25vZGVfbWVtb3J5X3NpemUoaW50IG5pZClcXG4tLVxcbm1tL2h1Z2V0bGJfc3lzY3RsLmM9NTM9c3RhdGljIGludCBodWdldGxiX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXFxuLS1cXG5tbS9odWdldGxiX3N5c2N0bC5jLTYwLVxcbm1tL2h1Z2V0bGJfc3lzY3RsLmM6NjE6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaHVnZXRsYl9zeXNjdGwuYy02Mi1zdGF0aWMgaW50IGh1Z2V0bGJfbWVtcG9saWN5X3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXFxuLS1cXG5tbS9odWdldGxiX3N5c2N0bC5jLTY3LX1cXG5tbS9odWdldGxiX3N5c2N0bC5jOjY4OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xcbm1tL2h1Z2V0bGJfc3lzY3RsLmMtNjktXFxuLS1cXG5tbS9odWdldGxiX3N5c2N0bC5jPTk5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIGh1Z2V0bGJfdGFibGVbXSA9IHtcXG4tLVxcbm1tL2h1Z2V0bGJfc3lzY3RsLmMtMTA2LVxcdH0sXFxubW0vaHVnZXRsYl9zeXNjdGwuYzoxMDc6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaHVnZXRsYl9zeXNjdGwuYy0xMDgtXFx0e1xcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jPTg2PUhTVEFURV9BVFRSKG5yX2h1Z2VwYWdlcyk7XFxubW0vaHVnZXRsYl9zeXNmcy5jLTg3LVxcbm1tL2h1Z2V0bGJfc3lzZnMuYzo4ODojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9odWdldGxiX3N5c2ZzLmMtODktXFxuLS1cXG5tbS9odWdldGxiX3N5c2ZzLmM9MjgwPXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpoc3RhdGVfYXR0cnNbXSA9IHtcXG4tLVxcbm1tL2h1Z2V0bGJfc3lzZnMuYy0yODUtXFx0XFx1MDAyNnN1cnBsdXNfaHVnZXBhZ2VzX2F0dHIuYXR0cixcXG5tbS9odWdldGxiX3N5c2ZzLmM6Mjg2OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGJfc3lzZnMuYy0yODctXFx0XFx1MDAyNm5yX2h1Z2VwYWdlc19tZW1wb2xpY3lfYXR0ci5hdHRyLFxcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jPTMwNj1zdGF0aWMgaW50IGh1Z2V0bGJfc3lzZnNfYWRkX2hzdGF0ZShzdHJ1Y3QgaHN0YXRlICpoLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LFxcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jLTMzOC1cXG5tbS9odWdldGxiX3N5c2ZzLmM6MzM5OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGJfc3lzZnMuYy0zNDAtc3RhdGljIGJvb2wgaHVnZXRsYl9zeXNmc19pbml0aWFsaXplZCBfX3JvX2FmdGVyX2luaXQ7XFxuLS1cXG5tbS9odWdldGxiX3N5c2ZzLmM9NDYxPXN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX3JlZ2lzdGVyX2FsbF9ub2Rlcyh2b2lkKVxcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jLTQ2Ny19XFxubW0vaHVnZXRsYl9zeXNmcy5jOjQ2ODojZWxzZVxcdC8qICFDT05GSUdfTlVNQSAqL1xcbm1tL2h1Z2V0bGJfc3lzZnMuYy00NjktXFxuLS1cXG5tbS9odWdldGxiX3N5c2ZzLmM9NDgyPXZvaWQgX19pbml0IGh1Z2V0bGJfc3lzZnNfaW5pdCh2b2lkKVxcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jLTQ5Ny1cXG5tbS9odWdldGxiX3N5c2ZzLmM6NDk4OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGJfc3lzZnMuYy00OTktXFx0aHVnZXRsYl9zeXNmc19pbml0aWFsaXplZCA9IHRydWU7XFxuLS1cXG5tbS9pbnRlcm5hbC5oPTc2PXVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9pbnRlcm5hbC5oLTgxLVxcbm1tL2ludGVybmFsLmg6ODI6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaW50ZXJuYWwuaC04My1leHRlcm4gaW50IHN5c2N0bF9taW5fdW5tYXBwZWRfcmF0aW87XFxuLS1cXG5tbS9pbnRlcm5hbC5oPTExMjg9c3RhdGljIGlubGluZSB2b2lkIG1sb2NrX2RyYWluX3JlbW90ZShpbnQgY3B1KSB7IH1cXG4tLVxcbm1tL2ludGVybmFsLmgtMTEzMC1cXG5tbS9pbnRlcm5hbC5oOjExMzE6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaW50ZXJuYWwuaC0xMTMyLWV4dGVybiBpbnQgbm9kZV9yZWNsYWltX21vZGU7XFxuLS1cXG5tbS9pbnRlcm5hbC5oPTEyMzk9c3RhdGljIGlubGluZSBib29sIHZtYV9pc19zaW5nbGVfdGhyZWFkZWRfcHJpdmF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG4tLVxcbm1tL2ludGVybmFsLmgtMTI0Ni1cXG5tbS9pbnRlcm5hbC5oOjEyNDc6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xcbm1tL2ludGVybmFsLmgtMTI0OC1ib29sIGZvbGlvX2Nhbl9tYXBfcHJvdF9udW1hKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTEwMjc9c3RhdGljIGlubGluZSBnZnBfdCBhbGxvY19odWdlcGFnZV9raHVnZXBhZ2VkX2dmcG1hc2sodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDMxLVxcbm1tL2todWdlcGFnZWQuYzoxMDMyOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2todWdlcGFnZWQuYy0xMDMzLXN0YXRpYyBpbnQgY29sbGFwc2VfZmluZF90YXJnZXRfbm9kZShzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuLS1cXG5tbS9rc20uYy01MC1cXG5tbS9rc20uYzo1MTojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9rc20uYy01Mi0jZGVmaW5lIE5VTUEoeClcXHRcXHQoeClcXG4tLVxcbm1tL2tzbS5jPTE1OT1zdHJ1Y3Qga3NtX3N0YWJsZV9ub2RlIHtcXG4tLVxcbm1tL2tzbS5jLTE4MS1cXHRpbnQgcm1hcF9obGlzdF9sZW47XFxubW0va3NtLmM6MTgyOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2tzbS5jLTE4My1cXHRpbnQgbmlkO1xcbi0tXFxubW0va3NtLmM9MjAyPXN0cnVjdCBrc21fcm1hcF9pdGVtIHtcXG4tLVxcbm1tL2tzbS5jLTIwNS1cXHRcXHRzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hO1xcdC8qIGZvciByZXZlcnNlIG1hcHBpbmcsIHdoZW4gc3RhYmxlICovXFxubW0va3NtLmM6MjA2OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2tzbS5jLTIwNy1cXHRcXHRpbnQgbmlkO1xcdFxcdC8qIHdoZW4gbm9kZSBvZiB1bnN0YWJsZSB0cmVlICovXFxuLS1cXG5tbS9rc20uYz00Njk9c3RhdGljIHZvaWQgYWR2aXNvcl9zdG9wX3NjYW4odm9pZClcXG4tLVxcbm1tL2tzbS5jLTQ3NC1cXG5tbS9rc20uYzo0NzU6I2lmZGVmIENPTkZJR19OVU1BXFxubW0va3NtLmMtNDc2LS8qIFplcm9lZCB3aGVuIG1lcmdpbmcgYWNyb3NzIG5vZGVzIGlzIG5vdCBhbGxvd2VkICovXFxuLS1cXG5tbS9rc20uYz04NTc9c3RhdGljIHN0cnVjdCBrc21fc3RhYmxlX25vZGUgKmFsbG9jX3N0YWJsZV9ub2RlX2NoYWluKHN0cnVjdCBrc21fc3RhYmxlX25vZGUgKmR1cCxcXG4tLVxcbm1tL2tzbS5jLTg2NS1cXHRcXHRjaGFpbi1cXHUwMDNlcm1hcF9obGlzdF9sZW4gPSBTVEFCTEVfTk9ERV9DSEFJTjtcXG5tbS9rc20uYzo4NjY6I2lmIGRlZmluZWQgKENPTkZJR19ERUJVR19WTSkgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfTlVNQSlcXG5tbS9rc20uYy04NjctXFx0XFx0Y2hhaW4tXFx1MDAzZW5pZCA9IE5VTUFfTk9fTk9ERTsgLyogZGVidWcgKi9cXG4tLVxcbm1tL2tzbS5jPTM1OTU9S1NNX0FUVFIocnVuKTtcXG5tbS9rc20uYy0zNTk2LVxcbm1tL2tzbS5jOjM1OTc6I2lmZGVmIENPTkZJR19OVU1BXFxubW0va3NtLmMtMzU5OC1zdGF0aWMgc3NpemVfdCBtZXJnZV9hY3Jvc3Nfbm9kZXNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaixcXG4tLVxcbm1tL2tzbS5jPTM5ODE9c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmtzbV9hdHRyc1tdID0ge1xcbi0tXFxubW0va3NtLmMtMzk5Mi1cXHRcXHUwMDI2ZnVsbF9zY2Fuc19hdHRyLmF0dHIsXFxubW0va3NtLmM6Mzk5MzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9rc20uYy0zOTk0LVxcdFxcdTAwMjZtZXJnZV9hY3Jvc3Nfbm9kZXNfYXR0ci5hdHRyLFxcbi0tXFxubW0vbWVtYmxvY2suYy0xMDUtXFxubW0vbWVtYmxvY2suYzoxMDY6I2lmbmRlZiBDT05GSUdfTlVNQVxcbm1tL21lbWJsb2NrLmMtMTA3LXN0cnVjdCBwZ2xpc3RfZGF0YSBfX3JlZmRhdGEgY29udGlnX3BhZ2VfZGF0YTtcXG4tLVxcbm1tL21lbWJsb2NrLmM9NjEwPXN0YXRpYyBpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FkZF9yYW5nZShzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSxcXG4tLVxcbm1tL21lbWJsb2NrLmMtNjY2LVxcdFxcdGlmIChyYmFzZSBcXHUwMDNlIGJhc2UpIHtcXG5tbS9tZW1ibG9jay5jOjY2NzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tZW1ibG9jay5jLTY2OC1cXHRcXHRcXHRXQVJOX09OKG5pZCAhPSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSk7XFxuLS1cXG5tbS9tZW1ibG9jay5jPTE0ODk9aW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19zZXRfbm9kZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplLFxcbi0tXFxubW0vbWVtYmxvY2suYy0xNDkxLXtcXG5tbS9tZW1ibG9jay5jOjE0OTI6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbWVtYmxvY2suYy0xNDkzLVxcdGludCBzdGFydF9yZ24sIGVuZF9yZ247XFxuLS1cXG5tbS9tZW1ibG9jay5jPTIxOTI9c3RhdGljIHZvaWQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2R1bXAoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUpXFxuLS1cXG5tbS9tZW1ibG9jay5jLTIyMDctXFx0XFx0ZmxhZ3MgPSByZ24tXFx1MDAzZWZsYWdzO1xcbm1tL21lbWJsb2NrLmM6MjIwODojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tZW1ibG9jay5jLTIyMDktXFx0XFx0aWYgKG51bWFfdmFsaWRfbm9kZShtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSkpXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTY5OT1zdGF0aWMgc3NpemVfdCBtZW1fY2dyb3VwX3Jlc2V0KHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqYnVmLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE3MzUtXFxubW0vbWVtY29udHJvbC12MS5jOjE3MzY6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbWVtY29udHJvbC12MS5jLTE3MzctXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTc4MD1zdGF0aWMgaW50IG1lbWNnX251bWFfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODIzLX1cXG5tbS9tZW1jb250cm9sLXYxLmM6MTgyNDojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG5tbS9tZW1jb250cm9sLXYxLmMtMTgyNS1cXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0yMDI4PXN0cnVjdCBjZnR5cGUgbWVtX2Nncm91cF9sZWdhY3lfZmlsZXNbXSA9IHtcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0yMDkzLVxcdH0sXFxubW0vbWVtY29udHJvbC12MS5jOjIwOTQ6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbWVtY29udHJvbC12MS5jLTIwOTUtXFx0e1xcbi0tXFxubW0vbWVtY29udHJvbC5jPTM3OD1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1lbWNnX25vZGVfc3RhdF9pdGVtc1tdID0ge1xcbi0tXFxubW0vbWVtY29udHJvbC5jLTQwOS0jZW5kaWZcXG5tbS9tZW1jb250cm9sLmM6NDEwOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tZW1jb250cm9sLmMtNDExLVxcdFBHUFJPTU9URV9TVUNDRVNTLFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTU5OD1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1lbWNnX3ZtX2V2ZW50X3N0YXRbXSA9IHtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy02MjUtI2VuZGlmXFxubW0vbWVtY29udHJvbC5jOjYyNjojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vbWVtY29udHJvbC5jLTYyNy1cXHROVU1BX1BBR0VfTUlHUkFURSxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0xNTkxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWVtb3J5X3N0YXQgbWVtb3J5X3N0YXRzW10gPSB7XFxuLS1cXG5tbS9tZW1jb250cm9sLmMtMTY1MC1cXHR7IFxcXCJwZ3JlZmlsbFxcXCIsXFx0XFx0XFx0UEdSRUZJTExcXHRcXHR9LFxcbm1tL21lbWNvbnRyb2wuYzoxNjUxOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tZW1jb250cm9sLmMtMTY1Mi1cXHR7IFxcXCJwZ3Byb21vdGVfc3VjY2Vzc1xcXCIsXFx0XFx0UEdQUk9NT1RFX1NVQ0NFU1NcXHR9LFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTE2NzM9c3RhdGljIGludCBtZW1jZ19wYWdlX3N0YXRlX291dHB1dF91bml0KGludCBpdGVtKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTE3MDItXFx0Y2FzZSBQR1JFRklMTDpcXG5tbS9tZW1jb250cm9sLmM6MTcwMzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vbWVtY29udHJvbC5jLTE3MDQtXFx0Y2FzZSBQR1BST01PVEVfU1VDQ0VTUzpcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz01MDMxPWludCBtZW1vcnlfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy01MDQ1LVxcbm1tL21lbWNvbnRyb2wuYzo1MDQ2OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL21lbWNvbnRyb2wuYy01MDQ3LXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBscnV2ZWNfcGFnZV9zdGF0ZV9vdXRwdXQoc3RydWN0IGxydXZlYyAqbHJ1dmVjLFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTUxMjg9c3RhdGljIHN0cnVjdCBjZnR5cGUgbWVtb3J5X2ZpbGVzW10gPSB7XFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNTE4MS1cXHR9LFxcbm1tL21lbWNvbnRyb2wuYzo1MTgyOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL21lbWNvbnRyb2wuYy01MTgzLVxcdHtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTQ5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3RpZXJfc3Vic3lzID0ge1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNTMtXFxubW0vbWVtb3J5LXRpZXJzLmM6NTQ6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xcbm1tL21lbW9yeS10aWVycy5jLTU1LS8qKlxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9NjU9Ym9vbCBmb2xpb191c2VfYWNjZXNzX3RpbWUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTcxLVxcbm1tL21lbW9yeS10aWVycy5jOjcyOiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5tbS9tZW1vcnktdGllcnMuYy03My1zdGF0aWMgaW50IHRvcF90aWVyX2FkaXN0YW5jZTtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTEzMT1zdGF0aWMgc3RydWN0IGRlbW90aW9uX25vZGVzICpub2RlX2RlbW90aW9uIF9fcmVhZF9tb3N0bHk7XFxubW0vbWVtb3J5LXRpZXJzLmM6MTMyOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG5tbS9tZW1vcnktdGllcnMuYy0xMzMtXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz0yNjA9c3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqX19ub2RlX2dldF9tZW1vcnlfdGllcihpbnQgbm9kZSlcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTI3NS1cXG5tbS9tZW1vcnktdGllcnMuYzoyNzY6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTI3Ny1ib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSlcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTUyMT1zdGF0aWMgaW5saW5lIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZCkge31cXG5tbS9tZW1vcnktdGllcnMuYzo1MjI6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xcbm1tL21lbW9yeS10aWVycy5jLTUyMy1cXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTkwNj1zdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfdGllcl9pbml0KHZvaWQpXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy05MTMtXFxubW0vbWVtb3J5LXRpZXJzLmM6OTE0OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5tbS9tZW1vcnktdGllcnMuYy05MTUtXFx0bm9kZV9kZW1vdGlvbiA9IGt6YWxsb2Nfb2JqcyhzdHJ1Y3QgZGVtb3Rpb25fbm9kZXMsIG5yX25vZGVfaWRzKTtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTkzOT1ib29sIG51bWFfZGVtb3Rpb25fZW5hYmxlZCA9IGZhbHNlO1xcbm1tL21lbW9yeS10aWVycy5jLTk0MC1cXG5tbS9tZW1vcnktdGllcnMuYzo5NDE6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTk0Mi0jaWZkZWYgQ09ORklHX1NZU0ZTXFxuLS1cXG5tbS9tZW1vcnkuYz02MTE3PWludCBudW1hX21pZ3JhdGVfY2hlY2soc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2ZhdWx0ICp2bWYsXFxuLS1cXG5tbS9tZW1vcnkuYy02MTUyLVxcdGNvdW50X3ZtX251bWFfZXZlbnQoTlVNQV9ISU5UX0ZBVUxUUyk7XFxubW0vbWVtb3J5LmM6NjE1MzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vbWVtb3J5LmMtNjE1NC1cXHRjb3VudF9tZW1jZ19mb2xpb19ldmVudHMoZm9saW8sIE5VTUFfSElOVF9GQVVMVFMsIDEpO1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xODY9TU9EVUxFX1BBUk1fREVTQyhhdXRvX21vdmFibGVfcmF0aW8sXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5Mi0gKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE5MzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5NC1zdGF0aWMgYm9vbCBhdXRvX21vdmFibGVfbnVtYV9hd2FyZSBfX3JlYWRfbW9zdGx5ID0gdHJ1ZTtcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTk2PU1PRFVMRV9QQVJNX0RFU0MoYXV0b19tb3ZhYmxlX251bWFfYXdhcmUsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5OC1cXHRcXHRcXFwiXFxcXFxcXCJhdXRvLW1vdmFibGVcXFxcXFxcIiBvbmxpbmUgcG9saWN5LiBEZWZhdWx0OiB0cnVlXFxcIik7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxOTk6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMDAtXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTk2MD1zdGF0aWMgc3RydWN0IHpvbmUgKmF1dG9fbW92YWJsZV96b25lX2Zvcl9wZm4oaW50IG5pZCxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAwOS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEwMTA6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDExLVxcdGlmIChhdXRvX21vdmFibGVfbnVtYV9hd2FyZSBcXHUwMDI2XFx1MDAyNlxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDEzLVxcdFxcdGdvdG8ga2VybmVsX3pvbmU7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMDE0OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxNS1cXG4tLVxcbm1tL21lbXBvbGljeS5jPTc5Mz1zdGF0aWMgaW50IHF1ZXVlX2ZvbGlvc19odWdldGxiKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgaG1hc2ssXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy04NDItXFxubW0vbWVtcG9saWN5LmM6ODQzOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tZW1wb2xpY3kuYy04NDQtLyoqXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz05MTI9dW5zaWduZWQgbG9uZyBjaGFuZ2VfcHJvdF9udW1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtOTI5LX1cXG5tbS9tZW1wb2xpY3kuYzo5MzA6I2VuZGlmIC8qIENPTkZJR19OVU1BX0JBTEFOQ0lORyAqL1xcbm1tL21lbXBvbGljeS5jLTkzMS1cXG4tLVxcbm1tL21lbXBvbGljeS5jPTEyMDc9c3RhdGljIGxvbmcgZG9fZ2V0X21lbXBvbGljeShpbnQgKnBvbGljeSwgbm9kZW1hc2tfdCAqbm1hc2ssXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMzA3LVxcbm1tL21lbXBvbGljeS5jOjEzMDg6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbXBvbGljeS5jLTEzMDktc3RhdGljIGJvb2wgbWlncmF0ZV9mb2xpb19hZGQoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqZm9saW9saXN0LFxcbi0tXFxubW0vbWVtcG9saWN5LmM9MzM3NT1FWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5LCBcXFwia3ZtXFxcIik7XFxubW0vbWVtcG9saWN5LmMtMzM3Ni1cXG5tbS9tZW1wb2xpY3kuYzozMzc3OiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tZW1wb2xpY3kuYy0zMzc4LXN0YXRpYyBpbnQgX19pbml0ZGF0YSBudW1hYmFsYW5jaW5nX292ZXJyaWRlO1xcbi0tXFxubW0vbWVtcG9saWN5LmM9MzM4MD1zdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfbnVtYWJhbGFuY2luZ19lbmFibGUodm9pZClcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMzODMtXFxubW0vbWVtcG9saWN5LmM6MzM4NDpcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQV9CQUxBTkNJTkdfREVGQVVMVF9FTkFCTEVEKSlcXG5tbS9tZW1wb2xpY3kuYy0zMzg1LVxcdFxcdG51bWFiYWxhbmNpbmdfZGVmYXVsdCA9IHRydWU7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0zNDE5PXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgY2hlY2tfbnVtYWJhbGFuY2luZ19lbmFibGUodm9pZClcXG4tLVxcbm1tL21lbXBvbGljeS5jLTM0MjEtfVxcbm1tL21lbXBvbGljeS5jOjM0MjI6I2VuZGlmIC8qIENPTkZJR19OVU1BX0JBTEFOQ0lORyAqL1xcbm1tL21lbXBvbGljeS5jLTM0MjMtXFxuLS1cXG5tbS9taWdyYXRlLmM9MjE5Nz1zdHJ1Y3QgZm9saW8gKmFsbG9jX21pZ3JhdGlvbl90YXJnZXQoc3RydWN0IGZvbGlvICpzcmMsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSlcXG4tLVxcbm1tL21pZ3JhdGUuYy0yMjM1LVxcbm1tL21pZ3JhdGUuYzoyMjM2OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5tbS9taWdyYXRlLmMtMjIzNy1zdGF0aWMgaW50IHN0b3JlX3N0YXR1cyhpbnQgX191c2VyICpzdGF0dXMsIGludCBzdGFydCwgaW50IHZhbHVlLCBpbnQgbnIpXFxuLS1cXG5tbS9taWdyYXRlLmM9MjYzMz1TWVNDQUxMX0RFRklORTYobW92ZV9wYWdlcywgcGlkX3QsIHBpZCwgdW5zaWduZWQgbG9uZywgbnJfcGFnZXMsXFxuLS1cXG5tbS9taWdyYXRlLmMtMjYzOS19XFxubW0vbWlncmF0ZS5jOjI2NDA6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xcbm1tL21pZ3JhdGUuYy0yNjQxLVxcbm1tL21pZ3JhdGUuYzoyNjQyOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9taWdyYXRlLmMtMjY0My0vKlxcbi0tXFxubW0vbWlncmF0ZS5jPTI3NTU9aW50IG1pZ3JhdGVfbWlzcGxhY2VkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBub2RlKVxcbi0tXFxubW0vbWlncmF0ZS5jLTI3ODEtfVxcbm1tL21pZ3JhdGUuYzoyNzgyOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi9cXG4tLVxcbm1tL21tX2luaXQuYy00NS1cXG5tbS9tbV9pbml0LmM6NDY6I2lmbmRlZiBDT05GSUdfTlVNQVxcbm1tL21tX2luaXQuYy00Ny11bnNpZ25lZCBsb25nIG1heF9tYXBucjtcXG4tLVxcbm1tL21tX2luaXQuYz01OTY9dm9pZCBfX21lbWluaXQgX19pbml0X3NpbmdsZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHBmbixcXG4tLVxcbm1tL21tX2luaXQuYy02MTMtXFxubW0vbW1faW5pdC5jOjYxNDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tbV9pbml0LmMtNjE1LS8qXFxuLS1cXG5tbS9tbV9pbml0LmM9Njc4PXN0YXRpYyBpbmxpbmUgdm9pZCBmaXh1cF9oYXNoZGlzdCh2b2lkKSB7fVxcbm1tL21tX2luaXQuYzo2Nzk6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxubW0vbW1faW5pdC5jLTY4MC1cXG4tLVxcbm1tL21tem9uZS5jPTQ2PXN0YXRpYyBpbmxpbmUgaW50IHpyZWZfaW5fbm9kZW1hc2soc3RydWN0IHpvbmVyZWYgKnpyZWYsXFxuLS1cXG5tbS9tbXpvbmUuYy00OC17XFxubW0vbW16b25lLmM6NDk6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbW16b25lLmMtNTAtXFx0cmV0dXJuIG5vZGVfaXNzZXQoem9uZWxpc3Rfbm9kZV9pZHgoenJlZiksICpub2Rlcyk7XFxuLS1cXG5tbS9tbXpvbmUuYy01Mi1cXHRyZXR1cm4gMTtcXG5tbS9tbXpvbmUuYzo1MzojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG5tbS9tbXpvbmUuYy01NC19XFxuLS1cXG5tbS9tbXpvbmUuYz03Nj12b2lkIGxydXZlY19pbml0KHN0cnVjdCBscnV2ZWMgKmxydXZlYylcXG4tLVxcbm1tL21tem9uZS5jLTk3LVxcbm1tL21tem9uZS5jOjk4OiNpZiBkZWZpbmVkKENPTkZJR19OVU1BX0JBTEFOQ0lORykgXFx1MDAyNlxcdTAwMjYgIWRlZmluZWQoTEFTVF9DUFVQSURfTk9UX0lOX1BBR0VfRkxBR1MpXFxubW0vbW16b25lLmMtOTktaW50IGZvbGlvX3hjaGdfbGFzdF9jcHVwaWQoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IGNwdXBpZClcXG4tLVxcbm1tL21wcm90ZWN0LmM9Njg2PWxvbmcgY2hhbmdlX3Byb3RlY3Rpb24oc3RydWN0IG1tdV9nYXRoZXIgKnRsYixcXG4tLVxcbm1tL21wcm90ZWN0LmMtNzAzLVxcbm1tL21wcm90ZWN0LmM6NzA0OiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tcHJvdGVjdC5jLTcwNS1cXHQvKlxcbi0tXFxubW0vbnVtYV9tZW1ibGtzLmM9NTA2PWludCBfX2luaXQgbnVtYV9maWxsX21lbWJsa3ModTY0IHN0YXJ0LCB1NjQgZW5kKVxcbi0tXFxubW0vbnVtYV9tZW1ibGtzLmMtNTU1LVxcbm1tL251bWFfbWVtYmxrcy5jOjU1NjojaWZkZWYgQ09ORklHX05VTUFfS0VFUF9NRU1JTkZPXFxubW0vbnVtYV9tZW1ibGtzLmMtNTU3LXN0YXRpYyBpbnQgbWVtaW5mb190b19uaWQoc3RydWN0IG51bWFfbWVtaW5mbyAqbWksIHU2NCBzdGFydClcXG4tLVxcbm1tL251bWFfbWVtYmxrcy5jPTU5MT1FWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7XFxubW0vbnVtYV9tZW1ibGtzLmMtNTkyLVxcbm1tL251bWFfbWVtYmxrcy5jOjU5MzojZW5kaWYgLyogQ09ORklHX05VTUFfS0VFUF9NRU1JTkZPICovXFxuLS1cXG5tbS9vb21fa2lsbC5jPTcyPXN0YXRpYyBpbmxpbmUgYm9vbCBpc19tZW1jZ19vb20oc3RydWN0IG9vbV9jb250cm9sICpvYylcXG4tLVxcbm1tL29vbV9raWxsLmMtNzYtXFxubW0vb29tX2tpbGwuYzo3NzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9vb21fa2lsbC5jLTc4LS8qKlxcbi0tXFxubW0vb29tX2tpbGwuYz0xMjI9c3RhdGljIGJvb2wgb29tX2NwdXNldF9lbGlnaWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IG9vbV9jb250cm9sICpvYylcXG4tLVxcbm1tL29vbV9raWxsLmMtMTI1LX1cXG5tbS9vb21fa2lsbC5jOjEyNjojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG5tbS9vb21fa2lsbC5jLTEyNy1cXG4tLVxcbm1tL29vbV9raWxsLmM9MjQ5PXN0YXRpYyBlbnVtIG9vbV9jb25zdHJhaW50IGNvbnN0cmFpbmVkX2FsbG9jKHN0cnVjdCBvb21fY29udHJvbCAqb2MpXFxuLS1cXG5tbS9vb21fa2lsbC5jLTI2NC1cXG5tbS9vb21fa2lsbC5jOjI2NTpcXHRpZiAoIUlTX0VOQUJMRUQoQ09ORklHX05VTUEpKVxcbm1tL29vbV9raWxsLmMtMjY2LVxcdFxcdHJldHVybiBDT05TVFJBSU5UX05PTkU7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTY3PUVYUE9SVF9QRVJfQ1BVX1NZTUJPTChudW1hX25vZGUpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTE2OS1cXG5tbS9wYWdlX2FsbG9jLmM6MTcwOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL3BhZ2VfYWxsb2MuYy0xNzEtREVGSU5FX1NUQVRJQ19LRVlfVFJVRSh2bV9udW1hX3N0YXRfa2V5KTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0xOTU9bm9kZW1hc2tfdCBub2RlX3N0YXRlc1tOUl9OT0RFX1NUQVRFU10gX19yZWFkX21vc3RseSA9IHtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xOTctXFx0W05fT05MSU5FXSA9IHsgeyBbMF0gPSAxVUwgfSB9LFxcbm1tL3BhZ2VfYWxsb2MuYzoxOTg6I2lmbmRlZiBDT05GSUdfTlVNQVxcbm1tL3BhZ2VfYWxsb2MuYy0xOTktXFx0W05fTk9STUFMX01FTU9SWV0gPSB7IHsgWzBdID0gMVVMIH0gfSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0yNTU4PWJvb2wgZGVjYXlfcGNwX2hpZ2goc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3ApXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMjU5MC1cXG5tbS9wYWdlX2FsbG9jLmM6MjU5MTojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtMjU5Mi0vKlxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTMxNzk9c3RhdGljIGlubGluZSB2b2lkIHpvbmVfc3RhdGlzdGljcyhzdHJ1Y3Qgem9uZSAqcHJlZmVycmVkX3pvbmUsIHN0cnVjdCB6b25lICp6LFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTMxODEte1xcbm1tL3BhZ2VfYWxsb2MuYzozMTgyOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL3BhZ2VfYWxsb2MuYy0zMTgzLVxcdGVudW0gbnVtYV9zdGF0X2l0ZW0gbG9jYWxfc3RhdCA9IE5VTUFfTE9DQUw7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MzY2NT1zdGF0aWMgaW5saW5lIGJvb2wgem9uZV93YXRlcm1hcmtfZmFzdChzdHJ1Y3Qgem9uZSAqeiwgdW5zaWduZWQgaW50IG9yZGVyLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTM3MDktXFxubW0vcGFnZV9hbGxvYy5jOjM3MTA6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vcGFnZV9hbGxvYy5jLTM3MTEtaW50IF9fcmVhZF9tb3N0bHkgbm9kZV9yZWNsYWltX2Rpc3RhbmNlID0gUkVDTEFJTV9ESVNUQU5DRTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0zNzEzPXN0YXRpYyBib29sIHpvbmVfYWxsb3dzX3JlY2xhaW0oc3RydWN0IHpvbmUgKmxvY2FsX3pvbmUsIHN0cnVjdCB6b25lICp6b25lKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTM3MTctfVxcbm1tL3BhZ2VfYWxsb2MuYzozNzE4OiNlbHNlXFx0LyogQ09ORklHX05VTUEgKi9cXG5tbS9wYWdlX2FsbG9jLmMtMzcxOS1zdGF0aWMgYm9vbCB6b25lX2FsbG93c19yZWNsYWltKHN0cnVjdCB6b25lICpsb2NhbF96b25lLCBzdHJ1Y3Qgem9uZSAqem9uZSlcXG5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDc6NTMuNzU4ODI3NTM4WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI1MTMxNDQxODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6XG5cbioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBndXRzIG9mIGhvdyBLVk0gaGFuZGxlcyBndWVzdCBtZW1vcnksIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AuIEkgbmVlZCB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiBob3cgbWVtb3J5IGZpbGUgZGVzY3JpcHRvcnMgYXJlIGJlaW5nIG1hbmFnZWQsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBjcnVjaWFsIGZ1bmN0aW9ucyBga3ZtX2dtZW1fYmluZF9ub2RlYCBhbmQgYGt2bV9nbWVtX2NyZWF0ZWAuIFVuZGVyc3RhbmRpbmcgdGhlc2UgZnVuY3Rpb25zIGlzIGtleSB0byBzZWVpbmcgaG93IGd1ZXN0IG1lbW9yeSBpcyBhbGxvY2F0ZWQsIGJvdW5kIHRvIHBoeXNpY2FsIG1lbW9yeSwgYW5kIGdlbmVyYWxseSBpbnRlcmFjdGVkIHdpdGggd2l0aGluIHRoZSBLVk0gZnJhbWV3b3JrLiBJIG5lZWQgdG8gdHJhY2UgdGhlIGZsb3csIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IG51YW5jZXMgaW4gaG93IG1lbW9yeSByZWdpb25zIGFyZSBoYW5kbGVkIGFuZCBob3cgYG1lbWZkYHMgYXJlIGxldmVyYWdlZCBmb3IgZ3Vlc3QgbWVtb3J5LiBMZXQncyBzZWUgaG93IGVmZmljaWVudGx5IGFuZCBzZWN1cmVseSB0aGlzIGlzIGFsbCBpbXBsZW1lbnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE5MjYsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzo1Ni4yNzE5NzQzNzFaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDE1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDE1OlxcdFxcdC8qXFxuIDQxNjpcXHRcXHQgKiBSZXR1cm4gdGhlIG1lbW9yeSBwb2xpY3kgZm9yIHRoaXMgaW5kZXgsIG9yIE5VTEwgaWYgbm9uZSBpcyBzZXQuXFxuIDQxNzpcXHRcXHQgKlxcbiA0MTg6XFx0XFx0ICogUmV0dXJuaW5nIE5VTEwsIGUuZy4gaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0YXNrJ3MgbWVtb3J5IHBvbGljeSwgaXNcXG4gNDE5OlxcdFxcdCAqIGltcG9ydGFudCBmb3IgdGhlIC5nZXRfcG9saWN5IGtlcm5lbCBBQkk6IGl0IGluZGljYXRlcyB0aGF0IG5vXFxuIDQyMDpcXHRcXHQgKiBleHBsaWNpdCBwb2xpY3kgaGFzIGJlZW4gc2V0IHZpYSBtYmluZCgpIGZvciB0aGlzIG1lbW9yeS4gVGhlIGNhbGxlclxcbiA0MjE6XFx0XFx0ICogY2FuIHRoZW4gcmVwbGFjZSBOVUxMIHdpdGggdGhlIGRlZmF1bHQgbWVtb3J5IHBvbGljeSBpbnN0ZWFkIG9mIHRoZVxcbiA0MjI6XFx0XFx0ICogY3VycmVudCB0YXNrJ3MgbWVtb3J5IHBvbGljeS5cXG4gNDIzOlxcdFxcdCAqL1xcbiA0MjQ6XFx0XFx0cmV0dXJuIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoXFx1MDAyNkdNRU1fSShpbm9kZSktXFx1MDAzZXBvbGljeSwgcGdvZmYpO1xcbiA0MjU6XFx0fVxcbiA0MjY6XFx0XFxuIDQyNzpcXHRzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcXG4gNDI4OlxcdHtcXG4gNDI5OlxcdFxcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcXG4gNDMwOlxcdFxcdG5vZGVtYXNrX3Qgbm9kZXM7XFxuIDQzMTpcXHRcXHRpbnQgZXJyO1xcbiA0MzI6XFx0XFxuIDQzMzpcXHRcXHRpZiAoKHVuc2lnbmVkIGludClub2RlIFxcdTAwM2U9IE1BWF9OVU1OT0RFUylcXG4gNDM0OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA0MzU6XFx0XFxuIDQzNjpcXHRcXHRpbml0X25vZGVtYXNrX29mX25vZGUoXFx1MDAyNm5vZGVzLCBub2RlKTtcXG4gNDM3OlxcdFxcdHBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCBcXHUwMDI2bm9kZXMpO1xcbiA0Mzg6XFx0XFx0aWYgKElTX0VSUihwb2wpKVxcbiA0Mzk6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcXG4gNDQwOlxcdFxcbiA0NDE6XFx0XFx0ZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShcXHUwMDI2R01FTV9JKGlub2RlKS1cXHUwMDNlcG9saWN5LCAwLFxcbiA0NDI6XFx0XFx0XFx0XFx0XFx0XFx0ICBNQVhfTEZTX0ZJTEVTSVpFIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsIHBvbCk7XFxuIDQ0MzpcXHRcXHRtcG9sX3B1dChwb2wpO1xcbiA0NDQ6XFx0XFx0cmV0dXJuIGVycjtcXG4gNDQ1OlxcdH1cXG4gNDQ2OlxcdCNlbHNlXFxuIDQ0NzpcXHRzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcXG4gNDQ4OlxcdHtcXG4gNDQ5OlxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA0NTA6XFx0fVxcbiA0NTE6XFx0I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxuIDQ1MjpcXHRcXG4gNDUzOlxcdHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0ge1xcbiA0NTQ6XFx0XFx0LmZhdWx0XFx0XFx0PSBrdm1fZ21lbV9mYXVsdF91c2VyX21hcHBpbmcsXFxuIDQ1NTpcXHQjaWZkZWYgQ09ORklHX05VTUFcXG4gNDU2OlxcdFxcdC5nZXRfcG9saWN5XFx0PSBrdm1fZ21lbV9nZXRfcG9saWN5LFxcbiA0NTc6XFx0XFx0LnNldF9wb2xpY3lcXHQ9IGt2bV9nbWVtX3NldF9wb2xpY3ksXFxuIDQ1ODpcXHQjZW5kaWZcXG4gNDU5OlxcdH07XFxuIDQ2MDpcXHRcXG4gNDYxOlxcdHN0YXRpYyBpbnQga3ZtX2dtZW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuIDQ2MjpcXHR7XFxuIDQ2MzpcXHRcXHRpZiAoIWt2bV9nbWVtX3N1cHBvcnRzX21tYXAoZmlsZV9pbm9kZShmaWxlKSkpXFxuIDQ2NDpcXHRcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDc6NTYuMjcyMDkwNzkxWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ3Mzc1MTY4NTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgdGV4dCwgcmVuZGVyZWQgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXNzdW1pbmcgSSdtIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6XG5cbioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBhYm91dCBndWVzdCBtZW1vcnkgbWFuYWdlbWVudCB3aXRoaW4gS1ZNLCBzcGVjaWZpY2FsbHkgdGhlIGBndWVzdF9tZW1mZC5jYCBmaWxlLiBNeSBhdHRlbnRpb24gaXMgZHJhd24gdG8gdGhlIHJlZ2lvbiBhcm91bmQgbGluZXMgNTQwIHRocm91Z2ggNjQ1LiBUaGF0IHN1Z2dlc3RzIHdlJ3JlIGxvb2tpbmcgYXQgYSBjcml0aWNhbCBzZWN0aW9uIOKAkyBtYXliZSBzb21lIGFsbG9jYXRpb24gb3IgZGVhbGxvY2F0aW9uIGxvZ2ljLCBwZXJoYXBzIHJlbGF0ZWQgdG8gbWVtb3J5IGZpbGUgZGVzY3JpcHRvcnMgZm9yIHRoZSBndWVzdC4gTXkgaW5pdGlhbCBoeXBvdGhlc2lzIGlzIHRoYXQgd2UncmUgbGlrZWx5IGRlYWxpbmcgd2l0aCBlaXRoZXI6IHRoZSBoYW5kbGluZyBvZiBzaGFyZWQgbWVtb3J5IHJlZ2lvbnMsIG9yIGd1ZXN0IG1lbW9yeSBtYXBwaW5nL3VubWFwcGluZywgb3IgcGVyaGFwcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZW1vcnktYmFja2VkIGZpbGUgZGVzY3JpcHRvciB3aXRoaW4gdGhlIGd1ZXN0IGNvbnRleHQuIFRoZSBzcGVjaWZpYyBsaW5lcyBzaG91bGQgcmV2ZWFsIHdoaWNoIG9uZS4gSSBhbnRpY2lwYXRlIHRoaXMgc2VjdGlvbiB3b3VsZCBpbnZvbHZlIGludGVyYWN0aW9uIHdpdGggdGhlIFZNTSwgcG9zc2libHkgYXJvdW5kIHBhZ2UgdGFibGVzLCBtZW1vcnkgcmVnaW9ucywgYW5kIGV2ZW50IGhhbmRsaW5nIHRoYXQgaXMgcmVsYXRlZCB0byB0aGF0LiBJJ2xsIG5lZWQgdG8gbG9vayB2ZXJ5IGNsb3NlbHkgYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBiZWluZyBtYW5pcHVsYXRlZCBhbmQgdGhlIGNvbnRyb2wgZmxvdyB0byBmdWxseSB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcuIEkgZXhwZWN0IHRvIGJlIHVzaW5nIG15IGtub3dsZWRnZSBvZiBLVk0gaW50ZXJuYWxzIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB0ZWNobmlxdWVzIHRvIGZ1bGx5IHVuZGVyc3RhbmQgd2hhdCdzIHRha2luZyBwbGFjZSBpbiB0aGVzZSBsaW5lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI5NzIsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjAxLjAwOTYxMDM3MVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzExNzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwidmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1NDAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTQwOlxcdFxcdC5zZXRhdHRyXFx0PSBrdm1fZ21lbV9zZXRhdHRyLFxcbiA1NDE6XFx0fTtcXG4gNTQyOlxcdFxcbiA1NDM6XFx0Ym9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pXFxuIDU0NDpcXHR7XFxuIDU0NTpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTQ2OlxcdH1cXG4gNTQ3OlxcdFxcbiA1NDg6XFx0c3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKVxcbiA1NDk6XFx0e1xcbiA1NTA6XFx0XFx0c3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSBcXFwiW2t2bS1nbWVtXVxcXCI7XFxuIDU1MTpcXHRcXHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xcbiA1NTI6XFx0XFx0c3RydWN0IGlub2RlICppbm9kZTtcXG4gNTUzOlxcdFxcdHN0cnVjdCBmaWxlICpmaWxlO1xcbiA1NTQ6XFx0XFx0aW50IGZkLCBlcnI7XFxuIDU1NTpcXHRcXG4gNTU2OlxcdFxcdGZkID0gZ2V0X3VudXNlZF9mZF9mbGFncygwKTtcXG4gNTU3OlxcdFxcdGlmIChmZCBcXHUwMDNjIDApXFxuIDU1ODpcXHRcXHRcXHRyZXR1cm4gZmQ7XFxuIDU1OTpcXHRcXG4gNTYwOlxcdFxcdGYgPSBremFsbG9jX29iaigqZik7XFxuIDU2MTpcXHRcXHRpZiAoIWYpIHtcXG4gNTYyOlxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuIDU2MzpcXHRcXHRcXHRnb3RvIGVycl9mZDtcXG4gNTY0OlxcdFxcdH1cXG4gNTY1OlxcdFxcbiA1NjY6XFx0XFx0LyogX19mcHV0KCkgd2lsbCB0YWtlIGNhcmUgb2YgZm9wc19wdXQoKS4gKi9cXG4gNTY3OlxcdFxcdGlmICghZm9wc19nZXQoXFx1MDAyNmt2bV9nbWVtX2ZvcHMpKSB7XFxuIDU2ODpcXHRcXHRcXHRlcnIgPSAtRU5PRU5UO1xcbiA1Njk6XFx0XFx0XFx0Z290byBlcnJfZ21lbTtcXG4gNTcwOlxcdFxcdH1cXG4gNTcxOlxcdFxcbiA1NzI6XFx0XFx0aW5vZGUgPSBhbm9uX2lub2RlX21ha2Vfc2VjdXJlX2lub2RlKGt2bV9nbWVtX21udC1cXHUwMDNlbW50X3NiLCBuYW1lLCBOVUxMKTtcXG4gNTczOlxcdFxcdGlmIChJU19FUlIoaW5vZGUpKSB7XFxuIDU3NDpcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKGlub2RlKTtcXG4gNTc1OlxcdFxcdFxcdGdvdG8gZXJyX2ZvcHM7XFxuIDU3NjpcXHRcXHR9XFxuIDU3NzpcXHRcXG4gNTc4OlxcdFxcdGlub2RlLVxcdTAwM2VpX29wID0gXFx1MDAyNmt2bV9nbWVtX2lvcHM7XFxuIDU3OTpcXHRcXHRpbm9kZS1cXHUwMDNlaV9tYXBwaW5nLVxcdTAwM2VhX29wcyA9IFxcdTAwMjZrdm1fZ21lbV9hb3BzO1xcbiA1ODA6XFx0XFx0aW5vZGUtXFx1MDAzZWlfbW9kZSB8PSBTX0lGUkVHO1xcbiA1ODE6XFx0XFx0aW5vZGUtXFx1MDAzZWlfc2l6ZSA9IHNpemU7XFxuIDU4MjpcXHRcXHRtYXBwaW5nX3NldF9nZnBfbWFzayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nLCBHRlBfSElHSFVTRVIpO1xcbiA1ODM6XFx0XFx0bWFwcGluZ19zZXRfaW5hY2Nlc3NpYmxlKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA1ODQ6XFx0XFx0LyogVW5tb3ZhYmxlIG1hcHBpbmdzIGFyZSBzdXBwb3NlZCB0byBiZSBtYXJrZWQgdW5ldmljdGFibGUgYXMgd2VsbC4gKi9cXG4gNTg1OlxcdFxcdFdBUk5fT05fT05DRSghbWFwcGluZ191bmV2aWN0YWJsZShpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKSk7XFxuIDU4NjpcXHRcXG4gNTg3OlxcdFxcdEdNRU1fSShpbm9kZSktXFx1MDAzZWZsYWdzID0gZmxhZ3M7XFxuIDU4ODpcXHRcXG4gNTg5OlxcdFxcdGlmIChmbGFncyBcXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XFxuIDU5MDpcXHRcXHRcXHRlcnIgPSBrdm1fZ21lbV9iaW5kX25vZGUoaW5vZGUsIG5vZGUpO1xcbiA1OTE6XFx0XFx0XFx0aWYgKGVycilcXG4gNTkyOlxcdFxcdFxcdFxcdGdvdG8gZXJyX2lub2RlO1xcbiA1OTM6XFx0XFx0fVxcbiA1OTQ6XFx0XFxuIDU5NTpcXHRcXHRmaWxlID0gYWxsb2NfZmlsZV9wc2V1ZG8oaW5vZGUsIGt2bV9nbWVtX21udCwgbmFtZSwgT19SRFdSLCBcXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XFxuIDU5NjpcXHRcXHRpZiAoSVNfRVJSKGZpbGUpKSB7XFxuIDU5NzpcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKGZpbGUpO1xcbiA1OTg6XFx0XFx0XFx0Z290byBlcnJfaW5vZGU7XFxuIDU5OTpcXHRcXHR9XFxuIDYwMDpcXHRcXG4gNjAxOlxcdFxcdGZpbGUtXFx1MDAzZWZfZmxhZ3MgfD0gT19MQVJHRUZJTEU7XFxuIDYwMjpcXHRcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBmO1xcbiA2MDM6XFx0XFxuIDYwNDpcXHRcXHRrdm1fZ2V0X2t2bShrdm0pO1xcbiA2MDU6XFx0XFx0Zi1cXHUwMDNla3ZtID0ga3ZtO1xcbiA2MDY6XFx0XFx0eGFfaW5pdChcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MpO1xcbiA2MDc6XFx0XFx0bGlzdF9hZGQoXFx1MDAyNmYtXFx1MDAzZWVudHJ5LCBcXHUwMDI2R01FTV9JKGlub2RlKS1cXHUwMDNlZ21lbV9maWxlX2xpc3QpO1xcbiA2MDg6XFx0XFxuIDYwOTpcXHRcXHRmZF9pbnN0YWxsKGZkLCBmaWxlKTtcXG4gNjEwOlxcdFxcdHJldHVybiBmZDtcXG4gNjExOlxcdFxcbiA2MTI6XFx0ZXJyX2lub2RlOlxcbiA2MTM6XFx0XFx0aXB1dChpbm9kZSk7XFxuIDYxNDpcXHRlcnJfZm9wczpcXG4gNjE1OlxcdFxcdGZvcHNfcHV0KFxcdTAwMjZrdm1fZ21lbV9mb3BzKTtcXG4gNjE2OlxcdGVycl9nbWVtOlxcbiA2MTc6XFx0XFx0a2ZyZWUoZik7XFxuIDYxODpcXHRlcnJfZmQ6XFxuIDYxOTpcXHRcXHRwdXRfdW51c2VkX2ZkKGZkKTtcXG4gNjIwOlxcdFxcdHJldHVybiBlcnI7XFxuIDYyMTpcXHR9XFxuIDYyMjpcXHRcXG4gNjIzOlxcdGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcXG4gNjI0OlxcdHtcXG4gNjI1OlxcdFxcdGxvZmZfdCBzaXplID0gYXJncy1cXHUwMDNlc2l6ZTtcXG4gNjI2OlxcdFxcdHU2NCBmbGFncyA9IGFyZ3MtXFx1MDAzZWZsYWdzO1xcbiA2Mjc6XFx0XFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XFxuIDYyODpcXHRcXG4gNjI5OlxcdFxcdGlmIChmbGFncyBcXHUwMDI2IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpXFxuIDYzMDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjMxOlxcdFxcbiA2MzI6XFx0XFx0aWYgKHNpemUgXFx1MDAzYz0gMCB8fCAhUEFHRV9BTElHTkVEKHNpemUpKVxcbiA2MzM6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYzNDpcXHRcXG4gNjM1OlxcdFxcdGlmIChmbGFncyBcXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XFxuIDYzNjpcXHRcXHRcXHRpZiAoYXJncy1cXHUwMDNlcGFkIHx8IGFyZ3MtXFx1MDAzZW5vZGUgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbiA2Mzc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYzODpcXHRcXHRcXHRub2RlID0gYXJncy1cXHUwMDNlbm9kZTtcXG4gNjM5OlxcdFxcdH0gZWxzZSBpZiAoYXJncy1cXHUwMDNlbm9kZSB8fCBhcmdzLVxcdTAwM2VwYWQpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MDEuMDA5NzgzOThaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ5NjQ4NDgxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIEkgZGVsdmUgaW50byB0aGUgY29kZTpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtcG9saWN5LmNgKipcblxuT2theSwgbGV0J3Mgem9vbSBpbiBvbiBgbW0vbWVtcG9saWN5LmNgLiBJIG5lZWQgdG8gcmV2aWV3IHRoaXMgc2VjdGlvbiBjYXJlZnVsbHkuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBmdW5jdGlvbnMgYG1lbXBvbGljeV9jcmVhdGVgLCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAsIGFuZCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeWAuIFRoZXNlIGFyZSBrZXkgd2hlbiB5b3UgYXJlIGxvb2tpbmcgYXQgaG93IG1lbW9yeSBwb2xpY2llcyBhcmUgaGFuZGxlZCBhbmQgc2hhcmVkIGFjcm9zcyB0aGUgc3lzdGVtLiBUbyBnZXQgdGhlIGRldGFpbHMsIEkgc2hvdWxkIHJlYWQgbGluZXMgMTA4MCB0aHJvdWdoIDExMzAsIGFuZCB0aGVuIEkgd2FudCB0byBqdW1wIGRvd24gdG8gbGluZXMgMzMwMCB0aHJvdWdoIDMzNzAuIFRoYXQgd2lsbCBnaXZlIG1lIGEgc29saWQgdmlldyBvZiB0aGUgcGVydGluZW50IGxvZ2ljLiBJJ20gZm9jdXNpbmcgb24gdGhlc2UgcmVnaW9ucyB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBjb3JlIGZ1bmN0aW9ucyBpbnRlcmFjdCB3aXRoaW4gdGhlIGxhcmdlciBtZW1vcnkgbWFuYWdlbWVudCBmcmFtZXdvcmsuIExldCdzIHNlZSB3aGF0IGludGVyZXN0aW5nIHRpZGJpdHMgYXJlIGhpZGRlbiBpbiB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQ3OTMsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjAzLjUwNjI3MTgxNVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzc0MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtcG9saWN5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTA4MCxcbiAgXCJMaW5lQ291bnRcIjogNTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTA4MDpcXHRcXHR2bWEgPSAgdm1hX21vZGlmeV9wb2xpY3kodm1pLCAqcHJldiwgdm1hLCB2bXN0YXJ0LCB2bWVuZCwgbmV3X3BvbCk7XFxuMTA4MTpcXHRcXHRpZiAoSVNfRVJSKHZtYSkpXFxuMTA4MjpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUih2bWEpO1xcbjEwODM6XFx0XFxuMTA4NDpcXHRcXHQqcHJldiA9IHZtYTtcXG4xMDg1OlxcdFxcdHJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTtcXG4xMDg2OlxcdH1cXG4xMDg3OlxcdFxcbjEwODg6XFx0LyoqXFxuMTA4OTpcXHQgKiBtZW1wb2xpY3lfY3JlYXRlIC0gYnVpbGQgYSB2YWxpZGF0ZWQsIGNwdXNldC1jb250ZXh0dWFsaXNlZCBtZW1wb2xpY3lcXG4xMDkwOlxcdCAqIEBtb2RlOiBNUE9MXyogbW9kZVxcbjEwOTE6XFx0ICogQGZsYWdzOiBNUE9MX0ZfKiBmbGFnc1xcbjEwOTI6XFx0ICogQG5vZGVzOiB0YXJnZXQgbm9kZW1hc2ssIG9yIE5VTEwgKGludGVycHJldGVkIHBlciBAbW9kZTsgc2VlIG1wb2xfbmV3KCkpXFxuMTA5MzpcXHQgKlxcbjEwOTQ6XFx0ICogQ3JlYXRlcyBhIG5ldyBwb2xpY3kgYW5kIGNvbnN0cmFpbnMgaXQgdG8gdGhlIHRhc2sncyBjcHVzZXQuXFxuMTA5NTpcXHQgKlxcbjEwOTY6XFx0ICogVGhlIGNhbGxlciBvd25zIHRoZSByZXR1cm5lZCByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cXG4xMDk3OlxcdCAqXFxuMTA5ODpcXHQgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXFxuMTA5OTpcXHQgKi9cXG4xMTAwOlxcdHN0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeV9jcmVhdGUodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxuMTEwMTpcXHRcXHRcXHRub2RlbWFza190ICpub2RlcylcXG4xMTAyOlxcdHtcXG4xMTAzOlxcdFxcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcXG4xMTA0OlxcdFxcdE5PREVNQVNLX1NDUkFUQ0goc2NyYXRjaCk7XFxuMTEwNTpcXHRcXHRpbnQgZXJyO1xcbjExMDY6XFx0XFxuMTEwNzpcXHRcXHRpZiAoIXNjcmF0Y2gpXFxuMTEwODpcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcXG4xMTA5OlxcdFxcbjExMTA6XFx0XFx0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcXG4xMTExOlxcdFxcdGlmIChJU19FUlIocG9sKSlcXG4xMTEyOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjExMTM6XFx0XFxuMTExNDpcXHRcXHR0YXNrX2xvY2soY3VycmVudCk7XFxuMTExNTpcXHRcXHRlcnIgPSBtcG9sX3NldF9ub2RlbWFzayhwb2wsIG5vZGVzLCBzY3JhdGNoKTtcXG4xMTE2OlxcdFxcdHRhc2tfdW5sb2NrKGN1cnJlbnQpO1xcbjExMTc6XFx0XFx0aWYgKGVycikge1xcbjExMTg6XFx0XFx0XFx0bXBvbF9wdXQocG9sKTtcXG4xMTE5OlxcdFxcdFxcdHBvbCA9IEVSUl9QVFIoZXJyKTtcXG4xMTIwOlxcdFxcdH1cXG4xMTIxOlxcdG91dDpcXG4xMTIyOlxcdFxcdE5PREVNQVNLX1NDUkFUQ0hfRlJFRShzY3JhdGNoKTtcXG4xMTIzOlxcdFxcdHJldHVybiBwb2w7XFxuMTEyNDpcXHR9XFxuMTEyNTpcXHRFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsIFxcXCJrdm1cXFwiKTtcXG4xMTI2OlxcdFxcbjExMjc6XFx0c3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcXG4xMTI4OlxcdFxcdFxcdFxcdCAgICAgbm9kZW1hc2tfdCAqbm9kZXMpXFxuMTEyOTpcXHR7XFxuMTEzMDpcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpuZXcsICpvbGQ7XFxuMTEzMTpcXHRcXHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xcbjExMzI6XFx0XFx0aW50IHJldDtcXG4xMTMzOlxcdFxcbjExMzQ6XFx0XFx0aWYgKCFzY3JhdGNoKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODowMy41MDY1MTM2ODVaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDk2MzcxMzM2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtcG9saWN5LmNgKipcblxuT2theSwgdGltZSB0byBkaWcgaW50byB0aGUgbWVtb3J5IHBvbGljeSBpbXBsZW1lbnRhdGlvbi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIHdpdGhpbiBsaW5lcyAzMzAwLTMzNzAgb2YgYG1tL21lbXBvbGljeS5jYC4gQmFzZWQgb24gY29udGV4dCwgSSdtIGV4cGVjdGluZyB0aGlzIHNlY3Rpb24gdG8gZGVhbCB3aXRoLi4uIHdlbGwsIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBuYW1lcyBJIGtub3csIG1heWJlIGl0J3MgcmVsYXRlZCB0byBOVU1BIGJhbGFuY2luZyBvciBzb21lIHNwZWNpZmljIG1lbW9yeSBhbGxvY2F0aW9uIHBvbGljeSBoYW5kbGluZy4gSeKAmWxsIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgZXhhY3QgZnVuY3Rpb24gb3IgZnVuY3Rpb25zIHdpdGhpbiB0aGF0IHJhbmdlLiBJdCBjb3VsZCBiZSBzb21lIGNvcmUgbG9naWMgaW4gYG1wb2xfeHh4YCBmYW1pbHkuIFxuXG5NeSBpbW1lZGlhdGUgZm9jdXMgd2lsbCBiZSB0byBkZXRlcm1pbmUgdGhlICp3aHkqIGFuZCAqaG93KiBvZiB0aGUgY29kZSBpbiB0aGF0IGJsb2NrLiBXaGF0IGlzIHRoZSBvYmplY3RpdmUgb2YgdGhpcyBjb2RlPyBXaGF0IHNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyBvciB2YXJpYWJsZXMgaXMgaXQgd29ya2luZyB3aXRoPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBsb29rIGZvciBpbW1lZGlhdGVseT8gSSdsbCBwcm9iYWJseSBzdGFydCBieSBncmVwcGluZyBmb3IgYW55IHJlbGF0ZWQgc3ltYm9scyBvciBjb21tZW50cyB0byB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIGJlZm9yZSBkaXZpbmcgaW50byBpbmRpdmlkdWFsIGxpbmVzLiBJJ20gaG9waW5nIHRoZXJlJ3MgYSBnb29kIGV4cGxhbmF0aW9uIG9yIHJlbGV2YW50IGNvbW1lbnRzLiBJdCBpcyBhIGxhcmdlIHJhbmdlLCBzbyBpdCBtdXN0IGJlIGEgc2lnbmlmaWNhbnQgc2VjdGlvbiBvZiBjb2RlLiBJJ20gZ29pbmcgdG8gc3RhcnQgcmVhZGluZyFcblxuXG4iLCJJbnB1dFRva2VucyI6MjU5MDksIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjA4LjQ3MDIyOTQxNVoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjk2ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtcG9saWN5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzMwMCxcbiAgXCJMaW5lQ291bnRcIjogNjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMzMwMDpcXHRcXG4zMzAxOlxcdFxcdFxcdC8qIGFsbG9jIG5vZGUgY292ZXJpbmcgZW50aXJlIGZpbGU7IGFkZHMgcmVmIHRvIGZpbGUncyBucG9sICovXFxuMzMwMjpcXHRcXHRcXHRzbiA9IHNwX2FsbG9jKDAsIE1BWF9MRlNfRklMRVNJWkUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCwgbnBvbCk7XFxuMzMwMzpcXHRcXHRcXHRpZiAoc24pXFxuMzMwNDpcXHRcXHRcXHRcXHRzcF9pbnNlcnQoc3AsIHNuKTtcXG4zMzA1OlxcdHB1dF9ucG9sOlxcbjMzMDY6XFx0XFx0XFx0bXBvbF9wdXQobnBvbCk7XFx0LyogZHJvcCBpbml0aWFsIHJlZiBvbiBmaWxlJ3MgbnBvbCAqL1xcbjMzMDc6XFx0ZnJlZV9zY3JhdGNoOlxcbjMzMDg6XFx0XFx0XFx0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xcbjMzMDk6XFx0cHV0X21wb2w6XFxuMzMxMDpcXHRcXHRcXHRtcG9sX3B1dChtcG9sKTtcXHQvKiBkcm9wIG91ciBpbmNvbWluZyByZWYgb24gc2IgbXBvbCAqL1xcbjMzMTE6XFx0XFx0fVxcbjMzMTI6XFx0fVxcbjMzMTM6XFx0RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCwgXFxcImt2bVxcXCIpO1xcbjMzMTQ6XFx0XFxuMzMxNTpcXHQvKipcXG4zMzE2OlxcdCAqIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgLSBpbnN0YWxsIEBwb2wgb3ZlciBbQHN0YXJ0LCBAZW5kKSBvZiBAc3BcXG4zMzE3OlxcdCAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZVxcbjMzMTg6XFx0ICogQHN0YXJ0OiBmaXJzdCBwYWdlIG9mZnNldCAoaW5jbHVzaXZlKVxcbjMzMTk6XFx0ICogQGVuZDogICBsYXN0IHBhZ2Ugb2Zmc2V0IChleGNsdXNpdmUpXFxuMzMyMDpcXHQgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlXFxuMzMyMTpcXHQgKlxcbjMzMjI6XFx0ICogSW5zdGFsbHMgQHBvbCBvdmVyIHRoZSBnaXZlbiByYW5nZSwgcmVwbGFjaW5nIGFueSBvdmVybGFwcGluZyBwb2xpY3kuXFxuMzMyMzpcXHQgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuXFxuMzMyNDpcXHQgKlxcbjMzMjU6XFx0ICogVGhlIHBvbGljeSBpcyBub3QgcmVjb25zdHJ1Y3RlZCwgc28gdGhlIHBvbGljeSBpcyBwcmVzZXJ2ZWQgZXhhY3RseS5cXG4zMzI2OlxcdCAqXFxuMzMyNzpcXHQgKiBVbmxpa2UgbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgpLCBubyBWTUEgaXMgcmVxdWlyZWQsIHNvIGEgcmFuZ2UgdGhhdFxcbjMzMjg6XFx0ICogaXMgbmV2ZXIgbWFwcGVkIGludG8gYSBWTUEgY2FuIGJlIGNvdmVyZWQsIGluY2x1ZGluZyB0aGUgd2hvbGUgZmlsZS5cXG4zMzI5OlxcdCAqXFxuMzMzMDpcXHQgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXFxuMzMzMTpcXHQgKi9cXG4zMzMyOlxcdGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcXG4zMzMzOlxcdFxcdFxcdFxcdFxcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxcbjMzMzQ6XFx0e1xcbjMzMzU6XFx0XFx0c3RydWN0IHNwX25vZGUgKm5ldyA9IE5VTEw7XFxuMzMzNjpcXHRcXHRpbnQgZXJyO1xcbjMzMzc6XFx0XFxuMzMzODpcXHRcXHRpZiAocG9sKSB7XFxuMzMzOTpcXHRcXHRcXHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xcbjMzNDA6XFx0XFx0XFx0aWYgKCFuZXcpXFxuMzM0MTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4zMzQyOlxcdFxcdH1cXG4zMzQzOlxcdFxcdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgc3RhcnQsIGVuZCwgbmV3KTtcXG4zMzQ0OlxcdFxcdGlmIChlcnIgXFx1MDAyNlxcdTAwMjYgbmV3KVxcbjMzNDU6XFx0XFx0XFx0c3BfZnJlZShuZXcpO1xcbjMzNDY6XFx0XFx0cmV0dXJuIGVycjtcXG4zMzQ3OlxcdH1cXG4zMzQ4OlxcdEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgXFxcImt2bVxcXCIpO1xcbjMzNDk6XFx0XFxuMzM1MDpcXHRpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuMzM1MTpcXHRcXHRcXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxcbjMzNTI6XFx0e1xcbjMzNTM6XFx0XFx0cmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS1cXHUwMDNldm1fcGdvZmYsXFxuMzM1NDpcXHRcXHRcXHRcXHRcXHRcXHQgICB2bWEtXFx1MDAzZXZtX3Bnb2ZmICsgdm1hX3BhZ2VzKHZtYSksIHBvbCk7XFxuMzM1NTpcXHR9XFxuMzM1NjpcXHRFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3ksIFxcXCJrdm1cXFwiKTtcXG4zMzU3OlxcdFxcbjMzNTg6XFx0LyogRnJlZSBhIGJhY2tpbmcgcG9saWN5IHN0b3JlIG9uIGlub2RlIGRlbGV0ZS4gKi9cXG4zMzU5OlxcdHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKVxcbjMzNjA6XFx0e1xcbjMzNjE6XFx0XFx0c3RydWN0IHNwX25vZGUgKm47XFxuMzM2MjpcXHRcXHRzdHJ1Y3QgcmJfbm9kZSAqbmV4dDtcXG4zMzYzOlxcdFxcbjMzNjQ6XFx0XFx0aWYgKCFzcC1cXHUwMDNlcm9vdC5yYl9ub2RlKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODowOC40NzA0NjA2MDRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjE2NzgyODE5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBLVk0gR3Vlc3QgTWVtb3J5IGFuZCBOVU1BIEludGVncmF0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGZvY3VzIGlzIG9uIHRoZSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNvZGUuIEl0IHNlZW1zIGxpa2UgdGhlIGNvcmUgY2hhbmdlcyByZXZvbHZlIGFyb3VuZCBLVk0ncyBgZ3Vlc3RfbWVtZmRgIGFuZCBOVU1BIG1lbW9yeSBtYW5hZ2VtZW50LlxuXG5JIHNlZSB0aGF0IGBFbmFibGVDb25maWdzYCBpbmNsdWRlIGBLVk1gICh3aXRoIGl0cyBkZXBlbmRlbmNpZXMpIGFuZCBgTlVNQWAuIFRoaXMgaW1tZWRpYXRlbHkgcG9pbnRzIHRvIHRoZSBhcmVhIG9mIGludGVyZXN0OiB0aGUgaW50ZXJwbGF5IG9mIEtWTSB2aXJ0dWFsaXphdGlvbiBhbmQgTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2Vzcy4gVGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QgcHJvdmlkZXMgc3BlY2lmaWMgZnVuY3Rpb24gbmFtZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb3IgaW50cm9kdWNlZDogYGt2bV9nbWVtX2NyZWF0ZWAsIGBrdm1fZ21lbV9iaW5kX25vZGVgLCBgbWVtcG9saWN5X2NyZWF0ZWAsIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCwgYW5kIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5YC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBzdHJvbmcgaW5kaWNhdG9ycyBvZiB0aGUga2V5IGNoYW5nZXMuXG5cbk5vdywgbGV0J3MgZHJpbGwgZG93biBmdXJ0aGVyLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBmbG93IGFuZCBkZXBlbmRlbmNpZXMuIEkgY2FuIHNlZSB0aGF0IGBrdm1fZ21lbV9jcmVhdGVgIGluIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBpcyB0aGUgZW50cnkgcG9pbnQsIGFuZCBpdCBjYWxscyBgX19rdm1fZ21lbV9jcmVhdGVgLCB3aGljaCB0aGVuIGNhbGxzIGBrdm1fZ21lbV9iaW5kX25vZGVgLiBUaGlzIHRlbGxzIG1lIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGlzIGtleSwgd2l0aCBhIGJpbmRpbmcgb3BlcmF0aW9uIGhhcHBlbmluZyBhcyBwYXJ0IG9mIGl0LiBUaGUgYG1lbXBvbGljeWAgZnVuY3Rpb25zIGFyZSBuZXcgb3IgbW9kaWZpZWQgaW4gYG1tL21lbXBvbGljeS5jYCwgc3VnZ2VzdGluZyBtZW1vcnkgcG9saWN5IGNvbnRyb2xzIGFyZSBiZWluZyBhZGRlZCBvciBhdWdtZW50ZWQuXG5cbkFyZSB0aGVzZSBmdW5jdGlvbnMgZ2VuZXJhbD8gTm8sIHRoZXkncmUgbm90IGNvcmUga2VybmVsIGhvdC1wYXRocy4gVGhleSBhcmUgc3BlY2lmaWMgdG8gdGhlIEtWTSBndWVzdCBtZW1mZCBhbmQgc2hhcmVkIG1lbXBvbGljaWVzLiBJIHdhbnQgdG8gZW1waGFzaXplIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBzcGVjaWZpYyB0byBLVk0gZ3Vlc3QgbWVtZmQgYW5kIHNoYXJlZCBtZW1wb2xpY2llcy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXNlIGFyZSBub3QgdWJpcXVpdG91cyBob3QtcGF0aHMgdGhhdCBtYXkgY2F1c2Ugd2lkZS1zcHJlYWQgcGVyZm9ybWFuY2UgaXNzdWVzLlxuXG5JIGNvbmZpcm0gdGhhdCB0aGlzIGlzIG9uIGFtZDY0LCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZ3VhcmRlZCBieSBgQ09ORklHX0tWTWAgKGFuZCBgQ09ORklHX0tWTV9JTlRFTGAgb3IgYENPTkZJR19LVk1fQU1EYCksIHdoaWNoIGluIHR1cm4gc2VsZWN0cyBgQ09ORklHX0tWTV9HVUVTVF9NRU1GRGAuIGBDT05GSUdfTlVNQWAgaXMgYWxzbyBpbXBvcnRhbnQgYXMgaXQgZW5hYmxlcyBOVU1BIG1lbXBvbGljeSBzdXBwb3J0IHdpdGhpbiB0aGUgZ3Vlc3RfbWVtZmQgY29kZSwgd2hpY2ggaXMgZXhwZWN0ZWQuXG5cbldpdGggdGhpcyBpbiBtaW5kLCB0aGUgYHNldC1yZXN1bHRzYCBwYXJhbWV0ZXJzIGFyZSBjbGVhci4gVGhpcyBwYXRjaCBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgY2FuIHJlYXNvbiB0aGF0IHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIGEgbmV3IGZsYWcgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCwgYW5kIGltcGxlbWVudHMgbWVtcG9saWN5IGhlbHBlcnMgYG1lbXBvbGljeV9jcmVhdGVgIGFuZCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgcmVhY2hhYmxlIHZpYSBLVk0gZ3Vlc3RfbWVtZmQgY3JlYXRpb24gaW9jdGwuIEknbGwgbmVlZCB0byB1c2UgYFtcImt2bV9nbWVtX2NyZWF0ZVwiLCBcImt2bV9nbWVtX2JpbmRfbm9kZVwiLCBcIm1lbXBvbGljeV9jcmVhdGVcIiwgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsIFwibXBvbF9zZXRfc2hhcmVkX3BvbGljeVwiXWAgYXMgbXkgYEZvY3VzU3ltYm9sc2AgYW5kIGBbXCJLVk1cIiwgXCJOVU1BXCJdYCBhcyBgRW5hYmxlQ29uZmlnc2AgZm9yIHByb3BlciB0ZXN0aW5nLiBOb3csIGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjczMTIsIk91dHB1dFRva2VucyI6MTg2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjAzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MTQuNjM4MjkzNDEzWiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzM3NDk2OTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtZW1wb2xpY3lfY3JlYXRlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIHRoZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSBmbGFnIGluIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGFuZCBhZGRzIHRoZSBtZW1wb2xpY3kgaGVscGVycyBtZW1wb2xpY3lfY3JlYXRlKCkgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKS4gVGhlc2UgY2hhbmdlcyBtb2RpZnkgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBpbiBtbS9tZW1wb2xpY3kuYyBhbmQgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtZW1wb2xpY3lfY3JlYXRlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIHRoZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSBmbGFnIGluIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGFuZCBhZGRzIHRoZSBtZW1wb2xpY3kgaGVscGVycyBtZW1wb2xpY3lfY3JlYXRlKCkgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKS4gVGhlc2UgY2hhbmdlcyBtb2RpZnkgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBpbiBtbS9tZW1wb2xpY3kuYyBhbmQgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODoxNC43MTIwNTEzM1oiLCJTZXEiOjIzLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDcyNzE0MjgxNzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODoxNC43MTI1NDU2OFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjQ3MjcwOTI3NDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaW4gS1ZNJ3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cXG5cXG5LTVNBTiB2cyBLQVNBTiBhcHBsaWNhYmlsaXR5Olxcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cXG4tIEluIHRoaXMgcGF0Y2gsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcmVhZHMgdXNlciBhcmd1bWVudHMgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgaW50ZWdlcjsgbm8ga2VybmVsIHN0cnVjdHVyZXMsIHBhZGRpbmcsIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UuXFxuLSBBbGwgbmV3bHkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBzdGFjayBhbmQgaGVhcCB2YXJpYWJsZXMgKGUuZy4sIGBub2RlbWFza190IG5vZGVzYCBpbml0aWFsaXplZCB2aWEgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgpYCwgYHNjcmF0Y2hgIGluaXRpYWxpemVkIHZpYSBgTk9ERU1BU0tfU0NSQVRDSCgpYCwgYW5kIGBzdHJ1Y3Qgc3Bfbm9kZWAvYHN0cnVjdCBtZW1wb2xpY3lgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBzdGFuZGFyZCBtbSBoZWxwZXJzKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cXG4tIEFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIE5VTUEgcG9saWN5IHJlZmVyZW5jZSBjb3VudGluZywgbGlmZWN5Y2xlIGlzc3Vlcywgb3IgYWxsb2NhdGlvbiBmYWlsdXJlcykgZmFsbCB1bmRlciB0aGUgc2NvcGUgb2YgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhZTY4OTU1YTU5MjNkMjVlOWUwYWY5NTY5NDMwNTc5ZTk0YzQwZjlmXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAxOTowNzoxNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaFxuaW5kZXggMDNiZmM5Mjg2NGI2ZS4uNzM4ZTI3NjYzM2MxZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaFxuKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG5AQCAtNzM5LDYgKzczOSw5IEBAIHN0YXRpYyBpbmxpbmUgdTY0IGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moc3RydWN0IGt2bSAqa3ZtKVxuIFx0aWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKVxuIFx0XHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEO1xuIFxuK1x0aWYgKElTX0VOQUJMRUQoQ09ORklHX05VTUEpKVxuK1x0XHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcbitcbiBcdHJldHVybiBmbGFncztcbiB9XG4gI2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbmluZGV4IDY1YzczMmQ0NDBkMmYuLjM5ODMxODE3NWNlYzcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG5AQCAtMTI0LDEwICsxMjQsMTUgQEAgaW50IHZtYV9kdXBfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdCk7XG4gdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xuIGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbiBcdFx0XHQgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XG4raW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LFxuK1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiB2b2lkIG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCk7XG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0XHRcdCAgICBwZ29mZl90IGlkeCk7XG4gXG4rc3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbitcdFx0XHRcdCAgIG5vZGVtYXNrX3QgKm5vZGVzKTtcbitcbiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTtcbiBzdHJ1Y3QgbWVtcG9saWN5ICpfX2dldF92bWFfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHBnb2ZmX3QgKmlseCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG5pbmRleCBhYzJkNzdkMTQ5NjM1Li44ZDNhZTdlMmVhZDhlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbkBAIC0xNjU4LDExICsxNjU4LDE0IEBAIHN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xuICNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFx0XHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRURcdCgxVUxMIFx1MDAzY1x1MDAzYyAxKVxuKyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVcdCgxVUxMIFx1MDAzY1x1MDAzYyAyKVxuIFxuIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIHtcbiBcdF9fdTY0IHNpemU7XG4gXHRfX3U2NCBmbGFncztcbi1cdF9fdTY0IHJlc2VydmVkWzZdO1xuK1x0X191MzIgbm9kZTtcbitcdF9fdTMyIHBhZDtcbitcdF9fdTY0IHJlc2VydmVkWzVdO1xuIH07XG4gXG4gI2RlZmluZSBLVk1fUFJFX0ZBVUxUX01FTU9SWVx0X0lPV1IoS1ZNSU8sIDB4ZDUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSlcbmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jXG5pbmRleCAyYWQwYTVmMTgyODBhLi5jZTEwY2U0Mzc0NjQzIDEwMDY0NFxuLS0tIGEvbW0vbWVtcG9saWN5LmNcbisrKyBiL21tL21lbXBvbGljeS5jXG5AQCAtMTA4NSw3ICsxMDg1LDQ1IEBAIHN0YXRpYyBpbnQgbWJpbmRfcmFuZ2Uoc3RydWN0IHZtYV9pdGVyYXRvciAqdm1pLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTtcbiB9XG4gXG4tLyogU2V0IHRoZSBwcm9jZXNzIG1lbW9yeSBwb2xpY3kgKi9cbisvKipcbisgKiBtZW1wb2xpY3lfY3JlYXRlIC0gYnVpbGQgYSB2YWxpZGF0ZWQsIGNwdXNldC1jb250ZXh0dWFsaXNlZCBtZW1wb2xpY3lcbisgKiBAbW9kZTogTVBPTF8qIG1vZGVcbisgKiBAZmxhZ3M6IE1QT0xfRl8qIGZsYWdzXG4rICogQG5vZGVzOiB0YXJnZXQgbm9kZW1hc2ssIG9yIE5VTEwgKGludGVycHJldGVkIHBlciBAbW9kZTsgc2VlIG1wb2xfbmV3KCkpXG4rICpcbisgKiBDcmVhdGVzIGEgbmV3IHBvbGljeSBhbmQgY29uc3RyYWlucyBpdCB0byB0aGUgdGFzaydzIGNwdXNldC5cbisgKlxuKyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlIGFuZCBmcmVlcyBpdCB3aXRoIG1wb2xfcHV0KCkuXG4rICpcbisgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXG4rICovXG4rc3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbitcdFx0bm9kZW1hc2tfdCAqbm9kZXMpXG4re1xuK1x0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xuK1x0Tk9ERU1BU0tfU0NSQVRDSChzY3JhdGNoKTtcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoIXNjcmF0Y2gpXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1xuK1x0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcbitcdGlmIChJU19FUlIocG9sKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHR0YXNrX2xvY2soY3VycmVudCk7XG4rXHRlcnIgPSBtcG9sX3NldF9ub2RlbWFzayhwb2wsIG5vZGVzLCBzY3JhdGNoKTtcbitcdHRhc2tfdW5sb2NrKGN1cnJlbnQpO1xuK1x0aWYgKGVycikge1xuK1x0XHRtcG9sX3B1dChwb2wpO1xuK1x0XHRwb2wgPSBFUlJfUFRSKGVycik7XG4rXHR9XG4rb3V0OlxuK1x0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xuK1x0cmV0dXJuIHBvbDtcbit9XG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtZW1wb2xpY3lfY3JlYXRlLCBcImt2bVwiKTtcbitcbiBzdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuIFx0XHRcdCAgICAgbm9kZW1hc2tfdCAqbm9kZXMpXG4ge1xuQEAgLTMyNzQsMjQgKzMzMTIsNDcgQEAgdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpXG4gfVxuIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zaGFyZWRfcG9saWN5X2luaXQsIFwia3ZtXCIpO1xuIFxuLWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbi1cdFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuKy8qKlxuKyAqIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgLSBpbnN0YWxsIEBwb2wgb3ZlciBbQHN0YXJ0LCBAZW5kKSBvZiBAc3BcbisgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWVcbisgKiBAc3RhcnQ6IGZpcnN0IHBhZ2Ugb2Zmc2V0IChpbmNsdXNpdmUpXG4rICogQGVuZDogICBsYXN0IHBhZ2Ugb2Zmc2V0IChleGNsdXNpdmUpXG4rICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZVxuKyAqXG4rICogSW5zdGFsbHMgQHBvbCBvdmVyIHRoZSBnaXZlbiByYW5nZSwgcmVwbGFjaW5nIGFueSBvdmVybGFwcGluZyBwb2xpY3kuXG4rICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLlxuKyAqXG4rICogVGhlIHBvbGljeSBpcyBub3QgcmVjb25zdHJ1Y3RlZCwgc28gdGhlIHBvbGljeSBpcyBwcmVzZXJ2ZWQgZXhhY3RseS5cbisgKlxuKyAqIFVubGlrZSBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCksIG5vIFZNQSBpcyByZXF1aXJlZCwgc28gYSByYW5nZSB0aGF0XG4rICogaXMgbmV2ZXIgbWFwcGVkIGludG8gYSBWTUEgY2FuIGJlIGNvdmVyZWQsIGluY2x1ZGluZyB0aGUgd2hvbGUgZmlsZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS5cbisgKi9cbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4rXHRcdFx0XHQgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbiB7XG4tXHRjb25zdCBwZ29mZl90IHBnb2ZmID0gdm1hX3N0YXJ0X3Bnb2ZmKHZtYSk7XG4tXHRjb25zdCBwZ29mZl90IHBnb2ZmX2VuZCA9IHZtYV9lbmRfcGdvZmYodm1hKTtcbiBcdHN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMO1xuIFx0aW50IGVycjtcbiBcbiBcdGlmIChwb2wpIHtcbi1cdFx0bmV3ID0gc3BfYWxsb2MocGdvZmYsIHBnb2ZmX2VuZCwgcG9sKTtcbitcdFx0bmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTtcbiBcdFx0aWYgKCFuZXcpXG4gXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHR9XG4tXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHBnb2ZmLCBwZ29mZl9lbmQsIG5ldyk7XG4rXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XG4gXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG4gXHRcdHNwX2ZyZWUobmV3KTtcbiBcdHJldHVybiBlcnI7XG4gfVxuK0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgXCJrdm1cIik7XG4rXG4raW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLFxuK1x0XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4re1xuK1x0cmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS1cdTAwM2V2bV9wZ29mZixcbitcdFx0XHRcdFx0ICAgdm1hLVx1MDAzZXZtX3Bnb2ZmICsgdm1hX3BhZ2VzKHZtYSksIHBvbCk7XG4rfVxuIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgXCJrdm1cIik7XG4gXG4gLyogRnJlZSBhIGJhY2tpbmcgcG9saWN5IHN0b3JlIG9uIGlub2RlIGRlbGV0ZS4gKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuY1xuaW5kZXggMjIzM2Q4NzFhMzhmNC4uYjMzM2NiNDJmYWIyOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcbkBAIC0yNSw2ICsyNSwzMSBAQFxuIFxuIHN0YXRpYyBzaXplX3QgcGFnZV9zaXplO1xuIFxuK3N0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcbitcdFx0XHRcdCAgICAgdTMyIG5vZGUsIHUzMiBwYWQpXG4re1xuK1x0c3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgZ3Vlc3RfbWVtZmQgPSB7XG4rXHRcdC5zaXplID0gc2l6ZSxcbitcdFx0LmZsYWdzID0gZmxhZ3MsXG4rXHRcdC5ub2RlID0gbm9kZSxcbitcdFx0LnBhZCA9IHBhZCxcbitcdH07XG4rXG4rXHRyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXHUwMDI2Z3Vlc3RfbWVtZmQpO1xuK31cbitcbitzdGF0aWMgaW50IGNyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncywgdTMyIG5vZGUpXG4re1xuK1x0aW50IGZkO1xuK1xuK1x0aWYgKCEoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSlcbitcdFx0cmV0dXJuIHZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgc2l6ZSwgZmxhZ3MpO1xuK1xuK1x0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7XG4rXHRURVNUX0FTU0VSVChmZCBcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xuK1x0cmV0dXJuIGZkO1xuK31cbitcbiBzdGF0aWMgdm9pZCB0ZXN0X2ZpbGVfcmVhZF93cml0ZShpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKVxuIHtcbiBcdGNoYXIgYnVmWzY0XTtcbkBAIC0xNzEsNiArMTk2LDgzIEBAIHN0YXRpYyB2b2lkIHRlc3RfbnVtYV9hbGxvY2F0aW9uKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpXG4gXHRrdm1fbXVubWFwKG1lbSwgdG90YWxfc2l6ZSk7XG4gfVxuIFxuK3N0YXRpYyBib29sIGhhc19iaW5kX25vZGUoc3RydWN0IGt2bV92bSAqdm0pXG4re1xuK1x0cmV0dXJuIHZtX2NoZWNrX2NhcCh2bSwgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUykgXHUwMDI2XG4rXHQgICAgICAgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREU7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlX2ludmFsaWQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcbit7XG4rXHRpbnQgZmQ7XG4rXG4rXHRpZiAoIWhhc19iaW5kX25vZGUodm0pKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSxcbitcdFx0XHRcdCAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLCAwLCAxKTtcbitcdFRFU1RfQVNTRVJUKGZkIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXG4rXHRcdCAgICBcImd1ZXN0X21lbWZkKCkgd2l0aCBub24temVybyBwYWQgc2hvdWxkIGZhaWwgd2l0aCBFSU5WQUxcIik7XG4rXG4rXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSxcbitcdFx0XHRcdCAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFxuK1x0XHRcdFx0ICAgICAgIDEgXHUwMDNjXHUwMDNjIDIwLCAwKTtcbitcdFRFU1RfQVNTRVJUKGZkIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXG4rXHRcdCAgICBcImd1ZXN0X21lbWZkKCkgd2l0aCBvdXQtb2YtcmFuZ2Ugbm9kZSBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwiKTtcbitcbitcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLCBmbGFncywgMSwgMCk7XG4rXHRURVNUX0FTU0VSVChmZCBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRUlOVkFMLFxuK1x0XHQgICAgXCJndWVzdF9tZW1mZCgpIHdpdGggYSBub2RlIGJ1dCBubyBCSU5EX05PREUgZmxhZyBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwiKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGUoaW50IGZkLCBzaXplX3QgdG90YWxfc2l6ZSwgaW50IG5vZGUpXG4re1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBvdGhlcl9tYXNrID0gMVVMIFx1MDAzY1x1MDAzYyAobm9kZSA/IDAgOiAxKTtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4bm9kZSA9IEJJVFNfUEVSX1RZUEUob3RoZXJfbWFzayk7XG4rXHRib29sIHN0ZWVyX2F3YXkgPSBpc19tdWx0aV9udW1hX25vZGVfc3lzdGVtKCk7XG4rXHR2b2lkICpwYWdlc1s0XTtcbitcdGludCBzdGF0dXNbNF07XG4rXHRjaGFyICptZW07XG4rXHRpbnQgaTtcbitcbitcdG1lbSA9IGt2bV9tbWFwKHRvdGFsX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDQ7IGkrKylcbitcdFx0cGFnZXNbaV0gPSBtZW0gKyBwYWdlX3NpemUgKiBpO1xuK1xuK1x0LypcbitcdCAqIEJpbmQgb24gYSBkaWZmZXJlbnQgbm9kZSBpZiBwb3NzaWJsZSBvcmRlciB0byBjaGVjayB3aGV0aGVyIGZhdWx0aW5nXG4rXHQgKiBoYXBwZW5zIGFzIGRlc2lyZWQuIFdpdGhvdXQgYSBzZWNvbmQgbm9kZSB1c2UgdGhlIGxvY2FsIG5vZGUgYW5kXG4rXHQgKiBqdXN0IGdldCBjb3ZlcmFnZSBvZiBjcmVhdGUvbW1hcC9mYXVsdCBwYXRocy5cbitcdCAqL1xuK1x0aWYgKHN0ZWVyX2F3YXkpXG4rXHRcdGt2bV9zZXRfbWVtcG9saWN5KE1QT0xfQklORCwgXHUwMDI2b3RoZXJfbWFzaywgbWF4bm9kZSk7XG4rXG4rXHQvKiBEZWxpYmVyYXRlbHkgbm8gbWJpbmQoKSBvbiB0aGlzIG1hcHBpbmcuICovXG4rXHRtZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTtcbitcbitcdGt2bV9tb3ZlX3BhZ2VzKDAsIDQsIHBhZ2VzLCBOVUxMLCBzdGF0dXMsIDApO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSsrKVxuK1x0XHRURVNUX0FTU0VSVChzdGF0dXNbaV0gPT0gbm9kZSxcbitcdFx0XHQgICAgXCJFeHBlY3RlZCBwYWdlICVkIG9uIG5vZGUgJWQsIGdvdCBpdCBvbiBub2RlICVkXCIsXG4rXHRcdFx0ICAgIGksIG5vZGUsIHN0YXR1c1tpXSk7XG4rXG4rXHQvKiBEcm9wcGVkIG1lbW9yeSBzaG91bGQgZmF1bHQgYmFjayBvbnRvIHRoZSBzYW1lIG5vZGUgKi9cbitcdGt2bV9mYWxsb2NhdGUoZmQsIEZBTExPQ19GTF9QVU5DSF9IT0xFIHwgRkFMTE9DX0ZMX0tFRVBfU0laRSwgMCxcbitcdFx0ICAgICAgdG90YWxfc2l6ZSk7XG4rXHRtZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTtcbitcbitcdGt2bV9tb3ZlX3BhZ2VzKDAsIDQsIHBhZ2VzLCBOVUxMLCBzdGF0dXMsIDApO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSsrKVxuK1x0XHRURVNUX0FTU0VSVChzdGF0dXNbaV0gPT0gbm9kZSxcbitcdFx0XHQgICAgXCJFeHBlY3RlZCBwYWdlICVkIGJhY2sgb24gbm9kZSAlZCwgZ290IGl0IG9uIG5vZGUgJWRcIixcbitcdFx0XHQgICAgaSwgbm9kZSwgc3RhdHVzW2ldKTtcbitcbitcdGlmIChzdGVlcl9hd2F5KVxuK1x0XHRrdm1fc2V0X21lbXBvbGljeShNUE9MX0RFRkFVTFQsIE5VTEwsIDApO1xuK1xuK1x0a3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpO1xuK31cbitcbiBzdGF0aWMgdm9pZCB0ZXN0X2NvbGxhcHNlKGludCBmZCwgdTY0IGZsYWdzKVxuIHtcbiBcdGNvbnN0IHNpemVfdCBwbWRfc2l6ZSA9IGdldF90cmFuc19odWdlcGFnZXN6KCk7XG5AQCAtNDA0LDYgKzUwNiwxMCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKVxuIFx0aW50IGZkO1xuIFxuIFx0Zm9yIChmbGFnID0gQklUKDApOyBmbGFnOyBmbGFnIFx1MDAzY1x1MDAzYz0gMSkge1xuK1x0XHQvKiBCSU5EX05PREUgZGVwZW5kcyBvbiBhIHZhbGlkIG5vZGUgZmllbGQsIHRlc3Qgc2VwYXJhdGVseSAqL1xuK1x0XHRpZiAoZmxhZyA9PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSlcbitcdFx0XHRjb250aW51ZTtcbitcbiBcdFx0ZmQgPSBfX3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgcGFnZV9zaXplLCBmbGFnKTtcbiBcdFx0aWYgKGZsYWcgXHUwMDI2IHZhbGlkX2ZsYWdzKSB7XG4gXHRcdFx0VEVTVF9BU1NFUlQoZmQgXHUwMDNlPSAwLFxuQEAgLTQxOCwzMCArNTI0LDQwIEBAIHN0YXRpYyB2b2lkIHRlc3RfZ3Vlc3RfbWVtZmRfZmxhZ3Moc3RydWN0IGt2bV92bSAqdm0pXG4gXHR9XG4gfVxuIFxuLSNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBhcmdzLi4uKVx0XFxcbi1kbyB7XHRcdFx0XHRcdFx0XHRcdFx0XFxcbi1cdGludCBmZCA9IHZtX2NyZWF0ZV9ndWVzdF9tZW1mZChfX3ZtLCBfX2dtZW1fc2l6ZSwgX19mbGFncyk7XHRcXFxuLVx0XHRcdFx0XHRcdFx0XHRcdFxcXG4tXHR0ZXN0XyMjX190ZXN0KGFyZ3MpO1x0XHRcdFx0XHRcdFxcXG4tXHRjbG9zZShmZCk7XHRcdFx0XHRcdFx0XHRcXFxuKyNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUsIGFyZ3MuLi4pIFxcXG4rZG8ge1x0XHRcdFx0XHRcdFx0XHRcdCAgIFxcXG4rXHRpbnQgZmQgPSBjcmVhdGVfZ3Vlc3RfbWVtZmQoX192bSwgX19nbWVtX3NpemUsIF9fZmxhZ3MsIF9fbm9kZSk7ICAgXFxcbitcdFx0XHRcdFx0XHRcdFx0XHQgICBcXFxuK1x0dGVzdF8jI19fdGVzdChhcmdzKTtcdFx0XHRcdFx0XHQgICBcXFxuK1x0Y2xvc2UoZmQpO1x0XHRcdFx0XHRcdFx0ICAgXFxcbiB9IHdoaWxlICgwKVxuIFxuICNkZWZpbmUgX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcdFx0XHRcXFxuLVx0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBmZCwgX19nbWVtX3NpemUpXG4rXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsIGZkLCBfX2dtZW1fc2l6ZSlcbiBcbiAjZGVmaW5lIGdtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXHRcdFx0XHRcXFxuIFx0X19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KVxuIFxuICNkZWZpbmUgX19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcdFx0XFxcbi1cdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX192bSwgZmQsIF9fZ21lbV9zaXplKVxuK1x0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCAwLFx0XHRcXFxuK1x0XHQgICAgICBfX3ZtLCBmZCwgX19nbWVtX3NpemUpXG4gXG4gI2RlZmluZSBnbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzKVx0XHRcdFx0XFxcbiBcdF9fZ21lbV90ZXN0X3ZtKF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNClcbiBcbisjZGVmaW5lIF9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX19ub2RlKVx0XFxcbitcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLFx0XHRcdFx0XHRcXFxuK1x0XHQgICAgICAoX19mbGFncykgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSxcdFx0XFxcbitcdFx0ICAgICAgX19nbWVtX3NpemUsIF9fbm9kZSwgZmQsIF9fZ21lbV9zaXplLCBfX25vZGUpXG4rXG4rI2RlZmluZSBnbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fbm9kZSlcdFx0XHRcXFxuK1x0X19nbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIHBhZ2Vfc2l6ZSAqIDQsIF9fbm9kZSlcbitcbiBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcbiB7XG4gXHR0ZXN0X2NyZWF0ZV9ndWVzdF9tZW1mZF9tdWx0aXBsZSh2bSk7XG4gXHR0ZXN0X2NyZWF0ZV9ndWVzdF9tZW1mZF9pbnZhbGlkX3NpemVzKHZtLCBmbGFncyk7XG4rXHR0ZXN0X2JpbmRfbm9kZV9pbnZhbGlkKHZtLCBmbGFncyk7XG4gXG4gXHRnbWVtX3Rlc3QoZmlsZV9yZWFkX3dyaXRlLCB2bSwgZmxhZ3MpO1xuIFxuQEAgLTQ1Miw2ICs1NjgsOCBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcbiBcdFx0XHRnbWVtX3Rlc3QobW1hcF9zdXBwb3J0ZWQsIHZtLCBmbGFncyk7XG4gXHRcdFx0Z21lbV90ZXN0KGZhdWx0X292ZXJmbG93LCB2bSwgZmxhZ3MpO1xuIFx0XHRcdGdtZW1fdGVzdChudW1hX2FsbG9jYXRpb24sIHZtLCBmbGFncyk7XG4rXHRcdFx0aWYgKGhhc19iaW5kX25vZGUodm0pKVxuK1x0XHRcdFx0Z21lbV90ZXN0X25vZGUoYmluZF9ub2RlLCB2bSwgZmxhZ3MsIDApO1xuIFx0XHRcdF9fZ21lbV90ZXN0KGNvbGxhcHNlLCB2bSwgZmxhZ3MsIHBtZF9zaXplKTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRnbWVtX3Rlc3QoZmF1bHRfcHJpdmF0ZSwgdm0sIGZsYWdzKTtcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuaW5kZXggNjI1ZTYyZTFhMDMxOC4uZGM5ZjA3MWRkOTY5YiAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbkBAIC00MjMsNiArNDIzLDMxIEBAIHN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICprdm1fZ21lbV9nZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0ICovXG4gXHRyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgcGdvZmYpO1xuIH1cbitcbitzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcbit7XG4rXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4rXHRub2RlbWFza190IG5vZGVzO1xuK1x0aW50IGVycjtcbitcbitcdGlmICgodW5zaWduZWQgaW50KW5vZGUgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aW5pdF9ub2RlbWFza19vZl9ub2RlKFx1MDAyNm5vZGVzLCBub2RlKTtcbitcdHBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCBcdTAwMjZub2Rlcyk7XG4rXHRpZiAoSVNfRVJSKHBvbCkpXG4rXHRcdHJldHVybiBQVFJfRVJSKHBvbCk7XG4rXG4rXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCAwLFxuK1x0XHRcdFx0XHQgIE1BWF9MRlNfRklMRVNJWkUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsIHBvbCk7XG4rXHRtcG9sX3B1dChwb2wpO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rI2Vsc2VcbitzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcbit7XG4rXHRyZXR1cm4gLUVJTlZBTDtcbit9XG4gI2VuZGlmIC8qIENPTkZJR19OVU1BICovXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fZ21lbV92bV9vcHMgPSB7XG5AQCAtNTIwLDcgKzU0NSw3IEBAIGJvb2wgX193ZWFrIGt2bV9hcmNoX3N1cHBvcnRzX2dtZW1faW5pdF9zaGFyZWQoc3RydWN0IGt2bSAqa3ZtKVxuIFx0cmV0dXJuIHRydWU7XG4gfVxuIFxuLXN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxuK3N0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzLCBpbnQgbm9kZSlcbiB7XG4gXHRzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9IFwiW2t2bS1nbWVtXVwiO1xuIFx0c3RydWN0IGdtZW1fZmlsZSAqZjtcbkBAIC01NjEsNiArNTg2LDEyIEBAIHN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxuIFxuIFx0R01FTV9JKGlub2RlKS1cdTAwM2VmbGFncyA9IGZsYWdzO1xuIFxuK1x0aWYgKGZsYWdzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xuK1x0XHRlcnIgPSBrdm1fZ21lbV9iaW5kX25vZGUoaW5vZGUsIG5vZGUpO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdGdvdG8gZXJyX2lub2RlO1xuK1x0fVxuK1xuIFx0ZmlsZSA9IGFsbG9jX2ZpbGVfcHNldWRvKGlub2RlLCBrdm1fZ21lbV9tbnQsIG5hbWUsIE9fUkRXUiwgXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XG4gXHRpZiAoSVNfRVJSKGZpbGUpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoZmlsZSk7XG5AQCAtNTkzLDYgKzYyNCw3IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbiB7XG4gXHRsb2ZmX3Qgc2l6ZSA9IGFyZ3MtXHUwMDNlc2l6ZTtcbiBcdHU2NCBmbGFncyA9IGFyZ3MtXHUwMDNlZmxhZ3M7XG4rXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcbiBcbiBcdGlmIChmbGFncyBcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG5AQCAtNjAwLDcgKzYzMiwxNSBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4gXHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7XG4rXHRpZiAoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XG4rXHRcdGlmIChhcmdzLVx1MDAzZXBhZCB8fCBhcmdzLVx1MDAzZW5vZGUgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdG5vZGUgPSBhcmdzLVx1MDAzZW5vZGU7XG4rXHR9IGVsc2UgaWYgKGFyZ3MtXHUwMDNlbm9kZSB8fCBhcmdzLVx1MDAzZXBhZCkge1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzLCBub2RlKTtcbiB9XG4gXG4gaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MTQuNzEyNTQ2NzdaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTEyNjg1NDEzMzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gUmlzayBBc3Nlc3NtZW50IGZvciBhIEtWTSBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIHdpdGggS01TQU4gaW4gbWluZCwgc3BlY2lmaWNhbGx5IGxvb2tpbmcgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlcy4gRmlyc3QsIEkgbmVlZCB0byBtZXRob2RpY2FsbHkgZ28gdGhyb3VnaCB0aGUgZGlmZi5cblxuMS4gIEluIGBpbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhgLCB3ZSdyZSBhZGRpbmcgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCB3aXRoaW4gYGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3NgIGJ1dCBvbmx5IGlmIE5VTUEgaXMgZW5hYmxlZC4gTWFrZXMgc2Vuc2UuXG5cbjIuICBgaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaGAganVzdCBkZWNsYXJlcyBzb21lIG1lbXBvbGljeSBmdW5jdGlvbnMgLSBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgYW5kIGBtZW1wb2xpY3lfY3JlYXRlYC4gTm90aGluZyBpbW1lZGlhdGVseSBjb25jZXJuaW5nIHRoZXJlLCBpdCBpcyBqdXN0IGRlY2xhcmluZyB0aG9zZSBmdW5jdGlvbnMuXG5cbjMuICBUaGUgYGluY2x1ZGUvdWFwaS9saW51eC9rdm0uaGAgaXMgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4gV2UndmUgZ290IGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZGVmaW5lZCwgd2hpY2ggaXMgcmVsZXZhbnQgZm9yIE5VTUEuICBNb3JlIGltcG9ydGFudGx5LCB0aGUgYHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkYCBoYXMgYmVlbiAqbW9kaWZpZWQqLiAgV2UgYXJlIHJlcGxhY2luZyB0aGUgcmVzZXJ2ZWQgc3BhY2UgdG8gYWRkIGEgYG5vZGVgIGFuZCBhIGBwYWRgIG1lbWJlciwgYnV0IGtlZXBpbmcgdGhlIHN0cnVjdCBzaXplIGNvbnN0YW50IGF0IDY0IGJ5dGVzLiBUaGUgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgc2luY2UgdGhlIHNpemUgaXMgdGhlIHNhbWUsIG5vIG1lbW9yeSByaXNrcyBzaG91bGQgYmUgYXBwYXJlbnQuIEhvd2V2ZXIsIG5vdyBJIGFtIHdvbmRlcmluZyBpZiBga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZGAgaXMgY29waWVkIGJhY2sgdG8gdXNlcnNwYWNlIGluIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgY2FsbC4gSSBuZWVkIHRvIGtub3cgdGhpcyB0byBiZSBzdXJlIHRoZXJlJ3Mgbm8gbGVhayBvZiBrZXJuZWwgbWVtb3J5LlxuXG5XYWl0ISBRdWljayBzYW5pdHkgY2hlY2suIElzIHRoZSBpb2N0bCBgX0lPV1JgIG9yIGBfSU9XYD8gQW5kIHllcywgYCNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBfSU9XUihLVk1JTywgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpYCBjb25maXJtcyB0aGF0IGl0J3MgcmVhZC93cml0ZS4gSSBuZWVkIHRvIGJlICpzdXJlKiBhYm91dCB0aGlzIHJlYWQgYmFjay4gSSBhbSBnb2luZyB0byBoYXZlIHRvIGdyZXAgZm9yIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpbiB0aGUgS1ZNIGNvZGUgbm93IHRvIHNlZSB0aGUgaW9jdGwgaW1wbGVtZW50YXRpb24uIFRoaXMgd2lsbCBiZSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgaWYgdGhlcmUncyBhbnkgcG90ZW50aWFsIGZvciBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIGR1ZSB0byB0aGUgc3RydWN0dXJlIGNoYW5nZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzg2MCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjI1Ljk4MTA5MjY0MloiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY0NTMwNzQxMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02MzU3PWluIGZsYWdzIHRvIGhhdmUgS1ZNIGJpbmQgdGhlIG1lbW9yeSByZWdpb24gdG8gYSBnaXZlbiBndWVzdF9tZW1mZCByYW5nZSBvZlxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02MzU4LVtndWVzdF9tZW1mZF9vZmZzZXQsIGd1ZXN0X21lbWZkX29mZnNldCArIG1lbW9yeV9zaXplXS4gIFRoZSB0YXJnZXQgZ3Vlc3RfbWVtZmRcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q6NjM1OTptdXN0IHBvaW50IGF0IGEgZmlsZSBjcmVhdGVkIHZpYSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIG9uIHRoZSBjdXJyZW50IFZNLCBhbmRcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjM2MC10aGUgdGFyZ2V0IHJhbmdlIG11c3Qgbm90IGJlIGJvdW5kIHRvIGFueSBvdGhlciBtZW1vcnkgcmVnaW9uLiAgQWxsIHN0YW5kYXJkXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q9NjQzMD1UaGUgXFxcImZsYWdzXFxcIiBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgYW5kIG11c3QgYmUgJzAnLlxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDMxLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDMyOjQuMTQyIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQzMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ0MC1cXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q6NjQ0MTpLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIGNyZWF0ZXMgYW4gYW5vbnltb3VzIGZpbGUgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3JcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ0Mi10aGF0IHJlZmVycyB0byBpdC4gIGd1ZXN0X21lbWZkIGZpbGVzIGFyZSByb3VnaGx5IGFuYWxvZ291cyB0byBmaWxlcyBjcmVhdGVkXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q9NjQ3Mz1UaGUgY2FwYWJpbGl0eSBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTIGVudW1lcmF0ZXMgdGhlIGBmbGFnc2AgdGhhdCBjYW4gYmVcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q6NjQ3NDpzcGVjaWZpZWQgdmlhIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQuICBDdXJyZW50bHkgZGVmaW5lZCBmbGFnczpcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ3NS1cXG4tLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDc5LSAgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRCBNYWtlIGFsbCBtZW1vcnkgaW4gdGhlIGZpbGUgc2hhcmVkIGR1cmluZ1xcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDgwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIChtZW1vcnkgZmlsZXMgY3JlYXRlZFxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDgxLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IElOSVRfU0hBUkVEIHdpbGwgYmUgbWFya2VkIHByaXZhdGUpLlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWc9ODM9Y29uZmlnIEtWTV9TV19QUk9URUNURURfVk1cXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTkwLVxcdCAgcHJvdGVjdGVkIFZNcyBhcmUgcHVyZWx5IGEgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcgdmVoaWNsZSBmb3JcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo5MTpcXHQgIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQuICBBdHRlbXB0aW5nIHRvIHJ1biBhIFxcXCJyZWFsXFxcIiBWTSB3b3JrbG9hZCBhcyBhXFxuYXJjaC94ODYva3ZtL0tjb25maWctOTItXFx0ICBzb2Z0d2FyZS1wcm90ZWN0ZWQgVk0gd2lsbCBmYWlsIG1pc2VyYWJseS5cXG4tLVxcbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaD0xNjQ5PXN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTctXFxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oOjE2NTg6I2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1OS0jZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFxcdFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDApXFxuLS1cXG50b29scy9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmg9MTY0NT1zdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHtcXG4tLVxcbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjUzLVxcbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaDoxNjU0OiNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFxcdF9JT1dSKEtWTUlPLCAgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpXFxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTUtI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcXHRcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYz0yOD1zdGF0aWMgaW50IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTM3LVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmM6Mzg6XFx0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFxcdTAwMjZndWVzdF9tZW1mZCk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy0zOS19XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jPTQxPXN0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSlcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMtNDgtXFx0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYzo0OTpcXHRURVNUX0FTU0VSVChmZCBcXHUwMDNlPSAwLCBLVk1fSU9DVExfRVJST1IoS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgZmQpKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTUwLVxcdHJldHVybiBmZDtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg9NjY3PXN0YXRpYyBpbmxpbmUgaW50IF9fdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjc0LVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg6Njc1OlxcdHJldHVybiBfX3ZtX2lvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcXHUwMDI2Z3Vlc3RfbWVtZmQpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjc2LX1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg9Njc4PXN0YXRpYyBpbmxpbmUgaW50IHZtX2NyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oLTY4Mi1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oOjY4MzpcXHRURVNUX0FTU0VSVChmZCBcXHUwMDNlPSAwLCBLVk1fSU9DVExfRVJST1IoS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgZmQpKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oLTY4NC1cXHRyZXR1cm4gZmQ7XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTUxNjc9c3RhdGljIGxvbmcga3ZtX3ZtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy01Mzg3LSNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUX01FTUZEXFxudmlydC9rdm0va3ZtX21haW4uYzo1Mzg4OlxcdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM4OS1cXHRcXHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MjcuNjI2NDA2MTYzWiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI5MjkxODc1NTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gS1ZNIENvcmU6IEEgTGluZSBvZiBJbnF1aXJ5KipcblxuT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byBkZWx2ZSBpbnRvIHRoZSBLVk0gY29yZSwgc3BlY2lmaWNhbGx5IHRoZSBga3ZtX21haW4uY2AgZmlsZS4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIG1lbnRhbCBtYXAgb2YgdGhpcyBjb2RlLCBidXQgSSBuZWVkIHRvIHBpbnBvaW50IGEgc3BlY2lmaWMgYXJlYS4gTGV0J3Mgc3RhcnQgYnkgemVyb2luZyBpbiBvbiBsaW5lIDUzODguIE15IGluaXRpYWwgYXBwcm9hY2ggd2lsbCBiZSBhIHN0cmFpZ2h0Zm9yd2FyZCBleGFtaW5hdGlvbiBvZiB0aGF0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4gTGV0J3MgdXNlIGByZWFkLWZpbGVgIHRvIGdldCBhIGdvb2QgbG9vayBhdCB0aGUgY29kZSBhcm91bmQgdGhhdCBhcmVhLiBIb3BlZnVsbHksIHRoYXQgd2lsbCBnaXZlIG1lIGVub3VnaCBjb250ZXh0IHRvIGJlZ2luIGEgbW9yZSBudWFuY2VkIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNjM0LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MzAuNTU1NTk4MTE4WiIsIlNlcSI6MjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQwMDkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJ2aXJ0L2t2bS9rdm1fbWFpbi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUzODAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjUzODA6XFx0XFx0XFx0YnJlYWs7XFxuNTM4MTpcXHRcXHRjYXNlIEtWTV9SRVNFVF9ESVJUWV9SSU5HUzpcXG41MzgyOlxcdFxcdFxcdHIgPSBrdm1fdm1faW9jdGxfcmVzZXRfZGlydHlfcGFnZXMoa3ZtKTtcXG41MzgzOlxcdFxcdFxcdGJyZWFrO1xcbjUzODQ6XFx0XFx0Y2FzZSBLVk1fR0VUX1NUQVRTX0ZEOlxcbjUzODU6XFx0XFx0XFx0ciA9IGt2bV92bV9pb2N0bF9nZXRfc3RhdHNfZmQoa3ZtKTtcXG41Mzg2OlxcdFxcdFxcdGJyZWFrO1xcbjUzODc6XFx0I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG41Mzg4OlxcdFxcdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xcbjUzODk6XFx0XFx0XFx0c3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgZ3Vlc3RfbWVtZmQ7XFxuNTM5MDpcXHRcXG41MzkxOlxcdFxcdFxcdHIgPSAtRUZBVUxUO1xcbjUzOTI6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZndWVzdF9tZW1mZCwgYXJncCwgc2l6ZW9mKGd1ZXN0X21lbWZkKSkpXFxuNTM5MzpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG41Mzk0OlxcdFxcbjUzOTU6XFx0XFx0XFx0ciA9IGt2bV9nbWVtX2NyZWF0ZShrdm0sIFxcdTAwMjZndWVzdF9tZW1mZCk7XFxuNTM5NjpcXHRcXHRcXHRicmVhaztcXG41Mzk3OlxcdFxcdH1cXG41Mzk4OlxcdCNlbmRpZlxcbjUzOTk6XFx0XFx0ZGVmYXVsdDpcXG41NDAwOlxcdFxcdFxcdHIgPSBrdm1fYXJjaF92bV9pb2N0bChmaWxwLCBpb2N0bCwgYXJnKTtcXG41NDAxOlxcdFxcdH1cXG41NDAyOlxcdG91dDpcXG41NDAzOlxcdFxcdHJldHVybiByO1xcbjU0MDQ6XFx0fVxcbjU0MDU6XFx0XFxuNTQwNjpcXHQjaWZkZWYgQ09ORklHX0tWTV9DT01QQVRcXG41NDA3OlxcdHN0cnVjdCBjb21wYXRfa3ZtX2RpcnR5X2xvZyB7XFxuNTQwODpcXHRcXHRfX3UzMiBzbG90O1xcbjU0MDk6XFx0XFx0X191MzIgcGFkZGluZzE7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjMwLjU1NjAwNDA4OFoiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDUzMTE3NTY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS1ZNIEd1ZXN0IE1lbW9yeSBGaWxlIENyZWF0aW9uKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGNhbGwuIFJpZ2h0IG9mZiB0aGUgYmF0LCBpdCdzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuIEZyb20gd2hhdCBJIGNhbiBzZWUsIGFsbCBpdCdzIGRvaW5nIGlzIGEgc2ltcGxlIGBjb3B5X2Zyb21fdXNlcmAgb3BlcmF0aW9uIOKAkyBqdXN0IGdyYWJiaW5nIHRoZSBgZ3Vlc3RfbWVtZmRgIHN0cnVjdHVyZSBmcm9tIHVzZXJzcGFjZSBhbmQgcGFzc2luZyBpdCBvdmVyLiBObyBkYXRhIGlzIGJlaW5nIHJldHVybmVkIGJhY2sgdG8gdGhlIHVzZXIsIHdoaWNoIGlzIGludGVyZXN0aW5nIHRvIG5vdGUuIFxuXG5Ob3csIHRoZSByZWFsIG1lYXQgb2YgdGhlIG9wZXJhdGlvbiBoYXMgZ290IHRvIGJlIHdpdGhpbiBga3ZtX2dtZW1fY3JlYXRlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGF0IGZ1bmN0aW9uIGRvZXMgd2l0aCB0aGUgYGd1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUuIFRoaXMgYWxzbyBtZWFucyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLCBzbyBsZXQncyBnZXQgaW50byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEzMDAsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODozMy4wMDkxMjQ5NjRaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMDQyNzU2NCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29weV90b191c2VyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjMzLjEyOTU2MTIzOVoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTM5NTc4ODgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggc3VtbWFyaXppbmcgdGhlIHByb21wdCwga2VlcGluZyBpbiBtaW5kIG15IG93biBleHBlcnQtbGV2ZWwgdW5kZXJzdGFuZGluZyBvZiB0aGUgZmllbGQ6XG5cbioqSW52ZXN0aWdhdGluZyBHdWVzdCBNZW1vcnkgTWFuYWdlbWVudCBpbiBLVk0qKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gZ2V0IHRvIHRoZSBib3R0b20gb2Ygc29tZXRoaW5nIHJlbGF0ZWQgdG8gZ3Vlc3QgbWVtb3J5IG1hbmFnZW1lbnQgd2l0aGluIEtWTS4gU3BlY2lmaWNhbGx5LCBJIHNob3VsZCBwcm9iYWJseSB6ZXJvIGluIG9uIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhcyBhIGdvb2QgcGxhY2UgdG8gc3RhcnQuIFRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgbG9naWMgcmVsYXRlZCB0byBgbWVtZmRgLWJhY2tlZCBndWVzdCBtZW1vcnkgc2hvdWxkIHJlc2lkZS4gSSdtIHRoaW5raW5nIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBmdW5jdGlvbnMgaW52b2x2ZWQgaW4gYmluZGluZyBtZW1vcnkgbm9kZXMsIGNyZWF0aW5nIGd1ZXN0IG1lbW9yeSByZWdpb25zIHVzaW5nIGBtZW1mZGAsIGFuZCByZWxhdGVkIG9wZXJhdGlvbnMg4oCTIHNwZWNpZmljYWxseSwgZnVuY3Rpb25zIGxpa2UgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGBrdm1fZ21lbV9jcmVhdGVgLCBhbmQgYW55IHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUuIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQgbWFuYWdlZCBmcm9tIHRoZSBob3N0J3MgcGVyc3BlY3RpdmUsIGJ1dCBhbHNvIGhvdyBpdCBhcHBlYXJzIGFuZCBiZWhhdmVzIHdpdGhpbiB0aGUgZ3Vlc3QuIFVuZGVyc3RhbmRpbmcgdGhlc2UgaW50ZXJhY3Rpb25zIGlzIGtleSB0byBwaW5wb2ludGluZyBhbnkgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIG1lbW9yeS1yZWxhdGVkIGlzc3Vlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE2NTksIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODozNS42NjkxNDI2MDJaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA3OTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDIwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDIwOlxcdFxcdCAqIGV4cGxpY2l0IHBvbGljeSBoYXMgYmVlbiBzZXQgdmlhIG1iaW5kKCkgZm9yIHRoaXMgbWVtb3J5LiBUaGUgY2FsbGVyXFxuIDQyMTpcXHRcXHQgKiBjYW4gdGhlbiByZXBsYWNlIE5VTEwgd2l0aCB0aGUgZGVmYXVsdCBtZW1vcnkgcG9saWN5IGluc3RlYWQgb2YgdGhlXFxuIDQyMjpcXHRcXHQgKiBjdXJyZW50IHRhc2sncyBtZW1vcnkgcG9saWN5LlxcbiA0MjM6XFx0XFx0ICovXFxuIDQyNDpcXHRcXHRyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChcXHUwMDI2R01FTV9JKGlub2RlKS1cXHUwMDNlcG9saWN5LCBwZ29mZik7XFxuIDQyNTpcXHR9XFxuIDQyNjpcXHRcXG4gNDI3OlxcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxcbiA0Mjg6XFx0e1xcbiA0Mjk6XFx0XFx0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xcbiA0MzA6XFx0XFx0bm9kZW1hc2tfdCBub2RlcztcXG4gNDMxOlxcdFxcdGludCBlcnI7XFxuIDQzMjpcXHRcXG4gNDMzOlxcdFxcdGlmICgodW5zaWduZWQgaW50KW5vZGUgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbiA0MzQ6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzNTpcXHRcXG4gNDM2OlxcdFxcdGluaXRfbm9kZW1hc2tfb2Zfbm9kZShcXHUwMDI2bm9kZXMsIG5vZGUpO1xcbiA0Mzc6XFx0XFx0cG9sID0gbWVtcG9saWN5X2NyZWF0ZShNUE9MX0JJTkQsIDAsIFxcdTAwMjZub2Rlcyk7XFxuIDQzODpcXHRcXHRpZiAoSVNfRVJSKHBvbCkpXFxuIDQzOTpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihwb2wpO1xcbiA0NDA6XFx0XFxuIDQ0MTpcXHRcXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2Vwb2xpY3ksIDAsXFxuIDQ0MjpcXHRcXHRcXHRcXHRcXHRcXHQgIE1BWF9MRlNfRklMRVNJWkUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcXG4gNDQzOlxcdFxcdG1wb2xfcHV0KHBvbCk7XFxuIDQ0NDpcXHRcXHRyZXR1cm4gZXJyO1xcbiA0NDU6XFx0fVxcbiA0NDY6XFx0I2Vsc2VcXG4gNDQ3OlxcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxcbiA0NDg6XFx0e1xcbiA0NDk6XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQ1MDpcXHR9XFxuIDQ1MTpcXHQjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG4gNDUyOlxcdFxcbiA0NTM6XFx0c3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fZ21lbV92bV9vcHMgPSB7XFxuIDQ1NDpcXHRcXHQuZmF1bHRcXHRcXHQ9IGt2bV9nbWVtX2ZhdWx0X3VzZXJfbWFwcGluZyxcXG4gNDU1OlxcdCNpZmRlZiBDT05GSUdfTlVNQVxcbiA0NTY6XFx0XFx0LmdldF9wb2xpY3lcXHQ9IGt2bV9nbWVtX2dldF9wb2xpY3ksXFxuIDQ1NzpcXHRcXHQuc2V0X3BvbGljeVxcdD0ga3ZtX2dtZW1fc2V0X3BvbGljeSxcXG4gNDU4OlxcdCNlbmRpZlxcbiA0NTk6XFx0fTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MzUuNjY5MjU2NzEyWiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMzODc4MDIyNTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBgbWVtcG9saWN5LmNgIENvZGUqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgbWVtcG9saWN5LmNgIGNvZGUgc25pcHBldC4gTXkgaW5pdGlhbCBmb2N1cyBpcyB0aGUgYG1lbXBvbGljeV9jcmVhdGVgIGZ1bmN0aW9uLiBJIHNlZSBpdCBjcmVhdGVzIGEgbmV3IG1lbW9yeSBwb2xpY3kgc3RydWN0dXJlLiBUaGUgaW5wdXQgcGFyYW1ldGVycywgYG1vZGVgLCBgZmxhZ3NgLCBhbmQgYG5vZGVzYCwgYXJlIHByZXR0eSBzdGFuZGFyZDsgdGhleSBkZWZpbmUgdGhlIGJlaGF2aW9yIGFuZCBub2RlIGFmZmluaXR5IG9mIHRoZSBwb2xpY3kuXG5cblRoZSBjb3JlIG9mIGl0IGlzIGNhbGxpbmcgYG1wb2xfbmV3YCB0byBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYHN0cnVjdCBtZW1wb2xpY3lgLiBUaGVuLCBjcnVjaWFsbHksIHRoZXJlJ3MgYSBsb2NrIGFyb3VuZCBgbXBvbF9zZXRfbm9kZW1hc2tgLiBUaGF0J3MgaW50ZXJlc3RpbmcsIHN1Z2dlc3RpbmcgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3VlcyBhbmQgdGhlIG5lZWQgZm9yIGNhcmVmdWwgbm9kZSBtYXNrIHVwZGF0ZXMuIFRoZSB1c2Ugb2YgYSBzY3JhdGNoIG5vZGVtYXNrIGFuZCBlcnJvciBoYW5kbGluZyBhcm91bmQgdGhlIGBtcG9sX3NldF9ub2RlbWFza2AgY2FsbCBpcyB0eXBpY2FsOyBpdCdzIHdoYXQgSSdkIGV4cGVjdC4gVGhlIGBtcG9sX3B1dGAgb24gZXJyb3IgaXMgYSBnb29kIHByYWN0aWNlIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50LCBlbnN1cmluZyB0aGF0IHRoZSBjcmVhdGVkIHBvbGljeSBkb2Vzbid0IGxlYWsgaWYgdGhlIHNldCBvcGVyYXRpb24gZmFpbHMuXG5cbk15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIGBtcG9sX25ld2AgYW5kIGBtcG9sX3NldF9ub2RlbWFza2AuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBgc3RydWN0IG1lbXBvbGljeWAgaXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCwgYW5kIHdoYXQgdGhlIGBtcG9sX3NldF9ub2RlbWFza2AgZnVuY3Rpb24gaXMgYWN0dWFsbHkgZG9pbmcgdW5kZXIgdGhlIGhvb2QuIFNwZWNpZmljYWxseSwgSSdtIGludGVyZXN0ZWQgaW4gaG93IGl0IGhhbmRsZXMgdGhlIHByb3ZpZGVkIGBub2Rlc2AgbWFzayBhbmQgYW55IHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgc3lzdGVtJ3MgbWVtb3J5IG1hbmFnZW1lbnQgc3RydWN0dXJlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgbG9ja2luZyBhcyB3ZWxsLiBJJ2xsIG5lZWQgdG8gY2hlY2sgaG93IGl0IGFjdHVhbGx5IHNldHMgdGhlIG5vZGVtYXNrIHRvIGtub3cgaWYgdGhlcmUgaXMgYW4gaXNzdWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNTg1LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MzkuMDU3MDYwODM5WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NjM0NjUyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtcG9sX25ld3xtcG9sX3NldF9ub2RlbWFza1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1wb2xpY3kuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1wb2xpY3kuYz0zODg9c3RhdGljIHZvaWQgbXBvbF9yZWxhdGl2ZV9ub2RlbWFzayhub2RlbWFza190ICpyZXQsIGNvbnN0IG5vZGVtYXNrX3QgKm9yaWcsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zOTUtXFxubW0vbWVtcG9saWN5LmM6Mzk2OnN0YXRpYyBpbnQgbXBvbF9uZXdfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLCBjb25zdCBub2RlbWFza190ICpub2RlcylcXG5tbS9tZW1wb2xpY3kuYy0zOTcte1xcbi0tXFxubW0vbWVtcG9saWN5LmMtNDAzLVxcbm1tL21lbXBvbGljeS5jOjQwNDpzdGF0aWMgaW50IG1wb2xfbmV3X3ByZWZlcnJlZChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxcbm1tL21lbXBvbGljeS5jLTQwNS17XFxuLS1cXG5tbS9tZW1wb2xpY3kuYy00MTQtLypcXG5tbS9tZW1wb2xpY3kuYzo0MTU6ICogbXBvbF9zZXRfbm9kZW1hc2sgaXMgY2FsbGVkIGFmdGVyIG1wb2xfbmV3KCkgdG8gc2V0IHVwIHRoZSBub2RlbWFzaywgaWZcXG5tbS9tZW1wb2xpY3kuYzo0MTY6ICogYW55LCBmb3IgdGhlIG5ldyBwb2xpY3kuICBtcG9sX25ldygpIGhhcyBhbHJlYWR5IHZhbGlkYXRlZCB0aGUgbm9kZXNcXG5tbS9tZW1wb2xpY3kuYy00MTctICogcGFyYW1ldGVyIHdpdGggcmVzcGVjdCB0byB0aGUgcG9saWN5IG1vZGUgYW5kIGZsYWdzLlxcbi0tXFxubW0vbWVtcG9saWN5LmMtNDIxLSAqL1xcbm1tL21lbXBvbGljeS5jOjQyMjpzdGF0aWMgaW50IG1wb2xfc2V0X25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcXG5tbS9tZW1wb2xpY3kuYy00MjMtXFx0XFx0ICAgICBjb25zdCBub2RlbWFza190ICpub2Rlcywgc3RydWN0IG5vZGVtYXNrX3NjcmF0Y2ggKm5zYylcXG4tLVxcbm1tL21lbXBvbGljeS5jLTQ1Ni0gKiBUaGlzIGZ1bmN0aW9uIGp1c3QgY3JlYXRlcyBhIG5ldyBwb2xpY3ksIGRvZXMgc29tZSBjaGVjayBhbmQgc2ltcGxlXFxubW0vbWVtcG9saWN5LmM6NDU3OiAqIGluaXRpYWxpemF0aW9uLiBZb3UgbXVzdCBpbnZva2UgbXBvbF9zZXRfbm9kZW1hc2soKSB0byBzZXQgbm9kZXMuXFxubW0vbWVtcG9saWN5LmMtNDU4LSAqL1xcbm1tL21lbXBvbGljeS5jOjQ1OTpzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqbXBvbF9uZXcodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxubW0vbWVtcG9saWN5LmMtNDYwLVxcdFxcdFxcdFxcdCAgbm9kZW1hc2tfdCAqbm9kZXMpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz01OTU9c3RhdGljIGNvbnN0IHN0cnVjdCBtZW1wb2xpY3lfb3BlcmF0aW9ucyBtcG9sX29wc1tNUE9MX01BWF0gPSB7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYy01OTktXFx0W01QT0xfSU5URVJMRUFWRV0gPSB7XFxubW0vbWVtcG9saWN5LmM6NjAwOlxcdFxcdC5jcmVhdGUgPSBtcG9sX25ld19ub2RlbWFzayxcXG5tbS9tZW1wb2xpY3kuYy02MDEtXFx0XFx0LnJlYmluZCA9IG1wb2xfcmViaW5kX25vZGVtYXNrLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtNjAzLVxcdFtNUE9MX1BSRUZFUlJFRF0gPSB7XFxubW0vbWVtcG9saWN5LmM6NjA0OlxcdFxcdC5jcmVhdGUgPSBtcG9sX25ld19wcmVmZXJyZWQsXFxubW0vbWVtcG9saWN5LmMtNjA1LVxcdFxcdC5yZWJpbmQgPSBtcG9sX3JlYmluZF9wcmVmZXJyZWQsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy02MDctXFx0W01QT0xfQklORF0gPSB7XFxubW0vbWVtcG9saWN5LmM6NjA4OlxcdFxcdC5jcmVhdGUgPSBtcG9sX25ld19ub2RlbWFzayxcXG5tbS9tZW1wb2xpY3kuYy02MDktXFx0XFx0LnJlYmluZCA9IG1wb2xfcmViaW5kX25vZGVtYXNrLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtNjE0LVxcdFtNUE9MX1BSRUZFUlJFRF9NQU5ZXSA9IHtcXG5tbS9tZW1wb2xpY3kuYzo2MTU6XFx0XFx0LmNyZWF0ZSA9IG1wb2xfbmV3X25vZGVtYXNrLFxcbm1tL21lbXBvbGljeS5jLTYxNi1cXHRcXHQucmViaW5kID0gbXBvbF9yZWJpbmRfcHJlZmVycmVkLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtNjE4LVxcdFtNUE9MX1dFSUdIVEVEX0lOVEVSTEVBVkVdID0ge1xcbm1tL21lbXBvbGljeS5jOjYxOTpcXHRcXHQuY3JlYXRlID0gbXBvbF9uZXdfbm9kZW1hc2ssXFxubW0vbWVtcG9saWN5LmMtNjIwLVxcdFxcdC5yZWJpbmQgPSBtcG9sX3JlYmluZF9ub2RlbWFzayxcXG4tLVxcbm1tL21lbXBvbGljeS5jPTEwNjE9c3RhdGljIGludCBtYmluZF9yYW5nZShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMTA5MS0gKiBAZmxhZ3M6IE1QT0xfRl8qIGZsYWdzXFxubW0vbWVtcG9saWN5LmM6MTA5MjogKiBAbm9kZXM6IHRhcmdldCBub2RlbWFzaywgb3IgTlVMTCAoaW50ZXJwcmV0ZWQgcGVyIEBtb2RlOyBzZWUgbXBvbF9uZXcoKSlcXG5tbS9tZW1wb2xpY3kuYy0xMDkzLSAqXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0xMTAwPXN0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeV9jcmVhdGUodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMTA5LVxcbm1tL21lbXBvbGljeS5jOjExMTA6XFx0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcXG5tbS9tZW1wb2xpY3kuYy0xMTExLVxcdGlmIChJU19FUlIocG9sKSlcXG4tLVxcbm1tL21lbXBvbGljeS5jLTExMTQtXFx0dGFza19sb2NrKGN1cnJlbnQpO1xcbm1tL21lbXBvbGljeS5jOjExMTU6XFx0ZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBub2Rlcywgc2NyYXRjaCk7XFxubW0vbWVtcG9saWN5LmMtMTExNi1cXHR0YXNrX3VubG9jayhjdXJyZW50KTtcXG4tLVxcbm1tL21lbXBvbGljeS5jPTExMjc9c3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTExMzYtXFxubW0vbWVtcG9saWN5LmM6MTEzNzpcXHRuZXcgPSBtcG9sX25ldyhtb2RlLCBmbGFncywgbm9kZXMpO1xcbm1tL21lbXBvbGljeS5jLTExMzgtXFx0aWYgKElTX0VSUihuZXcpKSB7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMTQzLVxcdHRhc2tfbG9jayhjdXJyZW50KTtcXG5tbS9tZW1wb2xpY3kuYzoxMTQ0OlxcdHJldCA9IG1wb2xfc2V0X25vZGVtYXNrKG5ldywgbm9kZXMsIHNjcmF0Y2gpO1xcbm1tL21lbXBvbGljeS5jLTExNDUtXFx0aWYgKHJldCkge1xcbi0tXFxubW0vbWVtcG9saWN5LmM9MTU0Nj1zdGF0aWMgbG9uZyBkb19tYmluZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbixcXG4tLVxcbm1tL21lbXBvbGljeS5jLTE1NzgtXFxubW0vbWVtcG9saWN5LmM6MTU3OTpcXHRuZXcgPSBtcG9sX25ldyhtb2RlLCBtb2RlX2ZsYWdzLCBubWFzayk7XFxubW0vbWVtcG9saWN5LmMtMTU4MC1cXHRpZiAoSVNfRVJSKG5ldykpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xNTk1LVxcdFxcdFxcdG1tYXBfd3JpdGVfbG9jayhtbSk7XFxubW0vbWVtcG9saWN5LmM6MTU5NjpcXHRcXHRcXHRlcnIgPSBtcG9sX3NldF9ub2RlbWFzayhuZXcsIG5tYXNrLCBzY3JhdGNoKTtcXG5tbS9tZW1wb2xpY3kuYy0xNTk3LVxcdFxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0zMTk5PXN0YXRpYyBpbnQgc2hhcmVkX3BvbGljeV9yZXBsYWNlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMyMDMtXFx0c3RydWN0IHNwX25vZGUgKm5fbmV3ID0gTlVMTDtcXG5tbS9tZW1wb2xpY3kuYzozMjA0OlxcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfbmV3ID0gTlVMTDtcXG5tbS9tZW1wb2xpY3kuYy0zMjA1LVxcdGludCByZXQgPSAwO1xcbi0tXFxubW0vbWVtcG9saWN5LmMtMzIyMy1cXG5tbS9tZW1wb2xpY3kuYzozMjI0OlxcdFxcdFxcdFxcdCptcG9sX25ldyA9ICpuLVxcdTAwM2Vwb2xpY3k7XFxubW0vbWVtcG9saWN5LmM6MzIyNTpcXHRcXHRcXHRcXHRhdG9taWNfc2V0KFxcdTAwMjZtcG9sX25ldy1cXHUwMDNlcmVmY250LCAxKTtcXG5tbS9tZW1wb2xpY3kuYzozMjI2OlxcdFxcdFxcdFxcdHNwX25vZGVfaW5pdChuX25ldywgZW5kLCBuLVxcdTAwM2VlbmQsIG1wb2xfbmV3KTtcXG5tbS9tZW1wb2xpY3kuYy0zMjI3LVxcdFxcdFxcdFxcdG4tXFx1MDAzZWVuZCA9IHN0YXJ0O1xcbi0tXFxubW0vbWVtcG9saWN5LmMtMzIyOS1cXHRcXHRcXHRcXHRuX25ldyA9IE5VTEw7XFxubW0vbWVtcG9saWN5LmM6MzIzMDpcXHRcXHRcXHRcXHRtcG9sX25ldyA9IE5VTEw7XFxubW0vbWVtcG9saWN5LmMtMzIzMS1cXHRcXHRcXHRcXHRicmVhaztcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMyNDQtZXJyX291dDpcXG5tbS9tZW1wb2xpY3kuYzozMjQ1OlxcdGlmIChtcG9sX25ldylcXG5tbS9tZW1wb2xpY3kuYzozMjQ2OlxcdFxcdG1wb2xfcHV0KG1wb2xfbmV3KTtcXG5tbS9tZW1wb2xpY3kuYy0zMjQ3LVxcdGlmIChuX25ldylcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMyNTctXFx0XFx0Z290byBlcnJfb3V0O1xcbm1tL21lbXBvbGljeS5jOjMyNTg6XFx0bXBvbF9uZXcgPSBrbWVtX2NhY2hlX2FsbG9jKHBvbGljeV9jYWNoZSwgR0ZQX0tFUk5FTCk7XFxubW0vbWVtcG9saWN5LmM6MzI1OTpcXHRpZiAoIW1wb2xfbmV3KVxcbm1tL21lbXBvbGljeS5jLTMyNjAtXFx0XFx0Z290byBlcnJfb3V0O1xcbm1tL21lbXBvbGljeS5jOjMyNjE6XFx0YXRvbWljX3NldChcXHUwMDI2bXBvbF9uZXctXFx1MDAzZXJlZmNudCwgMSk7XFxubW0vbWVtcG9saWN5LmMtMzI2Mi1cXHRnb3RvIHJlc3RhcnQ7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0zMjc1PXZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxcbi0tXFxubW0vbWVtcG9saWN5LmMtMzI5MC1cXHRcXHQvKiBjb250ZXh0dWFsaXplIHRoZSB0bXBmcyBtb3VudCBwb2ludCBtZW1wb2xpY3kgdG8gdGhpcyBmaWxlICovXFxubW0vbWVtcG9saWN5LmM6MzI5MTpcXHRcXHRucG9sID0gbXBvbF9uZXcobXBvbC1cXHUwMDNlbW9kZSwgbXBvbC1cXHUwMDNlZmxhZ3MsIFxcdTAwMjZtcG9sLVxcdTAwM2V3LnVzZXJfbm9kZW1hc2spO1xcbm1tL21lbXBvbGljeS5jLTMyOTItXFx0XFx0aWYgKElTX0VSUihucG9sKSlcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMyOTUtXFx0XFx0dGFza19sb2NrKGN1cnJlbnQpO1xcbm1tL21lbXBvbGljeS5jOjMyOTY6XFx0XFx0cmV0ID0gbXBvbF9zZXRfbm9kZW1hc2sobnBvbCwgXFx1MDAyNm1wb2wtXFx1MDAzZXcudXNlcl9ub2RlbWFzaywgc2NyYXRjaCk7XFxubW0vbWVtcG9saWN5LmMtMzI5Ny1cXHRcXHR0YXNrX3VubG9jayhjdXJyZW50KTtcXG4tLVxcbm1tL21lbXBvbGljeS5jPTM1MDg9aW50IG1wb2xfcGFyc2Vfc3RyKGNoYXIgKnN0ciwgc3RydWN0IG1lbXBvbGljeSAqKm1wb2wpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zNTYwLVxcdFxcdC8qXFxubW0vbWVtcG9saWN5LmM6MzU2MTpcXHRcXHQgKiBEb24ndCBhbGxvdyBhIG5vZGVsaXN0OyAgbXBvbF9uZXcoKSBjaGVja3MgZmxhZ3NcXG5tbS9tZW1wb2xpY3kuYy0zNTYyLVxcdFxcdCAqL1xcbi0tXFxubW0vbWVtcG9saWN5LmMtMzU5NS1cXG5tbS9tZW1wb2xpY3kuYzozNTk2OlxcdG5ldyA9IG1wb2xfbmV3KG1vZGUsIG1vZGVfZmxhZ3MsIFxcdTAwMjZub2Rlcyk7XFxubW0vbWVtcG9saWN5LmMtMzU5Ny1cXHRpZiAoSVNfRVJSKG5ldykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjM5LjE1MzQxMjI4NFoiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1NjcwNzk0NjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNZW1vcnkgUG9saWN5IENyZWF0aW9uIGFuZCBCaW5kaW5nKipcblxuT2theSwgbGV0J3MgZGl2ZSBiYWNrIGludG8gYG1lbXBvbGljeV9jcmVhdGVgIHdpdGhpbiBgbW0vbWVtcG9saWN5LmNgLiBJIG5lZWQgdG8gc29saWRpZnkgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgY29tbW9uIHBhdHRlcm5zIGluIGBkb19zZXRfbWVtcG9saWN5YCBhbmQgYG1wb2xfc2hhcmVkX3BvbGljeV9pbml0YC4gUmlnaHQsIGl0IGFsbG9jYXRlcyBhIHRlbXBvcmFyeSBzY3JhdGNoIHNwYWNlLCBjYWxscyBgbXBvbF9uZXdgIHdpdGggdGhlIG1vZGUsIGZsYWdzLCBhbmQgbm9kZXMsIGdyYWJzIHRoZSBgdGFza19sb2NrYCBvbiB0aGUgY3VycmVudCB0YXNrLCB0aGVuIGNhbGxzIGBtcG9sX3NldF9ub2RlbWFza2AgdG8gYWN0dWFsbHkgYXBwbHkgdGhlIG5vZGUgbWFzayB0byB0aGUgcG9saWN5IHVzaW5nIHRoYXQgc2NyYXRjaCBzcGFjZSwgcmVsZWFzZXMgdGhlIGxvY2ssIGFuZCB0aGVuIGZyZWVzIHRoZSB0ZW1wb3Jhcnkgc2NyYXRjaC4gVGhhdCdzIHRoZSBiYXNpYyB3b3JrZmxvdy5cblxuTm93LCBsZXQncyBleGFtaW5lIGBrdm1fZ21lbV9iaW5kX25vZGVgLiBIZXJlJ3MgdGhlIGNvZGU6XG5cbmBgYGNcbnN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxue1xuXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG5cdG5vZGVtYXNrX3Qgbm9kZXM7XG5cdGludCBlcnI7XG5cblx0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcblx0XHRyZXR1cm4gLUVJTlZBTDtcblxuXHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuXHRwb2wgPSBtZW1wb2xpY3lfY3JlYXRlKE1QT0xfQklORCwgMCwgXHUwMDI2bm9kZXMpO1xuXHRpZiAoSVNfRVJSKHBvbCkpXG5cdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcblxuXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCAwLFxuXHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcblx0bXBvbF9wdXQocG9sKTtcblx0cmV0dXJuIGVycjtcbn1cbmBgYFxuXG5UaGUgZnVuY3Rpb24gY2FsbHMgYG1lbXBvbGljeV9jcmVhdGVgIHdpdGggYE1QT0xfQklORGAsIG5vIGZsYWdzLCBhbmQgYSBgbm9kZXNgIG1hc2suIFRoaXMgYG5vZGVzYCB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCBvbiB0aGUgc3RhY2sgdXNpbmcgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZShcdTAwMjZub2Rlcywgbm9kZSlgLiBOZWVkIHRvIHF1aWNrbHkgdmVyaWZ5IGhvdyB0aGF0IGluaXRpYWxpemF0aW9uIGhhcHBlbnMuIEFoLCBpdCdzIGp1c3QgYSBgbm9kZXNfY2xlYXJgIGZvbGxvd2VkIGJ5IGEgYG5vZGVfc2V0YC4gU28sIHRoZSBgbm9kZW1hc2tgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBiZWluZyBwYXNzZWQuIEdvb2QuXG5cbk5leHQsIGl0IGNhbGxzIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYC4gTGV0J3MgcmVmcmVzaCBvdXIgbWVtb3J5IG9uIHRoYXQgZnVuY3Rpb246XG5cbmBgYGNcbmludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcblx0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG57XG5cdHN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMO1xuXHRpbnQgZXJyO1xuXG5cdGlmIChwb2wpIHtcblx0XHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xuXHRcdGlmICghbmV3KVxuXHRcdFx0cmV0dXJuIC1FTk9NRU07XG5cdH1cblx0ZXJyID0gc2hhcmVkX3BvbGljeV9yZXBsYWNlKHNwLCBzdGFydCwgZW5kLCBuZXcpO1xuXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG5cdFx0c3BfZnJlZShuZXcpO1xuXHRyZXR1cm4gZXJyO1xufVxuYGBgXG5cbk9rYXksIHNvIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBhbGxvY2F0ZXMgYW4gYHNwX25vZGVgIHZpYSBgc3BfYWxsb2NgIGlmIGEgcG9saWN5IGV4aXN0cy4gVGhlbiBgc3BfYWxsb2NgIGlzIGNhbGxlZCB3aXRoIHN0YXJ0LCBlbmQsIGFuZCB0aGUgcG9saWN5LiBJdCB1c2VzIGBrbWVtX2NhY2hlX2FsbG9jYCB0byBhbGxvY2F0ZSB0aGUgYHNwX25vZGVgIGFuZCB0aGVuIGluaXRpYWxpemVzIGl0IHZpYSBgc3Bfbm9kZV9pbml0KG4sIHN0YXJ0LCBlbmQsIHBvbClgLiBJIG5lZWQgdG8gcXVpY2tseSBnbGFuY2UgYXQgYHNwX2FsbG9jYCB0byBjb25maXJtIHdoYXQgdGhhdCBsb29rcyBsaWtlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTYyNiwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU4OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODo0NC44MjQyMTAwODRaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3Mzc1MzI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNwX2FsbG9jXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbXBvbGljeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbXBvbGljeS5jPTMxNjk9c3RhdGljIHZvaWQgc3Bfbm9kZV9pbml0KHN0cnVjdCBzcF9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMzE3Ni1cXG5tbS9tZW1wb2xpY3kuYzozMTc3OnN0YXRpYyBzdHJ1Y3Qgc3Bfbm9kZSAqc3BfYWxsb2ModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXFxubW0vbWVtcG9saWN5LmMtMzE3OC1cXHRcXHRcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0zMjc1PXZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxcbi0tXFxubW0vbWVtcG9saWN5LmMtMzMwMS1cXHRcXHQvKiBhbGxvYyBub2RlIGNvdmVyaW5nIGVudGlyZSBmaWxlOyBhZGRzIHJlZiB0byBmaWxlJ3MgbnBvbCAqL1xcbm1tL21lbXBvbGljeS5jOjMzMDI6XFx0XFx0c24gPSBzcF9hbGxvYygwLCBNQVhfTEZTX0ZJTEVTSVpFIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsIG5wb2wpO1xcbm1tL21lbXBvbGljeS5jLTMzMDMtXFx0XFx0aWYgKHNuKVxcbi0tXFxubW0vbWVtcG9saWN5LmM9MzMzMj1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zMzM4LVxcdGlmIChwb2wpIHtcXG5tbS9tZW1wb2xpY3kuYzozMzM5OlxcdFxcdG5ldyA9IHNwX2FsbG9jKHN0YXJ0LCBlbmQsIHBvbCk7XFxubW0vbWVtcG9saWN5LmMtMzM0MC1cXHRcXHRpZiAoIW5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6NDQuODcxNTkzOTcyWiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNTQxMTcyNTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgaW1tZWRpYXRlIHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB0aGUgTm9kZSBJbml0aWFsaXphdGlvbiBhbmQgQWxsb2NhdGlvbiBGdW5jdGlvbnMqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiBob3cgb3VyIHN5c3RlbSBoYW5kbGVzIG5vZGUgaW5pdGlhbGl6YXRpb24gYW5kIGFsbG9jYXRpb24uIFNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IGBzcF9ub2RlX2luaXRgIGFuZCBgc3BfYWxsb2NgLiBJIG5lZWQgdG8gZW5zdXJlIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGlzIHNvdW5kIGFuZCB0aGF0IHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVneSBpcyBzdGlsbCBlZmZpY2llbnQgYW5kIGRvZXNuJ3QgaGF2ZSBhbnkgaGlkZGVuIGdvdGNoYXMuIEkgd2FudCB0byBxdWlja2x5IHZlcmlmeSB0aGF0IHdlJ3JlIHN0aWxsIGhhbmRsaW5nIGVkZ2UgY2FzZXMgY29ycmVjdGx5LCBlc3BlY2lhbGx5IGFyb3VuZCByZXNvdXJjZSBjb250ZW50aW9uIG9yIHBvdGVudGlhbCBtZW1vcnkgbGVha3MuIEl04oCZcyBhbHNvIGNydWNpYWwgdG8gc2VlIGlmIHRoZXJlIGhhdmUgYmVlbiBhbnkgcmVjZW50IGNoYW5nZXMgaW4gdGhlc2UgYXJlYXMuIExldCdzIHNlZSB3aGF0IHRoZSBjb2RlIGhhcyB0byBzYXkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3MzIwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6NDYuOTI1NzE0MjM0WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5ODAyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1wb2xpY3kuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMTY4LFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIzMTY4OlxcdFxcbjMxNjk6XFx0c3RhdGljIHZvaWQgc3Bfbm9kZV9pbml0KHN0cnVjdCBzcF9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbjMxNzA6XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcXG4zMTcxOlxcdHtcXG4zMTcyOlxcdFxcdG5vZGUtXFx1MDAzZXN0YXJ0ID0gc3RhcnQ7XFxuMzE3MzpcXHRcXHRub2RlLVxcdTAwM2VlbmQgPSBlbmQ7XFxuMzE3NDpcXHRcXHRub2RlLVxcdTAwM2Vwb2xpY3kgPSBwb2w7XFxuMzE3NTpcXHR9XFxuMzE3NjpcXHRcXG4zMTc3OlxcdHN0YXRpYyBzdHJ1Y3Qgc3Bfbm9kZSAqc3BfYWxsb2ModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXFxuMzE3ODpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuMzE3OTpcXHR7XFxuMzE4MDpcXHRcXHRzdHJ1Y3Qgc3Bfbm9kZSAqbjtcXG4zMTgxOlxcdFxcdHN0cnVjdCBtZW1wb2xpY3kgKm5ld3BvbDtcXG4zMTgyOlxcdFxcbjMxODM6XFx0XFx0biA9IGttZW1fY2FjaGVfYWxsb2Moc25fY2FjaGUsIEdGUF9LRVJORUwpO1xcbjMxODQ6XFx0XFx0aWYgKCFuKVxcbjMxODU6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMzE4NjpcXHRcXG4zMTg3OlxcdFxcdG5ld3BvbCA9IG1wb2xfZHVwKHBvbCk7XFxuMzE4ODpcXHRcXHRpZiAoSVNfRVJSKG5ld3BvbCkpIHtcXG4zMTg5OlxcdFxcdFxcdGttZW1fY2FjaGVfZnJlZShzbl9jYWNoZSwgbik7XFxuMzE5MDpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4zMTkxOlxcdFxcdH1cXG4zMTkyOlxcdFxcdG5ld3BvbC1cXHUwMDNlZmxhZ3MgfD0gTVBPTF9GX1NIQVJFRDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6NDYuOTI1OTE0OTE0WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQwNDk1OTI5NzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGBrdm1fZ21lbV9jcmVhdGVgIGZvciBQb3RlbnRpYWwgVnVsbmVyYWJpbGl0aWVzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGt2bV9nbWVtX2NyZWF0ZWAgZnVuY3Rpb24gd2l0aGluIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYC4gVGhlIGNvcmUgc2VlbXMgdG8gYmUgaGVyZTpcbmBgYGNcbmludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbntcblx0bG9mZl90IHNpemUgPSBhcmdzLVx1MDAzZXNpemU7XG5cdHU2NCBmbGFncyA9IGFyZ3MtXHUwMDNlZmxhZ3M7XG5cdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuXG5cdGlmIChmbGFncyBcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcblx0XHRyZXR1cm4gLUVJTlZBTDtcblxuXHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcblx0XHRyZXR1cm4gLUVJTlZBTDtcblxuXHRpZiAoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XG5cdFx0aWYgKGFyZ3MtXHUwMDNlcGFkIHx8IGFyZ3MtXHUwMDNlbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcblx0XHRcdHJldHVybiAtRUlOVkFMO1xuXHRcdG5vZGUgPSBhcmdzLVx1MDAzZW5vZGU7XG5cdH0gZWxzZSBpZiAoYXJncy1cdTAwM2Vub2RlIHx8IGFyZ3MtXHUwMDNlcGFkKSB7XG5cdFx0cmV0dXJuIC1FSU5WQUw7XG5cdH1cblxuXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncywgbm9kZSk7XG59XG5gYGBcblxuTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IEknbSBzY2FubmluZyB0aGlzIGNvZGUsIGxvb2tpbmcgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMsIGFuZCBhIHJlZCBmbGFnIGp1c3Qgd2VudCB1cC4gIEkgc2VlIGNoZWNrcyBmb3IgYHNpemVgLCBgZmxhZ3NgLCBhbmQgYG5vZGVgLCBidXQuLi4gaG9sZCBvbi4gV2hlcmUncyB0aGUgdmFsaWRhdGlvbiBmb3IgYGFyZ3MtXHUwMDNlcmVzZXJ2ZWRgPyBJcyB0aGlzIGEgbmV3IHN0cnVjdHVyZSBvciBmdW5jdGlvbj8gTGV0J3MgYXNzdW1lIHRoYXQgdGhlcmUncyBhIHJlYXNvbiBmb3IgdGhpcyBvbWlzc2lvbiwgYnV0IGl0J3MgaW1wb3J0YW50IHRvIGxvb2shIEkgbmVlZCB0byBxdWlja2x5IGRldGVybWluZSB3aGV0aGVyIGBhcmdzLVx1MDAzZXJlc2VydmVkYCBtaWdodCBoYXZlIGJlZW4gdXNlZCBpbiBhbnkgb3RoZXIgcGxhY2UuIEl0J3MgcmVhbGx5IGVhc3kgdG8gbWFrZSBhbiBlcnJvciBvbiB0aGVzZSBuZXcgQVBJJ3MgYW5kIG5vdCBoYW5kbGUgYWxsIHBvdGVudGlhbCBiYWQgdmFsdWVzLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUgd2lkZXIgY29udGV4dC4gSSBuZWVkIHRvIGdyZXAgdGhlIHJlc3Qgb2YgYGd1ZXN0X21lbWZkLmNgIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgZmlsZXMgb3IgaGVhZGVyIGZpbGVzIHRvIHNlZSBpZiBhbmQgd2hlcmUgdGhlIGBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgYW5kIGhvdyBpdCdzIHVzZWQuIE1heWJlIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlIGhhZCBwYWRkaW5nLCBhbmQgdGhpcyBmaWVsZCBpcyBtZWFudCBmb3IgYWxpZ25tZW50LCBpbiB3aGljaCBjYXNlIGl0IGlzIGV4cGVjdGVkIHRvIGJlIGlnbm9yZWQuIEkgd2FudCB0byBzZWUgaG93IGBhcmdzYCB3YXMgaGFuZGxlZCBiZWZvcmUgdGhpcyBwYXJ0aWN1bGFyIHBhdGNoIG9yIGNvbW1pdCwgYW5kIGlmIGFueSBwcmV2aW91cyB2ZXJzaW9ucyBpbmNsdWRlZCBhIGNoZWNrIGZvciB0aGUgYHJlc2VydmVkYCBmaWVsZC4gVGhhdCB3b3VsZCBjb25maXJtIHdoZXRoZXIgdGhpcyBpcyBhIG5ld2x5IGludHJvZHVjZWQgb3ZlcnNpZ2h0LCBvciB3aGV0aGVyIGl0IHdhcyBhbHdheXMgaW50ZW5kZWQgdG8gYmUgaWdub3JlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc4NzIsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODo1MC45NzU1MTE4MDJaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAyNDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTkwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTkwOlxcdFxcdFxcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XFxuIDU5MTpcXHRcXHRcXHRpZiAoZXJyKVxcbiA1OTI6XFx0XFx0XFx0XFx0Z290byBlcnJfaW5vZGU7XFxuIDU5MzpcXHRcXHR9XFxuIDU5NDpcXHRcXG4gNTk1OlxcdFxcdGZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsIFxcdTAwMjZrdm1fZ21lbV9mb3BzKTtcXG4gNTk2OlxcdFxcdGlmIChJU19FUlIoZmlsZSkpIHtcXG4gNTk3OlxcdFxcdFxcdGVyciA9IFBUUl9FUlIoZmlsZSk7XFxuIDU5ODpcXHRcXHRcXHRnb3RvIGVycl9pbm9kZTtcXG4gNTk5OlxcdFxcdH1cXG4gNjAwOlxcdFxcbiA2MDE6XFx0XFx0ZmlsZS1cXHUwMDNlZl9mbGFncyB8PSBPX0xBUkdFRklMRTtcXG4gNjAyOlxcdFxcdGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YSA9IGY7XFxuIDYwMzpcXHRcXG4gNjA0OlxcdFxcdGt2bV9nZXRfa3ZtKGt2bSk7XFxuIDYwNTpcXHRcXHRmLVxcdTAwM2Vrdm0gPSBrdm07XFxuIDYwNjpcXHRcXHR4YV9pbml0KFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncyk7XFxuIDYwNzpcXHRcXHRsaXN0X2FkZChcXHUwMDI2Zi1cXHUwMDNlZW50cnksIFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2VnbWVtX2ZpbGVfbGlzdCk7XFxuIDYwODpcXHRcXG4gNjA5OlxcdFxcdGZkX2luc3RhbGwoZmQsIGZpbGUpO1xcbiA2MTA6XFx0XFx0cmV0dXJuIGZkO1xcbiA2MTE6XFx0XFxuIDYxMjpcXHRlcnJfaW5vZGU6XFxuIDYxMzpcXHRcXHRpcHV0KGlub2RlKTtcXG4gNjE0OlxcdGVycl9mb3BzOlxcbiA2MTU6XFx0XFx0Zm9wc19wdXQoXFx1MDAyNmt2bV9nbWVtX2ZvcHMpO1xcbiA2MTY6XFx0ZXJyX2dtZW06XFxuIDYxNzpcXHRcXHRrZnJlZShmKTtcXG4gNjE4OlxcdGVycl9mZDpcXG4gNjE5OlxcdFxcdHB1dF91bnVzZWRfZmQoZmQpO1xcbiA2MjA6XFx0XFx0cmV0dXJuIGVycjtcXG4gNjIxOlxcdH1cXG4gNjIyOlxcdFxcbiA2MjM6XFx0aW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxcbiA2MjQ6XFx0e1xcbiA2MjU6XFx0XFx0bG9mZl90IHNpemUgPSBhcmdzLVxcdTAwM2VzaXplO1xcbiA2MjY6XFx0XFx0dTY0IGZsYWdzID0gYXJncy1cXHUwMDNlZmxhZ3M7XFxuIDYyNzpcXHRcXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcXG4gNjI4OlxcdFxcbiA2Mjk6XFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcXG4gNjMwOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA2MzE6XFx0XFxuIDYzMjpcXHRcXHRpZiAoc2l6ZSBcXHUwMDNjPSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpXFxuIDYzMzpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjM0OlxcdFxcbiA2MzU6XFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcXG4gNjM2OlxcdFxcdFxcdGlmIChhcmdzLVxcdTAwM2VwYWQgfHwgYXJncy1cXHUwMDNlbm9kZSBcXHUwMDNlPSBNQVhfTlVNTk9ERVMpXFxuIDYzNzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjM4OlxcdFxcdFxcdG5vZGUgPSBhcmdzLVxcdTAwM2Vub2RlO1xcbiA2Mzk6XFx0XFx0fSBlbHNlIGlmIChhcmdzLVxcdTAwM2Vub2RlIHx8IGFyZ3MtXFx1MDAzZXBhZCkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODo1MC45NzU2MTY2NDJaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTEwMDc4MjA5NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQW5hbHlzaXMgb2YgR3Vlc3QgTWVtZmQgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCB0aGUgYGFyZ3NgIHBhc3NlZCBpbnRvIGBrdm1fZ21lbV9jcmVhdGVgIGFmdGVyIGBjb3B5X2Zyb21fdXNlcmAgaW4gYGt2bV92bV9pb2N0bGAgaXMgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhlbiB0aGUgY3JpdGljYWwgdGhpbmcgaXMgdGhhdCBub3RoaW5nIGlzIGNvcGllZCAqYmFjayogdG8gdXNlcnNwYWNlLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGxlYWtlZC4gR29vZC4gSSdtIGFsc28gY29uZmlybWluZyB0aGF0IG5vIGtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlcnNwYWNlIGFyZSBtb2RpZmllZC5cblxuTm93LCBsZXQncyBtZXRpY3Vsb3VzbHkgY2hlY2sgZm9yIGJyYW5jaGVzIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgd2hpY2ggaXMgd2hlcmUgS01TQU4gdXN1YWxseSBiaXRlcy4gSSBzZWUgYG5vZGVzYCBpbiBga3ZtX2dtZW1fYmluZF9ub2RlYCBnZXRzIGluaXRpYWxpemVkIHdpdGggYGluaXRfbm9kZW1hc2tfb2Zfbm9kZWAuIGBzY3JhdGNoYCBpbiBgbWVtcG9saWN5X2NyZWF0ZWAgaXMgY292ZXJlZCBieSBgTk9ERU1BU0tfU0NSQVRDSGAuIGBuZXdgIGluIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBpcyBpbml0aWFsaXplZCB0byBOVUxMIG9yIGBzcF9hbGxvY2AuIFRoZSBgZ3Vlc3RfbWVtZmRgIGFyZ3VtZW50LCByZWFkIGZyb20gdXNlcnNwYWNlIHZpYSBgY29weV9mcm9tX3VzZXJgLCBpcyBvZiBwYXJ0aWN1bGFyIG5vdGUsIGJ1dCBzZWVtcyBzYWZlLiBBbmQsIGZpbmFsbHksIGBub2RlYCBpbiBga3ZtX2dtZW1fY3JlYXRlYCBpcyBpbml0aWFsaXplZCwgdG9vLiBBbGwgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4gTm8gbmV3IGRhdGEgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2Ug4oCTIG5vIGluZm9ybWF0aW9uIGxlYWtzLiBUaGF0J3MgYSBodWdlIHdpbi5cblxuTGV0J3MgcnVuIHRocm91Z2ggdGhlIEtNU0FOIGNyaXRlcmlhIG1ldGhvZGljYWxseSwgdG8gbWFrZSBzdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYW55dGhpbmcuXG5cbjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlcnNwYWNlKio6IE5vIGBjb3B5X3RvX3VzZXJgIGhlcmUsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgc2ltcGx5IHJldHVybnMgYW4gRkQuIFRoaXMgaXMgY2xlYW4uXG4yLiAgKipDb25kaXRpb25hbCBsb2dpYyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyoqOiBOb3BlLCBhbGwgc3RhY2sgdmFyaWFibGVzIGxpa2UgYG5vZGVzYCwgYHNjcmF0Y2hgLCBgbm9kZWAgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLlxuMy4gICoqQWxsb2NhdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyoqOiBgbWVtcG9saWN5X2NyZWF0ZWAgYnVpbGRzIGEgdmFsaWRhdGVkIGBzdHJ1Y3QgbWVtcG9saWN5YCB1c2luZyBzdGFuZGFyZCBgbXBvbF9uZXdgIC8gYG1wb2xfc2V0X25vZGVtYXNrYC4gYHNwX2FsbG9jYCBjb3ZlcnMgYHNwX25vZGVgIGluaXRpYWxpemF0aW9uLiBGaW5lLlxuNC4gICoqQm91bmRzIGNoZWNrcyBleHBvc2luZyB1bmluaXRpYWxpemVkIGJ5dGVzKio6IE5vdCByZWxldmFudCBoZXJlLlxuXG5UaGVyZWZvcmUsIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGFyZSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgdGhhdCBkbyBhcmlzZSAodXNlLWFmdGVyLWZyZWUsIHJlZmNvdW50IHByb2JsZW1zIGluIG1lbXBvbGljeSBvciBnbWVtKSB3b3VsZCBiZSBoYW5kbGVkIGJ5IEtBU0FOIOKAkyBhbmQgS0FTQU4gaXMgYWxyZWFkeSBlbmFibGVkLiBUaHVzLCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgLlxuXG5TbywgdGhlIEtNU0FOIHJlYXNvbmluZyBpczogS01TQU4gZGV0ZWN0cyByZWFkcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgaW5mbyBsZWFrcy4gVGhpcyBwYXRjaCBhZGRzIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgYW5kIHJlbGF0ZWQgaGVscGVycyBpbiBgbW0vbWVtcG9saWN5LmNgLiBUaGUgaW9jdGwgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGNvcGllcyBhcmd1bWVudHMgZnJvbSB1c2Vyc3BhY2UgYnV0IGRvZXNuJ3QgY29weSBrZXJuZWwgZGF0YSBiYWNrLiBBbGwgdmFyaWFibGVzIGFuZCBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZC4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IGlzc3VlcyBhcmUgS0FTQU4ncyBkb21haW4uIE5vIEtNU0FOIG5lZWRlZC5cblxuT2theSwgdGltZSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTk0OTcsIk91dHB1dFRva2VucyI6MzM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODUwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDk6MDEuOTgzNDQyNDc1WiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg0MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaW4gS1ZNJ3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cXG5cXG5LTVNBTiB2cyBLQVNBTiBhcHBsaWNhYmlsaXR5Olxcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cXG4tIEluIHRoaXMgcGF0Y2gsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcmVhZHMgdXNlciBhcmd1bWVudHMgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgaW50ZWdlcjsgbm8ga2VybmVsIHN0cnVjdHVyZXMsIHBhZGRpbmcsIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UuXFxuLSBBbGwgbmV3bHkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBzdGFjayBhbmQgaGVhcCB2YXJpYWJsZXMgKGUuZy4sIGBub2RlbWFza190IG5vZGVzYCBpbml0aWFsaXplZCB2aWEgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgpYCwgYHNjcmF0Y2hgIGluaXRpYWxpemVkIHZpYSBgTk9ERU1BU0tfU0NSQVRDSCgpYCwgYW5kIGBzdHJ1Y3Qgc3Bfbm9kZWAvYHN0cnVjdCBtZW1wb2xpY3lgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBzdGFuZGFyZCBtbSBoZWxwZXJzKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cXG4tIEFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIE5VTUEgcG9saWN5IHJlZmVyZW5jZSBjb3VudGluZywgbGlmZWN5Y2xlIGlzc3Vlcywgb3IgYWxsb2NhdGlvbiBmYWlsdXJlcykgZmFsbCB1bmRlciB0aGUgc2NvcGUgb2YgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaW4gS1ZNJ3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cXG5cXG5LTVNBTiB2cyBLQVNBTiBhcHBsaWNhYmlsaXR5Olxcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cXG4tIEluIHRoaXMgcGF0Y2gsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcmVhZHMgdXNlciBhcmd1bWVudHMgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgaW50ZWdlcjsgbm8ga2VybmVsIHN0cnVjdHVyZXMsIHBhZGRpbmcsIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UuXFxuLSBBbGwgbmV3bHkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBzdGFjayBhbmQgaGVhcCB2YXJpYWJsZXMgKGUuZy4sIGBub2RlbWFza190IG5vZGVzYCBpbml0aWFsaXplZCB2aWEgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgpYCwgYHNjcmF0Y2hgIGluaXRpYWxpemVkIHZpYSBgTk9ERU1BU0tfU0NSQVRDSCgpYCwgYW5kIGBzdHJ1Y3Qgc3Bfbm9kZWAvYHN0cnVjdCBtZW1wb2xpY3lgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBzdGFuZGFyZCBtbSBoZWxwZXJzKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cXG4tIEFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIE5VTUEgcG9saWN5IHJlZmVyZW5jZSBjb3VudGluZywgbGlmZWN5Y2xlIGlzc3Vlcywgb3IgYWxsb2NhdGlvbiBmYWlsdXJlcykgZmFsbCB1bmRlciB0aGUgc2NvcGUgb2YgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-03 18:52:23 +0000 UTC FinishedAt: 2026-09-03 19:09:04 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "e539025ff1f7351a42788c5a88aab59c26f5131b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "NUMA" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "e539025ff1f7351a42788c5a88aab59c26f5131b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "NUMA" ], "series_id": "78619b4c-8664-4bef-833f-0917bd20ca92" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "kvm_gmem_create", "kvm_gmem_bind_node", "mempolicy_create", "mpol_set_shared_policy_range", "mpol_set_shared_policy" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtOVU1BJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7a3ZtX2dtZW1fY3JlYXRlJiMzNDssCiAgICAmIzM0O2t2bV9nbWVtX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDttZW1wb2xpY3lfY3JlYXRlJiMzNDssCiAgICAmIzM0O21wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UmIzM0OywKICAgICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZyBpbiBLVk0mIzM5O3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cblxuS01TQU4gdnMgS0FTQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cbi0gSW4gdGhpcyBwYXRjaCwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCByZWFkcyB1c2VyIGFyZ3VtZW50cyB2aWEgYGNvcHlfZnJvbV91c2VyYCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBpbnRlZ2VyOyBubyBrZXJuZWwgc3RydWN0dXJlcywgcGFkZGluZywgb3IgYnVmZmVycyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZS5cbi0gQWxsIG5ld2x5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgc3RhY2sgYW5kIGhlYXAgdmFyaWFibGVzIChlLmcuLCBgbm9kZW1hc2tfdCBub2Rlc2AgaW5pdGlhbGl6ZWQgdmlhIGBpbml0X25vZGVtYXNrX29mX25vZGUoKWAsIGBzY3JhdGNoYCBpbml0aWFsaXplZCB2aWEgYE5PREVNQVNLX1NDUkFUQ0goKWAsIGFuZCBgc3RydWN0IHNwX25vZGVgL2BzdHJ1Y3QgbWVtcG9saWN5YCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRocm91Z2ggc3RhbmRhcmQgbW0gaGVscGVycykgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cbi0gQW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgTlVNQSBwb2xpY3kgcmVmZXJlbmNlIGNvdW50aW5nLCBsaWZlY3ljbGUgaXNzdWVzLCBvciBhbGxvY2F0aW9uIGZhaWx1cmVzKSBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIHRoZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSBmbGFnIGluIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGFuZCBhZGRzIHRoZSBtZW1wb2xpY3kgaGVscGVycyBtZW1wb2xpY3lfY3JlYXRlKCkgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKS4gVGhlc2UgY2hhbmdlcyBtb2RpZnkgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBpbiBtbS9tZW1wb2xpY3kuYyBhbmQgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYWU2ODk1NWE1OTIzZDI1ZTllMGFmOTU2OTQzMDU3OWU5NGM0MGY5ZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDMgMTk6MDc6MTUgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG5pbmRleCAwM2JmYzkyODY0YjZlLi43MzhlMjc2NjMzYzFlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhcbkBAIC03MzksNiAmIzQzOzczOSw5IEBAIHN0YXRpYyBpbmxpbmUgdTY0IGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moc3RydWN0IGt2bSAqa3ZtKVxuIFx0aWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKVxuIFx0XHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEO1xuIFxuJiM0MztcdGlmIChJU19FTkFCTEVEKENPTkZJR19OVU1BKSlcbiYjNDM7XHRcdGZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFO1xuJiM0MztcbiBcdHJldHVybiBmbGFncztcbiB9XG4gI2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbmluZGV4IDY1YzczMmQ0NDBkMmYuLjM5ODMxODE3NWNlYzcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG5AQCAtMTI0LDEwICYjNDM7MTI0LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpO1xuIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiBpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4mIzQzO1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiB2b2lkIG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCk7XG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0XHRcdCAgICBwZ29mZl90IGlkeCk7XG4gXG4mIzQzO3N0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeV9jcmVhdGUodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgbm9kZW1hc2tfdCAqbm9kZXMpO1xuJiM0MztcbiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTtcbiBzdHJ1Y3QgbWVtcG9saWN5ICpfX2dldF92bWFfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHBnb2ZmX3QgKmlseCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG5pbmRleCBhYzJkNzdkMTQ5NjM1Li44ZDNhZTdlMmVhZDhlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbkBAIC0xNjU4LDExICYjNDM7MTY1OCwxNCBAQCBzdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHtcbiAjZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcdF9JT1dSKEtWTUlPLCAgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpXG4gI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcdFx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXG4gI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEXHQoMVVMTCBcdTAwM2NcdTAwM2MgMSlcbiYjNDM7I2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERVx0KDFVTEwgXHUwMDNjXHUwMDNjIDIpXG4gXG4gc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQge1xuIFx0X191NjQgc2l6ZTtcbiBcdF9fdTY0IGZsYWdzO1xuLVx0X191NjQgcmVzZXJ2ZWRbNl07XG4mIzQzO1x0X191MzIgbm9kZTtcbiYjNDM7XHRfX3UzMiBwYWQ7XG4mIzQzO1x0X191NjQgcmVzZXJ2ZWRbNV07XG4gfTtcbiBcbiAjZGVmaW5lIEtWTV9QUkVfRkFVTFRfTUVNT1JZXHRfSU9XUihLVk1JTywgMHhkNSwgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5KVxuZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmNcbmluZGV4IDJhZDBhNWYxODI4MGEuLmNlMTBjZTQzNzQ2NDMgMTAwNjQ0XG4tLS0gYS9tbS9tZW1wb2xpY3kuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtcG9saWN5LmNcbkBAIC0xMDg1LDcgJiM0MzsxMDg1LDQ1IEBAIHN0YXRpYyBpbnQgbWJpbmRfcmFuZ2Uoc3RydWN0IHZtYV9pdGVyYXRvciAqdm1pLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTtcbiB9XG4gXG4tLyogU2V0IHRoZSBwcm9jZXNzIG1lbW9yeSBwb2xpY3kgKi9cbiYjNDM7LyoqXG4mIzQzOyAqIG1lbXBvbGljeV9jcmVhdGUgLSBidWlsZCBhIHZhbGlkYXRlZCwgY3B1c2V0LWNvbnRleHR1YWxpc2VkIG1lbXBvbGljeVxuJiM0MzsgKiBAbW9kZTogTVBPTF8qIG1vZGVcbiYjNDM7ICogQGZsYWdzOiBNUE9MX0ZfKiBmbGFnc1xuJiM0MzsgKiBAbm9kZXM6IHRhcmdldCBub2RlbWFzaywgb3IgTlVMTCAoaW50ZXJwcmV0ZWQgcGVyIEBtb2RlOyBzZWUgbXBvbF9uZXcoKSlcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlcyBhIG5ldyBwb2xpY3kgYW5kIGNvbnN0cmFpbnMgaXQgdG8gdGhlIHRhc2smIzM5O3MgY3B1c2V0LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuJiM0MztcdFx0bm9kZW1hc2tfdCAqbm9kZXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4mIzQzO1x0Tk9ERU1BU0tfU0NSQVRDSChzY3JhdGNoKTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAoIXNjcmF0Y2gpXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiYjNDM7XG4mIzQzO1x0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcbiYjNDM7XHRpZiAoSVNfRVJSKHBvbCkpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0dGFza19sb2NrKGN1cnJlbnQpO1xuJiM0MztcdGVyciA9IG1wb2xfc2V0X25vZGVtYXNrKHBvbCwgbm9kZXMsIHNjcmF0Y2gpO1xuJiM0MztcdHRhc2tfdW5sb2NrKGN1cnJlbnQpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdG1wb2xfcHV0KHBvbCk7XG4mIzQzO1x0XHRwb2wgPSBFUlJfUFRSKGVycik7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xuJiM0MztcdHJldHVybiBwb2w7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtZW1wb2xpY3lfY3JlYXRlLCBcJiMzNDtrdm1cJiMzNDspO1xuJiM0MztcbiBzdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuIFx0XHRcdCAgICAgbm9kZW1hc2tfdCAqbm9kZXMpXG4ge1xuQEAgLTMyNzQsMjQgJiM0MzszMzEyLDQ3IEBAIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2hhcmVkX3BvbGljeV9pbml0LCBcJiMzNDtrdm1cJiMzNDspO1xuIFxuLWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbi1cdFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuJiM0MzsvKipcbiYjNDM7ICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxuJiM0MzsgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWVcbiYjNDM7ICogQHN0YXJ0OiBmaXJzdCBwYWdlIG9mZnNldCAoaW5jbHVzaXZlKVxuJiM0MzsgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSlcbiYjNDM7ICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZVxuJiM0MzsgKlxuJiM0MzsgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS5cbiYjNDM7ICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LlxuJiM0MzsgKlxuJiM0MzsgKiBVbmxpa2UgbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgpLCBubyBWTUEgaXMgcmVxdWlyZWQsIHNvIGEgcmFuZ2UgdGhhdFxuJiM0MzsgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4mIzQzO1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4ge1xuLVx0Y29uc3QgcGdvZmZfdCBwZ29mZiA9IHZtYV9zdGFydF9wZ29mZih2bWEpO1xuLVx0Y29uc3QgcGdvZmZfdCBwZ29mZl9lbmQgPSB2bWFfZW5kX3Bnb2ZmKHZtYSk7XG4gXHRzdHJ1Y3Qgc3Bfbm9kZSAqbmV3ID0gTlVMTDtcbiBcdGludCBlcnI7XG4gXG4gXHRpZiAocG9sKSB7XG4tXHRcdG5ldyA9IHNwX2FsbG9jKHBnb2ZmLCBwZ29mZl9lbmQsIHBvbCk7XG4mIzQzO1x0XHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xuIFx0XHRpZiAoIW5ldylcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdH1cbi1cdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgcGdvZmYsIHBnb2ZmX2VuZCwgbmV3KTtcbiYjNDM7XHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XG4gXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG4gXHRcdHNwX2ZyZWUobmV3KTtcbiBcdHJldHVybiBlcnI7XG4gfVxuJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UsIFwmIzM0O2t2bVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4mIzQzO1x0XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVx1MDAzZXZtX3Bnb2ZmLFxuJiM0MztcdFx0XHRcdFx0ICAgdm1hLVx1MDAzZXZtX3Bnb2ZmICYjNDM7IHZtYV9wYWdlcyh2bWEpLCBwb2wpO1xuJiM0Mzt9XG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5LCBcJiMzNDtrdm1cJiMzNDspO1xuIFxuIC8qIEZyZWUgYSBiYWNraW5nIHBvbGljeSBzdG9yZSBvbiBpbm9kZSBkZWxldGUuICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcbmluZGV4IDIyMzNkODcxYTM4ZjQuLmIzMzNjYjQyZmFiMjkgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jXG5AQCAtMjUsNiAmIzQzOzI1LDMxIEBAXG4gXG4gc3RhdGljIHNpemVfdCBwYWdlX3NpemU7XG4gXG4mIzQzO3N0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgIHUzMiBub2RlLCB1MzIgcGFkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgZ3Vlc3RfbWVtZmQgPSB7XG4mIzQzO1x0XHQuc2l6ZSA9IHNpemUsXG4mIzQzO1x0XHQuZmxhZ3MgPSBmbGFncyxcbiYjNDM7XHRcdC5ub2RlID0gbm9kZSxcbiYjNDM7XHRcdC5wYWQgPSBwYWQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFx1MDAyNmd1ZXN0X21lbWZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBjcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsIHUzMiBub2RlKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRpZiAoIShmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpKVxuJiM0MztcdFx0cmV0dXJuIHZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgc2l6ZSwgZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHNpemUsIGZsYWdzLCBub2RlLCAwKTtcbiYjNDM7XHRURVNUX0FTU0VSVChmZCBcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xuJiM0MztcdHJldHVybiBmZDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCB0ZXN0X2ZpbGVfcmVhZF93cml0ZShpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKVxuIHtcbiBcdGNoYXIgYnVmWzY0XTtcbkBAIC0xNzEsNiAmIzQzOzE5Niw4MyBAQCBzdGF0aWMgdm9pZCB0ZXN0X251bWFfYWxsb2NhdGlvbihpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKVxuIFx0a3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgaGFzX2JpbmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiB2bV9jaGVja19jYXAodm0sIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MpIFx1MDAyNlxuJiM0MztcdCAgICAgICBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGVfaW52YWxpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRpZiAoIWhhc19iaW5kX25vZGUodm0pKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHQgICAgICAgZmxhZ3MgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSwgMCwgMSk7XG4mIzQzO1x0VEVTVF9BU1NFUlQoZmQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCxcbiYjNDM7XHRcdCAgICBcJiMzNDtndWVzdF9tZW1mZCgpIHdpdGggbm9uLXplcm8gcGFkIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIDEgXHUwMDNjXHUwMDNjIDIwLCAwKTtcbiYjNDM7XHRURVNUX0FTU0VSVChmZCBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRUlOVkFMLFxuJiM0MztcdFx0ICAgIFwmIzM0O2d1ZXN0X21lbWZkKCkgd2l0aCBvdXQtb2YtcmFuZ2Ugbm9kZSBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLCBmbGFncywgMSwgMCk7XG4mIzQzO1x0VEVTVF9BU1NFUlQoZmQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCxcbiYjNDM7XHRcdCAgICBcJiMzNDtndWVzdF9tZW1mZCgpIHdpdGggYSBub2RlIGJ1dCBubyBCSU5EX05PREUgZmxhZyBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUsIGludCBub2RlKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBvdGhlcl9tYXNrID0gMVVMIFx1MDAzY1x1MDAzYyAobm9kZSA/IDAgOiAxKTtcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIG1heG5vZGUgPSBCSVRTX1BFUl9UWVBFKG90aGVyX21hc2spO1xuJiM0MztcdGJvb2wgc3RlZXJfYXdheSA9IGlzX211bHRpX251bWFfbm9kZV9zeXN0ZW0oKTtcbiYjNDM7XHR2b2lkICpwYWdlc1s0XTtcbiYjNDM7XHRpbnQgc3RhdHVzWzRdO1xuJiM0MztcdGNoYXIgKm1lbTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0bWVtID0ga3ZtX21tYXAodG90YWxfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQpO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0cGFnZXNbaV0gPSBtZW0gJiM0MzsgcGFnZV9zaXplICogaTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBCaW5kIG9uIGEgZGlmZmVyZW50IG5vZGUgaWYgcG9zc2libGUgb3JkZXIgdG8gY2hlY2sgd2hldGhlciBmYXVsdGluZ1xuJiM0MztcdCAqIGhhcHBlbnMgYXMgZGVzaXJlZC4gV2l0aG91dCBhIHNlY29uZCBub2RlIHVzZSB0aGUgbG9jYWwgbm9kZSBhbmRcbiYjNDM7XHQgKiBqdXN0IGdldCBjb3ZlcmFnZSBvZiBjcmVhdGUvbW1hcC9mYXVsdCBwYXRocy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoc3RlZXJfYXdheSlcbiYjNDM7XHRcdGt2bV9zZXRfbWVtcG9saWN5KE1QT0xfQklORCwgXHUwMDI2b3RoZXJfbWFzaywgbWF4bm9kZSk7XG4mIzQzO1xuJiM0MztcdC8qIERlbGliZXJhdGVseSBubyBtYmluZCgpIG9uIHRoaXMgbWFwcGluZy4gKi9cbiYjNDM7XHRtZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRURVNUX0FTU0VSVChzdGF0dXNbaV0gPT0gbm9kZSxcbiYjNDM7XHRcdFx0ICAgIFwmIzM0O0V4cGVjdGVkIHBhZ2UgJWQgb24gbm9kZSAlZCwgZ290IGl0IG9uIG5vZGUgJWRcJiMzNDssXG4mIzQzO1x0XHRcdCAgICBpLCBub2RlLCBzdGF0dXNbaV0pO1xuJiM0MztcbiYjNDM7XHQvKiBEcm9wcGVkIG1lbW9yeSBzaG91bGQgZmF1bHQgYmFjayBvbnRvIHRoZSBzYW1lIG5vZGUgKi9cbiYjNDM7XHRrdm1fZmFsbG9jYXRlKGZkLCBGQUxMT0NfRkxfUFVOQ0hfSE9MRSB8IEZBTExPQ19GTF9LRUVQX1NJWkUsIDAsXG4mIzQzO1x0XHQgICAgICB0b3RhbF9zaXplKTtcbiYjNDM7XHRtZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRURVNUX0FTU0VSVChzdGF0dXNbaV0gPT0gbm9kZSxcbiYjNDM7XHRcdFx0ICAgIFwmIzM0O0V4cGVjdGVkIHBhZ2UgJWQgYmFjayBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZFwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIGksIG5vZGUsIHN0YXR1c1tpXSk7XG4mIzQzO1xuJiM0MztcdGlmIChzdGVlcl9hd2F5KVxuJiM0MztcdFx0a3ZtX3NldF9tZW1wb2xpY3koTVBPTF9ERUZBVUxULCBOVUxMLCAwKTtcbiYjNDM7XG4mIzQzO1x0a3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIHRlc3RfY29sbGFwc2UoaW50IGZkLCB1NjQgZmxhZ3MpXG4ge1xuIFx0Y29uc3Qgc2l6ZV90IHBtZF9zaXplID0gZ2V0X3RyYW5zX2h1Z2VwYWdlc3ooKTtcbkBAIC00MDQsNiAmIzQzOzUwNiwxMCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKVxuIFx0aW50IGZkO1xuIFxuIFx0Zm9yIChmbGFnID0gQklUKDApOyBmbGFnOyBmbGFnIFx1MDAzY1x1MDAzYz0gMSkge1xuJiM0MztcdFx0LyogQklORF9OT0RFIGRlcGVuZHMgb24gYSB2YWxpZCBub2RlIGZpZWxkLCB0ZXN0IHNlcGFyYXRlbHkgKi9cbiYjNDM7XHRcdGlmIChmbGFnID09IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4gXHRcdGZkID0gX192bV9jcmVhdGVfZ3Vlc3RfbWVtZmQodm0sIHBhZ2Vfc2l6ZSwgZmxhZyk7XG4gXHRcdGlmIChmbGFnIFx1MDAyNiB2YWxpZF9mbGFncykge1xuIFx0XHRcdFRFU1RfQVNTRVJUKGZkIFx1MDAzZT0gMCxcbkBAIC00MTgsMzAgJiM0Mzs1MjQsNDAgQEAgc3RhdGljIHZvaWQgdGVzdF9ndWVzdF9tZW1mZF9mbGFncyhzdHJ1Y3Qga3ZtX3ZtICp2bSlcbiBcdH1cbiB9XG4gXG4tI2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGFyZ3MuLi4pXHRcXFxuLWRvIHtcdFx0XHRcdFx0XHRcdFx0XHRcXFxuLVx0aW50IGZkID0gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzKTtcdFxcXG4tXHRcdFx0XHRcdFx0XHRcdFx0XFxcbi1cdHRlc3RfIyNfX3Rlc3QoYXJncyk7XHRcdFx0XHRcdFx0XFxcbi1cdGNsb3NlKGZkKTtcdFx0XHRcdFx0XHRcdFxcXG4mIzQzOyNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUsIGFyZ3MuLi4pIFxcXG4mIzQzO2RvIHtcdFx0XHRcdFx0XHRcdFx0XHQgICBcXFxuJiM0MztcdGludCBmZCA9IGNyZWF0ZV9ndWVzdF9tZW1mZChfX3ZtLCBfX2dtZW1fc2l6ZSwgX19mbGFncywgX19ub2RlKTsgICBcXFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0XHQgICBcXFxuJiM0MztcdHRlc3RfIyNfX3Rlc3QoYXJncyk7XHRcdFx0XHRcdFx0ICAgXFxcbiYjNDM7XHRjbG9zZShmZCk7XHRcdFx0XHRcdFx0XHQgICBcXFxuIH0gd2hpbGUgKDApXG4gXG4gI2RlZmluZSBfX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKVx0XHRcdFxcXG4tXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGZkLCBfX2dtZW1fc2l6ZSlcbiYjNDM7XHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsIGZkLCBfX2dtZW1fc2l6ZSlcbiBcbiAjZGVmaW5lIGdtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXHRcdFx0XHRcXFxuIFx0X19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KVxuIFxuICNkZWZpbmUgX19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcdFx0XFxcbi1cdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX192bSwgZmQsIF9fZ21lbV9zaXplKVxuJiM0MztcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgMCxcdFx0XFxcbiYjNDM7XHRcdCAgICAgIF9fdm0sIGZkLCBfX2dtZW1fc2l6ZSlcbiBcbiAjZGVmaW5lIGdtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXHRcdFx0XHRcXFxuIFx0X19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KVxuIFxuJiM0MzsjZGVmaW5lIF9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX19ub2RlKVx0XFxcbiYjNDM7XHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSxcdFx0XHRcdFx0XFxcbiYjNDM7XHRcdCAgICAgIChfX2ZsYWdzKSB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFx0XHRcXFxuJiM0MztcdFx0ICAgICAgX19nbWVtX3NpemUsIF9fbm9kZSwgZmQsIF9fZ21lbV9zaXplLCBfX25vZGUpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIGdtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgX19ub2RlKVx0XHRcdFxcXG4mIzQzO1x0X19nbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIHBhZ2Vfc2l6ZSAqIDQsIF9fbm9kZSlcbiYjNDM7XG4gc3RhdGljIHZvaWQgX190ZXN0X2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgZmxhZ3MpXG4ge1xuIFx0dGVzdF9jcmVhdGVfZ3Vlc3RfbWVtZmRfbXVsdGlwbGUodm0pO1xuIFx0dGVzdF9jcmVhdGVfZ3Vlc3RfbWVtZmRfaW52YWxpZF9zaXplcyh2bSwgZmxhZ3MpO1xuJiM0MztcdHRlc3RfYmluZF9ub2RlX2ludmFsaWQodm0sIGZsYWdzKTtcbiBcbiBcdGdtZW1fdGVzdChmaWxlX3JlYWRfd3JpdGUsIHZtLCBmbGFncyk7XG4gXG5AQCAtNDUyLDYgJiM0Mzs1NjgsOCBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcbiBcdFx0XHRnbWVtX3Rlc3QobW1hcF9zdXBwb3J0ZWQsIHZtLCBmbGFncyk7XG4gXHRcdFx0Z21lbV90ZXN0KGZhdWx0X292ZXJmbG93LCB2bSwgZmxhZ3MpO1xuIFx0XHRcdGdtZW1fdGVzdChudW1hX2FsbG9jYXRpb24sIHZtLCBmbGFncyk7XG4mIzQzO1x0XHRcdGlmIChoYXNfYmluZF9ub2RlKHZtKSlcbiYjNDM7XHRcdFx0XHRnbWVtX3Rlc3Rfbm9kZShiaW5kX25vZGUsIHZtLCBmbGFncywgMCk7XG4gXHRcdFx0X19nbWVtX3Rlc3QoY29sbGFwc2UsIHZtLCBmbGFncywgcG1kX3NpemUpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdGdtZW1fdGVzdChmYXVsdF9wcml2YXRlLCB2bSwgZmxhZ3MpO1xuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCA2MjVlNjJlMWEwMzE4Li5kYzlmMDcxZGQ5NjliIDEwMDY0NFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuQEAgLTQyMyw2ICYjNDM7NDIzLDMxIEBAIHN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICprdm1fZ21lbV9nZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0ICovXG4gXHRyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgcGdvZmYpO1xuIH1cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xuJiM0MztcdG5vZGVtYXNrX3Qgbm9kZXM7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuJiM0MztcdHBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCBcdTAwMjZub2Rlcyk7XG4mIzQzO1x0aWYgKElTX0VSUihwb2wpKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgMCxcbiYjNDM7XHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbiYjNDM7XHRtcG9sX3B1dChwb2wpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7I2Vsc2VcbiYjNDM7c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7fVxuICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0ge1xuQEAgLTUyMCw3ICYjNDM7NTQ1LDcgQEAgYm9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXG4mIzQzO3N0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzLCBpbnQgbm9kZSlcbiB7XG4gXHRzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9IFwmIzM0O1trdm0tZ21lbV1cJiMzNDs7XG4gXHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xuQEAgLTU2MSw2ICYjNDM7NTg2LDEyIEBAIHN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxuIFxuIFx0R01FTV9JKGlub2RlKS1cdTAwM2VmbGFncyA9IGZsYWdzO1xuIFxuJiM0MztcdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbiYjNDM7XHRcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XG4mIzQzO1x0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRnb3RvIGVycl9pbm9kZTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0ZmlsZSA9IGFsbG9jX2ZpbGVfcHNldWRvKGlub2RlLCBrdm1fZ21lbV9tbnQsIG5hbWUsIE9fUkRXUiwgXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XG4gXHRpZiAoSVNfRVJSKGZpbGUpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoZmlsZSk7XG5AQCAtNTkzLDYgJiM0Mzs2MjQsNyBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4ge1xuIFx0bG9mZl90IHNpemUgPSBhcmdzLVx1MDAzZXNpemU7XG4gXHR1NjQgZmxhZ3MgPSBhcmdzLVx1MDAzZWZsYWdzO1xuJiM0MztcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuIFxuIFx0aWYgKGZsYWdzIFx1MDAyNiB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC02MDAsNyAmIzQzOzYzMiwxNSBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4gXHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xuJiM0MztcdFx0aWYgKGFyZ3MtXHUwMDNlcGFkIHx8IGFyZ3MtXHUwMDNlbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHRub2RlID0gYXJncy1cdTAwM2Vub2RlO1xuJiM0MztcdH0gZWxzZSBpZiAoYXJncy1cdTAwM2Vub2RlIHx8IGFyZ3MtXHUwMDNlcGFkKSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzLCBub2RlKTtcbiB9XG4gXG4gaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtOVU1BJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7a3ZtX2dtZW1fY3JlYXRlJiMzNDssCiAgICAmIzM0O2t2bV9nbWVtX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDttZW1wb2xpY3lfY3JlYXRlJiMzNDssCiAgICAmIzM0O21wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UmIzM0OywKICAgICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIE5VTUEgbm9kZSBiaW5kaW5nIHN1cHBvcnQgZm9yIEtWTSBndWVzdF9tZW1mZCB2aWEgdGhlIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIGZsYWcgaW4gS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgYW5kIGFkZHMgdGhlIG1lbXBvbGljeSBoZWxwZXJzIG1lbXBvbGljeV9jcmVhdGUoKSBhbmQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSgpLiBUaGVzZSBjaGFuZ2VzIG1vZGlmeSByZWFjaGFibGUga2VybmVsIGxvZ2ljIGluIG1tL21lbXBvbGljeS5jIGFuZCB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBhZTY4OTU1YTU5MjNkMjVlOWUwYWY5NTY5NDMwNTc5ZTk0YzQwZjlmCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMyAxOTowNzoxNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAppbmRleCAwM2JmYzkyODY0YjZlLi43MzhlMjc2NjMzYzFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCkBAIC03MzksNiAmIzQzOzczOSw5IEBAIHN0YXRpYyBpbmxpbmUgdTY0IGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moc3RydWN0IGt2bSAqa3ZtKQogCWlmICgha3ZtIHx8IGt2bV9hcmNoX3N1cHBvcnRzX2dtZW1faW5pdF9zaGFyZWQoa3ZtKSkKIAkJZmxhZ3MgfD0gR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRDsKIAomIzQzOwlpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQSkpCiYjNDM7CQlmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTsKJiM0MzsKIAlyZXR1cm4gZmxhZ3M7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IDY1YzczMmQ0NDBkMmYuLjM5ODMxODE3NWNlYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTI0LDEwICYjNDM7MTI0LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpOwogdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpOwogaW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAogCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpOwomIzQzO2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCwKJiM0MzsJCQkJIHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTsKIHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKTsKIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAogCQkJCQkgICAgcGdvZmZfdCBpZHgpOwogCiYjNDM7c3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncywKJiM0MzsJCQkJICAgbm9kZW1hc2tfdCAqbm9kZXMpOwomIzQzOwogc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBzdHJ1Y3QgbWVtcG9saWN5ICpfX2dldF92bWFfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIGFkZHIsIHBnb2ZmX3QgKmlseCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmggYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgKaW5kZXggYWMyZDc3ZDE0OTYzNS4uOGQzYWU3ZTJlYWQ4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaApAQCAtMTY1OCwxMSAmIzQzOzE2NTgsMTQgQEAgc3RydWN0IGt2bV9tZW1vcnlfYXR0cmlidXRlcyB7CiAjZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQJX0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCkKICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQCQkoMVVMTCAmbHQ7Jmx0OyAwKQogI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVECSgxVUxMICZsdDsmbHQ7IDEpCiYjNDM7I2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERQkoMVVMTCAmbHQ7Jmx0OyAyKQogCiBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCB7CiAJX191NjQgc2l6ZTsKIAlfX3U2NCBmbGFnczsKLQlfX3U2NCByZXNlcnZlZFs2XTsKJiM0MzsJX191MzIgbm9kZTsKJiM0MzsJX191MzIgcGFkOwomIzQzOwlfX3U2NCByZXNlcnZlZFs1XTsKIH07CiAKICNkZWZpbmUgS1ZNX1BSRV9GQVVMVF9NRU1PUlkJX0lPV1IoS1ZNSU8sIDB4ZDUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSkKZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggMmFkMGE1ZjE4MjgwYS4uY2UxMGNlNDM3NDY0MyAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtcG9saWN5LmMKQEAgLTEwODUsNyAmIzQzOzEwODUsNDUgQEAgc3RhdGljIGludCBtYmluZF9yYW5nZShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCXJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTsKIH0KIAotLyogU2V0IHRoZSBwcm9jZXNzIG1lbW9yeSBwb2xpY3kgKi8KJiM0MzsvKioKJiM0MzsgKiBtZW1wb2xpY3lfY3JlYXRlIC0gYnVpbGQgYSB2YWxpZGF0ZWQsIGNwdXNldC1jb250ZXh0dWFsaXNlZCBtZW1wb2xpY3kKJiM0MzsgKiBAbW9kZTogTVBPTF8qIG1vZGUKJiM0MzsgKiBAZmxhZ3M6IE1QT0xfRl8qIGZsYWdzCiYjNDM7ICogQG5vZGVzOiB0YXJnZXQgbm9kZW1hc2ssIG9yIE5VTEwgKGludGVycHJldGVkIHBlciBAbW9kZTsgc2VlIG1wb2xfbmV3KCkpCiYjNDM7ICoKJiM0MzsgKiBDcmVhdGVzIGEgbmV3IHBvbGljeSBhbmQgY29uc3RyYWlucyBpdCB0byB0aGUgdGFzayYjMzk7cyBjcHVzZXQuCiYjNDM7ICoKJiM0MzsgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0aGUgcG9saWN5IChOVUxMIGZvciBhIGRlZmF1bHQgcG9saWN5KSwgb3IgYW4gRVJSX1BUUiBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeV9jcmVhdGUodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsCiYjNDM7CQlub2RlbWFza190ICpub2RlcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1wb2xpY3kgKnBvbDsKJiM0MzsJTk9ERU1BU0tfU0NSQVRDSChzY3JhdGNoKTsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKCFzY3JhdGNoKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiYjNDM7CiYjNDM7CXBvbCA9IG1wb2xfbmV3KG1vZGUsIGZsYWdzLCBub2Rlcyk7CiYjNDM7CWlmIChJU19FUlIocG9sKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwl0YXNrX2xvY2soY3VycmVudCk7CiYjNDM7CWVyciA9IG1wb2xfc2V0X25vZGVtYXNrKHBvbCwgbm9kZXMsIHNjcmF0Y2gpOwomIzQzOwl0YXNrX3VubG9jayhjdXJyZW50KTsKJiM0MzsJaWYgKGVycikgewomIzQzOwkJbXBvbF9wdXQocG9sKTsKJiM0MzsJCXBvbCA9IEVSUl9QVFIoZXJyKTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJTk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpOwomIzQzOwlyZXR1cm4gcG9sOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsICYjMzQ7a3ZtJiMzNDspOwomIzQzOwogc3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncywKIAkJCSAgICAgbm9kZW1hc2tfdCAqbm9kZXMpCiB7CkBAIC0zMjc0LDI0ICYjNDM7MzMxMiw0NyBAQCB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCkKIH0KIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zaGFyZWRfcG9saWN5X2luaXQsICYjMzQ7a3ZtJiMzNDspOwogCi1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCi0JCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKQomIzQzOy8qKgomIzQzOyAqIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgLSBpbnN0YWxsIEBwb2wgb3ZlciBbQHN0YXJ0LCBAZW5kKSBvZiBAc3AKJiM0MzsgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWUKJiM0MzsgKiBAc3RhcnQ6IGZpcnN0IHBhZ2Ugb2Zmc2V0IChpbmNsdXNpdmUpCiYjNDM7ICogQGVuZDogICBsYXN0IHBhZ2Ugb2Zmc2V0IChleGNsdXNpdmUpCiYjNDM7ICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZQomIzQzOyAqCiYjNDM7ICogSW5zdGFsbHMgQHBvbCBvdmVyIHRoZSBnaXZlbiByYW5nZSwgcmVwbGFjaW5nIGFueSBvdmVybGFwcGluZyBwb2xpY3kuCiYjNDM7ICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLgomIzQzOyAqCiYjNDM7ICogVGhlIHBvbGljeSBpcyBub3QgcmVjb25zdHJ1Y3RlZCwgc28gdGhlIHBvbGljeSBpcyBwcmVzZXJ2ZWQgZXhhY3RseS4KJiM0MzsgKgomIzQzOyAqIFVubGlrZSBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCksIG5vIFZNQSBpcyByZXF1aXJlZCwgc28gYSByYW5nZSB0aGF0CiYjNDM7ICogaXMgbmV2ZXIgbWFwcGVkIGludG8gYSBWTUEgY2FuIGJlIGNvdmVyZWQsIGluY2x1ZGluZyB0aGUgd2hvbGUgZmlsZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsCiYjNDM7CQkJCSBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKQogewotCWNvbnN0IHBnb2ZmX3QgcGdvZmYgPSB2bWFfc3RhcnRfcGdvZmYodm1hKTsKLQljb25zdCBwZ29mZl90IHBnb2ZmX2VuZCA9IHZtYV9lbmRfcGdvZmYodm1hKTsKIAlzdHJ1Y3Qgc3Bfbm9kZSAqbmV3ID0gTlVMTDsKIAlpbnQgZXJyOwogCiAJaWYgKHBvbCkgewotCQluZXcgPSBzcF9hbGxvYyhwZ29mZiwgcGdvZmZfZW5kLCBwb2wpOwomIzQzOwkJbmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTsKIAkJaWYgKCFuZXcpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZXJyID0gc2hhcmVkX3BvbGljeV9yZXBsYWNlKHNwLCBwZ29mZiwgcGdvZmZfZW5kLCBuZXcpOwomIzQzOwllcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7CiAJaWYgKGVyciAmYW1wOyZhbXA7IG5ldykKIAkJc3BfZnJlZShuZXcpOwogCXJldHVybiBlcnI7CiB9CiYjNDM7RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlLCAmIzM0O2t2bSYjMzQ7KTsKJiM0MzsKJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCiYjNDM7CQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbCkKJiM0Mzt7CiYjNDM7CXJldHVybiBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHNwLCB2bWEtJmd0O3ZtX3Bnb2ZmLAomIzQzOwkJCQkJICAgdm1hLSZndDt2bV9wZ29mZiAmIzQzOyB2bWFfcGFnZXModm1hKSwgcG9sKTsKJiM0Mzt9CiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3ksICYjMzQ7a3ZtJiMzNDspOwogCiAvKiBGcmVlIGEgYmFja2luZyBwb2xpY3kgc3RvcmUgb24gaW5vZGUgZGVsZXRlLiAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMKaW5kZXggMjIzM2Q4NzFhMzhmNC4uYjMzM2NiNDJmYWIyOSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jCkBAIC0yNSw2ICYjNDM7MjUsMzEgQEAKIAogc3RhdGljIHNpemVfdCBwYWdlX3NpemU7CiAKJiM0MztzdGF0aWMgaW50IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsCiYjNDM7CQkJCSAgICAgdTMyIG5vZGUsIHUzMiBwYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZCA9IHsKJiM0MzsJCS5zaXplID0gc2l6ZSwKJiM0MzsJCS5mbGFncyA9IGZsYWdzLAomIzQzOwkJLm5vZGUgPSBub2RlLAomIzQzOwkJLnBhZCA9IHBhZCwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsICZhbXA7Z3Vlc3RfbWVtZmQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGNyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncywgdTMyIG5vZGUpCiYjNDM7ewomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWlmICghKGZsYWdzICZhbXA7IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSkKJiM0MzsJCXJldHVybiB2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQodm0sIHNpemUsIGZsYWdzKTsKJiM0MzsKJiM0MzsJZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7CiYjNDM7CVRFU1RfQVNTRVJUKGZkICZndDs9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpOwomIzQzOwlyZXR1cm4gZmQ7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdGVzdF9maWxlX3JlYWRfd3JpdGUoaW50IGZkLCBzaXplX3QgdG90YWxfc2l6ZSkKIHsKIAljaGFyIGJ1Zls2NF07CkBAIC0xNzEsNiAmIzQzOzE5Niw4MyBAQCBzdGF0aWMgdm9pZCB0ZXN0X251bWFfYWxsb2NhdGlvbihpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKQogCWt2bV9tdW5tYXAobWVtLCB0b3RhbF9zaXplKTsKIH0KIAomIzQzO3N0YXRpYyBib29sIGhhc19iaW5kX25vZGUoc3RydWN0IGt2bV92bSAqdm0pCiYjNDM7ewomIzQzOwlyZXR1cm4gdm1fY2hlY2tfY2FwKHZtLCBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTKSAmYW1wOwomIzQzOwkgICAgICAgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlX2ludmFsaWQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncykKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJaWYgKCFoYXNfYmluZF9ub2RlKHZtKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsCiYjNDM7CQkJCSAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLCAwLCAxKTsKJiM0MzsJVEVTVF9BU1NFUlQoZmQgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gPT0gRUlOVkFMLAomIzQzOwkJICAgICYjMzQ7Z3Vlc3RfbWVtZmQoKSB3aXRoIG5vbi16ZXJvIHBhZCBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTCYjMzQ7KTsKJiM0MzsKJiM0MzsJZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsCiYjNDM7CQkJCSAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLAomIzQzOwkJCQkgICAgICAgMSAmbHQ7Jmx0OyAyMCwgMCk7CiYjNDM7CVRFU1RfQVNTRVJUKGZkICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vID09IEVJTlZBTCwKJiM0MzsJCSAgICAmIzM0O2d1ZXN0X21lbWZkKCkgd2l0aCBvdXQtb2YtcmFuZ2Ugbm9kZSBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTCYjMzQ7KTsKJiM0MzsKJiM0MzsJZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsIGZsYWdzLCAxLCAwKTsKJiM0MzsJVEVTVF9BU1NFUlQoZmQgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gPT0gRUlOVkFMLAomIzQzOwkJICAgICYjMzQ7Z3Vlc3RfbWVtZmQoKSB3aXRoIGEgbm9kZSBidXQgbm8gQklORF9OT0RFIGZsYWcgc2hvdWxkIGZhaWwgd2l0aCBFSU5WQUwmIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUsIGludCBub2RlKQomIzQzO3sKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBvdGhlcl9tYXNrID0gMVVMICZsdDsmbHQ7IChub2RlID8gMCA6IDEpOwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIG1heG5vZGUgPSBCSVRTX1BFUl9UWVBFKG90aGVyX21hc2spOwomIzQzOwlib29sIHN0ZWVyX2F3YXkgPSBpc19tdWx0aV9udW1hX25vZGVfc3lzdGVtKCk7CiYjNDM7CXZvaWQgKnBhZ2VzWzRdOwomIzQzOwlpbnQgc3RhdHVzWzRdOwomIzQzOwljaGFyICptZW07CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwltZW0gPSBrdm1fbW1hcCh0b3RhbF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0OyBpJiM0MzsmIzQzOykKJiM0MzsJCXBhZ2VzW2ldID0gbWVtICYjNDM7IHBhZ2Vfc2l6ZSAqIGk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEJpbmQgb24gYSBkaWZmZXJlbnQgbm9kZSBpZiBwb3NzaWJsZSBvcmRlciB0byBjaGVjayB3aGV0aGVyIGZhdWx0aW5nCiYjNDM7CSAqIGhhcHBlbnMgYXMgZGVzaXJlZC4gV2l0aG91dCBhIHNlY29uZCBub2RlIHVzZSB0aGUgbG9jYWwgbm9kZSBhbmQKJiM0MzsJICoganVzdCBnZXQgY292ZXJhZ2Ugb2YgY3JlYXRlL21tYXAvZmF1bHQgcGF0aHMuCiYjNDM7CSAqLwomIzQzOwlpZiAoc3RlZXJfYXdheSkKJiM0MzsJCWt2bV9zZXRfbWVtcG9saWN5KE1QT0xfQklORCwgJmFtcDtvdGhlcl9tYXNrLCBtYXhub2RlKTsKJiM0MzsKJiM0MzsJLyogRGVsaWJlcmF0ZWx5IG5vIG1iaW5kKCkgb24gdGhpcyBtYXBwaW5nLiAqLwomIzQzOwltZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTsKJiM0MzsKJiM0MzsJa3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0OyBpJiM0MzsmIzQzOykKJiM0MzsJCVRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLAomIzQzOwkJCSAgICAmIzM0O0V4cGVjdGVkIHBhZ2UgJWQgb24gbm9kZSAlZCwgZ290IGl0IG9uIG5vZGUgJWQmIzM0OywKJiM0MzsJCQkgICAgaSwgbm9kZSwgc3RhdHVzW2ldKTsKJiM0MzsKJiM0MzsJLyogRHJvcHBlZCBtZW1vcnkgc2hvdWxkIGZhdWx0IGJhY2sgb250byB0aGUgc2FtZSBub2RlICovCiYjNDM7CWt2bV9mYWxsb2NhdGUoZmQsIEZBTExPQ19GTF9QVU5DSF9IT0xFIHwgRkFMTE9DX0ZMX0tFRVBfU0laRSwgMCwKJiM0MzsJCSAgICAgIHRvdGFsX3NpemUpOwomIzQzOwltZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTsKJiM0MzsKJiM0MzsJa3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0OyBpJiM0MzsmIzQzOykKJiM0MzsJCVRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLAomIzQzOwkJCSAgICAmIzM0O0V4cGVjdGVkIHBhZ2UgJWQgYmFjayBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZCYjMzQ7LAomIzQzOwkJCSAgICBpLCBub2RlLCBzdGF0dXNbaV0pOwomIzQzOwomIzQzOwlpZiAoc3RlZXJfYXdheSkKJiM0MzsJCWt2bV9zZXRfbWVtcG9saWN5KE1QT0xfREVGQVVMVCwgTlVMTCwgMCk7CiYjNDM7CiYjNDM7CWt2bV9tdW5tYXAobWVtLCB0b3RhbF9zaXplKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCB0ZXN0X2NvbGxhcHNlKGludCBmZCwgdTY0IGZsYWdzKQogewogCWNvbnN0IHNpemVfdCBwbWRfc2l6ZSA9IGdldF90cmFuc19odWdlcGFnZXN6KCk7CkBAIC00MDQsNiAmIzQzOzUwNiwxMCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKQogCWludCBmZDsKIAogCWZvciAoZmxhZyA9IEJJVCgwKTsgZmxhZzsgZmxhZyAmbHQ7Jmx0Oz0gMSkgewomIzQzOwkJLyogQklORF9OT0RFIGRlcGVuZHMgb24gYSB2YWxpZCBub2RlIGZpZWxkLCB0ZXN0IHNlcGFyYXRlbHkgKi8KJiM0MzsJCWlmIChmbGFnID09IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwogCQlmZCA9IF9fdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHZtLCBwYWdlX3NpemUsIGZsYWcpOwogCQlpZiAoZmxhZyAmYW1wOyB2YWxpZF9mbGFncykgewogCQkJVEVTVF9BU1NFUlQoZmQgJmd0Oz0gMCwKQEAgLTQxOCwzMCAmIzQzOzUyNCw0MCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKQogCX0KIH0KIAotI2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGFyZ3MuLi4pCVwKLWRvIHsJCQkJCQkJCQlcCi0JaW50IGZkID0gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzKTsJXAotCQkJCQkJCQkJXAotCXRlc3RfIyNfX3Rlc3QoYXJncyk7CQkJCQkJXAotCWNsb3NlKGZkKTsJCQkJCQkJXAomIzQzOyNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUsIGFyZ3MuLi4pIFwKJiM0MztkbyB7CQkJCQkJCQkJICAgXAomIzQzOwlpbnQgZmQgPSBjcmVhdGVfZ3Vlc3RfbWVtZmQoX192bSwgX19nbWVtX3NpemUsIF9fZmxhZ3MsIF9fbm9kZSk7ICAgXAomIzQzOwkJCQkJCQkJCSAgIFwKJiM0MzsJdGVzdF8jI19fdGVzdChhcmdzKTsJCQkJCQkgICBcCiYjNDM7CWNsb3NlKGZkKTsJCQkJCQkJICAgXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBfX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKQkJCVwKLQlfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGZkLCBfX2dtZW1fc2l6ZSkKJiM0MzsJX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCAwLCBmZCwgX19nbWVtX3NpemUpCiAKICNkZWZpbmUgZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncykJCQkJXAogCV9fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNCkKIAogI2RlZmluZSBfX2dtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKQkJXAotCV9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX192bSwgZmQsIF9fZ21lbV9zaXplKQomIzQzOwlfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsCQlcCiYjNDM7CQkgICAgICBfX3ZtLCBmZCwgX19nbWVtX3NpemUpCiAKICNkZWZpbmUgZ21lbV90ZXN0X3ZtKF9fdGVzdCwgX192bSwgX19mbGFncykJCQkJXAogCV9fZ21lbV90ZXN0X3ZtKF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNCkKIAomIzQzOyNkZWZpbmUgX19nbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUpCVwKJiM0MzsJX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sCQkJCQlcCiYjNDM7CQkgICAgICAoX19mbGFncykgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSwJCVwKJiM0MzsJCSAgICAgIF9fZ21lbV9zaXplLCBfX25vZGUsIGZkLCBfX2dtZW1fc2l6ZSwgX19ub2RlKQomIzQzOwomIzQzOyNkZWZpbmUgZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX25vZGUpCQkJXAomIzQzOwlfX2dtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNCwgX19ub2RlKQomIzQzOwogc3RhdGljIHZvaWQgX190ZXN0X2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgZmxhZ3MpCiB7CiAJdGVzdF9jcmVhdGVfZ3Vlc3RfbWVtZmRfbXVsdGlwbGUodm0pOwogCXRlc3RfY3JlYXRlX2d1ZXN0X21lbWZkX2ludmFsaWRfc2l6ZXModm0sIGZsYWdzKTsKJiM0MzsJdGVzdF9iaW5kX25vZGVfaW52YWxpZCh2bSwgZmxhZ3MpOwogCiAJZ21lbV90ZXN0KGZpbGVfcmVhZF93cml0ZSwgdm0sIGZsYWdzKTsKIApAQCAtNDUyLDYgJiM0Mzs1NjgsOCBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncykKIAkJCWdtZW1fdGVzdChtbWFwX3N1cHBvcnRlZCwgdm0sIGZsYWdzKTsKIAkJCWdtZW1fdGVzdChmYXVsdF9vdmVyZmxvdywgdm0sIGZsYWdzKTsKIAkJCWdtZW1fdGVzdChudW1hX2FsbG9jYXRpb24sIHZtLCBmbGFncyk7CiYjNDM7CQkJaWYgKGhhc19iaW5kX25vZGUodm0pKQomIzQzOwkJCQlnbWVtX3Rlc3Rfbm9kZShiaW5kX25vZGUsIHZtLCBmbGFncywgMCk7CiAJCQlfX2dtZW1fdGVzdChjb2xsYXBzZSwgdm0sIGZsYWdzLCBwbWRfc2l6ZSk7CiAJCX0gZWxzZSB7CiAJCQlnbWVtX3Rlc3QoZmF1bHRfcHJpdmF0ZSwgdm0sIGZsYWdzKTsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCmluZGV4IDYyNWU2MmUxYTAzMTguLmRjOWYwNzFkZDk2OWIgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwpAQCAtNDIzLDYgJiM0Mzs0MjMsMzEgQEAgc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKmt2bV9nbWVtX2dldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJICovCiAJcmV0dXJuIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoJmFtcDtHTUVNX0koaW5vZGUpLSZndDtwb2xpY3ksIHBnb2ZmKTsKIH0KJiM0MzsKJiM0MztzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1wb2xpY3kgKnBvbDsKJiM0MzsJbm9kZW1hc2tfdCBub2RlczsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKCh1bnNpZ25lZCBpbnQpbm9kZSAmZ3Q7PSBNQVhfTlVNTk9ERVMpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaW5pdF9ub2RlbWFza19vZl9ub2RlKCZhbXA7bm9kZXMsIG5vZGUpOwomIzQzOwlwb2wgPSBtZW1wb2xpY3lfY3JlYXRlKE1QT0xfQklORCwgMCwgJmFtcDtub2Rlcyk7CiYjNDM7CWlmIChJU19FUlIocG9sKSkKJiM0MzsJCXJldHVybiBQVFJfRVJSKHBvbCk7CiYjNDM7CiYjNDM7CWVyciA9IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoJmFtcDtHTUVNX0koaW5vZGUpLSZndDtwb2xpY3ksIDAsCiYjNDM7CQkJCQkgIE1BWF9MRlNfRklMRVNJWkUgJmd0OyZndDsgUEFHRV9TSElGVCwgcG9sKTsKJiM0MzsJbXBvbF9wdXQocG9sKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7I2Vsc2UKJiM0MztzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSkKJiM0Mzt7CiYjNDM7CXJldHVybiAtRUlOVkFMOwomIzQzO30KICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9nbWVtX3ZtX29wcyA9IHsKQEAgLTUyMCw3ICYjNDM7NTQ1LDcgQEAgYm9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pCiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKQomIzQzO3N0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAlzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICYjMzQ7W2t2bS1nbWVtXSYjMzQ7OwogCXN0cnVjdCBnbWVtX2ZpbGUgKmY7CkBAIC01NjEsNiAmIzQzOzU4NiwxMiBAQCBzdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncykKIAogCUdNRU1fSShpbm9kZSktJmd0O2ZsYWdzID0gZmxhZ3M7CiAKJiM0MzsJaWYgKGZsYWdzICZhbXA7IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7CiYjNDM7CQllcnIgPSBrdm1fZ21lbV9iaW5kX25vZGUoaW5vZGUsIG5vZGUpOwomIzQzOwkJaWYgKGVycikKJiM0MzsJCQlnb3RvIGVycl9pbm9kZTsKJiM0MzsJfQomIzQzOwogCWZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsICZhbXA7a3ZtX2dtZW1fZm9wcyk7CiAJaWYgKElTX0VSUihmaWxlKSkgewogCQllcnIgPSBQVFJfRVJSKGZpbGUpOwpAQCAtNTkzLDYgJiM0Mzs2MjQsNyBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpCiB7CiAJbG9mZl90IHNpemUgPSBhcmdzLSZndDtzaXplOwogCXU2NCBmbGFncyA9IGFyZ3MtJmd0O2ZsYWdzOwomIzQzOwlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTsKIAogCWlmIChmbGFncyAmYW1wOyB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYwMCw3ICYjNDM7NjMyLDE1IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncykKIAlpZiAoc2l6ZSAmbHQ7PSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MpOwomIzQzOwlpZiAoZmxhZ3MgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHsKJiM0MzsJCWlmIChhcmdzLSZndDtwYWQgfHwgYXJncy0mZ3Q7bm9kZSAmZ3Q7PSBNQVhfTlVNTk9ERVMpCiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQlub2RlID0gYXJncy0mZ3Q7bm9kZTsKJiM0MzsJfSBlbHNlIGlmIChhcmdzLSZndDtub2RlIHx8IGFyZ3MtJmd0O3BhZCkgewomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MsIG5vZGUpOwogfQogCiBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg2NDgKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiA2NTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBHdWVzdCBNZW1mZCBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBpdCYjMzk7cyBhaW1lZCBhdCBhbWQ2NCwgd2hpY2ggaXMgZ29vZDsgaXQmIzM5O3MgYSBjb21tb24gdGFyZ2V0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGJlaW5nIGNoYW5nZWQgYW5kIHdoeSwgdG8gZmlndXJlIG91dCBpZiBpdCYjMzk7cyB3b3J0aCBmdXp6aW5nLgoKTG9va2luZyBhdCB0aGUgZmlsZSBtb2RpZmljYXRpb25zLCBpdCBzZWVtcyB0aGUgY29yZSBpcyB0aGUgYWRkaXRpb24gb2YgTlVNQSBub2RlIGJpbmRpbmcgZm9yIGd1ZXN0IG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIChndWVzdF9tZW1mZCkuCgoqICAgYGluY2x1ZGUvbGludXgva3ZtX2hvc3QuaGAgaXMgZW5hYmxpbmcgYSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGlmIE5VTUEgaXMgZW5hYmxlZCB3aGVuIGdldHRpbmcgc3VwcG9ydGVkIGZsYWdzLgoqICAgYGluY2x1ZGUvbGludXgvbWVtcG9saWN5LmhgIHNob3dzIG5ldyBmdW5jdGlvbnMgYmVpbmcgYWRkZWQgcmVsYXRlZCB0byBtZW1vcnkgcG9saWN5LCBwYXJ0aWN1bGFybHkgc2hhcmVkIHBvbGljeSByYW5nZXMsIHdpdGggdGhlIGRlY2xhcmF0aW9uIG9mIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBhbmQgYG1lbXBvbGljeV9jcmVhdGVgLiBUaGVzZSBhcmUgaW1wb3J0YW50LgoqICAgYGluY2x1ZGUvdWFwaS9saW51eC9rdm0uaGAgZGVmaW5lcyB0aGUgZmxhZyBpdHNlbGYgYW5kIHVwZGF0ZXMgdGhlIGBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUgdG8gaW5jbHVkZSBhIGBub2RlYCBmaWVsZCwgd2hpY2ggSSB3b3VsZCBleHBlY3QuCiogICBgbW0vbWVtcG9saWN5LmNgIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRob3NlIG5ldyBtZW1wb2xpY3kgZnVuY3Rpb25zLCBhbmQgaW1wb3J0YW50bHksIGl0JiMzOTtzIG1vZGlmeWluZyBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeWAgdG8gdXNlIHRoZSBuZXcgc2hhcmVkIHJhbmdlIGZ1bmN0aW9uLiBUaGF0JiMzOTtzIGEga2V5IGFyZWEuCiogICBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuY2AgYWRkcyB0ZXN0cyBmb3IgdGhpcyBub2RlIGJpbmRpbmcuIEFsd2F5cyBnb29kIHRvIHNlZSB0ZXN0aW5nLgoqICAgYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGltcGxlbWVudHMgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGFuZCB1cGRhdGVzIHRoZSBjcmVhdGlvbiBmdW5jdGlvbnMgdG8gdGFrZSB0aGUgZmxhZyBpbnRvIGFjY291bnQuCgpTbywgdGhpcyBpcyBhIHByZXR0eSBzZWxmLWNvbnRhaW5lZCBzZXQgb2YgY2hhbmdlczsgaXQmIzM5O3MgYWRkaW5nIHRoZSBhYmlsaXR5IHRvIGJpbmQgZ3Vlc3QgbWVtZmRzIHRvIHNwZWNpZmljIE5VTUEgbm9kZXMuCgpOb3csIHRoZSBpbXBvcnRhbnQgcGFydDogaXMgdGhpcyBmdXp6YWJsZT8gSSBrbm93IGAvZGV2L2t2bWAgaW9jdGxzIChgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGApIGFyZSBjb3JlIGFuZCByZWFjaGFibGUgZnJvbSB0aGUgdXNlcnNwYWNlLCBhbmQgdGhhdCBtZW1wb2xpY3kgY2hhbmdlcyBhcmUgaW4gY29yZSBtZW1vcnkgbWFuYWdlbWVudC4gVGhpcyBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBpbiBhIHN0YW5kYXJkIFFFTVUvc3l6a2FsbGVyIGVudmlyb25tZW50LiBJJiMzOTttIHNlZWluZyB0aGF0IE5VTUEgcG9saWNpZXMgYW5kIGd1ZXN0IG1lbWZkIGFyZSBjb3JlIGtlcm5lbCBzdWJzeXN0ZW1zLiBUaGlzIGxvb2tzIGxpa2UgYSBzb2xpZCAmIzM0O1dvcnRoRnV6emluZyA9IHRydWUmIzM0OyBzY2VuYXJpby4KCk5leHQsIEkgbmVlZCB0byB2ZXJpZnkgS2NvbmZpZyBkZXBlbmRlbmNpZXMuIEkmIzM5O20gZXhwZWN0aW5nIGBLVk1gIChvciBgS1ZNX0lOVEVMYC9gS1ZNX0FNRGAsIGJ1dCBgS1ZNYCBpcyBwcmV0dHkgc3RhbmRhcmQpIGFuZCBgTlVNQWAgdG8gYmUgcmVxdWlyZWQuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZmlsZXMgdG8gc2VlIHRoZSBkZXBlbmRlbmNpZXMsIGVzcGVjaWFsbHkgd2hlcmUgZ3Vlc3RfbWVtZmQgYW5kIG1lbXBvbGljeSBkZXBlbmQgb24gZWFjaCBvdGhlci4gVGhhdCYjMzk7cyB0aGUgbmV4dCBzdGVwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0tWTV9DUkVBVEVfR1VFU1RfTUVNRkQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7RG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0PTYzNTc9aW4gZmxhZ3MgdG8gaGF2ZSBLVk0gYmluZCB0aGUgbWVtb3J5IHJlZ2lvbiB0byBhIGdpdmVuIGd1ZXN0X21lbWZkIHJhbmdlIG9mXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjM1OC1bZ3Vlc3RfbWVtZmRfb2Zmc2V0LCBndWVzdF9tZW1mZF9vZmZzZXQgJiM0MzsgbWVtb3J5X3NpemVdLiAgVGhlIHRhcmdldCBndWVzdF9tZW1mZFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjYzNTk6bXVzdCBwb2ludCBhdCBhIGZpbGUgY3JlYXRlZCB2aWEgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBvbiB0aGUgY3VycmVudCBWTSwgYW5kXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjM2MC10aGUgdGFyZ2V0IHJhbmdlIG11c3Qgbm90IGJlIGJvdW5kIHRvIGFueSBvdGhlciBtZW1vcnkgcmVnaW9uLiAgQWxsIHN0YW5kYXJkXG4tLVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0PTY0MzA9VGhlIFwmIzM0O2ZsYWdzXCYjMzQ7IGZpZWxkIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBhbmQgbXVzdCBiZSAmIzM5OzAmIzM5Oy5cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDMxLVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0MzI6NC4xNDIgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0MzMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDQwLVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0NDE6S1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBjcmVhdGVzIGFuIGFub255bW91cyBmaWxlIGFuZCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ0Mi10aGF0IHJlZmVycyB0byBpdC4gIGd1ZXN0X21lbWZkIGZpbGVzIGFyZSByb3VnaGx5IGFuYWxvZ291cyB0byBmaWxlcyBjcmVhdGVkXG4tLVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0PTY0NzM9VGhlIGNhcGFiaWxpdHkgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUyBlbnVtZXJhdGVzIHRoZSBgZmxhZ3NgIHRoYXQgY2FuIGJlXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q6NjQ3NDpzcGVjaWZpZWQgdmlhIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQuICBDdXJyZW50bHkgZGVmaW5lZCBmbGFnczpcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDc1LVxuLS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDc5LSAgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRCBNYWtlIGFsbCBtZW1vcnkgaW4gdGhlIGZpbGUgc2hhcmVkIGR1cmluZ1xuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0ODA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgKG1lbW9yeSBmaWxlcyBjcmVhdGVkXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ4MS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBJTklUX1NIQVJFRCB3aWxsIGJlIG1hcmtlZCBwcml2YXRlKS5cbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZz04Mz1jb25maWcgS1ZNX1NXX1BST1RFQ1RFRF9WTVxuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTkwLVx0ICBwcm90ZWN0ZWQgVk1zIGFyZSBwdXJlbHkgYSBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyB2ZWhpY2xlIGZvclxuYXJjaC94ODYva3ZtL0tjb25maWc6OTE6XHQgIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQuICBBdHRlbXB0aW5nIHRvIHJ1biBhIFwmIzM0O3JlYWxcJiMzNDsgVk0gd29ya2xvYWQgYXMgYVxuYXJjaC94ODYva3ZtL0tjb25maWctOTItXHQgIHNvZnR3YXJlLXByb3RlY3RlZCBWTSB3aWxsIGZhaWwgbWlzZXJhYmx5LlxuLS1cbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaD0xNjQ5PXN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xuLS1cbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjU3LVxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oOjE2NTg6I2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTktI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcdFx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXG4tLVxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oPTE2NDU9c3RydWN0IGt2bV9tZW1vcnlfYXR0cmlidXRlcyB7XG4tLVxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTMtXG50b29scy9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmg6MTY1NDojZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcdF9JT1dSKEtWTUlPLCAgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpXG50b29scy9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1NS0jZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFx0XHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jPTI4PXN0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTM3LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYzozODpcdHJldHVybiBfX3ZtX2lvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZndWVzdF9tZW1mZCk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTM5LX1cbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jPTQxPXN0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSlcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTQ4LVx0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jOjQ5Olx0VEVTVF9BU1NFUlQoZmQgXHUwMDNlPSAwLCBLVk1fSU9DVExfRVJST1IoS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgZmQpKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMtNTAtXHRyZXR1cm4gZmQ7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaD02Njc9c3RhdGljIGlubGluZSBpbnQgX192bV9jcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLFxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjc0LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaDo2NzU6XHRyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXHUwMDI2Z3Vlc3RfbWVtZmQpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02NzYtfVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg9Njc4PXN0YXRpYyBpbmxpbmUgaW50IHZtX2NyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02ODItXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oOjY4MzpcdFRFU1RfQVNTRVJUKGZkIFx1MDAzZT0gMCwgS1ZNX0lPQ1RMX0VSUk9SKEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGZkKSk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oLTY4NC1cdHJldHVybiBmZDtcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTUxNjc9c3RhdGljIGxvbmcga3ZtX3ZtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM4Ny0jaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxudmlydC9rdm0va3ZtX21haW4uYzo1Mzg4Olx0Y2FzZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEOiB7XG52aXJ0L2t2bS9rdm1fbWFpbi5jLTUzODktXHRcdHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIGd1ZXN0X21lbWZkO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNjgwCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipLVk0gQ29uZmlndXJhdGlvbiBEZWVwIERpdmUqKgoKT2theSwgdGltZSB0byBkaWcgaW50byB0aGUgS1ZNIGNvbmZpZ3VyYXRpb24uIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiBgQ09ORklHX0tWTV9HVUVTVF9NRU1GRGAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBjdXJyZW50IHN0YXR1cyBhbmQgaW1wbGljYXRpb25zLiBCZXlvbmQgdGhhdCwgSSBuZWVkIHRvIGNoZWNrIG91dCBhbnkgb3RoZXIgS2NvbmZpZ3MgdGhhdCBhcmUgb2J2aW91c2x5IHJlbGF0ZWQgdG8gaXQuIFRoZXJlJiMzOTtzIGFsbW9zdCBjZXJ0YWlubHkgYSB3ZWIgb2YgZGVwZW5kZW5jaWVzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBJIG5lZWQgdG8gbWFwIG91dCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIHNwZWNpZmljIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQsIGhvdyBpdCBhZmZlY3RzIHRoZSBndWVzdCBlbnZpcm9ubWVudCwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIGtub2JzIHRoYXQgbWlnaHQgYmUgd29ydGggYWRqdXN0aW5nLiBJdCYjMzk7cyB0aW1lIHRvIGJ1aWxkIGEgc29saWQgbWVudGFsIG1vZGVsIG9mIHRoZSByZWxldmFudCBLY29uZmlnIGxhbmRzY2FwZS4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgY29kZSB0ZWxsIHVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLVk1fR1VFU1RfTUVNRkQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7dmlydC9rdm0vS2NvbmZpZz0xMDM9Y29uZmlnIEtWTV9HRU5FUklDX01FTU9SWV9BVFRSSUJVVEVTXG4tLVxudmlydC9rdm0vS2NvbmZpZy0xMDUtXG52aXJ0L2t2bS9LY29uZmlnOjEwNjpjb25maWcgS1ZNX0dVRVNUX01FTUZEXG52aXJ0L2t2bS9LY29uZmlnLTEwNy0gICAgICAgc2VsZWN0IFhBUlJBWV9NVUxUSVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExOTgyCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIEtWTSBDb25maWd1cmF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGB2aXJ0L2t2bS9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTA2LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgcGFydGljdWxhciBvcHRpb24gaXMgaGFuZGxlZC4gSSBzdXNwZWN0IHdlJiMzOTtyZSBsb29raW5nIGF0IGEgS2NvbmZpZyBzeW1ib2wgcmVsYXRlZCB0byBhIHNwZWNpZmljIHZpcnR1YWxpemF0aW9uIGZlYXR1cmUgb3IgZGV2aWNlLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgSSBtaWdodCBiZSBsb29raW5nIGZvciBkZXBlbmRlbmNpZXMsIGRlZmF1bHQgdmFsdWVzLCBvciBwZXJoYXBzIGV2ZW4gY29tbWVudHMgY2xhcmlmeWluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGlzIG9wdGlvbi4gTXkgZ29hbCBoZXJlIGlzIHRvIGdyYXNwIHRoZSBjb25maWd1cmFiaWxpdHkgb2YgdGhpcyBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aGUgS1ZNIHNldHVwIGFuZCBpdHMgcG90ZW50aWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZSBvciBmdW5jdGlvbmFsaXR5LiBJIHdpbGwgcGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmZWF0dXJlcyBvciBoYXJkd2FyZSwgbG9va2luZyBmb3IgYW55IGVkZ2UgY2FzZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA5MDpcdFxuICA5MTpcdGNvbmZpZyBIQVZFX0tWTV9QTV9OT1RJRklFUlxuICA5MjpcdCAgICAgICBib29sXG4gIDkzOlx0XG4gIDk0Olx0Y29uZmlnIEtWTV9HRU5FUklDX0hBUkRXQVJFX0VOQUJMSU5HXG4gIDk1Olx0ICAgICAgIGJvb2xcbiAgOTY6XHRcbiAgOTc6XHRjb25maWcgS1ZNX0VMSURFX1RMQl9GTFVTSF9JRl9ZT1VOR1xuICA5ODpcdCAgICAgICBib29sXG4gIDk5Olx0XG4gMTAwOlx0Y29uZmlnIEtWTV9NTVVfTE9DS0xFU1NfQUdJTkdcbiAxMDE6XHQgICAgICAgYm9vbFxuIDEwMjpcdFxuIDEwMzpcdGNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xuIDEwNDpcdCAgICAgICBib29sXG4gMTA1Olx0XG4gMTA2Olx0Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxuIDEwNzpcdCAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXG4gMTA4Olx0ICAgICAgIGJvb2xcbiAxMDk6XHRcbiAxMTA6XHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcbiAxMTE6XHQgICAgICAgYm9vbFxuIDExMjpcdCAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxuIDExMzpcdFxuIDExNDpcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fUkVDTEFJTVxuIDExNTpcdCAgICAgICBib29sXG4gMTE2Olx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4gMTE3Olx0XG4gMTE4Olx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9JTlZBTElEQVRFXG4gMTE5Olx0ICAgICAgIGJvb2xcbiAxMjA6XHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbiAxMjE6XHRcbiAxMjI6XHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1BPUFVMQVRFXG4gMTIzOlx0ICAgICAgIGJvb2xcbiAxMjQ6XHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjY0MAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIFNlbGVjdGlvbiBvZiBgS1ZNX0dVRVNUX01FTUZEYCoqCgpPa2F5LCBzbyBzb21lb25lJiMzOTtzIGp1c3QgcGlja2VkIGBLVk1fR1VFU1RfTUVNRkRgLiBMZXQgbWUgcXVpY2tseSBicmVhayBkb3duIHdoYXQgdGhhdCBpbXBsaWVzIGluIHRlcm1zIG9mIGtlcm5lbCBiZWhhdmlvciBhbmQgcG90ZW50aWFsIGltcGxpY2F0aW9ucy4gRmlyc3Qgb2ZmLCB0aGlzIG1lYW5zIHRoZXkmIzM5O3JlIGFpbWluZyBmb3IgYSBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIGludGVyZmFjZSwgd2hpY2gsICp0ZWNobmljYWxseSosIGlzbiYjMzk7dCBuZXcg4oCTIGJ1dCBpdHMgYXBwbGljYXRpb24gb3IgdGhlICpyZWFzb24qIGZvciBpdHMgdXNlIHdhcnJhbnRzIGRlZXBlciBzY3J1dGlueS4KCk15IGltbWVkaWF0ZSBxdWVzdGlvbnMgYXJlOiBXaGF0JiMzOTtzIHRoZSAqc3BlY2lmaWMqIHVzZSBjYXNlIHByb21wdGluZyB0aGlzIHNlbGVjdGlvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBtZW1vcnktYmFja2VkIGd1ZXN0PyBPciBpcyB0aGlzIHBhcnQgb2Ygc29tZSBtb3JlIGludHJpY2F0ZSBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneT8gQXJlIHRoZXkgdGFyZ2V0aW5nIHBlcmZvcm1hbmNlIGdhaW5zIHZpYSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBmcm9tIHVzZXJzcGFjZSwgd2hpY2ggd291bGQgYmUgYW4gb2J2aW91cyBhbmQgZ2VuZXJhbGx5IHVuZGVyc3Rvb2QgcmVhc29uPyBPciBpcyBpdCBzb21ldGhpbmcgbW9yZSBzdWJ0bGU/CgpUaGVuLCBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBzZWN1cml0eSBwb3N0dXJlLiBVc2luZyBndWVzdCBtZW1mZHMgaW50cm9kdWNlcyBwb3RlbnRpYWwgYXR0YWNrIHN1cmZhY2UgY29uc2lkZXJhdGlvbnMg4oCTIGFyZSBhcHByb3ByaWF0ZSBzYWZlZ3VhcmRzIGluIHBsYWNlIHRvIG1pdGlnYXRlIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBtYW5pcHVsYXRpbmcgZ3Vlc3QgbWVtb3J5IGZyb20gdXNlcnNwYWNlIG9yIGV2ZW4gZnJvbSB0aGUgaG9zdCBzaWRlPyBXZSBuZWVkIHRvIHZlcmlmeSB0aGF0IHdlJiMzOTtyZSBwcm9wZXJseSBjb25zaWRlcmluZyBhbmQgaGFyZGVuaW5nIGFsbCB0aGUgYXNzb2NpYXRlZCBhc3BlY3RzIG9mIHRoaXMgYXJjaGl0ZWN0dXJlLgoKRnJvbSBhIHBlcmZvcm1hbmNlIHBlcnNwZWN0aXZlLCBJJiMzOTtsbCBuZWVkIHRvIGRyaWxsIGRvd24gaW50byB0aGUgaW1wbGljYXRpb25zIG9uIG1lbW9yeSBvdmVyaGVhZC4gSXMgdGhlIGdhaW4gaW4gZGlyZWN0IG1lbW9yeSBhY2Nlc3Mgd29ydGggYW55IGludHJvZHVjZWQgb3ZlcmhlYWQgZnJvbSB0aGUgZXh0cmEgYm9va2tlZXBpbmcgdGhhdCB3b3VsZCBiZSBpbnRyb2R1Y2VkPyBJIG5lZWQgdG8gYW5hbHl6ZSBpdHMgaW1wYWN0IG9uIG1lbW9yeSBhbGxvY2F0aW9uLCBkZWFsbG9jYXRpb24sIGFuZCB0aGUgY29udGV4dCBzd2l0Y2hpbmcg4oCTIGlzIHRoZSB0cmFkZS1vZmYgaW4gbGF0ZW5jeSwgd2hpY2ggdGhpcyBpbnRlcmZhY2UgY2FuIGhhdmUsIGJlaW5nIHByb3Blcmx5IGFzc2Vzc2VkPwoKVWx0aW1hdGVseSwgdGhlICYjMzk7d2h5JiMzOTsgaXMgd2hhdCBJIHJlYWxseSBuZWVkIHRvIGdldCBhdC4gQXJlIHRoZXJlIGFueSBleGlzdGluZyBkZXBlbmRlbmNpZXM/IEFyZSB0aGV5IHJlbHlpbmcgb24gdGhpcyBmZWF0dXJlIGFzIGEgbWVhbnMgb2YgcmVkdWNpbmcgbWVtb3J5IGNvcHkgb3ZlcmhlYWQsIHN1cHBvcnRpbmcgc2hhcmVkIG1lbW9yeSwgb3IgbWF5YmUgZXZlbiBlbmFibGluZyBsaXZlIG1pZ3JhdGlvbiBvcHRpbWl6YXRpb25zPyBPciBhcmUgdGhleSBqdXN0IGV4cGVyaW1lbnRpbmc/IEVpdGhlciB3YXksIEkmIzM5O2xsIGJlIGludGVyZXN0ZWQgdG8gc2VlIGhvdyB0aGV5IGxldmVyYWdlIHRoaXMsIGFuZCBpZiBpdCYjMzk7cyBkb25lIGNvcnJlY3RseSwgaWYgdGhpcyBzZWxlY3Rpb24gaXMgcGFydCBvZiBhIGxhcmdlciwgY29oZXJlbnQgYXJjaGl0ZWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzZWxlY3QgS1ZNX0dVRVNUX01FTUZEJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvYXJtNjQva3ZtL0tjb25maWc9MjA9bWVudWNvbmZpZyBLVk1cbi0tXG5hcmNoL2FybTY0L2t2bS9LY29uZmlnLTM4LVx0c2VsZWN0IEdVRVNUX1BFUkZfRVZFTlRTIGlmIFBFUkZfRVZFTlRTXG5hcmNoL2FybTY0L2t2bS9LY29uZmlnOjM5Olx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRFxuYXJjaC9hcm02NC9rdm0vS2NvbmZpZy00MC1cdGhlbHBcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZz0yMD1jb25maWcgS1ZNX1g4NlxuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTQ5LVx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo1MDpcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkQgaWYgWDg2XzY0XG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy01MS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMzMTEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiA5NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGFuIGV4cGVydCBpbiBteSBmaWVsZDoKCioqSW52ZXN0aWdhdGluZyBLVk0gYW5kIE1lbW9yeSBNYW5hZ2VtZW50IG9uIHg4Nl82NCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgaG93IEtWTSBoYW5kbGVzIG1lbW9yeSBvbiB4ODZfNjQuIFNwZWNpZmljYWxseSwgSSBrbm93IHRoYXQgb24gdGhpcyBhcmNoaXRlY3R1cmUsIHRoZSBLVk0gY29yZSAob3IgaXRzIHNwZWNpZmljIEludGVsL0FNRC9YODYgdmFyaWFudHMpIHR5cGljYWxseSBsZXZlcmFnZXMgYEtWTV9HVUVTVF9NRU1GRGAuIEJ1dCBJJiMzOTttIGN1cmlvdXMgYWJvdXQgdGhlIGludGVyYWN0aW9uIHdpdGggTlVNQS4gVGhhdCYjMzk7cyBhbHdheXMgYSBjcml0aWNhbCBjb25zaWRlcmF0aW9uIGZvciBwZXJmb3JtYW5jZSBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50LCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgYXJlIHNwZWNpZmljIGJlaGF2aW9ycyBvciBjb25maWd1cmF0aW9ucyByZWxhdGluZyB0byBLVk0gYW5kIE5vbi1Vbmlmb3JtIE1lbW9yeSBBY2Nlc3MuCgpNeSBuZXh0IHN0ZXAgaXMgY2xlYXI6IEkgbmVlZCB0byBkaWcgaW50byB0aGUga2VybmVsIHNvdXJjZSBjb2RlLiBJJiMzOTtsbCBjaGVjayBgbW0vbWVtcG9saWN5LmNgIGFuZCBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgdG8gc2VlIGhvdyB0aGUgTlVNQSBjb25maWd1cmF0aW9uIChgQ09ORklHX05VTUFgKSBpcyBiZWluZyBoYW5kbGVkLCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byBndWVzdCBtZW1vcnkgYmFja2VkIGJ5IGBtZW1mZGAuIEkgYW50aWNpcGF0ZSB0aGVyZSB3aWxsIGJlIG51YW5jZXMgaW4gbWVtb3J5IGFsbG9jYXRpb24gYW5kIHBsYWNlbWVudCBzdHJhdGVnaWVzIHJlbGF0ZWQgdG8gTlVNQSBub2RlcyB3aGVuIEtWTSBhbmQgYG1lbWZkYCBhcmUgaW52b2x2ZWQuIFRoaXMgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgc3RhcnRpbmcgcG9pbnQgdG8gYmVnaW4gYSBtdWNoIGRlZXBlciBpbnZlc3RpZ2F0aW9uIGludG8gdGhlIGludGVyYWN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfTlVNQSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtcbkZ1bGwgb3V0cHV0IGlzIHRvbyBsb25nLCBzaG93aW5nIDUwMCBvdXQgb2YgODM3IGxpbmVzLlxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxuXG5tbS9NYWtlZmlsZT04Nj1vYmotJChDT05GSUdfSFVHRVRMQl9QQUdFX09QVElNSVpFX1ZNRU1NQVApXHQmIzQzOz0gaHVnZXRsYl92bWVtbWFwLm9cbm1tL01ha2VmaWxlOjg3Om9iai0kKENPTkZJR19OVU1BKSBcdCYjNDM7PSBtZW1wb2xpY3kub1xubW0vTWFrZWZpbGUtODgtb2JqLSQoQ09ORklHX1NQQVJTRU1FTSlcdCYjNDM7PSBzcGFyc2Uub1xuLS1cbm1tL01ha2VmaWxlPTk5PW9iai0kKENPTkZJR19NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlLm9cbm1tL01ha2VmaWxlOjEwMDpvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vXG5tbS9NYWtlZmlsZS0xMDEtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG4tLVxubW0vTWFrZWZpbGU9MTIyPW9iai0kKENPTkZJR19DTUEpXHQmIzQzOz0gY21hLm9cbm1tL01ha2VmaWxlOjEyMzpvYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG51bWEub1xubW0vTWFrZWZpbGU6MTI0Om9iai0kKENPTkZJR19OVU1BX01FTUJMS1MpICYjNDM7PSBudW1hX21lbWJsa3Mub1xubW0vTWFrZWZpbGU6MTI1Om9iai0kKENPTkZJR19OVU1BX0VNVSkgJiM0Mzs9IG51bWFfZW11bGF0aW9uLm9cbm1tL01ha2VmaWxlLTEyNi1vYmotJChDT05GSUdfR0VORVJJQ19BUkNIX05VTUEpICYjNDM7PSBhcmNoX251bWEub1xuLS1cbm1tL2FyY2hfbnVtYS5jPTU4PUVYUE9SVF9TWU1CT0woY3B1bWFza19vZl9ub2RlKTtcbi0tXG5tbS9hcmNoX251bWEuYy02MS1cbm1tL2FyY2hfbnVtYS5jOjYyOiNpZm5kZWYgQ09ORklHX05VTUFfRU1VXG5tbS9hcmNoX251bWEuYy02My1zdGF0aWMgdm9pZCBudW1hX3VwZGF0ZV9jcHUodW5zaWduZWQgaW50IGNwdSwgYm9vbCByZW1vdmUpXG4tLVxubW0vYXJjaF9udW1hLmM9MzIyPXZvaWQgX19pbml0IGFyY2hfbnVtYV9pbml0KHZvaWQpXG4tLVxubW0vYXJjaF9udW1hLmMtMzMzLVxubW0vYXJjaF9udW1hLmM6MzM0OiNpZmRlZiBDT05GSUdfTlVNQV9FTVVcbm1tL2FyY2hfbnVtYS5jLTMzNS12b2lkIF9faW5pdCBudW1hX2VtdV91cGRhdGVfY3B1X3RvX25vZGUoaW50ICplbXVfbmlkX3RvX3BoeXMsXG4tLVxubW0vYXJjaF9udW1hLmM9MzYwPXZvaWQgZGVidWdfY3B1bWFza19zZXRfY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCBub2RlLCBib29sIGVuYWJsZSlcbi0tXG5tbS9hcmNoX251bWEuYy0zODItfVxubW0vYXJjaF9udW1hLmM6MzgzOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi9cbi0tXG5tbS9jbWEuYz00MzY9c3RhdGljIGludCBfX2luaXQgX19jbWFfZGVjbGFyZV9jb250aWd1b3VzX25pZChwaHlzX2FkZHJfdCAqYmFzZXAsXG4tLVxubW0vY21hLmMtNDU5LVxubW0vY21hLmM6NDYwOlx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19OVU1BKSlcbm1tL2NtYS5jLTQ2MS1cdFx0bmlkID0gTlVNQV9OT19OT0RFO1xuLS1cbm1tL2NvbXBhY3Rpb24uYz0zMDA1PXN0YXRpYyBpbnQgc3lzY3RsX2NvbXBhY3Rpb25faGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxuLS1cbm1tL2NvbXBhY3Rpb24uYy0zMDIyLVxubW0vY29tcGFjdGlvbi5jOjMwMjM6I2lmIGRlZmluZWQoQ09ORklHX1NZU0ZTKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfTlVNQSlcbm1tL2NvbXBhY3Rpb24uYy0zMDI0LXN0YXRpYyBzc2l6ZV90IGNvbXBhY3Rfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LFxuLS1cbm1tL2NvbXBhY3Rpb24uYz0zMDQ2PXZvaWQgY29tcGFjdGlvbl91bnJlZ2lzdGVyX25vZGUoc3RydWN0IG5vZGUgKm5vZGUpXG4tLVxubW0vY29tcGFjdGlvbi5jLTMwNDktfVxubW0vY29tcGFjdGlvbi5jOjMwNTA6I2VuZGlmIC8qIENPTkZJR19TWVNGUyBcdTAwMjZcdTAwMjYgQ09ORklHX05VTUEgKi9cbm1tL2NvbXBhY3Rpb24uYy0zMDUxLVxuLS1cbm1tL2RhbW9uL2NvcmUuYz0yODkzPXN0YXRpYyBpbmxpbmUgdTY0IGRhbW9zX2dldF9zb21lX21lbV9wc2lfdG90YWwodm9pZClcbi0tXG5tbS9kYW1vbi9jb3JlLmMtMjg5OS1cbm1tL2RhbW9uL2NvcmUuYzoyOTAwOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vZGFtb24vY29yZS5jLTI5MDEtc3RhdGljIGJvb2wgaW52YWxpZF9tZW1fbm9kZShpbnQgbmlkKVxuLS1cbm1tL2RhbW9uL2NvcmUuYz0zMDgxPXN0YXRpYyB1bnNpZ25lZCBsb25nIGRhbW9zX2dldF9ub2RlX2VsaWdpYmxlX21lbV9icChzdHJ1Y3QgZGFtb25fY3R4ICpjLFxuLS1cbm1tL2RhbW9uL2NvcmUuYy0zMDg2LSNlbmRpZiAvKiBDT05GSUdfREFNT05fUEFERFIgKi9cbm1tL2RhbW9uL2NvcmUuYzozMDg3OiNlbHNlIC8qIENPTkZJR19OVU1BICovXG5tbS9kYW1vbi9jb3JlLmMtMzA4OC1zdGF0aWMgX19rZXJuZWxfdWxvbmdfdCBkYW1vc19nZXRfbm9kZV9tZW1fYnAoXG4tLVxubW0vZGFtb24vY29yZS5jPTMxMDA9c3RhdGljIHVuc2lnbmVkIGxvbmcgZGFtb3NfZ2V0X25vZGVfZWxpZ2libGVfbWVtX2JwKHN0cnVjdCBkYW1vbl9jdHggKmMsXG4tLVxubW0vZGFtb24vY29yZS5jLTMxMDQtfVxubW0vZGFtb24vY29yZS5jOjMxMDU6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXG5tbS9kYW1vbi9jb3JlLmMtMzEwNi1cbi0tXG5tbS9kZWJ1Zy5jPTE3MT12b2lkIGR1bXBfbW0oY29uc3Qgc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4tLVxubW0vZGVidWcuYy0xOTEtI2VuZGlmXG5tbS9kZWJ1Zy5jOjE5MjojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9kZWJ1Zy5jLTE5My1cdFx0XCYjMzQ7bnVtYV9uZXh0X3NjYW4gJWx1IG51bWFfc2Nhbl9vZmZzZXQgJWx1IG51bWFfc2Nhbl9zZXEgJWRcXG5cJiMzNDtcbi0tXG5tbS9kZWJ1Zy5jLTIyMC0jZW5kaWZcbm1tL2RlYnVnLmM6MjIxOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcbm1tL2RlYnVnLmMtMjIyLVx0XHRtbS1cdTAwM2VudW1hX25leHRfc2NhbiwgbW0tXHUwMDNlbnVtYV9zY2FuX29mZnNldCwgbW0tXHUwMDNlbnVtYV9zY2FuX3NlcSxcbi0tXG5tbS9maWxlbWFwLmM9OTk2PUVYUE9SVF9TWU1CT0xfR1BMKGZpbGVtYXBfYWRkX2ZvbGlvKTtcbm1tL2ZpbGVtYXAuYy05OTctXG5tbS9maWxlbWFwLmM6OTk4OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vZmlsZW1hcC5jLTk5OS1zdHJ1Y3QgZm9saW8gKmZpbGVtYXBfYWxsb2NfZm9saW9fbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuLS1cbm1tL2h1Z2V0bGIuYz0yMjM4PXN0YXRpYyBub2RlbWFza190ICpwb2xpY3lfbWJpbmRfbm9kZW1hc2soZ2ZwX3QgZ2ZwKVxubW0vaHVnZXRsYi5jLTIyMzkte1xubW0vaHVnZXRsYi5jOjIyNDA6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiLmMtMjI0MS1cdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7XG4tLVxubW0vaHVnZXRsYi5jPTI5Nzc9c3RydWN0IGZvbGlvICphbGxvY19odWdldGxiX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2V0bGIuYy0zMDUyLVx0XHQubmlkID0gbmlkLFxubW0vaHVnZXRsYi5jOjMwNTM6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiLmMtMzA1NC1cdFx0Lm1vZGUgPSBtcG9sID8gbXBvbC1cdTAwM2Vtb2RlIDogTVBPTF9ERUZBVUxULFxuLS1cbm1tL2h1Z2V0bGJfY21hLmM9MjY9c3RhdGljIHVuc2lnbmVkIGludCBodWdldGxiX2NtYV9wZXJjZW50X2luX25vZGVbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhO1xubW0vaHVnZXRsYl9jbWEuYy0yNy1cbm1tL2h1Z2V0bGJfY21hLmM6Mjg6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX2NtYS5jLTI5LXN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgbWVtYmxvY2tfbm9kZV9tZW1vcnlfc2l6ZShpbnQgbmlkKVxuLS1cbm1tL2h1Z2V0bGJfc3lzY3RsLmM9NTM9c3RhdGljIGludCBodWdldGxiX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4tLVxubW0vaHVnZXRsYl9zeXNjdGwuYy02MC1cbm1tL2h1Z2V0bGJfc3lzY3RsLmM6NjE6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX3N5c2N0bC5jLTYyLXN0YXRpYyBpbnQgaHVnZXRsYl9tZW1wb2xpY3lfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcbi0tXG5tbS9odWdldGxiX3N5c2N0bC5jLTY3LX1cbm1tL2h1Z2V0bGJfc3lzY3RsLmM6Njg6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXG5tbS9odWdldGxiX3N5c2N0bC5jLTY5LVxuLS1cbm1tL2h1Z2V0bGJfc3lzY3RsLmM9OTk9c3RhdGljIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgaHVnZXRsYl90YWJsZVtdID0ge1xuLS1cbm1tL2h1Z2V0bGJfc3lzY3RsLmMtMTA2LVx0fSxcbm1tL2h1Z2V0bGJfc3lzY3RsLmM6MTA3OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vaHVnZXRsYl9zeXNjdGwuYy0xMDgtXHR7XG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jPTg2PUhTVEFURV9BVFRSKG5yX2h1Z2VwYWdlcyk7XG5tbS9odWdldGxiX3N5c2ZzLmMtODctXG5tbS9odWdldGxiX3N5c2ZzLmM6ODg6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX3N5c2ZzLmMtODktXG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jPTI4MD1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaHN0YXRlX2F0dHJzW10gPSB7XG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jLTI4NS1cdFx1MDAyNnN1cnBsdXNfaHVnZXBhZ2VzX2F0dHIuYXR0cixcbm1tL2h1Z2V0bGJfc3lzZnMuYzoyODY6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX3N5c2ZzLmMtMjg3LVx0XHUwMDI2bnJfaHVnZXBhZ2VzX21lbXBvbGljeV9hdHRyLmF0dHIsXG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jPTMwNj1zdGF0aWMgaW50IGh1Z2V0bGJfc3lzZnNfYWRkX2hzdGF0ZShzdHJ1Y3QgaHN0YXRlICpoLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LFxuLS1cbm1tL2h1Z2V0bGJfc3lzZnMuYy0zMzgtXG5tbS9odWdldGxiX3N5c2ZzLmM6MzM5OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vaHVnZXRsYl9zeXNmcy5jLTM0MC1zdGF0aWMgYm9vbCBodWdldGxiX3N5c2ZzX2luaXRpYWxpemVkIF9fcm9fYWZ0ZXJfaW5pdDtcbi0tXG5tbS9odWdldGxiX3N5c2ZzLmM9NDYxPXN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX3JlZ2lzdGVyX2FsbF9ub2Rlcyh2b2lkKVxuLS1cbm1tL2h1Z2V0bGJfc3lzZnMuYy00NjctfVxubW0vaHVnZXRsYl9zeXNmcy5jOjQ2ODojZWxzZVx0LyogIUNPTkZJR19OVU1BICovXG5tbS9odWdldGxiX3N5c2ZzLmMtNDY5LVxuLS1cbm1tL2h1Z2V0bGJfc3lzZnMuYz00ODI9dm9pZCBfX2luaXQgaHVnZXRsYl9zeXNmc19pbml0KHZvaWQpXG4tLVxubW0vaHVnZXRsYl9zeXNmcy5jLTQ5Ny1cbm1tL2h1Z2V0bGJfc3lzZnMuYzo0OTg6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9odWdldGxiX3N5c2ZzLmMtNDk5LVx0aHVnZXRsYl9zeXNmc19pbml0aWFsaXplZCA9IHRydWU7XG4tLVxubW0vaW50ZXJuYWwuaD03Nj11bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL2ludGVybmFsLmgtODEtXG5tbS9pbnRlcm5hbC5oOjgyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vaW50ZXJuYWwuaC04My1leHRlcm4gaW50IHN5c2N0bF9taW5fdW5tYXBwZWRfcmF0aW87XG4tLVxubW0vaW50ZXJuYWwuaD0xMTI4PXN0YXRpYyBpbmxpbmUgdm9pZCBtbG9ja19kcmFpbl9yZW1vdGUoaW50IGNwdSkgeyB9XG4tLVxubW0vaW50ZXJuYWwuaC0xMTMwLVxubW0vaW50ZXJuYWwuaDoxMTMxOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vaW50ZXJuYWwuaC0xMTMyLWV4dGVybiBpbnQgbm9kZV9yZWNsYWltX21vZGU7XG4tLVxubW0vaW50ZXJuYWwuaD0xMjM5PXN0YXRpYyBpbmxpbmUgYm9vbCB2bWFfaXNfc2luZ2xlX3RocmVhZGVkX3ByaXZhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4tLVxubW0vaW50ZXJuYWwuaC0xMjQ2LVxubW0vaW50ZXJuYWwuaDoxMjQ3OiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcbm1tL2ludGVybmFsLmgtMTI0OC1ib29sIGZvbGlvX2Nhbl9tYXBfcHJvdF9udW1hKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYz0xMDI3PXN0YXRpYyBpbmxpbmUgZ2ZwX3QgYWxsb2NfaHVnZXBhZ2Vfa2h1Z2VwYWdlZF9nZnBtYXNrKHZvaWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwMzEtXG5tbS9raHVnZXBhZ2VkLmM6MTAzMjojaWZkZWYgQ09ORklHX05VTUFcbm1tL2todWdlcGFnZWQuYy0xMDMzLXN0YXRpYyBpbnQgY29sbGFwc2VfZmluZF90YXJnZXRfbm9kZShzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4tLVxubW0va3NtLmMtNTAtXG5tbS9rc20uYzo1MTojaWZkZWYgQ09ORklHX05VTUFcbm1tL2tzbS5jLTUyLSNkZWZpbmUgTlVNQSh4KVx0XHQoeClcbi0tXG5tbS9rc20uYz0xNTk9c3RydWN0IGtzbV9zdGFibGVfbm9kZSB7XG4tLVxubW0va3NtLmMtMTgxLVx0aW50IHJtYXBfaGxpc3RfbGVuO1xubW0va3NtLmM6MTgyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0va3NtLmMtMTgzLVx0aW50IG5pZDtcbi0tXG5tbS9rc20uYz0yMDI9c3RydWN0IGtzbV9ybWFwX2l0ZW0ge1xuLS1cbm1tL2tzbS5jLTIwNS1cdFx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYTtcdC8qIGZvciByZXZlcnNlIG1hcHBpbmcsIHdoZW4gc3RhYmxlICovXG5tbS9rc20uYzoyMDY6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9rc20uYy0yMDctXHRcdGludCBuaWQ7XHRcdC8qIHdoZW4gbm9kZSBvZiB1bnN0YWJsZSB0cmVlICovXG4tLVxubW0va3NtLmM9NDY5PXN0YXRpYyB2b2lkIGFkdmlzb3Jfc3RvcF9zY2FuKHZvaWQpXG4tLVxubW0va3NtLmMtNDc0LVxubW0va3NtLmM6NDc1OiNpZmRlZiBDT05GSUdfTlVNQVxubW0va3NtLmMtNDc2LS8qIFplcm9lZCB3aGVuIG1lcmdpbmcgYWNyb3NzIG5vZGVzIGlzIG5vdCBhbGxvd2VkICovXG4tLVxubW0va3NtLmM9ODU3PXN0YXRpYyBzdHJ1Y3Qga3NtX3N0YWJsZV9ub2RlICphbGxvY19zdGFibGVfbm9kZV9jaGFpbihzdHJ1Y3Qga3NtX3N0YWJsZV9ub2RlICpkdXAsXG4tLVxubW0va3NtLmMtODY1LVx0XHRjaGFpbi1cdTAwM2VybWFwX2hsaXN0X2xlbiA9IFNUQUJMRV9OT0RFX0NIQUlOO1xubW0va3NtLmM6ODY2OiNpZiBkZWZpbmVkIChDT05GSUdfREVCVUdfVk0pIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19OVU1BKVxubW0va3NtLmMtODY3LVx0XHRjaGFpbi1cdTAwM2VuaWQgPSBOVU1BX05PX05PREU7IC8qIGRlYnVnICovXG4tLVxubW0va3NtLmM9MzU5NT1LU01fQVRUUihydW4pO1xubW0va3NtLmMtMzU5Ni1cbm1tL2tzbS5jOjM1OTc6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9rc20uYy0zNTk4LXN0YXRpYyBzc2l6ZV90IG1lcmdlX2Fjcm9zc19ub2Rlc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLFxuLS1cbm1tL2tzbS5jPTM5ODE9c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmtzbV9hdHRyc1tdID0ge1xuLS1cbm1tL2tzbS5jLTM5OTItXHRcdTAwMjZmdWxsX3NjYW5zX2F0dHIuYXR0cixcbm1tL2tzbS5jOjM5OTM6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9rc20uYy0zOTk0LVx0XHUwMDI2bWVyZ2VfYWNyb3NzX25vZGVzX2F0dHIuYXR0cixcbi0tXG5tbS9tZW1ibG9jay5jLTEwNS1cbm1tL21lbWJsb2NrLmM6MTA2OiNpZm5kZWYgQ09ORklHX05VTUFcbm1tL21lbWJsb2NrLmMtMTA3LXN0cnVjdCBwZ2xpc3RfZGF0YSBfX3JlZmRhdGEgY29udGlnX3BhZ2VfZGF0YTtcbi0tXG5tbS9tZW1ibG9jay5jPTYxMD1zdGF0aWMgaW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19hZGRfcmFuZ2Uoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUsXG4tLVxubW0vbWVtYmxvY2suYy02NjYtXHRcdGlmIChyYmFzZSBcdTAwM2UgYmFzZSkge1xubW0vbWVtYmxvY2suYzo2Njc6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tZW1ibG9jay5jLTY2OC1cdFx0XHRXQVJOX09OKG5pZCAhPSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSk7XG4tLVxubW0vbWVtYmxvY2suYz0xNDg5PWludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfc2V0X25vZGUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSxcbi0tXG5tbS9tZW1ibG9jay5jLTE0OTEte1xubW0vbWVtYmxvY2suYzoxNDkyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtYmxvY2suYy0xNDkzLVx0aW50IHN0YXJ0X3JnbiwgZW5kX3Jnbjtcbi0tXG5tbS9tZW1ibG9jay5jPTIxOTI9c3RhdGljIHZvaWQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2R1bXAoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUpXG4tLVxubW0vbWVtYmxvY2suYy0yMjA3LVx0XHRmbGFncyA9IHJnbi1cdTAwM2VmbGFncztcbm1tL21lbWJsb2NrLmM6MjIwODojaWZkZWYgQ09ORklHX05VTUFcbm1tL21lbWJsb2NrLmMtMjIwOS1cdFx0aWYgKG51bWFfdmFsaWRfbm9kZShtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSkpXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE2OTk9c3RhdGljIHNzaXplX3QgbWVtX2Nncm91cF9yZXNldChzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmJ1Zixcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTczNS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNzM2OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtY29udHJvbC12MS5jLTE3MzctXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE3ODA9c3RhdGljIGludCBtZW1jZ19udW1hX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4tLVxubW0vbWVtY29udHJvbC12MS5jLTE4MjMtfVxubW0vbWVtY29udHJvbC12MS5jOjE4MjQ6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXG5tbS9tZW1jb250cm9sLXYxLmMtMTgyNS1cbi0tXG5tbS9tZW1jb250cm9sLXYxLmM9MjAyOD1zdHJ1Y3QgY2Z0eXBlIG1lbV9jZ3JvdXBfbGVnYWN5X2ZpbGVzW10gPSB7XG4tLVxubW0vbWVtY29udHJvbC12MS5jLTIwOTMtXHR9LFxubW0vbWVtY29udHJvbC12MS5jOjIwOTQ6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tZW1jb250cm9sLXYxLmMtMjA5NS1cdHtcbi0tXG5tbS9tZW1jb250cm9sLmM9Mzc4PXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWVtY2dfbm9kZV9zdGF0X2l0ZW1zW10gPSB7XG4tLVxubW0vbWVtY29udHJvbC5jLTQwOS0jZW5kaWZcbm1tL21lbWNvbnRyb2wuYzo0MTA6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xubW0vbWVtY29udHJvbC5jLTQxMS1cdFBHUFJPTU9URV9TVUNDRVNTLFxuLS1cbm1tL21lbWNvbnRyb2wuYz01OTg9c3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtZW1jZ192bV9ldmVudF9zdGF0W10gPSB7XG4tLVxubW0vbWVtY29udHJvbC5jLTYyNS0jZW5kaWZcbm1tL21lbWNvbnRyb2wuYzo2MjY6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xubW0vbWVtY29udHJvbC5jLTYyNy1cdE5VTUFfUEFHRV9NSUdSQVRFLFxuLS1cbm1tL21lbWNvbnRyb2wuYz0xNTkxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWVtb3J5X3N0YXQgbWVtb3J5X3N0YXRzW10gPSB7XG4tLVxubW0vbWVtY29udHJvbC5jLTE2NTAtXHR7IFwmIzM0O3BncmVmaWxsXCYjMzQ7LFx0XHRcdFBHUkVGSUxMXHRcdH0sXG5tbS9tZW1jb250cm9sLmM6MTY1MTojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tZW1jb250cm9sLmMtMTY1Mi1cdHsgXCYjMzQ7cGdwcm9tb3RlX3N1Y2Nlc3NcJiMzNDssXHRcdFBHUFJPTU9URV9TVUNDRVNTXHR9LFxuLS1cbm1tL21lbWNvbnRyb2wuYz0xNjczPXN0YXRpYyBpbnQgbWVtY2dfcGFnZV9zdGF0ZV9vdXRwdXRfdW5pdChpbnQgaXRlbSlcbi0tXG5tbS9tZW1jb250cm9sLmMtMTcwMi1cdGNhc2UgUEdSRUZJTEw6XG5tbS9tZW1jb250cm9sLmM6MTcwMzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tZW1jb250cm9sLmMtMTcwNC1cdGNhc2UgUEdQUk9NT1RFX1NVQ0NFU1M6XG4tLVxubW0vbWVtY29udHJvbC5jPTUwMzE9aW50IG1lbW9yeV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuLS1cbm1tL21lbWNvbnRyb2wuYy01MDQ1LVxubW0vbWVtY29udHJvbC5jOjUwNDY6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tZW1jb250cm9sLmMtNTA0Ny1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbHJ1dmVjX3BhZ2Vfc3RhdGVfb3V0cHV0KHN0cnVjdCBscnV2ZWMgKmxydXZlYyxcbi0tXG5tbS9tZW1jb250cm9sLmM9NTEyOD1zdGF0aWMgc3RydWN0IGNmdHlwZSBtZW1vcnlfZmlsZXNbXSA9IHtcbi0tXG5tbS9tZW1jb250cm9sLmMtNTE4MS1cdH0sXG5tbS9tZW1jb250cm9sLmM6NTE4MjojaWZkZWYgQ09ORklHX05VTUFcbm1tL21lbWNvbnRyb2wuYy01MTgzLVx0e1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTQ5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3RpZXJfc3Vic3lzID0ge1xuLS1cbm1tL21lbW9yeS10aWVycy5jLTUzLVxubW0vbWVtb3J5LXRpZXJzLmM6NTQ6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xubW0vbWVtb3J5LXRpZXJzLmMtNTUtLyoqXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NjU9Ym9vbCBmb2xpb191c2VfYWNjZXNzX3RpbWUoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9tZW1vcnktdGllcnMuYy03MS1cbm1tL21lbW9yeS10aWVycy5jOjcyOiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbW9yeS10aWVycy5jLTczLXN0YXRpYyBpbnQgdG9wX3RpZXJfYWRpc3RhbmNlO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTEzMT1zdGF0aWMgc3RydWN0IGRlbW90aW9uX25vZGVzICpub2RlX2RlbW90aW9uIF9fcmVhZF9tb3N0bHk7XG5tbS9tZW1vcnktdGllcnMuYzoxMzI6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xubW0vbWVtb3J5LXRpZXJzLmMtMTMzLVxuLS1cbm1tL21lbW9yeS10aWVycy5jPTI2MD1zdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpfX25vZGVfZ2V0X21lbW9yeV90aWVyKGludCBub2RlKVxuLS1cbm1tL21lbW9yeS10aWVycy5jLTI3NS1cbm1tL21lbW9yeS10aWVycy5jOjI3NjojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy0yNzctYm9vbCBub2RlX2lzX3RvcHRpZXIoaW50IG5vZGUpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9NTIxPXN0YXRpYyBpbmxpbmUgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKSB7fVxubW0vbWVtb3J5LXRpZXJzLmM6NTIyOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cbm1tL21lbW9yeS10aWVycy5jLTUyMy1cbi0tXG5tbS9tZW1vcnktdGllcnMuYz05MDY9c3RhdGljIGludCBfX2luaXQgbWVtb3J5X3RpZXJfaW5pdCh2b2lkKVxuLS1cbm1tL21lbW9yeS10aWVycy5jLTkxMy1cbm1tL21lbW9yeS10aWVycy5jOjkxNDojaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5tbS9tZW1vcnktdGllcnMuYy05MTUtXHRub2RlX2RlbW90aW9uID0ga3phbGxvY19vYmpzKHN0cnVjdCBkZW1vdGlvbl9ub2RlcywgbnJfbm9kZV9pZHMpO1xuLS1cbm1tL21lbW9yeS10aWVycy5jPTkzOT1ib29sIG51bWFfZGVtb3Rpb25fZW5hYmxlZCA9IGZhbHNlO1xubW0vbWVtb3J5LXRpZXJzLmMtOTQwLVxubW0vbWVtb3J5LXRpZXJzLmM6OTQxOiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbW9yeS10aWVycy5jLTk0Mi0jaWZkZWYgQ09ORklHX1NZU0ZTXG4tLVxubW0vbWVtb3J5LmM9NjExNz1pbnQgbnVtYV9taWdyYXRlX2NoZWNrKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9mYXVsdCAqdm1mLFxuLS1cbm1tL21lbW9yeS5jLTYxNTItXHRjb3VudF92bV9udW1hX2V2ZW50KE5VTUFfSElOVF9GQVVMVFMpO1xubW0vbWVtb3J5LmM6NjE1MzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tZW1vcnkuYy02MTU0LVx0Y291bnRfbWVtY2dfZm9saW9fZXZlbnRzKGZvbGlvLCBOVU1BX0hJTlRfRkFVTFRTLCAxKTtcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE4Nj1NT0RVTEVfUEFSTV9ERVNDKGF1dG9fbW92YWJsZV9yYXRpbyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5Mi0gKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTkzOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xOTQtc3RhdGljIGJvb2wgYXV0b19tb3ZhYmxlX251bWFfYXdhcmUgX19yZWFkX21vc3RseSA9IHRydWU7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xOTY9TU9EVUxFX1BBUk1fREVTQyhhdXRvX21vdmFibGVfbnVtYV9hd2FyZSxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5OC1cdFx0XCYjMzQ7XFxcJiMzNDthdXRvLW1vdmFibGVcXFwmIzM0OyBvbmxpbmUgcG9saWN5LiBEZWZhdWx0OiB0cnVlXCYjMzQ7KTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTk5OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMDAtXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz05NjA9c3RhdGljIHN0cnVjdCB6b25lICphdXRvX21vdmFibGVfem9uZV9mb3JfcGZuKGludCBuaWQsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDA5LVxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMDEwOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDExLVx0aWYgKGF1dG9fbW92YWJsZV9udW1hX2F3YXJlIFx1MDAyNlx1MDAyNlxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxMy1cdFx0Z290byBrZXJuZWxfem9uZTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTAxNDojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxNS1cbi0tXG5tbS9tZW1wb2xpY3kuYz03OTM9c3RhdGljIGludCBxdWV1ZV9mb2xpb3NfaHVnZXRsYihwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGhtYXNrLFxuLS1cbm1tL21lbXBvbGljeS5jLTg0Mi1cbm1tL21lbXBvbGljeS5jOjg0MzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tZW1wb2xpY3kuYy04NDQtLyoqXG4tLVxubW0vbWVtcG9saWN5LmM9OTEyPXVuc2lnbmVkIGxvbmcgY2hhbmdlX3Byb3RfbnVtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9tZW1wb2xpY3kuYy05MjktfVxubW0vbWVtcG9saWN5LmM6OTMwOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi9cbm1tL21lbXBvbGljeS5jLTkzMS1cbi0tXG5tbS9tZW1wb2xpY3kuYz0xMjA3PXN0YXRpYyBsb25nIGRvX2dldF9tZW1wb2xpY3koaW50ICpwb2xpY3ksIG5vZGVtYXNrX3QgKm5tYXNrLFxuLS1cbm1tL21lbXBvbGljeS5jLTEzMDctXG5tbS9tZW1wb2xpY3kuYzoxMzA4OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21lbXBvbGljeS5jLTEzMDktc3RhdGljIGJvb2wgbWlncmF0ZV9mb2xpb19hZGQoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqZm9saW9saXN0LFxuLS1cbm1tL21lbXBvbGljeS5jPTMzNzU9RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX2ZyZWVfc2hhcmVkX3BvbGljeSwgXCYjMzQ7a3ZtXCYjMzQ7KTtcbm1tL21lbXBvbGljeS5jLTMzNzYtXG5tbS9tZW1wb2xpY3kuYzozMzc3OiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcbm1tL21lbXBvbGljeS5jLTMzNzgtc3RhdGljIGludCBfX2luaXRkYXRhIG51bWFiYWxhbmNpbmdfb3ZlcnJpZGU7XG4tLVxubW0vbWVtcG9saWN5LmM9MzM4MD1zdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfbnVtYWJhbGFuY2luZ19lbmFibGUodm9pZClcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMzgzLVxubW0vbWVtcG9saWN5LmM6MzM4NDpcdGlmIChJU19FTkFCTEVEKENPTkZJR19OVU1BX0JBTEFOQ0lOR19ERUZBVUxUX0VOQUJMRUQpKVxubW0vbWVtcG9saWN5LmMtMzM4NS1cdFx0bnVtYWJhbGFuY2luZ19kZWZhdWx0ID0gdHJ1ZTtcbi0tXG5tbS9tZW1wb2xpY3kuYz0zNDE5PXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgY2hlY2tfbnVtYWJhbGFuY2luZ19lbmFibGUodm9pZClcbi0tXG5tbS9tZW1wb2xpY3kuYy0zNDIxLX1cbm1tL21lbXBvbGljeS5jOjM0MjI6I2VuZGlmIC8qIENPTkZJR19OVU1BX0JBTEFOQ0lORyAqL1xubW0vbWVtcG9saWN5LmMtMzQyMy1cbi0tXG5tbS9taWdyYXRlLmM9MjE5Nz1zdHJ1Y3QgZm9saW8gKmFsbG9jX21pZ3JhdGlvbl90YXJnZXQoc3RydWN0IGZvbGlvICpzcmMsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSlcbi0tXG5tbS9taWdyYXRlLmMtMjIzNS1cbm1tL21pZ3JhdGUuYzoyMjM2OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cbm1tL21pZ3JhdGUuYy0yMjM3LXN0YXRpYyBpbnQgc3RvcmVfc3RhdHVzKGludCBfX3VzZXIgKnN0YXR1cywgaW50IHN0YXJ0LCBpbnQgdmFsdWUsIGludCBucilcbi0tXG5tbS9taWdyYXRlLmM9MjYzMz1TWVNDQUxMX0RFRklORTYobW92ZV9wYWdlcywgcGlkX3QsIHBpZCwgdW5zaWduZWQgbG9uZywgbnJfcGFnZXMsXG4tLVxubW0vbWlncmF0ZS5jLTI2MzktfVxubW0vbWlncmF0ZS5jOjI2NDA6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xubW0vbWlncmF0ZS5jLTI2NDEtXG5tbS9taWdyYXRlLmM6MjY0MjojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9taWdyYXRlLmMtMjY0My0vKlxuLS1cbm1tL21pZ3JhdGUuYz0yNzU1PWludCBtaWdyYXRlX21pc3BsYWNlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbm9kZSlcbi0tXG5tbS9taWdyYXRlLmMtMjc4MS19XG5tbS9taWdyYXRlLmM6Mjc4MjojZW5kaWYgLyogQ09ORklHX05VTUFfQkFMQU5DSU5HICovXG4tLVxubW0vbW1faW5pdC5jLTQ1LVxubW0vbW1faW5pdC5jOjQ2OiNpZm5kZWYgQ09ORklHX05VTUFcbm1tL21tX2luaXQuYy00Ny11bnNpZ25lZCBsb25nIG1heF9tYXBucjtcbi0tXG5tbS9tbV9pbml0LmM9NTk2PXZvaWQgX19tZW1pbml0IF9faW5pdF9zaW5nbGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwZm4sXG4tLVxubW0vbW1faW5pdC5jLTYxMy1cbm1tL21tX2luaXQuYzo2MTQ6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tbV9pbml0LmMtNjE1LS8qXG4tLVxubW0vbW1faW5pdC5jPTY3OD1zdGF0aWMgaW5saW5lIHZvaWQgZml4dXBfaGFzaGRpc3Qodm9pZCkge31cbm1tL21tX2luaXQuYzo2Nzk6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXG5tbS9tbV9pbml0LmMtNjgwLVxuLS1cbm1tL21tem9uZS5jPTQ2PXN0YXRpYyBpbmxpbmUgaW50IHpyZWZfaW5fbm9kZW1hc2soc3RydWN0IHpvbmVyZWYgKnpyZWYsXG4tLVxubW0vbW16b25lLmMtNDgte1xubW0vbW16b25lLmM6NDk6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9tbXpvbmUuYy01MC1cdHJldHVybiBub2RlX2lzc2V0KHpvbmVsaXN0X25vZGVfaWR4KHpyZWYpLCAqbm9kZXMpO1xuLS1cbm1tL21tem9uZS5jLTUyLVx0cmV0dXJuIDE7XG5tbS9tbXpvbmUuYzo1MzojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbm1tL21tem9uZS5jLTU0LX1cbi0tXG5tbS9tbXpvbmUuYz03Nj12b2lkIGxydXZlY19pbml0KHN0cnVjdCBscnV2ZWMgKmxydXZlYylcbi0tXG5tbS9tbXpvbmUuYy05Ny1cbm1tL21tem9uZS5jOjk4OiNpZiBkZWZpbmVkKENPTkZJR19OVU1BX0JBTEFOQ0lORykgXHUwMDI2XHUwMDI2ICFkZWZpbmVkKExBU1RfQ1BVUElEX05PVF9JTl9QQUdFX0ZMQUdTKVxubW0vbW16b25lLmMtOTktaW50IGZvbGlvX3hjaGdfbGFzdF9jcHVwaWQoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IGNwdXBpZClcbi0tXG5tbS9tcHJvdGVjdC5jPTY4Nj1sb25nIGNoYW5nZV9wcm90ZWN0aW9uKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsXG4tLVxubW0vbXByb3RlY3QuYy03MDMtXG5tbS9tcHJvdGVjdC5jOjcwNDojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXG5tbS9tcHJvdGVjdC5jLTcwNS1cdC8qXG4tLVxubW0vbnVtYV9tZW1ibGtzLmM9NTA2PWludCBfX2luaXQgbnVtYV9maWxsX21lbWJsa3ModTY0IHN0YXJ0LCB1NjQgZW5kKVxuLS1cbm1tL251bWFfbWVtYmxrcy5jLTU1NS1cbm1tL251bWFfbWVtYmxrcy5jOjU1NjojaWZkZWYgQ09ORklHX05VTUFfS0VFUF9NRU1JTkZPXG5tbS9udW1hX21lbWJsa3MuYy01NTctc3RhdGljIGludCBtZW1pbmZvX3RvX25pZChzdHJ1Y3QgbnVtYV9tZW1pbmZvICptaSwgdTY0IHN0YXJ0KVxuLS1cbm1tL251bWFfbWVtYmxrcy5jPTU5MT1FWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7XG5tbS9udW1hX21lbWJsa3MuYy01OTItXG5tbS9udW1hX21lbWJsa3MuYzo1OTM6I2VuZGlmIC8qIENPTkZJR19OVU1BX0tFRVBfTUVNSU5GTyAqL1xuLS1cbm1tL29vbV9raWxsLmM9NzI9c3RhdGljIGlubGluZSBib29sIGlzX21lbWNnX29vbShzdHJ1Y3Qgb29tX2NvbnRyb2wgKm9jKVxuLS1cbm1tL29vbV9raWxsLmMtNzYtXG5tbS9vb21fa2lsbC5jOjc3OiNpZmRlZiBDT05GSUdfTlVNQVxubW0vb29tX2tpbGwuYy03OC0vKipcbi0tXG5tbS9vb21fa2lsbC5jPTEyMj1zdGF0aWMgYm9vbCBvb21fY3B1c2V0X2VsaWdpYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3Qgb29tX2NvbnRyb2wgKm9jKVxuLS1cbm1tL29vbV9raWxsLmMtMTI1LX1cbm1tL29vbV9raWxsLmM6MTI2OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xubW0vb29tX2tpbGwuYy0xMjctXG4tLVxubW0vb29tX2tpbGwuYz0yNDk9c3RhdGljIGVudW0gb29tX2NvbnN0cmFpbnQgY29uc3RyYWluZWRfYWxsb2Moc3RydWN0IG9vbV9jb250cm9sICpvYylcbi0tXG5tbS9vb21fa2lsbC5jLTI2NC1cbm1tL29vbV9raWxsLmM6MjY1Olx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19OVU1BKSlcbm1tL29vbV9raWxsLmMtMjY2LVx0XHRyZXR1cm4gQ09OU1RSQUlOVF9OT05FO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0xNjc9RVhQT1JUX1BFUl9DUFVfU1lNQk9MKG51bWFfbm9kZSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jLTE2OS1cbm1tL3BhZ2VfYWxsb2MuYzoxNzA6I2lmZGVmIENPTkZJR19OVU1BXG5tbS9wYWdlX2FsbG9jLmMtMTcxLURFRklORV9TVEFUSUNfS0VZX1RSVUUodm1fbnVtYV9zdGF0X2tleSk7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTE5NT1ub2RlbWFza190IG5vZGVfc3RhdGVzW05SX05PREVfU1RBVEVTXSBfX3JlYWRfbW9zdGx5ID0ge1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy0xOTctXHRbTl9PTkxJTkVdID0geyB7IFswXSA9IDFVTCB9IH0sXG5tbS9wYWdlX2FsbG9jLmM6MTk4OiNpZm5kZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0xOTktXHRbTl9OT1JNQUxfTUVNT1JZXSA9IHsgeyBbMF0gPSAxVUwgfSB9LFxuLS1cbm1tL3BhZ2VfYWxsb2MuYz0yNTU4PWJvb2wgZGVjYXlfcGNwX2hpZ2goc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3ApXG4tLVxubW0vcGFnZV9hbGxvYy5jLTI1OTAtXG5tbS9wYWdlX2FsbG9jLmM6MjU5MTojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0yNTkyLS8qXG4tLVxubW0vcGFnZV9hbGxvYy5jPTMxNzk9c3RhdGljIGlubGluZSB2b2lkIHpvbmVfc3RhdGlzdGljcyhzdHJ1Y3Qgem9uZSAqcHJlZmVycmVkX3pvbmUsIHN0cnVjdCB6b25lICp6LFxuLS1cbm1tL3BhZ2VfYWxsb2MuYy0zMTgxLXtcbm1tL3BhZ2VfYWxsb2MuYzozMTgyOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vcGFnZV9hbGxvYy5jLTMxODMtXHRlbnVtIG51bWFfc3RhdF9pdGVtIGxvY2FsX3N0YXQgPSBOVU1BX0xPQ0FMO1xuLS1cbm1tL3BhZ2VfYWxsb2MuYz0zNjY1PXN0YXRpYyBpbmxpbmUgYm9vbCB6b25lX3dhdGVybWFya19mYXN0KHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM3MDktXG5tbS9wYWdlX2FsbG9jLmM6MzcxMDojaWZkZWYgQ09ORklHX05VTUFcbm1tL3BhZ2VfYWxsb2MuYy0zNzExLWludCBfX3JlYWRfbW9zdGx5IG5vZGVfcmVjbGFpbV9kaXN0YW5jZSA9IFJFQ0xBSU1fRElTVEFOQ0U7XG4tLVxubW0vcGFnZV9hbGxvYy5jPTM3MTM9c3RhdGljIGJvb2wgem9uZV9hbGxvd3NfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqbG9jYWxfem9uZSwgc3RydWN0IHpvbmUgKnpvbmUpXG4tLVxubW0vcGFnZV9hbGxvYy5jLTM3MTctfVxubW0vcGFnZV9hbGxvYy5jOjM3MTg6I2Vsc2VcdC8qIENPTkZJR19OVU1BICovXG5tbS9wYWdlX2FsbG9jLmMtMzcxOS1zdGF0aWMgYm9vbCB6b25lX2FsbG93c19yZWNsYWltKHN0cnVjdCB6b25lICpsb2NhbF96b25lLCBzdHJ1Y3Qgem9uZSAqem9uZSlcblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTkyNgoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDQwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czoKCioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQqKgoKQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUgZ3V0cyBvZiBob3cgS1ZNIGhhbmRsZXMgZ3Vlc3QgbWVtb3J5LCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLiBJIG5lZWQgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaG93IG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIGFyZSBiZWluZyBtYW5hZ2VkLCBlc3BlY2lhbGx5IGFyb3VuZCB0aGUgY3J1Y2lhbCBmdW5jdGlvbnMgYGt2bV9nbWVtX2JpbmRfbm9kZWAgYW5kIGBrdm1fZ21lbV9jcmVhdGVgLiBVbmRlcnN0YW5kaW5nIHRoZXNlIGZ1bmN0aW9ucyBpcyBrZXkgdG8gc2VlaW5nIGhvdyBndWVzdCBtZW1vcnkgaXMgYWxsb2NhdGVkLCBib3VuZCB0byBwaHlzaWNhbCBtZW1vcnksIGFuZCBnZW5lcmFsbHkgaW50ZXJhY3RlZCB3aXRoIHdpdGhpbiB0aGUgS1ZNIGZyYW1ld29yay4gSSBuZWVkIHRvIHRyYWNlIHRoZSBmbG93LCBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIGFueSBudWFuY2VzIGluIGhvdyBtZW1vcnkgcmVnaW9ucyBhcmUgaGFuZGxlZCBhbmQgaG93IGBtZW1mZGBzIGFyZSBsZXZlcmFnZWQgZm9yIGd1ZXN0IG1lbW9yeS4gTGV0JiMzOTtzIHNlZSBob3cgZWZmaWNpZW50bHkgYW5kIHNlY3VyZWx5IHRoaXMgaXMgYWxsIGltcGxlbWVudGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQxNTpcdFx0LypcbiA0MTY6XHRcdCAqIFJldHVybiB0aGUgbWVtb3J5IHBvbGljeSBmb3IgdGhpcyBpbmRleCwgb3IgTlVMTCBpZiBub25lIGlzIHNldC5cbiA0MTc6XHRcdCAqXG4gNDE4Olx0XHQgKiBSZXR1cm5pbmcgTlVMTCwgZS5nLiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRhc2smIzM5O3MgbWVtb3J5IHBvbGljeSwgaXNcbiA0MTk6XHRcdCAqIGltcG9ydGFudCBmb3IgdGhlIC5nZXRfcG9saWN5IGtlcm5lbCBBQkk6IGl0IGluZGljYXRlcyB0aGF0IG5vXG4gNDIwOlx0XHQgKiBleHBsaWNpdCBwb2xpY3kgaGFzIGJlZW4gc2V0IHZpYSBtYmluZCgpIGZvciB0aGlzIG1lbW9yeS4gVGhlIGNhbGxlclxuIDQyMTpcdFx0ICogY2FuIHRoZW4gcmVwbGFjZSBOVUxMIHdpdGggdGhlIGRlZmF1bHQgbWVtb3J5IHBvbGljeSBpbnN0ZWFkIG9mIHRoZVxuIDQyMjpcdFx0ICogY3VycmVudCB0YXNrJiMzOTtzIG1lbW9yeSBwb2xpY3kuXG4gNDIzOlx0XHQgKi9cbiA0MjQ6XHRcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCBwZ29mZik7XG4gNDI1Olx0fVxuIDQyNjpcdFxuIDQyNzpcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuIDQyODpcdHtcbiA0Mjk6XHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcbiA0MzA6XHRcdG5vZGVtYXNrX3Qgbm9kZXM7XG4gNDMxOlx0XHRpbnQgZXJyO1xuIDQzMjpcdFxuIDQzMzpcdFx0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiA0MzQ6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNDM1Olx0XG4gNDM2Olx0XHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuIDQzNzpcdFx0cG9sID0gbWVtcG9saWN5X2NyZWF0ZShNUE9MX0JJTkQsIDAsIFx1MDAyNm5vZGVzKTtcbiA0Mzg6XHRcdGlmIChJU19FUlIocG9sKSlcbiA0Mzk6XHRcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbiA0NDA6XHRcbiA0NDE6XHRcdGVyciA9IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2Vwb2xpY3ksIDAsXG4gNDQyOlx0XHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbiA0NDM6XHRcdG1wb2xfcHV0KHBvbCk7XG4gNDQ0Olx0XHRyZXR1cm4gZXJyO1xuIDQ0NTpcdH1cbiA0NDY6XHQjZWxzZVxuIDQ0NzpcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuIDQ0ODpcdHtcbiA0NDk6XHRcdHJldHVybiAtRUlOVkFMO1xuIDQ1MDpcdH1cbiA0NTE6XHQjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbiA0NTI6XHRcbiA0NTM6XHRzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9nbWVtX3ZtX29wcyA9IHtcbiA0NTQ6XHRcdC5mYXVsdFx0XHQ9IGt2bV9nbWVtX2ZhdWx0X3VzZXJfbWFwcGluZyxcbiA0NTU6XHQjaWZkZWYgQ09ORklHX05VTUFcbiA0NTY6XHRcdC5nZXRfcG9saWN5XHQ9IGt2bV9nbWVtX2dldF9wb2xpY3ksXG4gNDU3Olx0XHQuc2V0X3BvbGljeVx0PSBrdm1fZ21lbV9zZXRfcG9saWN5LFxuIDQ1ODpcdCNlbmRpZlxuIDQ1OTpcdH07XG4gNDYwOlx0XG4gNDYxOlx0c3RhdGljIGludCBrdm1fZ21lbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcbiA0NjI6XHR7XG4gNDYzOlx0XHRpZiAoIWt2bV9nbWVtX3N1cHBvcnRzX21tYXAoZmlsZV9pbm9kZShmaWxlKSkpXG4gNDY0Olx0XHRcdHJldHVybiAtRU5PREVWO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjk3MgoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGFuYWx5c2lzIG9mIHRoZSBwcm92aWRlZCB0ZXh0LCByZW5kZXJlZCBpbiB0aGUgZmlyc3QgcGVyc29uLCBhc3N1bWluZyBJJiMzOTttIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6CgoqKkRpdmluZyBpbnRvIEd1ZXN0IE1lbW9yeSBNYW5hZ2VtZW50IGluIEtWTSoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBndWVzdCBtZW1vcnkgbWFuYWdlbWVudCB3aXRoaW4gS1ZNLCBzcGVjaWZpY2FsbHkgdGhlIGBndWVzdF9tZW1mZC5jYCBmaWxlLiBNeSBhdHRlbnRpb24gaXMgZHJhd24gdG8gdGhlIHJlZ2lvbiBhcm91bmQgbGluZXMgNTQwIHRocm91Z2ggNjQ1LiBUaGF0IHN1Z2dlc3RzIHdlJiMzOTtyZSBsb29raW5nIGF0IGEgY3JpdGljYWwgc2VjdGlvbiDigJMgbWF5YmUgc29tZSBhbGxvY2F0aW9uIG9yIGRlYWxsb2NhdGlvbiBsb2dpYywgcGVyaGFwcyByZWxhdGVkIHRvIG1lbW9yeSBmaWxlIGRlc2NyaXB0b3JzIGZvciB0aGUgZ3Vlc3QuIE15IGluaXRpYWwgaHlwb3RoZXNpcyBpcyB0aGF0IHdlJiMzOTtyZSBsaWtlbHkgZGVhbGluZyB3aXRoIGVpdGhlcjogdGhlIGhhbmRsaW5nIG9mIHNoYXJlZCBtZW1vcnkgcmVnaW9ucywgb3IgZ3Vlc3QgbWVtb3J5IG1hcHBpbmcvdW5tYXBwaW5nLCBvciBwZXJoYXBzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbW9yeS1iYWNrZWQgZmlsZSBkZXNjcmlwdG9yIHdpdGhpbiB0aGUgZ3Vlc3QgY29udGV4dC4gVGhlIHNwZWNpZmljIGxpbmVzIHNob3VsZCByZXZlYWwgd2hpY2ggb25lLiBJIGFudGljaXBhdGUgdGhpcyBzZWN0aW9uIHdvdWxkIGludm9sdmUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgVk1NLCBwb3NzaWJseSBhcm91bmQgcGFnZSB0YWJsZXMsIG1lbW9yeSByZWdpb25zLCBhbmQgZXZlbnQgaGFuZGxpbmcgdGhhdCBpcyByZWxhdGVkIHRvIHRoYXQuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayB2ZXJ5IGNsb3NlbHkgYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBiZWluZyBtYW5pcHVsYXRlZCBhbmQgdGhlIGNvbnRyb2wgZmxvdyB0byBmdWxseSB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBJIGV4cGVjdCB0byBiZSB1c2luZyBteSBrbm93bGVkZ2Ugb2YgS1ZNIGludGVybmFscyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdGVjaG5pcXVlcyB0byBmdWxseSB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgdGFraW5nIHBsYWNlIGluIHRoZXNlIGxpbmVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1NDA6XHRcdC5zZXRhdHRyXHQ9IGt2bV9nbWVtX3NldGF0dHIsXG4gNTQxOlx0fTtcbiA1NDI6XHRcbiA1NDM6XHRib29sIF9fd2VhayBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKHN0cnVjdCBrdm0gKmt2bSlcbiA1NDQ6XHR7XG4gNTQ1Olx0XHRyZXR1cm4gdHJ1ZTtcbiA1NDY6XHR9XG4gNTQ3Olx0XG4gNTQ4Olx0c3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKVxuIDU0OTpcdHtcbiA1NTA6XHRcdHN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gXCYjMzQ7W2t2bS1nbWVtXVwmIzM0OztcbiA1NTE6XHRcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XG4gNTUyOlx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIDU1MzpcdFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gNTU0Olx0XHRpbnQgZmQsIGVycjtcbiA1NTU6XHRcbiA1NTY6XHRcdGZkID0gZ2V0X3VudXNlZF9mZF9mbGFncygwKTtcbiA1NTc6XHRcdGlmIChmZCBcdTAwM2MgMClcbiA1NTg6XHRcdFx0cmV0dXJuIGZkO1xuIDU1OTpcdFxuIDU2MDpcdFx0ZiA9IGt6YWxsb2Nfb2JqKCpmKTtcbiA1NjE6XHRcdGlmICghZikge1xuIDU2MjpcdFx0XHRlcnIgPSAtRU5PTUVNO1xuIDU2MzpcdFx0XHRnb3RvIGVycl9mZDtcbiA1NjQ6XHRcdH1cbiA1NjU6XHRcbiA1NjY6XHRcdC8qIF9fZnB1dCgpIHdpbGwgdGFrZSBjYXJlIG9mIGZvcHNfcHV0KCkuICovXG4gNTY3Olx0XHRpZiAoIWZvcHNfZ2V0KFx1MDAyNmt2bV9nbWVtX2ZvcHMpKSB7XG4gNTY4Olx0XHRcdGVyciA9IC1FTk9FTlQ7XG4gNTY5Olx0XHRcdGdvdG8gZXJyX2dtZW07XG4gNTcwOlx0XHR9XG4gNTcxOlx0XG4gNTcyOlx0XHRpbm9kZSA9IGFub25faW5vZGVfbWFrZV9zZWN1cmVfaW5vZGUoa3ZtX2dtZW1fbW50LVx1MDAzZW1udF9zYiwgbmFtZSwgTlVMTCk7XG4gNTczOlx0XHRpZiAoSVNfRVJSKGlub2RlKSkge1xuIDU3NDpcdFx0XHRlcnIgPSBQVFJfRVJSKGlub2RlKTtcbiA1NzU6XHRcdFx0Z290byBlcnJfZm9wcztcbiA1NzY6XHRcdH1cbiA1Nzc6XHRcbiA1Nzg6XHRcdGlub2RlLVx1MDAzZWlfb3AgPSBcdTAwMjZrdm1fZ21lbV9pb3BzO1xuIDU3OTpcdFx0aW5vZGUtXHUwMDNlaV9tYXBwaW5nLVx1MDAzZWFfb3BzID0gXHUwMDI2a3ZtX2dtZW1fYW9wcztcbiA1ODA6XHRcdGlub2RlLVx1MDAzZWlfbW9kZSB8PSBTX0lGUkVHO1xuIDU4MTpcdFx0aW5vZGUtXHUwMDNlaV9zaXplID0gc2l6ZTtcbiA1ODI6XHRcdG1hcHBpbmdfc2V0X2dmcF9tYXNrKGlub2RlLVx1MDAzZWlfbWFwcGluZywgR0ZQX0hJR0hVU0VSKTtcbiA1ODM6XHRcdG1hcHBpbmdfc2V0X2luYWNjZXNzaWJsZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDU4NDpcdFx0LyogVW5tb3ZhYmxlIG1hcHBpbmdzIGFyZSBzdXBwb3NlZCB0byBiZSBtYXJrZWQgdW5ldmljdGFibGUgYXMgd2VsbC4gKi9cbiA1ODU6XHRcdFdBUk5fT05fT05DRSghbWFwcGluZ191bmV2aWN0YWJsZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpKTtcbiA1ODY6XHRcbiA1ODc6XHRcdEdNRU1fSShpbm9kZSktXHUwMDNlZmxhZ3MgPSBmbGFncztcbiA1ODg6XHRcbiA1ODk6XHRcdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbiA1OTA6XHRcdFx0ZXJyID0ga3ZtX2dtZW1fYmluZF9ub2RlKGlub2RlLCBub2RlKTtcbiA1OTE6XHRcdFx0aWYgKGVycilcbiA1OTI6XHRcdFx0XHRnb3RvIGVycl9pbm9kZTtcbiA1OTM6XHRcdH1cbiA1OTQ6XHRcbiA1OTU6XHRcdGZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsIFx1MDAyNmt2bV9nbWVtX2ZvcHMpO1xuIDU5NjpcdFx0aWYgKElTX0VSUihmaWxlKSkge1xuIDU5NzpcdFx0XHRlcnIgPSBQVFJfRVJSKGZpbGUpO1xuIDU5ODpcdFx0XHRnb3RvIGVycl9pbm9kZTtcbiA1OTk6XHRcdH1cbiA2MDA6XHRcbiA2MDE6XHRcdGZpbGUtXHUwMDNlZl9mbGFncyB8PSBPX0xBUkdFRklMRTtcbiA2MDI6XHRcdGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gZjtcbiA2MDM6XHRcbiA2MDQ6XHRcdGt2bV9nZXRfa3ZtKGt2bSk7XG4gNjA1Olx0XHRmLVx1MDAzZWt2bSA9IGt2bTtcbiA2MDY6XHRcdHhhX2luaXQoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncyk7XG4gNjA3Olx0XHRsaXN0X2FkZChcdTAwMjZmLVx1MDAzZWVudHJ5LCBcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZWdtZW1fZmlsZV9saXN0KTtcbiA2MDg6XHRcbiA2MDk6XHRcdGZkX2luc3RhbGwoZmQsIGZpbGUpO1xuIDYxMDpcdFx0cmV0dXJuIGZkO1xuIDYxMTpcdFxuIDYxMjpcdGVycl9pbm9kZTpcbiA2MTM6XHRcdGlwdXQoaW5vZGUpO1xuIDYxNDpcdGVycl9mb3BzOlxuIDYxNTpcdFx0Zm9wc19wdXQoXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XG4gNjE2Olx0ZXJyX2dtZW06XG4gNjE3Olx0XHRrZnJlZShmKTtcbiA2MTg6XHRlcnJfZmQ6XG4gNjE5Olx0XHRwdXRfdW51c2VkX2ZkKGZkKTtcbiA2MjA6XHRcdHJldHVybiBlcnI7XG4gNjIxOlx0fVxuIDYyMjpcdFxuIDYyMzpcdGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbiA2MjQ6XHR7XG4gNjI1Olx0XHRsb2ZmX3Qgc2l6ZSA9IGFyZ3MtXHUwMDNlc2l6ZTtcbiA2MjY6XHRcdHU2NCBmbGFncyA9IGFyZ3MtXHUwMDNlZmxhZ3M7XG4gNjI3Olx0XHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcbiA2Mjg6XHRcbiA2Mjk6XHRcdGlmIChmbGFncyBcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcbiA2MzA6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjMxOlx0XG4gNjMyOlx0XHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiA2MzM6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjM0Olx0XG4gNjM1Olx0XHRpZiAoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XG4gNjM2Olx0XHRcdGlmIChhcmdzLVx1MDAzZXBhZCB8fCBhcmdzLVx1MDAzZW5vZGUgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4gNjM3Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjM4Olx0XHRcdG5vZGUgPSBhcmdzLVx1MDAzZW5vZGU7XG4gNjM5Olx0XHR9IGVsc2UgaWYgKGFyZ3MtXHUwMDNlbm9kZSB8fCBhcmdzLVx1MDAzZXBhZCkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDc5MwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIEkgZGVsdmUgaW50byB0aGUgY29kZToKCioqRGl2aW5nIGludG8gYG1tL21lbXBvbGljeS5jYCoqCgpPa2F5LCBsZXQmIzM5O3Mgem9vbSBpbiBvbiBgbW0vbWVtcG9saWN5LmNgLiBJIG5lZWQgdG8gcmV2aWV3IHRoaXMgc2VjdGlvbiBjYXJlZnVsbHkuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBmdW5jdGlvbnMgYG1lbXBvbGljeV9jcmVhdGVgLCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAsIGFuZCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeWAuIFRoZXNlIGFyZSBrZXkgd2hlbiB5b3UgYXJlIGxvb2tpbmcgYXQgaG93IG1lbW9yeSBwb2xpY2llcyBhcmUgaGFuZGxlZCBhbmQgc2hhcmVkIGFjcm9zcyB0aGUgc3lzdGVtLiBUbyBnZXQgdGhlIGRldGFpbHMsIEkgc2hvdWxkIHJlYWQgbGluZXMgMTA4MCB0aHJvdWdoIDExMzAsIGFuZCB0aGVuIEkgd2FudCB0byBqdW1wIGRvd24gdG8gbGluZXMgMzMwMCB0aHJvdWdoIDMzNzAuIFRoYXQgd2lsbCBnaXZlIG1lIGEgc29saWQgdmlldyBvZiB0aGUgcGVydGluZW50IGxvZ2ljLiBJJiMzOTttIGZvY3VzaW5nIG9uIHRoZXNlIHJlZ2lvbnMgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgY29yZSBmdW5jdGlvbnMgaW50ZXJhY3Qgd2l0aGluIHRoZSBsYXJnZXIgbWVtb3J5IG1hbmFnZW1lbnQgZnJhbWV3b3JrLiBMZXQmIzM5O3Mgc2VlIHdoYXQgaW50ZXJlc3RpbmcgdGlkYml0cyBhcmUgaGlkZGVuIGluIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTA4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1NQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMDgwOlx0XHR2bWEgPSAgdm1hX21vZGlmeV9wb2xpY3kodm1pLCAqcHJldiwgdm1hLCB2bXN0YXJ0LCB2bWVuZCwgbmV3X3BvbCk7XG4xMDgxOlx0XHRpZiAoSVNfRVJSKHZtYSkpXG4xMDgyOlx0XHRcdHJldHVybiBQVFJfRVJSKHZtYSk7XG4xMDgzOlx0XG4xMDg0Olx0XHQqcHJldiA9IHZtYTtcbjEwODU6XHRcdHJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTtcbjEwODY6XHR9XG4xMDg3Olx0XG4xMDg4Olx0LyoqXG4xMDg5Olx0ICogbWVtcG9saWN5X2NyZWF0ZSAtIGJ1aWxkIGEgdmFsaWRhdGVkLCBjcHVzZXQtY29udGV4dHVhbGlzZWQgbWVtcG9saWN5XG4xMDkwOlx0ICogQG1vZGU6IE1QT0xfKiBtb2RlXG4xMDkxOlx0ICogQGZsYWdzOiBNUE9MX0ZfKiBmbGFnc1xuMTA5MjpcdCAqIEBub2RlczogdGFyZ2V0IG5vZGVtYXNrLCBvciBOVUxMIChpbnRlcnByZXRlZCBwZXIgQG1vZGU7IHNlZSBtcG9sX25ldygpKVxuMTA5MzpcdCAqXG4xMDk0Olx0ICogQ3JlYXRlcyBhIG5ldyBwb2xpY3kgYW5kIGNvbnN0cmFpbnMgaXQgdG8gdGhlIHRhc2smIzM5O3MgY3B1c2V0LlxuMTA5NTpcdCAqXG4xMDk2Olx0ICogVGhlIGNhbGxlciBvd25zIHRoZSByZXR1cm5lZCByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cbjEwOTc6XHQgKlxuMTA5ODpcdCAqIFJldHVybjogdGhlIHBvbGljeSAoTlVMTCBmb3IgYSBkZWZhdWx0IHBvbGljeSksIG9yIGFuIEVSUl9QVFIgb24gZmFpbHVyZS5cbjEwOTk6XHQgKi9cbjExMDA6XHRzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuMTEwMTpcdFx0XHRub2RlbWFza190ICpub2RlcylcbjExMDI6XHR7XG4xMTAzOlx0XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4xMTA0Olx0XHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xuMTEwNTpcdFx0aW50IGVycjtcbjExMDY6XHRcbjExMDc6XHRcdGlmICghc2NyYXRjaClcbjExMDg6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4xMTA5Olx0XG4xMTEwOlx0XHRwb2wgPSBtcG9sX25ldyhtb2RlLCBmbGFncywgbm9kZXMpO1xuMTExMTpcdFx0aWYgKElTX0VSUihwb2wpKVxuMTExMjpcdFx0XHRnb3RvIG91dDtcbjExMTM6XHRcbjExMTQ6XHRcdHRhc2tfbG9jayhjdXJyZW50KTtcbjExMTU6XHRcdGVyciA9IG1wb2xfc2V0X25vZGVtYXNrKHBvbCwgbm9kZXMsIHNjcmF0Y2gpO1xuMTExNjpcdFx0dGFza191bmxvY2soY3VycmVudCk7XG4xMTE3Olx0XHRpZiAoZXJyKSB7XG4xMTE4Olx0XHRcdG1wb2xfcHV0KHBvbCk7XG4xMTE5Olx0XHRcdHBvbCA9IEVSUl9QVFIoZXJyKTtcbjExMjA6XHRcdH1cbjExMjE6XHRvdXQ6XG4xMTIyOlx0XHROT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7XG4xMTIzOlx0XHRyZXR1cm4gcG9sO1xuMTEyNDpcdH1cbjExMjU6XHRFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsIFwmIzM0O2t2bVwmIzM0Oyk7XG4xMTI2Olx0XG4xMTI3Olx0c3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbjExMjg6XHRcdFx0XHQgICAgIG5vZGVtYXNrX3QgKm5vZGVzKVxuMTEyOTpcdHtcbjExMzA6XHRcdHN0cnVjdCBtZW1wb2xpY3kgKm5ldywgKm9sZDtcbjExMzE6XHRcdE5PREVNQVNLX1NDUkFUQ0goc2NyYXRjaCk7XG4xMTMyOlx0XHRpbnQgcmV0O1xuMTEzMzpcdFxuMTEzNDpcdFx0aWYgKCFzY3JhdGNoKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTkwOQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG1tL21lbXBvbGljeS5jYCoqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBtZW1vcnkgcG9saWN5IGltcGxlbWVudGF0aW9uLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGhpbiBsaW5lcyAzMzAwLTMzNzAgb2YgYG1tL21lbXBvbGljeS5jYC4gQmFzZWQgb24gY29udGV4dCwgSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBzZWN0aW9uIHRvIGRlYWwgd2l0aC4uLiB3ZWxsLCBiYXNlZCBvbiB0aGUgZnVuY3Rpb24gbmFtZXMgSSBrbm93LCBtYXliZSBpdCYjMzk7cyByZWxhdGVkIHRvIE5VTUEgYmFsYW5jaW5nIG9yIHNvbWUgc3BlY2lmaWMgbWVtb3J5IGFsbG9jYXRpb24gcG9saWN5IGhhbmRsaW5nLiBJ4oCZbGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBleGFjdCBmdW5jdGlvbiBvciBmdW5jdGlvbnMgd2l0aGluIHRoYXQgcmFuZ2UuIEl0IGNvdWxkIGJlIHNvbWUgY29yZSBsb2dpYyBpbiBgbXBvbF94eHhgIGZhbWlseS4gCgpNeSBpbW1lZGlhdGUgZm9jdXMgd2lsbCBiZSB0byBkZXRlcm1pbmUgdGhlICp3aHkqIGFuZCAqaG93KiBvZiB0aGUgY29kZSBpbiB0aGF0IGJsb2NrLiBXaGF0IGlzIHRoZSBvYmplY3RpdmUgb2YgdGhpcyBjb2RlPyBXaGF0IHNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyBvciB2YXJpYWJsZXMgaXMgaXQgd29ya2luZyB3aXRoPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBsb29rIGZvciBpbW1lZGlhdGVseT8gSSYjMzk7bGwgcHJvYmFibHkgc3RhcnQgYnkgZ3JlcHBpbmcgZm9yIGFueSByZWxhdGVkIHN5bWJvbHMgb3IgY29tbWVudHMgdG8gdW5kZXJzdGFuZCB0aGUgcHVycG9zZSBiZWZvcmUgZGl2aW5nIGludG8gaW5kaXZpZHVhbCBsaW5lcy4gSSYjMzk7bSBob3BpbmcgdGhlcmUmIzM5O3MgYSBnb29kIGV4cGxhbmF0aW9uIG9yIHJlbGV2YW50IGNvbW1lbnRzLiBJdCBpcyBhIGxhcmdlIHJhbmdlLCBzbyBpdCBtdXN0IGJlIGEgc2lnbmlmaWNhbnQgc2VjdGlvbiBvZiBjb2RlLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IHJlYWRpbmchCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtcG9saWN5LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMzAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDY1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzMzMDA6XHRcbjMzMDE6XHRcdFx0LyogYWxsb2Mgbm9kZSBjb3ZlcmluZyBlbnRpcmUgZmlsZTsgYWRkcyByZWYgdG8gZmlsZSYjMzk7cyBucG9sICovXG4zMzAyOlx0XHRcdHNuID0gc3BfYWxsb2MoMCwgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgbnBvbCk7XG4zMzAzOlx0XHRcdGlmIChzbilcbjMzMDQ6XHRcdFx0XHRzcF9pbnNlcnQoc3AsIHNuKTtcbjMzMDU6XHRwdXRfbnBvbDpcbjMzMDY6XHRcdFx0bXBvbF9wdXQobnBvbCk7XHQvKiBkcm9wIGluaXRpYWwgcmVmIG9uIGZpbGUmIzM5O3MgbnBvbCAqL1xuMzMwNzpcdGZyZWVfc2NyYXRjaDpcbjMzMDg6XHRcdFx0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xuMzMwOTpcdHB1dF9tcG9sOlxuMzMxMDpcdFx0XHRtcG9sX3B1dChtcG9sKTtcdC8qIGRyb3Agb3VyIGluY29taW5nIHJlZiBvbiBzYiBtcG9sICovXG4zMzExOlx0XHR9XG4zMzEyOlx0fVxuMzMxMzpcdEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zaGFyZWRfcG9saWN5X2luaXQsIFwmIzM0O2t2bVwmIzM0Oyk7XG4zMzE0Olx0XG4zMzE1Olx0LyoqXG4zMzE2Olx0ICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxuMzMxNzpcdCAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZVxuMzMxODpcdCAqIEBzdGFydDogZmlyc3QgcGFnZSBvZmZzZXQgKGluY2x1c2l2ZSlcbjMzMTk6XHQgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSlcbjMzMjA6XHQgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlXG4zMzIxOlx0ICpcbjMzMjI6XHQgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS5cbjMzMjM6XHQgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuXG4zMzI0Olx0ICpcbjMzMjU6XHQgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LlxuMzMyNjpcdCAqXG4zMzI3Olx0ICogVW5saWtlIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koKSwgbm8gVk1BIGlzIHJlcXVpcmVkLCBzbyBhIHJhbmdlIHRoYXRcbjMzMjg6XHQgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLlxuMzMyOTpcdCAqXG4zMzMwOlx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuMzMzMTpcdCAqL1xuMzMzMjpcdGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcbjMzMzM6XHRcdFx0XHRcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuMzMzNDpcdHtcbjMzMzU6XHRcdHN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMO1xuMzMzNjpcdFx0aW50IGVycjtcbjMzMzc6XHRcbjMzMzg6XHRcdGlmIChwb2wpIHtcbjMzMzk6XHRcdFx0bmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTtcbjMzNDA6XHRcdFx0aWYgKCFuZXcpXG4zMzQxOlx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4zMzQyOlx0XHR9XG4zMzQzOlx0XHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XG4zMzQ0Olx0XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG4zMzQ1Olx0XHRcdHNwX2ZyZWUobmV3KTtcbjMzNDY6XHRcdHJldHVybiBlcnI7XG4zMzQ3Olx0fVxuMzM0ODpcdEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgXCYjMzQ7a3ZtXCYjMzQ7KTtcbjMzNDk6XHRcbjMzNTA6XHRpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4zMzUxOlx0XHRcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbjMzNTI6XHR7XG4zMzUzOlx0XHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVx1MDAzZXZtX3Bnb2ZmLFxuMzM1NDpcdFx0XHRcdFx0XHQgICB2bWEtXHUwMDNldm1fcGdvZmYgJiM0Mzsgdm1hX3BhZ2VzKHZtYSksIHBvbCk7XG4zMzU1Olx0fVxuMzM1NjpcdEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgXCYjMzQ7a3ZtXCYjMzQ7KTtcbjMzNTc6XHRcbjMzNTg6XHQvKiBGcmVlIGEgYmFja2luZyBwb2xpY3kgc3RvcmUgb24gaW5vZGUgZGVsZXRlLiAqL1xuMzM1OTpcdHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKVxuMzM2MDpcdHtcbjMzNjE6XHRcdHN0cnVjdCBzcF9ub2RlICpuO1xuMzM2MjpcdFx0c3RydWN0IHJiX25vZGUgKm5leHQ7XG4zMzYzOlx0XG4zMzY0Olx0XHRpZiAoIXNwLVx1MDAzZXJvb3QucmJfbm9kZSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjczMTIKCQkJCQkJCW91dHB1dDogMTg2CgkJCQkJCQl0aG91Z2h0czogNjAzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIEtWTSBHdWVzdCBNZW1vcnkgYW5kIE5VTUEgSW50ZWdyYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiB0aGUgYEZvY3VzU3ltYm9sc2AgYW5kIGBFbmFibGVDb25maWdzYCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjb2RlLiBJdCBzZWVtcyBsaWtlIHRoZSBjb3JlIGNoYW5nZXMgcmV2b2x2ZSBhcm91bmQgS1ZNJiMzOTtzIGBndWVzdF9tZW1mZGAgYW5kIE5VTUEgbWVtb3J5IG1hbmFnZW1lbnQuCgpJIHNlZSB0aGF0IGBFbmFibGVDb25maWdzYCBpbmNsdWRlIGBLVk1gICh3aXRoIGl0cyBkZXBlbmRlbmNpZXMpIGFuZCBgTlVNQWAuIFRoaXMgaW1tZWRpYXRlbHkgcG9pbnRzIHRvIHRoZSBhcmVhIG9mIGludGVyZXN0OiB0aGUgaW50ZXJwbGF5IG9mIEtWTSB2aXJ0dWFsaXphdGlvbiBhbmQgTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2Vzcy4gVGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QgcHJvdmlkZXMgc3BlY2lmaWMgZnVuY3Rpb24gbmFtZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb3IgaW50cm9kdWNlZDogYGt2bV9nbWVtX2NyZWF0ZWAsIGBrdm1fZ21lbV9iaW5kX25vZGVgLCBgbWVtcG9saWN5X2NyZWF0ZWAsIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCwgYW5kIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5YC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBzdHJvbmcgaW5kaWNhdG9ycyBvZiB0aGUga2V5IGNoYW5nZXMuCgpOb3csIGxldCYjMzk7cyBkcmlsbCBkb3duIGZ1cnRoZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjYWxsIGZsb3cgYW5kIGRlcGVuZGVuY2llcy4gSSBjYW4gc2VlIHRoYXQgYGt2bV9nbWVtX2NyZWF0ZWAgaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGlzIHRoZSBlbnRyeSBwb2ludCwgYW5kIGl0IGNhbGxzIGBfX2t2bV9nbWVtX2NyZWF0ZWAsIHdoaWNoIHRoZW4gY2FsbHMgYGt2bV9nbWVtX2JpbmRfbm9kZWAuIFRoaXMgdGVsbHMgbWUgdGhlIGNyZWF0aW9uIHByb2Nlc3MgaXMga2V5LCB3aXRoIGEgYmluZGluZyBvcGVyYXRpb24gaGFwcGVuaW5nIGFzIHBhcnQgb2YgaXQuIFRoZSBgbWVtcG9saWN5YCBmdW5jdGlvbnMgYXJlIG5ldyBvciBtb2RpZmllZCBpbiBgbW0vbWVtcG9saWN5LmNgLCBzdWdnZXN0aW5nIG1lbW9yeSBwb2xpY3kgY29udHJvbHMgYXJlIGJlaW5nIGFkZGVkIG9yIGF1Z21lbnRlZC4KCkFyZSB0aGVzZSBmdW5jdGlvbnMgZ2VuZXJhbD8gTm8sIHRoZXkmIzM5O3JlIG5vdCBjb3JlIGtlcm5lbCBob3QtcGF0aHMuIFRoZXkgYXJlIHNwZWNpZmljIHRvIHRoZSBLVk0gZ3Vlc3QgbWVtZmQgYW5kIHNoYXJlZCBtZW1wb2xpY2llcy4gSSB3YW50IHRvIGVtcGhhc2l6ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgc3BlY2lmaWMgdG8gS1ZNIGd1ZXN0IG1lbWZkIGFuZCBzaGFyZWQgbWVtcG9saWNpZXMuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVzZSBhcmUgbm90IHViaXF1aXRvdXMgaG90LXBhdGhzIHRoYXQgbWF5IGNhdXNlIHdpZGUtc3ByZWFkIHBlcmZvcm1hbmNlIGlzc3Vlcy4KCkkgY29uZmlybSB0aGF0IHRoaXMgaXMgb24gYW1kNjQsIGFuZCB0aGUgY29uZmlndXJhdGlvbiBpcyBndWFyZGVkIGJ5IGBDT05GSUdfS1ZNYCAoYW5kIGBDT05GSUdfS1ZNX0lOVEVMYCBvciBgQ09ORklHX0tWTV9BTURgKSwgd2hpY2ggaW4gdHVybiBzZWxlY3RzIGBDT05GSUdfS1ZNX0dVRVNUX01FTUZEYC4gYENPTkZJR19OVU1BYCBpcyBhbHNvIGltcG9ydGFudCBhcyBpdCBlbmFibGVzIE5VTUEgbWVtcG9saWN5IHN1cHBvcnQgd2l0aGluIHRoZSBndWVzdF9tZW1mZCBjb2RlLCB3aGljaCBpcyBleHBlY3RlZC4KCldpdGggdGhpcyBpbiBtaW5kLCB0aGUgYHNldC1yZXN1bHRzYCBwYXJhbWV0ZXJzIGFyZSBjbGVhci4gVGhpcyBwYXRjaCBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgY2FuIHJlYXNvbiB0aGF0IHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIGEgbmV3IGZsYWcgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCwgYW5kIGltcGxlbWVudHMgbWVtcG9saWN5IGhlbHBlcnMgYG1lbXBvbGljeV9jcmVhdGVgIGFuZCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgcmVhY2hhYmxlIHZpYSBLVk0gZ3Vlc3RfbWVtZmQgY3JlYXRpb24gaW9jdGwuIEkmIzM5O2xsIG5lZWQgdG8gdXNlIGBbJiMzNDtrdm1fZ21lbV9jcmVhdGUmIzM0OywgJiMzNDtrdm1fZ21lbV9iaW5kX25vZGUmIzM0OywgJiMzNDttZW1wb2xpY3lfY3JlYXRlJiMzNDssICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSYjMzQ7LCAmIzM0O21wb2xfc2V0X3NoYXJlZF9wb2xpY3kmIzM0O11gIGFzIG15IGBGb2N1c1N5bWJvbHNgIGFuZCBgWyYjMzQ7S1ZNJiMzNDssICYjMzQ7TlVNQSYjMzQ7XWAgYXMgYEVuYWJsZUNvbmZpZ3NgIGZvciBwcm9wZXIgdGVzdGluZy4gTm93LCBsZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O05VTUEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9jcmVhdGUmIzM0OywKICAgICYjMzQ7a3ZtX2dtZW1fYmluZF9ub2RlJiMzNDssCiAgICAmIzM0O21lbXBvbGljeV9jcmVhdGUmIzM0OywKICAgICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSYjMzQ7LAogICAgJiMzNDttcG9sX3NldF9zaGFyZWRfcG9saWN5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgTlVNQSBub2RlIGJpbmRpbmcgc3VwcG9ydCBmb3IgS1ZNIGd1ZXN0X21lbWZkIHZpYSB0aGUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgZmxhZyBpbiBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBhbmQgYWRkcyB0aGUgbWVtcG9saWN5IGhlbHBlcnMgbWVtcG9saWN5X2NyZWF0ZSgpIGFuZCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKCkuIFRoZXNlIGNoYW5nZXMgbW9kaWZ5IHJlYWNoYWJsZSBrZXJuZWwgbG9naWMgaW4gbW0vbWVtcG9saWN5LmMgYW5kIHZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O05VTUEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9jcmVhdGUmIzM0OywKICAgICYjMzQ7a3ZtX2dtZW1fYmluZF9ub2RlJiMzNDssCiAgICAmIzM0O21lbXBvbGljeV9jcmVhdGUmIzM0OywKICAgICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSYjMzQ7LAogICAgJiMzNDttcG9sX3NldF9zaGFyZWRfcG9saWN5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgTlVNQSBub2RlIGJpbmRpbmcgc3VwcG9ydCBmb3IgS1ZNIGd1ZXN0X21lbWZkIHZpYSB0aGUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgZmxhZyBpbiBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBhbmQgYWRkcyB0aGUgbWVtcG9saWN5IGhlbHBlcnMgbWVtcG9saWN5X2NyZWF0ZSgpIGFuZCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKCkuIFRoZXNlIGNoYW5nZXMgbW9kaWZ5IHJlYWNoYWJsZSBrZXJuZWwgbG9naWMgaW4gbW0vbWVtcG9saWN5LmMgYW5kIHZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZyBpbiBLVk0mIzM5O3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cblxuS01TQU4gdnMgS0FTQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cbi0gSW4gdGhpcyBwYXRjaCwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCByZWFkcyB1c2VyIGFyZ3VtZW50cyB2aWEgYGNvcHlfZnJvbV91c2VyYCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBpbnRlZ2VyOyBubyBrZXJuZWwgc3RydWN0dXJlcywgcGFkZGluZywgb3IgYnVmZmVycyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZS5cbi0gQWxsIG5ld2x5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgc3RhY2sgYW5kIGhlYXAgdmFyaWFibGVzIChlLmcuLCBgbm9kZW1hc2tfdCBub2Rlc2AgaW5pdGlhbGl6ZWQgdmlhIGBpbml0X25vZGVtYXNrX29mX25vZGUoKWAsIGBzY3JhdGNoYCBpbml0aWFsaXplZCB2aWEgYE5PREVNQVNLX1NDUkFUQ0goKWAsIGFuZCBgc3RydWN0IHNwX25vZGVgL2BzdHJ1Y3QgbWVtcG9saWN5YCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRocm91Z2ggc3RhbmRhcmQgbW0gaGVscGVycykgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cbi0gQW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgTlVNQSBwb2xpY3kgcmVmZXJlbmNlIGNvdW50aW5nLCBsaWZlY3ljbGUgaXNzdWVzLCBvciBhbGxvY2F0aW9uIGZhaWx1cmVzKSBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGFlNjg5NTVhNTkyM2QyNWU5ZTBhZjk1Njk0MzA1NzllOTRjNDBmOWYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IFNlcCAzIDE5OjA3OjE1IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCmluZGV4IDAzYmZjOTI4NjRiNmUuLjczOGUyNzY2MzNjMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKQEAgLTczOSw2ICYjNDM7NzM5LDkgQEAgc3RhdGljIGlubGluZSB1NjQga3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhzdHJ1Y3Qga3ZtICprdm0pCiAJaWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKQogCQlmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEOwogCiYjNDM7CWlmIChJU19FTkFCTEVEKENPTkZJR19OVU1BKSkKJiM0MzsJCWZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFOwomIzQzOwogCXJldHVybiBmbGFnczsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKaW5kZXggNjVjNzMyZDQ0MGQyZi4uMzk4MzE4MTc1Y2VjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCkBAIC0xMjQsMTAgJiM0MzsxMjQsMTUgQEAgaW50IHZtYV9kdXBfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdCk7CiB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7CiBpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCiAJCQkgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7CiYjNDM7aW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LAomIzQzOwkJCQkgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpOwogdm9pZCBtcG9sX2ZyZWVfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3ApOwogc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsCiAJCQkJCSAgICBwZ29mZl90IGlkeCk7CiAKJiM0MztzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAomIzQzOwkJCQkgICBub2RlbWFza190ICpub2Rlcyk7CiYjNDM7CiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIHN0cnVjdCBtZW1wb2xpY3kgKl9fZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgYWRkciwgcGdvZmZfdCAqaWx4KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaAppbmRleCBhYzJkNzdkMTQ5NjM1Li44ZDNhZTdlMmVhZDhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oCkBAIC0xNjU4LDExICYjNDM7MTY1OCwxNCBAQCBzdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHsKICNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRAlfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKQogI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVAJCSgxVUxMICZsdDsmbHQ7IDApCiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQJKDFVTEwgJmx0OyZsdDsgMSkKJiM0MzsjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFCSgxVUxMICZsdDsmbHQ7IDIpCiAKIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIHsKIAlfX3U2NCBzaXplOwogCV9fdTY0IGZsYWdzOwotCV9fdTY0IHJlc2VydmVkWzZdOwomIzQzOwlfX3UzMiBub2RlOwomIzQzOwlfX3UzMiBwYWQ7CiYjNDM7CV9fdTY0IHJlc2VydmVkWzVdOwogfTsKIAogI2RlZmluZSBLVk1fUFJFX0ZBVUxUX01FTU9SWQlfSU9XUihLVk1JTywgMHhkNSwgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5KQpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCAyYWQwYTVmMTgyODBhLi5jZTEwY2U0Mzc0NjQzIDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9tZW1wb2xpY3kuYwpAQCAtMTA4NSw3ICYjNDM7MTA4NSw0NSBAQCBzdGF0aWMgaW50IG1iaW5kX3JhbmdlKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcmV0dXJuIHZtYV9yZXBsYWNlX3BvbGljeSh2bWEsIG5ld19wb2wpOwogfQogCi0vKiBTZXQgdGhlIHByb2Nlc3MgbWVtb3J5IHBvbGljeSAqLwomIzQzOy8qKgomIzQzOyAqIG1lbXBvbGljeV9jcmVhdGUgLSBidWlsZCBhIHZhbGlkYXRlZCwgY3B1c2V0LWNvbnRleHR1YWxpc2VkIG1lbXBvbGljeQomIzQzOyAqIEBtb2RlOiBNUE9MXyogbW9kZQomIzQzOyAqIEBmbGFnczogTVBPTF9GXyogZmxhZ3MKJiM0MzsgKiBAbm9kZXM6IHRhcmdldCBub2RlbWFzaywgb3IgTlVMTCAoaW50ZXJwcmV0ZWQgcGVyIEBtb2RlOyBzZWUgbXBvbF9uZXcoKSkKJiM0MzsgKgomIzQzOyAqIENyZWF0ZXMgYSBuZXcgcG9saWN5IGFuZCBjb25zdHJhaW5zIGl0IHRvIHRoZSB0YXNrJiMzOTtzIGNwdXNldC4KJiM0MzsgKgomIzQzOyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlIGFuZCBmcmVlcyBpdCB3aXRoIG1wb2xfcHV0KCkuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7c3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncywKJiM0MzsJCW5vZGVtYXNrX3QgKm5vZGVzKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbXBvbGljeSAqcG9sOwomIzQzOwlOT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoIXNjcmF0Y2gpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsKJiM0MzsJcG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTsKJiM0MzsJaWYgKElTX0VSUihwb2wpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXRhc2tfbG9jayhjdXJyZW50KTsKJiM0MzsJZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBub2Rlcywgc2NyYXRjaCk7CiYjNDM7CXRhc2tfdW5sb2NrKGN1cnJlbnQpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQltcG9sX3B1dChwb2wpOwomIzQzOwkJcG9sID0gRVJSX1BUUihlcnIpOwomIzQzOwl9CiYjNDM7b3V0OgomIzQzOwlOT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7CiYjNDM7CXJldHVybiBwb2w7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobWVtcG9saWN5X2NyZWF0ZSwgJiMzNDtrdm0mIzM0Oyk7CiYjNDM7CiBzdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAogCQkJICAgICBub2RlbWFza190ICpub2RlcykKIHsKQEAgLTMyNzQsMjQgJiM0MzszMzEyLDQ3IEBAIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKQogfQogRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCwgJiMzNDtrdm0mIzM0Oyk7CiAKLWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwKLQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpCiYjNDM7LyoqCiYjNDM7ICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcAomIzQzOyAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZQomIzQzOyAqIEBzdGFydDogZmlyc3QgcGFnZSBvZmZzZXQgKGluY2x1c2l2ZSkKJiM0MzsgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSkKJiM0MzsgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlCiYjNDM7ICoKJiM0MzsgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS4KJiM0MzsgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuCiYjNDM7ICoKJiM0MzsgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LgomIzQzOyAqCiYjNDM7ICogVW5saWtlIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koKSwgbm8gVk1BIGlzIHJlcXVpcmVkLCBzbyBhIHJhbmdlIHRoYXQKJiM0MzsgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gYWxsb2NhdGlvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCwKJiM0MzsJCQkJIHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpCiB7Ci0JY29uc3QgcGdvZmZfdCBwZ29mZiA9IHZtYV9zdGFydF9wZ29mZih2bWEpOwotCWNvbnN0IHBnb2ZmX3QgcGdvZmZfZW5kID0gdm1hX2VuZF9wZ29mZih2bWEpOwogCXN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMOwogCWludCBlcnI7CiAKIAlpZiAocG9sKSB7Ci0JCW5ldyA9IHNwX2FsbG9jKHBnb2ZmLCBwZ29mZl9lbmQsIHBvbCk7CiYjNDM7CQluZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpOwogCQlpZiAoIW5ldykKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KLQllcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHBnb2ZmLCBwZ29mZl9lbmQsIG5ldyk7CiYjNDM7CWVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgc3RhcnQsIGVuZCwgbmV3KTsKIAlpZiAoZXJyICZhbXA7JmFtcDsgbmV3KQogCQlzcF9mcmVlKG5ldyk7CiAJcmV0dXJuIGVycjsKIH0KJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UsICYjMzQ7a3ZtJiMzNDspOwomIzQzOwomIzQzO2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwKJiM0MzsJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKQomIzQzO3sKJiM0MzsJcmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS0mZ3Q7dm1fcGdvZmYsCiYjNDM7CQkJCQkgICB2bWEtJmd0O3ZtX3Bnb2ZmICYjNDM7IHZtYV9wYWdlcyh2bWEpLCBwb2wpOwomIzQzO30KIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgJiMzNDtrdm0mIzM0Oyk7CiAKIC8qIEZyZWUgYSBiYWNraW5nIHBvbGljeSBzdG9yZSBvbiBpbm9kZSBkZWxldGUuICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYwppbmRleCAyMjMzZDg3MWEzOGY0Li5iMzMzY2I0MmZhYjI5IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMKQEAgLTI1LDYgJiM0MzsyNSwzMSBAQAogCiBzdGF0aWMgc2l6ZV90IHBhZ2Vfc2l6ZTsKIAomIzQzO3N0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncywKJiM0MzsJCQkJICAgICB1MzIgbm9kZSwgdTMyIHBhZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIGd1ZXN0X21lbWZkID0gewomIzQzOwkJLnNpemUgPSBzaXplLAomIzQzOwkJLmZsYWdzID0gZmxhZ3MsCiYjNDM7CQkubm9kZSA9IG5vZGUsCiYjNDM7CQkucGFkID0gcGFkLAomIzQzOwl9OwomIzQzOwomIzQzOwlyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgJmFtcDtndWVzdF9tZW1mZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJaWYgKCEoZmxhZ3MgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpKQomIzQzOwkJcmV0dXJuIHZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgc2l6ZSwgZmxhZ3MpOwomIzQzOwomIzQzOwlmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHNpemUsIGZsYWdzLCBub2RlLCAwKTsKJiM0MzsJVEVTVF9BU1NFUlQoZmQgJmd0Oz0gMCwgS1ZNX0lPQ1RMX0VSUk9SKEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGZkKSk7CiYjNDM7CXJldHVybiBmZDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCB0ZXN0X2ZpbGVfcmVhZF93cml0ZShpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKQogewogCWNoYXIgYnVmWzY0XTsKQEAgLTE3MSw2ICYjNDM7MTk2LDgzIEBAIHN0YXRpYyB2b2lkIHRlc3RfbnVtYV9hbGxvY2F0aW9uKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpCiAJa3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpOwogfQogCiYjNDM7c3RhdGljIGJvb2wgaGFzX2JpbmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSkKJiM0Mzt7CiYjNDM7CXJldHVybiB2bV9jaGVja19jYXAodm0sIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MpICZhbXA7CiYjNDM7CSAgICAgICBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGVfaW52YWxpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKQomIzQzO3sKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwlpZiAoIWhhc19iaW5kX25vZGUodm0pKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSwKJiM0MzsJCQkJICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsIDAsIDEpOwomIzQzOwlURVNUX0FTU0VSVChmZCAmbHQ7IDAgJmFtcDsmYW1wOyBlcnJubyA9PSBFSU5WQUwsCiYjNDM7CQkgICAgJiMzNDtndWVzdF9tZW1mZCgpIHdpdGggbm9uLXplcm8gcGFkIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMJiMzNDspOwomIzQzOwomIzQzOwlmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSwKJiM0MzsJCQkJICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsCiYjNDM7CQkJCSAgICAgICAxICZsdDsmbHQ7IDIwLCAwKTsKJiM0MzsJVEVTVF9BU1NFUlQoZmQgJmx0OyAwICZhbXA7JmFtcDsgZXJybm8gPT0gRUlOVkFMLAomIzQzOwkJICAgICYjMzQ7Z3Vlc3RfbWVtZmQoKSB3aXRoIG91dC1vZi1yYW5nZSBub2RlIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMJiMzNDspOwomIzQzOwomIzQzOwlmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSwgZmxhZ3MsIDEsIDApOwomIzQzOwlURVNUX0FTU0VSVChmZCAmbHQ7IDAgJmFtcDsmYW1wOyBlcnJubyA9PSBFSU5WQUwsCiYjNDM7CQkgICAgJiMzNDtndWVzdF9tZW1mZCgpIHdpdGggYSBub2RlIGJ1dCBubyBCSU5EX05PREUgZmxhZyBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTCYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGUoaW50IGZkLCBzaXplX3QgdG90YWxfc2l6ZSwgaW50IG5vZGUpCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIG90aGVyX21hc2sgPSAxVUwgJmx0OyZsdDsgKG5vZGUgPyAwIDogMSk7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4bm9kZSA9IEJJVFNfUEVSX1RZUEUob3RoZXJfbWFzayk7CiYjNDM7CWJvb2wgc3RlZXJfYXdheSA9IGlzX211bHRpX251bWFfbm9kZV9zeXN0ZW0oKTsKJiM0MzsJdm9pZCAqcGFnZXNbNF07CiYjNDM7CWludCBzdGF0dXNbNF07CiYjNDM7CWNoYXIgKm1lbTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CW1lbSA9IGt2bV9tbWFwKHRvdGFsX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJcGFnZXNbaV0gPSBtZW0gJiM0MzsgcGFnZV9zaXplICogaTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQmluZCBvbiBhIGRpZmZlcmVudCBub2RlIGlmIHBvc3NpYmxlIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgZmF1bHRpbmcKJiM0MzsJICogaGFwcGVucyBhcyBkZXNpcmVkLiBXaXRob3V0IGEgc2Vjb25kIG5vZGUgdXNlIHRoZSBsb2NhbCBub2RlIGFuZAomIzQzOwkgKiBqdXN0IGdldCBjb3ZlcmFnZSBvZiBjcmVhdGUvbW1hcC9mYXVsdCBwYXRocy4KJiM0MzsJICovCiYjNDM7CWlmIChzdGVlcl9hd2F5KQomIzQzOwkJa3ZtX3NldF9tZW1wb2xpY3koTVBPTF9CSU5ELCAmYW1wO290aGVyX21hc2ssIG1heG5vZGUpOwomIzQzOwomIzQzOwkvKiBEZWxpYmVyYXRlbHkgbm8gbWJpbmQoKSBvbiB0aGlzIG1hcHBpbmcuICovCiYjNDM7CW1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpOwomIzQzOwomIzQzOwlrdm1fbW92ZV9wYWdlcygwLCA0LCBwYWdlcywgTlVMTCwgc3RhdHVzLCAwKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJVEVTVF9BU1NFUlQoc3RhdHVzW2ldID09IG5vZGUsCiYjNDM7CQkJICAgICYjMzQ7RXhwZWN0ZWQgcGFnZSAlZCBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZCYjMzQ7LAomIzQzOwkJCSAgICBpLCBub2RlLCBzdGF0dXNbaV0pOwomIzQzOwomIzQzOwkvKiBEcm9wcGVkIG1lbW9yeSBzaG91bGQgZmF1bHQgYmFjayBvbnRvIHRoZSBzYW1lIG5vZGUgKi8KJiM0MzsJa3ZtX2ZhbGxvY2F0ZShmZCwgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpFLCAwLAomIzQzOwkJICAgICAgdG90YWxfc2l6ZSk7CiYjNDM7CW1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpOwomIzQzOwomIzQzOwlrdm1fbW92ZV9wYWdlcygwLCA0LCBwYWdlcywgTlVMTCwgc3RhdHVzLCAwKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJVEVTVF9BU1NFUlQoc3RhdHVzW2ldID09IG5vZGUsCiYjNDM7CQkJICAgICYjMzQ7RXhwZWN0ZWQgcGFnZSAlZCBiYWNrIG9uIG5vZGUgJWQsIGdvdCBpdCBvbiBub2RlICVkJiMzNDssCiYjNDM7CQkJICAgIGksIG5vZGUsIHN0YXR1c1tpXSk7CiYjNDM7CiYjNDM7CWlmIChzdGVlcl9hd2F5KQomIzQzOwkJa3ZtX3NldF9tZW1wb2xpY3koTVBPTF9ERUZBVUxULCBOVUxMLCAwKTsKJiM0MzsKJiM0MzsJa3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIHRlc3RfY29sbGFwc2UoaW50IGZkLCB1NjQgZmxhZ3MpCiB7CiAJY29uc3Qgc2l6ZV90IHBtZF9zaXplID0gZ2V0X3RyYW5zX2h1Z2VwYWdlc3ooKTsKQEAgLTQwNCw2ICYjNDM7NTA2LDEwIEBAIHN0YXRpYyB2b2lkIHRlc3RfZ3Vlc3RfbWVtZmRfZmxhZ3Moc3RydWN0IGt2bV92bSAqdm0pCiAJaW50IGZkOwogCiAJZm9yIChmbGFnID0gQklUKDApOyBmbGFnOyBmbGFnICZsdDsmbHQ7PSAxKSB7CiYjNDM7CQkvKiBCSU5EX05PREUgZGVwZW5kcyBvbiBhIHZhbGlkIG5vZGUgZmllbGQsIHRlc3Qgc2VwYXJhdGVseSAqLwomIzQzOwkJaWYgKGZsYWcgPT0gR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiAJCWZkID0gX192bV9jcmVhdGVfZ3Vlc3RfbWVtZmQodm0sIHBhZ2Vfc2l6ZSwgZmxhZyk7CiAJCWlmIChmbGFnICZhbXA7IHZhbGlkX2ZsYWdzKSB7CiAJCQlURVNUX0FTU0VSVChmZCAmZ3Q7PSAwLApAQCAtNDE4LDMwICYjNDM7NTI0LDQwIEBAIHN0YXRpYyB2b2lkIHRlc3RfZ3Vlc3RfbWVtZmRfZmxhZ3Moc3RydWN0IGt2bV92bSAqdm0pCiAJfQogfQogCi0jZGVmaW5lIF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgYXJncy4uLikJXAotZG8gewkJCQkJCQkJCVwKLQlpbnQgZmQgPSB2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQoX192bSwgX19nbWVtX3NpemUsIF9fZmxhZ3MpOwlcCi0JCQkJCQkJCQlcCi0JdGVzdF8jI19fdGVzdChhcmdzKTsJCQkJCQlcCi0JY2xvc2UoZmQpOwkJCQkJCQlcCiYjNDM7I2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIF9fbm9kZSwgYXJncy4uLikgXAomIzQzO2RvIHsJCQkJCQkJCQkgICBcCiYjNDM7CWludCBmZCA9IGNyZWF0ZV9ndWVzdF9tZW1mZChfX3ZtLCBfX2dtZW1fc2l6ZSwgX19mbGFncywgX19ub2RlKTsgICBcCiYjNDM7CQkJCQkJCQkJICAgXAomIzQzOwl0ZXN0XyMjX190ZXN0KGFyZ3MpOwkJCQkJCSAgIFwKJiM0MzsJY2xvc2UoZmQpOwkJCQkJCQkgICBcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIF9fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUpCQkJXAotCV9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgZmQsIF9fZ21lbV9zaXplKQomIzQzOwlfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsIGZkLCBfX2dtZW1fc2l6ZSkKIAogI2RlZmluZSBnbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzKQkJCQlcCiAJX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KQogCiAjZGVmaW5lIF9fZ21lbV90ZXN0X3ZtKF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUpCQlcCi0JX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX3ZtLCBmZCwgX19nbWVtX3NpemUpCiYjNDM7CV9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgMCwJCVwKJiM0MzsJCSAgICAgIF9fdm0sIGZkLCBfX2dtZW1fc2l6ZSkKIAogI2RlZmluZSBnbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzKQkJCQlcCiAJX19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KQogCiYjNDM7I2RlZmluZSBfX2dtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIF9fbm9kZSkJXAomIzQzOwlfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwJCQkJCVwKJiM0MzsJCSAgICAgIChfX2ZsYWdzKSB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLAkJXAomIzQzOwkJICAgICAgX19nbWVtX3NpemUsIF9fbm9kZSwgZmQsIF9fZ21lbV9zaXplLCBfX25vZGUpCiYjNDM7CiYjNDM7I2RlZmluZSBnbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fbm9kZSkJCQlcCiYjNDM7CV9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0LCBfX25vZGUpCiYjNDM7CiBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncykKIHsKIAl0ZXN0X2NyZWF0ZV9ndWVzdF9tZW1mZF9tdWx0aXBsZSh2bSk7CiAJdGVzdF9jcmVhdGVfZ3Vlc3RfbWVtZmRfaW52YWxpZF9zaXplcyh2bSwgZmxhZ3MpOwomIzQzOwl0ZXN0X2JpbmRfbm9kZV9pbnZhbGlkKHZtLCBmbGFncyk7CiAKIAlnbWVtX3Rlc3QoZmlsZV9yZWFkX3dyaXRlLCB2bSwgZmxhZ3MpOwogCkBAIC00NTIsNiAmIzQzOzU2OCw4IEBAIHN0YXRpYyB2b2lkIF9fdGVzdF9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKQogCQkJZ21lbV90ZXN0KG1tYXBfc3VwcG9ydGVkLCB2bSwgZmxhZ3MpOwogCQkJZ21lbV90ZXN0KGZhdWx0X292ZXJmbG93LCB2bSwgZmxhZ3MpOwogCQkJZ21lbV90ZXN0KG51bWFfYWxsb2NhdGlvbiwgdm0sIGZsYWdzKTsKJiM0MzsJCQlpZiAoaGFzX2JpbmRfbm9kZSh2bSkpCiYjNDM7CQkJCWdtZW1fdGVzdF9ub2RlKGJpbmRfbm9kZSwgdm0sIGZsYWdzLCAwKTsKIAkJCV9fZ21lbV90ZXN0KGNvbGxhcHNlLCB2bSwgZmxhZ3MsIHBtZF9zaXplKTsKIAkJfSBlbHNlIHsKIAkJCWdtZW1fdGVzdChmYXVsdF9wcml2YXRlLCB2bSwgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKaW5kZXggNjI1ZTYyZTFhMDMxOC4uZGM5ZjA3MWRkOTY5YiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCkBAIC00MjMsNiAmIzQzOzQyMywzMSBAQCBzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqa3ZtX2dtZW1fZ2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkgKi8KIAlyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cCgmYW1wO0dNRU1fSShpbm9kZSktJmd0O3BvbGljeSwgcGdvZmYpOwogfQomIzQzOwomIzQzO3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbXBvbGljeSAqcG9sOwomIzQzOwlub2RlbWFza190IG5vZGVzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoKHVuc2lnbmVkIGludClub2RlICZndDs9IE1BWF9OVU1OT0RFUykKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpbml0X25vZGVtYXNrX29mX25vZGUoJmFtcDtub2Rlcywgbm9kZSk7CiYjNDM7CXBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCAmYW1wO25vZGVzKTsKJiM0MzsJaWYgKElTX0VSUihwb2wpKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIocG9sKTsKJiM0MzsKJiM0MzsJZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSgmYW1wO0dNRU1fSShpbm9kZSktJmd0O3BvbGljeSwgMCwKJiM0MzsJCQkJCSAgTUFYX0xGU19GSUxFU0laRSAmZ3Q7Jmd0OyBQQUdFX1NISUZULCBwb2wpOwomIzQzOwltcG9sX3B1dChwb2wpOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsjZWxzZQomIzQzO3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FSU5WQUw7CiYjNDM7fQogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0gewpAQCAtNTIwLDcgJiM0Mzs1NDUsNyBAQCBib29sIF9fd2VhayBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKHN0cnVjdCBrdm0gKmt2bSkKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpCiYjNDM7c3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gJiMzNDtba3ZtLWdtZW1dJiMzNDs7CiAJc3RydWN0IGdtZW1fZmlsZSAqZjsKQEAgLTU2MSw2ICYjNDM7NTg2LDEyIEBAIHN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKQogCiAJR01FTV9JKGlub2RlKS0mZ3Q7ZmxhZ3MgPSBmbGFnczsKIAomIzQzOwlpZiAoZmxhZ3MgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHsKJiM0MzsJCWVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7CiYjNDM7CQlpZiAoZXJyKQomIzQzOwkJCWdvdG8gZXJyX2lub2RlOwomIzQzOwl9CiYjNDM7CiAJZmlsZSA9IGFsbG9jX2ZpbGVfcHNldWRvKGlub2RlLCBrdm1fZ21lbV9tbnQsIG5hbWUsIE9fUkRXUiwgJmFtcDtrdm1fZ21lbV9mb3BzKTsKIAlpZiAoSVNfRVJSKGZpbGUpKSB7CiAJCWVyciA9IFBUUl9FUlIoZmlsZSk7CkBAIC01OTMsNiAmIzQzOzYyNCw3IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncykKIHsKIAlsb2ZmX3Qgc2l6ZSA9IGFyZ3MtJmd0O3NpemU7CiAJdTY0IGZsYWdzID0gYXJncy0mZ3Q7ZmxhZ3M7CiYjNDM7CWludCBub2RlID0gTlVNQV9OT19OT0RFOwogCiAJaWYgKGZsYWdzICZhbXA7IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjAwLDcgJiM0Mzs2MzIsMTUgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKQogCWlmIChzaXplICZsdDs9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7CiYjNDM7CWlmIChmbGFncyAmYW1wOyBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkgewomIzQzOwkJaWYgKGFyZ3MtJmd0O3BhZCB8fCBhcmdzLSZndDtub2RlICZndDs9IE1BWF9OVU1OT0RFUykKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCW5vZGUgPSBhcmdzLSZndDtub2RlOwomIzQzOwl9IGVsc2UgaWYgKGFyZ3MtJmd0O25vZGUgfHwgYXJncy0mZ3Q7cGFkKSB7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncywgbm9kZSk7CiB9CiAKIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc4NjAKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiA1MDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gUmlzayBBc3Nlc3NtZW50IGZvciBhIEtWTSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggd2l0aCBLTVNBTiBpbiBtaW5kLCBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmVzLiBGaXJzdCwgSSBuZWVkIHRvIG1ldGhvZGljYWxseSBnbyB0aHJvdWdoIHRoZSBkaWZmLgoKMS4gIEluIGBpbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhgLCB3ZSYjMzk7cmUgYWRkaW5nIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgd2l0aGluIGBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzYCBidXQgb25seSBpZiBOVU1BIGlzIGVuYWJsZWQuIE1ha2VzIHNlbnNlLgoKMi4gIGBpbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oYCBqdXN0IGRlY2xhcmVzIHNvbWUgbWVtcG9saWN5IGZ1bmN0aW9ucyAtIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBhbmQgYG1lbXBvbGljeV9jcmVhdGVgLiBOb3RoaW5nIGltbWVkaWF0ZWx5IGNvbmNlcm5pbmcgdGhlcmUsIGl0IGlzIGp1c3QgZGVjbGFyaW5nIHRob3NlIGZ1bmN0aW9ucy4KCjMuICBUaGUgYGluY2x1ZGUvdWFwaS9saW51eC9rdm0uaGAgaXMgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4gV2UmIzM5O3ZlIGdvdCBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGRlZmluZWQsIHdoaWNoIGlzIHJlbGV2YW50IGZvciBOVU1BLiAgTW9yZSBpbXBvcnRhbnRseSwgdGhlIGBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZGAgaGFzIGJlZW4gKm1vZGlmaWVkKi4gIFdlIGFyZSByZXBsYWNpbmcgdGhlIHJlc2VydmVkIHNwYWNlIHRvIGFkZCBhIGBub2RlYCBhbmQgYSBgcGFkYCBtZW1iZXIsIGJ1dCBrZWVwaW5nIHRoZSBzdHJ1Y3Qgc2l6ZSBjb25zdGFudCBhdCA2NCBieXRlcy4gVGhlIGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHNpbmNlIHRoZSBzaXplIGlzIHRoZSBzYW1lLCBubyBtZW1vcnkgcmlza3Mgc2hvdWxkIGJlIGFwcGFyZW50LiBIb3dldmVyLCBub3cgSSBhbSB3b25kZXJpbmcgaWYgYGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmRgIGlzIGNvcGllZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiB0aGUgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGlvY3RsIGNhbGwuIEkgbmVlZCB0byBrbm93IHRoaXMgdG8gYmUgc3VyZSB0aGVyZSYjMzk7cyBubyBsZWFrIG9mIGtlcm5lbCBtZW1vcnkuCgpXYWl0ISBRdWljayBzYW5pdHkgY2hlY2suIElzIHRoZSBpb2N0bCBgX0lPV1JgIG9yIGBfSU9XYD8gQW5kIHllcywgYCNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBfSU9XUihLVk1JTywgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpYCBjb25maXJtcyB0aGF0IGl0JiMzOTtzIHJlYWQvd3JpdGUuIEkgbmVlZCB0byBiZSAqc3VyZSogYWJvdXQgdGhpcyByZWFkIGJhY2suIEkgYW0gZ29pbmcgdG8gaGF2ZSB0byBncmVwIGZvciBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW4gdGhlIEtWTSBjb2RlIG5vdyB0byBzZWUgdGhlIGlvY3RsIGltcGxlbWVudGF0aW9uLiBUaGlzIHdpbGwgYmUgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIGlmIHRoZXJlJiMzOTtzIGFueSBwb3RlbnRpYWwgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgZHVlIHRvIHRoZSBzdHJ1Y3R1cmUgY2hhbmdlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtLVk1fQ1JFQVRFX0dVRVNUX01FTUZEJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02MzU3PWluIGZsYWdzIHRvIGhhdmUgS1ZNIGJpbmQgdGhlIG1lbW9yeSByZWdpb24gdG8gYSBnaXZlbiBndWVzdF9tZW1mZCByYW5nZSBvZlxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTYzNTgtW2d1ZXN0X21lbWZkX29mZnNldCwgZ3Vlc3RfbWVtZmRfb2Zmc2V0ICYjNDM7IG1lbW9yeV9zaXplXS4gIFRoZSB0YXJnZXQgZ3Vlc3RfbWVtZmRcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2MzU5Om11c3QgcG9pbnQgYXQgYSBmaWxlIGNyZWF0ZWQgdmlhIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgb24gdGhlIGN1cnJlbnQgVk0sIGFuZFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTYzNjAtdGhlIHRhcmdldCByYW5nZSBtdXN0IG5vdCBiZSBib3VuZCB0byBhbnkgb3RoZXIgbWVtb3J5IHJlZ2lvbi4gIEFsbCBzdGFuZGFyZFxuLS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02NDMwPVRoZSBcJiMzNDtmbGFnc1wmIzM0OyBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgYW5kIG11c3QgYmUgJiMzOTswJiMzOTsuXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQzMS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDMyOjQuMTQyIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi0tXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ0MC1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDQxOktWTV9DUkVBVEVfR1VFU1RfTUVNRkQgY3JlYXRlcyBhbiBhbm9ueW1vdXMgZmlsZSBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvclxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0NDItdGhhdCByZWZlcnMgdG8gaXQuICBndWVzdF9tZW1mZCBmaWxlcyBhcmUgcm91Z2hseSBhbmFsb2dvdXMgdG8gZmlsZXMgY3JlYXRlZFxuLS1cbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02NDczPVRoZSBjYXBhYmlsaXR5IEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MgZW51bWVyYXRlcyB0aGUgYGZsYWdzYCB0aGF0IGNhbiBiZVxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0NzQ6c3BlY2lmaWVkIHZpYSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELiAgQ3VycmVudGx5IGRlZmluZWQgZmxhZ3M6XG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ3NS1cbi0tXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ3OS0gIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQgTWFrZSBhbGwgbWVtb3J5IGluIHRoZSBmaWxlIHNoYXJlZCBkdXJpbmdcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDgwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIChtZW1vcnkgZmlsZXMgY3JlYXRlZFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0ODEtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgSU5JVF9TSEFSRUQgd2lsbCBiZSBtYXJrZWQgcHJpdmF0ZSkuXG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWc9ODM9Y29uZmlnIEtWTV9TV19QUk9URUNURURfVk1cbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy05MC1cdCAgcHJvdGVjdGVkIFZNcyBhcmUgcHVyZWx5IGEgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcgdmVoaWNsZSBmb3JcbmFyY2gveDg2L2t2bS9LY29uZmlnOjkxOlx0ICBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELiAgQXR0ZW1wdGluZyB0byBydW4gYSBcJiMzNDtyZWFsXCYjMzQ7IFZNIHdvcmtsb2FkIGFzIGFcbmFyY2gveDg2L2t2bS9LY29uZmlnLTkyLVx0ICBzb2Z0d2FyZS1wcm90ZWN0ZWQgVk0gd2lsbCBmYWlsIG1pc2VyYWJseS5cbi0tXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmg9MTY0OT1zdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHtcbi0tXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1Ny1cbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaDoxNjU4OiNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjU5LSNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQXHRcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVxuLS1cbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaD0xNjQ1PXN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xuLS1cbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjUzLVxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oOjE2NTQ6I2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTUtI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcdFx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYz0yOD1zdGF0aWMgaW50IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy0zNy1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmM6Mzg6XHRyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXHUwMDI2Z3Vlc3RfbWVtZmQpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy0zOS19XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYz00MT1zdGF0aWMgaW50IGNyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncywgdTMyIG5vZGUpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy00OC1cdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgc2l6ZSwgZmxhZ3MsIG5vZGUsIDApO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYzo0OTpcdFRFU1RfQVNTRVJUKGZkIFx1MDAzZT0gMCwgS1ZNX0lPQ1RMX0VSUk9SKEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGZkKSk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTUwLVx0cmV0dXJuIGZkO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg9NjY3PXN0YXRpYyBpbmxpbmUgaW50IF9fdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSxcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oLTY3NC1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg6Njc1Olx0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFx1MDAyNmd1ZXN0X21lbWZkKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjc2LX1cbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oPTY3OD1zdGF0aWMgaW5saW5lIGludCB2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLFxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjgyLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaDo2ODM6XHRURVNUX0FTU0VSVChmZCBcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02ODQtXHRyZXR1cm4gZmQ7XG4tLVxudmlydC9rdm0va3ZtX21haW4uYz01MTY3PXN0YXRpYyBsb25nIGt2bV92bV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTUzODctI2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL2t2bV9tYWluLmM6NTM4ODpcdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xudmlydC9rdm0va3ZtX21haW4uYy01Mzg5LVx0XHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA2MzQKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIEtWTSBDb3JlOiBBIExpbmUgb2YgSW5xdWlyeSoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIGRlbHZlIGludG8gdGhlIEtWTSBjb3JlLCBzcGVjaWZpY2FsbHkgdGhlIGBrdm1fbWFpbi5jYCBmaWxlLiBHaXZlbiBteSBleHBlcnRpc2UsIEkgYWxyZWFkeSBoYXZlIGEgcHJldHR5IGdvb2QgbWVudGFsIG1hcCBvZiB0aGlzIGNvZGUsIGJ1dCBJIG5lZWQgdG8gcGlucG9pbnQgYSBzcGVjaWZpYyBhcmVhLiBMZXQmIzM5O3Mgc3RhcnQgYnkgemVyb2luZyBpbiBvbiBsaW5lIDUzODguIE15IGluaXRpYWwgYXBwcm9hY2ggd2lsbCBiZSBhIHN0cmFpZ2h0Zm9yd2FyZCBleGFtaW5hdGlvbiBvZiB0aGF0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4gTGV0JiMzOTtzIHVzZSBgcmVhZC1maWxlYCB0byBnZXQgYSBnb29kIGxvb2sgYXQgdGhlIGNvZGUgYXJvdW5kIHRoYXQgYXJlYS4gSG9wZWZ1bGx5LCB0aGF0IHdpbGwgZ2l2ZSBtZSBlbm91Z2ggY29udGV4dCB0byBiZWdpbiBhIG1vcmUgbnVhbmNlZCBpbnZlc3RpZ2F0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2t2bV9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MzgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzUzODA6XHRcdFx0YnJlYWs7XG41MzgxOlx0XHRjYXNlIEtWTV9SRVNFVF9ESVJUWV9SSU5HUzpcbjUzODI6XHRcdFx0ciA9IGt2bV92bV9pb2N0bF9yZXNldF9kaXJ0eV9wYWdlcyhrdm0pO1xuNTM4MzpcdFx0XHRicmVhaztcbjUzODQ6XHRcdGNhc2UgS1ZNX0dFVF9TVEFUU19GRDpcbjUzODU6XHRcdFx0ciA9IGt2bV92bV9pb2N0bF9nZXRfc3RhdHNfZmQoa3ZtKTtcbjUzODY6XHRcdFx0YnJlYWs7XG41Mzg3Olx0I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbjUzODg6XHRcdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xuNTM4OTpcdFx0XHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZDtcbjUzOTA6XHRcbjUzOTE6XHRcdFx0ciA9IC1FRkFVTFQ7XG41MzkyOlx0XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZndWVzdF9tZW1mZCwgYXJncCwgc2l6ZW9mKGd1ZXN0X21lbWZkKSkpXG41MzkzOlx0XHRcdFx0Z290byBvdXQ7XG41Mzk0Olx0XG41Mzk1Olx0XHRcdHIgPSBrdm1fZ21lbV9jcmVhdGUoa3ZtLCBcdTAwMjZndWVzdF9tZW1mZCk7XG41Mzk2Olx0XHRcdGJyZWFrO1xuNTM5NzpcdFx0fVxuNTM5ODpcdCNlbmRpZlxuNTM5OTpcdFx0ZGVmYXVsdDpcbjU0MDA6XHRcdFx0ciA9IGt2bV9hcmNoX3ZtX2lvY3RsKGZpbHAsIGlvY3RsLCBhcmcpO1xuNTQwMTpcdFx0fVxuNTQwMjpcdG91dDpcbjU0MDM6XHRcdHJldHVybiByO1xuNTQwNDpcdH1cbjU0MDU6XHRcbjU0MDY6XHQjaWZkZWYgQ09ORklHX0tWTV9DT01QQVRcbjU0MDc6XHRzdHJ1Y3QgY29tcGF0X2t2bV9kaXJ0eV9sb2cge1xuNTQwODpcdFx0X191MzIgc2xvdDtcbjU0MDk6XHRcdF9fdTMyIHBhZGRpbmcxO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTMwMAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDEyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtWTSBHdWVzdCBNZW1vcnkgRmlsZSBDcmVhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIHRoaXMgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGNhbGwuIFJpZ2h0IG9mZiB0aGUgYmF0LCBpdCYjMzk7cyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiBGcm9tIHdoYXQgSSBjYW4gc2VlLCBhbGwgaXQmIzM5O3MgZG9pbmcgaXMgYSBzaW1wbGUgYGNvcHlfZnJvbV91c2VyYCBvcGVyYXRpb24g4oCTIGp1c3QgZ3JhYmJpbmcgdGhlIGBndWVzdF9tZW1mZGAgc3RydWN0dXJlIGZyb20gdXNlcnNwYWNlIGFuZCBwYXNzaW5nIGl0IG92ZXIuIE5vIGRhdGEgaXMgYmVpbmcgcmV0dXJuZWQgYmFjayB0byB0aGUgdXNlciwgd2hpY2ggaXMgaW50ZXJlc3RpbmcgdG8gbm90ZS4gCgpOb3csIHRoZSByZWFsIG1lYXQgb2YgdGhlIG9wZXJhdGlvbiBoYXMgZ290IHRvIGJlIHdpdGhpbiBga3ZtX2dtZW1fY3JlYXRlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGF0IGZ1bmN0aW9uIGRvZXMgd2l0aCB0aGUgYGd1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUuIFRoaXMgYWxzbyBtZWFucyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLCBzbyBsZXQmIzM5O3MgZ2V0IGludG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29weV90b191c2VyJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNjU5CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogNDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBob3cgSSYjMzk7ZCBhcHByb2FjaCBzdW1tYXJpemluZyB0aGUgcHJvbXB0LCBrZWVwaW5nIGluIG1pbmQgbXkgb3duIGV4cGVydC1sZXZlbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBmaWVsZDoKCioqSW52ZXN0aWdhdGluZyBHdWVzdCBNZW1vcnkgTWFuYWdlbWVudCBpbiBLVk0qKgoKQWxyaWdodCwgSSBuZWVkIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHNvbWV0aGluZyByZWxhdGVkIHRvIGd1ZXN0IG1lbW9yeSBtYW5hZ2VtZW50IHdpdGhpbiBLVk0uIFNwZWNpZmljYWxseSwgSSBzaG91bGQgcHJvYmFibHkgemVybyBpbiBvbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYXMgYSBnb29kIHBsYWNlIHRvIHN0YXJ0LiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIGxvZ2ljIHJlbGF0ZWQgdG8gYG1lbWZkYC1iYWNrZWQgZ3Vlc3QgbWVtb3J5IHNob3VsZCByZXNpZGUuIEkmIzM5O20gdGhpbmtpbmcgSSBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiBiaW5kaW5nIG1lbW9yeSBub2RlcywgY3JlYXRpbmcgZ3Vlc3QgbWVtb3J5IHJlZ2lvbnMgdXNpbmcgYG1lbWZkYCwgYW5kIHJlbGF0ZWQgb3BlcmF0aW9ucyDigJMgc3BlY2lmaWNhbGx5LCBmdW5jdGlvbnMgbGlrZSBga3ZtX2dtZW1fYmluZF9ub2RlYCwgYGt2bV9nbWVtX2NyZWF0ZWAsIGFuZCBhbnkgcmVsYXRlZCBpbmZyYXN0cnVjdHVyZS4gSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQgbWFuYWdlZCBmcm9tIHRoZSBob3N0JiMzOTtzIHBlcnNwZWN0aXZlLCBidXQgYWxzbyBob3cgaXQgYXBwZWFycyBhbmQgYmVoYXZlcyB3aXRoaW4gdGhlIGd1ZXN0LiBVbmRlcnN0YW5kaW5nIHRoZXNlIGludGVyYWN0aW9ucyBpcyBrZXkgdG8gcGlucG9pbnRpbmcgYW55IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBtZW1vcnktcmVsYXRlZCBpc3N1ZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDIwOlx0XHQgKiBleHBsaWNpdCBwb2xpY3kgaGFzIGJlZW4gc2V0IHZpYSBtYmluZCgpIGZvciB0aGlzIG1lbW9yeS4gVGhlIGNhbGxlclxuIDQyMTpcdFx0ICogY2FuIHRoZW4gcmVwbGFjZSBOVUxMIHdpdGggdGhlIGRlZmF1bHQgbWVtb3J5IHBvbGljeSBpbnN0ZWFkIG9mIHRoZVxuIDQyMjpcdFx0ICogY3VycmVudCB0YXNrJiMzOTtzIG1lbW9yeSBwb2xpY3kuXG4gNDIzOlx0XHQgKi9cbiA0MjQ6XHRcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCBwZ29mZik7XG4gNDI1Olx0fVxuIDQyNjpcdFxuIDQyNzpcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuIDQyODpcdHtcbiA0Mjk6XHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcbiA0MzA6XHRcdG5vZGVtYXNrX3Qgbm9kZXM7XG4gNDMxOlx0XHRpbnQgZXJyO1xuIDQzMjpcdFxuIDQzMzpcdFx0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiA0MzQ6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNDM1Olx0XG4gNDM2Olx0XHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuIDQzNzpcdFx0cG9sID0gbWVtcG9saWN5X2NyZWF0ZShNUE9MX0JJTkQsIDAsIFx1MDAyNm5vZGVzKTtcbiA0Mzg6XHRcdGlmIChJU19FUlIocG9sKSlcbiA0Mzk6XHRcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbiA0NDA6XHRcbiA0NDE6XHRcdGVyciA9IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2Vwb2xpY3ksIDAsXG4gNDQyOlx0XHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbiA0NDM6XHRcdG1wb2xfcHV0KHBvbCk7XG4gNDQ0Olx0XHRyZXR1cm4gZXJyO1xuIDQ0NTpcdH1cbiA0NDY6XHQjZWxzZVxuIDQ0NzpcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuIDQ0ODpcdHtcbiA0NDk6XHRcdHJldHVybiAtRUlOVkFMO1xuIDQ1MDpcdH1cbiA0NTE6XHQjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbiA0NTI6XHRcbiA0NTM6XHRzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9nbWVtX3ZtX29wcyA9IHtcbiA0NTQ6XHRcdC5mYXVsdFx0XHQ9IGt2bV9nbWVtX2ZhdWx0X3VzZXJfbWFwcGluZyxcbiA0NTU6XHQjaWZkZWYgQ09ORklHX05VTUFcbiA0NTY6XHRcdC5nZXRfcG9saWN5XHQ9IGt2bV9nbWVtX2dldF9wb2xpY3ksXG4gNDU3Olx0XHQuc2V0X3BvbGljeVx0PSBrdm1fZ21lbV9zZXRfcG9saWN5LFxuIDQ1ODpcdCNlbmRpZlxuIDQ1OTpcdH07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNTg1CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYG1lbXBvbGljeS5jYCBDb2RlKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgbWVtcG9saWN5LmNgIGNvZGUgc25pcHBldC4gTXkgaW5pdGlhbCBmb2N1cyBpcyB0aGUgYG1lbXBvbGljeV9jcmVhdGVgIGZ1bmN0aW9uLiBJIHNlZSBpdCBjcmVhdGVzIGEgbmV3IG1lbW9yeSBwb2xpY3kgc3RydWN0dXJlLiBUaGUgaW5wdXQgcGFyYW1ldGVycywgYG1vZGVgLCBgZmxhZ3NgLCBhbmQgYG5vZGVzYCwgYXJlIHByZXR0eSBzdGFuZGFyZDsgdGhleSBkZWZpbmUgdGhlIGJlaGF2aW9yIGFuZCBub2RlIGFmZmluaXR5IG9mIHRoZSBwb2xpY3kuCgpUaGUgY29yZSBvZiBpdCBpcyBjYWxsaW5nIGBtcG9sX25ld2AgdG8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGBzdHJ1Y3QgbWVtcG9saWN5YC4gVGhlbiwgY3J1Y2lhbGx5LCB0aGVyZSYjMzk7cyBhIGxvY2sgYXJvdW5kIGBtcG9sX3NldF9ub2RlbWFza2AuIFRoYXQmIzM5O3MgaW50ZXJlc3RpbmcsIHN1Z2dlc3RpbmcgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3VlcyBhbmQgdGhlIG5lZWQgZm9yIGNhcmVmdWwgbm9kZSBtYXNrIHVwZGF0ZXMuIFRoZSB1c2Ugb2YgYSBzY3JhdGNoIG5vZGVtYXNrIGFuZCBlcnJvciBoYW5kbGluZyBhcm91bmQgdGhlIGBtcG9sX3NldF9ub2RlbWFza2AgY2FsbCBpcyB0eXBpY2FsOyBpdCYjMzk7cyB3aGF0IEkmIzM5O2QgZXhwZWN0LiBUaGUgYG1wb2xfcHV0YCBvbiBlcnJvciBpcyBhIGdvb2QgcHJhY3RpY2UgZm9yIHJlc291cmNlIG1hbmFnZW1lbnQsIGVuc3VyaW5nIHRoYXQgdGhlIGNyZWF0ZWQgcG9saWN5IGRvZXNuJiMzOTt0IGxlYWsgaWYgdGhlIHNldCBvcGVyYXRpb24gZmFpbHMuCgpNeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSBgbXBvbF9uZXdgIGFuZCBgbXBvbF9zZXRfbm9kZW1hc2tgLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgYHN0cnVjdCBtZW1wb2xpY3lgIGlzIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQsIGFuZCB3aGF0IHRoZSBgbXBvbF9zZXRfbm9kZW1hc2tgIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGRvaW5nIHVuZGVyIHRoZSBob29kLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gaW50ZXJlc3RlZCBpbiBob3cgaXQgaGFuZGxlcyB0aGUgcHJvdmlkZWQgYG5vZGVzYCBtYXNrIGFuZCBhbnkgcG90ZW50aWFsIGludGVyYWN0aW9ucyB3aXRoIHRoZSBzeXN0ZW0mIzM5O3MgbWVtb3J5IG1hbmFnZW1lbnQgc3RydWN0dXJlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgbG9ja2luZyBhcyB3ZWxsLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGhvdyBpdCBhY3R1YWxseSBzZXRzIHRoZSBub2RlbWFzayB0byBrbm93IGlmIHRoZXJlIGlzIGFuIGlzc3VlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcG9sX25ld3xtcG9sX3NldF9ub2RlbWFzayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jPTM4OD1zdGF0aWMgdm9pZCBtcG9sX3JlbGF0aXZlX25vZGVtYXNrKG5vZGVtYXNrX3QgKnJldCwgY29uc3Qgbm9kZW1hc2tfdCAqb3JpZyxcbi0tXG5tbS9tZW1wb2xpY3kuYy0zOTUtXG5tbS9tZW1wb2xpY3kuYzozOTY6c3RhdGljIGludCBtcG9sX25ld19ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxubW0vbWVtcG9saWN5LmMtMzk3LXtcbi0tXG5tbS9tZW1wb2xpY3kuYy00MDMtXG5tbS9tZW1wb2xpY3kuYzo0MDQ6c3RhdGljIGludCBtcG9sX25ld19wcmVmZXJyZWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBjb25zdCBub2RlbWFza190ICpub2Rlcylcbm1tL21lbXBvbGljeS5jLTQwNS17XG4tLVxubW0vbWVtcG9saWN5LmMtNDE0LS8qXG5tbS9tZW1wb2xpY3kuYzo0MTU6ICogbXBvbF9zZXRfbm9kZW1hc2sgaXMgY2FsbGVkIGFmdGVyIG1wb2xfbmV3KCkgdG8gc2V0IHVwIHRoZSBub2RlbWFzaywgaWZcbm1tL21lbXBvbGljeS5jOjQxNjogKiBhbnksIGZvciB0aGUgbmV3IHBvbGljeS4gIG1wb2xfbmV3KCkgaGFzIGFscmVhZHkgdmFsaWRhdGVkIHRoZSBub2Rlc1xubW0vbWVtcG9saWN5LmMtNDE3LSAqIHBhcmFtZXRlciB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvbGljeSBtb2RlIGFuZCBmbGFncy5cbi0tXG5tbS9tZW1wb2xpY3kuYy00MjEtICovXG5tbS9tZW1wb2xpY3kuYzo0MjI6c3RhdGljIGludCBtcG9sX3NldF9ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsXG5tbS9tZW1wb2xpY3kuYy00MjMtXHRcdCAgICAgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMsIHN0cnVjdCBub2RlbWFza19zY3JhdGNoICpuc2MpXG4tLVxubW0vbWVtcG9saWN5LmMtNDU2LSAqIFRoaXMgZnVuY3Rpb24ganVzdCBjcmVhdGVzIGEgbmV3IHBvbGljeSwgZG9lcyBzb21lIGNoZWNrIGFuZCBzaW1wbGVcbm1tL21lbXBvbGljeS5jOjQ1NzogKiBpbml0aWFsaXphdGlvbi4gWW91IG11c3QgaW52b2tlIG1wb2xfc2V0X25vZGVtYXNrKCkgdG8gc2V0IG5vZGVzLlxubW0vbWVtcG9saWN5LmMtNDU4LSAqL1xubW0vbWVtcG9saWN5LmM6NDU5OnN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX25ldyh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbm1tL21lbXBvbGljeS5jLTQ2MC1cdFx0XHRcdCAgbm9kZW1hc2tfdCAqbm9kZXMpXG4tLVxubW0vbWVtcG9saWN5LmM9NTk1PXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWVtcG9saWN5X29wZXJhdGlvbnMgbXBvbF9vcHNbTVBPTF9NQVhdID0ge1xuLS1cbm1tL21lbXBvbGljeS5jLTU5OS1cdFtNUE9MX0lOVEVSTEVBVkVdID0ge1xubW0vbWVtcG9saWN5LmM6NjAwOlx0XHQuY3JlYXRlID0gbXBvbF9uZXdfbm9kZW1hc2ssXG5tbS9tZW1wb2xpY3kuYy02MDEtXHRcdC5yZWJpbmQgPSBtcG9sX3JlYmluZF9ub2RlbWFzayxcbi0tXG5tbS9tZW1wb2xpY3kuYy02MDMtXHRbTVBPTF9QUkVGRVJSRURdID0ge1xubW0vbWVtcG9saWN5LmM6NjA0Olx0XHQuY3JlYXRlID0gbXBvbF9uZXdfcHJlZmVycmVkLFxubW0vbWVtcG9saWN5LmMtNjA1LVx0XHQucmViaW5kID0gbXBvbF9yZWJpbmRfcHJlZmVycmVkLFxuLS1cbm1tL21lbXBvbGljeS5jLTYwNy1cdFtNUE9MX0JJTkRdID0ge1xubW0vbWVtcG9saWN5LmM6NjA4Olx0XHQuY3JlYXRlID0gbXBvbF9uZXdfbm9kZW1hc2ssXG5tbS9tZW1wb2xpY3kuYy02MDktXHRcdC5yZWJpbmQgPSBtcG9sX3JlYmluZF9ub2RlbWFzayxcbi0tXG5tbS9tZW1wb2xpY3kuYy02MTQtXHRbTVBPTF9QUkVGRVJSRURfTUFOWV0gPSB7XG5tbS9tZW1wb2xpY3kuYzo2MTU6XHRcdC5jcmVhdGUgPSBtcG9sX25ld19ub2RlbWFzayxcbm1tL21lbXBvbGljeS5jLTYxNi1cdFx0LnJlYmluZCA9IG1wb2xfcmViaW5kX3ByZWZlcnJlZCxcbi0tXG5tbS9tZW1wb2xpY3kuYy02MTgtXHRbTVBPTF9XRUlHSFRFRF9JTlRFUkxFQVZFXSA9IHtcbm1tL21lbXBvbGljeS5jOjYxOTpcdFx0LmNyZWF0ZSA9IG1wb2xfbmV3X25vZGVtYXNrLFxubW0vbWVtcG9saWN5LmMtNjIwLVx0XHQucmViaW5kID0gbXBvbF9yZWJpbmRfbm9kZW1hc2ssXG4tLVxubW0vbWVtcG9saWN5LmM9MTA2MT1zdGF0aWMgaW50IG1iaW5kX3JhbmdlKHN0cnVjdCB2bWFfaXRlcmF0b3IgKnZtaSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vbWVtcG9saWN5LmMtMTA5MS0gKiBAZmxhZ3M6IE1QT0xfRl8qIGZsYWdzXG5tbS9tZW1wb2xpY3kuYzoxMDkyOiAqIEBub2RlczogdGFyZ2V0IG5vZGVtYXNrLCBvciBOVUxMIChpbnRlcnByZXRlZCBwZXIgQG1vZGU7IHNlZSBtcG9sX25ldygpKVxubW0vbWVtcG9saWN5LmMtMTA5My0gKlxuLS1cbm1tL21lbXBvbGljeS5jPTExMDA9c3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbi0tXG5tbS9tZW1wb2xpY3kuYy0xMTA5LVxubW0vbWVtcG9saWN5LmM6MTExMDpcdHBvbCA9IG1wb2xfbmV3KG1vZGUsIGZsYWdzLCBub2Rlcyk7XG5tbS9tZW1wb2xpY3kuYy0xMTExLVx0aWYgKElTX0VSUihwb2wpKVxuLS1cbm1tL21lbXBvbGljeS5jLTExMTQtXHR0YXNrX2xvY2soY3VycmVudCk7XG5tbS9tZW1wb2xpY3kuYzoxMTE1Olx0ZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBub2Rlcywgc2NyYXRjaCk7XG5tbS9tZW1wb2xpY3kuYy0xMTE2LVx0dGFza191bmxvY2soY3VycmVudCk7XG4tLVxubW0vbWVtcG9saWN5LmM9MTEyNz1zdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuLS1cbm1tL21lbXBvbGljeS5jLTExMzYtXG5tbS9tZW1wb2xpY3kuYzoxMTM3Olx0bmV3ID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcbm1tL21lbXBvbGljeS5jLTExMzgtXHRpZiAoSVNfRVJSKG5ldykpIHtcbi0tXG5tbS9tZW1wb2xpY3kuYy0xMTQzLVx0dGFza19sb2NrKGN1cnJlbnQpO1xubW0vbWVtcG9saWN5LmM6MTE0NDpcdHJldCA9IG1wb2xfc2V0X25vZGVtYXNrKG5ldywgbm9kZXMsIHNjcmF0Y2gpO1xubW0vbWVtcG9saWN5LmMtMTE0NS1cdGlmIChyZXQpIHtcbi0tXG5tbS9tZW1wb2xpY3kuYz0xNTQ2PXN0YXRpYyBsb25nIGRvX21iaW5kKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLFxuLS1cbm1tL21lbXBvbGljeS5jLTE1NzgtXG5tbS9tZW1wb2xpY3kuYzoxNTc5Olx0bmV3ID0gbXBvbF9uZXcobW9kZSwgbW9kZV9mbGFncywgbm1hc2spO1xubW0vbWVtcG9saWN5LmMtMTU4MC1cdGlmIChJU19FUlIobmV3KSlcbi0tXG5tbS9tZW1wb2xpY3kuYy0xNTk1LVx0XHRcdG1tYXBfd3JpdGVfbG9jayhtbSk7XG5tbS9tZW1wb2xpY3kuYzoxNTk2Olx0XHRcdGVyciA9IG1wb2xfc2V0X25vZGVtYXNrKG5ldywgbm1hc2ssIHNjcmF0Y2gpO1xubW0vbWVtcG9saWN5LmMtMTU5Ny1cdFx0XHRpZiAoZXJyKVxuLS1cbm1tL21lbXBvbGljeS5jPTMxOTk9c3RhdGljIGludCBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LFxuLS1cbm1tL21lbXBvbGljeS5jLTMyMDMtXHRzdHJ1Y3Qgc3Bfbm9kZSAqbl9uZXcgPSBOVUxMO1xubW0vbWVtcG9saWN5LmM6MzIwNDpcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfbmV3ID0gTlVMTDtcbm1tL21lbXBvbGljeS5jLTMyMDUtXHRpbnQgcmV0ID0gMDtcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjIzLVxubW0vbWVtcG9saWN5LmM6MzIyNDpcdFx0XHRcdCptcG9sX25ldyA9ICpuLVx1MDAzZXBvbGljeTtcbm1tL21lbXBvbGljeS5jOjMyMjU6XHRcdFx0XHRhdG9taWNfc2V0KFx1MDAyNm1wb2xfbmV3LVx1MDAzZXJlZmNudCwgMSk7XG5tbS9tZW1wb2xpY3kuYzozMjI2Olx0XHRcdFx0c3Bfbm9kZV9pbml0KG5fbmV3LCBlbmQsIG4tXHUwMDNlZW5kLCBtcG9sX25ldyk7XG5tbS9tZW1wb2xpY3kuYy0zMjI3LVx0XHRcdFx0bi1cdTAwM2VlbmQgPSBzdGFydDtcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjI5LVx0XHRcdFx0bl9uZXcgPSBOVUxMO1xubW0vbWVtcG9saWN5LmM6MzIzMDpcdFx0XHRcdG1wb2xfbmV3ID0gTlVMTDtcbm1tL21lbXBvbGljeS5jLTMyMzEtXHRcdFx0XHRicmVhaztcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjQ0LWVycl9vdXQ6XG5tbS9tZW1wb2xpY3kuYzozMjQ1Olx0aWYgKG1wb2xfbmV3KVxubW0vbWVtcG9saWN5LmM6MzI0NjpcdFx0bXBvbF9wdXQobXBvbF9uZXcpO1xubW0vbWVtcG9saWN5LmMtMzI0Ny1cdGlmIChuX25ldylcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjU3LVx0XHRnb3RvIGVycl9vdXQ7XG5tbS9tZW1wb2xpY3kuYzozMjU4Olx0bXBvbF9uZXcgPSBrbWVtX2NhY2hlX2FsbG9jKHBvbGljeV9jYWNoZSwgR0ZQX0tFUk5FTCk7XG5tbS9tZW1wb2xpY3kuYzozMjU5Olx0aWYgKCFtcG9sX25ldylcbm1tL21lbXBvbGljeS5jLTMyNjAtXHRcdGdvdG8gZXJyX291dDtcbm1tL21lbXBvbGljeS5jOjMyNjE6XHRhdG9taWNfc2V0KFx1MDAyNm1wb2xfbmV3LVx1MDAzZXJlZmNudCwgMSk7XG5tbS9tZW1wb2xpY3kuYy0zMjYyLVx0Z290byByZXN0YXJ0O1xuLS1cbm1tL21lbXBvbGljeS5jPTMyNzU9dm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpXG4tLVxubW0vbWVtcG9saWN5LmMtMzI5MC1cdFx0LyogY29udGV4dHVhbGl6ZSB0aGUgdG1wZnMgbW91bnQgcG9pbnQgbWVtcG9saWN5IHRvIHRoaXMgZmlsZSAqL1xubW0vbWVtcG9saWN5LmM6MzI5MTpcdFx0bnBvbCA9IG1wb2xfbmV3KG1wb2wtXHUwMDNlbW9kZSwgbXBvbC1cdTAwM2VmbGFncywgXHUwMDI2bXBvbC1cdTAwM2V3LnVzZXJfbm9kZW1hc2spO1xubW0vbWVtcG9saWN5LmMtMzI5Mi1cdFx0aWYgKElTX0VSUihucG9sKSlcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMjk1LVx0XHR0YXNrX2xvY2soY3VycmVudCk7XG5tbS9tZW1wb2xpY3kuYzozMjk2Olx0XHRyZXQgPSBtcG9sX3NldF9ub2RlbWFzayhucG9sLCBcdTAwMjZtcG9sLVx1MDAzZXcudXNlcl9ub2RlbWFzaywgc2NyYXRjaCk7XG5tbS9tZW1wb2xpY3kuYy0zMjk3LVx0XHR0YXNrX3VubG9jayhjdXJyZW50KTtcbi0tXG5tbS9tZW1wb2xpY3kuYz0zNTA4PWludCBtcG9sX3BhcnNlX3N0cihjaGFyICpzdHIsIHN0cnVjdCBtZW1wb2xpY3kgKiptcG9sKVxuLS1cbm1tL21lbXBvbGljeS5jLTM1NjAtXHRcdC8qXG5tbS9tZW1wb2xpY3kuYzozNTYxOlx0XHQgKiBEb24mIzM5O3QgYWxsb3cgYSBub2RlbGlzdDsgIG1wb2xfbmV3KCkgY2hlY2tzIGZsYWdzXG5tbS9tZW1wb2xpY3kuYy0zNTYyLVx0XHQgKi9cbi0tXG5tbS9tZW1wb2xpY3kuYy0zNTk1LVxubW0vbWVtcG9saWN5LmM6MzU5NjpcdG5ldyA9IG1wb2xfbmV3KG1vZGUsIG1vZGVfZmxhZ3MsIFx1MDAyNm5vZGVzKTtcbm1tL21lbXBvbGljeS5jLTM1OTctXHRpZiAoSVNfRVJSKG5ldykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1NjI2CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNTg5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgUG9saWN5IENyZWF0aW9uIGFuZCBCaW5kaW5nKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGJhY2sgaW50byBgbWVtcG9saWN5X2NyZWF0ZWAgd2l0aGluIGBtbS9tZW1wb2xpY3kuY2AuIEkgbmVlZCB0byBzb2xpZGlmeSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjb21tb24gcGF0dGVybnMgaW4gYGRvX3NldF9tZW1wb2xpY3lgIGFuZCBgbXBvbF9zaGFyZWRfcG9saWN5X2luaXRgLiBSaWdodCwgaXQgYWxsb2NhdGVzIGEgdGVtcG9yYXJ5IHNjcmF0Y2ggc3BhY2UsIGNhbGxzIGBtcG9sX25ld2Agd2l0aCB0aGUgbW9kZSwgZmxhZ3MsIGFuZCBub2RlcywgZ3JhYnMgdGhlIGB0YXNrX2xvY2tgIG9uIHRoZSBjdXJyZW50IHRhc2ssIHRoZW4gY2FsbHMgYG1wb2xfc2V0X25vZGVtYXNrYCB0byBhY3R1YWxseSBhcHBseSB0aGUgbm9kZSBtYXNrIHRvIHRoZSBwb2xpY3kgdXNpbmcgdGhhdCBzY3JhdGNoIHNwYWNlLCByZWxlYXNlcyB0aGUgbG9jaywgYW5kIHRoZW4gZnJlZXMgdGhlIHRlbXBvcmFyeSBzY3JhdGNoLiBUaGF0JiMzOTtzIHRoZSBiYXNpYyB3b3JrZmxvdy4KCk5vdywgbGV0JiMzOTtzIGV4YW1pbmUgYGt2bV9nbWVtX2JpbmRfbm9kZWAuIEhlcmUmIzM5O3MgdGhlIGNvZGU6CgpgYGBjCnN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKQp7CglzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7Cglub2RlbWFza190IG5vZGVzOwoJaW50IGVycjsKCglpZiAoKHVuc2lnbmVkIGludClub2RlICZndDs9IE1BWF9OVU1OT0RFUykKCQlyZXR1cm4gLUVJTlZBTDsKCglpbml0X25vZGVtYXNrX29mX25vZGUoJmFtcDtub2Rlcywgbm9kZSk7Cglwb2wgPSBtZW1wb2xpY3lfY3JlYXRlKE1QT0xfQklORCwgMCwgJmFtcDtub2Rlcyk7CglpZiAoSVNfRVJSKHBvbCkpCgkJcmV0dXJuIFBUUl9FUlIocG9sKTsKCgllcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKCZhbXA7R01FTV9JKGlub2RlKS0mZ3Q7cG9saWN5LCAwLAoJCQkJCSAgTUFYX0xGU19GSUxFU0laRSAmZ3Q7Jmd0OyBQQUdFX1NISUZULCBwb2wpOwoJbXBvbF9wdXQocG9sKTsKCXJldHVybiBlcnI7Cn0KYGBgCgpUaGUgZnVuY3Rpb24gY2FsbHMgYG1lbXBvbGljeV9jcmVhdGVgIHdpdGggYE1QT0xfQklORGAsIG5vIGZsYWdzLCBhbmQgYSBgbm9kZXNgIG1hc2suIFRoaXMgYG5vZGVzYCB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCBvbiB0aGUgc3RhY2sgdXNpbmcgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgmYW1wO25vZGVzLCBub2RlKWAuIE5lZWQgdG8gcXVpY2tseSB2ZXJpZnkgaG93IHRoYXQgaW5pdGlhbGl6YXRpb24gaGFwcGVucy4gQWgsIGl0JiMzOTtzIGp1c3QgYSBgbm9kZXNfY2xlYXJgIGZvbGxvd2VkIGJ5IGEgYG5vZGVfc2V0YC4gU28sIHRoZSBgbm9kZW1hc2tgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBiZWluZyBwYXNzZWQuIEdvb2QuCgpOZXh0LCBpdCBjYWxscyBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAuIExldCYjMzk7cyByZWZyZXNoIG91ciBtZW1vcnkgb24gdGhhdCBmdW5jdGlvbjoKCmBgYGMKaW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LAoJCQkJIHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpCnsKCXN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMOwoJaW50IGVycjsKCglpZiAocG9sKSB7CgkJbmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTsKCQlpZiAoIW5ldykKCQkJcmV0dXJuIC1FTk9NRU07Cgl9CgllcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7CglpZiAoZXJyICZhbXA7JmFtcDsgbmV3KQoJCXNwX2ZyZWUobmV3KTsKCXJldHVybiBlcnI7Cn0KYGBgCgpPa2F5LCBzbyBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgYWxsb2NhdGVzIGFuIGBzcF9ub2RlYCB2aWEgYHNwX2FsbG9jYCBpZiBhIHBvbGljeSBleGlzdHMuIFRoZW4gYHNwX2FsbG9jYCBpcyBjYWxsZWQgd2l0aCBzdGFydCwgZW5kLCBhbmQgdGhlIHBvbGljeS4gSXQgdXNlcyBga21lbV9jYWNoZV9hbGxvY2AgdG8gYWxsb2NhdGUgdGhlIGBzcF9ub2RlYCBhbmQgdGhlbiBpbml0aWFsaXplcyBpdCB2aWEgYHNwX25vZGVfaW5pdChuLCBzdGFydCwgZW5kLCBwb2wpYC4gSSBuZWVkIHRvIHF1aWNrbHkgZ2xhbmNlIGF0IGBzcF9hbGxvY2AgdG8gY29uZmlybSB3aGF0IHRoYXQgbG9va3MgbGlrZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3BfYWxsb2MmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYz0zMTY5PXN0YXRpYyB2b2lkIHNwX25vZGVfaW5pdChzdHJ1Y3Qgc3Bfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMTc2LVxubW0vbWVtcG9saWN5LmM6MzE3NzpzdGF0aWMgc3RydWN0IHNwX25vZGUgKnNwX2FsbG9jKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxubW0vbWVtcG9saWN5LmMtMzE3OC1cdFx0XHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbi0tXG5tbS9tZW1wb2xpY3kuYz0zMjc1PXZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxuLS1cbm1tL21lbXBvbGljeS5jLTMzMDEtXHRcdC8qIGFsbG9jIG5vZGUgY292ZXJpbmcgZW50aXJlIGZpbGU7IGFkZHMgcmVmIHRvIGZpbGUmIzM5O3MgbnBvbCAqL1xubW0vbWVtcG9saWN5LmM6MzMwMjpcdFx0c24gPSBzcF9hbGxvYygwLCBNQVhfTEZTX0ZJTEVTSVpFIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBucG9sKTtcbm1tL21lbXBvbGljeS5jLTMzMDMtXHRcdGlmIChzbilcbi0tXG5tbS9tZW1wb2xpY3kuYz0zMzMyPWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcbi0tXG5tbS9tZW1wb2xpY3kuYy0zMzM4LVx0aWYgKHBvbCkge1xubW0vbWVtcG9saWN5LmM6MzMzOTpcdFx0bmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTtcbm1tL21lbXBvbGljeS5jLTMzNDAtXHRcdGlmICghbmV3KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzMyMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSBpbW1lZGlhdGUgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgTm9kZSBJbml0aWFsaXphdGlvbiBhbmQgQWxsb2NhdGlvbiBGdW5jdGlvbnMqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IG91ciBzeXN0ZW0gaGFuZGxlcyBub2RlIGluaXRpYWxpemF0aW9uIGFuZCBhbGxvY2F0aW9uLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgYHNwX25vZGVfaW5pdGAgYW5kIGBzcF9hbGxvY2AuIEkgbmVlZCB0byBlbnN1cmUgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgaXMgc291bmQgYW5kIHRoYXQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIHN0aWxsIGVmZmljaWVudCBhbmQgZG9lc24mIzM5O3QgaGF2ZSBhbnkgaGlkZGVuIGdvdGNoYXMuIEkgd2FudCB0byBxdWlja2x5IHZlcmlmeSB0aGF0IHdlJiMzOTtyZSBzdGlsbCBoYW5kbGluZyBlZGdlIGNhc2VzIGNvcnJlY3RseSwgZXNwZWNpYWxseSBhcm91bmQgcmVzb3VyY2UgY29udGVudGlvbiBvciBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzLiBJdOKAmXMgYWxzbyBjcnVjaWFsIHRvIHNlZSBpZiB0aGVyZSBoYXZlIGJlZW4gYW55IHJlY2VudCBjaGFuZ2VzIGluIHRoZXNlIGFyZWFzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGNvZGUgaGFzIHRvIHNheS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1wb2xpY3kuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMxNjgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MzE2ODpcdFxuMzE2OTpcdHN0YXRpYyB2b2lkIHNwX25vZGVfaW5pdChzdHJ1Y3Qgc3Bfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbjMxNzA6XHRcdFx0XHR1bnNpZ25lZCBsb25nIGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuMzE3MTpcdHtcbjMxNzI6XHRcdG5vZGUtXHUwMDNlc3RhcnQgPSBzdGFydDtcbjMxNzM6XHRcdG5vZGUtXHUwMDNlZW5kID0gZW5kO1xuMzE3NDpcdFx0bm9kZS1cdTAwM2Vwb2xpY3kgPSBwb2w7XG4zMTc1Olx0fVxuMzE3NjpcdFxuMzE3NzpcdHN0YXRpYyBzdHJ1Y3Qgc3Bfbm9kZSAqc3BfYWxsb2ModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXG4zMTc4Olx0XHRcdFx0XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4zMTc5Olx0e1xuMzE4MDpcdFx0c3RydWN0IHNwX25vZGUgKm47XG4zMTgxOlx0XHRzdHJ1Y3QgbWVtcG9saWN5ICpuZXdwb2w7XG4zMTgyOlx0XG4zMTgzOlx0XHRuID0ga21lbV9jYWNoZV9hbGxvYyhzbl9jYWNoZSwgR0ZQX0tFUk5FTCk7XG4zMTg0Olx0XHRpZiAoIW4pXG4zMTg1Olx0XHRcdHJldHVybiBOVUxMO1xuMzE4NjpcdFxuMzE4NzpcdFx0bmV3cG9sID0gbXBvbF9kdXAocG9sKTtcbjMxODg6XHRcdGlmIChJU19FUlIobmV3cG9sKSkge1xuMzE4OTpcdFx0XHRrbWVtX2NhY2hlX2ZyZWUoc25fY2FjaGUsIG4pO1xuMzE5MDpcdFx0XHRyZXR1cm4gTlVMTDtcbjMxOTE6XHRcdH1cbjMxOTI6XHRcdG5ld3BvbC1cdTAwM2VmbGFncyB8PSBNUE9MX0ZfU0hBUkVEO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzg3MgoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI5MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYGt2bV9nbWVtX2NyZWF0ZWAgZm9yIFBvdGVudGlhbCBWdWxuZXJhYmlsaXRpZXMqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBrdm1fZ21lbV9jcmVhdGVgIGZ1bmN0aW9uIHdpdGhpbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AuIFRoZSBjb3JlIHNlZW1zIHRvIGJlIGhlcmU6CmBgYGMKaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKQp7Cglsb2ZmX3Qgc2l6ZSA9IGFyZ3MtJmd0O3NpemU7Cgl1NjQgZmxhZ3MgPSBhcmdzLSZndDtmbGFnczsKCWludCBub2RlID0gTlVNQV9OT19OT0RFOwoKCWlmIChmbGFncyAmYW1wOyB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKQoJCXJldHVybiAtRUlOVkFMOwoKCWlmIChzaXplICZsdDs9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAoZmxhZ3MgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHsKCQlpZiAoYXJncy0mZ3Q7cGFkIHx8IGFyZ3MtJmd0O25vZGUgJmd0Oz0gTUFYX05VTU5PREVTKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQlub2RlID0gYXJncy0mZ3Q7bm9kZTsKCX0gZWxzZSBpZiAoYXJncy0mZ3Q7bm9kZSB8fCBhcmdzLSZndDtwYWQpIHsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncywgbm9kZSk7Cn0KYGBgCgpOb3csIHRoZSBpbXBvcnRhbnQgcGFydDogSSYjMzk7bSBzY2FubmluZyB0aGlzIGNvZGUsIGxvb2tpbmcgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMsIGFuZCBhIHJlZCBmbGFnIGp1c3Qgd2VudCB1cC4gIEkgc2VlIGNoZWNrcyBmb3IgYHNpemVgLCBgZmxhZ3NgLCBhbmQgYG5vZGVgLCBidXQuLi4gaG9sZCBvbi4gV2hlcmUmIzM5O3MgdGhlIHZhbGlkYXRpb24gZm9yIGBhcmdzLSZndDtyZXNlcnZlZGA/IElzIHRoaXMgYSBuZXcgc3RydWN0dXJlIG9yIGZ1bmN0aW9uPyBMZXQmIzM5O3MgYXNzdW1lIHRoYXQgdGhlcmUmIzM5O3MgYSByZWFzb24gZm9yIHRoaXMgb21pc3Npb24sIGJ1dCBpdCYjMzk7cyBpbXBvcnRhbnQgdG8gbG9vayEgSSBuZWVkIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYGFyZ3MtJmd0O3Jlc2VydmVkYCBtaWdodCBoYXZlIGJlZW4gdXNlZCBpbiBhbnkgb3RoZXIgcGxhY2UuIEl0JiMzOTtzIHJlYWxseSBlYXN5IHRvIG1ha2UgYW4gZXJyb3Igb24gdGhlc2UgbmV3IEFQSSYjMzk7cyBhbmQgbm90IGhhbmRsZSBhbGwgcG90ZW50aWFsIGJhZCB2YWx1ZXMuCgpNeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUgd2lkZXIgY29udGV4dC4gSSBuZWVkIHRvIGdyZXAgdGhlIHJlc3Qgb2YgYGd1ZXN0X21lbWZkLmNgIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgZmlsZXMgb3IgaGVhZGVyIGZpbGVzIHRvIHNlZSBpZiBhbmQgd2hlcmUgdGhlIGBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgYW5kIGhvdyBpdCYjMzk7cyB1c2VkLiBNYXliZSB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSBoYWQgcGFkZGluZywgYW5kIHRoaXMgZmllbGQgaXMgbWVhbnQgZm9yIGFsaWdubWVudCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBleHBlY3RlZCB0byBiZSBpZ25vcmVkLiBJIHdhbnQgdG8gc2VlIGhvdyBgYXJnc2Agd2FzIGhhbmRsZWQgYmVmb3JlIHRoaXMgcGFydGljdWxhciBwYXRjaCBvciBjb21taXQsIGFuZCBpZiBhbnkgcHJldmlvdXMgdmVyc2lvbnMgaW5jbHVkZWQgYSBjaGVjayBmb3IgdGhlIGByZXNlcnZlZGAgZmllbGQuIFRoYXQgd291bGQgY29uZmlybSB3aGV0aGVyIHRoaXMgaXMgYSBuZXdseSBpbnRyb2R1Y2VkIG92ZXJzaWdodCwgb3Igd2hldGhlciBpdCB3YXMgYWx3YXlzIGludGVuZGVkIHRvIGJlIGlnbm9yZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTkwOlx0XHRcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XG4gNTkxOlx0XHRcdGlmIChlcnIpXG4gNTkyOlx0XHRcdFx0Z290byBlcnJfaW5vZGU7XG4gNTkzOlx0XHR9XG4gNTk0Olx0XG4gNTk1Olx0XHRmaWxlID0gYWxsb2NfZmlsZV9wc2V1ZG8oaW5vZGUsIGt2bV9nbWVtX21udCwgbmFtZSwgT19SRFdSLCBcdTAwMjZrdm1fZ21lbV9mb3BzKTtcbiA1OTY6XHRcdGlmIChJU19FUlIoZmlsZSkpIHtcbiA1OTc6XHRcdFx0ZXJyID0gUFRSX0VSUihmaWxlKTtcbiA1OTg6XHRcdFx0Z290byBlcnJfaW5vZGU7XG4gNTk5Olx0XHR9XG4gNjAwOlx0XG4gNjAxOlx0XHRmaWxlLVx1MDAzZWZfZmxhZ3MgfD0gT19MQVJHRUZJTEU7XG4gNjAyOlx0XHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IGY7XG4gNjAzOlx0XG4gNjA0Olx0XHRrdm1fZ2V0X2t2bShrdm0pO1xuIDYwNTpcdFx0Zi1cdTAwM2Vrdm0gPSBrdm07XG4gNjA2Olx0XHR4YV9pbml0KFx1MDAyNmYtXHUwMDNlYmluZGluZ3MpO1xuIDYwNzpcdFx0bGlzdF9hZGQoXHUwMDI2Zi1cdTAwM2VlbnRyeSwgXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2VnbWVtX2ZpbGVfbGlzdCk7XG4gNjA4Olx0XG4gNjA5Olx0XHRmZF9pbnN0YWxsKGZkLCBmaWxlKTtcbiA2MTA6XHRcdHJldHVybiBmZDtcbiA2MTE6XHRcbiA2MTI6XHRlcnJfaW5vZGU6XG4gNjEzOlx0XHRpcHV0KGlub2RlKTtcbiA2MTQ6XHRlcnJfZm9wczpcbiA2MTU6XHRcdGZvcHNfcHV0KFx1MDAyNmt2bV9nbWVtX2ZvcHMpO1xuIDYxNjpcdGVycl9nbWVtOlxuIDYxNzpcdFx0a2ZyZWUoZik7XG4gNjE4Olx0ZXJyX2ZkOlxuIDYxOTpcdFx0cHV0X3VudXNlZF9mZChmZCk7XG4gNjIwOlx0XHRyZXR1cm4gZXJyO1xuIDYyMTpcdH1cbiA2MjI6XHRcbiA2MjM6XHRpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4gNjI0Olx0e1xuIDYyNTpcdFx0bG9mZl90IHNpemUgPSBhcmdzLVx1MDAzZXNpemU7XG4gNjI2Olx0XHR1NjQgZmxhZ3MgPSBhcmdzLVx1MDAzZWZsYWdzO1xuIDYyNzpcdFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4gNjI4Olx0XG4gNjI5Olx0XHRpZiAoZmxhZ3MgXHUwMDI2IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpXG4gNjMwOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYzMTpcdFxuIDYzMjpcdFx0aWYgKHNpemUgXHUwMDNjPSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpXG4gNjMzOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYzNDpcdFxuIDYzNTpcdFx0aWYgKGZsYWdzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xuIDYzNjpcdFx0XHRpZiAoYXJncy1cdTAwM2VwYWQgfHwgYXJncy1cdTAwM2Vub2RlIFx1MDAzZT0gTUFYX05VTU5PREVTKVxuIDYzNzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDYzODpcdFx0XHRub2RlID0gYXJncy1cdTAwM2Vub2RlO1xuIDYzOTpcdFx0fSBlbHNlIGlmIChhcmdzLVx1MDAzZW5vZGUgfHwgYXJncy1cdTAwM2VwYWQpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTk0OTcKCQkJCQkJCW91dHB1dDogMzM1CgkJCQkJCQl0aG91Z2h0czogODUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFuYWx5c2lzIG9mIEd1ZXN0IE1lbWZkIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCB0aGUgYGFyZ3NgIHBhc3NlZCBpbnRvIGBrdm1fZ21lbV9jcmVhdGVgIGFmdGVyIGBjb3B5X2Zyb21fdXNlcmAgaW4gYGt2bV92bV9pb2N0bGAgaXMgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhlbiB0aGUgY3JpdGljYWwgdGhpbmcgaXMgdGhhdCBub3RoaW5nIGlzIGNvcGllZCAqYmFjayogdG8gdXNlcnNwYWNlLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGxlYWtlZC4gR29vZC4gSSYjMzk7bSBhbHNvIGNvbmZpcm1pbmcgdGhhdCBubyBrZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXJzcGFjZSBhcmUgbW9kaWZpZWQuCgpOb3csIGxldCYjMzk7cyBtZXRpY3Vsb3VzbHkgY2hlY2sgZm9yIGJyYW5jaGVzIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgd2hpY2ggaXMgd2hlcmUgS01TQU4gdXN1YWxseSBiaXRlcy4gSSBzZWUgYG5vZGVzYCBpbiBga3ZtX2dtZW1fYmluZF9ub2RlYCBnZXRzIGluaXRpYWxpemVkIHdpdGggYGluaXRfbm9kZW1hc2tfb2Zfbm9kZWAuIGBzY3JhdGNoYCBpbiBgbWVtcG9saWN5X2NyZWF0ZWAgaXMgY292ZXJlZCBieSBgTk9ERU1BU0tfU0NSQVRDSGAuIGBuZXdgIGluIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBpcyBpbml0aWFsaXplZCB0byBOVUxMIG9yIGBzcF9hbGxvY2AuIFRoZSBgZ3Vlc3RfbWVtZmRgIGFyZ3VtZW50LCByZWFkIGZyb20gdXNlcnNwYWNlIHZpYSBgY29weV9mcm9tX3VzZXJgLCBpcyBvZiBwYXJ0aWN1bGFyIG5vdGUsIGJ1dCBzZWVtcyBzYWZlLiBBbmQsIGZpbmFsbHksIGBub2RlYCBpbiBga3ZtX2dtZW1fY3JlYXRlYCBpcyBpbml0aWFsaXplZCwgdG9vLiBBbGwgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4gTm8gbmV3IGRhdGEgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2Ug4oCTIG5vIGluZm9ybWF0aW9uIGxlYWtzLiBUaGF0JiMzOTtzIGEgaHVnZSB3aW4uCgpMZXQmIzM5O3MgcnVuIHRocm91Z2ggdGhlIEtNU0FOIGNyaXRlcmlhIG1ldGhvZGljYWxseSwgdG8gbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGFueXRoaW5nLgoKMS4gICoqS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2Vyc3BhY2UqKjogTm8gYGNvcHlfdG9fdXNlcmAgaGVyZSwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCBzaW1wbHkgcmV0dXJucyBhbiBGRC4gVGhpcyBpcyBjbGVhbi4KMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMqKjogTm9wZSwgYWxsIHN0YWNrIHZhcmlhYmxlcyBsaWtlIGBub2Rlc2AsIGBzY3JhdGNoYCwgYG5vZGVgIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4KMy4gICoqQWxsb2NhdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyoqOiBgbWVtcG9saWN5X2NyZWF0ZWAgYnVpbGRzIGEgdmFsaWRhdGVkIGBzdHJ1Y3QgbWVtcG9saWN5YCB1c2luZyBzdGFuZGFyZCBgbXBvbF9uZXdgIC8gYG1wb2xfc2V0X25vZGVtYXNrYC4gYHNwX2FsbG9jYCBjb3ZlcnMgYHNwX25vZGVgIGluaXRpYWxpemF0aW9uLiBGaW5lLgo0LiAgKipCb3VuZHMgY2hlY2tzIGV4cG9zaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMqKjogTm90IHJlbGV2YW50IGhlcmUuCgpUaGVyZWZvcmUsIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGFyZSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgdGhhdCBkbyBhcmlzZSAodXNlLWFmdGVyLWZyZWUsIHJlZmNvdW50IHByb2JsZW1zIGluIG1lbXBvbGljeSBvciBnbWVtKSB3b3VsZCBiZSBoYW5kbGVkIGJ5IEtBU0FOIOKAkyBhbmQgS0FTQU4gaXMgYWxyZWFkeSBlbmFibGVkLiBUaHVzLCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgLgoKU28sIHRoZSBLTVNBTiByZWFzb25pbmcgaXM6IEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYW5kIGluZm8gbGVha3MuIFRoaXMgcGF0Y2ggYWRkcyBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGFuZCByZWxhdGVkIGhlbHBlcnMgaW4gYG1tL21lbXBvbGljeS5jYC4gVGhlIGlvY3RsIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBjb3BpZXMgYXJndW1lbnRzIGZyb20gdXNlcnNwYWNlIGJ1dCBkb2VzbiYjMzk7dCBjb3B5IGtlcm5lbCBkYXRhIGJhY2suIEFsbCB2YXJpYWJsZXMgYW5kIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkLiBBbnkgbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWVzIGFyZSBLQVNBTiYjMzk7cyBkb21haW4uIE5vIEtNU0FOIG5lZWRlZC4KCk9rYXksIHRpbWUgdG8gaW52b2tlIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjA5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZyBpbiBLVk0mIzM5O3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cblxuS01TQU4gdnMgS0FTQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cbi0gSW4gdGhpcyBwYXRjaCwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCByZWFkcyB1c2VyIGFyZ3VtZW50cyB2aWEgYGNvcHlfZnJvbV91c2VyYCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBpbnRlZ2VyOyBubyBrZXJuZWwgc3RydWN0dXJlcywgcGFkZGluZywgb3IgYnVmZmVycyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZS5cbi0gQWxsIG5ld2x5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgc3RhY2sgYW5kIGhlYXAgdmFyaWFibGVzIChlLmcuLCBgbm9kZW1hc2tfdCBub2Rlc2AgaW5pdGlhbGl6ZWQgdmlhIGBpbml0X25vZGVtYXNrX29mX25vZGUoKWAsIGBzY3JhdGNoYCBpbml0aWFsaXplZCB2aWEgYE5PREVNQVNLX1NDUkFUQ0goKWAsIGFuZCBgc3RydWN0IHNwX25vZGVgL2BzdHJ1Y3QgbWVtcG9saWN5YCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRocm91Z2ggc3RhbmRhcmQgbW0gaGVscGVycykgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cbi0gQW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgTlVNQSBwb2xpY3kgcmVmZXJlbmNlIGNvdW50aW5nLCBsaWZlY3ljbGUgaXNzdWVzLCBvciBhbGxvY2F0aW9uIGZhaWx1cmVzKSBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZyBpbiBLVk0mIzM5O3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cblxuS01TQU4gdnMgS0FTQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cbi0gSW4gdGhpcyBwYXRjaCwgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bCByZWFkcyB1c2VyIGFyZ3VtZW50cyB2aWEgYGNvcHlfZnJvbV91c2VyYCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBpbnRlZ2VyOyBubyBrZXJuZWwgc3RydWN0dXJlcywgcGFkZGluZywgb3IgYnVmZmVycyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZS5cbi0gQWxsIG5ld2x5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgc3RhY2sgYW5kIGhlYXAgdmFyaWFibGVzIChlLmcuLCBgbm9kZW1hc2tfdCBub2Rlc2AgaW5pdGlhbGl6ZWQgdmlhIGBpbml0X25vZGVtYXNrX29mX25vZGUoKWAsIGBzY3JhdGNoYCBpbml0aWFsaXplZCB2aWEgYE5PREVNQVNLX1NDUkFUQ0goKWAsIGFuZCBgc3RydWN0IHNwX25vZGVgL2BzdHJ1Y3QgbWVtcG9saWN5YCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRocm91Z2ggc3RhbmRhcmQgbW0gaGVscGVycykgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cbi0gQW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgTlVNQSBwb2xpY3kgcmVmZXJlbmNlIGNvdW50aW5nLCBsaWZlY3ljbGUgaXNzdWVzLCBvciBhbGxvY2F0aW9uIGZhaWx1cmVzKSBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDc6MTYuMjI4MDQyODc3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA1NzU1NDQ4MTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtZW1wb2xpY3lfY3JlYXRlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaW4gS1ZNJ3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cXG5cXG5LTVNBTiB2cyBLQVNBTiBhcHBsaWNhYmlsaXR5Olxcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cXG4tIEluIHRoaXMgcGF0Y2gsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcmVhZHMgdXNlciBhcmd1bWVudHMgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgaW50ZWdlcjsgbm8ga2VybmVsIHN0cnVjdHVyZXMsIHBhZGRpbmcsIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UuXFxuLSBBbGwgbmV3bHkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBzdGFjayBhbmQgaGVhcCB2YXJpYWJsZXMgKGUuZy4sIGBub2RlbWFza190IG5vZGVzYCBpbml0aWFsaXplZCB2aWEgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgpYCwgYHNjcmF0Y2hgIGluaXRpYWxpemVkIHZpYSBgTk9ERU1BU0tfU0NSQVRDSCgpYCwgYW5kIGBzdHJ1Y3Qgc3Bfbm9kZWAvYHN0cnVjdCBtZW1wb2xpY3lgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBzdGFuZGFyZCBtbSBoZWxwZXJzKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cXG4tIEFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIE5VTUEgcG9saWN5IHJlZmVyZW5jZSBjb3VudGluZywgbGlmZWN5Y2xlIGlzc3Vlcywgb3IgYWxsb2NhdGlvbiBmYWlsdXJlcykgZmFsbCB1bmRlciB0aGUgc2NvcGUgb2YgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIE5VTUEgbm9kZSBiaW5kaW5nIHN1cHBvcnQgZm9yIEtWTSBndWVzdF9tZW1mZCB2aWEgdGhlIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIGZsYWcgaW4gS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgYW5kIGFkZHMgdGhlIG1lbXBvbGljeSBoZWxwZXJzIG1lbXBvbGljeV9jcmVhdGUoKSBhbmQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSgpLiBUaGVzZSBjaGFuZ2VzIG1vZGlmeSByZWFjaGFibGUga2VybmVsIGxvZ2ljIGluIG1tL21lbXBvbGljeS5jIGFuZCB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjE2LjIyODA0NzY1N1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUwOTU5MzcxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYWU2ODk1NWE1OTIzZDI1ZTllMGFmOTU2OTQzMDU3OWU5NGM0MGY5ZlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVGh1IFNlcCAzIDE5OjA3OjE1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaFxcbmluZGV4IDAzYmZjOTI4NjRiNmUuLjczOGUyNzY2MzNjMWUgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXFxuQEAgLTczOSw2ICs3MzksOSBAQCBzdGF0aWMgaW5saW5lIHU2NCBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSlcXG4gXFx0aWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKVxcbiBcXHRcXHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEO1xcbiBcXG4rXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX05VTUEpKVxcbitcXHRcXHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcXG4rXFxuIFxcdHJldHVybiBmbGFncztcXG4gfVxcbiAjZW5kaWZcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcXG5pbmRleCA2NWM3MzJkNDQwZDJmLi4zOTgzMTgxNzVjZWM3IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXFxuQEAgLTEyNCwxMCArMTI0LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpO1xcbiB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XFxuIGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcXG4gXFx0XFx0XFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXFxuK1xcdFxcdFxcdFxcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XFxuIHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKTtcXG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICBwZ29mZl90IGlkeCk7XFxuIFxcbitzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICBub2RlbWFza190ICpub2Rlcyk7XFxuK1xcbiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTtcXG4gc3RydWN0IG1lbXBvbGljeSAqX19nZXRfdm1hX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBwZ29mZl90ICppbHgpO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmggYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcXG5pbmRleCBhYzJkNzdkMTQ5NjM1Li44ZDNhZTdlMmVhZDhlIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxcbkBAIC0xNjU4LDExICsxNjU4LDE0IEBAIHN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xcbiAjZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFxcdFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDApXFxuICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDEpXFxuKyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAyKVxcbiBcXG4gc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQge1xcbiBcXHRfX3U2NCBzaXplO1xcbiBcXHRfX3U2NCBmbGFncztcXG4tXFx0X191NjQgcmVzZXJ2ZWRbNl07XFxuK1xcdF9fdTMyIG5vZGU7XFxuK1xcdF9fdTMyIHBhZDtcXG4rXFx0X191NjQgcmVzZXJ2ZWRbNV07XFxuIH07XFxuIFxcbiAjZGVmaW5lIEtWTV9QUkVfRkFVTFRfTUVNT1JZXFx0X0lPV1IoS1ZNSU8sIDB4ZDUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSlcXG5kaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuY1xcbmluZGV4IDJhZDBhNWYxODI4MGEuLmNlMTBjZTQzNzQ2NDMgMTAwNjQ0XFxuLS0tIGEvbW0vbWVtcG9saWN5LmNcXG4rKysgYi9tbS9tZW1wb2xpY3kuY1xcbkBAIC0xMDg1LDcgKzEwODUsNDUgQEAgc3RhdGljIGludCBtYmluZF9yYW5nZShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRyZXR1cm4gdm1hX3JlcGxhY2VfcG9saWN5KHZtYSwgbmV3X3BvbCk7XFxuIH1cXG4gXFxuLS8qIFNldCB0aGUgcHJvY2VzcyBtZW1vcnkgcG9saWN5ICovXFxuKy8qKlxcbisgKiBtZW1wb2xpY3lfY3JlYXRlIC0gYnVpbGQgYSB2YWxpZGF0ZWQsIGNwdXNldC1jb250ZXh0dWFsaXNlZCBtZW1wb2xpY3lcXG4rICogQG1vZGU6IE1QT0xfKiBtb2RlXFxuKyAqIEBmbGFnczogTVBPTF9GXyogZmxhZ3NcXG4rICogQG5vZGVzOiB0YXJnZXQgbm9kZW1hc2ssIG9yIE5VTEwgKGludGVycHJldGVkIHBlciBAbW9kZTsgc2VlIG1wb2xfbmV3KCkpXFxuKyAqXFxuKyAqIENyZWF0ZXMgYSBuZXcgcG9saWN5IGFuZCBjb25zdHJhaW5zIGl0IHRvIHRoZSB0YXNrJ3MgY3B1c2V0LlxcbisgKlxcbisgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLlxcbisgKlxcbisgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXFxuKyAqL1xcbitzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxcbitcXHRcXHRub2RlbWFza190ICpub2RlcylcXG4re1xcbitcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XFxuK1xcdE5PREVNQVNLX1NDUkFUQ0goc2NyYXRjaCk7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoIXNjcmF0Y2gpXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbitcXG4rXFx0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcXG4rXFx0aWYgKElTX0VSUihwb2wpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHRhc2tfbG9jayhjdXJyZW50KTtcXG4rXFx0ZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBub2Rlcywgc2NyYXRjaCk7XFxuK1xcdHRhc2tfdW5sb2NrKGN1cnJlbnQpO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdG1wb2xfcHV0KHBvbCk7XFxuK1xcdFxcdHBvbCA9IEVSUl9QVFIoZXJyKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdE5PREVNQVNLX1NDUkFUQ0hfRlJFRShzY3JhdGNoKTtcXG4rXFx0cmV0dXJuIHBvbDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsIFxcXCJrdm1cXFwiKTtcXG4rXFxuIHN0YXRpYyBsb25nIGRvX3NldF9tZW1wb2xpY3kodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxuIFxcdFxcdFxcdCAgICAgbm9kZW1hc2tfdCAqbm9kZXMpXFxuIHtcXG5AQCAtMzI3NCwyNCArMzMxMiw0NyBAQCB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbClcXG4gfVxcbiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2hhcmVkX3BvbGljeV9pbml0LCBcXFwia3ZtXFxcIik7XFxuIFxcbi1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuLVxcdFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuKy8qKlxcbisgKiBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlIC0gaW5zdGFsbCBAcG9sIG92ZXIgW0BzdGFydCwgQGVuZCkgb2YgQHNwXFxuKyAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZVxcbisgKiBAc3RhcnQ6IGZpcnN0IHBhZ2Ugb2Zmc2V0IChpbmNsdXNpdmUpXFxuKyAqIEBlbmQ6ICAgbGFzdCBwYWdlIG9mZnNldCAoZXhjbHVzaXZlKVxcbisgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlXFxuKyAqXFxuKyAqIEluc3RhbGxzIEBwb2wgb3ZlciB0aGUgZ2l2ZW4gcmFuZ2UsIHJlcGxhY2luZyBhbnkgb3ZlcmxhcHBpbmcgcG9saWN5LlxcbisgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuXFxuKyAqXFxuKyAqIFRoZSBwb2xpY3kgaXMgbm90IHJlY29uc3RydWN0ZWQsIHNvIHRoZSBwb2xpY3kgaXMgcHJlc2VydmVkIGV4YWN0bHkuXFxuKyAqXFxuKyAqIFVubGlrZSBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCksIG5vIFZNQSBpcyByZXF1aXJlZCwgc28gYSByYW5nZSB0aGF0XFxuKyAqIGlzIG5ldmVyIG1hcHBlZCBpbnRvIGEgVk1BIGNhbiBiZSBjb3ZlcmVkLCBpbmNsdWRpbmcgdGhlIHdob2xlIGZpbGUuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS5cXG4rICovXFxuK2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcXG4rXFx0XFx0XFx0XFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuIHtcXG4tXFx0Y29uc3QgcGdvZmZfdCBwZ29mZiA9IHZtYV9zdGFydF9wZ29mZih2bWEpO1xcbi1cXHRjb25zdCBwZ29mZl90IHBnb2ZmX2VuZCA9IHZtYV9lbmRfcGdvZmYodm1hKTtcXG4gXFx0c3RydWN0IHNwX25vZGUgKm5ldyA9IE5VTEw7XFxuIFxcdGludCBlcnI7XFxuIFxcbiBcXHRpZiAocG9sKSB7XFxuLVxcdFxcdG5ldyA9IHNwX2FsbG9jKHBnb2ZmLCBwZ29mZl9lbmQsIHBvbCk7XFxuK1xcdFxcdG5ldyA9IHNwX2FsbG9jKHN0YXJ0LCBlbmQsIHBvbCk7XFxuIFxcdFxcdGlmICghbmV3KVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gXFx0fVxcbi1cXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHBnb2ZmLCBwZ29mZl9lbmQsIG5ldyk7XFxuK1xcdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgc3RhcnQsIGVuZCwgbmV3KTtcXG4gXFx0aWYgKGVyciBcXHUwMDI2XFx1MDAyNiBuZXcpXFxuIFxcdFxcdHNwX2ZyZWUobmV3KTtcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbitFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UsIFxcXCJrdm1cXFwiKTtcXG4rXFxuK2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcXG4rXFx0XFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcXG4re1xcbitcXHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVxcdTAwM2V2bV9wZ29mZixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdm1hLVxcdTAwM2V2bV9wZ29mZiArIHZtYV9wYWdlcyh2bWEpLCBwb2wpO1xcbit9XFxuIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgXFxcImt2bVxcXCIpO1xcbiBcXG4gLyogRnJlZSBhIGJhY2tpbmcgcG9saWN5IHN0b3JlIG9uIGlub2RlIGRlbGV0ZS4gKi9cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcXG5pbmRleCAyMjMzZDg3MWEzOGY0Li5iMzMzY2I0MmZhYjI5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jXFxuQEAgLTI1LDYgKzI1LDMxIEBAXFxuIFxcbiBzdGF0aWMgc2l6ZV90IHBhZ2Vfc2l6ZTtcXG4gXFxuK3N0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1MzIgbm9kZSwgdTMyIHBhZClcXG4re1xcbitcXHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZCA9IHtcXG4rXFx0XFx0LnNpemUgPSBzaXplLFxcbitcXHRcXHQuZmxhZ3MgPSBmbGFncyxcXG4rXFx0XFx0Lm5vZGUgPSBub2RlLFxcbitcXHRcXHQucGFkID0gcGFkLFxcbitcXHR9O1xcbitcXG4rXFx0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFxcdTAwMjZndWVzdF9tZW1mZCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSlcXG4re1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRpZiAoIShmbGFncyBcXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSlcXG4rXFx0XFx0cmV0dXJuIHZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgc2l6ZSwgZmxhZ3MpO1xcbitcXG4rXFx0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7XFxuK1xcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xcbitcXHRyZXR1cm4gZmQ7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHRlc3RfZmlsZV9yZWFkX3dyaXRlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpXFxuIHtcXG4gXFx0Y2hhciBidWZbNjRdO1xcbkBAIC0xNzEsNiArMTk2LDgzIEBAIHN0YXRpYyB2b2lkIHRlc3RfbnVtYV9hbGxvY2F0aW9uKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpXFxuIFxcdGt2bV9tdW5tYXAobWVtLCB0b3RhbF9zaXplKTtcXG4gfVxcbiBcXG4rc3RhdGljIGJvb2wgaGFzX2JpbmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSlcXG4re1xcbitcXHRyZXR1cm4gdm1fY2hlY2tfY2FwKHZtLCBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTKSBcXHUwMDI2XFxuK1xcdCAgICAgICBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGVfaW52YWxpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxcbit7XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdGlmICghaGFzX2JpbmRfbm9kZSh2bSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHQgICAgICAgZmxhZ3MgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSwgMCwgMSk7XFxuK1xcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXFxuK1xcdFxcdCAgICBcXFwiZ3Vlc3RfbWVtZmQoKSB3aXRoIG5vbi16ZXJvIHBhZCBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFxcXCIpO1xcbitcXG4rXFx0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFxcbitcXHRcXHRcXHRcXHQgICAgICAgMSBcXHUwMDNjXFx1MDAzYyAyMCwgMCk7XFxuK1xcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXFxuK1xcdFxcdCAgICBcXFwiZ3Vlc3RfbWVtZmQoKSB3aXRoIG91dC1vZi1yYW5nZSBub2RlIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXFxcIik7XFxuK1xcbitcXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSwgZmxhZ3MsIDEsIDApO1xcbitcXHRURVNUX0FTU0VSVChmZCBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJybm8gPT0gRUlOVkFMLFxcbitcXHRcXHQgICAgXFxcImd1ZXN0X21lbWZkKCkgd2l0aCBhIG5vZGUgYnV0IG5vIEJJTkRfTk9ERSBmbGFnIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXFxcIik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUsIGludCBub2RlKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgb3RoZXJfbWFzayA9IDFVTCBcXHUwMDNjXFx1MDAzYyAobm9kZSA/IDAgOiAxKTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBtYXhub2RlID0gQklUU19QRVJfVFlQRShvdGhlcl9tYXNrKTtcXG4rXFx0Ym9vbCBzdGVlcl9hd2F5ID0gaXNfbXVsdGlfbnVtYV9ub2RlX3N5c3RlbSgpO1xcbitcXHR2b2lkICpwYWdlc1s0XTtcXG4rXFx0aW50IHN0YXR1c1s0XTtcXG4rXFx0Y2hhciAqbWVtO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdG1lbSA9IGt2bV9tbWFwKHRvdGFsX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIDQ7IGkrKylcXG4rXFx0XFx0cGFnZXNbaV0gPSBtZW0gKyBwYWdlX3NpemUgKiBpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogQmluZCBvbiBhIGRpZmZlcmVudCBub2RlIGlmIHBvc3NpYmxlIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgZmF1bHRpbmdcXG4rXFx0ICogaGFwcGVucyBhcyBkZXNpcmVkLiBXaXRob3V0IGEgc2Vjb25kIG5vZGUgdXNlIHRoZSBsb2NhbCBub2RlIGFuZFxcbitcXHQgKiBqdXN0IGdldCBjb3ZlcmFnZSBvZiBjcmVhdGUvbW1hcC9mYXVsdCBwYXRocy5cXG4rXFx0ICovXFxuK1xcdGlmIChzdGVlcl9hd2F5KVxcbitcXHRcXHRrdm1fc2V0X21lbXBvbGljeShNUE9MX0JJTkQsIFxcdTAwMjZvdGhlcl9tYXNrLCBtYXhub2RlKTtcXG4rXFxuK1xcdC8qIERlbGliZXJhdGVseSBubyBtYmluZCgpIG9uIHRoaXMgbWFwcGluZy4gKi9cXG4rXFx0bWVtc2V0KG1lbSwgMHhhYSwgdG90YWxfc2l6ZSk7XFxuK1xcbitcXHRrdm1fbW92ZV9wYWdlcygwLCA0LCBwYWdlcywgTlVMTCwgc3RhdHVzLCAwKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIDQ7IGkrKylcXG4rXFx0XFx0VEVTVF9BU1NFUlQoc3RhdHVzW2ldID09IG5vZGUsXFxuK1xcdFxcdFxcdCAgICBcXFwiRXhwZWN0ZWQgcGFnZSAlZCBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZFxcXCIsXFxuK1xcdFxcdFxcdCAgICBpLCBub2RlLCBzdGF0dXNbaV0pO1xcbitcXG4rXFx0LyogRHJvcHBlZCBtZW1vcnkgc2hvdWxkIGZhdWx0IGJhY2sgb250byB0aGUgc2FtZSBub2RlICovXFxuK1xcdGt2bV9mYWxsb2NhdGUoZmQsIEZBTExPQ19GTF9QVU5DSF9IT0xFIHwgRkFMTE9DX0ZMX0tFRVBfU0laRSwgMCxcXG4rXFx0XFx0ICAgICAgdG90YWxfc2l6ZSk7XFxuK1xcdG1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpO1xcbitcXG4rXFx0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyA0OyBpKyspXFxuK1xcdFxcdFRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLFxcbitcXHRcXHRcXHQgICAgXFxcIkV4cGVjdGVkIHBhZ2UgJWQgYmFjayBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZFxcXCIsXFxuK1xcdFxcdFxcdCAgICBpLCBub2RlLCBzdGF0dXNbaV0pO1xcbitcXG4rXFx0aWYgKHN0ZWVyX2F3YXkpXFxuK1xcdFxcdGt2bV9zZXRfbWVtcG9saWN5KE1QT0xfREVGQVVMVCwgTlVMTCwgMCk7XFxuK1xcbitcXHRrdm1fbXVubWFwKG1lbSwgdG90YWxfc2l6ZSk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHRlc3RfY29sbGFwc2UoaW50IGZkLCB1NjQgZmxhZ3MpXFxuIHtcXG4gXFx0Y29uc3Qgc2l6ZV90IHBtZF9zaXplID0gZ2V0X3RyYW5zX2h1Z2VwYWdlc3ooKTtcXG5AQCAtNDA0LDYgKzUwNiwxMCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKVxcbiBcXHRpbnQgZmQ7XFxuIFxcbiBcXHRmb3IgKGZsYWcgPSBCSVQoMCk7IGZsYWc7IGZsYWcgXFx1MDAzY1xcdTAwM2M9IDEpIHtcXG4rXFx0XFx0LyogQklORF9OT0RFIGRlcGVuZHMgb24gYSB2YWxpZCBub2RlIGZpZWxkLCB0ZXN0IHNlcGFyYXRlbHkgKi9cXG4rXFx0XFx0aWYgKGZsYWcgPT0gR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4gXFx0XFx0ZmQgPSBfX3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgcGFnZV9zaXplLCBmbGFnKTtcXG4gXFx0XFx0aWYgKGZsYWcgXFx1MDAyNiB2YWxpZF9mbGFncykge1xcbiBcXHRcXHRcXHRURVNUX0FTU0VSVChmZCBcXHUwMDNlPSAwLFxcbkBAIC00MTgsMzAgKzUyNCw0MCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKVxcbiBcXHR9XFxuIH1cXG4gXFxuLSNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBhcmdzLi4uKVxcdFxcXFxcXG4tZG8ge1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tXFx0aW50IGZkID0gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzKTtcXHRcXFxcXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tXFx0dGVzdF8jI19fdGVzdChhcmdzKTtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuLVxcdGNsb3NlKGZkKTtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuKyNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUsIGFyZ3MuLi4pIFxcXFxcXG4rZG8ge1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIFxcXFxcXG4rXFx0aW50IGZkID0gY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzLCBfX25vZGUpOyAgIFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgXFxcXFxcbitcXHR0ZXN0XyMjX190ZXN0KGFyZ3MpO1xcdFxcdFxcdFxcdFxcdFxcdCAgIFxcXFxcXG4rXFx0Y2xvc2UoZmQpO1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIFxcXFxcXG4gfSB3aGlsZSAoMClcXG4gXFxuICNkZWZpbmUgX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcXHRcXHRcXHRcXFxcXFxuLVxcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgZmQsIF9fZ21lbV9zaXplKVxcbitcXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsIGZkLCBfX2dtZW1fc2l6ZSlcXG4gXFxuICNkZWZpbmUgZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncylcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdF9fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNClcXG4gXFxuICNkZWZpbmUgX19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcXHRcXHRcXFxcXFxuLVxcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX192bSwgZmQsIF9fZ21lbV9zaXplKVxcbitcXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsXFx0XFx0XFxcXFxcbitcXHRcXHQgICAgICBfX3ZtLCBmZCwgX19nbWVtX3NpemUpXFxuIFxcbiAjZGVmaW5lIGdtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXFx0XFx0XFx0XFx0XFxcXFxcbiBcXHRfX2dtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIHBhZ2Vfc2l6ZSAqIDQpXFxuIFxcbisjZGVmaW5lIF9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX19ub2RlKVxcdFxcXFxcXG4rXFx0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sXFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRcXHQgICAgICAoX19mbGFncykgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSxcXHRcXHRcXFxcXFxuK1xcdFxcdCAgICAgIF9fZ21lbV9zaXplLCBfX25vZGUsIGZkLCBfX2dtZW1fc2l6ZSwgX19ub2RlKVxcbitcXG4rI2RlZmluZSBnbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fbm9kZSlcXHRcXHRcXHRcXFxcXFxuK1xcdF9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0LCBfX25vZGUpXFxuK1xcbiBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcXG4ge1xcbiBcXHR0ZXN0X2NyZWF0ZV9ndWVzdF9tZW1mZF9tdWx0aXBsZSh2bSk7XFxuIFxcdHRlc3RfY3JlYXRlX2d1ZXN0X21lbWZkX2ludmFsaWRfc2l6ZXModm0sIGZsYWdzKTtcXG4rXFx0dGVzdF9iaW5kX25vZGVfaW52YWxpZCh2bSwgZmxhZ3MpO1xcbiBcXG4gXFx0Z21lbV90ZXN0KGZpbGVfcmVhZF93cml0ZSwgdm0sIGZsYWdzKTtcXG4gXFxuQEAgLTQ1Miw2ICs1NjgsOCBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcXG4gXFx0XFx0XFx0Z21lbV90ZXN0KG1tYXBfc3VwcG9ydGVkLCB2bSwgZmxhZ3MpO1xcbiBcXHRcXHRcXHRnbWVtX3Rlc3QoZmF1bHRfb3ZlcmZsb3csIHZtLCBmbGFncyk7XFxuIFxcdFxcdFxcdGdtZW1fdGVzdChudW1hX2FsbG9jYXRpb24sIHZtLCBmbGFncyk7XFxuK1xcdFxcdFxcdGlmIChoYXNfYmluZF9ub2RlKHZtKSlcXG4rXFx0XFx0XFx0XFx0Z21lbV90ZXN0X25vZGUoYmluZF9ub2RlLCB2bSwgZmxhZ3MsIDApO1xcbiBcXHRcXHRcXHRfX2dtZW1fdGVzdChjb2xsYXBzZSwgdm0sIGZsYWdzLCBwbWRfc2l6ZSk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuIFxcdFxcdFxcdGdtZW1fdGVzdChmYXVsdF9wcml2YXRlLCB2bSwgZmxhZ3MpO1xcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbmluZGV4IDYyNWU2MmUxYTAzMTguLmRjOWYwNzFkZDk2OWIgMTAwNjQ0XFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcXG5AQCAtNDIzLDYgKzQyMywzMSBAQCBzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqa3ZtX2dtZW1fZ2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0ICovXFxuIFxcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2Vwb2xpY3ksIHBnb2ZmKTtcXG4gfVxcbitcXG4rc3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXFxuK3tcXG4rXFx0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xcbitcXHRub2RlbWFza190IG5vZGVzO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcXHUwMDNlPSBNQVhfTlVNTk9ERVMpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0aW5pdF9ub2RlbWFza19vZl9ub2RlKFxcdTAwMjZub2Rlcywgbm9kZSk7XFxuK1xcdHBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCBcXHUwMDI2bm9kZXMpO1xcbitcXHRpZiAoSVNfRVJSKHBvbCkpXFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKHBvbCk7XFxuK1xcbitcXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2Vwb2xpY3ksIDAsXFxuK1xcdFxcdFxcdFxcdFxcdCAgTUFYX0xGU19GSUxFU0laRSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZULCBwb2wpO1xcbitcXHRtcG9sX3B1dChwb2wpO1xcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuKyNlbHNlXFxuK3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxcbit7XFxuK1xcdHJldHVybiAtRUlOVkFMO1xcbit9XFxuICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xcbiBcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fZ21lbV92bV9vcHMgPSB7XFxuQEAgLTUyMCw3ICs1NDUsNyBAQCBib29sIF9fd2VhayBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKHN0cnVjdCBrdm0gKmt2bSlcXG4gXFx0cmV0dXJuIHRydWU7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxcbitzdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncywgaW50IG5vZGUpXFxuIHtcXG4gXFx0c3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSBcXFwiW2t2bS1nbWVtXVxcXCI7XFxuIFxcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XFxuQEAgLTU2MSw2ICs1ODYsMTIgQEAgc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXFxuIFxcbiBcXHRHTUVNX0koaW5vZGUpLVxcdTAwM2VmbGFncyA9IGZsYWdzO1xcbiBcXG4rXFx0aWYgKGZsYWdzIFxcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcXG4rXFx0XFx0ZXJyID0ga3ZtX2dtZW1fYmluZF9ub2RlKGlub2RlLCBub2RlKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0Z290byBlcnJfaW5vZGU7XFxuK1xcdH1cXG4rXFxuIFxcdGZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsIFxcdTAwMjZrdm1fZ21lbV9mb3BzKTtcXG4gXFx0aWYgKElTX0VSUihmaWxlKSkge1xcbiBcXHRcXHRlcnIgPSBQVFJfRVJSKGZpbGUpO1xcbkBAIC01OTMsNiArNjI0LDcgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxcbiB7XFxuIFxcdGxvZmZfdCBzaXplID0gYXJncy1cXHUwMDNlc2l6ZTtcXG4gXFx0dTY0IGZsYWdzID0gYXJncy1cXHUwMDNlZmxhZ3M7XFxuK1xcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xcbiBcXG4gXFx0aWYgKGZsYWdzIFxcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuQEAgLTYwMCw3ICs2MzIsMTUgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxcbiBcXHRpZiAoc2l6ZSBcXHUwMDNjPSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0cmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MpO1xcbitcXHRpZiAoZmxhZ3MgXFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xcbitcXHRcXHRpZiAoYXJncy1cXHUwMDNlcGFkIHx8IGFyZ3MtXFx1MDAzZW5vZGUgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0bm9kZSA9IGFyZ3MtXFx1MDAzZW5vZGU7XFxuK1xcdH0gZWxzZSBpZiAoYXJncy1cXHUwMDNlbm9kZSB8fCBhcmdzLVxcdTAwM2VwYWQpIHtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzLCBub2RlKTtcXG4gfVxcbiBcXG4gaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzoxNi42Nzk3NTcwNjhaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjU4MDMyMjg5ODAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtZW1wb2xpY3lfY3JlYXRlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIHRoZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSBmbGFnIGluIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGFuZCBhZGRzIHRoZSBtZW1wb2xpY3kgaGVscGVycyBtZW1wb2xpY3lfY3JlYXRlKCkgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKS4gVGhlc2UgY2hhbmdlcyBtb2RpZnkgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBpbiBtbS9tZW1wb2xpY3kuYyBhbmQgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGFlNjg5NTVhNTkyM2QyNWU5ZTBhZjk1Njk0MzA1NzllOTRjNDBmOWZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAzIDE5OjA3OjE1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG5pbmRleCAwM2JmYzkyODY0YjZlLi43MzhlMjc2NjMzYzFlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhcbkBAIC03MzksNiArNzM5LDkgQEAgc3RhdGljIGlubGluZSB1NjQga3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhzdHJ1Y3Qga3ZtICprdm0pXG4gXHRpZiAoIWt2bSB8fCBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKGt2bSkpXG4gXHRcdGZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQ7XG4gXG4rXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQSkpXG4rXHRcdGZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFO1xuK1xuIFx0cmV0dXJuIGZsYWdzO1xuIH1cbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaFxuaW5kZXggNjVjNzMyZDQ0MGQyZi4uMzk4MzE4MTc1Y2VjNyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbkBAIC0xMjQsMTAgKzEyNCwxNSBAQCBpbnQgdm1hX2R1cF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmMsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0KTtcbiB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XG4gaW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLFxuIFx0XHRcdCAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4rXHRcdFx0XHQgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xuIHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKTtcbiBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbiBcdFx0XHRcdFx0ICAgIHBnb2ZmX3QgaWR4KTtcbiBcbitzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuK1x0XHRcdFx0ICAgbm9kZW1hc2tfdCAqbm9kZXMpO1xuK1xuIHN0cnVjdCBtZW1wb2xpY3kgKmdldF90YXNrX3BvbGljeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApO1xuIHN0cnVjdCBtZW1wb2xpY3kgKl9fZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgcGdvZmZfdCAqaWx4KTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmggYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbmluZGV4IGFjMmQ3N2QxNDk2MzUuLjhkM2FlN2UyZWFkOGUgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxuQEAgLTE2NTgsMTEgKzE2NTgsMTQgQEAgc3RydWN0IGt2bV9tZW1vcnlfYXR0cmlidXRlcyB7XG4gI2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxuICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQXHRcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVxuICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRFx0KDFVTEwgXHUwMDNjXHUwMDNjIDEpXG4rI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERVx0KDFVTEwgXHUwMDNjXHUwMDNjIDIpXG4gXG4gc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQge1xuIFx0X191NjQgc2l6ZTtcbiBcdF9fdTY0IGZsYWdzO1xuLVx0X191NjQgcmVzZXJ2ZWRbNl07XG4rXHRfX3UzMiBub2RlO1xuK1x0X191MzIgcGFkO1xuK1x0X191NjQgcmVzZXJ2ZWRbNV07XG4gfTtcbiBcbiAjZGVmaW5lIEtWTV9QUkVfRkFVTFRfTUVNT1JZXHRfSU9XUihLVk1JTywgMHhkNSwgc3RydWN0IGt2bV9wcmVfZmF1bHRfbWVtb3J5KVxuZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmNcbmluZGV4IDJhZDBhNWYxODI4MGEuLmNlMTBjZTQzNzQ2NDMgMTAwNjQ0XG4tLS0gYS9tbS9tZW1wb2xpY3kuY1xuKysrIGIvbW0vbWVtcG9saWN5LmNcbkBAIC0xMDg1LDcgKzEwODUsNDUgQEAgc3RhdGljIGludCBtYmluZF9yYW5nZShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0cmV0dXJuIHZtYV9yZXBsYWNlX3BvbGljeSh2bWEsIG5ld19wb2wpO1xuIH1cbiBcbi0vKiBTZXQgdGhlIHByb2Nlc3MgbWVtb3J5IHBvbGljeSAqL1xuKy8qKlxuKyAqIG1lbXBvbGljeV9jcmVhdGUgLSBidWlsZCBhIHZhbGlkYXRlZCwgY3B1c2V0LWNvbnRleHR1YWxpc2VkIG1lbXBvbGljeVxuKyAqIEBtb2RlOiBNUE9MXyogbW9kZVxuKyAqIEBmbGFnczogTVBPTF9GXyogZmxhZ3NcbisgKiBAbm9kZXM6IHRhcmdldCBub2RlbWFzaywgb3IgTlVMTCAoaW50ZXJwcmV0ZWQgcGVyIEBtb2RlOyBzZWUgbXBvbF9uZXcoKSlcbisgKlxuKyAqIENyZWF0ZXMgYSBuZXcgcG9saWN5IGFuZCBjb25zdHJhaW5zIGl0IHRvIHRoZSB0YXNrJ3MgY3B1c2V0LlxuKyAqXG4rICogVGhlIGNhbGxlciBvd25zIHRoZSByZXR1cm5lZCByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cbisgKlxuKyAqIFJldHVybjogdGhlIHBvbGljeSAoTlVMTCBmb3IgYSBkZWZhdWx0IHBvbGljeSksIG9yIGFuIEVSUl9QVFIgb24gZmFpbHVyZS5cbisgKi9cbitzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3lfY3JlYXRlKHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuK1x0XHRub2RlbWFza190ICpub2Rlcylcbit7XG4rXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4rXHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xuK1x0aW50IGVycjtcbitcbitcdGlmICghc2NyYXRjaClcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4rXG4rXHRwb2wgPSBtcG9sX25ldyhtb2RlLCBmbGFncywgbm9kZXMpO1xuK1x0aWYgKElTX0VSUihwb2wpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHRhc2tfbG9jayhjdXJyZW50KTtcbitcdGVyciA9IG1wb2xfc2V0X25vZGVtYXNrKHBvbCwgbm9kZXMsIHNjcmF0Y2gpO1xuK1x0dGFza191bmxvY2soY3VycmVudCk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdG1wb2xfcHV0KHBvbCk7XG4rXHRcdHBvbCA9IEVSUl9QVFIoZXJyKTtcbitcdH1cbitvdXQ6XG4rXHROT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7XG4rXHRyZXR1cm4gcG9sO1xuK31cbitFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsIFwia3ZtXCIpO1xuK1xuIHN0YXRpYyBsb25nIGRvX3NldF9tZW1wb2xpY3kodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXG4gXHRcdFx0ICAgICBub2RlbWFza190ICpub2RlcylcbiB7XG5AQCAtMzI3NCwyNCArMzMxMiw0NyBAQCB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbClcbiB9XG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCwgXCJrdm1cIik7XG4gXG4taW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLFxuLVx0XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4rLyoqXG4rICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxuKyAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZVxuKyAqIEBzdGFydDogZmlyc3QgcGFnZSBvZmZzZXQgKGluY2x1c2l2ZSlcbisgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSlcbisgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlXG4rICpcbisgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS5cbisgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuXG4rICpcbisgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LlxuKyAqXG4rICogVW5saWtlIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koKSwgbm8gVk1BIGlzIHJlcXVpcmVkLCBzbyBhIHJhbmdlIHRoYXRcbisgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuKyAqL1xuK2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcbitcdFx0XHRcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuIHtcbi1cdGNvbnN0IHBnb2ZmX3QgcGdvZmYgPSB2bWFfc3RhcnRfcGdvZmYodm1hKTtcbi1cdGNvbnN0IHBnb2ZmX3QgcGdvZmZfZW5kID0gdm1hX2VuZF9wZ29mZih2bWEpO1xuIFx0c3RydWN0IHNwX25vZGUgKm5ldyA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuIFx0aWYgKHBvbCkge1xuLVx0XHRuZXcgPSBzcF9hbGxvYyhwZ29mZiwgcGdvZmZfZW5kLCBwb2wpO1xuK1x0XHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xuIFx0XHRpZiAoIW5ldylcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdH1cbi1cdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgcGdvZmYsIHBnb2ZmX2VuZCwgbmV3KTtcbitcdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgc3RhcnQsIGVuZCwgbmV3KTtcbiBcdGlmIChlcnIgXHUwMDI2XHUwMDI2IG5ldylcbiBcdFx0c3BfZnJlZShuZXcpO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlLCBcImt2bVwiKTtcbitcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4rXHRcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbit7XG4rXHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVx1MDAzZXZtX3Bnb2ZmLFxuK1x0XHRcdFx0XHQgICB2bWEtXHUwMDNldm1fcGdvZmYgKyB2bWFfcGFnZXModm1hKSwgcG9sKTtcbit9XG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5LCBcImt2bVwiKTtcbiBcbiAvKiBGcmVlIGEgYmFja2luZyBwb2xpY3kgc3RvcmUgb24gaW5vZGUgZGVsZXRlLiAqL1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jXG5pbmRleCAyMjMzZDg3MWEzOGY0Li5iMzMzY2I0MmZhYjI5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuY1xuQEAgLTI1LDYgKzI1LDMxIEBAXG4gXG4gc3RhdGljIHNpemVfdCBwYWdlX3NpemU7XG4gXG4rc3RhdGljIGludCBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLFxuK1x0XHRcdFx0ICAgICB1MzIgbm9kZSwgdTMyIHBhZClcbit7XG4rXHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZCA9IHtcbitcdFx0LnNpemUgPSBzaXplLFxuK1x0XHQuZmxhZ3MgPSBmbGFncyxcbitcdFx0Lm5vZGUgPSBub2RlLFxuK1x0XHQucGFkID0gcGFkLFxuK1x0fTtcbitcbitcdHJldHVybiBfX3ZtX2lvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZndWVzdF9tZW1mZCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSlcbit7XG4rXHRpbnQgZmQ7XG4rXG4rXHRpZiAoIShmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpKVxuK1x0XHRyZXR1cm4gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHZtLCBzaXplLCBmbGFncyk7XG4rXG4rXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHNpemUsIGZsYWdzLCBub2RlLCAwKTtcbitcdFRFU1RfQVNTRVJUKGZkIFx1MDAzZT0gMCwgS1ZNX0lPQ1RMX0VSUk9SKEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGZkKSk7XG4rXHRyZXR1cm4gZmQ7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHRlc3RfZmlsZV9yZWFkX3dyaXRlKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpXG4ge1xuIFx0Y2hhciBidWZbNjRdO1xuQEAgLTE3MSw2ICsxOTYsODMgQEAgc3RhdGljIHZvaWQgdGVzdF9udW1hX2FsbG9jYXRpb24oaW50IGZkLCBzaXplX3QgdG90YWxfc2l6ZSlcbiBcdGt2bV9tdW5tYXAobWVtLCB0b3RhbF9zaXplKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgaGFzX2JpbmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSlcbit7XG4rXHRyZXR1cm4gdm1fY2hlY2tfY2FwKHZtLCBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTKSBcdTAwMjZcbitcdCAgICAgICBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGVfaW52YWxpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxuK3tcbitcdGludCBmZDtcbitcbitcdGlmICghaGFzX2JpbmRfbm9kZSh2bSkpXG4rXHRcdHJldHVybjtcbitcbitcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLFxuK1x0XHRcdFx0ICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsIDAsIDEpO1xuK1x0VEVTVF9BU1NFUlQoZmQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCxcbitcdFx0ICAgIFwiZ3Vlc3RfbWVtZmQoKSB3aXRoIG5vbi16ZXJvIHBhZCBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwiKTtcbitcbitcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLFxuK1x0XHRcdFx0ICAgICAgIGZsYWdzIHwgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsXG4rXHRcdFx0XHQgICAgICAgMSBcdTAwM2NcdTAwM2MgMjAsIDApO1xuK1x0VEVTVF9BU1NFUlQoZmQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCxcbitcdFx0ICAgIFwiZ3Vlc3RfbWVtZmQoKSB3aXRoIG91dC1vZi1yYW5nZSBub2RlIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXCIpO1xuK1xuK1x0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBwYWdlX3NpemUsIGZsYWdzLCAxLCAwKTtcbitcdFRFU1RfQVNTRVJUKGZkIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXG4rXHRcdCAgICBcImd1ZXN0X21lbWZkKCkgd2l0aCBhIG5vZGUgYnV0IG5vIEJJTkRfTk9ERSBmbGFnIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMXCIpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2JpbmRfbm9kZShpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplLCBpbnQgbm9kZSlcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG90aGVyX21hc2sgPSAxVUwgXHUwMDNjXHUwMDNjIChub2RlID8gMCA6IDEpO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBtYXhub2RlID0gQklUU19QRVJfVFlQRShvdGhlcl9tYXNrKTtcbitcdGJvb2wgc3RlZXJfYXdheSA9IGlzX211bHRpX251bWFfbm9kZV9zeXN0ZW0oKTtcbitcdHZvaWQgKnBhZ2VzWzRdO1xuK1x0aW50IHN0YXR1c1s0XTtcbitcdGNoYXIgKm1lbTtcbitcdGludCBpO1xuK1xuK1x0bWVtID0ga3ZtX21tYXAodG90YWxfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSsrKVxuK1x0XHRwYWdlc1tpXSA9IG1lbSArIHBhZ2Vfc2l6ZSAqIGk7XG4rXG4rXHQvKlxuK1x0ICogQmluZCBvbiBhIGRpZmZlcmVudCBub2RlIGlmIHBvc3NpYmxlIG9yZGVyIHRvIGNoZWNrIHdoZXRoZXIgZmF1bHRpbmdcbitcdCAqIGhhcHBlbnMgYXMgZGVzaXJlZC4gV2l0aG91dCBhIHNlY29uZCBub2RlIHVzZSB0aGUgbG9jYWwgbm9kZSBhbmRcbitcdCAqIGp1c3QgZ2V0IGNvdmVyYWdlIG9mIGNyZWF0ZS9tbWFwL2ZhdWx0IHBhdGhzLlxuK1x0ICovXG4rXHRpZiAoc3RlZXJfYXdheSlcbitcdFx0a3ZtX3NldF9tZW1wb2xpY3koTVBPTF9CSU5ELCBcdTAwMjZvdGhlcl9tYXNrLCBtYXhub2RlKTtcbitcbitcdC8qIERlbGliZXJhdGVseSBubyBtYmluZCgpIG9uIHRoaXMgbWFwcGluZy4gKi9cbitcdG1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpO1xuK1xuK1x0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0OyBpKyspXG4rXHRcdFRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLFxuK1x0XHRcdCAgICBcIkV4cGVjdGVkIHBhZ2UgJWQgb24gbm9kZSAlZCwgZ290IGl0IG9uIG5vZGUgJWRcIixcbitcdFx0XHQgICAgaSwgbm9kZSwgc3RhdHVzW2ldKTtcbitcbitcdC8qIERyb3BwZWQgbWVtb3J5IHNob3VsZCBmYXVsdCBiYWNrIG9udG8gdGhlIHNhbWUgbm9kZSAqL1xuK1x0a3ZtX2ZhbGxvY2F0ZShmZCwgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpFLCAwLFxuK1x0XHQgICAgICB0b3RhbF9zaXplKTtcbitcdG1lbXNldChtZW0sIDB4YWEsIHRvdGFsX3NpemUpO1xuK1xuK1x0a3ZtX21vdmVfcGFnZXMoMCwgNCwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0OyBpKyspXG4rXHRcdFRFU1RfQVNTRVJUKHN0YXR1c1tpXSA9PSBub2RlLFxuK1x0XHRcdCAgICBcIkV4cGVjdGVkIHBhZ2UgJWQgYmFjayBvbiBub2RlICVkLCBnb3QgaXQgb24gbm9kZSAlZFwiLFxuK1x0XHRcdCAgICBpLCBub2RlLCBzdGF0dXNbaV0pO1xuK1xuK1x0aWYgKHN0ZWVyX2F3YXkpXG4rXHRcdGt2bV9zZXRfbWVtcG9saWN5KE1QT0xfREVGQVVMVCwgTlVMTCwgMCk7XG4rXG4rXHRrdm1fbXVubWFwKG1lbSwgdG90YWxfc2l6ZSk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHRlc3RfY29sbGFwc2UoaW50IGZkLCB1NjQgZmxhZ3MpXG4ge1xuIFx0Y29uc3Qgc2l6ZV90IHBtZF9zaXplID0gZ2V0X3RyYW5zX2h1Z2VwYWdlc3ooKTtcbkBAIC00MDQsNiArNTA2LDEwIEBAIHN0YXRpYyB2b2lkIHRlc3RfZ3Vlc3RfbWVtZmRfZmxhZ3Moc3RydWN0IGt2bV92bSAqdm0pXG4gXHRpbnQgZmQ7XG4gXG4gXHRmb3IgKGZsYWcgPSBCSVQoMCk7IGZsYWc7IGZsYWcgXHUwMDNjXHUwMDNjPSAxKSB7XG4rXHRcdC8qIEJJTkRfTk9ERSBkZXBlbmRzIG9uIGEgdmFsaWQgbm9kZSBmaWVsZCwgdGVzdCBzZXBhcmF0ZWx5ICovXG4rXHRcdGlmIChmbGFnID09IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuIFx0XHRmZCA9IF9fdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHZtLCBwYWdlX3NpemUsIGZsYWcpO1xuIFx0XHRpZiAoZmxhZyBcdTAwMjYgdmFsaWRfZmxhZ3MpIHtcbiBcdFx0XHRURVNUX0FTU0VSVChmZCBcdTAwM2U9IDAsXG5AQCAtNDE4LDMwICs1MjQsNDAgQEAgc3RhdGljIHZvaWQgdGVzdF9ndWVzdF9tZW1mZF9mbGFncyhzdHJ1Y3Qga3ZtX3ZtICp2bSlcbiBcdH1cbiB9XG4gXG4tI2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGFyZ3MuLi4pXHRcXFxuLWRvIHtcdFx0XHRcdFx0XHRcdFx0XHRcXFxuLVx0aW50IGZkID0gdm1fY3JlYXRlX2d1ZXN0X21lbWZkKF9fdm0sIF9fZ21lbV9zaXplLCBfX2ZsYWdzKTtcdFxcXG4tXHRcdFx0XHRcdFx0XHRcdFx0XFxcbi1cdHRlc3RfIyNfX3Rlc3QoYXJncyk7XHRcdFx0XHRcdFx0XFxcbi1cdGNsb3NlKGZkKTtcdFx0XHRcdFx0XHRcdFxcXG4rI2RlZmluZSBfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIF9fbm9kZSwgYXJncy4uLikgXFxcbitkbyB7XHRcdFx0XHRcdFx0XHRcdFx0ICAgXFxcbitcdGludCBmZCA9IGNyZWF0ZV9ndWVzdF9tZW1mZChfX3ZtLCBfX2dtZW1fc2l6ZSwgX19mbGFncywgX19ub2RlKTsgICBcXFxuK1x0XHRcdFx0XHRcdFx0XHRcdCAgIFxcXG4rXHR0ZXN0XyMjX190ZXN0KGFyZ3MpO1x0XHRcdFx0XHRcdCAgIFxcXG4rXHRjbG9zZShmZCk7XHRcdFx0XHRcdFx0XHQgICBcXFxuIH0gd2hpbGUgKDApXG4gXG4gI2RlZmluZSBfX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKVx0XHRcdFxcXG4tXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIGZkLCBfX2dtZW1fc2l6ZSlcbitcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgMCwgZmQsIF9fZ21lbV9zaXplKVxuIFxuICNkZWZpbmUgZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncylcdFx0XHRcdFxcXG4gXHRfX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIHBhZ2Vfc2l6ZSAqIDQpXG4gXG4gI2RlZmluZSBfX2dtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplKVx0XHRcXFxuLVx0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX3ZtLCBmZCwgX19nbWVtX3NpemUpXG4rXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsXHRcdFxcXG4rXHRcdCAgICAgIF9fdm0sIGZkLCBfX2dtZW1fc2l6ZSlcbiBcbiAjZGVmaW5lIGdtZW1fdGVzdF92bShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXHRcdFx0XHRcXFxuIFx0X19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KVxuIFxuKyNkZWZpbmUgX19nbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUpXHRcXFxuK1x0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sXHRcdFx0XHRcdFxcXG4rXHRcdCAgICAgIChfX2ZsYWdzKSB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFx0XHRcXFxuK1x0XHQgICAgICBfX2dtZW1fc2l6ZSwgX19ub2RlLCBmZCwgX19nbWVtX3NpemUsIF9fbm9kZSlcbitcbisjZGVmaW5lIGdtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgX19ub2RlKVx0XHRcdFxcXG4rXHRfX2dtZW1fdGVzdF9ub2RlKF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNCwgX19ub2RlKVxuK1xuIHN0YXRpYyB2b2lkIF9fdGVzdF9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxuIHtcbiBcdHRlc3RfY3JlYXRlX2d1ZXN0X21lbWZkX211bHRpcGxlKHZtKTtcbiBcdHRlc3RfY3JlYXRlX2d1ZXN0X21lbWZkX2ludmFsaWRfc2l6ZXModm0sIGZsYWdzKTtcbitcdHRlc3RfYmluZF9ub2RlX2ludmFsaWQodm0sIGZsYWdzKTtcbiBcbiBcdGdtZW1fdGVzdChmaWxlX3JlYWRfd3JpdGUsIHZtLCBmbGFncyk7XG4gXG5AQCAtNDUyLDYgKzU2OCw4IEBAIHN0YXRpYyB2b2lkIF9fdGVzdF9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IGZsYWdzKVxuIFx0XHRcdGdtZW1fdGVzdChtbWFwX3N1cHBvcnRlZCwgdm0sIGZsYWdzKTtcbiBcdFx0XHRnbWVtX3Rlc3QoZmF1bHRfb3ZlcmZsb3csIHZtLCBmbGFncyk7XG4gXHRcdFx0Z21lbV90ZXN0KG51bWFfYWxsb2NhdGlvbiwgdm0sIGZsYWdzKTtcbitcdFx0XHRpZiAoaGFzX2JpbmRfbm9kZSh2bSkpXG4rXHRcdFx0XHRnbWVtX3Rlc3Rfbm9kZShiaW5kX25vZGUsIHZtLCBmbGFncywgMCk7XG4gXHRcdFx0X19nbWVtX3Rlc3QoY29sbGFwc2UsIHZtLCBmbGFncywgcG1kX3NpemUpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdGdtZW1fdGVzdChmYXVsdF9wcml2YXRlLCB2bSwgZmxhZ3MpO1xuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCA2MjVlNjJlMWEwMzE4Li5kYzlmMDcxZGQ5NjliIDEwMDY0NFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuKysrIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuQEAgLTQyMyw2ICs0MjMsMzEgQEAgc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKmt2bV9nbWVtX2dldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHQgKi9cbiBcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCBwZ29mZik7XG4gfVxuK1xuK3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuK3tcbitcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcbitcdG5vZGVtYXNrX3Qgbm9kZXM7XG4rXHRpbnQgZXJyO1xuK1xuK1x0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuK1x0cG9sID0gbWVtcG9saWN5X2NyZWF0ZShNUE9MX0JJTkQsIDAsIFx1MDAyNm5vZGVzKTtcbitcdGlmIChJU19FUlIocG9sKSlcbitcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbitcbitcdGVyciA9IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2Vwb2xpY3ksIDAsXG4rXHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbitcdG1wb2xfcHV0KHBvbCk7XG4rXHRyZXR1cm4gZXJyO1xuK31cbisjZWxzZVxuK3N0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxuK3tcbitcdHJldHVybiAtRUlOVkFMO1xuK31cbiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9nbWVtX3ZtX29wcyA9IHtcbkBAIC01MjAsNyArNTQ1LDcgQEAgYm9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXG4rc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKVxuIHtcbiBcdHN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gXCJba3ZtLWdtZW1dXCI7XG4gXHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xuQEAgLTU2MSw2ICs1ODYsMTIgQEAgc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXG4gXG4gXHRHTUVNX0koaW5vZGUpLVx1MDAzZWZsYWdzID0gZmxhZ3M7XG4gXG4rXHRpZiAoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XG4rXHRcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XG4rXHRcdGlmIChlcnIpXG4rXHRcdFx0Z290byBlcnJfaW5vZGU7XG4rXHR9XG4rXG4gXHRmaWxlID0gYWxsb2NfZmlsZV9wc2V1ZG8oaW5vZGUsIGt2bV9nbWVtX21udCwgbmFtZSwgT19SRFdSLCBcdTAwMjZrdm1fZ21lbV9mb3BzKTtcbiBcdGlmIChJU19FUlIoZmlsZSkpIHtcbiBcdFx0ZXJyID0gUFRSX0VSUihmaWxlKTtcbkBAIC01OTMsNiArNjI0LDcgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxuIHtcbiBcdGxvZmZfdCBzaXplID0gYXJncy1cdTAwM2VzaXplO1xuIFx0dTY0IGZsYWdzID0gYXJncy1cdTAwM2VmbGFncztcbitcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuIFxuIFx0aWYgKGZsYWdzIFx1MDAyNiB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC02MDAsNyArNjMyLDE1IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbiBcdGlmIChzaXplIFx1MDAzYz0gMCB8fCAhUEFHRV9BTElHTkVEKHNpemUpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbi1cdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzKTtcbitcdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbitcdFx0aWYgKGFyZ3MtXHUwMDNlcGFkIHx8IGFyZ3MtXHUwMDNlbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0bm9kZSA9IGFyZ3MtXHUwMDNlbm9kZTtcbitcdH0gZWxzZSBpZiAoYXJncy1cdTAwM2Vub2RlIHx8IGFyZ3MtXHUwMDNlcGFkKSB7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0cmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MsIG5vZGUpO1xuIH1cbiBcbiBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzoxNi42Nzk3NTg5ODhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNDg1MjQ2NDc2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEd1ZXN0IE1lbWZkIFBhdGNoIFNlcmllcyBmb3IgRnV6emluZyBQb3RlbnRpYWwqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBpdCdzIGFpbWVkIGF0IGFtZDY0LCB3aGljaCBpcyBnb29kOyBpdCdzIGEgY29tbW9uIHRhcmdldC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGJlaW5nIGNoYW5nZWQgYW5kIHdoeSwgdG8gZmlndXJlIG91dCBpZiBpdCdzIHdvcnRoIGZ1enppbmcuXG5cbkxvb2tpbmcgYXQgdGhlIGZpbGUgbW9kaWZpY2F0aW9ucywgaXQgc2VlbXMgdGhlIGNvcmUgaXMgdGhlIGFkZGl0aW9uIG9mIE5VTUEgbm9kZSBiaW5kaW5nIGZvciBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9ycyAoZ3Vlc3RfbWVtZmQpLlxuXG4qICAgYGluY2x1ZGUvbGludXgva3ZtX2hvc3QuaGAgaXMgZW5hYmxpbmcgYSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGlmIE5VTUEgaXMgZW5hYmxlZCB3aGVuIGdldHRpbmcgc3VwcG9ydGVkIGZsYWdzLlxuKiAgIGBpbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oYCBzaG93cyBuZXcgZnVuY3Rpb25zIGJlaW5nIGFkZGVkIHJlbGF0ZWQgdG8gbWVtb3J5IHBvbGljeSwgcGFydGljdWxhcmx5IHNoYXJlZCBwb2xpY3kgcmFuZ2VzLCB3aXRoIHRoZSBkZWNsYXJhdGlvbiBvZiBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgYW5kIGBtZW1wb2xpY3lfY3JlYXRlYC4gVGhlc2UgYXJlIGltcG9ydGFudC5cbiogICBgaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oYCBkZWZpbmVzIHRoZSBmbGFnIGl0c2VsZiBhbmQgdXBkYXRlcyB0aGUgYGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmRgIHN0cnVjdHVyZSB0byBpbmNsdWRlIGEgYG5vZGVgIGZpZWxkLCB3aGljaCBJIHdvdWxkIGV4cGVjdC5cbiogICBgbW0vbWVtcG9saWN5LmNgIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRob3NlIG5ldyBtZW1wb2xpY3kgZnVuY3Rpb25zLCBhbmQgaW1wb3J0YW50bHksIGl0J3MgbW9kaWZ5aW5nIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5YCB0byB1c2UgdGhlIG5ldyBzaGFyZWQgcmFuZ2UgZnVuY3Rpb24uIFRoYXQncyBhIGtleSBhcmVhLlxuKiAgIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jYCBhZGRzIHRlc3RzIGZvciB0aGlzIG5vZGUgYmluZGluZy4gQWx3YXlzIGdvb2QgdG8gc2VlIHRlc3RpbmcuXG4qICAgYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGltcGxlbWVudHMgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGFuZCB1cGRhdGVzIHRoZSBjcmVhdGlvbiBmdW5jdGlvbnMgdG8gdGFrZSB0aGUgZmxhZyBpbnRvIGFjY291bnQuXG5cblNvLCB0aGlzIGlzIGEgcHJldHR5IHNlbGYtY29udGFpbmVkIHNldCBvZiBjaGFuZ2VzOyBpdCdzIGFkZGluZyB0aGUgYWJpbGl0eSB0byBiaW5kIGd1ZXN0IG1lbWZkcyB0byBzcGVjaWZpYyBOVU1BIG5vZGVzLlxuXG5Ob3csIHRoZSBpbXBvcnRhbnQgcGFydDogaXMgdGhpcyBmdXp6YWJsZT8gSSBrbm93IGAvZGV2L2t2bWAgaW9jdGxzIChgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGApIGFyZSBjb3JlIGFuZCByZWFjaGFibGUgZnJvbSB0aGUgdXNlcnNwYWNlLCBhbmQgdGhhdCBtZW1wb2xpY3kgY2hhbmdlcyBhcmUgaW4gY29yZSBtZW1vcnkgbWFuYWdlbWVudC4gVGhpcyBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBpbiBhIHN0YW5kYXJkIFFFTVUvc3l6a2FsbGVyIGVudmlyb25tZW50LiBJJ20gc2VlaW5nIHRoYXQgTlVNQSBwb2xpY2llcyBhbmQgZ3Vlc3QgbWVtZmQgYXJlIGNvcmUga2VybmVsIHN1YnN5c3RlbXMuIFRoaXMgbG9va3MgbGlrZSBhIHNvbGlkIFwiV29ydGhGdXp6aW5nID0gdHJ1ZVwiIHNjZW5hcmlvLlxuXG5OZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IEtjb25maWcgZGVwZW5kZW5jaWVzLiBJJ20gZXhwZWN0aW5nIGBLVk1gIChvciBgS1ZNX0lOVEVMYC9gS1ZNX0FNRGAsIGJ1dCBgS1ZNYCBpcyBwcmV0dHkgc3RhbmRhcmQpIGFuZCBgTlVNQWAgdG8gYmUgcmVxdWlyZWQuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyB0byBzZWUgdGhlIGRlcGVuZGVuY2llcywgZXNwZWNpYWxseSB3aGVyZSBndWVzdF9tZW1mZCBhbmQgbWVtcG9saWN5IGRlcGVuZCBvbiBlYWNoIG90aGVyLiBUaGF0J3MgdGhlIG5leHQgc3RlcC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODY0OCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY1MywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjMxLjUzMjIyNzI4OVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODUzMDkxMDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIktWTV9DUkVBVEVfR1VFU1RfTUVNRkRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0PTYzNTc9aW4gZmxhZ3MgdG8gaGF2ZSBLVk0gYmluZCB0aGUgbWVtb3J5IHJlZ2lvbiB0byBhIGdpdmVuIGd1ZXN0X21lbWZkIHJhbmdlIG9mXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTYzNTgtW2d1ZXN0X21lbWZkX29mZnNldCwgZ3Vlc3RfbWVtZmRfb2Zmc2V0ICsgbWVtb3J5X3NpemVdLiAgVGhlIHRhcmdldCBndWVzdF9tZW1mZFxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2MzU5Om11c3QgcG9pbnQgYXQgYSBmaWxlIGNyZWF0ZWQgdmlhIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgb24gdGhlIGN1cnJlbnQgVk0sIGFuZFxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02MzYwLXRoZSB0YXJnZXQgcmFuZ2UgbXVzdCBub3QgYmUgYm91bmQgdG8gYW55IG90aGVyIG1lbW9yeSByZWdpb24uICBBbGwgc3RhbmRhcmRcXG4tLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02NDMwPVRoZSBcXFwiZmxhZ3NcXFwiIGZpZWxkIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBhbmQgbXVzdCBiZSAnMCcuXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0MzEtXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0MzI6NC4xNDIgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4tLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDQwLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDQxOktWTV9DUkVBVEVfR1VFU1RfTUVNRkQgY3JlYXRlcyBhbiBhbm9ueW1vdXMgZmlsZSBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvclxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDQyLXRoYXQgcmVmZXJzIHRvIGl0LiAgZ3Vlc3RfbWVtZmQgZmlsZXMgYXJlIHJvdWdobHkgYW5hbG9nb3VzIHRvIGZpbGVzIGNyZWF0ZWRcXG4tLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02NDczPVRoZSBjYXBhYmlsaXR5IEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MgZW51bWVyYXRlcyB0aGUgYGZsYWdzYCB0aGF0IGNhbiBiZVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDc0OnNwZWNpZmllZCB2aWEgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRC4gIEN1cnJlbnRseSBkZWZpbmVkIGZsYWdzOlxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDc1LVxcbi0tXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0NzktICBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEIE1ha2UgYWxsIG1lbW9yeSBpbiB0aGUgZmlsZSBzaGFyZWQgZHVyaW5nXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0OjY0ODA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgKG1lbW9yeSBmaWxlcyBjcmVhdGVkXFxuRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9hcGkucnN0LTY0ODEtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgSU5JVF9TSEFSRUQgd2lsbCBiZSBtYXJrZWQgcHJpdmF0ZSkuXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZz04Mz1jb25maWcgS1ZNX1NXX1BST1RFQ1RFRF9WTVxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctOTAtXFx0ICBwcm90ZWN0ZWQgVk1zIGFyZSBwdXJlbHkgYSBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyB2ZWhpY2xlIGZvclxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjkxOlxcdCAgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRC4gIEF0dGVtcHRpbmcgdG8gcnVuIGEgXFxcInJlYWxcXFwiIFZNIHdvcmtsb2FkIGFzIGFcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy05Mi1cXHQgIHNvZnR3YXJlLXByb3RlY3RlZCBWTSB3aWxsIGZhaWwgbWlzZXJhYmx5Llxcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oPTE2NDk9c3RydWN0IGt2bV9tZW1vcnlfYXR0cmlidXRlcyB7XFxuLS1cXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1Ny1cXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmg6MTY1ODojZGVmaW5lIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcXHRfSU9XUihLVk1JTywgIDB4ZDQsIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkKVxcbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjU5LSNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQXFx0XFx0KDFVTEwgXFx1MDAzY1xcdTAwM2MgMClcXG4tLVxcbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaD0xNjQ1PXN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xcbi0tXFxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTMtXFxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oOjE2NTQ6I2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcXG50b29scy9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1NS0jZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFxcdFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDApXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jPTI4PXN0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMtMzctXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYzozODpcXHRyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXFx1MDAyNmd1ZXN0X21lbWZkKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTM5LX1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmM9NDE9c3RhdGljIGludCBjcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsIHUzMiBub2RlKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy00OC1cXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHNpemUsIGZsYWdzLCBub2RlLCAwKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jOjQ5OlxcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMtNTAtXFx0cmV0dXJuIGZkO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaD02Njc9c3RhdGljIGlubGluZSBpbnQgX192bV9jcmVhdGVfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02NzQtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaDo2NzU6XFx0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFxcdTAwMjZndWVzdF9tZW1mZCk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaC02NzYtfVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2luY2x1ZGUva3ZtX3V0aWwuaD02Nzg9c3RhdGljIGlubGluZSBpbnQgdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjgyLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg6NjgzOlxcdFRFU1RfQVNTRVJUKGZkIFxcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjg0LVxcdHJldHVybiBmZDtcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmM9NTE2Nz1zdGF0aWMgbG9uZyBrdm1fdm1faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTUzODctI2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjUzODg6XFx0Y2FzZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEOiB7XFxudmlydC9rdm0va3ZtX21haW4uYy01Mzg5LVxcdFxcdHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIGd1ZXN0X21lbWZkO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzozMy4zODUzMjUyMjFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzIyMDk3MTMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKktWTSBDb25maWd1cmF0aW9uIERlZXAgRGl2ZSoqXG5cbk9rYXksIHRpbWUgdG8gZGlnIGludG8gdGhlIEtWTSBjb25maWd1cmF0aW9uLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gYENPTkZJR19LVk1fR1VFU1RfTUVNRkRgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY3VycmVudCBzdGF0dXMgYW5kIGltcGxpY2F0aW9ucy4gQmV5b25kIHRoYXQsIEkgbmVlZCB0byBjaGVjayBvdXQgYW55IG90aGVyIEtjb25maWdzIHRoYXQgYXJlIG9idmlvdXNseSByZWxhdGVkIHRvIGl0LiBUaGVyZSdzIGFsbW9zdCBjZXJ0YWlubHkgYSB3ZWIgb2YgZGVwZW5kZW5jaWVzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBJIG5lZWQgdG8gbWFwIG91dCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIHNwZWNpZmljIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQsIGhvdyBpdCBhZmZlY3RzIHRoZSBndWVzdCBlbnZpcm9ubWVudCwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIGtub2JzIHRoYXQgbWlnaHQgYmUgd29ydGggYWRqdXN0aW5nLiBJdCdzIHRpbWUgdG8gYnVpbGQgYSBzb2xpZCBtZW50YWwgbW9kZWwgb2YgdGhlIHJlbGV2YW50IEtjb25maWcgbGFuZHNjYXBlLiBMZXQncyBzZWUgd2hhdCB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgc291cmNlIGNvZGUgdGVsbCB1cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE2ODAsIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzozNS43MDc0MjU5MzNaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc3ODYwNzEwNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS1ZNX0dVRVNUX01FTUZEXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbi0tXFxudmlydC9rdm0vS2NvbmZpZy0xMDUtXFxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjM3LjQ4NjA0MTgyN1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjYxNDAyNzEzODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQW5hbHl6aW5nIHRoZSBLVk0gQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGUgYHZpcnQva3ZtL0tjb25maWdgIGZpbGUsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAxMDYuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgdGhpcyBwYXJ0aWN1bGFyIG9wdGlvbiBpcyBoYW5kbGVkLiBJIHN1c3BlY3Qgd2UncmUgbG9va2luZyBhdCBhIEtjb25maWcgc3ltYm9sIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyB2aXJ0dWFsaXphdGlvbiBmZWF0dXJlIG9yIGRldmljZS4gRGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IEkgbWlnaHQgYmUgbG9va2luZyBmb3IgZGVwZW5kZW5jaWVzLCBkZWZhdWx0IHZhbHVlcywgb3IgcGVyaGFwcyBldmVuIGNvbW1lbnRzIGNsYXJpZnlpbmcgdGhlIGltcGxpY2F0aW9ucyBvZiBlbmFibGluZyBvciBkaXNhYmxpbmcgdGhpcyBvcHRpb24uIE15IGdvYWwgaGVyZSBpcyB0byBncmFzcCB0aGUgY29uZmlndXJhYmlsaXR5IG9mIHRoaXMgcGFydGljdWxhciBhc3BlY3Qgb2YgdGhlIEtWTSBzZXR1cCBhbmQgaXRzIHBvdGVudGlhbCBpbXBhY3Qgb24gcGVyZm9ybWFuY2Ugb3IgZnVuY3Rpb25hbGl0eS4gSSB3aWxsIHBheSBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byBkZXBlbmRlbmNpZXMgb24gb3RoZXIgZmVhdHVyZXMgb3IgaGFyZHdhcmUsIGxvb2tpbmcgZm9yIGFueSBlZGdlIGNhc2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTk4MiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjQzLjYyNjMxNTE4N1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg2NjIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogOTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgOTA6XFx0XFxuICA5MTpcXHRjb25maWcgSEFWRV9LVk1fUE1fTk9USUZJRVJcXG4gIDkyOlxcdCAgICAgICBib29sXFxuICA5MzpcXHRcXG4gIDk0OlxcdGNvbmZpZyBLVk1fR0VORVJJQ19IQVJEV0FSRV9FTkFCTElOR1xcbiAgOTU6XFx0ICAgICAgIGJvb2xcXG4gIDk2OlxcdFxcbiAgOTc6XFx0Y29uZmlnIEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcXG4gIDk4OlxcdCAgICAgICBib29sXFxuICA5OTpcXHRcXG4gMTAwOlxcdGNvbmZpZyBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXFxuIDEwMTpcXHQgICAgICAgYm9vbFxcbiAxMDI6XFx0XFxuIDEwMzpcXHRjb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcXG4gMTA0OlxcdCAgICAgICBib29sXFxuIDEwNTpcXHRcXG4gMTA2OlxcdGNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcXG4gMTA3OlxcdCAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuIDEwODpcXHQgICAgICAgYm9vbFxcbiAxMDk6XFx0XFxuIDExMDpcXHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcXG4gMTExOlxcdCAgICAgICBib29sXFxuIDExMjpcXHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG4gMTEzOlxcdFxcbiAxMTQ6XFx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9SRUNMQUlNXFxuIDExNTpcXHQgICAgICAgYm9vbFxcbiAxMTY6XFx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxuIDExNzpcXHRcXG4gMTE4OlxcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fSU5WQUxJREFURVxcbiAxMTk6XFx0ICAgICAgIGJvb2xcXG4gMTIwOlxcdCAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxcbiAxMjE6XFx0XFxuIDEyMjpcXHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1BPUFVMQVRFXFxuIDEyMzpcXHQgICAgICAgYm9vbFxcbiAxMjQ6XFx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjQzLjYyNjQwMzMxN1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUwOTAwNDM1MjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIFNlbGVjdGlvbiBvZiBgS1ZNX0dVRVNUX01FTUZEYCoqXG5cbk9rYXksIHNvIHNvbWVvbmUncyBqdXN0IHBpY2tlZCBgS1ZNX0dVRVNUX01FTUZEYC4gTGV0IG1lIHF1aWNrbHkgYnJlYWsgZG93biB3aGF0IHRoYXQgaW1wbGllcyBpbiB0ZXJtcyBvZiBrZXJuZWwgYmVoYXZpb3IgYW5kIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMuIEZpcnN0IG9mZiwgdGhpcyBtZWFucyB0aGV5J3JlIGFpbWluZyBmb3IgYSBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIGludGVyZmFjZSwgd2hpY2gsICp0ZWNobmljYWxseSosIGlzbid0IG5ldyDigJMgYnV0IGl0cyBhcHBsaWNhdGlvbiBvciB0aGUgKnJlYXNvbiogZm9yIGl0cyB1c2Ugd2FycmFudHMgZGVlcGVyIHNjcnV0aW55LlxuXG5NeSBpbW1lZGlhdGUgcXVlc3Rpb25zIGFyZTogV2hhdCdzIHRoZSAqc3BlY2lmaWMqIHVzZSBjYXNlIHByb21wdGluZyB0aGlzIHNlbGVjdGlvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBtZW1vcnktYmFja2VkIGd1ZXN0PyBPciBpcyB0aGlzIHBhcnQgb2Ygc29tZSBtb3JlIGludHJpY2F0ZSBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneT8gQXJlIHRoZXkgdGFyZ2V0aW5nIHBlcmZvcm1hbmNlIGdhaW5zIHZpYSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBmcm9tIHVzZXJzcGFjZSwgd2hpY2ggd291bGQgYmUgYW4gb2J2aW91cyBhbmQgZ2VuZXJhbGx5IHVuZGVyc3Rvb2QgcmVhc29uPyBPciBpcyBpdCBzb21ldGhpbmcgbW9yZSBzdWJ0bGU/XG5cblRoZW4sIEknbSB0aGlua2luZyBhYm91dCB0aGUgc2VjdXJpdHkgcG9zdHVyZS4gVXNpbmcgZ3Vlc3QgbWVtZmRzIGludHJvZHVjZXMgcG90ZW50aWFsIGF0dGFjayBzdXJmYWNlIGNvbnNpZGVyYXRpb25zIOKAkyBhcmUgYXBwcm9wcmlhdGUgc2FmZWd1YXJkcyBpbiBwbGFjZSB0byBtaXRpZ2F0ZSByaXNrcyBhc3NvY2lhdGVkIHdpdGggbWFuaXB1bGF0aW5nIGd1ZXN0IG1lbW9yeSBmcm9tIHVzZXJzcGFjZSBvciBldmVuIGZyb20gdGhlIGhvc3Qgc2lkZT8gV2UgbmVlZCB0byB2ZXJpZnkgdGhhdCB3ZSdyZSBwcm9wZXJseSBjb25zaWRlcmluZyBhbmQgaGFyZGVuaW5nIGFsbCB0aGUgYXNzb2NpYXRlZCBhc3BlY3RzIG9mIHRoaXMgYXJjaGl0ZWN0dXJlLlxuXG5Gcm9tIGEgcGVyZm9ybWFuY2UgcGVyc3BlY3RpdmUsIEknbGwgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIGltcGxpY2F0aW9ucyBvbiBtZW1vcnkgb3ZlcmhlYWQuIElzIHRoZSBnYWluIGluIGRpcmVjdCBtZW1vcnkgYWNjZXNzIHdvcnRoIGFueSBpbnRyb2R1Y2VkIG92ZXJoZWFkIGZyb20gdGhlIGV4dHJhIGJvb2trZWVwaW5nIHRoYXQgd291bGQgYmUgaW50cm9kdWNlZD8gSSBuZWVkIHRvIGFuYWx5emUgaXRzIGltcGFjdCBvbiBtZW1vcnkgYWxsb2NhdGlvbiwgZGVhbGxvY2F0aW9uLCBhbmQgdGhlIGNvbnRleHQgc3dpdGNoaW5nIOKAkyBpcyB0aGUgdHJhZGUtb2ZmIGluIGxhdGVuY3ksIHdoaWNoIHRoaXMgaW50ZXJmYWNlIGNhbiBoYXZlLCBiZWluZyBwcm9wZXJseSBhc3Nlc3NlZD9cblxuVWx0aW1hdGVseSwgdGhlICd3aHknIGlzIHdoYXQgSSByZWFsbHkgbmVlZCB0byBnZXQgYXQuIEFyZSB0aGVyZSBhbnkgZXhpc3RpbmcgZGVwZW5kZW5jaWVzPyBBcmUgdGhleSByZWx5aW5nIG9uIHRoaXMgZmVhdHVyZSBhcyBhIG1lYW5zIG9mIHJlZHVjaW5nIG1lbW9yeSBjb3B5IG92ZXJoZWFkLCBzdXBwb3J0aW5nIHNoYXJlZCBtZW1vcnksIG9yIG1heWJlIGV2ZW4gZW5hYmxpbmcgbGl2ZSBtaWdyYXRpb24gb3B0aW1pemF0aW9ucz8gT3IgYXJlIHRoZXkganVzdCBleHBlcmltZW50aW5nPyBFaXRoZXIgd2F5LCBJJ2xsIGJlIGludGVyZXN0ZWQgdG8gc2VlIGhvdyB0aGV5IGxldmVyYWdlIHRoaXMsIGFuZCBpZiBpdCdzIGRvbmUgY29ycmVjdGx5LCBpZiB0aGlzIHNlbGVjdGlvbiBpcyBwYXJ0IG9mIGEgbGFyZ2VyLCBjb2hlcmVudCBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNjQwLCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzo0OC43MTY0NDk4NzFaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3OTc2NTYzMjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2VsZWN0IEtWTV9HVUVTVF9NRU1GRFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL2FybTY0L2t2bS9LY29uZmlnPTIwPW1lbnVjb25maWcgS1ZNXFxuLS1cXG5hcmNoL2FybTY0L2t2bS9LY29uZmlnLTM4LVxcdHNlbGVjdCBHVUVTVF9QRVJGX0VWRU5UUyBpZiBQRVJGX0VWRU5UU1xcbmFyY2gvYXJtNjQva3ZtL0tjb25maWc6Mzk6XFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRFxcbmFyY2gvYXJtNjQva3ZtL0tjb25maWctNDAtXFx0aGVscFxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWc9MjA9Y29uZmlnIEtWTV9YODZcXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTQ5LVxcdHNlbGVjdCBLVk1fV0VSUk9SIGlmIFdFUlJPUlxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjUwOlxcdHNlbGVjdCBLVk1fR1VFU1RfTUVNRkQgaWYgWDg2XzY0XFxuYXJjaC94ODYva3ZtL0tjb25maWctNTEtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjUwLjUxNDExMzI2NVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMTgzNjYzMjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBhbiBleHBlcnQgaW4gbXkgZmllbGQ6XG5cbioqSW52ZXN0aWdhdGluZyBLVk0gYW5kIE1lbW9yeSBNYW5hZ2VtZW50IG9uIHg4Nl82NCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBLVk0gaGFuZGxlcyBtZW1vcnkgb24geDg2XzY0LiBTcGVjaWZpY2FsbHksIEkga25vdyB0aGF0IG9uIHRoaXMgYXJjaGl0ZWN0dXJlLCB0aGUgS1ZNIGNvcmUgKG9yIGl0cyBzcGVjaWZpYyBJbnRlbC9BTUQvWDg2IHZhcmlhbnRzKSB0eXBpY2FsbHkgbGV2ZXJhZ2VzIGBLVk1fR1VFU1RfTUVNRkRgLiBCdXQgSSdtIGN1cmlvdXMgYWJvdXQgdGhlIGludGVyYWN0aW9uIHdpdGggTlVNQS4gVGhhdCdzIGFsd2F5cyBhIGNyaXRpY2FsIGNvbnNpZGVyYXRpb24gZm9yIHBlcmZvcm1hbmNlIGluIGEgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIGFuZCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGVyZSBhcmUgc3BlY2lmaWMgYmVoYXZpb3JzIG9yIGNvbmZpZ3VyYXRpb25zIHJlbGF0aW5nIHRvIEtWTSBhbmQgTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2Vzcy5cblxuTXkgbmV4dCBzdGVwIGlzIGNsZWFyOiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgY29kZS4gSSdsbCBjaGVjayBgbW0vbWVtcG9saWN5LmNgIGFuZCBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgdG8gc2VlIGhvdyB0aGUgTlVNQSBjb25maWd1cmF0aW9uIChgQ09ORklHX05VTUFgKSBpcyBiZWluZyBoYW5kbGVkLCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byBndWVzdCBtZW1vcnkgYmFja2VkIGJ5IGBtZW1mZGAuIEkgYW50aWNpcGF0ZSB0aGVyZSB3aWxsIGJlIG51YW5jZXMgaW4gbWVtb3J5IGFsbG9jYXRpb24gYW5kIHBsYWNlbWVudCBzdHJhdGVnaWVzIHJlbGF0ZWQgdG8gTlVNQSBub2RlcyB3aGVuIEtWTSBhbmQgYG1lbWZkYCBhcmUgaW52b2x2ZWQuIFRoaXMgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgc3RhcnRpbmcgcG9pbnQgdG8gYmVnaW4gYSBtdWNoIGRlZXBlciBpbnZlc3RpZ2F0aW9uIGludG8gdGhlIGludGVyYWN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzMxMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA3OjUzLjY5Nzc3OTY1WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTAzMzA3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfTlVNQVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiXFxuRnVsbCBvdXRwdXQgaXMgdG9vIGxvbmcsIHNob3dpbmcgNTAwIG91dCBvZiA4MzcgbGluZXMuXFxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxcblxcbm1tL01ha2VmaWxlPTg2PW9iai0kKENPTkZJR19IVUdFVExCX1BBR0VfT1BUSU1JWkVfVk1FTU1BUClcXHQrPSBodWdldGxiX3ZtZW1tYXAub1xcbm1tL01ha2VmaWxlOjg3Om9iai0kKENPTkZJR19OVU1BKSBcXHQrPSBtZW1wb2xpY3kub1xcbm1tL01ha2VmaWxlLTg4LW9iai0kKENPTkZJR19TUEFSU0VNRU0pXFx0Kz0gc3BhcnNlLm9cXG4tLVxcbm1tL01ha2VmaWxlPTk5PW9iai0kKENPTkZJR19NSUdSQVRJT04pICs9IG1pZ3JhdGUub1xcbm1tL01ha2VmaWxlOjEwMDpvYmotJChDT05GSUdfTlVNQSkgKz0gbWVtb3J5LXRpZXJzLm9cXG5tbS9NYWtlZmlsZS0xMDEtb2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG4tLVxcbm1tL01ha2VmaWxlPTEyMj1vYmotJChDT05GSUdfQ01BKVxcdCs9IGNtYS5vXFxubW0vTWFrZWZpbGU6MTIzOm9iai0kKENPTkZJR19OVU1BKSArPSBudW1hLm9cXG5tbS9NYWtlZmlsZToxMjQ6b2JqLSQoQ09ORklHX05VTUFfTUVNQkxLUykgKz0gbnVtYV9tZW1ibGtzLm9cXG5tbS9NYWtlZmlsZToxMjU6b2JqLSQoQ09ORklHX05VTUFfRU1VKSArPSBudW1hX2VtdWxhdGlvbi5vXFxubW0vTWFrZWZpbGUtMTI2LW9iai0kKENPTkZJR19HRU5FUklDX0FSQ0hfTlVNQSkgKz0gYXJjaF9udW1hLm9cXG4tLVxcbm1tL2FyY2hfbnVtYS5jPTU4PUVYUE9SVF9TWU1CT0woY3B1bWFza19vZl9ub2RlKTtcXG4tLVxcbm1tL2FyY2hfbnVtYS5jLTYxLVxcbm1tL2FyY2hfbnVtYS5jOjYyOiNpZm5kZWYgQ09ORklHX05VTUFfRU1VXFxubW0vYXJjaF9udW1hLmMtNjMtc3RhdGljIHZvaWQgbnVtYV91cGRhdGVfY3B1KHVuc2lnbmVkIGludCBjcHUsIGJvb2wgcmVtb3ZlKVxcbi0tXFxubW0vYXJjaF9udW1hLmM9MzIyPXZvaWQgX19pbml0IGFyY2hfbnVtYV9pbml0KHZvaWQpXFxuLS1cXG5tbS9hcmNoX251bWEuYy0zMzMtXFxubW0vYXJjaF9udW1hLmM6MzM0OiNpZmRlZiBDT05GSUdfTlVNQV9FTVVcXG5tbS9hcmNoX251bWEuYy0zMzUtdm9pZCBfX2luaXQgbnVtYV9lbXVfdXBkYXRlX2NwdV90b19ub2RlKGludCAqZW11X25pZF90b19waHlzLFxcbi0tXFxubW0vYXJjaF9udW1hLmM9MzYwPXZvaWQgZGVidWdfY3B1bWFza19zZXRfY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCBub2RlLCBib29sIGVuYWJsZSlcXG4tLVxcbm1tL2FyY2hfbnVtYS5jLTM4Mi19XFxubW0vYXJjaF9udW1hLmM6MzgzOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi9cXG4tLVxcbm1tL2NtYS5jPTQzNj1zdGF0aWMgaW50IF9faW5pdCBfX2NtYV9kZWNsYXJlX2NvbnRpZ3VvdXNfbmlkKHBoeXNfYWRkcl90ICpiYXNlcCxcXG4tLVxcbm1tL2NtYS5jLTQ1OS1cXG5tbS9jbWEuYzo0NjA6XFx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19OVU1BKSlcXG5tbS9jbWEuYy00NjEtXFx0XFx0bmlkID0gTlVNQV9OT19OT0RFO1xcbi0tXFxubW0vY29tcGFjdGlvbi5jPTMwMDU9c3RhdGljIGludCBzeXNjdGxfY29tcGFjdGlvbl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXFxuLS1cXG5tbS9jb21wYWN0aW9uLmMtMzAyMi1cXG5tbS9jb21wYWN0aW9uLmM6MzAyMzojaWYgZGVmaW5lZChDT05GSUdfU1lTRlMpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX05VTUEpXFxubW0vY29tcGFjdGlvbi5jLTMwMjQtc3RhdGljIHNzaXplX3QgY29tcGFjdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsXFxuLS1cXG5tbS9jb21wYWN0aW9uLmM9MzA0Nj12b2lkIGNvbXBhY3Rpb25fdW5yZWdpc3Rlcl9ub2RlKHN0cnVjdCBub2RlICpub2RlKVxcbi0tXFxubW0vY29tcGFjdGlvbi5jLTMwNDktfVxcbm1tL2NvbXBhY3Rpb24uYzozMDUwOiNlbmRpZiAvKiBDT05GSUdfU1lTRlMgXFx1MDAyNlxcdTAwMjYgQ09ORklHX05VTUEgKi9cXG5tbS9jb21wYWN0aW9uLmMtMzA1MS1cXG4tLVxcbm1tL2RhbW9uL2NvcmUuYz0yODkzPXN0YXRpYyBpbmxpbmUgdTY0IGRhbW9zX2dldF9zb21lX21lbV9wc2lfdG90YWwodm9pZClcXG4tLVxcbm1tL2RhbW9uL2NvcmUuYy0yODk5LVxcbm1tL2RhbW9uL2NvcmUuYzoyOTAwOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2RhbW9uL2NvcmUuYy0yOTAxLXN0YXRpYyBib29sIGludmFsaWRfbWVtX25vZGUoaW50IG5pZClcXG4tLVxcbm1tL2RhbW9uL2NvcmUuYz0zMDgxPXN0YXRpYyB1bnNpZ25lZCBsb25nIGRhbW9zX2dldF9ub2RlX2VsaWdpYmxlX21lbV9icChzdHJ1Y3QgZGFtb25fY3R4ICpjLFxcbi0tXFxubW0vZGFtb24vY29yZS5jLTMwODYtI2VuZGlmIC8qIENPTkZJR19EQU1PTl9QQUREUiAqL1xcbm1tL2RhbW9uL2NvcmUuYzozMDg3OiNlbHNlIC8qIENPTkZJR19OVU1BICovXFxubW0vZGFtb24vY29yZS5jLTMwODgtc3RhdGljIF9fa2VybmVsX3Vsb25nX3QgZGFtb3NfZ2V0X25vZGVfbWVtX2JwKFxcbi0tXFxubW0vZGFtb24vY29yZS5jPTMxMDA9c3RhdGljIHVuc2lnbmVkIGxvbmcgZGFtb3NfZ2V0X25vZGVfZWxpZ2libGVfbWVtX2JwKHN0cnVjdCBkYW1vbl9jdHggKmMsXFxuLS1cXG5tbS9kYW1vbi9jb3JlLmMtMzEwNC19XFxubW0vZGFtb24vY29yZS5jOjMxMDU6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxubW0vZGFtb24vY29yZS5jLTMxMDYtXFxuLS1cXG5tbS9kZWJ1Zy5jPTE3MT12b2lkIGR1bXBfbW0oY29uc3Qgc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuLS1cXG5tbS9kZWJ1Zy5jLTE5MS0jZW5kaWZcXG5tbS9kZWJ1Zy5jOjE5MjojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vZGVidWcuYy0xOTMtXFx0XFx0XFxcIm51bWFfbmV4dF9zY2FuICVsdSBudW1hX3NjYW5fb2Zmc2V0ICVsdSBudW1hX3NjYW5fc2VxICVkXFxcXG5cXFwiXFxuLS1cXG5tbS9kZWJ1Zy5jLTIyMC0jZW5kaWZcXG5tbS9kZWJ1Zy5jOjIyMTojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vZGVidWcuYy0yMjItXFx0XFx0bW0tXFx1MDAzZW51bWFfbmV4dF9zY2FuLCBtbS1cXHUwMDNlbnVtYV9zY2FuX29mZnNldCwgbW0tXFx1MDAzZW51bWFfc2Nhbl9zZXEsXFxuLS1cXG5tbS9maWxlbWFwLmM9OTk2PUVYUE9SVF9TWU1CT0xfR1BMKGZpbGVtYXBfYWRkX2ZvbGlvKTtcXG5tbS9maWxlbWFwLmMtOTk3LVxcbm1tL2ZpbGVtYXAuYzo5OTg6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vZmlsZW1hcC5jLTk5OS1zdHJ1Y3QgZm9saW8gKmZpbGVtYXBfYWxsb2NfZm9saW9fbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxcbi0tXFxubW0vaHVnZXRsYi5jPTIyMzg9c3RhdGljIG5vZGVtYXNrX3QgKnBvbGljeV9tYmluZF9ub2RlbWFzayhnZnBfdCBnZnApXFxubW0vaHVnZXRsYi5jLTIyMzkte1xcbm1tL2h1Z2V0bGIuYzoyMjQwOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGIuYy0yMjQxLVxcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7XFxuLS1cXG5tbS9odWdldGxiLmM9Mjk3Nz1zdHJ1Y3QgZm9saW8gKmFsbG9jX2h1Z2V0bGJfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdldGxiLmMtMzA1Mi1cXHRcXHQubmlkID0gbmlkLFxcbm1tL2h1Z2V0bGIuYzozMDUzOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGIuYy0zMDU0LVxcdFxcdC5tb2RlID0gbXBvbCA/IG1wb2wtXFx1MDAzZW1vZGUgOiBNUE9MX0RFRkFVTFQsXFxuLS1cXG5tbS9odWdldGxiX2NtYS5jPTI2PXN0YXRpYyB1bnNpZ25lZCBpbnQgaHVnZXRsYl9jbWFfcGVyY2VudF9pbl9ub2RlW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTtcXG5tbS9odWdldGxiX2NtYS5jLTI3LVxcbm1tL2h1Z2V0bGJfY21hLmM6Mjg6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaHVnZXRsYl9jbWEuYy0yOS1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IG1lbWJsb2NrX25vZGVfbWVtb3J5X3NpemUoaW50IG5pZClcXG4tLVxcbm1tL2h1Z2V0bGJfc3lzY3RsLmM9NTM9c3RhdGljIGludCBodWdldGxiX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXFxuLS1cXG5tbS9odWdldGxiX3N5c2N0bC5jLTYwLVxcbm1tL2h1Z2V0bGJfc3lzY3RsLmM6NjE6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaHVnZXRsYl9zeXNjdGwuYy02Mi1zdGF0aWMgaW50IGh1Z2V0bGJfbWVtcG9saWN5X3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXFxuLS1cXG5tbS9odWdldGxiX3N5c2N0bC5jLTY3LX1cXG5tbS9odWdldGxiX3N5c2N0bC5jOjY4OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xcbm1tL2h1Z2V0bGJfc3lzY3RsLmMtNjktXFxuLS1cXG5tbS9odWdldGxiX3N5c2N0bC5jPTk5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIGh1Z2V0bGJfdGFibGVbXSA9IHtcXG4tLVxcbm1tL2h1Z2V0bGJfc3lzY3RsLmMtMTA2LVxcdH0sXFxubW0vaHVnZXRsYl9zeXNjdGwuYzoxMDc6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaHVnZXRsYl9zeXNjdGwuYy0xMDgtXFx0e1xcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jPTg2PUhTVEFURV9BVFRSKG5yX2h1Z2VwYWdlcyk7XFxubW0vaHVnZXRsYl9zeXNmcy5jLTg3LVxcbm1tL2h1Z2V0bGJfc3lzZnMuYzo4ODojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9odWdldGxiX3N5c2ZzLmMtODktXFxuLS1cXG5tbS9odWdldGxiX3N5c2ZzLmM9MjgwPXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpoc3RhdGVfYXR0cnNbXSA9IHtcXG4tLVxcbm1tL2h1Z2V0bGJfc3lzZnMuYy0yODUtXFx0XFx1MDAyNnN1cnBsdXNfaHVnZXBhZ2VzX2F0dHIuYXR0cixcXG5tbS9odWdldGxiX3N5c2ZzLmM6Mjg2OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGJfc3lzZnMuYy0yODctXFx0XFx1MDAyNm5yX2h1Z2VwYWdlc19tZW1wb2xpY3lfYXR0ci5hdHRyLFxcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jPTMwNj1zdGF0aWMgaW50IGh1Z2V0bGJfc3lzZnNfYWRkX2hzdGF0ZShzdHJ1Y3QgaHN0YXRlICpoLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LFxcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jLTMzOC1cXG5tbS9odWdldGxiX3N5c2ZzLmM6MzM5OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGJfc3lzZnMuYy0zNDAtc3RhdGljIGJvb2wgaHVnZXRsYl9zeXNmc19pbml0aWFsaXplZCBfX3JvX2FmdGVyX2luaXQ7XFxuLS1cXG5tbS9odWdldGxiX3N5c2ZzLmM9NDYxPXN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX3JlZ2lzdGVyX2FsbF9ub2Rlcyh2b2lkKVxcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jLTQ2Ny19XFxubW0vaHVnZXRsYl9zeXNmcy5jOjQ2ODojZWxzZVxcdC8qICFDT05GSUdfTlVNQSAqL1xcbm1tL2h1Z2V0bGJfc3lzZnMuYy00NjktXFxuLS1cXG5tbS9odWdldGxiX3N5c2ZzLmM9NDgyPXZvaWQgX19pbml0IGh1Z2V0bGJfc3lzZnNfaW5pdCh2b2lkKVxcbi0tXFxubW0vaHVnZXRsYl9zeXNmcy5jLTQ5Ny1cXG5tbS9odWdldGxiX3N5c2ZzLmM6NDk4OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2h1Z2V0bGJfc3lzZnMuYy00OTktXFx0aHVnZXRsYl9zeXNmc19pbml0aWFsaXplZCA9IHRydWU7XFxuLS1cXG5tbS9pbnRlcm5hbC5oPTc2PXVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9pbnRlcm5hbC5oLTgxLVxcbm1tL2ludGVybmFsLmg6ODI6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaW50ZXJuYWwuaC04My1leHRlcm4gaW50IHN5c2N0bF9taW5fdW5tYXBwZWRfcmF0aW87XFxuLS1cXG5tbS9pbnRlcm5hbC5oPTExMjg9c3RhdGljIGlubGluZSB2b2lkIG1sb2NrX2RyYWluX3JlbW90ZShpbnQgY3B1KSB7IH1cXG4tLVxcbm1tL2ludGVybmFsLmgtMTEzMC1cXG5tbS9pbnRlcm5hbC5oOjExMzE6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vaW50ZXJuYWwuaC0xMTMyLWV4dGVybiBpbnQgbm9kZV9yZWNsYWltX21vZGU7XFxuLS1cXG5tbS9pbnRlcm5hbC5oPTEyMzk9c3RhdGljIGlubGluZSBib29sIHZtYV9pc19zaW5nbGVfdGhyZWFkZWRfcHJpdmF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG4tLVxcbm1tL2ludGVybmFsLmgtMTI0Ni1cXG5tbS9pbnRlcm5hbC5oOjEyNDc6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xcbm1tL2ludGVybmFsLmgtMTI0OC1ib29sIGZvbGlvX2Nhbl9tYXBfcHJvdF9udW1hKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTEwMjc9c3RhdGljIGlubGluZSBnZnBfdCBhbGxvY19odWdlcGFnZV9raHVnZXBhZ2VkX2dmcG1hc2sodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDMxLVxcbm1tL2todWdlcGFnZWQuYzoxMDMyOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2todWdlcGFnZWQuYy0xMDMzLXN0YXRpYyBpbnQgY29sbGFwc2VfZmluZF90YXJnZXRfbm9kZShzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuLS1cXG5tbS9rc20uYy01MC1cXG5tbS9rc20uYzo1MTojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9rc20uYy01Mi0jZGVmaW5lIE5VTUEoeClcXHRcXHQoeClcXG4tLVxcbm1tL2tzbS5jPTE1OT1zdHJ1Y3Qga3NtX3N0YWJsZV9ub2RlIHtcXG4tLVxcbm1tL2tzbS5jLTE4MS1cXHRpbnQgcm1hcF9obGlzdF9sZW47XFxubW0va3NtLmM6MTgyOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2tzbS5jLTE4My1cXHRpbnQgbmlkO1xcbi0tXFxubW0va3NtLmM9MjAyPXN0cnVjdCBrc21fcm1hcF9pdGVtIHtcXG4tLVxcbm1tL2tzbS5jLTIwNS1cXHRcXHRzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hO1xcdC8qIGZvciByZXZlcnNlIG1hcHBpbmcsIHdoZW4gc3RhYmxlICovXFxubW0va3NtLmM6MjA2OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL2tzbS5jLTIwNy1cXHRcXHRpbnQgbmlkO1xcdFxcdC8qIHdoZW4gbm9kZSBvZiB1bnN0YWJsZSB0cmVlICovXFxuLS1cXG5tbS9rc20uYz00Njk9c3RhdGljIHZvaWQgYWR2aXNvcl9zdG9wX3NjYW4odm9pZClcXG4tLVxcbm1tL2tzbS5jLTQ3NC1cXG5tbS9rc20uYzo0NzU6I2lmZGVmIENPTkZJR19OVU1BXFxubW0va3NtLmMtNDc2LS8qIFplcm9lZCB3aGVuIG1lcmdpbmcgYWNyb3NzIG5vZGVzIGlzIG5vdCBhbGxvd2VkICovXFxuLS1cXG5tbS9rc20uYz04NTc9c3RhdGljIHN0cnVjdCBrc21fc3RhYmxlX25vZGUgKmFsbG9jX3N0YWJsZV9ub2RlX2NoYWluKHN0cnVjdCBrc21fc3RhYmxlX25vZGUgKmR1cCxcXG4tLVxcbm1tL2tzbS5jLTg2NS1cXHRcXHRjaGFpbi1cXHUwMDNlcm1hcF9obGlzdF9sZW4gPSBTVEFCTEVfTk9ERV9DSEFJTjtcXG5tbS9rc20uYzo4NjY6I2lmIGRlZmluZWQgKENPTkZJR19ERUJVR19WTSkgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfTlVNQSlcXG5tbS9rc20uYy04NjctXFx0XFx0Y2hhaW4tXFx1MDAzZW5pZCA9IE5VTUFfTk9fTk9ERTsgLyogZGVidWcgKi9cXG4tLVxcbm1tL2tzbS5jPTM1OTU9S1NNX0FUVFIocnVuKTtcXG5tbS9rc20uYy0zNTk2LVxcbm1tL2tzbS5jOjM1OTc6I2lmZGVmIENPTkZJR19OVU1BXFxubW0va3NtLmMtMzU5OC1zdGF0aWMgc3NpemVfdCBtZXJnZV9hY3Jvc3Nfbm9kZXNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaixcXG4tLVxcbm1tL2tzbS5jPTM5ODE9c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmtzbV9hdHRyc1tdID0ge1xcbi0tXFxubW0va3NtLmMtMzk5Mi1cXHRcXHUwMDI2ZnVsbF9zY2Fuc19hdHRyLmF0dHIsXFxubW0va3NtLmM6Mzk5MzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9rc20uYy0zOTk0LVxcdFxcdTAwMjZtZXJnZV9hY3Jvc3Nfbm9kZXNfYXR0ci5hdHRyLFxcbi0tXFxubW0vbWVtYmxvY2suYy0xMDUtXFxubW0vbWVtYmxvY2suYzoxMDY6I2lmbmRlZiBDT05GSUdfTlVNQVxcbm1tL21lbWJsb2NrLmMtMTA3LXN0cnVjdCBwZ2xpc3RfZGF0YSBfX3JlZmRhdGEgY29udGlnX3BhZ2VfZGF0YTtcXG4tLVxcbm1tL21lbWJsb2NrLmM9NjEwPXN0YXRpYyBpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FkZF9yYW5nZShzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSxcXG4tLVxcbm1tL21lbWJsb2NrLmMtNjY2LVxcdFxcdGlmIChyYmFzZSBcXHUwMDNlIGJhc2UpIHtcXG5tbS9tZW1ibG9jay5jOjY2NzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tZW1ibG9jay5jLTY2OC1cXHRcXHRcXHRXQVJOX09OKG5pZCAhPSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSk7XFxuLS1cXG5tbS9tZW1ibG9jay5jPTE0ODk9aW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19zZXRfbm9kZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplLFxcbi0tXFxubW0vbWVtYmxvY2suYy0xNDkxLXtcXG5tbS9tZW1ibG9jay5jOjE0OTI6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbWVtYmxvY2suYy0xNDkzLVxcdGludCBzdGFydF9yZ24sIGVuZF9yZ247XFxuLS1cXG5tbS9tZW1ibG9jay5jPTIxOTI9c3RhdGljIHZvaWQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2R1bXAoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUpXFxuLS1cXG5tbS9tZW1ibG9jay5jLTIyMDctXFx0XFx0ZmxhZ3MgPSByZ24tXFx1MDAzZWZsYWdzO1xcbm1tL21lbWJsb2NrLmM6MjIwODojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tZW1ibG9jay5jLTIyMDktXFx0XFx0aWYgKG51bWFfdmFsaWRfbm9kZShtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSkpXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTY5OT1zdGF0aWMgc3NpemVfdCBtZW1fY2dyb3VwX3Jlc2V0KHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqYnVmLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE3MzUtXFxubW0vbWVtY29udHJvbC12MS5jOjE3MzY6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbWVtY29udHJvbC12MS5jLTE3MzctXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTc4MD1zdGF0aWMgaW50IG1lbWNnX251bWFfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODIzLX1cXG5tbS9tZW1jb250cm9sLXYxLmM6MTgyNDojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG5tbS9tZW1jb250cm9sLXYxLmMtMTgyNS1cXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0yMDI4PXN0cnVjdCBjZnR5cGUgbWVtX2Nncm91cF9sZWdhY3lfZmlsZXNbXSA9IHtcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0yMDkzLVxcdH0sXFxubW0vbWVtY29udHJvbC12MS5jOjIwOTQ6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbWVtY29udHJvbC12MS5jLTIwOTUtXFx0e1xcbi0tXFxubW0vbWVtY29udHJvbC5jPTM3OD1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1lbWNnX25vZGVfc3RhdF9pdGVtc1tdID0ge1xcbi0tXFxubW0vbWVtY29udHJvbC5jLTQwOS0jZW5kaWZcXG5tbS9tZW1jb250cm9sLmM6NDEwOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tZW1jb250cm9sLmMtNDExLVxcdFBHUFJPTU9URV9TVUNDRVNTLFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTU5OD1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1lbWNnX3ZtX2V2ZW50X3N0YXRbXSA9IHtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy02MjUtI2VuZGlmXFxubW0vbWVtY29udHJvbC5jOjYyNjojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vbWVtY29udHJvbC5jLTYyNy1cXHROVU1BX1BBR0VfTUlHUkFURSxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0xNTkxPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWVtb3J5X3N0YXQgbWVtb3J5X3N0YXRzW10gPSB7XFxuLS1cXG5tbS9tZW1jb250cm9sLmMtMTY1MC1cXHR7IFxcXCJwZ3JlZmlsbFxcXCIsXFx0XFx0XFx0UEdSRUZJTExcXHRcXHR9LFxcbm1tL21lbWNvbnRyb2wuYzoxNjUxOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tZW1jb250cm9sLmMtMTY1Mi1cXHR7IFxcXCJwZ3Byb21vdGVfc3VjY2Vzc1xcXCIsXFx0XFx0UEdQUk9NT1RFX1NVQ0NFU1NcXHR9LFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTE2NzM9c3RhdGljIGludCBtZW1jZ19wYWdlX3N0YXRlX291dHB1dF91bml0KGludCBpdGVtKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTE3MDItXFx0Y2FzZSBQR1JFRklMTDpcXG5tbS9tZW1jb250cm9sLmM6MTcwMzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vbWVtY29udHJvbC5jLTE3MDQtXFx0Y2FzZSBQR1BST01PVEVfU1VDQ0VTUzpcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz01MDMxPWludCBtZW1vcnlfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy01MDQ1LVxcbm1tL21lbWNvbnRyb2wuYzo1MDQ2OiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL21lbWNvbnRyb2wuYy01MDQ3LXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBscnV2ZWNfcGFnZV9zdGF0ZV9vdXRwdXQoc3RydWN0IGxydXZlYyAqbHJ1dmVjLFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTUxMjg9c3RhdGljIHN0cnVjdCBjZnR5cGUgbWVtb3J5X2ZpbGVzW10gPSB7XFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNTE4MS1cXHR9LFxcbm1tL21lbWNvbnRyb2wuYzo1MTgyOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL21lbWNvbnRyb2wuYy01MTgzLVxcdHtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTQ5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVzX3R5cGUgbWVtb3J5X3RpZXJfc3Vic3lzID0ge1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtNTMtXFxubW0vbWVtb3J5LXRpZXJzLmM6NTQ6I2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lOR1xcbm1tL21lbW9yeS10aWVycy5jLTU1LS8qKlxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9NjU9Ym9vbCBmb2xpb191c2VfYWNjZXNzX3RpbWUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTcxLVxcbm1tL21lbW9yeS10aWVycy5jOjcyOiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5tbS9tZW1vcnktdGllcnMuYy03My1zdGF0aWMgaW50IHRvcF90aWVyX2FkaXN0YW5jZTtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTEzMT1zdGF0aWMgc3RydWN0IGRlbW90aW9uX25vZGVzICpub2RlX2RlbW90aW9uIF9fcmVhZF9tb3N0bHk7XFxubW0vbWVtb3J5LXRpZXJzLmM6MTMyOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9NSUdSQVRJT04gKi9cXG5tbS9tZW1vcnktdGllcnMuYy0xMzMtXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYz0yNjA9c3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqX19ub2RlX2dldF9tZW1vcnlfdGllcihpbnQgbm9kZSlcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTI3NS1cXG5tbS9tZW1vcnktdGllcnMuYzoyNzY6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTI3Ny1ib29sIG5vZGVfaXNfdG9wdGllcihpbnQgbm9kZSlcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTUyMT1zdGF0aWMgaW5saW5lIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZCkge31cXG5tbS9tZW1vcnktdGllcnMuYzo1MjI6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xcbm1tL21lbW9yeS10aWVycy5jLTUyMy1cXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTkwNj1zdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfdGllcl9pbml0KHZvaWQpXFxuLS1cXG5tbS9tZW1vcnktdGllcnMuYy05MTMtXFxubW0vbWVtb3J5LXRpZXJzLmM6OTE0OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5tbS9tZW1vcnktdGllcnMuYy05MTUtXFx0bm9kZV9kZW1vdGlvbiA9IGt6YWxsb2Nfb2JqcyhzdHJ1Y3QgZGVtb3Rpb25fbm9kZXMsIG5yX25vZGVfaWRzKTtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTkzOT1ib29sIG51bWFfZGVtb3Rpb25fZW5hYmxlZCA9IGZhbHNlO1xcbm1tL21lbW9yeS10aWVycy5jLTk0MC1cXG5tbS9tZW1vcnktdGllcnMuYzo5NDE6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbW9yeS10aWVycy5jLTk0Mi0jaWZkZWYgQ09ORklHX1NZU0ZTXFxuLS1cXG5tbS9tZW1vcnkuYz02MTE3PWludCBudW1hX21pZ3JhdGVfY2hlY2soc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2ZhdWx0ICp2bWYsXFxuLS1cXG5tbS9tZW1vcnkuYy02MTUyLVxcdGNvdW50X3ZtX251bWFfZXZlbnQoTlVNQV9ISU5UX0ZBVUxUUyk7XFxubW0vbWVtb3J5LmM6NjE1MzojaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HXFxubW0vbWVtb3J5LmMtNjE1NC1cXHRjb3VudF9tZW1jZ19mb2xpb19ldmVudHMoZm9saW8sIE5VTUFfSElOVF9GQVVMVFMsIDEpO1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xODY9TU9EVUxFX1BBUk1fREVTQyhhdXRvX21vdmFibGVfcmF0aW8sXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5Mi0gKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE5MzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5NC1zdGF0aWMgYm9vbCBhdXRvX21vdmFibGVfbnVtYV9hd2FyZSBfX3JlYWRfbW9zdGx5ID0gdHJ1ZTtcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTk2PU1PRFVMRV9QQVJNX0RFU0MoYXV0b19tb3ZhYmxlX251bWFfYXdhcmUsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5OC1cXHRcXHRcXFwiXFxcXFxcXCJhdXRvLW1vdmFibGVcXFxcXFxcIiBvbmxpbmUgcG9saWN5LiBEZWZhdWx0OiB0cnVlXFxcIik7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxOTk6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMDAtXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTk2MD1zdGF0aWMgc3RydWN0IHpvbmUgKmF1dG9fbW92YWJsZV96b25lX2Zvcl9wZm4oaW50IG5pZCxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAwOS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEwMTA6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDExLVxcdGlmIChhdXRvX21vdmFibGVfbnVtYV9hd2FyZSBcXHUwMDI2XFx1MDAyNlxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDEzLVxcdFxcdGdvdG8ga2VybmVsX3pvbmU7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMDE0OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxNS1cXG4tLVxcbm1tL21lbXBvbGljeS5jPTc5Mz1zdGF0aWMgaW50IHF1ZXVlX2ZvbGlvc19odWdldGxiKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgaG1hc2ssXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy04NDItXFxubW0vbWVtcG9saWN5LmM6ODQzOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tZW1wb2xpY3kuYy04NDQtLyoqXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz05MTI9dW5zaWduZWQgbG9uZyBjaGFuZ2VfcHJvdF9udW1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtOTI5LX1cXG5tbS9tZW1wb2xpY3kuYzo5MzA6I2VuZGlmIC8qIENPTkZJR19OVU1BX0JBTEFOQ0lORyAqL1xcbm1tL21lbXBvbGljeS5jLTkzMS1cXG4tLVxcbm1tL21lbXBvbGljeS5jPTEyMDc9c3RhdGljIGxvbmcgZG9fZ2V0X21lbXBvbGljeShpbnQgKnBvbGljeSwgbm9kZW1hc2tfdCAqbm1hc2ssXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMzA3LVxcbm1tL21lbXBvbGljeS5jOjEzMDg6I2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxcbm1tL21lbXBvbGljeS5jLTEzMDktc3RhdGljIGJvb2wgbWlncmF0ZV9mb2xpb19hZGQoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IGxpc3RfaGVhZCAqZm9saW9saXN0LFxcbi0tXFxubW0vbWVtcG9saWN5LmM9MzM3NT1FWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5LCBcXFwia3ZtXFxcIik7XFxubW0vbWVtcG9saWN5LmMtMzM3Ni1cXG5tbS9tZW1wb2xpY3kuYzozMzc3OiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tZW1wb2xpY3kuYy0zMzc4LXN0YXRpYyBpbnQgX19pbml0ZGF0YSBudW1hYmFsYW5jaW5nX292ZXJyaWRlO1xcbi0tXFxubW0vbWVtcG9saWN5LmM9MzM4MD1zdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfbnVtYWJhbGFuY2luZ19lbmFibGUodm9pZClcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMzODMtXFxubW0vbWVtcG9saWN5LmM6MzM4NDpcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQV9CQUxBTkNJTkdfREVGQVVMVF9FTkFCTEVEKSlcXG5tbS9tZW1wb2xpY3kuYy0zMzg1LVxcdFxcdG51bWFiYWxhbmNpbmdfZGVmYXVsdCA9IHRydWU7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0zNDE5PXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgY2hlY2tfbnVtYWJhbGFuY2luZ19lbmFibGUodm9pZClcXG4tLVxcbm1tL21lbXBvbGljeS5jLTM0MjEtfVxcbm1tL21lbXBvbGljeS5jOjM0MjI6I2VuZGlmIC8qIENPTkZJR19OVU1BX0JBTEFOQ0lORyAqL1xcbm1tL21lbXBvbGljeS5jLTM0MjMtXFxuLS1cXG5tbS9taWdyYXRlLmM9MjE5Nz1zdHJ1Y3QgZm9saW8gKmFsbG9jX21pZ3JhdGlvbl90YXJnZXQoc3RydWN0IGZvbGlvICpzcmMsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSlcXG4tLVxcbm1tL21pZ3JhdGUuYy0yMjM1LVxcbm1tL21pZ3JhdGUuYzoyMjM2OiNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5tbS9taWdyYXRlLmMtMjIzNy1zdGF0aWMgaW50IHN0b3JlX3N0YXR1cyhpbnQgX191c2VyICpzdGF0dXMsIGludCBzdGFydCwgaW50IHZhbHVlLCBpbnQgbnIpXFxuLS1cXG5tbS9taWdyYXRlLmM9MjYzMz1TWVNDQUxMX0RFRklORTYobW92ZV9wYWdlcywgcGlkX3QsIHBpZCwgdW5zaWduZWQgbG9uZywgbnJfcGFnZXMsXFxuLS1cXG5tbS9taWdyYXRlLmMtMjYzOS19XFxubW0vbWlncmF0ZS5jOjI2NDA6I2VuZGlmIC8qIENPTkZJR19OVU1BX01JR1JBVElPTiAqL1xcbm1tL21pZ3JhdGUuYy0yNjQxLVxcbm1tL21pZ3JhdGUuYzoyNjQyOiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9taWdyYXRlLmMtMjY0My0vKlxcbi0tXFxubW0vbWlncmF0ZS5jPTI3NTU9aW50IG1pZ3JhdGVfbWlzcGxhY2VkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBub2RlKVxcbi0tXFxubW0vbWlncmF0ZS5jLTI3ODEtfVxcbm1tL21pZ3JhdGUuYzoyNzgyOiNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi9cXG4tLVxcbm1tL21tX2luaXQuYy00NS1cXG5tbS9tbV9pbml0LmM6NDY6I2lmbmRlZiBDT05GSUdfTlVNQVxcbm1tL21tX2luaXQuYy00Ny11bnNpZ25lZCBsb25nIG1heF9tYXBucjtcXG4tLVxcbm1tL21tX2luaXQuYz01OTY9dm9pZCBfX21lbWluaXQgX19pbml0X3NpbmdsZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHBmbixcXG4tLVxcbm1tL21tX2luaXQuYy02MTMtXFxubW0vbW1faW5pdC5jOjYxNDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tbV9pbml0LmMtNjE1LS8qXFxuLS1cXG5tbS9tbV9pbml0LmM9Njc4PXN0YXRpYyBpbmxpbmUgdm9pZCBmaXh1cF9oYXNoZGlzdCh2b2lkKSB7fVxcbm1tL21tX2luaXQuYzo2Nzk6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxubW0vbW1faW5pdC5jLTY4MC1cXG4tLVxcbm1tL21tem9uZS5jPTQ2PXN0YXRpYyBpbmxpbmUgaW50IHpyZWZfaW5fbm9kZW1hc2soc3RydWN0IHpvbmVyZWYgKnpyZWYsXFxuLS1cXG5tbS9tbXpvbmUuYy00OC17XFxubW0vbW16b25lLmM6NDk6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vbW16b25lLmMtNTAtXFx0cmV0dXJuIG5vZGVfaXNzZXQoem9uZWxpc3Rfbm9kZV9pZHgoenJlZiksICpub2Rlcyk7XFxuLS1cXG5tbS9tbXpvbmUuYy01Mi1cXHRyZXR1cm4gMTtcXG5tbS9tbXpvbmUuYzo1MzojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG5tbS9tbXpvbmUuYy01NC19XFxuLS1cXG5tbS9tbXpvbmUuYz03Nj12b2lkIGxydXZlY19pbml0KHN0cnVjdCBscnV2ZWMgKmxydXZlYylcXG4tLVxcbm1tL21tem9uZS5jLTk3LVxcbm1tL21tem9uZS5jOjk4OiNpZiBkZWZpbmVkKENPTkZJR19OVU1BX0JBTEFOQ0lORykgXFx1MDAyNlxcdTAwMjYgIWRlZmluZWQoTEFTVF9DUFVQSURfTk9UX0lOX1BBR0VfRkxBR1MpXFxubW0vbW16b25lLmMtOTktaW50IGZvbGlvX3hjaGdfbGFzdF9jcHVwaWQoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IGNwdXBpZClcXG4tLVxcbm1tL21wcm90ZWN0LmM9Njg2PWxvbmcgY2hhbmdlX3Byb3RlY3Rpb24oc3RydWN0IG1tdV9nYXRoZXIgKnRsYixcXG4tLVxcbm1tL21wcm90ZWN0LmMtNzAzLVxcbm1tL21wcm90ZWN0LmM6NzA0OiNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkdcXG5tbS9tcHJvdGVjdC5jLTcwNS1cXHQvKlxcbi0tXFxubW0vbnVtYV9tZW1ibGtzLmM9NTA2PWludCBfX2luaXQgbnVtYV9maWxsX21lbWJsa3ModTY0IHN0YXJ0LCB1NjQgZW5kKVxcbi0tXFxubW0vbnVtYV9tZW1ibGtzLmMtNTU1LVxcbm1tL251bWFfbWVtYmxrcy5jOjU1NjojaWZkZWYgQ09ORklHX05VTUFfS0VFUF9NRU1JTkZPXFxubW0vbnVtYV9tZW1ibGtzLmMtNTU3LXN0YXRpYyBpbnQgbWVtaW5mb190b19uaWQoc3RydWN0IG51bWFfbWVtaW5mbyAqbWksIHU2NCBzdGFydClcXG4tLVxcbm1tL251bWFfbWVtYmxrcy5jPTU5MT1FWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7XFxubW0vbnVtYV9tZW1ibGtzLmMtNTkyLVxcbm1tL251bWFfbWVtYmxrcy5jOjU5MzojZW5kaWYgLyogQ09ORklHX05VTUFfS0VFUF9NRU1JTkZPICovXFxuLS1cXG5tbS9vb21fa2lsbC5jPTcyPXN0YXRpYyBpbmxpbmUgYm9vbCBpc19tZW1jZ19vb20oc3RydWN0IG9vbV9jb250cm9sICpvYylcXG4tLVxcbm1tL29vbV9raWxsLmMtNzYtXFxubW0vb29tX2tpbGwuYzo3NzojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9vb21fa2lsbC5jLTc4LS8qKlxcbi0tXFxubW0vb29tX2tpbGwuYz0xMjI9c3RhdGljIGJvb2wgb29tX2NwdXNldF9lbGlnaWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IG9vbV9jb250cm9sICpvYylcXG4tLVxcbm1tL29vbV9raWxsLmMtMTI1LX1cXG5tbS9vb21fa2lsbC5jOjEyNjojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG5tbS9vb21fa2lsbC5jLTEyNy1cXG4tLVxcbm1tL29vbV9raWxsLmM9MjQ5PXN0YXRpYyBlbnVtIG9vbV9jb25zdHJhaW50IGNvbnN0cmFpbmVkX2FsbG9jKHN0cnVjdCBvb21fY29udHJvbCAqb2MpXFxuLS1cXG5tbS9vb21fa2lsbC5jLTI2NC1cXG5tbS9vb21fa2lsbC5jOjI2NTpcXHRpZiAoIUlTX0VOQUJMRUQoQ09ORklHX05VTUEpKVxcbm1tL29vbV9raWxsLmMtMjY2LVxcdFxcdHJldHVybiBDT05TVFJBSU5UX05PTkU7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MTY3PUVYUE9SVF9QRVJfQ1BVX1NZTUJPTChudW1hX25vZGUpO1xcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTE2OS1cXG5tbS9wYWdlX2FsbG9jLmM6MTcwOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL3BhZ2VfYWxsb2MuYy0xNzEtREVGSU5FX1NUQVRJQ19LRVlfVFJVRSh2bV9udW1hX3N0YXRfa2V5KTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0xOTU9bm9kZW1hc2tfdCBub2RlX3N0YXRlc1tOUl9OT0RFX1NUQVRFU10gX19yZWFkX21vc3RseSA9IHtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy0xOTctXFx0W05fT05MSU5FXSA9IHsgeyBbMF0gPSAxVUwgfSB9LFxcbm1tL3BhZ2VfYWxsb2MuYzoxOTg6I2lmbmRlZiBDT05GSUdfTlVNQVxcbm1tL3BhZ2VfYWxsb2MuYy0xOTktXFx0W05fTk9STUFMX01FTU9SWV0gPSB7IHsgWzBdID0gMVVMIH0gfSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0yNTU4PWJvb2wgZGVjYXlfcGNwX2hpZ2goc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3ApXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmMtMjU5MC1cXG5tbS9wYWdlX2FsbG9jLmM6MjU5MTojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9wYWdlX2FsbG9jLmMtMjU5Mi0vKlxcbi0tXFxubW0vcGFnZV9hbGxvYy5jPTMxNzk9c3RhdGljIGlubGluZSB2b2lkIHpvbmVfc3RhdGlzdGljcyhzdHJ1Y3Qgem9uZSAqcHJlZmVycmVkX3pvbmUsIHN0cnVjdCB6b25lICp6LFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTMxODEte1xcbm1tL3BhZ2VfYWxsb2MuYzozMTgyOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL3BhZ2VfYWxsb2MuYy0zMTgzLVxcdGVudW0gbnVtYV9zdGF0X2l0ZW0gbG9jYWxfc3RhdCA9IE5VTUFfTE9DQUw7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9MzY2NT1zdGF0aWMgaW5saW5lIGJvb2wgem9uZV93YXRlcm1hcmtfZmFzdChzdHJ1Y3Qgem9uZSAqeiwgdW5zaWduZWQgaW50IG9yZGVyLFxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTM3MDktXFxubW0vcGFnZV9hbGxvYy5jOjM3MTA6I2lmZGVmIENPTkZJR19OVU1BXFxubW0vcGFnZV9hbGxvYy5jLTM3MTEtaW50IF9fcmVhZF9tb3N0bHkgbm9kZV9yZWNsYWltX2Rpc3RhbmNlID0gUkVDTEFJTV9ESVNUQU5DRTtcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYz0zNzEzPXN0YXRpYyBib29sIHpvbmVfYWxsb3dzX3JlY2xhaW0oc3RydWN0IHpvbmUgKmxvY2FsX3pvbmUsIHN0cnVjdCB6b25lICp6b25lKVxcbi0tXFxubW0vcGFnZV9hbGxvYy5jLTM3MTctfVxcbm1tL3BhZ2VfYWxsb2MuYzozNzE4OiNlbHNlXFx0LyogQ09ORklHX05VTUEgKi9cXG5tbS9wYWdlX2FsbG9jLmMtMzcxOS1zdGF0aWMgYm9vbCB6b25lX2FsbG93c19yZWNsYWltKHN0cnVjdCB6b25lICpsb2NhbF96b25lLCBzdHJ1Y3Qgem9uZSAqem9uZSlcXG5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDc6NTMuNzU4ODI3NTM4WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI1MTMxNDQxODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6XG5cbioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBndXRzIG9mIGhvdyBLVk0gaGFuZGxlcyBndWVzdCBtZW1vcnksIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AuIEkgbmVlZCB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiBob3cgbWVtb3J5IGZpbGUgZGVzY3JpcHRvcnMgYXJlIGJlaW5nIG1hbmFnZWQsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBjcnVjaWFsIGZ1bmN0aW9ucyBga3ZtX2dtZW1fYmluZF9ub2RlYCBhbmQgYGt2bV9nbWVtX2NyZWF0ZWAuIFVuZGVyc3RhbmRpbmcgdGhlc2UgZnVuY3Rpb25zIGlzIGtleSB0byBzZWVpbmcgaG93IGd1ZXN0IG1lbW9yeSBpcyBhbGxvY2F0ZWQsIGJvdW5kIHRvIHBoeXNpY2FsIG1lbW9yeSwgYW5kIGdlbmVyYWxseSBpbnRlcmFjdGVkIHdpdGggd2l0aGluIHRoZSBLVk0gZnJhbWV3b3JrLiBJIG5lZWQgdG8gdHJhY2UgdGhlIGZsb3csIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IG51YW5jZXMgaW4gaG93IG1lbW9yeSByZWdpb25zIGFyZSBoYW5kbGVkIGFuZCBob3cgYG1lbWZkYHMgYXJlIGxldmVyYWdlZCBmb3IgZ3Vlc3QgbWVtb3J5LiBMZXQncyBzZWUgaG93IGVmZmljaWVudGx5IGFuZCBzZWN1cmVseSB0aGlzIGlzIGFsbCBpbXBsZW1lbnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE5MjYsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowNzo1Ni4yNzE5NzQzNzFaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDE1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDE1OlxcdFxcdC8qXFxuIDQxNjpcXHRcXHQgKiBSZXR1cm4gdGhlIG1lbW9yeSBwb2xpY3kgZm9yIHRoaXMgaW5kZXgsIG9yIE5VTEwgaWYgbm9uZSBpcyBzZXQuXFxuIDQxNzpcXHRcXHQgKlxcbiA0MTg6XFx0XFx0ICogUmV0dXJuaW5nIE5VTEwsIGUuZy4gaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0YXNrJ3MgbWVtb3J5IHBvbGljeSwgaXNcXG4gNDE5OlxcdFxcdCAqIGltcG9ydGFudCBmb3IgdGhlIC5nZXRfcG9saWN5IGtlcm5lbCBBQkk6IGl0IGluZGljYXRlcyB0aGF0IG5vXFxuIDQyMDpcXHRcXHQgKiBleHBsaWNpdCBwb2xpY3kgaGFzIGJlZW4gc2V0IHZpYSBtYmluZCgpIGZvciB0aGlzIG1lbW9yeS4gVGhlIGNhbGxlclxcbiA0MjE6XFx0XFx0ICogY2FuIHRoZW4gcmVwbGFjZSBOVUxMIHdpdGggdGhlIGRlZmF1bHQgbWVtb3J5IHBvbGljeSBpbnN0ZWFkIG9mIHRoZVxcbiA0MjI6XFx0XFx0ICogY3VycmVudCB0YXNrJ3MgbWVtb3J5IHBvbGljeS5cXG4gNDIzOlxcdFxcdCAqL1xcbiA0MjQ6XFx0XFx0cmV0dXJuIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoXFx1MDAyNkdNRU1fSShpbm9kZSktXFx1MDAzZXBvbGljeSwgcGdvZmYpO1xcbiA0MjU6XFx0fVxcbiA0MjY6XFx0XFxuIDQyNzpcXHRzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcXG4gNDI4OlxcdHtcXG4gNDI5OlxcdFxcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcXG4gNDMwOlxcdFxcdG5vZGVtYXNrX3Qgbm9kZXM7XFxuIDQzMTpcXHRcXHRpbnQgZXJyO1xcbiA0MzI6XFx0XFxuIDQzMzpcXHRcXHRpZiAoKHVuc2lnbmVkIGludClub2RlIFxcdTAwM2U9IE1BWF9OVU1OT0RFUylcXG4gNDM0OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA0MzU6XFx0XFxuIDQzNjpcXHRcXHRpbml0X25vZGVtYXNrX29mX25vZGUoXFx1MDAyNm5vZGVzLCBub2RlKTtcXG4gNDM3OlxcdFxcdHBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCBcXHUwMDI2bm9kZXMpO1xcbiA0Mzg6XFx0XFx0aWYgKElTX0VSUihwb2wpKVxcbiA0Mzk6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcXG4gNDQwOlxcdFxcbiA0NDE6XFx0XFx0ZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShcXHUwMDI2R01FTV9JKGlub2RlKS1cXHUwMDNlcG9saWN5LCAwLFxcbiA0NDI6XFx0XFx0XFx0XFx0XFx0XFx0ICBNQVhfTEZTX0ZJTEVTSVpFIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsIHBvbCk7XFxuIDQ0MzpcXHRcXHRtcG9sX3B1dChwb2wpO1xcbiA0NDQ6XFx0XFx0cmV0dXJuIGVycjtcXG4gNDQ1OlxcdH1cXG4gNDQ2OlxcdCNlbHNlXFxuIDQ0NzpcXHRzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcXG4gNDQ4OlxcdHtcXG4gNDQ5OlxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA0NTA6XFx0fVxcbiA0NTE6XFx0I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxuIDQ1MjpcXHRcXG4gNDUzOlxcdHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0ge1xcbiA0NTQ6XFx0XFx0LmZhdWx0XFx0XFx0PSBrdm1fZ21lbV9mYXVsdF91c2VyX21hcHBpbmcsXFxuIDQ1NTpcXHQjaWZkZWYgQ09ORklHX05VTUFcXG4gNDU2OlxcdFxcdC5nZXRfcG9saWN5XFx0PSBrdm1fZ21lbV9nZXRfcG9saWN5LFxcbiA0NTc6XFx0XFx0LnNldF9wb2xpY3lcXHQ9IGt2bV9nbWVtX3NldF9wb2xpY3ksXFxuIDQ1ODpcXHQjZW5kaWZcXG4gNDU5OlxcdH07XFxuIDQ2MDpcXHRcXG4gNDYxOlxcdHN0YXRpYyBpbnQga3ZtX2dtZW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXFxuIDQ2MjpcXHR7XFxuIDQ2MzpcXHRcXHRpZiAoIWt2bV9nbWVtX3N1cHBvcnRzX21tYXAoZmlsZV9pbm9kZShmaWxlKSkpXFxuIDQ2NDpcXHRcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDc6NTYuMjcyMDkwNzkxWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ3Mzc1MTY4NTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgdGV4dCwgcmVuZGVyZWQgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXNzdW1pbmcgSSdtIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6XG5cbioqRGl2aW5nIGludG8gR3Vlc3QgTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBhYm91dCBndWVzdCBtZW1vcnkgbWFuYWdlbWVudCB3aXRoaW4gS1ZNLCBzcGVjaWZpY2FsbHkgdGhlIGBndWVzdF9tZW1mZC5jYCBmaWxlLiBNeSBhdHRlbnRpb24gaXMgZHJhd24gdG8gdGhlIHJlZ2lvbiBhcm91bmQgbGluZXMgNTQwIHRocm91Z2ggNjQ1LiBUaGF0IHN1Z2dlc3RzIHdlJ3JlIGxvb2tpbmcgYXQgYSBjcml0aWNhbCBzZWN0aW9uIOKAkyBtYXliZSBzb21lIGFsbG9jYXRpb24gb3IgZGVhbGxvY2F0aW9uIGxvZ2ljLCBwZXJoYXBzIHJlbGF0ZWQgdG8gbWVtb3J5IGZpbGUgZGVzY3JpcHRvcnMgZm9yIHRoZSBndWVzdC4gTXkgaW5pdGlhbCBoeXBvdGhlc2lzIGlzIHRoYXQgd2UncmUgbGlrZWx5IGRlYWxpbmcgd2l0aCBlaXRoZXI6IHRoZSBoYW5kbGluZyBvZiBzaGFyZWQgbWVtb3J5IHJlZ2lvbnMsIG9yIGd1ZXN0IG1lbW9yeSBtYXBwaW5nL3VubWFwcGluZywgb3IgcGVyaGFwcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZW1vcnktYmFja2VkIGZpbGUgZGVzY3JpcHRvciB3aXRoaW4gdGhlIGd1ZXN0IGNvbnRleHQuIFRoZSBzcGVjaWZpYyBsaW5lcyBzaG91bGQgcmV2ZWFsIHdoaWNoIG9uZS4gSSBhbnRpY2lwYXRlIHRoaXMgc2VjdGlvbiB3b3VsZCBpbnZvbHZlIGludGVyYWN0aW9uIHdpdGggdGhlIFZNTSwgcG9zc2libHkgYXJvdW5kIHBhZ2UgdGFibGVzLCBtZW1vcnkgcmVnaW9ucywgYW5kIGV2ZW50IGhhbmRsaW5nIHRoYXQgaXMgcmVsYXRlZCB0byB0aGF0LiBJJ2xsIG5lZWQgdG8gbG9vayB2ZXJ5IGNsb3NlbHkgYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBiZWluZyBtYW5pcHVsYXRlZCBhbmQgdGhlIGNvbnRyb2wgZmxvdyB0byBmdWxseSB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcuIEkgZXhwZWN0IHRvIGJlIHVzaW5nIG15IGtub3dsZWRnZSBvZiBLVk0gaW50ZXJuYWxzIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB0ZWNobmlxdWVzIHRvIGZ1bGx5IHVuZGVyc3RhbmQgd2hhdCdzIHRha2luZyBwbGFjZSBpbiB0aGVzZSBsaW5lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI5NzIsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjAxLjAwOTYxMDM3MVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzExNzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwidmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1NDAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTQwOlxcdFxcdC5zZXRhdHRyXFx0PSBrdm1fZ21lbV9zZXRhdHRyLFxcbiA1NDE6XFx0fTtcXG4gNTQyOlxcdFxcbiA1NDM6XFx0Ym9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pXFxuIDU0NDpcXHR7XFxuIDU0NTpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTQ2OlxcdH1cXG4gNTQ3OlxcdFxcbiA1NDg6XFx0c3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKVxcbiA1NDk6XFx0e1xcbiA1NTA6XFx0XFx0c3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSBcXFwiW2t2bS1nbWVtXVxcXCI7XFxuIDU1MTpcXHRcXHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xcbiA1NTI6XFx0XFx0c3RydWN0IGlub2RlICppbm9kZTtcXG4gNTUzOlxcdFxcdHN0cnVjdCBmaWxlICpmaWxlO1xcbiA1NTQ6XFx0XFx0aW50IGZkLCBlcnI7XFxuIDU1NTpcXHRcXG4gNTU2OlxcdFxcdGZkID0gZ2V0X3VudXNlZF9mZF9mbGFncygwKTtcXG4gNTU3OlxcdFxcdGlmIChmZCBcXHUwMDNjIDApXFxuIDU1ODpcXHRcXHRcXHRyZXR1cm4gZmQ7XFxuIDU1OTpcXHRcXG4gNTYwOlxcdFxcdGYgPSBremFsbG9jX29iaigqZik7XFxuIDU2MTpcXHRcXHRpZiAoIWYpIHtcXG4gNTYyOlxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuIDU2MzpcXHRcXHRcXHRnb3RvIGVycl9mZDtcXG4gNTY0OlxcdFxcdH1cXG4gNTY1OlxcdFxcbiA1NjY6XFx0XFx0LyogX19mcHV0KCkgd2lsbCB0YWtlIGNhcmUgb2YgZm9wc19wdXQoKS4gKi9cXG4gNTY3OlxcdFxcdGlmICghZm9wc19nZXQoXFx1MDAyNmt2bV9nbWVtX2ZvcHMpKSB7XFxuIDU2ODpcXHRcXHRcXHRlcnIgPSAtRU5PRU5UO1xcbiA1Njk6XFx0XFx0XFx0Z290byBlcnJfZ21lbTtcXG4gNTcwOlxcdFxcdH1cXG4gNTcxOlxcdFxcbiA1NzI6XFx0XFx0aW5vZGUgPSBhbm9uX2lub2RlX21ha2Vfc2VjdXJlX2lub2RlKGt2bV9nbWVtX21udC1cXHUwMDNlbW50X3NiLCBuYW1lLCBOVUxMKTtcXG4gNTczOlxcdFxcdGlmIChJU19FUlIoaW5vZGUpKSB7XFxuIDU3NDpcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKGlub2RlKTtcXG4gNTc1OlxcdFxcdFxcdGdvdG8gZXJyX2ZvcHM7XFxuIDU3NjpcXHRcXHR9XFxuIDU3NzpcXHRcXG4gNTc4OlxcdFxcdGlub2RlLVxcdTAwM2VpX29wID0gXFx1MDAyNmt2bV9nbWVtX2lvcHM7XFxuIDU3OTpcXHRcXHRpbm9kZS1cXHUwMDNlaV9tYXBwaW5nLVxcdTAwM2VhX29wcyA9IFxcdTAwMjZrdm1fZ21lbV9hb3BzO1xcbiA1ODA6XFx0XFx0aW5vZGUtXFx1MDAzZWlfbW9kZSB8PSBTX0lGUkVHO1xcbiA1ODE6XFx0XFx0aW5vZGUtXFx1MDAzZWlfc2l6ZSA9IHNpemU7XFxuIDU4MjpcXHRcXHRtYXBwaW5nX3NldF9nZnBfbWFzayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nLCBHRlBfSElHSFVTRVIpO1xcbiA1ODM6XFx0XFx0bWFwcGluZ19zZXRfaW5hY2Nlc3NpYmxlKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA1ODQ6XFx0XFx0LyogVW5tb3ZhYmxlIG1hcHBpbmdzIGFyZSBzdXBwb3NlZCB0byBiZSBtYXJrZWQgdW5ldmljdGFibGUgYXMgd2VsbC4gKi9cXG4gNTg1OlxcdFxcdFdBUk5fT05fT05DRSghbWFwcGluZ191bmV2aWN0YWJsZShpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKSk7XFxuIDU4NjpcXHRcXG4gNTg3OlxcdFxcdEdNRU1fSShpbm9kZSktXFx1MDAzZWZsYWdzID0gZmxhZ3M7XFxuIDU4ODpcXHRcXG4gNTg5OlxcdFxcdGlmIChmbGFncyBcXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XFxuIDU5MDpcXHRcXHRcXHRlcnIgPSBrdm1fZ21lbV9iaW5kX25vZGUoaW5vZGUsIG5vZGUpO1xcbiA1OTE6XFx0XFx0XFx0aWYgKGVycilcXG4gNTkyOlxcdFxcdFxcdFxcdGdvdG8gZXJyX2lub2RlO1xcbiA1OTM6XFx0XFx0fVxcbiA1OTQ6XFx0XFxuIDU5NTpcXHRcXHRmaWxlID0gYWxsb2NfZmlsZV9wc2V1ZG8oaW5vZGUsIGt2bV9nbWVtX21udCwgbmFtZSwgT19SRFdSLCBcXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XFxuIDU5NjpcXHRcXHRpZiAoSVNfRVJSKGZpbGUpKSB7XFxuIDU5NzpcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKGZpbGUpO1xcbiA1OTg6XFx0XFx0XFx0Z290byBlcnJfaW5vZGU7XFxuIDU5OTpcXHRcXHR9XFxuIDYwMDpcXHRcXG4gNjAxOlxcdFxcdGZpbGUtXFx1MDAzZWZfZmxhZ3MgfD0gT19MQVJHRUZJTEU7XFxuIDYwMjpcXHRcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBmO1xcbiA2MDM6XFx0XFxuIDYwNDpcXHRcXHRrdm1fZ2V0X2t2bShrdm0pO1xcbiA2MDU6XFx0XFx0Zi1cXHUwMDNla3ZtID0ga3ZtO1xcbiA2MDY6XFx0XFx0eGFfaW5pdChcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MpO1xcbiA2MDc6XFx0XFx0bGlzdF9hZGQoXFx1MDAyNmYtXFx1MDAzZWVudHJ5LCBcXHUwMDI2R01FTV9JKGlub2RlKS1cXHUwMDNlZ21lbV9maWxlX2xpc3QpO1xcbiA2MDg6XFx0XFxuIDYwOTpcXHRcXHRmZF9pbnN0YWxsKGZkLCBmaWxlKTtcXG4gNjEwOlxcdFxcdHJldHVybiBmZDtcXG4gNjExOlxcdFxcbiA2MTI6XFx0ZXJyX2lub2RlOlxcbiA2MTM6XFx0XFx0aXB1dChpbm9kZSk7XFxuIDYxNDpcXHRlcnJfZm9wczpcXG4gNjE1OlxcdFxcdGZvcHNfcHV0KFxcdTAwMjZrdm1fZ21lbV9mb3BzKTtcXG4gNjE2OlxcdGVycl9nbWVtOlxcbiA2MTc6XFx0XFx0a2ZyZWUoZik7XFxuIDYxODpcXHRlcnJfZmQ6XFxuIDYxOTpcXHRcXHRwdXRfdW51c2VkX2ZkKGZkKTtcXG4gNjIwOlxcdFxcdHJldHVybiBlcnI7XFxuIDYyMTpcXHR9XFxuIDYyMjpcXHRcXG4gNjIzOlxcdGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcXG4gNjI0OlxcdHtcXG4gNjI1OlxcdFxcdGxvZmZfdCBzaXplID0gYXJncy1cXHUwMDNlc2l6ZTtcXG4gNjI2OlxcdFxcdHU2NCBmbGFncyA9IGFyZ3MtXFx1MDAzZWZsYWdzO1xcbiA2Mjc6XFx0XFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XFxuIDYyODpcXHRcXG4gNjI5OlxcdFxcdGlmIChmbGFncyBcXHUwMDI2IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpXFxuIDYzMDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjMxOlxcdFxcbiA2MzI6XFx0XFx0aWYgKHNpemUgXFx1MDAzYz0gMCB8fCAhUEFHRV9BTElHTkVEKHNpemUpKVxcbiA2MzM6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYzNDpcXHRcXG4gNjM1OlxcdFxcdGlmIChmbGFncyBcXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XFxuIDYzNjpcXHRcXHRcXHRpZiAoYXJncy1cXHUwMDNlcGFkIHx8IGFyZ3MtXFx1MDAzZW5vZGUgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbiA2Mzc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYzODpcXHRcXHRcXHRub2RlID0gYXJncy1cXHUwMDNlbm9kZTtcXG4gNjM5OlxcdFxcdH0gZWxzZSBpZiAoYXJncy1cXHUwMDNlbm9kZSB8fCBhcmdzLVxcdTAwM2VwYWQpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MDEuMDA5NzgzOThaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ5NjQ4NDgxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIEkgZGVsdmUgaW50byB0aGUgY29kZTpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtcG9saWN5LmNgKipcblxuT2theSwgbGV0J3Mgem9vbSBpbiBvbiBgbW0vbWVtcG9saWN5LmNgLiBJIG5lZWQgdG8gcmV2aWV3IHRoaXMgc2VjdGlvbiBjYXJlZnVsbHkuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBmdW5jdGlvbnMgYG1lbXBvbGljeV9jcmVhdGVgLCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAsIGFuZCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeWAuIFRoZXNlIGFyZSBrZXkgd2hlbiB5b3UgYXJlIGxvb2tpbmcgYXQgaG93IG1lbW9yeSBwb2xpY2llcyBhcmUgaGFuZGxlZCBhbmQgc2hhcmVkIGFjcm9zcyB0aGUgc3lzdGVtLiBUbyBnZXQgdGhlIGRldGFpbHMsIEkgc2hvdWxkIHJlYWQgbGluZXMgMTA4MCB0aHJvdWdoIDExMzAsIGFuZCB0aGVuIEkgd2FudCB0byBqdW1wIGRvd24gdG8gbGluZXMgMzMwMCB0aHJvdWdoIDMzNzAuIFRoYXQgd2lsbCBnaXZlIG1lIGEgc29saWQgdmlldyBvZiB0aGUgcGVydGluZW50IGxvZ2ljLiBJJ20gZm9jdXNpbmcgb24gdGhlc2UgcmVnaW9ucyB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBjb3JlIGZ1bmN0aW9ucyBpbnRlcmFjdCB3aXRoaW4gdGhlIGxhcmdlciBtZW1vcnkgbWFuYWdlbWVudCBmcmFtZXdvcmsuIExldCdzIHNlZSB3aGF0IGludGVyZXN0aW5nIHRpZGJpdHMgYXJlIGhpZGRlbiBpbiB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQ3OTMsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjAzLjUwNjI3MTgxNVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzc0MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtcG9saWN5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTA4MCxcbiAgXCJMaW5lQ291bnRcIjogNTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTA4MDpcXHRcXHR2bWEgPSAgdm1hX21vZGlmeV9wb2xpY3kodm1pLCAqcHJldiwgdm1hLCB2bXN0YXJ0LCB2bWVuZCwgbmV3X3BvbCk7XFxuMTA4MTpcXHRcXHRpZiAoSVNfRVJSKHZtYSkpXFxuMTA4MjpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUih2bWEpO1xcbjEwODM6XFx0XFxuMTA4NDpcXHRcXHQqcHJldiA9IHZtYTtcXG4xMDg1OlxcdFxcdHJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTtcXG4xMDg2OlxcdH1cXG4xMDg3OlxcdFxcbjEwODg6XFx0LyoqXFxuMTA4OTpcXHQgKiBtZW1wb2xpY3lfY3JlYXRlIC0gYnVpbGQgYSB2YWxpZGF0ZWQsIGNwdXNldC1jb250ZXh0dWFsaXNlZCBtZW1wb2xpY3lcXG4xMDkwOlxcdCAqIEBtb2RlOiBNUE9MXyogbW9kZVxcbjEwOTE6XFx0ICogQGZsYWdzOiBNUE9MX0ZfKiBmbGFnc1xcbjEwOTI6XFx0ICogQG5vZGVzOiB0YXJnZXQgbm9kZW1hc2ssIG9yIE5VTEwgKGludGVycHJldGVkIHBlciBAbW9kZTsgc2VlIG1wb2xfbmV3KCkpXFxuMTA5MzpcXHQgKlxcbjEwOTQ6XFx0ICogQ3JlYXRlcyBhIG5ldyBwb2xpY3kgYW5kIGNvbnN0cmFpbnMgaXQgdG8gdGhlIHRhc2sncyBjcHVzZXQuXFxuMTA5NTpcXHQgKlxcbjEwOTY6XFx0ICogVGhlIGNhbGxlciBvd25zIHRoZSByZXR1cm5lZCByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cXG4xMDk3OlxcdCAqXFxuMTA5ODpcXHQgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXFxuMTA5OTpcXHQgKi9cXG4xMTAwOlxcdHN0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeV9jcmVhdGUodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxuMTEwMTpcXHRcXHRcXHRub2RlbWFza190ICpub2RlcylcXG4xMTAyOlxcdHtcXG4xMTAzOlxcdFxcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbDtcXG4xMTA0OlxcdFxcdE5PREVNQVNLX1NDUkFUQ0goc2NyYXRjaCk7XFxuMTEwNTpcXHRcXHRpbnQgZXJyO1xcbjExMDY6XFx0XFxuMTEwNzpcXHRcXHRpZiAoIXNjcmF0Y2gpXFxuMTEwODpcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcXG4xMTA5OlxcdFxcbjExMTA6XFx0XFx0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcXG4xMTExOlxcdFxcdGlmIChJU19FUlIocG9sKSlcXG4xMTEyOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjExMTM6XFx0XFxuMTExNDpcXHRcXHR0YXNrX2xvY2soY3VycmVudCk7XFxuMTExNTpcXHRcXHRlcnIgPSBtcG9sX3NldF9ub2RlbWFzayhwb2wsIG5vZGVzLCBzY3JhdGNoKTtcXG4xMTE2OlxcdFxcdHRhc2tfdW5sb2NrKGN1cnJlbnQpO1xcbjExMTc6XFx0XFx0aWYgKGVycikge1xcbjExMTg6XFx0XFx0XFx0bXBvbF9wdXQocG9sKTtcXG4xMTE5OlxcdFxcdFxcdHBvbCA9IEVSUl9QVFIoZXJyKTtcXG4xMTIwOlxcdFxcdH1cXG4xMTIxOlxcdG91dDpcXG4xMTIyOlxcdFxcdE5PREVNQVNLX1NDUkFUQ0hfRlJFRShzY3JhdGNoKTtcXG4xMTIzOlxcdFxcdHJldHVybiBwb2w7XFxuMTEyNDpcXHR9XFxuMTEyNTpcXHRFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1lbXBvbGljeV9jcmVhdGUsIFxcXCJrdm1cXFwiKTtcXG4xMTI2OlxcdFxcbjExMjc6XFx0c3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcXG4xMTI4OlxcdFxcdFxcdFxcdCAgICAgbm9kZW1hc2tfdCAqbm9kZXMpXFxuMTEyOTpcXHR7XFxuMTEzMDpcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpuZXcsICpvbGQ7XFxuMTEzMTpcXHRcXHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xcbjExMzI6XFx0XFx0aW50IHJldDtcXG4xMTMzOlxcdFxcbjExMzQ6XFx0XFx0aWYgKCFzY3JhdGNoKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODowMy41MDY1MTM2ODVaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDk2MzcxMzM2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtcG9saWN5LmNgKipcblxuT2theSwgdGltZSB0byBkaWcgaW50byB0aGUgbWVtb3J5IHBvbGljeSBpbXBsZW1lbnRhdGlvbi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIHdpdGhpbiBsaW5lcyAzMzAwLTMzNzAgb2YgYG1tL21lbXBvbGljeS5jYC4gQmFzZWQgb24gY29udGV4dCwgSSdtIGV4cGVjdGluZyB0aGlzIHNlY3Rpb24gdG8gZGVhbCB3aXRoLi4uIHdlbGwsIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBuYW1lcyBJIGtub3csIG1heWJlIGl0J3MgcmVsYXRlZCB0byBOVU1BIGJhbGFuY2luZyBvciBzb21lIHNwZWNpZmljIG1lbW9yeSBhbGxvY2F0aW9uIHBvbGljeSBoYW5kbGluZy4gSeKAmWxsIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgZXhhY3QgZnVuY3Rpb24gb3IgZnVuY3Rpb25zIHdpdGhpbiB0aGF0IHJhbmdlLiBJdCBjb3VsZCBiZSBzb21lIGNvcmUgbG9naWMgaW4gYG1wb2xfeHh4YCBmYW1pbHkuIFxuXG5NeSBpbW1lZGlhdGUgZm9jdXMgd2lsbCBiZSB0byBkZXRlcm1pbmUgdGhlICp3aHkqIGFuZCAqaG93KiBvZiB0aGUgY29kZSBpbiB0aGF0IGJsb2NrLiBXaGF0IGlzIHRoZSBvYmplY3RpdmUgb2YgdGhpcyBjb2RlPyBXaGF0IHNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyBvciB2YXJpYWJsZXMgaXMgaXQgd29ya2luZyB3aXRoPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBJIHNob3VsZCBsb29rIGZvciBpbW1lZGlhdGVseT8gSSdsbCBwcm9iYWJseSBzdGFydCBieSBncmVwcGluZyBmb3IgYW55IHJlbGF0ZWQgc3ltYm9scyBvciBjb21tZW50cyB0byB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIGJlZm9yZSBkaXZpbmcgaW50byBpbmRpdmlkdWFsIGxpbmVzLiBJJ20gaG9waW5nIHRoZXJlJ3MgYSBnb29kIGV4cGxhbmF0aW9uIG9yIHJlbGV2YW50IGNvbW1lbnRzLiBJdCBpcyBhIGxhcmdlIHJhbmdlLCBzbyBpdCBtdXN0IGJlIGEgc2lnbmlmaWNhbnQgc2VjdGlvbiBvZiBjb2RlLiBJJ20gZ29pbmcgdG8gc3RhcnQgcmVhZGluZyFcblxuXG4iLCJJbnB1dFRva2VucyI6MjU5MDksIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjA4LjQ3MDIyOTQxNVoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjk2ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtcG9saWN5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzMwMCxcbiAgXCJMaW5lQ291bnRcIjogNjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMzMwMDpcXHRcXG4zMzAxOlxcdFxcdFxcdC8qIGFsbG9jIG5vZGUgY292ZXJpbmcgZW50aXJlIGZpbGU7IGFkZHMgcmVmIHRvIGZpbGUncyBucG9sICovXFxuMzMwMjpcXHRcXHRcXHRzbiA9IHNwX2FsbG9jKDAsIE1BWF9MRlNfRklMRVNJWkUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCwgbnBvbCk7XFxuMzMwMzpcXHRcXHRcXHRpZiAoc24pXFxuMzMwNDpcXHRcXHRcXHRcXHRzcF9pbnNlcnQoc3AsIHNuKTtcXG4zMzA1OlxcdHB1dF9ucG9sOlxcbjMzMDY6XFx0XFx0XFx0bXBvbF9wdXQobnBvbCk7XFx0LyogZHJvcCBpbml0aWFsIHJlZiBvbiBmaWxlJ3MgbnBvbCAqL1xcbjMzMDc6XFx0ZnJlZV9zY3JhdGNoOlxcbjMzMDg6XFx0XFx0XFx0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xcbjMzMDk6XFx0cHV0X21wb2w6XFxuMzMxMDpcXHRcXHRcXHRtcG9sX3B1dChtcG9sKTtcXHQvKiBkcm9wIG91ciBpbmNvbWluZyByZWYgb24gc2IgbXBvbCAqL1xcbjMzMTE6XFx0XFx0fVxcbjMzMTI6XFx0fVxcbjMzMTM6XFx0RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCwgXFxcImt2bVxcXCIpO1xcbjMzMTQ6XFx0XFxuMzMxNTpcXHQvKipcXG4zMzE2OlxcdCAqIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgLSBpbnN0YWxsIEBwb2wgb3ZlciBbQHN0YXJ0LCBAZW5kKSBvZiBAc3BcXG4zMzE3OlxcdCAqIEBzcDogICAgdGhlIHNoYXJlZCBwb2xpY3kgdHJlZVxcbjMzMTg6XFx0ICogQHN0YXJ0OiBmaXJzdCBwYWdlIG9mZnNldCAoaW5jbHVzaXZlKVxcbjMzMTk6XFx0ICogQGVuZDogICBsYXN0IHBhZ2Ugb2Zmc2V0IChleGNsdXNpdmUpXFxuMzMyMDpcXHQgKiBAcG9sOiAgIGEgZnVsbHktYnVpbHQsIHZhbGlkYXRlZCBwb2xpY3ksIG9yIE5VTEwgdG8gY2xlYXIgdGhlIHJhbmdlXFxuMzMyMTpcXHQgKlxcbjMzMjI6XFx0ICogSW5zdGFsbHMgQHBvbCBvdmVyIHRoZSBnaXZlbiByYW5nZSwgcmVwbGFjaW5nIGFueSBvdmVybGFwcGluZyBwb2xpY3kuXFxuMzMyMzpcXHQgKiBAc3AgdGFrZXMgaXRzIG93biByZWZlcmVuY2UsIHRoZSBjYWxsZXIgcmV0YWlucyBpdHMgcmVmZXJlbmNlIG9uIEBwb2wuXFxuMzMyNDpcXHQgKlxcbjMzMjU6XFx0ICogVGhlIHBvbGljeSBpcyBub3QgcmVjb25zdHJ1Y3RlZCwgc28gdGhlIHBvbGljeSBpcyBwcmVzZXJ2ZWQgZXhhY3RseS5cXG4zMzI2OlxcdCAqXFxuMzMyNzpcXHQgKiBVbmxpa2UgbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgpLCBubyBWTUEgaXMgcmVxdWlyZWQsIHNvIGEgcmFuZ2UgdGhhdFxcbjMzMjg6XFx0ICogaXMgbmV2ZXIgbWFwcGVkIGludG8gYSBWTUEgY2FuIGJlIGNvdmVyZWQsIGluY2x1ZGluZyB0aGUgd2hvbGUgZmlsZS5cXG4zMzI5OlxcdCAqXFxuMzMzMDpcXHQgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXFxuMzMzMTpcXHQgKi9cXG4zMzMyOlxcdGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcXG4zMzMzOlxcdFxcdFxcdFxcdFxcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxcbjMzMzQ6XFx0e1xcbjMzMzU6XFx0XFx0c3RydWN0IHNwX25vZGUgKm5ldyA9IE5VTEw7XFxuMzMzNjpcXHRcXHRpbnQgZXJyO1xcbjMzMzc6XFx0XFxuMzMzODpcXHRcXHRpZiAocG9sKSB7XFxuMzMzOTpcXHRcXHRcXHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xcbjMzNDA6XFx0XFx0XFx0aWYgKCFuZXcpXFxuMzM0MTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4zMzQyOlxcdFxcdH1cXG4zMzQzOlxcdFxcdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgc3RhcnQsIGVuZCwgbmV3KTtcXG4zMzQ0OlxcdFxcdGlmIChlcnIgXFx1MDAyNlxcdTAwMjYgbmV3KVxcbjMzNDU6XFx0XFx0XFx0c3BfZnJlZShuZXcpO1xcbjMzNDY6XFx0XFx0cmV0dXJuIGVycjtcXG4zMzQ3OlxcdH1cXG4zMzQ4OlxcdEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgXFxcImt2bVxcXCIpO1xcbjMzNDk6XFx0XFxuMzM1MDpcXHRpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuMzM1MTpcXHRcXHRcXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxcbjMzNTI6XFx0e1xcbjMzNTM6XFx0XFx0cmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS1cXHUwMDNldm1fcGdvZmYsXFxuMzM1NDpcXHRcXHRcXHRcXHRcXHRcXHQgICB2bWEtXFx1MDAzZXZtX3Bnb2ZmICsgdm1hX3BhZ2VzKHZtYSksIHBvbCk7XFxuMzM1NTpcXHR9XFxuMzM1NjpcXHRFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3ksIFxcXCJrdm1cXFwiKTtcXG4zMzU3OlxcdFxcbjMzNTg6XFx0LyogRnJlZSBhIGJhY2tpbmcgcG9saWN5IHN0b3JlIG9uIGlub2RlIGRlbGV0ZS4gKi9cXG4zMzU5OlxcdHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKVxcbjMzNjA6XFx0e1xcbjMzNjE6XFx0XFx0c3RydWN0IHNwX25vZGUgKm47XFxuMzM2MjpcXHRcXHRzdHJ1Y3QgcmJfbm9kZSAqbmV4dDtcXG4zMzYzOlxcdFxcbjMzNjQ6XFx0XFx0aWYgKCFzcC1cXHUwMDNlcm9vdC5yYl9ub2RlKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODowOC40NzA0NjA2MDRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjE2NzgyODE5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBLVk0gR3Vlc3QgTWVtb3J5IGFuZCBOVU1BIEludGVncmF0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGZvY3VzIGlzIG9uIHRoZSBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNvZGUuIEl0IHNlZW1zIGxpa2UgdGhlIGNvcmUgY2hhbmdlcyByZXZvbHZlIGFyb3VuZCBLVk0ncyBgZ3Vlc3RfbWVtZmRgIGFuZCBOVU1BIG1lbW9yeSBtYW5hZ2VtZW50LlxuXG5JIHNlZSB0aGF0IGBFbmFibGVDb25maWdzYCBpbmNsdWRlIGBLVk1gICh3aXRoIGl0cyBkZXBlbmRlbmNpZXMpIGFuZCBgTlVNQWAuIFRoaXMgaW1tZWRpYXRlbHkgcG9pbnRzIHRvIHRoZSBhcmVhIG9mIGludGVyZXN0OiB0aGUgaW50ZXJwbGF5IG9mIEtWTSB2aXJ0dWFsaXphdGlvbiBhbmQgTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2Vzcy4gVGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QgcHJvdmlkZXMgc3BlY2lmaWMgZnVuY3Rpb24gbmFtZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb3IgaW50cm9kdWNlZDogYGt2bV9nbWVtX2NyZWF0ZWAsIGBrdm1fZ21lbV9iaW5kX25vZGVgLCBgbWVtcG9saWN5X2NyZWF0ZWAsIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCwgYW5kIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5YC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBzdHJvbmcgaW5kaWNhdG9ycyBvZiB0aGUga2V5IGNoYW5nZXMuXG5cbk5vdywgbGV0J3MgZHJpbGwgZG93biBmdXJ0aGVyLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBmbG93IGFuZCBkZXBlbmRlbmNpZXMuIEkgY2FuIHNlZSB0aGF0IGBrdm1fZ21lbV9jcmVhdGVgIGluIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBpcyB0aGUgZW50cnkgcG9pbnQsIGFuZCBpdCBjYWxscyBgX19rdm1fZ21lbV9jcmVhdGVgLCB3aGljaCB0aGVuIGNhbGxzIGBrdm1fZ21lbV9iaW5kX25vZGVgLiBUaGlzIHRlbGxzIG1lIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGlzIGtleSwgd2l0aCBhIGJpbmRpbmcgb3BlcmF0aW9uIGhhcHBlbmluZyBhcyBwYXJ0IG9mIGl0LiBUaGUgYG1lbXBvbGljeWAgZnVuY3Rpb25zIGFyZSBuZXcgb3IgbW9kaWZpZWQgaW4gYG1tL21lbXBvbGljeS5jYCwgc3VnZ2VzdGluZyBtZW1vcnkgcG9saWN5IGNvbnRyb2xzIGFyZSBiZWluZyBhZGRlZCBvciBhdWdtZW50ZWQuXG5cbkFyZSB0aGVzZSBmdW5jdGlvbnMgZ2VuZXJhbD8gTm8sIHRoZXkncmUgbm90IGNvcmUga2VybmVsIGhvdC1wYXRocy4gVGhleSBhcmUgc3BlY2lmaWMgdG8gdGhlIEtWTSBndWVzdCBtZW1mZCBhbmQgc2hhcmVkIG1lbXBvbGljaWVzLiBJIHdhbnQgdG8gZW1waGFzaXplIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBzcGVjaWZpYyB0byBLVk0gZ3Vlc3QgbWVtZmQgYW5kIHNoYXJlZCBtZW1wb2xpY2llcy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXNlIGFyZSBub3QgdWJpcXVpdG91cyBob3QtcGF0aHMgdGhhdCBtYXkgY2F1c2Ugd2lkZS1zcHJlYWQgcGVyZm9ybWFuY2UgaXNzdWVzLlxuXG5JIGNvbmZpcm0gdGhhdCB0aGlzIGlzIG9uIGFtZDY0LCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZ3VhcmRlZCBieSBgQ09ORklHX0tWTWAgKGFuZCBgQ09ORklHX0tWTV9JTlRFTGAgb3IgYENPTkZJR19LVk1fQU1EYCksIHdoaWNoIGluIHR1cm4gc2VsZWN0cyBgQ09ORklHX0tWTV9HVUVTVF9NRU1GRGAuIGBDT05GSUdfTlVNQWAgaXMgYWxzbyBpbXBvcnRhbnQgYXMgaXQgZW5hYmxlcyBOVU1BIG1lbXBvbGljeSBzdXBwb3J0IHdpdGhpbiB0aGUgZ3Vlc3RfbWVtZmQgY29kZSwgd2hpY2ggaXMgZXhwZWN0ZWQuXG5cbldpdGggdGhpcyBpbiBtaW5kLCB0aGUgYHNldC1yZXN1bHRzYCBwYXJhbWV0ZXJzIGFyZSBjbGVhci4gVGhpcyBwYXRjaCBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgY2FuIHJlYXNvbiB0aGF0IHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIGEgbmV3IGZsYWcgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCwgYW5kIGltcGxlbWVudHMgbWVtcG9saWN5IGhlbHBlcnMgYG1lbXBvbGljeV9jcmVhdGVgIGFuZCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgcmVhY2hhYmxlIHZpYSBLVk0gZ3Vlc3RfbWVtZmQgY3JlYXRpb24gaW9jdGwuIEknbGwgbmVlZCB0byB1c2UgYFtcImt2bV9nbWVtX2NyZWF0ZVwiLCBcImt2bV9nbWVtX2JpbmRfbm9kZVwiLCBcIm1lbXBvbGljeV9jcmVhdGVcIiwgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsIFwibXBvbF9zZXRfc2hhcmVkX3BvbGljeVwiXWAgYXMgbXkgYEZvY3VzU3ltYm9sc2AgYW5kIGBbXCJLVk1cIiwgXCJOVU1BXCJdYCBhcyBgRW5hYmxlQ29uZmlnc2AgZm9yIHByb3BlciB0ZXN0aW5nLiBOb3csIGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjczMTIsIk91dHB1dFRva2VucyI6MTg2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjAzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MTQuNjM4MjkzNDEzWiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzM3NDk2OTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtZW1wb2xpY3lfY3JlYXRlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIHRoZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSBmbGFnIGluIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGFuZCBhZGRzIHRoZSBtZW1wb2xpY3kgaGVscGVycyBtZW1wb2xpY3lfY3JlYXRlKCkgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKS4gVGhlc2UgY2hhbmdlcyBtb2RpZnkgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBpbiBtbS9tZW1wb2xpY3kuYyBhbmQgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtZW1wb2xpY3lfY3JlYXRlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBOVU1BIG5vZGUgYmluZGluZyBzdXBwb3J0IGZvciBLVk0gZ3Vlc3RfbWVtZmQgdmlhIHRoZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSBmbGFnIGluIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIGFuZCBhZGRzIHRoZSBtZW1wb2xpY3kgaGVscGVycyBtZW1wb2xpY3lfY3JlYXRlKCkgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKS4gVGhlc2UgY2hhbmdlcyBtb2RpZnkgcmVhY2hhYmxlIGtlcm5lbCBsb2dpYyBpbiBtbS9tZW1wb2xpY3kuYyBhbmQgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODoxNC43MTIwNTEzM1oiLCJTZXEiOjIzLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDcyNzE0MjgxNzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODoxNC43MTI1NDU2OFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjQ3MjcwOTI3NDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaW4gS1ZNJ3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cXG5cXG5LTVNBTiB2cyBLQVNBTiBhcHBsaWNhYmlsaXR5Olxcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cXG4tIEluIHRoaXMgcGF0Y2gsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcmVhZHMgdXNlciBhcmd1bWVudHMgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgaW50ZWdlcjsgbm8ga2VybmVsIHN0cnVjdHVyZXMsIHBhZGRpbmcsIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UuXFxuLSBBbGwgbmV3bHkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBzdGFjayBhbmQgaGVhcCB2YXJpYWJsZXMgKGUuZy4sIGBub2RlbWFza190IG5vZGVzYCBpbml0aWFsaXplZCB2aWEgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgpYCwgYHNjcmF0Y2hgIGluaXRpYWxpemVkIHZpYSBgTk9ERU1BU0tfU0NSQVRDSCgpYCwgYW5kIGBzdHJ1Y3Qgc3Bfbm9kZWAvYHN0cnVjdCBtZW1wb2xpY3lgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBzdGFuZGFyZCBtbSBoZWxwZXJzKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cXG4tIEFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIE5VTUEgcG9saWN5IHJlZmVyZW5jZSBjb3VudGluZywgbGlmZWN5Y2xlIGlzc3Vlcywgb3IgYWxsb2NhdGlvbiBmYWlsdXJlcykgZmFsbCB1bmRlciB0aGUgc2NvcGUgb2YgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhZTY4OTU1YTU5MjNkMjVlOWUwYWY5NTY5NDMwNTc5ZTk0YzQwZjlmXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAxOTowNzoxNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaFxuaW5kZXggMDNiZmM5Mjg2NGI2ZS4uNzM4ZTI3NjYzM2MxZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaFxuKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG5AQCAtNzM5LDYgKzczOSw5IEBAIHN0YXRpYyBpbmxpbmUgdTY0IGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moc3RydWN0IGt2bSAqa3ZtKVxuIFx0aWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKVxuIFx0XHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEO1xuIFxuK1x0aWYgKElTX0VOQUJMRUQoQ09ORklHX05VTUEpKVxuK1x0XHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcbitcbiBcdHJldHVybiBmbGFncztcbiB9XG4gI2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbmluZGV4IDY1YzczMmQ0NDBkMmYuLjM5ODMxODE3NWNlYzcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG5AQCAtMTI0LDEwICsxMjQsMTUgQEAgaW50IHZtYV9kdXBfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdCk7XG4gdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xuIGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbiBcdFx0XHQgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XG4raW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LFxuK1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiB2b2lkIG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCk7XG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0XHRcdCAgICBwZ29mZl90IGlkeCk7XG4gXG4rc3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbitcdFx0XHRcdCAgIG5vZGVtYXNrX3QgKm5vZGVzKTtcbitcbiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTtcbiBzdHJ1Y3QgbWVtcG9saWN5ICpfX2dldF92bWFfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHBnb2ZmX3QgKmlseCk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG5pbmRleCBhYzJkNzdkMTQ5NjM1Li44ZDNhZTdlMmVhZDhlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbkBAIC0xNjU4LDExICsxNjU4LDE0IEBAIHN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xuICNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFx0XHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRURcdCgxVUxMIFx1MDAzY1x1MDAzYyAxKVxuKyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVcdCgxVUxMIFx1MDAzY1x1MDAzYyAyKVxuIFxuIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIHtcbiBcdF9fdTY0IHNpemU7XG4gXHRfX3U2NCBmbGFncztcbi1cdF9fdTY0IHJlc2VydmVkWzZdO1xuK1x0X191MzIgbm9kZTtcbitcdF9fdTMyIHBhZDtcbitcdF9fdTY0IHJlc2VydmVkWzVdO1xuIH07XG4gXG4gI2RlZmluZSBLVk1fUFJFX0ZBVUxUX01FTU9SWVx0X0lPV1IoS1ZNSU8sIDB4ZDUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSlcbmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jXG5pbmRleCAyYWQwYTVmMTgyODBhLi5jZTEwY2U0Mzc0NjQzIDEwMDY0NFxuLS0tIGEvbW0vbWVtcG9saWN5LmNcbisrKyBiL21tL21lbXBvbGljeS5jXG5AQCAtMTA4NSw3ICsxMDg1LDQ1IEBAIHN0YXRpYyBpbnQgbWJpbmRfcmFuZ2Uoc3RydWN0IHZtYV9pdGVyYXRvciAqdm1pLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHJldHVybiB2bWFfcmVwbGFjZV9wb2xpY3kodm1hLCBuZXdfcG9sKTtcbiB9XG4gXG4tLyogU2V0IHRoZSBwcm9jZXNzIG1lbW9yeSBwb2xpY3kgKi9cbisvKipcbisgKiBtZW1wb2xpY3lfY3JlYXRlIC0gYnVpbGQgYSB2YWxpZGF0ZWQsIGNwdXNldC1jb250ZXh0dWFsaXNlZCBtZW1wb2xpY3lcbisgKiBAbW9kZTogTVBPTF8qIG1vZGVcbisgKiBAZmxhZ3M6IE1QT0xfRl8qIGZsYWdzXG4rICogQG5vZGVzOiB0YXJnZXQgbm9kZW1hc2ssIG9yIE5VTEwgKGludGVycHJldGVkIHBlciBAbW9kZTsgc2VlIG1wb2xfbmV3KCkpXG4rICpcbisgKiBDcmVhdGVzIGEgbmV3IHBvbGljeSBhbmQgY29uc3RyYWlucyBpdCB0byB0aGUgdGFzaydzIGNwdXNldC5cbisgKlxuKyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlIGFuZCBmcmVlcyBpdCB3aXRoIG1wb2xfcHV0KCkuXG4rICpcbisgKiBSZXR1cm46IHRoZSBwb2xpY3kgKE5VTEwgZm9yIGEgZGVmYXVsdCBwb2xpY3kpLCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXG4rICovXG4rc3RydWN0IG1lbXBvbGljeSAqbWVtcG9saWN5X2NyZWF0ZSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbitcdFx0bm9kZW1hc2tfdCAqbm9kZXMpXG4re1xuK1x0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xuK1x0Tk9ERU1BU0tfU0NSQVRDSChzY3JhdGNoKTtcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoIXNjcmF0Y2gpXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1xuK1x0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcbitcdGlmIChJU19FUlIocG9sKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHR0YXNrX2xvY2soY3VycmVudCk7XG4rXHRlcnIgPSBtcG9sX3NldF9ub2RlbWFzayhwb2wsIG5vZGVzLCBzY3JhdGNoKTtcbitcdHRhc2tfdW5sb2NrKGN1cnJlbnQpO1xuK1x0aWYgKGVycikge1xuK1x0XHRtcG9sX3B1dChwb2wpO1xuK1x0XHRwb2wgPSBFUlJfUFRSKGVycik7XG4rXHR9XG4rb3V0OlxuK1x0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xuK1x0cmV0dXJuIHBvbDtcbit9XG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtZW1wb2xpY3lfY3JlYXRlLCBcImt2bVwiKTtcbitcbiBzdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuIFx0XHRcdCAgICAgbm9kZW1hc2tfdCAqbm9kZXMpXG4ge1xuQEAgLTMyNzQsMjQgKzMzMTIsNDcgQEAgdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpXG4gfVxuIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zaGFyZWRfcG9saWN5X2luaXQsIFwia3ZtXCIpO1xuIFxuLWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbi1cdFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuKy8qKlxuKyAqIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgLSBpbnN0YWxsIEBwb2wgb3ZlciBbQHN0YXJ0LCBAZW5kKSBvZiBAc3BcbisgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWVcbisgKiBAc3RhcnQ6IGZpcnN0IHBhZ2Ugb2Zmc2V0IChpbmNsdXNpdmUpXG4rICogQGVuZDogICBsYXN0IHBhZ2Ugb2Zmc2V0IChleGNsdXNpdmUpXG4rICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZVxuKyAqXG4rICogSW5zdGFsbHMgQHBvbCBvdmVyIHRoZSBnaXZlbiByYW5nZSwgcmVwbGFjaW5nIGFueSBvdmVybGFwcGluZyBwb2xpY3kuXG4rICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLlxuKyAqXG4rICogVGhlIHBvbGljeSBpcyBub3QgcmVjb25zdHJ1Y3RlZCwgc28gdGhlIHBvbGljeSBpcyBwcmVzZXJ2ZWQgZXhhY3RseS5cbisgKlxuKyAqIFVubGlrZSBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCksIG5vIFZNQSBpcyByZXF1aXJlZCwgc28gYSByYW5nZSB0aGF0XG4rICogaXMgbmV2ZXIgbWFwcGVkIGludG8gYSBWTUEgY2FuIGJlIGNvdmVyZWQsIGluY2x1ZGluZyB0aGUgd2hvbGUgZmlsZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS5cbisgKi9cbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4rXHRcdFx0XHQgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbiB7XG4tXHRjb25zdCBwZ29mZl90IHBnb2ZmID0gdm1hX3N0YXJ0X3Bnb2ZmKHZtYSk7XG4tXHRjb25zdCBwZ29mZl90IHBnb2ZmX2VuZCA9IHZtYV9lbmRfcGdvZmYodm1hKTtcbiBcdHN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMO1xuIFx0aW50IGVycjtcbiBcbiBcdGlmIChwb2wpIHtcbi1cdFx0bmV3ID0gc3BfYWxsb2MocGdvZmYsIHBnb2ZmX2VuZCwgcG9sKTtcbitcdFx0bmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTtcbiBcdFx0aWYgKCFuZXcpXG4gXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHR9XG4tXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHBnb2ZmLCBwZ29mZl9lbmQsIG5ldyk7XG4rXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XG4gXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG4gXHRcdHNwX2ZyZWUobmV3KTtcbiBcdHJldHVybiBlcnI7XG4gfVxuK0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgXCJrdm1cIik7XG4rXG4raW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLFxuK1x0XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4re1xuK1x0cmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS1cdTAwM2V2bV9wZ29mZixcbitcdFx0XHRcdFx0ICAgdm1hLVx1MDAzZXZtX3Bnb2ZmICsgdm1hX3BhZ2VzKHZtYSksIHBvbCk7XG4rfVxuIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgXCJrdm1cIik7XG4gXG4gLyogRnJlZSBhIGJhY2tpbmcgcG9saWN5IHN0b3JlIG9uIGlub2RlIGRlbGV0ZS4gKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuY1xuaW5kZXggMjIzM2Q4NzFhMzhmNC4uYjMzM2NiNDJmYWIyOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmNcbkBAIC0yNSw2ICsyNSwzMSBAQFxuIFxuIHN0YXRpYyBzaXplX3QgcGFnZV9zaXplO1xuIFxuK3N0YXRpYyBpbnQgX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZShzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncyxcbitcdFx0XHRcdCAgICAgdTMyIG5vZGUsIHUzMiBwYWQpXG4re1xuK1x0c3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgZ3Vlc3RfbWVtZmQgPSB7XG4rXHRcdC5zaXplID0gc2l6ZSxcbitcdFx0LmZsYWdzID0gZmxhZ3MsXG4rXHRcdC5ub2RlID0gbm9kZSxcbitcdFx0LnBhZCA9IHBhZCxcbitcdH07XG4rXG4rXHRyZXR1cm4gX192bV9pb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXHUwMDI2Z3Vlc3RfbWVtZmQpO1xuK31cbitcbitzdGF0aWMgaW50IGNyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsIHU2NCBmbGFncywgdTMyIG5vZGUpXG4re1xuK1x0aW50IGZkO1xuK1xuK1x0aWYgKCEoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSlcbitcdFx0cmV0dXJuIHZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgc2l6ZSwgZmxhZ3MpO1xuK1xuK1x0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7XG4rXHRURVNUX0FTU0VSVChmZCBcdTAwM2U9IDAsIEtWTV9JT0NUTF9FUlJPUihLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBmZCkpO1xuK1x0cmV0dXJuIGZkO1xuK31cbitcbiBzdGF0aWMgdm9pZCB0ZXN0X2ZpbGVfcmVhZF93cml0ZShpbnQgZmQsIHNpemVfdCB0b3RhbF9zaXplKVxuIHtcbiBcdGNoYXIgYnVmWzY0XTtcbkBAIC0xNzEsNiArMTk2LDgzIEBAIHN0YXRpYyB2b2lkIHRlc3RfbnVtYV9hbGxvY2F0aW9uKGludCBmZCwgc2l6ZV90IHRvdGFsX3NpemUpXG4gXHRrdm1fbXVubWFwKG1lbSwgdG90YWxfc2l6ZSk7XG4gfVxuIFxuK3N0YXRpYyBib29sIGhhc19iaW5kX25vZGUoc3RydWN0IGt2bV92bSAqdm0pXG4re1xuK1x0cmV0dXJuIHZtX2NoZWNrX2NhcCh2bSwgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUykgXHUwMDI2XG4rXHQgICAgICAgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREU7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfYmluZF9ub2RlX2ludmFsaWQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcbit7XG4rXHRpbnQgZmQ7XG4rXG4rXHRpZiAoIWhhc19iaW5kX25vZGUodm0pKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSxcbitcdFx0XHRcdCAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLCAwLCAxKTtcbitcdFRFU1RfQVNTRVJUKGZkIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXG4rXHRcdCAgICBcImd1ZXN0X21lbWZkKCkgd2l0aCBub24temVybyBwYWQgc2hvdWxkIGZhaWwgd2l0aCBFSU5WQUxcIik7XG4rXG4rXHRmZCA9IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUodm0sIHBhZ2Vfc2l6ZSxcbitcdFx0XHRcdCAgICAgICBmbGFncyB8IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFxuK1x0XHRcdFx0ICAgICAgIDEgXHUwMDNjXHUwMDNjIDIwLCAwKTtcbitcdFRFU1RfQVNTRVJUKGZkIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5WQUwsXG4rXHRcdCAgICBcImd1ZXN0X21lbWZkKCkgd2l0aCBvdXQtb2YtcmFuZ2Ugbm9kZSBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwiKTtcbitcbitcdGZkID0gX19jcmVhdGVfZ3Vlc3RfbWVtZmRfbm9kZSh2bSwgcGFnZV9zaXplLCBmbGFncywgMSwgMCk7XG4rXHRURVNUX0FTU0VSVChmZCBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRUlOVkFMLFxuK1x0XHQgICAgXCJndWVzdF9tZW1mZCgpIHdpdGggYSBub2RlIGJ1dCBubyBCSU5EX05PREUgZmxhZyBzaG91bGQgZmFpbCB3aXRoIEVJTlZBTFwiKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9iaW5kX25vZGUoaW50IGZkLCBzaXplX3QgdG90YWxfc2l6ZSwgaW50IG5vZGUpXG4re1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBvdGhlcl9tYXNrID0gMVVMIFx1MDAzY1x1MDAzYyAobm9kZSA/IDAgOiAxKTtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4bm9kZSA9IEJJVFNfUEVSX1RZUEUob3RoZXJfbWFzayk7XG4rXHRib29sIHN0ZWVyX2F3YXkgPSBpc19tdWx0aV9udW1hX25vZGVfc3lzdGVtKCk7XG4rXHR2b2lkICpwYWdlc1s0XTtcbitcdGludCBzdGF0dXNbNF07XG4rXHRjaGFyICptZW07XG4rXHRpbnQgaTtcbitcbitcdG1lbSA9IGt2bV9tbWFwKHRvdGFsX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDQ7IGkrKylcbitcdFx0cGFnZXNbaV0gPSBtZW0gKyBwYWdlX3NpemUgKiBpO1xuK1xuK1x0LypcbitcdCAqIEJpbmQgb24gYSBkaWZmZXJlbnQgbm9kZSBpZiBwb3NzaWJsZSBvcmRlciB0byBjaGVjayB3aGV0aGVyIGZhdWx0aW5nXG4rXHQgKiBoYXBwZW5zIGFzIGRlc2lyZWQuIFdpdGhvdXQgYSBzZWNvbmQgbm9kZSB1c2UgdGhlIGxvY2FsIG5vZGUgYW5kXG4rXHQgKiBqdXN0IGdldCBjb3ZlcmFnZSBvZiBjcmVhdGUvbW1hcC9mYXVsdCBwYXRocy5cbitcdCAqL1xuK1x0aWYgKHN0ZWVyX2F3YXkpXG4rXHRcdGt2bV9zZXRfbWVtcG9saWN5KE1QT0xfQklORCwgXHUwMDI2b3RoZXJfbWFzaywgbWF4bm9kZSk7XG4rXG4rXHQvKiBEZWxpYmVyYXRlbHkgbm8gbWJpbmQoKSBvbiB0aGlzIG1hcHBpbmcuICovXG4rXHRtZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTtcbitcbitcdGt2bV9tb3ZlX3BhZ2VzKDAsIDQsIHBhZ2VzLCBOVUxMLCBzdGF0dXMsIDApO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSsrKVxuK1x0XHRURVNUX0FTU0VSVChzdGF0dXNbaV0gPT0gbm9kZSxcbitcdFx0XHQgICAgXCJFeHBlY3RlZCBwYWdlICVkIG9uIG5vZGUgJWQsIGdvdCBpdCBvbiBub2RlICVkXCIsXG4rXHRcdFx0ICAgIGksIG5vZGUsIHN0YXR1c1tpXSk7XG4rXG4rXHQvKiBEcm9wcGVkIG1lbW9yeSBzaG91bGQgZmF1bHQgYmFjayBvbnRvIHRoZSBzYW1lIG5vZGUgKi9cbitcdGt2bV9mYWxsb2NhdGUoZmQsIEZBTExPQ19GTF9QVU5DSF9IT0xFIHwgRkFMTE9DX0ZMX0tFRVBfU0laRSwgMCxcbitcdFx0ICAgICAgdG90YWxfc2l6ZSk7XG4rXHRtZW1zZXQobWVtLCAweGFhLCB0b3RhbF9zaXplKTtcbitcbitcdGt2bV9tb3ZlX3BhZ2VzKDAsIDQsIHBhZ2VzLCBOVUxMLCBzdGF0dXMsIDApO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSsrKVxuK1x0XHRURVNUX0FTU0VSVChzdGF0dXNbaV0gPT0gbm9kZSxcbitcdFx0XHQgICAgXCJFeHBlY3RlZCBwYWdlICVkIGJhY2sgb24gbm9kZSAlZCwgZ290IGl0IG9uIG5vZGUgJWRcIixcbitcdFx0XHQgICAgaSwgbm9kZSwgc3RhdHVzW2ldKTtcbitcbitcdGlmIChzdGVlcl9hd2F5KVxuK1x0XHRrdm1fc2V0X21lbXBvbGljeShNUE9MX0RFRkFVTFQsIE5VTEwsIDApO1xuK1xuK1x0a3ZtX211bm1hcChtZW0sIHRvdGFsX3NpemUpO1xuK31cbitcbiBzdGF0aWMgdm9pZCB0ZXN0X2NvbGxhcHNlKGludCBmZCwgdTY0IGZsYWdzKVxuIHtcbiBcdGNvbnN0IHNpemVfdCBwbWRfc2l6ZSA9IGdldF90cmFuc19odWdlcGFnZXN6KCk7XG5AQCAtNDA0LDYgKzUwNiwxMCBAQCBzdGF0aWMgdm9pZCB0ZXN0X2d1ZXN0X21lbWZkX2ZsYWdzKHN0cnVjdCBrdm1fdm0gKnZtKVxuIFx0aW50IGZkO1xuIFxuIFx0Zm9yIChmbGFnID0gQklUKDApOyBmbGFnOyBmbGFnIFx1MDAzY1x1MDAzYz0gMSkge1xuK1x0XHQvKiBCSU5EX05PREUgZGVwZW5kcyBvbiBhIHZhbGlkIG5vZGUgZmllbGQsIHRlc3Qgc2VwYXJhdGVseSAqL1xuK1x0XHRpZiAoZmxhZyA9PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSlcbitcdFx0XHRjb250aW51ZTtcbitcbiBcdFx0ZmQgPSBfX3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCh2bSwgcGFnZV9zaXplLCBmbGFnKTtcbiBcdFx0aWYgKGZsYWcgXHUwMDI2IHZhbGlkX2ZsYWdzKSB7XG4gXHRcdFx0VEVTVF9BU1NFUlQoZmQgXHUwMDNlPSAwLFxuQEAgLTQxOCwzMCArNTI0LDQwIEBAIHN0YXRpYyB2b2lkIHRlc3RfZ3Vlc3RfbWVtZmRfZmxhZ3Moc3RydWN0IGt2bV92bSAqdm0pXG4gXHR9XG4gfVxuIFxuLSNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBhcmdzLi4uKVx0XFxcbi1kbyB7XHRcdFx0XHRcdFx0XHRcdFx0XFxcbi1cdGludCBmZCA9IHZtX2NyZWF0ZV9ndWVzdF9tZW1mZChfX3ZtLCBfX2dtZW1fc2l6ZSwgX19mbGFncyk7XHRcXFxuLVx0XHRcdFx0XHRcdFx0XHRcdFxcXG4tXHR0ZXN0XyMjX190ZXN0KGFyZ3MpO1x0XHRcdFx0XHRcdFxcXG4tXHRjbG9zZShmZCk7XHRcdFx0XHRcdFx0XHRcXFxuKyNkZWZpbmUgX19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBfX25vZGUsIGFyZ3MuLi4pIFxcXG4rZG8ge1x0XHRcdFx0XHRcdFx0XHRcdCAgIFxcXG4rXHRpbnQgZmQgPSBjcmVhdGVfZ3Vlc3RfbWVtZmQoX192bSwgX19nbWVtX3NpemUsIF9fZmxhZ3MsIF9fbm9kZSk7ICAgXFxcbitcdFx0XHRcdFx0XHRcdFx0XHQgICBcXFxuK1x0dGVzdF8jI19fdGVzdChhcmdzKTtcdFx0XHRcdFx0XHQgICBcXFxuK1x0Y2xvc2UoZmQpO1x0XHRcdFx0XHRcdFx0ICAgXFxcbiB9IHdoaWxlICgwKVxuIFxuICNkZWZpbmUgX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcdFx0XHRcXFxuLVx0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCBmZCwgX19nbWVtX3NpemUpXG4rXHRfX19fZ21lbV90ZXN0KF9fdGVzdCwgX192bSwgX19mbGFncywgX19nbWVtX3NpemUsIDAsIGZkLCBfX2dtZW1fc2l6ZSlcbiBcbiAjZGVmaW5lIGdtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MpXHRcdFx0XHRcXFxuIFx0X19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBwYWdlX3NpemUgKiA0KVxuIFxuICNkZWZpbmUgX19nbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSlcdFx0XFxcbi1cdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX192bSwgZmQsIF9fZ21lbV9zaXplKVxuK1x0X19fX2dtZW1fdGVzdChfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fZ21lbV9zaXplLCAwLFx0XHRcXFxuK1x0XHQgICAgICBfX3ZtLCBmZCwgX19nbWVtX3NpemUpXG4gXG4gI2RlZmluZSBnbWVtX3Rlc3Rfdm0oX190ZXN0LCBfX3ZtLCBfX2ZsYWdzKVx0XHRcdFx0XFxcbiBcdF9fZ21lbV90ZXN0X3ZtKF9fdGVzdCwgX192bSwgX19mbGFncywgcGFnZV9zaXplICogNClcbiBcbisjZGVmaW5lIF9fZ21lbV90ZXN0X25vZGUoX190ZXN0LCBfX3ZtLCBfX2ZsYWdzLCBfX2dtZW1fc2l6ZSwgX19ub2RlKVx0XFxcbitcdF9fX19nbWVtX3Rlc3QoX190ZXN0LCBfX3ZtLFx0XHRcdFx0XHRcXFxuK1x0XHQgICAgICAoX19mbGFncykgfCBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSxcdFx0XFxcbitcdFx0ICAgICAgX19nbWVtX3NpemUsIF9fbm9kZSwgZmQsIF9fZ21lbV9zaXplLCBfX25vZGUpXG4rXG4rI2RlZmluZSBnbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIF9fbm9kZSlcdFx0XHRcXFxuK1x0X19nbWVtX3Rlc3Rfbm9kZShfX3Rlc3QsIF9fdm0sIF9fZmxhZ3MsIHBhZ2Vfc2l6ZSAqIDQsIF9fbm9kZSlcbitcbiBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcbiB7XG4gXHR0ZXN0X2NyZWF0ZV9ndWVzdF9tZW1mZF9tdWx0aXBsZSh2bSk7XG4gXHR0ZXN0X2NyZWF0ZV9ndWVzdF9tZW1mZF9pbnZhbGlkX3NpemVzKHZtLCBmbGFncyk7XG4rXHR0ZXN0X2JpbmRfbm9kZV9pbnZhbGlkKHZtLCBmbGFncyk7XG4gXG4gXHRnbWVtX3Rlc3QoZmlsZV9yZWFkX3dyaXRlLCB2bSwgZmxhZ3MpO1xuIFxuQEAgLTQ1Miw2ICs1NjgsOCBAQCBzdGF0aWMgdm9pZCBfX3Rlc3RfZ3Vlc3RfbWVtZmQoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBmbGFncylcbiBcdFx0XHRnbWVtX3Rlc3QobW1hcF9zdXBwb3J0ZWQsIHZtLCBmbGFncyk7XG4gXHRcdFx0Z21lbV90ZXN0KGZhdWx0X292ZXJmbG93LCB2bSwgZmxhZ3MpO1xuIFx0XHRcdGdtZW1fdGVzdChudW1hX2FsbG9jYXRpb24sIHZtLCBmbGFncyk7XG4rXHRcdFx0aWYgKGhhc19iaW5kX25vZGUodm0pKVxuK1x0XHRcdFx0Z21lbV90ZXN0X25vZGUoYmluZF9ub2RlLCB2bSwgZmxhZ3MsIDApO1xuIFx0XHRcdF9fZ21lbV90ZXN0KGNvbGxhcHNlLCB2bSwgZmxhZ3MsIHBtZF9zaXplKTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRnbWVtX3Rlc3QoZmF1bHRfcHJpdmF0ZSwgdm0sIGZsYWdzKTtcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuaW5kZXggNjI1ZTYyZTFhMDMxOC4uZGM5ZjA3MWRkOTY5YiAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbkBAIC00MjMsNiArNDIzLDMxIEBAIHN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICprdm1fZ21lbV9nZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0ICovXG4gXHRyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgcGdvZmYpO1xuIH1cbitcbitzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcbit7XG4rXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4rXHRub2RlbWFza190IG5vZGVzO1xuK1x0aW50IGVycjtcbitcbitcdGlmICgodW5zaWduZWQgaW50KW5vZGUgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aW5pdF9ub2RlbWFza19vZl9ub2RlKFx1MDAyNm5vZGVzLCBub2RlKTtcbitcdHBvbCA9IG1lbXBvbGljeV9jcmVhdGUoTVBPTF9CSU5ELCAwLCBcdTAwMjZub2Rlcyk7XG4rXHRpZiAoSVNfRVJSKHBvbCkpXG4rXHRcdHJldHVybiBQVFJfRVJSKHBvbCk7XG4rXG4rXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCAwLFxuK1x0XHRcdFx0XHQgIE1BWF9MRlNfRklMRVNJWkUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsIHBvbCk7XG4rXHRtcG9sX3B1dChwb2wpO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rI2Vsc2VcbitzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcbit7XG4rXHRyZXR1cm4gLUVJTlZBTDtcbit9XG4gI2VuZGlmIC8qIENPTkZJR19OVU1BICovXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fZ21lbV92bV9vcHMgPSB7XG5AQCAtNTIwLDcgKzU0NSw3IEBAIGJvb2wgX193ZWFrIGt2bV9hcmNoX3N1cHBvcnRzX2dtZW1faW5pdF9zaGFyZWQoc3RydWN0IGt2bSAqa3ZtKVxuIFx0cmV0dXJuIHRydWU7XG4gfVxuIFxuLXN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxuK3N0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzLCBpbnQgbm9kZSlcbiB7XG4gXHRzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9IFwiW2t2bS1nbWVtXVwiO1xuIFx0c3RydWN0IGdtZW1fZmlsZSAqZjtcbkBAIC01NjEsNiArNTg2LDEyIEBAIHN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxuIFxuIFx0R01FTV9JKGlub2RlKS1cdTAwM2VmbGFncyA9IGZsYWdzO1xuIFxuK1x0aWYgKGZsYWdzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xuK1x0XHRlcnIgPSBrdm1fZ21lbV9iaW5kX25vZGUoaW5vZGUsIG5vZGUpO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdGdvdG8gZXJyX2lub2RlO1xuK1x0fVxuK1xuIFx0ZmlsZSA9IGFsbG9jX2ZpbGVfcHNldWRvKGlub2RlLCBrdm1fZ21lbV9tbnQsIG5hbWUsIE9fUkRXUiwgXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XG4gXHRpZiAoSVNfRVJSKGZpbGUpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoZmlsZSk7XG5AQCAtNTkzLDYgKzYyNCw3IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbiB7XG4gXHRsb2ZmX3Qgc2l6ZSA9IGFyZ3MtXHUwMDNlc2l6ZTtcbiBcdHU2NCBmbGFncyA9IGFyZ3MtXHUwMDNlZmxhZ3M7XG4rXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcbiBcbiBcdGlmIChmbGFncyBcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG5AQCAtNjAwLDcgKzYzMiwxNSBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4gXHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7XG4rXHRpZiAoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XG4rXHRcdGlmIChhcmdzLVx1MDAzZXBhZCB8fCBhcmdzLVx1MDAzZW5vZGUgXHUwMDNlPSBNQVhfTlVNTk9ERVMpXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdG5vZGUgPSBhcmdzLVx1MDAzZW5vZGU7XG4rXHR9IGVsc2UgaWYgKGFyZ3MtXHUwMDNlbm9kZSB8fCBhcmdzLVx1MDAzZXBhZCkge1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzLCBub2RlKTtcbiB9XG4gXG4gaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MTQuNzEyNTQ2NzdaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTEyNjg1NDEzMzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gUmlzayBBc3Nlc3NtZW50IGZvciBhIEtWTSBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIHdpdGggS01TQU4gaW4gbWluZCwgc3BlY2lmaWNhbGx5IGxvb2tpbmcgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlcy4gRmlyc3QsIEkgbmVlZCB0byBtZXRob2RpY2FsbHkgZ28gdGhyb3VnaCB0aGUgZGlmZi5cblxuMS4gIEluIGBpbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhgLCB3ZSdyZSBhZGRpbmcgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCB3aXRoaW4gYGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3NgIGJ1dCBvbmx5IGlmIE5VTUEgaXMgZW5hYmxlZC4gTWFrZXMgc2Vuc2UuXG5cbjIuICBgaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaGAganVzdCBkZWNsYXJlcyBzb21lIG1lbXBvbGljeSBmdW5jdGlvbnMgLSBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgYW5kIGBtZW1wb2xpY3lfY3JlYXRlYC4gTm90aGluZyBpbW1lZGlhdGVseSBjb25jZXJuaW5nIHRoZXJlLCBpdCBpcyBqdXN0IGRlY2xhcmluZyB0aG9zZSBmdW5jdGlvbnMuXG5cbjMuICBUaGUgYGluY2x1ZGUvdWFwaS9saW51eC9rdm0uaGAgaXMgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4gV2UndmUgZ290IGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZGVmaW5lZCwgd2hpY2ggaXMgcmVsZXZhbnQgZm9yIE5VTUEuICBNb3JlIGltcG9ydGFudGx5LCB0aGUgYHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkYCBoYXMgYmVlbiAqbW9kaWZpZWQqLiAgV2UgYXJlIHJlcGxhY2luZyB0aGUgcmVzZXJ2ZWQgc3BhY2UgdG8gYWRkIGEgYG5vZGVgIGFuZCBhIGBwYWRgIG1lbWJlciwgYnV0IGtlZXBpbmcgdGhlIHN0cnVjdCBzaXplIGNvbnN0YW50IGF0IDY0IGJ5dGVzLiBUaGUgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgc2luY2UgdGhlIHNpemUgaXMgdGhlIHNhbWUsIG5vIG1lbW9yeSByaXNrcyBzaG91bGQgYmUgYXBwYXJlbnQuIEhvd2V2ZXIsIG5vdyBJIGFtIHdvbmRlcmluZyBpZiBga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZGAgaXMgY29waWVkIGJhY2sgdG8gdXNlcnNwYWNlIGluIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgY2FsbC4gSSBuZWVkIHRvIGtub3cgdGhpcyB0byBiZSBzdXJlIHRoZXJlJ3Mgbm8gbGVhayBvZiBrZXJuZWwgbWVtb3J5LlxuXG5XYWl0ISBRdWljayBzYW5pdHkgY2hlY2suIElzIHRoZSBpb2N0bCBgX0lPV1JgIG9yIGBfSU9XYD8gQW5kIHllcywgYCNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBfSU9XUihLVk1JTywgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpYCBjb25maXJtcyB0aGF0IGl0J3MgcmVhZC93cml0ZS4gSSBuZWVkIHRvIGJlICpzdXJlKiBhYm91dCB0aGlzIHJlYWQgYmFjay4gSSBhbSBnb2luZyB0byBoYXZlIHRvIGdyZXAgZm9yIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpbiB0aGUgS1ZNIGNvZGUgbm93IHRvIHNlZSB0aGUgaW9jdGwgaW1wbGVtZW50YXRpb24uIFRoaXMgd2lsbCBiZSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgaWYgdGhlcmUncyBhbnkgcG90ZW50aWFsIGZvciBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIGR1ZSB0byB0aGUgc3RydWN0dXJlIGNoYW5nZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzg2MCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjI1Ljk4MTA5MjY0MloiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY0NTMwNzQxMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdD02MzU3PWluIGZsYWdzIHRvIGhhdmUgS1ZNIGJpbmQgdGhlIG1lbW9yeSByZWdpb24gdG8gYSBnaXZlbiBndWVzdF9tZW1mZCByYW5nZSBvZlxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02MzU4LVtndWVzdF9tZW1mZF9vZmZzZXQsIGd1ZXN0X21lbWZkX29mZnNldCArIG1lbW9yeV9zaXplXS4gIFRoZSB0YXJnZXQgZ3Vlc3RfbWVtZmRcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q6NjM1OTptdXN0IHBvaW50IGF0IGEgZmlsZSBjcmVhdGVkIHZpYSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIG9uIHRoZSBjdXJyZW50IFZNLCBhbmRcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjM2MC10aGUgdGFyZ2V0IHJhbmdlIG11c3Qgbm90IGJlIGJvdW5kIHRvIGFueSBvdGhlciBtZW1vcnkgcmVnaW9uLiAgQWxsIHN0YW5kYXJkXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q9NjQzMD1UaGUgXFxcImZsYWdzXFxcIiBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgYW5kIG11c3QgYmUgJzAnLlxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDMxLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDMyOjQuMTQyIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQzMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ0MC1cXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q6NjQ0MTpLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIGNyZWF0ZXMgYW4gYW5vbnltb3VzIGZpbGUgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3JcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ0Mi10aGF0IHJlZmVycyB0byBpdC4gIGd1ZXN0X21lbWZkIGZpbGVzIGFyZSByb3VnaGx5IGFuYWxvZ291cyB0byBmaWxlcyBjcmVhdGVkXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q9NjQ3Mz1UaGUgY2FwYWJpbGl0eSBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTIGVudW1lcmF0ZXMgdGhlIGBmbGFnc2AgdGhhdCBjYW4gYmVcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3Q6NjQ3NDpzcGVjaWZpZWQgdmlhIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQuICBDdXJyZW50bHkgZGVmaW5lZCBmbGFnczpcXG5Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2FwaS5yc3QtNjQ3NS1cXG4tLVxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDc5LSAgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRCBNYWtlIGFsbCBtZW1vcnkgaW4gdGhlIGZpbGUgc2hhcmVkIGR1cmluZ1xcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdDo2NDgwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIChtZW1vcnkgZmlsZXMgY3JlYXRlZFxcbkRvY3VtZW50YXRpb24vdmlydC9rdm0vYXBpLnJzdC02NDgxLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IElOSVRfU0hBUkVEIHdpbGwgYmUgbWFya2VkIHByaXZhdGUpLlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWc9ODM9Y29uZmlnIEtWTV9TV19QUk9URUNURURfVk1cXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTkwLVxcdCAgcHJvdGVjdGVkIFZNcyBhcmUgcHVyZWx5IGEgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcgdmVoaWNsZSBmb3JcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo5MTpcXHQgIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQuICBBdHRlbXB0aW5nIHRvIHJ1biBhIFxcXCJyZWFsXFxcIiBWTSB3b3JrbG9hZCBhcyBhXFxuYXJjaC94ODYva3ZtL0tjb25maWctOTItXFx0ICBzb2Z0d2FyZS1wcm90ZWN0ZWQgVk0gd2lsbCBmYWlsIG1pc2VyYWJseS5cXG4tLVxcbmluY2x1ZGUvdWFwaS9saW51eC9rdm0uaD0xNjQ5PXN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTctXFxuaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oOjE2NTg6I2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcXG5pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgtMTY1OS0jZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFxcdFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDApXFxuLS1cXG50b29scy9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmg9MTY0NT1zdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHtcXG4tLVxcbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaC0xNjUzLVxcbnRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaDoxNjU0OiNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFxcdF9JT1dSKEtWTUlPLCAgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpXFxudG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oLTE2NTUtI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcXHRcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYz0yOD1zdGF0aWMgaW50IF9fY3JlYXRlX2d1ZXN0X21lbWZkX25vZGUoc3RydWN0IGt2bV92bSAqdm0sIHU2NCBzaXplLCB1NjQgZmxhZ3MsXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTM3LVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmM6Mzg6XFx0cmV0dXJuIF9fdm1faW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFxcdTAwMjZndWVzdF9tZW1mZCk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYy0zOS19XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jPTQxPXN0YXRpYyBpbnQgY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1MzIgbm9kZSlcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF90ZXN0LmMtNDgtXFx0ZmQgPSBfX2NyZWF0ZV9ndWVzdF9tZW1mZF9ub2RlKHZtLCBzaXplLCBmbGFncywgbm9kZSwgMCk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX3Rlc3QuYzo0OTpcXHRURVNUX0FTU0VSVChmZCBcXHUwMDNlPSAwLCBLVk1fSU9DVExfRVJST1IoS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgZmQpKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfdGVzdC5jLTUwLVxcdHJldHVybiBmZDtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg9NjY3PXN0YXRpYyBpbmxpbmUgaW50IF9fdm1fY3JlYXRlX2d1ZXN0X21lbWZkKHN0cnVjdCBrdm1fdm0gKnZtLCB1NjQgc2l6ZSxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjc0LVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg6Njc1OlxcdHJldHVybiBfX3ZtX2lvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcXHUwMDI2Z3Vlc3RfbWVtZmQpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmgtNjc2LX1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9pbmNsdWRlL2t2bV91dGlsLmg9Njc4PXN0YXRpYyBpbmxpbmUgaW50IHZtX2NyZWF0ZV9ndWVzdF9tZW1mZChzdHJ1Y3Qga3ZtX3ZtICp2bSwgdTY0IHNpemUsXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oLTY4Mi1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oOjY4MzpcXHRURVNUX0FTU0VSVChmZCBcXHUwMDNlPSAwLCBLVk1fSU9DVExfRVJST1IoS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgZmQpKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vaW5jbHVkZS9rdm1fdXRpbC5oLTY4NC1cXHRyZXR1cm4gZmQ7XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTUxNjc9c3RhdGljIGxvbmcga3ZtX3ZtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy01Mzg3LSNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUX01FTUZEXFxudmlydC9rdm0va3ZtX21haW4uYzo1Mzg4OlxcdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM4OS1cXHRcXHRzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCBndWVzdF9tZW1mZDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MjcuNjI2NDA2MTYzWiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI5MjkxODc1NTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gS1ZNIENvcmU6IEEgTGluZSBvZiBJbnF1aXJ5KipcblxuT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byBkZWx2ZSBpbnRvIHRoZSBLVk0gY29yZSwgc3BlY2lmaWNhbGx5IHRoZSBga3ZtX21haW4uY2AgZmlsZS4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIG1lbnRhbCBtYXAgb2YgdGhpcyBjb2RlLCBidXQgSSBuZWVkIHRvIHBpbnBvaW50IGEgc3BlY2lmaWMgYXJlYS4gTGV0J3Mgc3RhcnQgYnkgemVyb2luZyBpbiBvbiBsaW5lIDUzODguIE15IGluaXRpYWwgYXBwcm9hY2ggd2lsbCBiZSBhIHN0cmFpZ2h0Zm9yd2FyZCBleGFtaW5hdGlvbiBvZiB0aGF0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4gTGV0J3MgdXNlIGByZWFkLWZpbGVgIHRvIGdldCBhIGdvb2QgbG9vayBhdCB0aGUgY29kZSBhcm91bmQgdGhhdCBhcmVhLiBIb3BlZnVsbHksIHRoYXQgd2lsbCBnaXZlIG1lIGVub3VnaCBjb250ZXh0IHRvIGJlZ2luIGEgbW9yZSBudWFuY2VkIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNjM0LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MzAuNTU1NTk4MTE4WiIsIlNlcSI6MjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQwMDkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJ2aXJ0L2t2bS9rdm1fbWFpbi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUzODAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjUzODA6XFx0XFx0XFx0YnJlYWs7XFxuNTM4MTpcXHRcXHRjYXNlIEtWTV9SRVNFVF9ESVJUWV9SSU5HUzpcXG41MzgyOlxcdFxcdFxcdHIgPSBrdm1fdm1faW9jdGxfcmVzZXRfZGlydHlfcGFnZXMoa3ZtKTtcXG41MzgzOlxcdFxcdFxcdGJyZWFrO1xcbjUzODQ6XFx0XFx0Y2FzZSBLVk1fR0VUX1NUQVRTX0ZEOlxcbjUzODU6XFx0XFx0XFx0ciA9IGt2bV92bV9pb2N0bF9nZXRfc3RhdHNfZmQoa3ZtKTtcXG41Mzg2OlxcdFxcdFxcdGJyZWFrO1xcbjUzODc6XFx0I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG41Mzg4OlxcdFxcdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xcbjUzODk6XFx0XFx0XFx0c3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgZ3Vlc3RfbWVtZmQ7XFxuNTM5MDpcXHRcXG41MzkxOlxcdFxcdFxcdHIgPSAtRUZBVUxUO1xcbjUzOTI6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZndWVzdF9tZW1mZCwgYXJncCwgc2l6ZW9mKGd1ZXN0X21lbWZkKSkpXFxuNTM5MzpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG41Mzk0OlxcdFxcbjUzOTU6XFx0XFx0XFx0ciA9IGt2bV9nbWVtX2NyZWF0ZShrdm0sIFxcdTAwMjZndWVzdF9tZW1mZCk7XFxuNTM5NjpcXHRcXHRcXHRicmVhaztcXG41Mzk3OlxcdFxcdH1cXG41Mzk4OlxcdCNlbmRpZlxcbjUzOTk6XFx0XFx0ZGVmYXVsdDpcXG41NDAwOlxcdFxcdFxcdHIgPSBrdm1fYXJjaF92bV9pb2N0bChmaWxwLCBpb2N0bCwgYXJnKTtcXG41NDAxOlxcdFxcdH1cXG41NDAyOlxcdG91dDpcXG41NDAzOlxcdFxcdHJldHVybiByO1xcbjU0MDQ6XFx0fVxcbjU0MDU6XFx0XFxuNTQwNjpcXHQjaWZkZWYgQ09ORklHX0tWTV9DT01QQVRcXG41NDA3OlxcdHN0cnVjdCBjb21wYXRfa3ZtX2RpcnR5X2xvZyB7XFxuNTQwODpcXHRcXHRfX3UzMiBzbG90O1xcbjU0MDk6XFx0XFx0X191MzIgcGFkZGluZzE7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjMwLjU1NjAwNDA4OFoiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDUzMTE3NTY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS1ZNIEd1ZXN0IE1lbW9yeSBGaWxlIENyZWF0aW9uKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGNhbGwuIFJpZ2h0IG9mZiB0aGUgYmF0LCBpdCdzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuIEZyb20gd2hhdCBJIGNhbiBzZWUsIGFsbCBpdCdzIGRvaW5nIGlzIGEgc2ltcGxlIGBjb3B5X2Zyb21fdXNlcmAgb3BlcmF0aW9uIOKAkyBqdXN0IGdyYWJiaW5nIHRoZSBgZ3Vlc3RfbWVtZmRgIHN0cnVjdHVyZSBmcm9tIHVzZXJzcGFjZSBhbmQgcGFzc2luZyBpdCBvdmVyLiBObyBkYXRhIGlzIGJlaW5nIHJldHVybmVkIGJhY2sgdG8gdGhlIHVzZXIsIHdoaWNoIGlzIGludGVyZXN0aW5nIHRvIG5vdGUuIFxuXG5Ob3csIHRoZSByZWFsIG1lYXQgb2YgdGhlIG9wZXJhdGlvbiBoYXMgZ290IHRvIGJlIHdpdGhpbiBga3ZtX2dtZW1fY3JlYXRlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGF0IGZ1bmN0aW9uIGRvZXMgd2l0aCB0aGUgYGd1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUuIFRoaXMgYWxzbyBtZWFucyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLCBzbyBsZXQncyBnZXQgaW50byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEzMDAsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODozMy4wMDkxMjQ5NjRaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMDQyNzU2NCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29weV90b191c2VyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjMzLjEyOTU2MTIzOVoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTM5NTc4ODgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggc3VtbWFyaXppbmcgdGhlIHByb21wdCwga2VlcGluZyBpbiBtaW5kIG15IG93biBleHBlcnQtbGV2ZWwgdW5kZXJzdGFuZGluZyBvZiB0aGUgZmllbGQ6XG5cbioqSW52ZXN0aWdhdGluZyBHdWVzdCBNZW1vcnkgTWFuYWdlbWVudCBpbiBLVk0qKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gZ2V0IHRvIHRoZSBib3R0b20gb2Ygc29tZXRoaW5nIHJlbGF0ZWQgdG8gZ3Vlc3QgbWVtb3J5IG1hbmFnZW1lbnQgd2l0aGluIEtWTS4gU3BlY2lmaWNhbGx5LCBJIHNob3VsZCBwcm9iYWJseSB6ZXJvIGluIG9uIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhcyBhIGdvb2QgcGxhY2UgdG8gc3RhcnQuIFRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgbG9naWMgcmVsYXRlZCB0byBgbWVtZmRgLWJhY2tlZCBndWVzdCBtZW1vcnkgc2hvdWxkIHJlc2lkZS4gSSdtIHRoaW5raW5nIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBmdW5jdGlvbnMgaW52b2x2ZWQgaW4gYmluZGluZyBtZW1vcnkgbm9kZXMsIGNyZWF0aW5nIGd1ZXN0IG1lbW9yeSByZWdpb25zIHVzaW5nIGBtZW1mZGAsIGFuZCByZWxhdGVkIG9wZXJhdGlvbnMg4oCTIHNwZWNpZmljYWxseSwgZnVuY3Rpb25zIGxpa2UgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGBrdm1fZ21lbV9jcmVhdGVgLCBhbmQgYW55IHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUuIEknbGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCwgbWFwcGVkLCBhbmQgbWFuYWdlZCBmcm9tIHRoZSBob3N0J3MgcGVyc3BlY3RpdmUsIGJ1dCBhbHNvIGhvdyBpdCBhcHBlYXJzIGFuZCBiZWhhdmVzIHdpdGhpbiB0aGUgZ3Vlc3QuIFVuZGVyc3RhbmRpbmcgdGhlc2UgaW50ZXJhY3Rpb25zIGlzIGtleSB0byBwaW5wb2ludGluZyBhbnkgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIG1lbW9yeS1yZWxhdGVkIGlzc3Vlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE2NTksIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODozNS42NjkxNDI2MDJaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA3OTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDIwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDIwOlxcdFxcdCAqIGV4cGxpY2l0IHBvbGljeSBoYXMgYmVlbiBzZXQgdmlhIG1iaW5kKCkgZm9yIHRoaXMgbWVtb3J5LiBUaGUgY2FsbGVyXFxuIDQyMTpcXHRcXHQgKiBjYW4gdGhlbiByZXBsYWNlIE5VTEwgd2l0aCB0aGUgZGVmYXVsdCBtZW1vcnkgcG9saWN5IGluc3RlYWQgb2YgdGhlXFxuIDQyMjpcXHRcXHQgKiBjdXJyZW50IHRhc2sncyBtZW1vcnkgcG9saWN5LlxcbiA0MjM6XFx0XFx0ICovXFxuIDQyNDpcXHRcXHRyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChcXHUwMDI2R01FTV9JKGlub2RlKS1cXHUwMDNlcG9saWN5LCBwZ29mZik7XFxuIDQyNTpcXHR9XFxuIDQyNjpcXHRcXG4gNDI3OlxcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxcbiA0Mjg6XFx0e1xcbiA0Mjk6XFx0XFx0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xcbiA0MzA6XFx0XFx0bm9kZW1hc2tfdCBub2RlcztcXG4gNDMxOlxcdFxcdGludCBlcnI7XFxuIDQzMjpcXHRcXG4gNDMzOlxcdFxcdGlmICgodW5zaWduZWQgaW50KW5vZGUgXFx1MDAzZT0gTUFYX05VTU5PREVTKVxcbiA0MzQ6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzNTpcXHRcXG4gNDM2OlxcdFxcdGluaXRfbm9kZW1hc2tfb2Zfbm9kZShcXHUwMDI2bm9kZXMsIG5vZGUpO1xcbiA0Mzc6XFx0XFx0cG9sID0gbWVtcG9saWN5X2NyZWF0ZShNUE9MX0JJTkQsIDAsIFxcdTAwMjZub2Rlcyk7XFxuIDQzODpcXHRcXHRpZiAoSVNfRVJSKHBvbCkpXFxuIDQzOTpcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihwb2wpO1xcbiA0NDA6XFx0XFxuIDQ0MTpcXHRcXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2Vwb2xpY3ksIDAsXFxuIDQ0MjpcXHRcXHRcXHRcXHRcXHRcXHQgIE1BWF9MRlNfRklMRVNJWkUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcXG4gNDQzOlxcdFxcdG1wb2xfcHV0KHBvbCk7XFxuIDQ0NDpcXHRcXHRyZXR1cm4gZXJyO1xcbiA0NDU6XFx0fVxcbiA0NDY6XFx0I2Vsc2VcXG4gNDQ3OlxcdHN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxcbiA0NDg6XFx0e1xcbiA0NDk6XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQ1MDpcXHR9XFxuIDQ1MTpcXHQjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG4gNDUyOlxcdFxcbiA0NTM6XFx0c3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fZ21lbV92bV9vcHMgPSB7XFxuIDQ1NDpcXHRcXHQuZmF1bHRcXHRcXHQ9IGt2bV9nbWVtX2ZhdWx0X3VzZXJfbWFwcGluZyxcXG4gNDU1OlxcdCNpZmRlZiBDT05GSUdfTlVNQVxcbiA0NTY6XFx0XFx0LmdldF9wb2xpY3lcXHQ9IGt2bV9nbWVtX2dldF9wb2xpY3ksXFxuIDQ1NzpcXHRcXHQuc2V0X3BvbGljeVxcdD0ga3ZtX2dtZW1fc2V0X3BvbGljeSxcXG4gNDU4OlxcdCNlbmRpZlxcbiA0NTk6XFx0fTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MzUuNjY5MjU2NzEyWiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMzODc4MDIyNTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBgbWVtcG9saWN5LmNgIENvZGUqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgbWVtcG9saWN5LmNgIGNvZGUgc25pcHBldC4gTXkgaW5pdGlhbCBmb2N1cyBpcyB0aGUgYG1lbXBvbGljeV9jcmVhdGVgIGZ1bmN0aW9uLiBJIHNlZSBpdCBjcmVhdGVzIGEgbmV3IG1lbW9yeSBwb2xpY3kgc3RydWN0dXJlLiBUaGUgaW5wdXQgcGFyYW1ldGVycywgYG1vZGVgLCBgZmxhZ3NgLCBhbmQgYG5vZGVzYCwgYXJlIHByZXR0eSBzdGFuZGFyZDsgdGhleSBkZWZpbmUgdGhlIGJlaGF2aW9yIGFuZCBub2RlIGFmZmluaXR5IG9mIHRoZSBwb2xpY3kuXG5cblRoZSBjb3JlIG9mIGl0IGlzIGNhbGxpbmcgYG1wb2xfbmV3YCB0byBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYHN0cnVjdCBtZW1wb2xpY3lgLiBUaGVuLCBjcnVjaWFsbHksIHRoZXJlJ3MgYSBsb2NrIGFyb3VuZCBgbXBvbF9zZXRfbm9kZW1hc2tgLiBUaGF0J3MgaW50ZXJlc3RpbmcsIHN1Z2dlc3RpbmcgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3VlcyBhbmQgdGhlIG5lZWQgZm9yIGNhcmVmdWwgbm9kZSBtYXNrIHVwZGF0ZXMuIFRoZSB1c2Ugb2YgYSBzY3JhdGNoIG5vZGVtYXNrIGFuZCBlcnJvciBoYW5kbGluZyBhcm91bmQgdGhlIGBtcG9sX3NldF9ub2RlbWFza2AgY2FsbCBpcyB0eXBpY2FsOyBpdCdzIHdoYXQgSSdkIGV4cGVjdC4gVGhlIGBtcG9sX3B1dGAgb24gZXJyb3IgaXMgYSBnb29kIHByYWN0aWNlIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50LCBlbnN1cmluZyB0aGF0IHRoZSBjcmVhdGVkIHBvbGljeSBkb2Vzbid0IGxlYWsgaWYgdGhlIHNldCBvcGVyYXRpb24gZmFpbHMuXG5cbk15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIGBtcG9sX25ld2AgYW5kIGBtcG9sX3NldF9ub2RlbWFza2AuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBgc3RydWN0IG1lbXBvbGljeWAgaXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCwgYW5kIHdoYXQgdGhlIGBtcG9sX3NldF9ub2RlbWFza2AgZnVuY3Rpb24gaXMgYWN0dWFsbHkgZG9pbmcgdW5kZXIgdGhlIGhvb2QuIFNwZWNpZmljYWxseSwgSSdtIGludGVyZXN0ZWQgaW4gaG93IGl0IGhhbmRsZXMgdGhlIHByb3ZpZGVkIGBub2Rlc2AgbWFzayBhbmQgYW55IHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgc3lzdGVtJ3MgbWVtb3J5IG1hbmFnZW1lbnQgc3RydWN0dXJlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgbG9ja2luZyBhcyB3ZWxsLiBJJ2xsIG5lZWQgdG8gY2hlY2sgaG93IGl0IGFjdHVhbGx5IHNldHMgdGhlIG5vZGVtYXNrIHRvIGtub3cgaWYgdGhlcmUgaXMgYW4gaXNzdWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNTg1LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6MzkuMDU3MDYwODM5WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NjM0NjUyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtcG9sX25ld3xtcG9sX3NldF9ub2RlbWFza1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1wb2xpY3kuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1wb2xpY3kuYz0zODg9c3RhdGljIHZvaWQgbXBvbF9yZWxhdGl2ZV9ub2RlbWFzayhub2RlbWFza190ICpyZXQsIGNvbnN0IG5vZGVtYXNrX3QgKm9yaWcsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zOTUtXFxubW0vbWVtcG9saWN5LmM6Mzk2OnN0YXRpYyBpbnQgbXBvbF9uZXdfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLCBjb25zdCBub2RlbWFza190ICpub2RlcylcXG5tbS9tZW1wb2xpY3kuYy0zOTcte1xcbi0tXFxubW0vbWVtcG9saWN5LmMtNDAzLVxcbm1tL21lbXBvbGljeS5jOjQwNDpzdGF0aWMgaW50IG1wb2xfbmV3X3ByZWZlcnJlZChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxcbm1tL21lbXBvbGljeS5jLTQwNS17XFxuLS1cXG5tbS9tZW1wb2xpY3kuYy00MTQtLypcXG5tbS9tZW1wb2xpY3kuYzo0MTU6ICogbXBvbF9zZXRfbm9kZW1hc2sgaXMgY2FsbGVkIGFmdGVyIG1wb2xfbmV3KCkgdG8gc2V0IHVwIHRoZSBub2RlbWFzaywgaWZcXG5tbS9tZW1wb2xpY3kuYzo0MTY6ICogYW55LCBmb3IgdGhlIG5ldyBwb2xpY3kuICBtcG9sX25ldygpIGhhcyBhbHJlYWR5IHZhbGlkYXRlZCB0aGUgbm9kZXNcXG5tbS9tZW1wb2xpY3kuYy00MTctICogcGFyYW1ldGVyIHdpdGggcmVzcGVjdCB0byB0aGUgcG9saWN5IG1vZGUgYW5kIGZsYWdzLlxcbi0tXFxubW0vbWVtcG9saWN5LmMtNDIxLSAqL1xcbm1tL21lbXBvbGljeS5jOjQyMjpzdGF0aWMgaW50IG1wb2xfc2V0X25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcXG5tbS9tZW1wb2xpY3kuYy00MjMtXFx0XFx0ICAgICBjb25zdCBub2RlbWFza190ICpub2Rlcywgc3RydWN0IG5vZGVtYXNrX3NjcmF0Y2ggKm5zYylcXG4tLVxcbm1tL21lbXBvbGljeS5jLTQ1Ni0gKiBUaGlzIGZ1bmN0aW9uIGp1c3QgY3JlYXRlcyBhIG5ldyBwb2xpY3ksIGRvZXMgc29tZSBjaGVjayBhbmQgc2ltcGxlXFxubW0vbWVtcG9saWN5LmM6NDU3OiAqIGluaXRpYWxpemF0aW9uLiBZb3UgbXVzdCBpbnZva2UgbXBvbF9zZXRfbm9kZW1hc2soKSB0byBzZXQgbm9kZXMuXFxubW0vbWVtcG9saWN5LmMtNDU4LSAqL1xcbm1tL21lbXBvbGljeS5jOjQ1OTpzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqbXBvbF9uZXcodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxubW0vbWVtcG9saWN5LmMtNDYwLVxcdFxcdFxcdFxcdCAgbm9kZW1hc2tfdCAqbm9kZXMpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz01OTU9c3RhdGljIGNvbnN0IHN0cnVjdCBtZW1wb2xpY3lfb3BlcmF0aW9ucyBtcG9sX29wc1tNUE9MX01BWF0gPSB7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYy01OTktXFx0W01QT0xfSU5URVJMRUFWRV0gPSB7XFxubW0vbWVtcG9saWN5LmM6NjAwOlxcdFxcdC5jcmVhdGUgPSBtcG9sX25ld19ub2RlbWFzayxcXG5tbS9tZW1wb2xpY3kuYy02MDEtXFx0XFx0LnJlYmluZCA9IG1wb2xfcmViaW5kX25vZGVtYXNrLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtNjAzLVxcdFtNUE9MX1BSRUZFUlJFRF0gPSB7XFxubW0vbWVtcG9saWN5LmM6NjA0OlxcdFxcdC5jcmVhdGUgPSBtcG9sX25ld19wcmVmZXJyZWQsXFxubW0vbWVtcG9saWN5LmMtNjA1LVxcdFxcdC5yZWJpbmQgPSBtcG9sX3JlYmluZF9wcmVmZXJyZWQsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy02MDctXFx0W01QT0xfQklORF0gPSB7XFxubW0vbWVtcG9saWN5LmM6NjA4OlxcdFxcdC5jcmVhdGUgPSBtcG9sX25ld19ub2RlbWFzayxcXG5tbS9tZW1wb2xpY3kuYy02MDktXFx0XFx0LnJlYmluZCA9IG1wb2xfcmViaW5kX25vZGVtYXNrLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtNjE0LVxcdFtNUE9MX1BSRUZFUlJFRF9NQU5ZXSA9IHtcXG5tbS9tZW1wb2xpY3kuYzo2MTU6XFx0XFx0LmNyZWF0ZSA9IG1wb2xfbmV3X25vZGVtYXNrLFxcbm1tL21lbXBvbGljeS5jLTYxNi1cXHRcXHQucmViaW5kID0gbXBvbF9yZWJpbmRfcHJlZmVycmVkLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtNjE4LVxcdFtNUE9MX1dFSUdIVEVEX0lOVEVSTEVBVkVdID0ge1xcbm1tL21lbXBvbGljeS5jOjYxOTpcXHRcXHQuY3JlYXRlID0gbXBvbF9uZXdfbm9kZW1hc2ssXFxubW0vbWVtcG9saWN5LmMtNjIwLVxcdFxcdC5yZWJpbmQgPSBtcG9sX3JlYmluZF9ub2RlbWFzayxcXG4tLVxcbm1tL21lbXBvbGljeS5jPTEwNjE9c3RhdGljIGludCBtYmluZF9yYW5nZShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMTA5MS0gKiBAZmxhZ3M6IE1QT0xfRl8qIGZsYWdzXFxubW0vbWVtcG9saWN5LmM6MTA5MjogKiBAbm9kZXM6IHRhcmdldCBub2RlbWFzaywgb3IgTlVMTCAoaW50ZXJwcmV0ZWQgcGVyIEBtb2RlOyBzZWUgbXBvbF9uZXcoKSlcXG5tbS9tZW1wb2xpY3kuYy0xMDkzLSAqXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0xMTAwPXN0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeV9jcmVhdGUodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMTA5LVxcbm1tL21lbXBvbGljeS5jOjExMTA6XFx0cG9sID0gbXBvbF9uZXcobW9kZSwgZmxhZ3MsIG5vZGVzKTtcXG5tbS9tZW1wb2xpY3kuYy0xMTExLVxcdGlmIChJU19FUlIocG9sKSlcXG4tLVxcbm1tL21lbXBvbGljeS5jLTExMTQtXFx0dGFza19sb2NrKGN1cnJlbnQpO1xcbm1tL21lbXBvbGljeS5jOjExMTU6XFx0ZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBub2Rlcywgc2NyYXRjaCk7XFxubW0vbWVtcG9saWN5LmMtMTExNi1cXHR0YXNrX3VubG9jayhjdXJyZW50KTtcXG4tLVxcbm1tL21lbXBvbGljeS5jPTExMjc9c3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTExMzYtXFxubW0vbWVtcG9saWN5LmM6MTEzNzpcXHRuZXcgPSBtcG9sX25ldyhtb2RlLCBmbGFncywgbm9kZXMpO1xcbm1tL21lbXBvbGljeS5jLTExMzgtXFx0aWYgKElTX0VSUihuZXcpKSB7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMTQzLVxcdHRhc2tfbG9jayhjdXJyZW50KTtcXG5tbS9tZW1wb2xpY3kuYzoxMTQ0OlxcdHJldCA9IG1wb2xfc2V0X25vZGVtYXNrKG5ldywgbm9kZXMsIHNjcmF0Y2gpO1xcbm1tL21lbXBvbGljeS5jLTExNDUtXFx0aWYgKHJldCkge1xcbi0tXFxubW0vbWVtcG9saWN5LmM9MTU0Nj1zdGF0aWMgbG9uZyBkb19tYmluZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbixcXG4tLVxcbm1tL21lbXBvbGljeS5jLTE1NzgtXFxubW0vbWVtcG9saWN5LmM6MTU3OTpcXHRuZXcgPSBtcG9sX25ldyhtb2RlLCBtb2RlX2ZsYWdzLCBubWFzayk7XFxubW0vbWVtcG9saWN5LmMtMTU4MC1cXHRpZiAoSVNfRVJSKG5ldykpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xNTk1LVxcdFxcdFxcdG1tYXBfd3JpdGVfbG9jayhtbSk7XFxubW0vbWVtcG9saWN5LmM6MTU5NjpcXHRcXHRcXHRlcnIgPSBtcG9sX3NldF9ub2RlbWFzayhuZXcsIG5tYXNrLCBzY3JhdGNoKTtcXG5tbS9tZW1wb2xpY3kuYy0xNTk3LVxcdFxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0zMTk5PXN0YXRpYyBpbnQgc2hhcmVkX3BvbGljeV9yZXBsYWNlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMyMDMtXFx0c3RydWN0IHNwX25vZGUgKm5fbmV3ID0gTlVMTDtcXG5tbS9tZW1wb2xpY3kuYzozMjA0OlxcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfbmV3ID0gTlVMTDtcXG5tbS9tZW1wb2xpY3kuYy0zMjA1LVxcdGludCByZXQgPSAwO1xcbi0tXFxubW0vbWVtcG9saWN5LmMtMzIyMy1cXG5tbS9tZW1wb2xpY3kuYzozMjI0OlxcdFxcdFxcdFxcdCptcG9sX25ldyA9ICpuLVxcdTAwM2Vwb2xpY3k7XFxubW0vbWVtcG9saWN5LmM6MzIyNTpcXHRcXHRcXHRcXHRhdG9taWNfc2V0KFxcdTAwMjZtcG9sX25ldy1cXHUwMDNlcmVmY250LCAxKTtcXG5tbS9tZW1wb2xpY3kuYzozMjI2OlxcdFxcdFxcdFxcdHNwX25vZGVfaW5pdChuX25ldywgZW5kLCBuLVxcdTAwM2VlbmQsIG1wb2xfbmV3KTtcXG5tbS9tZW1wb2xpY3kuYy0zMjI3LVxcdFxcdFxcdFxcdG4tXFx1MDAzZWVuZCA9IHN0YXJ0O1xcbi0tXFxubW0vbWVtcG9saWN5LmMtMzIyOS1cXHRcXHRcXHRcXHRuX25ldyA9IE5VTEw7XFxubW0vbWVtcG9saWN5LmM6MzIzMDpcXHRcXHRcXHRcXHRtcG9sX25ldyA9IE5VTEw7XFxubW0vbWVtcG9saWN5LmMtMzIzMS1cXHRcXHRcXHRcXHRicmVhaztcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMyNDQtZXJyX291dDpcXG5tbS9tZW1wb2xpY3kuYzozMjQ1OlxcdGlmIChtcG9sX25ldylcXG5tbS9tZW1wb2xpY3kuYzozMjQ2OlxcdFxcdG1wb2xfcHV0KG1wb2xfbmV3KTtcXG5tbS9tZW1wb2xpY3kuYy0zMjQ3LVxcdGlmIChuX25ldylcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMyNTctXFx0XFx0Z290byBlcnJfb3V0O1xcbm1tL21lbXBvbGljeS5jOjMyNTg6XFx0bXBvbF9uZXcgPSBrbWVtX2NhY2hlX2FsbG9jKHBvbGljeV9jYWNoZSwgR0ZQX0tFUk5FTCk7XFxubW0vbWVtcG9saWN5LmM6MzI1OTpcXHRpZiAoIW1wb2xfbmV3KVxcbm1tL21lbXBvbGljeS5jLTMyNjAtXFx0XFx0Z290byBlcnJfb3V0O1xcbm1tL21lbXBvbGljeS5jOjMyNjE6XFx0YXRvbWljX3NldChcXHUwMDI2bXBvbF9uZXctXFx1MDAzZXJlZmNudCwgMSk7XFxubW0vbWVtcG9saWN5LmMtMzI2Mi1cXHRnb3RvIHJlc3RhcnQ7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0zMjc1PXZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxcbi0tXFxubW0vbWVtcG9saWN5LmMtMzI5MC1cXHRcXHQvKiBjb250ZXh0dWFsaXplIHRoZSB0bXBmcyBtb3VudCBwb2ludCBtZW1wb2xpY3kgdG8gdGhpcyBmaWxlICovXFxubW0vbWVtcG9saWN5LmM6MzI5MTpcXHRcXHRucG9sID0gbXBvbF9uZXcobXBvbC1cXHUwMDNlbW9kZSwgbXBvbC1cXHUwMDNlZmxhZ3MsIFxcdTAwMjZtcG9sLVxcdTAwM2V3LnVzZXJfbm9kZW1hc2spO1xcbm1tL21lbXBvbGljeS5jLTMyOTItXFx0XFx0aWYgKElTX0VSUihucG9sKSlcXG4tLVxcbm1tL21lbXBvbGljeS5jLTMyOTUtXFx0XFx0dGFza19sb2NrKGN1cnJlbnQpO1xcbm1tL21lbXBvbGljeS5jOjMyOTY6XFx0XFx0cmV0ID0gbXBvbF9zZXRfbm9kZW1hc2sobnBvbCwgXFx1MDAyNm1wb2wtXFx1MDAzZXcudXNlcl9ub2RlbWFzaywgc2NyYXRjaCk7XFxubW0vbWVtcG9saWN5LmMtMzI5Ny1cXHRcXHR0YXNrX3VubG9jayhjdXJyZW50KTtcXG4tLVxcbm1tL21lbXBvbGljeS5jPTM1MDg9aW50IG1wb2xfcGFyc2Vfc3RyKGNoYXIgKnN0ciwgc3RydWN0IG1lbXBvbGljeSAqKm1wb2wpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zNTYwLVxcdFxcdC8qXFxubW0vbWVtcG9saWN5LmM6MzU2MTpcXHRcXHQgKiBEb24ndCBhbGxvdyBhIG5vZGVsaXN0OyAgbXBvbF9uZXcoKSBjaGVja3MgZmxhZ3NcXG5tbS9tZW1wb2xpY3kuYy0zNTYyLVxcdFxcdCAqL1xcbi0tXFxubW0vbWVtcG9saWN5LmMtMzU5NS1cXG5tbS9tZW1wb2xpY3kuYzozNTk2OlxcdG5ldyA9IG1wb2xfbmV3KG1vZGUsIG1vZGVfZmxhZ3MsIFxcdTAwMjZub2Rlcyk7XFxubW0vbWVtcG9saWN5LmMtMzU5Ny1cXHRpZiAoSVNfRVJSKG5ldykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjA4OjM5LjE1MzQxMjI4NFoiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1NjcwNzk0NjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNZW1vcnkgUG9saWN5IENyZWF0aW9uIGFuZCBCaW5kaW5nKipcblxuT2theSwgbGV0J3MgZGl2ZSBiYWNrIGludG8gYG1lbXBvbGljeV9jcmVhdGVgIHdpdGhpbiBgbW0vbWVtcG9saWN5LmNgLiBJIG5lZWQgdG8gc29saWRpZnkgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgY29tbW9uIHBhdHRlcm5zIGluIGBkb19zZXRfbWVtcG9saWN5YCBhbmQgYG1wb2xfc2hhcmVkX3BvbGljeV9pbml0YC4gUmlnaHQsIGl0IGFsbG9jYXRlcyBhIHRlbXBvcmFyeSBzY3JhdGNoIHNwYWNlLCBjYWxscyBgbXBvbF9uZXdgIHdpdGggdGhlIG1vZGUsIGZsYWdzLCBhbmQgbm9kZXMsIGdyYWJzIHRoZSBgdGFza19sb2NrYCBvbiB0aGUgY3VycmVudCB0YXNrLCB0aGVuIGNhbGxzIGBtcG9sX3NldF9ub2RlbWFza2AgdG8gYWN0dWFsbHkgYXBwbHkgdGhlIG5vZGUgbWFzayB0byB0aGUgcG9saWN5IHVzaW5nIHRoYXQgc2NyYXRjaCBzcGFjZSwgcmVsZWFzZXMgdGhlIGxvY2ssIGFuZCB0aGVuIGZyZWVzIHRoZSB0ZW1wb3Jhcnkgc2NyYXRjaC4gVGhhdCdzIHRoZSBiYXNpYyB3b3JrZmxvdy5cblxuTm93LCBsZXQncyBleGFtaW5lIGBrdm1fZ21lbV9iaW5kX25vZGVgLiBIZXJlJ3MgdGhlIGNvZGU6XG5cbmBgYGNcbnN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxue1xuXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG5cdG5vZGVtYXNrX3Qgbm9kZXM7XG5cdGludCBlcnI7XG5cblx0aWYgKCh1bnNpZ25lZCBpbnQpbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcblx0XHRyZXR1cm4gLUVJTlZBTDtcblxuXHRpbml0X25vZGVtYXNrX29mX25vZGUoXHUwMDI2bm9kZXMsIG5vZGUpO1xuXHRwb2wgPSBtZW1wb2xpY3lfY3JlYXRlKE1QT0xfQklORCwgMCwgXHUwMDI2bm9kZXMpO1xuXHRpZiAoSVNfRVJSKHBvbCkpXG5cdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcblxuXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCAwLFxuXHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcblx0bXBvbF9wdXQocG9sKTtcblx0cmV0dXJuIGVycjtcbn1cbmBgYFxuXG5UaGUgZnVuY3Rpb24gY2FsbHMgYG1lbXBvbGljeV9jcmVhdGVgIHdpdGggYE1QT0xfQklORGAsIG5vIGZsYWdzLCBhbmQgYSBgbm9kZXNgIG1hc2suIFRoaXMgYG5vZGVzYCB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCBvbiB0aGUgc3RhY2sgdXNpbmcgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZShcdTAwMjZub2Rlcywgbm9kZSlgLiBOZWVkIHRvIHF1aWNrbHkgdmVyaWZ5IGhvdyB0aGF0IGluaXRpYWxpemF0aW9uIGhhcHBlbnMuIEFoLCBpdCdzIGp1c3QgYSBgbm9kZXNfY2xlYXJgIGZvbGxvd2VkIGJ5IGEgYG5vZGVfc2V0YC4gU28sIHRoZSBgbm9kZW1hc2tgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBiZWluZyBwYXNzZWQuIEdvb2QuXG5cbk5leHQsIGl0IGNhbGxzIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYC4gTGV0J3MgcmVmcmVzaCBvdXIgbWVtb3J5IG9uIHRoYXQgZnVuY3Rpb246XG5cbmBgYGNcbmludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcblx0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG57XG5cdHN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMO1xuXHRpbnQgZXJyO1xuXG5cdGlmIChwb2wpIHtcblx0XHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xuXHRcdGlmICghbmV3KVxuXHRcdFx0cmV0dXJuIC1FTk9NRU07XG5cdH1cblx0ZXJyID0gc2hhcmVkX3BvbGljeV9yZXBsYWNlKHNwLCBzdGFydCwgZW5kLCBuZXcpO1xuXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG5cdFx0c3BfZnJlZShuZXcpO1xuXHRyZXR1cm4gZXJyO1xufVxuYGBgXG5cbk9rYXksIHNvIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBhbGxvY2F0ZXMgYW4gYHNwX25vZGVgIHZpYSBgc3BfYWxsb2NgIGlmIGEgcG9saWN5IGV4aXN0cy4gVGhlbiBgc3BfYWxsb2NgIGlzIGNhbGxlZCB3aXRoIHN0YXJ0LCBlbmQsIGFuZCB0aGUgcG9saWN5LiBJdCB1c2VzIGBrbWVtX2NhY2hlX2FsbG9jYCB0byBhbGxvY2F0ZSB0aGUgYHNwX25vZGVgIGFuZCB0aGVuIGluaXRpYWxpemVzIGl0IHZpYSBgc3Bfbm9kZV9pbml0KG4sIHN0YXJ0LCBlbmQsIHBvbClgLiBJIG5lZWQgdG8gcXVpY2tseSBnbGFuY2UgYXQgYHNwX2FsbG9jYCB0byBjb25maXJtIHdoYXQgdGhhdCBsb29rcyBsaWtlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTYyNiwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU4OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODo0NC44MjQyMTAwODRaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3Mzc1MzI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNwX2FsbG9jXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbXBvbGljeS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbXBvbGljeS5jPTMxNjk9c3RhdGljIHZvaWQgc3Bfbm9kZV9pbml0KHN0cnVjdCBzcF9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0vbWVtcG9saWN5LmMtMzE3Ni1cXG5tbS9tZW1wb2xpY3kuYzozMTc3OnN0YXRpYyBzdHJ1Y3Qgc3Bfbm9kZSAqc3BfYWxsb2ModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXFxubW0vbWVtcG9saWN5LmMtMzE3OC1cXHRcXHRcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0zMjc1PXZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxcbi0tXFxubW0vbWVtcG9saWN5LmMtMzMwMS1cXHRcXHQvKiBhbGxvYyBub2RlIGNvdmVyaW5nIGVudGlyZSBmaWxlOyBhZGRzIHJlZiB0byBmaWxlJ3MgbnBvbCAqL1xcbm1tL21lbXBvbGljeS5jOjMzMDI6XFx0XFx0c24gPSBzcF9hbGxvYygwLCBNQVhfTEZTX0ZJTEVTSVpFIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsIG5wb2wpO1xcbm1tL21lbXBvbGljeS5jLTMzMDMtXFx0XFx0aWYgKHNuKVxcbi0tXFxubW0vbWVtcG9saWN5LmM9MzMzMj1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zMzM4LVxcdGlmIChwb2wpIHtcXG5tbS9tZW1wb2xpY3kuYzozMzM5OlxcdFxcdG5ldyA9IHNwX2FsbG9jKHN0YXJ0LCBlbmQsIHBvbCk7XFxubW0vbWVtcG9saWN5LmMtMzM0MC1cXHRcXHRpZiAoIW5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6NDQuODcxNTkzOTcyWiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNTQxMTcyNTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgaW1tZWRpYXRlIHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB0aGUgTm9kZSBJbml0aWFsaXphdGlvbiBhbmQgQWxsb2NhdGlvbiBGdW5jdGlvbnMqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiBob3cgb3VyIHN5c3RlbSBoYW5kbGVzIG5vZGUgaW5pdGlhbGl6YXRpb24gYW5kIGFsbG9jYXRpb24uIFNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IGBzcF9ub2RlX2luaXRgIGFuZCBgc3BfYWxsb2NgLiBJIG5lZWQgdG8gZW5zdXJlIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGlzIHNvdW5kIGFuZCB0aGF0IHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVneSBpcyBzdGlsbCBlZmZpY2llbnQgYW5kIGRvZXNuJ3QgaGF2ZSBhbnkgaGlkZGVuIGdvdGNoYXMuIEkgd2FudCB0byBxdWlja2x5IHZlcmlmeSB0aGF0IHdlJ3JlIHN0aWxsIGhhbmRsaW5nIGVkZ2UgY2FzZXMgY29ycmVjdGx5LCBlc3BlY2lhbGx5IGFyb3VuZCByZXNvdXJjZSBjb250ZW50aW9uIG9yIHBvdGVudGlhbCBtZW1vcnkgbGVha3MuIEl04oCZcyBhbHNvIGNydWNpYWwgdG8gc2VlIGlmIHRoZXJlIGhhdmUgYmVlbiBhbnkgcmVjZW50IGNoYW5nZXMgaW4gdGhlc2UgYXJlYXMuIExldCdzIHNlZSB3aGF0IHRoZSBjb2RlIGhhcyB0byBzYXkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3MzIwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6NDYuOTI1NzE0MjM0WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5ODAyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1wb2xpY3kuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMTY4LFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIzMTY4OlxcdFxcbjMxNjk6XFx0c3RhdGljIHZvaWQgc3Bfbm9kZV9pbml0KHN0cnVjdCBzcF9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbjMxNzA6XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcXG4zMTcxOlxcdHtcXG4zMTcyOlxcdFxcdG5vZGUtXFx1MDAzZXN0YXJ0ID0gc3RhcnQ7XFxuMzE3MzpcXHRcXHRub2RlLVxcdTAwM2VlbmQgPSBlbmQ7XFxuMzE3NDpcXHRcXHRub2RlLVxcdTAwM2Vwb2xpY3kgPSBwb2w7XFxuMzE3NTpcXHR9XFxuMzE3NjpcXHRcXG4zMTc3OlxcdHN0YXRpYyBzdHJ1Y3Qgc3Bfbm9kZSAqc3BfYWxsb2ModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXFxuMzE3ODpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuMzE3OTpcXHR7XFxuMzE4MDpcXHRcXHRzdHJ1Y3Qgc3Bfbm9kZSAqbjtcXG4zMTgxOlxcdFxcdHN0cnVjdCBtZW1wb2xpY3kgKm5ld3BvbDtcXG4zMTgyOlxcdFxcbjMxODM6XFx0XFx0biA9IGttZW1fY2FjaGVfYWxsb2Moc25fY2FjaGUsIEdGUF9LRVJORUwpO1xcbjMxODQ6XFx0XFx0aWYgKCFuKVxcbjMxODU6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMzE4NjpcXHRcXG4zMTg3OlxcdFxcdG5ld3BvbCA9IG1wb2xfZHVwKHBvbCk7XFxuMzE4ODpcXHRcXHRpZiAoSVNfRVJSKG5ld3BvbCkpIHtcXG4zMTg5OlxcdFxcdFxcdGttZW1fY2FjaGVfZnJlZShzbl9jYWNoZSwgbik7XFxuMzE5MDpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4zMTkxOlxcdFxcdH1cXG4zMTkyOlxcdFxcdG5ld3BvbC1cXHUwMDNlZmxhZ3MgfD0gTVBPTF9GX1NIQVJFRDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDg6NDYuOTI1OTE0OTE0WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQwNDk1OTI5NzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGBrdm1fZ21lbV9jcmVhdGVgIGZvciBQb3RlbnRpYWwgVnVsbmVyYWJpbGl0aWVzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGt2bV9nbWVtX2NyZWF0ZWAgZnVuY3Rpb24gd2l0aGluIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYC4gVGhlIGNvcmUgc2VlbXMgdG8gYmUgaGVyZTpcbmBgYGNcbmludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbntcblx0bG9mZl90IHNpemUgPSBhcmdzLVx1MDAzZXNpemU7XG5cdHU2NCBmbGFncyA9IGFyZ3MtXHUwMDNlZmxhZ3M7XG5cdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuXG5cdGlmIChmbGFncyBcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcblx0XHRyZXR1cm4gLUVJTlZBTDtcblxuXHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcblx0XHRyZXR1cm4gLUVJTlZBTDtcblxuXHRpZiAoZmxhZ3MgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XG5cdFx0aWYgKGFyZ3MtXHUwMDNlcGFkIHx8IGFyZ3MtXHUwMDNlbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcblx0XHRcdHJldHVybiAtRUlOVkFMO1xuXHRcdG5vZGUgPSBhcmdzLVx1MDAzZW5vZGU7XG5cdH0gZWxzZSBpZiAoYXJncy1cdTAwM2Vub2RlIHx8IGFyZ3MtXHUwMDNlcGFkKSB7XG5cdFx0cmV0dXJuIC1FSU5WQUw7XG5cdH1cblxuXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncywgbm9kZSk7XG59XG5gYGBcblxuTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IEknbSBzY2FubmluZyB0aGlzIGNvZGUsIGxvb2tpbmcgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMsIGFuZCBhIHJlZCBmbGFnIGp1c3Qgd2VudCB1cC4gIEkgc2VlIGNoZWNrcyBmb3IgYHNpemVgLCBgZmxhZ3NgLCBhbmQgYG5vZGVgLCBidXQuLi4gaG9sZCBvbi4gV2hlcmUncyB0aGUgdmFsaWRhdGlvbiBmb3IgYGFyZ3MtXHUwMDNlcmVzZXJ2ZWRgPyBJcyB0aGlzIGEgbmV3IHN0cnVjdHVyZSBvciBmdW5jdGlvbj8gTGV0J3MgYXNzdW1lIHRoYXQgdGhlcmUncyBhIHJlYXNvbiBmb3IgdGhpcyBvbWlzc2lvbiwgYnV0IGl0J3MgaW1wb3J0YW50IHRvIGxvb2shIEkgbmVlZCB0byBxdWlja2x5IGRldGVybWluZSB3aGV0aGVyIGBhcmdzLVx1MDAzZXJlc2VydmVkYCBtaWdodCBoYXZlIGJlZW4gdXNlZCBpbiBhbnkgb3RoZXIgcGxhY2UuIEl0J3MgcmVhbGx5IGVhc3kgdG8gbWFrZSBhbiBlcnJvciBvbiB0aGVzZSBuZXcgQVBJJ3MgYW5kIG5vdCBoYW5kbGUgYWxsIHBvdGVudGlhbCBiYWQgdmFsdWVzLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUgd2lkZXIgY29udGV4dC4gSSBuZWVkIHRvIGdyZXAgdGhlIHJlc3Qgb2YgYGd1ZXN0X21lbWZkLmNgIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgZmlsZXMgb3IgaGVhZGVyIGZpbGVzIHRvIHNlZSBpZiBhbmQgd2hlcmUgdGhlIGBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkYCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgYW5kIGhvdyBpdCdzIHVzZWQuIE1heWJlIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlIGhhZCBwYWRkaW5nLCBhbmQgdGhpcyBmaWVsZCBpcyBtZWFudCBmb3IgYWxpZ25tZW50LCBpbiB3aGljaCBjYXNlIGl0IGlzIGV4cGVjdGVkIHRvIGJlIGlnbm9yZWQuIEkgd2FudCB0byBzZWUgaG93IGBhcmdzYCB3YXMgaGFuZGxlZCBiZWZvcmUgdGhpcyBwYXJ0aWN1bGFyIHBhdGNoIG9yIGNvbW1pdCwgYW5kIGlmIGFueSBwcmV2aW91cyB2ZXJzaW9ucyBpbmNsdWRlZCBhIGNoZWNrIGZvciB0aGUgYHJlc2VydmVkYCBmaWVsZC4gVGhhdCB3b3VsZCBjb25maXJtIHdoZXRoZXIgdGhpcyBpcyBhIG5ld2x5IGludHJvZHVjZWQgb3ZlcnNpZ2h0LCBvciB3aGV0aGVyIGl0IHdhcyBhbHdheXMgaW50ZW5kZWQgdG8gYmUgaWdub3JlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc4NzIsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODo1MC45NzU1MTE4MDJaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAyNDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTkwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTkwOlxcdFxcdFxcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XFxuIDU5MTpcXHRcXHRcXHRpZiAoZXJyKVxcbiA1OTI6XFx0XFx0XFx0XFx0Z290byBlcnJfaW5vZGU7XFxuIDU5MzpcXHRcXHR9XFxuIDU5NDpcXHRcXG4gNTk1OlxcdFxcdGZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsIFxcdTAwMjZrdm1fZ21lbV9mb3BzKTtcXG4gNTk2OlxcdFxcdGlmIChJU19FUlIoZmlsZSkpIHtcXG4gNTk3OlxcdFxcdFxcdGVyciA9IFBUUl9FUlIoZmlsZSk7XFxuIDU5ODpcXHRcXHRcXHRnb3RvIGVycl9pbm9kZTtcXG4gNTk5OlxcdFxcdH1cXG4gNjAwOlxcdFxcbiA2MDE6XFx0XFx0ZmlsZS1cXHUwMDNlZl9mbGFncyB8PSBPX0xBUkdFRklMRTtcXG4gNjAyOlxcdFxcdGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YSA9IGY7XFxuIDYwMzpcXHRcXG4gNjA0OlxcdFxcdGt2bV9nZXRfa3ZtKGt2bSk7XFxuIDYwNTpcXHRcXHRmLVxcdTAwM2Vrdm0gPSBrdm07XFxuIDYwNjpcXHRcXHR4YV9pbml0KFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncyk7XFxuIDYwNzpcXHRcXHRsaXN0X2FkZChcXHUwMDI2Zi1cXHUwMDNlZW50cnksIFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2VnbWVtX2ZpbGVfbGlzdCk7XFxuIDYwODpcXHRcXG4gNjA5OlxcdFxcdGZkX2luc3RhbGwoZmQsIGZpbGUpO1xcbiA2MTA6XFx0XFx0cmV0dXJuIGZkO1xcbiA2MTE6XFx0XFxuIDYxMjpcXHRlcnJfaW5vZGU6XFxuIDYxMzpcXHRcXHRpcHV0KGlub2RlKTtcXG4gNjE0OlxcdGVycl9mb3BzOlxcbiA2MTU6XFx0XFx0Zm9wc19wdXQoXFx1MDAyNmt2bV9nbWVtX2ZvcHMpO1xcbiA2MTY6XFx0ZXJyX2dtZW06XFxuIDYxNzpcXHRcXHRrZnJlZShmKTtcXG4gNjE4OlxcdGVycl9mZDpcXG4gNjE5OlxcdFxcdHB1dF91bnVzZWRfZmQoZmQpO1xcbiA2MjA6XFx0XFx0cmV0dXJuIGVycjtcXG4gNjIxOlxcdH1cXG4gNjIyOlxcdFxcbiA2MjM6XFx0aW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxcbiA2MjQ6XFx0e1xcbiA2MjU6XFx0XFx0bG9mZl90IHNpemUgPSBhcmdzLVxcdTAwM2VzaXplO1xcbiA2MjY6XFx0XFx0dTY0IGZsYWdzID0gYXJncy1cXHUwMDNlZmxhZ3M7XFxuIDYyNzpcXHRcXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcXG4gNjI4OlxcdFxcbiA2Mjk6XFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSlcXG4gNjMwOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA2MzE6XFx0XFxuIDYzMjpcXHRcXHRpZiAoc2l6ZSBcXHUwMDNjPSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpXFxuIDYzMzpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjM0OlxcdFxcbiA2MzU6XFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcXG4gNjM2OlxcdFxcdFxcdGlmIChhcmdzLVxcdTAwM2VwYWQgfHwgYXJncy1cXHUwMDNlbm9kZSBcXHUwMDNlPSBNQVhfTlVNTk9ERVMpXFxuIDYzNzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjM4OlxcdFxcdFxcdG5vZGUgPSBhcmdzLVxcdTAwM2Vub2RlO1xcbiA2Mzk6XFx0XFx0fSBlbHNlIGlmIChhcmdzLVxcdTAwM2Vub2RlIHx8IGFyZ3MtXFx1MDAzZXBhZCkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTowODo1MC45NzU2MTY2NDJaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTEwMDc4MjA5NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQW5hbHlzaXMgb2YgR3Vlc3QgTWVtZmQgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCB0aGUgYGFyZ3NgIHBhc3NlZCBpbnRvIGBrdm1fZ21lbV9jcmVhdGVgIGFmdGVyIGBjb3B5X2Zyb21fdXNlcmAgaW4gYGt2bV92bV9pb2N0bGAgaXMgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhlbiB0aGUgY3JpdGljYWwgdGhpbmcgaXMgdGhhdCBub3RoaW5nIGlzIGNvcGllZCAqYmFjayogdG8gdXNlcnNwYWNlLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGxlYWtlZC4gR29vZC4gSSdtIGFsc28gY29uZmlybWluZyB0aGF0IG5vIGtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlcnNwYWNlIGFyZSBtb2RpZmllZC5cblxuTm93LCBsZXQncyBtZXRpY3Vsb3VzbHkgY2hlY2sgZm9yIGJyYW5jaGVzIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgd2hpY2ggaXMgd2hlcmUgS01TQU4gdXN1YWxseSBiaXRlcy4gSSBzZWUgYG5vZGVzYCBpbiBga3ZtX2dtZW1fYmluZF9ub2RlYCBnZXRzIGluaXRpYWxpemVkIHdpdGggYGluaXRfbm9kZW1hc2tfb2Zfbm9kZWAuIGBzY3JhdGNoYCBpbiBgbWVtcG9saWN5X2NyZWF0ZWAgaXMgY292ZXJlZCBieSBgTk9ERU1BU0tfU0NSQVRDSGAuIGBuZXdgIGluIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBpcyBpbml0aWFsaXplZCB0byBOVUxMIG9yIGBzcF9hbGxvY2AuIFRoZSBgZ3Vlc3RfbWVtZmRgIGFyZ3VtZW50LCByZWFkIGZyb20gdXNlcnNwYWNlIHZpYSBgY29weV9mcm9tX3VzZXJgLCBpcyBvZiBwYXJ0aWN1bGFyIG5vdGUsIGJ1dCBzZWVtcyBzYWZlLiBBbmQsIGZpbmFsbHksIGBub2RlYCBpbiBga3ZtX2dtZW1fY3JlYXRlYCBpcyBpbml0aWFsaXplZCwgdG9vLiBBbGwgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4gTm8gbmV3IGRhdGEgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2Ug4oCTIG5vIGluZm9ybWF0aW9uIGxlYWtzLiBUaGF0J3MgYSBodWdlIHdpbi5cblxuTGV0J3MgcnVuIHRocm91Z2ggdGhlIEtNU0FOIGNyaXRlcmlhIG1ldGhvZGljYWxseSwgdG8gbWFrZSBzdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYW55dGhpbmcuXG5cbjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlcnNwYWNlKio6IE5vIGBjb3B5X3RvX3VzZXJgIGhlcmUsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgc2ltcGx5IHJldHVybnMgYW4gRkQuIFRoaXMgaXMgY2xlYW4uXG4yLiAgKipDb25kaXRpb25hbCBsb2dpYyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyoqOiBOb3BlLCBhbGwgc3RhY2sgdmFyaWFibGVzIGxpa2UgYG5vZGVzYCwgYHNjcmF0Y2hgLCBgbm9kZWAgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLlxuMy4gICoqQWxsb2NhdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyoqOiBgbWVtcG9saWN5X2NyZWF0ZWAgYnVpbGRzIGEgdmFsaWRhdGVkIGBzdHJ1Y3QgbWVtcG9saWN5YCB1c2luZyBzdGFuZGFyZCBgbXBvbF9uZXdgIC8gYG1wb2xfc2V0X25vZGVtYXNrYC4gYHNwX2FsbG9jYCBjb3ZlcnMgYHNwX25vZGVgIGluaXRpYWxpemF0aW9uLiBGaW5lLlxuNC4gICoqQm91bmRzIGNoZWNrcyBleHBvc2luZyB1bmluaXRpYWxpemVkIGJ5dGVzKio6IE5vdCByZWxldmFudCBoZXJlLlxuXG5UaGVyZWZvcmUsIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGFyZSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEFueSBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgdGhhdCBkbyBhcmlzZSAodXNlLWFmdGVyLWZyZWUsIHJlZmNvdW50IHByb2JsZW1zIGluIG1lbXBvbGljeSBvciBnbWVtKSB3b3VsZCBiZSBoYW5kbGVkIGJ5IEtBU0FOIOKAkyBhbmQgS0FTQU4gaXMgYWxyZWFkeSBlbmFibGVkLiBUaHVzLCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgLlxuXG5TbywgdGhlIEtNU0FOIHJlYXNvbmluZyBpczogS01TQU4gZGV0ZWN0cyByZWFkcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgaW5mbyBsZWFrcy4gVGhpcyBwYXRjaCBhZGRzIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgYW5kIHJlbGF0ZWQgaGVscGVycyBpbiBgbW0vbWVtcG9saWN5LmNgLiBUaGUgaW9jdGwgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGNvcGllcyBhcmd1bWVudHMgZnJvbSB1c2Vyc3BhY2UgYnV0IGRvZXNuJ3QgY29weSBrZXJuZWwgZGF0YSBiYWNrLiBBbGwgdmFyaWFibGVzIGFuZCBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZC4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IGlzc3VlcyBhcmUgS0FTQU4ncyBkb21haW4uIE5vIEtNU0FOIG5lZWRlZC5cblxuT2theSwgdGltZSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTk0OTcsIk91dHB1dFRva2VucyI6MzM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODUwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MDk6MDEuOTgzNDQyNDc1WiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg0MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaW4gS1ZNJ3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cXG5cXG5LTVNBTiB2cyBLQVNBTiBhcHBsaWNhYmlsaXR5Olxcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cXG4tIEluIHRoaXMgcGF0Y2gsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcmVhZHMgdXNlciBhcmd1bWVudHMgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgaW50ZWdlcjsgbm8ga2VybmVsIHN0cnVjdHVyZXMsIHBhZGRpbmcsIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UuXFxuLSBBbGwgbmV3bHkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBzdGFjayBhbmQgaGVhcCB2YXJpYWJsZXMgKGUuZy4sIGBub2RlbWFza190IG5vZGVzYCBpbml0aWFsaXplZCB2aWEgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgpYCwgYHNjcmF0Y2hgIGluaXRpYWxpemVkIHZpYSBgTk9ERU1BU0tfU0NSQVRDSCgpYCwgYW5kIGBzdHJ1Y3Qgc3Bfbm9kZWAvYHN0cnVjdCBtZW1wb2xpY3lgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBzdGFuZGFyZCBtbSBoZWxwZXJzKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cXG4tIEFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIE5VTUEgcG9saWN5IHJlZmVyZW5jZSBjb3VudGluZywgbGlmZWN5Y2xlIGlzc3Vlcywgb3IgYWxsb2NhdGlvbiBmYWlsdXJlcykgZmFsbCB1bmRlciB0aGUgc2NvcGUgb2YgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaW4gS1ZNJ3MgZ3Vlc3RfbWVtZmQgc3Vic3lzdGVtIGFsb25nIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBgbWVtcG9saWN5X2NyZWF0ZSgpYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UoKWAgaW4gYG1tL21lbXBvbGljeS5jYC5cXG5cXG5LTVNBTiB2cyBLQVNBTiBhcHBsaWNhYmlsaXR5Olxcbi0gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyAob24gc3RhY2ssIGhlYXAsIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS5cXG4tIEluIHRoaXMgcGF0Y2gsIHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcmVhZHMgdXNlciBhcmd1bWVudHMgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgaW50ZWdlcjsgbm8ga2VybmVsIHN0cnVjdHVyZXMsIHBhZGRpbmcsIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UuXFxuLSBBbGwgbmV3bHkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBzdGFjayBhbmQgaGVhcCB2YXJpYWJsZXMgKGUuZy4sIGBub2RlbWFza190IG5vZGVzYCBpbml0aWFsaXplZCB2aWEgYGluaXRfbm9kZW1hc2tfb2Zfbm9kZSgpYCwgYHNjcmF0Y2hgIGluaXRpYWxpemVkIHZpYSBgTk9ERU1BU0tfU0NSQVRDSCgpYCwgYW5kIGBzdHJ1Y3Qgc3Bfbm9kZWAvYHN0cnVjdCBtZW1wb2xpY3lgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhyb3VnaCBzdGFuZGFyZCBtbSBoZWxwZXJzKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cXG4tIFRoZXJlIGFyZSBubyBicmFuY2hpbmcgY29uZGl0aW9ucyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBvciBhbHRlcmVkIGRhdGEgYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbnMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBieXRlcy5cXG4tIEFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIE5VTUEgcG9saWN5IHJlZmVyZW5jZSBjb3VudGluZywgbGlmZWN5Y2xlIGlzc3Vlcywgb3IgYWxsb2NhdGlvbiBmYWlsdXJlcykgZmFsbCB1bmRlciB0aGUgc2NvcGUgb2YgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[1] Phase: Succeeded StartedAt: 2026-09-03 19:09:13 +0000 UTC FinishedAt: 2026-09-03 19:09:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-03 19:09:14 +0000 UTC FinishedAt: 2026-09-03 19:09:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2] Phase: Succeeded StartedAt: 2026-09-03 19:09:14 +0000 UTC FinishedAt: 2026-09-03 22:46:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-03 19:09:14 +0000 UTC FinishedAt: 2026-09-03 22:46:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-03 19:09:14 +0000 UTC FinishedAt: 2026-09-03 19:09:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-03 19:09:14 +0000 UTC FinishedAt: 2026-09-03 19:09:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-convert-artifact-2815179303/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-03 19:09:24 +0000 UTC FinishedAt: 2026-09-03 19:25:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-03 19:09:24 +0000 UTC FinishedAt: 2026-09-03 19:25:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*b3f87f22-595b-4dc4-9949-0b96b5ee67a3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-convert-artifact-2815179303/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "c9f40dfa-bc24-407a-b7ec-6e33ffa2340a", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1992591805/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-03 19:09:24 +0000 UTC FinishedAt: 2026-09-03 19:24:57 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*b3f87f22-595b-4dc4-9949-0b96b5ee67a3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-convert-artifact-2815179303/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "c9f40dfa-bc24-407a-b7ec-6e33ffa2340a", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1992591805/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-03 19:25:07 +0000 UTC FinishedAt: 2026-09-03 19:25:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-03 19:25:07 +0000 UTC FinishedAt: 2026-09-03 19:25:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-03 19:25:07 +0000 UTC FinishedAt: 2026-09-03 19:25:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-03 19:25:07 +0000 UTC FinishedAt: 2026-09-03 19:25:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-convert-artifact-763562966/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-03 19:25:17 +0000 UTC FinishedAt: 2026-09-03 19:27:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-03 19:25:17 +0000 UTC FinishedAt: 2026-09-03 19:27:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*c9f40dfa-bc24-407a-b7ec-6e33ffa2340a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1992591805/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-03 19:27:35 +0000 UTC FinishedAt: 2026-09-03 19:27:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-03 19:27:35 +0000 UTC FinishedAt: 2026-09-03 19:27:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-03 19:27:35 +0000 UTC FinishedAt: 2026-09-03 19:43:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-03 19:27:35 +0000 UTC FinishedAt: 2026-09-03 19:43:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*b3f87f22-595b-4dc4-9949-0b96b5ee67a3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-convert-artifact-763562966/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "91a37ca8-d8bb-416b-b00e-7e0c5d7c2f51", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1580708314/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-03 19:27:35 +0000 UTC FinishedAt: 2026-09-03 19:43:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*b3f87f22-595b-4dc4-9949-0b96b5ee67a3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-convert-artifact-763562966/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "91a37ca8-d8bb-416b-b00e-7e0c5d7c2f51", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1580708314/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-03 19:43:16 +0000 UTC FinishedAt: 2026-09-03 19:43:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-03 19:43:16 +0000 UTC FinishedAt: 2026-09-03 19:43:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-03 19:43:16 +0000 UTC FinishedAt: 2026-09-03 19:45:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-03 19:43:16 +0000 UTC FinishedAt: 2026-09-03 19:45:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*91a37ca8-d8bb-416b-b00e-7e0c5d7c2f51,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1580708314/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-03 19:45:12 +0000 UTC FinishedAt: 2026-09-03 22:46:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-03 19:45:12 +0000 UTC FinishedAt: 2026-09-03 22:46:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*c9f40dfa-bc24-407a-b7ec-6e33ffa2340a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*91a37ca8-d8bb-416b-b00e-7e0c5d7c2f51,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1992591805/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1580708314/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-03 19:45:12 +0000 UTC FinishedAt: 2026-09-03 19:45:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-03 19:45:12 +0000 UTC FinishedAt: 2026-09-03 19:45:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-convert-artifact-2984804731/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-03 19:45:12 +0000 UTC FinishedAt: 2026-09-03 19:45:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-03 19:45:12 +0000 UTC FinishedAt: 2026-09-03 19:45:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-03 19:45:12 +0000 UTC FinishedAt: 2026-09-03 19:45:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-03 19:45:22 +0000 UTC FinishedAt: 2026-09-03 22:46:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowlzzkd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kvm_gmem_create","kvm_gmem_bind_node","mempolicy_create","mpol_set_shared_policy_range","mpol_set_shared_policy"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","NUMA"],"series_id":"78619b4c-8664-4bef-833f-0917bd20ca92","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-03 19:45:22 +0000 UTC FinishedAt: 2026-09-03 22:46:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*c9f40dfa-bc24-407a-b7ec-6e33ffa2340a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*91a37ca8-d8bb-416b-b00e-7e0c5d7c2f51,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1992591805/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-build-action-1580708314/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowlzzkd/series-workflowlzzkd-convert-artifact-2984804731/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}