Name: series-workflow2hc96 Phase: Succeeded StartedAt: 2026-07-07 14:54:02 +0000 UTC FinishedAt: 2026-07-07 19:43:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[0] Phase: Succeeded StartedAt: 2026-07-07 14:54:02 +0000 UTC FinishedAt: 2026-07-07 15:13:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[0].run-triage Phase: Succeeded StartedAt: 2026-07-07 14:54:02 +0000 UTC FinishedAt: 2026-07-07 15:13:00 +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": "01bc0932614c2d3c35e732f54d249b5897d94307", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ZSWAP", "ZSWAP_DEFAULT_ON" ], "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": "01bc0932614c2d3c35e732f54d249b5897d94307", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ZSWAP", "ZSWAP_DEFAULT_ON" ], "series_id": "1a9cfadb-ed85-48c1-b1b3-a3c12ea99471" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "zswap_store", "zswap_load", "zswap_invalidate", "zswap_writeback_entry", "__swap_cache_do_add_folio", "__swap_cache_do_del_folio", "__swap_cluster_put_entry", "__swap_cluster_free_entries", "__swap_cluster_dup_entry", "zswap_swp_tb_dup_count", "zswap_swp_tb_put_count" ], "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+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1pTV0FQJiMzNDssCiAgICAmIzM0O1pTV0FQX0RFRkFVTFRfT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICAgJiMzNDt6c3dhcF9sb2FkJiMzNDssCiAgICAmIzM0O3pzd2FwX2ludmFsaWRhdGUmIzM0OywKICAgICYjMzQ7enN3YXBfd3JpdGViYWNrX2VudHJ5JiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8mIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpbyYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnkmIzM0OywKICAgICYjMzQ7X19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzJiMzNDssCiAgICAmIzM0O19fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeSYjMzQ7LAogICAgJiMzNDt6c3dhcF9zd3BfdGJfZHVwX2NvdW50JiMzNDssCiAgICAmIzM0O3pzd2FwX3N3cF90Yl9wdXRfY291bnQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZnVuZGFtZW50YWxseSBjaGFuZ2VzIGhvdyB6c3dhcCB0cmFja3MgY29tcHJlc3NlZCBwYWdlcyBieSBlbWJlZGRpbmcgYHpzd2FwX2VudHJ5YCBwb2ludGVycyBkaXJlY3RseSBpbnRvIHRoZSBjb3JlIHN3YXAgdGFibGUgKGBzd2FwX2NsdXN0ZXJfaW5mb2ApIHJhdGhlciB0aGFuIHVzaW5nIGEgc2VwYXJhdGUgeGFycmF5IChgenN3YXBfdHJlZXNgKS4gVGhpcyBhZmZlY3RzIGNvcmUgc3dhcCBhbGxvY2F0aW9uLCBmcmVlaW5nLCBhbmQgbG9va3VwIHBhdGhzLCByZXF1aXJpbmcgZnV6emluZyB0byBlbnN1cmUgbm8gbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZXMsIG9yIHN3YXAgYWNjb3VudGluZyBlcnJvcnMgb2NjdXIgZHVyaW5nIGNvbmN1cnJlbnQgc3dhcCBvcGVyYXRpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZjIwMTE5ODU4NzYzMTIxNWY3MDhmNTg4NmE5ODEwMzIzZmJjMjM5OVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDcgMTU6MTE6MTggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC96c3dhcC5oIGIvaW5jbHVkZS9saW51eC96c3dhcC5oXG5pbmRleCAzMGMxOTNhMTIwN2UxNi4uNGY1NWM4ZDBjNGM1NDIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3pzd2FwLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvenN3YXAuaFxuQEAgLTI2LDcgJiM0MzsyNiw3IEBAIHN0cnVjdCB6c3dhcF9scnV2ZWNfc3RhdGUge1xuIFxuIHVuc2lnbmVkIGxvbmcgenN3YXBfdG90YWxfcGFnZXModm9pZCk7XG4gYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbiYjNDM7aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KTtcbiB2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcbiBpbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTtcbiB2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpO1xuQEAgLTQ0LDcgJiM0Mzs0NCw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KVxuIHtcbiBcdHJldHVybiAtRU5PRU5UO1xuIH1cbmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmNcbmluZGV4IGIyM2Y0OTRmY2M4M2RhLi4xY2U4MjAxZWQ4NmUyNCAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfaW8uY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9pby5jXG5AQCAtNjU4LDcgJiM0Mzs2NTgsNyBAQCBzdGF0aWMgdm9pZCBzd2FwX3JlYWRfZm9saW9fYmRldl9hc3luYyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIFx0c3VibWl0X2JpbyhiaW8pO1xuIH1cbiBcbi12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZylcbiYjNDM7dm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsIHZvaWQgKnplbnRyeSlcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzID0gX19zd2FwX2VudHJ5X3RvX2luZm8oZm9saW8tXHUwMDNlc3dhcCk7XG4gXHRib29sIHN5bmNocm9ub3VzID0gc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU1lOQ0hST05PVVNfSU87XG5AQCAtNjg2LDcgJiM0Mzs2ODYsNyBAQCB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZylcbiBcdFx0Z290byBmaW5pc2g7XG4gXHR9XG4gXG4tXHRpZiAoenN3YXBfbG9hZChmb2xpbykgIT0gLUVOT0VOVClcbiYjNDM7XHRpZiAoenN3YXBfbG9hZChmb2xpbywgemVudHJ5KSAhPSAtRU5PRU5UKVxuIFx0XHRnb3RvIGZpbmlzaDtcbiBcbiBcdC8qIFdlIGhhdmUgdG8gcmVhZCBmcm9tIHNsb3dlciBkZXZpY2VzLiBJbmNyZWFzZSB6c3dhcCBwcm90ZWN0aW9uLiAqL1xuZGlmZiAtLWdpdCBhL21tL3N3YXAuaCBiL21tL3N3YXAuaFxuaW5kZXggNDRhYjhlMWU1OTViMDguLjg0ZTEzYmE2ZTYwNWMzIDEwMDY0NFxuLS0tIGEvbW0vc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwLmhcbkBAIC0yMTAsNiAmIzQzOzIxMCw0MSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jbHVzdGVyX3VubG9ja19pcnEoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSlcbiBcbiBleHRlcm4gaW50IHN3YXBfcmV0cnlfdGFibGVfYWxsb2Moc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCk7XG4gXG4mIzQzO3N0cnVjdCB6c3dhcF9lbnRyeTtcbiYjNDM7I2lmZGVmIENPTkZJR19aU1dBUFxuJiM0Mzt2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90Yik7XG4mIzQzO3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90Yik7XG4mIzQzO3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90Yik7XG4mIzQzO2ludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuJiM0MztcdFx0XHQgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKTtcbiYjNDM7dm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuJiM0MztcdFx0XHQgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZik7XG4mIzQzO3ZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KTtcbiYjNDM7I2Vsc2VcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztzdGF0aWMgaW5saW5lIGludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4mIzQzO1x0XHRcdFx0XHQgdW5zaWduZWQgaW50IGNpX29mZilcbiYjNDM7e1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuJiM0MztcdFx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgY2lfb2ZmKSB7fVxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KSB7fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4gLypcbiAgKiBCZWxvdyBhcmUgdGhlIGNvcmUgcm91dGluZXMgZm9yIGRvaW5nIHN3YXAgZm9yIGEgZm9saW8uXG4gICogQWxsIGhlbHBlcnMgcmVxdWlyZXMgdGhlIGZvbGlvIHRvIGJlIGxvY2tlZCwgYW5kIGEgbG9ja2VkIGZvbGlvXG5AQCAtMjQxLDcgJiM0MzsyNzYsNyBAQCBleHRlcm4gdm9pZCBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIC8qIGxpbnV4L21tL3BhZ2VfaW8uYyAqL1xuIGludCBzaW9fcG9vbF9pbml0KHZvaWQpO1xuIHN0cnVjdCBzd2FwX2lvY2I7XG4tdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcpO1xuJiM0Mzt2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KTtcbiB2b2lkIF9fc3dhcF9yZWFkX3VucGx1ZyhzdHJ1Y3Qgc3dhcF9pb2NiICpwbHVnKTtcbiBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX3VucGx1ZyhzdHJ1Y3Qgc3dhcF9pb2NiICpwbHVnKVxuIHtcbkBAIC0zMDMsMTMgJiM0MzszMzgsMTYgQEAgc3RhdGljIGlubGluZSBib29sIGZvbGlvX21hdGNoZXNfc3dhcF9lbnRyeShjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIGJvb2wgc3dhcF9jYWNoZV9oYXNfZm9saW8oc3dwX2VudHJ5X3QgZW50cnkpO1xuIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9nZXRfZm9saW8oc3dwX2VudHJ5X3QgZW50cnkpO1xuIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSk7XG4mIzQzO2Jvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbiB2b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BfZW50cnlfdCB0YXJnZXRfZW50cnksIGdmcF90IGdmcF9tYXNrLFxuIFx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIG9yZGVycywgc3RydWN0IHZtX2ZhdWx0ICp2bWYsXG4tXHRcdFx0XHQgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KTtcbiYjNDM7XHRcdFx0XHQgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LFxuJiM0MztcdFx0XHRcdCAgICAgdm9pZCAqKnplbnRyeSk7XG4gLyogQmVsb3cgaGVscGVycyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gbG9jayBhbmQgcGFzcyBpbiB0aGUgc3dhcCBjbHVzdGVyLiAqL1xuIHZvaWQgX19zd2FwX2NhY2hlX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuLVx0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSk7XG4mIzQzO1x0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcbiYjNDM7XHRcdFx0ICAgIHZvaWQgKip6ZW50cnkpO1xuIHZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTtcbiB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5AQCAtMzgxLDcgJiM0Mzs0MTksOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKVxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnLFxuJiM0MztcdFx0XHRcdCAgIHZvaWQgKnplbnRyeSlcbiB7XG4gfVxuIFxuQEAgLTQ1Myw2ICYjNDM7NDkyLDExIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3dhcF9jYWNoZV9nZXRfc2hhZG93KHN3cF9lbnRyeV90IGVudHJ5KVxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCA2ZmQ2ZTM0MTViNzE4Yi4uNjBkOTM3YzZiMzkyMjQgMTAwNjQ0XG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfc3RhdGUuY1xuQEAgLTE3NSwxNiAmIzQzOzE3NSwyOSBAQCBzdGF0aWMgaW50IF9fc3dhcF9jYWNoZV9hZGRfY2hlY2soc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4gXHRpZiAoc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikpXG4gXHRcdHJldHVybiAtRUVYSVNUO1xuLVx0aWYgKCFfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcbiYjNDM7XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkge1xuJiM0MztcdFx0aWYgKCF6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdH0gZWxzZSBpZiAoIV9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKSB7XG4gXHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdH1cbiBcdGlmIChzaGFkb3dwIFx1MDAyNlx1MDAyNiBzd3BfdGJfaXNfc2hhZG93KG9sZF90YikpXG4gXHRcdCpzaGFkb3dwID0gc3dwX3RiX3RvX3NoYWRvdyhvbGRfdGIpO1xuJiM0MztcdGVsc2UgaWYgKHNoYWRvd3AgXHUwMDI2XHUwMDI2IHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXG4mIzQzO1x0XHQqc2hhZG93cCA9IHpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KG9sZF90Yik7XG4gXHRpZiAobWVtY2dfaWQpXG4gXHRcdCptZW1jZ19pZCA9IF9fc3dhcF9jZ3JvdXBfZ2V0KGNpLCBjaV9vZmYpO1xuIFxuIFx0aWYgKG5yID09IDEpXG4gXHRcdHJldHVybiAwO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogRm9yIG11bHRpLXNsb3QgcmFuZ2VzLCBQb2ludGVyIGVudHJpZXMgYXJlIG5vdCBleHBlY3RlZCBzaW5jZVxuJiM0MztcdCAqIHpzd2FwIGRvZXMgbm90IHN1cHBvcnQgbGFyZ2UgZm9saW9zLiBSZXR1cm4gLUVCVVNZIGZvciBzYWZldHkuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcbiBcdGlzX3plcm8gPSBfX3N3YXBfdGFibGVfdGVzdF96ZXJvKGNpLCBjaV9vZmYpO1xuIFx0Y2lfb2ZmID0gcm91bmRfZG93bihjaV9vZmYsIG5yKTtcbiBcdGNpX2VuZCA9IGNpX29mZiAmIzQzOyBucjtcbkBAIC0yMDEsNyAmIzQzOzIxNCw4IEBAIHN0YXRpYyBpbnQgX19zd2FwX2NhY2hlX2FkZF9jaGVjayhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4tXHRcdFx0XHQgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSlcbiYjNDM7XHRcdFx0XHQgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcbiYjNDM7XHRcdFx0XHQgICAgICB2b2lkICoqemVudHJ5KVxuIHtcbiBcdHVuc2lnbmVkIGludCBjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQoZW50cnkpLCBjaV9lbmQ7XG4gXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuQEAgLTIxNiw3ICYjNDM7MjMwLDM0IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdGRvIHtcbiBcdFx0b2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbiBcdFx0Vk1fV0FSTl9PTl9PTkNFKHN3cF90Yl9pc19mb2xpbyhvbGRfdGIpKTtcbi1cdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBwZm5fdG9fc3dwX3RiKHBmbiwgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBJZiB0aGUgb2xkIGVudHJ5IGlzIGEgUG9pbnRlciAoenN3YXAgY29tcHJlc3NlZCBkYXRhKSxcbiYjNDM7XHRcdCAqIGV4dHJhY3QgdGhlIHpzd2FwX2VudHJ5IGZvciB0aGUgY2FsbGVyIGFuZCBwcmVzZXJ2ZVxuJiM0MztcdFx0ICogaXRzIGZsYWdzLiBUaGUgUG9pbnRlciBlbnRyeSBoYXMgbm8gaW5saW5lIGZsYWdzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBjaGFyIHBmbGFncyA9IHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKTtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogSWYgc3dwX3RiX3ZhbCBjYXJyaWVzIFNXUF9UQl9DT1VOVF9NQVgsIHRoZVxuJiM0MztcdFx0XHQgKiByZWFsIG92ZXJmbG93IGNvdW50IGxpdmVzIGluIGNpLVx1MDAzZWV4dGVuZF90YWJsZS5cbiYjNDM7XHRcdFx0ICogUHVsbCBpdCBzbyB0aGUgbmV3IFBGTiBjYXJyaWVzIHRoZSBjb3JyZWN0IGNvdW50XG4mIzQzO1x0XHRcdCAqIGFuZCB3b24mIzM5O3QgbGF0ZXIgY3Jhc2ggb24gYSBtaXNzaW5nIGV4dGVuZF90YWJsZS5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikgPT0gU1dQX1RCX0NPVU5UX01BWCkge1xuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGNoYXIgcmVhbCA9IFNXUF9UQl9DT1VOVF9NQVggLSAxO1xuJiM0MztcdFx0XHRcdGlmIChjaS1cdTAwM2VleHRlbmRfdGFibGUgXHUwMDI2XHUwMDI2IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdKVxuJiM0MztcdFx0XHRcdFx0cmVhbCA9IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xuJiM0MztcdFx0XHRcdHBmbGFncyA9IChyZWFsIFx1MDAzY1x1MDAzYyAoU1dQX1RCX0ZMQUdTX0JJVFMgLSBTV1BfVEJfQ09VTlRfQklUUykpIHxcbiYjNDM7XHRcdFx0XHRcdCAocGZsYWdzIFx1MDAyNiAoKDEgXHUwMDNjXHUwMDNjIChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgLSAxKSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0aWYgKHplbnRyeSBcdTAwMjZcdTAwMjYgISp6ZW50cnkpXG4mIzQzO1x0XHRcdFx0KnplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKG9sZF90Yik7XG4mIzQzO1x0XHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZixcbiYjNDM7XHRcdFx0XHRwZm5fdG9fc3dwX3RiKHBmbiwgcGZsYWdzKSk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXG4mIzQzO1x0XHRcdFx0cGZuX3RvX3N3cF90YihwZm4sIF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XG4mIzQzO1x0XHR9XG4gXHR9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFxuIFx0Zm9saW9fcmVmX2FkZChmb2xpbywgbnJfcGFnZXMpO1xuQEAgLTIzOSwxMSAmIzQzOzI4MCwxMiBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gICogdGhhdCBob2xkcyB0aGUgZW50cmllcy5cbiAgKi9cbiB2b2lkIF9fc3dhcF9jYWNoZV9hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpXG4mIzQzO1x0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcbiYjNDM7XHRcdFx0ICAgIHZvaWQgKip6ZW50cnkpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbiBcbi1cdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSk7XG4mIzQzO1x0X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhjaSwgZm9saW8sIGVudHJ5LCB6ZW50cnkpO1xuIFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9QQUdFUywgbnJfcGFnZXMpO1xuIFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TV0FQQ0FDSEUsIG5yX3BhZ2VzKTtcbiB9XG5AQCAtMjY5LDE1ICYjNDM7MzExLDI4IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdGNpX29mZiA9IGNpX3N0YXJ0O1xuIFx0ZG8ge1xuIFx0XHRvbGRfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuLVx0XHRXQVJOX09OX09OQ0UoIXN3cF90Yl9pc19mb2xpbyhvbGRfdGIpIHx8XG4tXHRcdFx0ICAgICBzd3BfdGJfdG9fZm9saW8ob2xkX3RiKSAhPSBmb2xpbyk7XG4tXHRcdGlmIChfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcbi1cdFx0XHRmb2xpb19zd2FwcGVkID0gdHJ1ZTtcbi1cdFx0ZWxzZVxuLVx0XHRcdG5lZWRfZnJlZSA9IHRydWU7XG4tXHRcdC8qIElmIHNoYWRvdyBpcyBOVUxMLCB3ZSBzZXQgYW4gZW1wdHkgc2hhZG93LiAqL1xuLVx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIHNoYWRvd190b19zd3BfdGIoc2hhZG93LFxuLVx0XHRcdFx0IF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogSWYgenN3YXAgYWxyZWFkeSBzdG9yZWQgZGF0YSBmb3IgdGhpcyBzbG90XG4mIzQzO1x0XHQgKiAoenN3YXBfc3RvcmUgd3JvdGUgYSBQb2ludGVyIGVudHJ5KSwgbGVhdmUgaXRcbiYjNDM7XHRcdCAqIGluIHBsYWNlLiBUaGUgY291bnQgYW5kIGZsYWdzIGFyZSBzdG9yZWQgaW4gdGhlXG4mIzQzO1x0XHQgKiB6c3dhcF9lbnRyeSBzdHJ1Y3QuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XG4mIzQzO1x0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXG4mIzQzO1x0XHRcdFx0Zm9saW9fc3dhcHBlZCA9IHRydWU7XG4mIzQzO1x0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRuZWVkX2ZyZWUgPSB0cnVlO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0V0FSTl9PTl9PTkNFKCFzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSB8fFxuJiM0MztcdFx0XHRcdCAgICAgc3dwX3RiX3RvX2ZvbGlvKG9sZF90YikgIT0gZm9saW8pO1xuJiM0MztcdFx0XHRpZiAoX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXG4mIzQzO1x0XHRcdFx0Zm9saW9fc3dhcHBlZCA9IHRydWU7XG4mIzQzO1x0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRuZWVkX2ZyZWUgPSB0cnVlO1xuJiM0MztcdFx0XHQvKiBJZiBzaGFkb3cgaXMgTlVMTCwgd2Ugc2V0IGFuIGVtcHR5IHNoYWRvdy4gKi9cbiYjNDM7XHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdyxcbiYjNDM7XHRcdFx0XHRcdCBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpO1xuJiM0MztcdFx0fVxuIFx0fSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiBcdTAwM2MgY2lfZW5kKTtcbiBcbiBcdGZvbGlvLVx1MDAzZXN3YXAudmFsID0gMDtcbkBAIC0yODgsNyAmIzQzOzM0MywxNCBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXHR9IGVsc2UgaWYgKG5lZWRfZnJlZSkge1xuIFx0XHRjaV9vZmYgPSBjaV9zdGFydDtcbiBcdFx0ZG8ge1xuLVx0XHRcdGlmICghX19zd3BfdGJfZ2V0X2NvdW50KF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpKVxuJiM0MztcdFx0XHR1bnNpZ25lZCBsb25nIHRiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbiYjNDM7XHRcdFx0dW5zaWduZWQgY2hhciBjbnQ7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIodGIpKVxuJiM0MztcdFx0XHRcdGNudCA9IHpzd2FwX3N3cF90Yl9nZXRfY291bnQodGIpO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0Y250ID0gX19zd3BfdGJfZ2V0X2NvdW50KHRiKTtcbiYjNDM7XHRcdFx0aWYgKCFjbnQpXG4gXHRcdFx0XHRfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc2ksIGNpLCBjaV9vZmYsIDEpO1xuIFx0XHR9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuQEAgLTQwMyw3ICYjNDM7NDY1LDggQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKl9fc3dhcF9jYWNoZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0XHRcdFx0XHRzd3BfZW50cnlfdCB0YXJnX2VudHJ5LCBnZnBfdCBnZnAsXG4gXHRcdFx0XHRcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IHZtX2ZhdWx0ICp2bWYsXG4tXHRcdFx0XHRcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KVxuJiM0MztcdFx0XHRcdFx0c3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgsXG4mIzQzO1x0XHRcdFx0XHR2b2lkICoqemVudHJ5KVxuIHtcbiBcdGludCBlcnI7XG4gXHRzd3BfZW50cnlfdCBlbnRyeTtcbkBAIC00NTAsNyAmIzQzOzUxMyw3IEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKl9fc3dhcF9jYWNoZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFxuIFx0X19mb2xpb19zZXRfbG9ja2VkKGZvbGlvKTtcbiBcdF9fZm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pO1xuLVx0X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhjaSwgZm9saW8sIGVudHJ5KTtcbiYjNDM7XHRfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnksIHplbnRyeSk7XG4gXHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiBcbiBcdGlmIChtZW1fY2dyb3VwX3N3YXBpbl9jaGFyZ2VfZm9saW8oZm9saW8sIG1lbWNnX2lkLFxuQEAgLTUwNyw3ICYjNDM7NTcwLDggQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gICovXG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCxcbiBcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBvcmRlcnMsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseClcbiYjNDM7XHRcdFx0XHQgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LFxuJiM0MztcdFx0XHRcdCAgICAgdm9pZCAqKnplbnRyeSlcbiB7XG4gXHRpbnQgb3JkZXIsIGVycjtcbiBcdHN0cnVjdCBmb2xpbyAqcmV0O1xuQEAgLTUyMCw5ICYjNDM7NTg0LDEyIEBAIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BfZW50cnlfdCB0YXJnX2VudHJ5LCBnZnBfdCBnZnAsXG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFvcmRlcnMgfHwgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpIFx1MDAzZSBTV0FQRklMRV9DTFVTVEVSKSlcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4mIzQzO1x0aWYgKHplbnRyeSlcbiYjNDM7XHRcdCp6ZW50cnkgPSBOVUxMO1xuJiM0MztcbiBcdGRvIHtcbiBcdFx0cmV0ID0gX19zd2FwX2NhY2hlX2FsbG9jKGNpLCB0YXJnX2VudHJ5LCBnZnAsIG9yZGVyLFxuLVx0XHRcdFx0XHQgdm1mLCBtcG9sLCBpbHgpO1xuJiM0MztcdFx0XHRcdFx0IHZtZiwgbXBvbCwgaWx4LCB6ZW50cnkpO1xuIFx0XHRpZiAoIUlTX0VSUihyZXQpKVxuIFx0XHRcdGJyZWFrO1xuIFx0XHRlcnIgPSBQVFJfRVJSKHJldCk7XG5AQCAtNjM4LDE4ICYjNDM7NzA1LDIwIEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfcmVhZF9mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLFxuIFx0XHRcdFx0XHQgICBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZywgYm9vbCByZWFkYWhlYWQpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHR2b2lkICp6ZW50cnk7XG4gXG4gXHRkbyB7XG4gXHRcdGZvbGlvID0gc3dhcF9jYWNoZV9nZXRfZm9saW8oZW50cnkpO1xuIFx0XHRpZiAoZm9saW8pXG4gXHRcdFx0cmV0dXJuIGZvbGlvO1xuLVx0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgQklUKDApLCBOVUxMLCBtcG9sLCBpbHgpO1xuJiM0MztcdFx0Zm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKGVudHJ5LCBnZnAsIEJJVCgwKSwgTlVMTCwgbXBvbCwgaWx4LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIFx1MDAyNnplbnRyeSk7XG4gXHR9IHdoaWxlIChQVFJfRVJSKGZvbGlvKSA9PSAtRUVYSVNUKTtcbiBcbiBcdGlmIChJU19FUlJfT1JfTlVMTChmb2xpbykpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuLVx0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnKTtcbiYjNDM7XHRzd2FwX3JlYWRfZm9saW8oZm9saW8sIHBsdWcsIHplbnRyeSk7XG4gXHRpZiAocmVhZGFoZWFkKSB7XG4gXHRcdGZvbGlvX3NldF9yZWFkYWhlYWQoZm9saW8pO1xuIFx0XHRjb3VudF92bV9ldmVudChTV0FQX1JBKTtcbkBAIC02NzgsMTggJiM0Mzs3NDcsMjAgQEAgc3RydWN0IGZvbGlvICpzd2FwaW5fc3luYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBsb25nIG9yZGVycyxcbiBcdFx0XHQgICBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHR2b2lkICp6ZW50cnk7XG4gXG4gXHRkbyB7XG4gXHRcdGZvbGlvID0gc3dhcF9jYWNoZV9nZXRfZm9saW8oZW50cnkpO1xuIFx0XHRpZiAoZm9saW8pXG4gXHRcdFx0cmV0dXJuIGZvbGlvO1xuLVx0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCk7XG4mIzQzO1x0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBcdTAwMjZ6ZW50cnkpO1xuIFx0fSB3aGlsZSAoUFRSX0VSUihmb2xpbykgPT0gLUVFWElTVCk7XG4gXG4gXHRpZiAoSVNfRVJSKGZvbGlvKSlcbiBcdFx0cmV0dXJuIGZvbGlvO1xuIFxuLVx0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBOVUxMKTtcbiYjNDM7XHRzd2FwX3JlYWRfZm9saW8oZm9saW8sIE5VTEwsIHplbnRyeSk7XG4gXHRyZXR1cm4gZm9saW87XG4gfVxuIFxuZGlmZiAtLWdpdCBhL21tL3N3YXBfdGFibGUuaCBiL21tL3N3YXBfdGFibGUuaFxuaW5kZXggZTY2MTNlNjJmOGQwZjYuLjYzMThiZjhhYTc2YjBjIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF90YWJsZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwX3RhYmxlLmhcbkBAIC0yOCw3ICYjNDM7MjgsNyBAQCBzdHJ1Y3Qgc3dhcF9tZW1jZ190YWJsZSB7XG4gICogTlVMTDogICAgIHwtLS0tLS0tLS0tLS0tLS0tIDAgLS0tLS0tLS0tLS0tLS0tfCAtIEZyZWUgc2xvdFxuICAqIFNoYWRvdzogICB8U1dBUF9DT1VOVHxafC0tLS0gU0hBRE9XX1ZBTCAtLS18MXwgLSBTd2FwcGVkIG91dCBzbG90XG4gICogUEZOOiAgICAgIHxTV0FQX0NPVU5UfFp8LS0tLS0tIFBGTiAtLS0tLS0tfDEwfCAtIENhY2hlZCBzbG90XG4tICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIChVbnVzZWQpXG4mIzQzOyAqIFBvaW50ZXI6ICB8LS0tLS0tLS0tLS0gUG9pbnRlciAtLS0tLS0tLS0tfDEwMHwgLSBac3dhcCBjb21wcmVzc2VkIGVudHJ5XG4gICogQmFkOiAgICAgIHwtLS0tLS0tLS0tLS0tIDEgLS0tLS0tLS0tLS0tLXwxMDAwfCAtIEJhZCBzbG90XG4gICpcbiAgKiBDT1VOVCBpcyBgU1dQX1RCX0NPVU5UX0JJVFNgIGxvbmcsIFogaXMgdGhlIGBTV1BfVEJfWkVST19GTEFHYCBiaXQsXG5AQCAtNDksOSAmIzQzOzQ5LDExIEBAIHN0cnVjdCBzd2FwX21lbWNnX3RhYmxlIHtcbiAgKiAtIFBGTjogU3dhcCBzbG90IGlzIGluIHVzZSwgYW5kIGNhY2hlZC4gTWVtY2cgaW5mbyBpcyByZWNvcmRlZCBvbiB0aGUgcGFnZVxuICAqICAgc3RydWN0LlxuICAqXG4tICogLSBQb2ludGVyOiBVbnVzZWQgeWV0LiBgMGIxMDBgIGlzIHJlc2VydmVkIGZvciBwb3RlbnRpYWwgcG9pbnRlciB1c2FnZVxuLSAqICAgYmVjYXVzZSBvbmx5IHRoZSBsb3dlciB0aHJlZSBiaXRzIGNhbiBiZSB1c2VkIGFzIGEgbWFya2VyIGZvciA4IGJ5dGVzXG4tICogICBhbGlnbmVkIHBvaW50ZXJzLlxuJiM0MzsgKiAtIFBvaW50ZXI6IFN0b3JlcyBhIGRpcmVjdCBwb2ludGVyIHRvIGEgenN3YXBfZW50cnkgd2hlbiB0aGUgc3dhcCBzbG90JiMzOTtzXG4mIzQzOyAqICAgY29tcHJlc3NlZCBkYXRhIHJlc2lkZXMgaW4genN3YXAuIFRoZSBzd2FwIGNvdW50IChpZiBhbnkpIGlzIHN0b3JlZCBpblxuJiM0MzsgKiAgIHRoZSB6c3dhcF9lbnRyeSBzdHJ1Y3QgcmF0aGVyIHRoYW4gaW5saW5lLCBzaW5jZSB0aGUgcG9pbnRlciBvY2N1cGllc1xuJiM0MzsgKiAgIGFsbCB1cHBlciBiaXRzLiBgMGIxMDBgIGlzIHVzZWQgYXMgdGhlIG1hcmtlciBiZWNhdXNlIHpzd2FwX2VudHJ5XG4mIzQzOyAqICAgcG9pbnRlcnMgYXJlIGF0IGxlYXN0IDgtYnl0ZSBhbGlnbmVkLCBsZWF2aW5nIHRoZSBsb3dlciB0aHJlZSBiaXRzIGZyZWUuXG4gICpcbiAgKiAtIEJhZDogU3dhcCBzbG90IGlzIHJlc2VydmVkLCBwcm90ZWN0cyBzd2FwIGhlYWRlciBvciBob2xlcyBvbiBzd2FwIGRldmljZXMuXG4gICovXG5AQCAtNzgsNiAmIzQzOzgwLDkgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUge1xuIC8qIFRoZSBmaXJzdCBmbGFnIGlzIHplcm8gYml0IChTV0FQX1RBQkxFX0hBU19aRVJPRkxBRykgKi9cbiAjZGVmaW5lIFNXUF9UQl9aRVJPX0ZMQUdcdEJJVChCSVRTX1BFUl9MT05HIC0gU1dQX1RCX0ZMQUdTX0JJVFMpXG4gXG4mIzQzOy8qIFBvaW50ZXI6IHpzd2FwX2VudHJ5IHBvaW50ZXIgc3RvcmVkIGRpcmVjdGx5LCBlbmRzIHdpdGggMGIxMDAgKi9cbiYjNDM7I2RlZmluZSBTV1BfVEJfUE9JTlRFUl9NQVJLXHQwYjEwMFVMXG4mIzQzO1xuIC8qIEJhZCBzbG90OiBlbmRzIHdpdGggMGIxMDAwIGFuZCByZXN0cyBvZiBiaXRzIGFyZSBhbGwgMSAqL1xuICNkZWZpbmUgU1dQX1RCX0JBRFx0XHQoKH4wVUwpIFx1MDAzY1x1MDAzYyAzKVxuIFxuQEAgLTE2Niw2ICYjNDM7MTcxLDExIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBzd3BfdGJfaXNfYmFkKHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuIFx0cmV0dXJuIHN3cF90YiA9PSBTV1BfVEJfQkFEO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHN3cF90Yl9pc19wb2ludGVyKHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIChzd3BfdGIgXHUwMDI2IChCSVQoMykgLSAxKSkgPT0gU1dQX1RCX1BPSU5URVJfTUFSSztcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX2NvdW50YWJsZSh1bnNpZ25lZCBsb25nIHN3cF90YilcbiB7XG4gXHRyZXR1cm4gKHN3cF90Yl9pc19zaGFkb3coc3dwX3RiKSB8fCBzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSB8fFxuQEAgLTE4OCw2ICYjNDM7MTk4LDIzIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3dwX3RiX3RvX3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YilcbiBcdHJldHVybiAodm9pZCAqKShzd3BfdGIgXHUwMDI2IH5TV1BfVEJfRkxBR1NfTUFTSyk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9pbnRlcl90b19zd3BfdGIodm9pZCAqcHRyKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZylwdHI7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2YodW5zaWduZWQgbG9uZykgIT0gc2l6ZW9mKHZvaWQgKikpO1xuJiM0MztcdC8qIFBvaW50ZXJzIGFyZSA4LWJ5dGUgYWxpZ25lZCwgbG93IDMgYml0cyBtdXN0IGJlIGNsZWFyICovXG4mIzQzO1x0Vk1fV0FSTl9PTl9PTkNFKHZhbCBcdTAwMjYgKEJJVCgzKSAtIDEpKTtcbiYjNDM7XHRyZXR1cm4gdmFsIHwgU1dQX1RCX1BPSU5URVJfTUFSSztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpzd3BfdGJfdG9fcG9pbnRlcih1bnNpZ25lZCBsb25nIHN3cF90YilcbiYjNDM7e1xuJiM0MztcdFZNX1dBUk5fT04oIXN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpO1xuJiM0MztcdC8qIENsZWFyIHRoZSBsb3cgMy1iaXQgbWFya2VyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi9cbiYjNDM7XHRyZXR1cm4gKHZvaWQgKikoc3dwX3RiIFx1MDAyNiB+KCh1bnNpZ25lZCBsb25nKShCSVQoMykgLSAxKSkpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpXG4ge1xuIFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKTtcbmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuY1xuaW5kZXggYTYwMmU1ODIwNTEzYTguLjE4OTI1ZTQ2MjU3MWIxIDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuY1xuQEAgLTkzNSw3ICYjNDM7OTM1LDggQEAgc3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdG5yX3BhZ2VzID0gMSBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4gXHRcdHN3YXBfY2x1c3Rlcl9hc3NlcnRfZW1wdHkoY2ksIGNpX29mZiwgbnJfcGFnZXMsIGZhbHNlKTtcbiBcdFx0X19zd2FwX2NhY2hlX2FkZF9mb2xpbyhjaSwgZm9saW8sIHN3cF9lbnRyeShzaS1cdTAwM2V0eXBlLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGNpX29mZiAmIzQzOyBjbHVzdGVyX29mZnNldChzaSwgY2kpKSk7XG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgIGNpX29mZiAmIzQzOyBjbHVzdGVyX29mZnNldChzaSwgY2kpKSxcbiYjNDM7XHRcdFx0XHQgICAgICAgTlVMTCk7XG4gXHR9IGVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX0hJQkVSTkFUSU9OKSkge1xuIFx0XHRvcmRlciA9IDA7XG4gXHRcdG5yX3BhZ2VzID0gMTtcbkBAIC0xNTM2LDI1ICYjNDM7MTUzNyw1MSBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcbiBcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuJiM0MztcbiYjNDM7XHQvKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5IHN0cnVjdCAqL1xuJiM0MztcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4mIzQzO1x0XHR6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHN3cF90YiwgY2ksIGNpX29mZik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiBcdGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0UoY291bnQgXHUwMDNjPSAwKTtcbiBcdFZNX1dBUk5fT05fT05DRShjb3VudCBcdTAwM2UgU1dQX1RCX0NPVU5UX01BWCk7XG4tXG4tXHRpZiAoY291bnQgPT0gU1dQX1RCX0NPVU5UX01BWCkge1xuLVx0XHRjb3VudCA9IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xuLVx0XHQvKiBPdmVyZmxvdyBzdGFydHMgd2l0aCBTV1BfVEJfQ09VTlRfTUFYICovXG4tXHRcdFZNX1dBUk5fT05fT05DRShjb3VudCBcdTAwM2MgU1dQX1RCX0NPVU5UX01BWCk7XG4tXHRcdGNvdW50LS07XG4tXHRcdGlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7XG4tXHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwO1xuLVx0XHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgX19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuJiM0MztcdFx0aWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHtcbiYjNDM7XHRcdFx0aWYgKCFjaS1cdTAwM2VleHRlbmRfdGFibGUpIHtcbiYjNDM7XHRcdFx0XHQvKlxuJiM0MztcdFx0XHRcdCAqIE1BWCB3aXRob3V0IGV4dGVuZF90YWJsZTogTUFYIGlzIHRoZSByZWFsXG4mIzQzO1x0XHRcdFx0ICogY291bnQuICBEZWNyZW1lbnQgYW5kIHdyaXRlIGJhY2sgaW5saW5lLlxuJiM0MztcdFx0XHRcdCAqL1xuJiM0MztcdFx0XHRcdGNvdW50LS07XG4mIzQzO1x0XHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxuJiM0MztcdFx0XHRcdFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuJiM0MztcdFx0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRcdC8qXG4mIzQzO1x0XHRcdFx0ICogTUFYIHdpdGggZXh0ZW5kX3RhYmxlOiByZWFsIGNvdW50IGxpdmVzIGluXG4mIzQzO1x0XHRcdFx0ICogY2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0uICBQdWxsLCBkZWNyZW1lbnRcbiYjNDM7XHRcdFx0XHQgKiBpdCwgYW5kIGVpdGhlciBtb3ZlIGl0IGJhY2sgaW5saW5lIChpZiBub3dcbiYjNDM7XHRcdFx0XHQgKiBmaXRzKSBvciB3cml0ZSBpdCBiYWNrIHRvIHRoZSBleHRlbmQgdGFibGUuXG4mIzQzO1x0XHRcdFx0ICovXG4mIzQzO1x0XHRcdFx0Y291bnQgPSBjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcbiYjNDM7XHRcdFx0XHQvKiBPdmVyZmxvdyBzdGFydHMgd2l0aCBTV1BfVEJfQ09VTlRfTUFYICovXG4mIzQzO1x0XHRcdFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFx1MDAzYyBTV1BfVEJfQ09VTlRfTUFYKTtcbiYjNDM7XHRcdFx0XHRjb3VudC0tO1xuJiM0MztcdFx0XHRcdGlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7XG4mIzQzO1x0XHRcdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IDA7XG4mIzQzO1x0XHRcdFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXG4mIzQzO1x0XHRcdFx0XHRcdF9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgY291bnQpKTtcbiYjNDM7XHRcdFx0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdH1cbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50O1xuJiM0MztcdFx0XHQvKiBjb3VudCBcdTAwM2MgTUFYOiBzaW1wbGUgaW5saW5lIGRlY3JlbWVudCAqL1xuJiM0MztcdFx0XHRjb3VudC0tO1xuJiM0MztcdFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXG4mIzQzO1x0XHRcdFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuIFx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIF9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgLS1jb3VudCkpO1xuLVx0fVxuIFxuIFx0LypcbiBcdCAqIGBTV1BfVEJfQ09VTlRfTUFYIC0gMWAgdHJpZ2dlcnMgZXh0ZW5kIHRhYmxlIGFsbG9jYXRpb24uIElmIHRoZVxuQEAgLTE1OTYsNyAmIzQzOzE2MjMsMTggQEAgc3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdGNpX2VuZCA9IGNpX29mZiAmIzQzOyBucjtcbiBcdGRvIHtcbiBcdFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbi1cdFx0aWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogUG9pbnRlciBlbnRyaWVzIHN0b3JlIGNvdW50IGluIHRoZSB6c3dhcF9lbnRyeTtcbiYjNDM7XHRcdCAqIGhhbmRsZSB0aGVtIGJlZm9yZSBzd3BfdGJfZ2V0X2NvdW50ICh3aGljaCByZXR1cm5zXG4mIzQzO1x0XHQgKiAtRUlOVkFMIGZvciBub24tY291bnRhYmxlIHR5cGVzKS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcbiYjNDM7XHRcdFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XG4mIzQzO1x0XHRcdFx0aWYgKGNpX2JhdGNoID09IC0xKVxuJiM0MztcdFx0XHRcdFx0Y2lfYmF0Y2ggPSBjaV9vZmY7XG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH0gZWxzZSBpZiAoc3dwX3RiX2dldF9jb3VudChzd3BfdGIpID09IDEpIHtcbiBcdFx0XHQvKiBjb3VudCA9PSAxIGFuZCBub24tY2FjaGVkIHNsb3RzIHdpbGwgYmUgYmF0Y2ggZnJlZWQuICovXG4gXHRcdFx0aWYgKCFzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSkge1xuIFx0XHRcdFx0aWYgKGNpX2JhdGNoID09IC0xKVxuQEAgLTE2NDcsNiAmIzQzOzE2ODUsMTEgQEAgc3RhdGljIGludCBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdC8qIEJhZCBvciBzcGVjaWFsIHNsb3RzIGNhbiYjMzk7dCBiZSBoYW5kbGVkICovXG4gXHRpZiAoV0FSTl9PTl9PTkNFKHN3cF90Yl9pc19iYWQoc3dwX3RiKSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHQvKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5IHN0cnVjdCAqL1xuJiM0MztcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxuJiM0MztcdFx0cmV0dXJuIHpzd2FwX3N3cF90Yl9kdXBfY291bnQoc3dwX3RiLCBjaSwgY2lfb2ZmKTtcbiYjNDM7XG4gXHRjb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChzd3BfdGIpO1xuIFx0LyogTXVzdCBiZSBlaXRoZXIgY2FjaGVkIG9yIGhhdmUgYSBjb3VudCBhbHJlYWR5ICovXG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFjb3VudCBcdTAwMjZcdTAwMjYgIXN3cF90Yl9pc19mb2xpbyhzd3BfdGIpKSlcbkBAIC0xOTIzLDEzICYjNDM7MTk2NiwyNiBAQCB2b2lkIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4gXHRcdC8qXG4gXHRcdCAqIEZyZWVpbmcgaXMgZG9uZSBhZnRlciByZWxlYXNlIG9mIHRoZSBsYXN0IHN3YXAgY291bnRcbi1cdFx0ICogcmVmLCBvciBhZnRlciBzd2FwIGNhY2hlIGlzIGRyb3BwZWRcbiYjNDM7XHRcdCAqIHJlZiwgb3IgYWZ0ZXIgc3dhcCBjYWNoZSBpcyBkcm9wcGVkLiBBIFBvaW50ZXIgZW50cnlcbiYjNDM7XHRcdCAqIG1lYW5zIHpzd2FwIGhhcyBhIGNvbXByZXNzZWQgY29weTsgdGhlIHhhcnJheSBzdGlsbFxuJiM0MztcdFx0ICogaG9sZHMgdGhlIGVudHJ5IGFuZCB6c3dhcF9pbnZhbGlkYXRlIHdpbGwgZnJlZSBpdC5cbiBcdFx0ICovXG4tXHRcdFZNX1dBUk5fT04oIXN3cF90Yl9pc19zaGFkb3cob2xkX3RiKSB8fCBfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSBcdTAwM2UgMSk7XG4mIzQzO1x0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkge1xuJiM0MztcdFx0XHRWTV9XQVJOX09OKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSBcdTAwM2UgMSk7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIEZyZWUgdGhlIHpzd2FwIGVudHJ5IG5vdyB1bmRlciBjaS1cdTAwM2Vsb2NrIHdoaWxlXG4mIzQzO1x0XHRcdCAqIHRoZSBQb2ludGVyIGlzIHN0aWxsIGluIHRoZSBzd2FwIHRhYmxlLiAgT25jZVxuJiM0MztcdFx0XHQgKiB3ZSBudWxsIHRoZSBzbG90LCB0aGUgZW50cnkgd291bGQgYmUgbGVha2VkLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0enN3YXBfZW50cnlfZnJlZShzd3BfdGJfdG9fcG9pbnRlcihvbGRfdGIpKTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdFZNX1dBUk5fT04oIXN3cF90Yl9pc19zaGFkb3cob2xkX3RiKSB8fFxuJiM0MztcdFx0XHRcdCAgIF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpIFx1MDAzZSAxKTtcbiYjNDM7XHRcdH1cbiBcbiBcdFx0LyogUmVzZXR0aW5nIHRoZSBzbG90IHRvIE5VTEwgYWxzbyBjbGVhcnMgdGhlIGlubGluZSBmbGFncy4gKi9cbiBcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBudWxsX3RvX3N3cF90YigpKTtcbi1cdFx0aWYgKCFTV0FQX1RBQkxFX0hBU19aRVJPRkxBRylcbiYjNDM7XHRcdGlmICghU1dBUF9UQUJMRV9IQVNfWkVST0ZMQUcgXHUwMDI2XHUwMDI2ICFzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKVxuIFx0XHRcdF9fc3dhcF90YWJsZV9jbGVhcl96ZXJvKGNpLCBjaV9vZmYpO1xuIFxuIFx0XHQvKlxuQEAgLTE5NjEsOCAmIzQzOzIwMTcsMTEgQEAgaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gX19zd2FwX2VudHJ5X3RvX2NsdXN0ZXIoZW50cnkpO1xuIFx0dW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuIFxuLVx0cmV0dXJuIHN3cF90Yl9nZXRfY291bnQoX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSk7XG4mIzQzO1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpXG4mIzQzO1x0XHRyZXR1cm4genN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpO1xuJiM0MztcdHJldHVybiBzd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7XG4gfVxuIFxuIC8qKlxuQEAgLTE5ODAsNiAmIzQzOzIwMzksOCBAQCBib29sIHN3YXBfZW50cnlfc3dhcHBlZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN3cF9lbnRyeV90IGVudHJ5KVxuIFx0c3dwX3RiID0gc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuIFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4gXG4mIzQzO1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpXG4mIzQzO1x0XHRyZXR1cm4genN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpIFx1MDAzZSAwO1xuIFx0cmV0dXJuIHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcdTAwM2UgMDtcbiB9XG4gXG5AQCAtMjAyMCw3ICYjNDM7MjA4MSw3IEBAIGludCBzd3Bfc3dhcGNvdW50KHN3cF9lbnRyeV90IGVudHJ5KVxuICAqXG4gICogQ29udGV4dDogQ2FsbGVyIG11c3QgZW5zdXJlIHRoZSBmb2xpbyBpcyBsb2NrZWQgYW5kIGluIHRoZSBzd2FwIGNhY2hlLlxuICAqL1xuLXN0YXRpYyBib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7Ym9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0c3dwX2VudHJ5X3QgZW50cnkgPSBmb2xpby1cdTAwM2Vzd2FwO1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbkBAIC0yNTU2LDggJiM0MzsyNjE3LDEyIEBAIHN0YXRpYyBpbnQgdW51c2VfcHRlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0XHRpZiAoIWZvbGlvKSB7XG4gXHRcdFx0c3dwX3RiID0gc3dhcF90YWJsZV9nZXQoX19zd2FwX2VudHJ5X3RvX2NsdXN0ZXIoZW50cnkpLFxuIFx0XHRcdFx0XHRcdHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSkpO1xuLVx0XHRcdGlmIChzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXHUwMDNjPSAwKVxuJiM0MztcdFx0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkge1xuJiM0MztcdFx0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXHUwMDNjPSAwKVxuJiM0MztcdFx0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH0gZWxzZSBpZiAoc3dwX3RiX2dldF9jb3VudChzd3BfdGIpIFx1MDAzYz0gMCkge1xuIFx0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdFx0fVxuIFxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCA3NjFjZDY5OWUwYTNlNi4uZjk3NjJkMGE1OTZhYjQgMTAwNjQ0XG4tLS0gYS9tbS96c3dhcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS96c3dhcC5jXG5AQCAtMzgsNiAmIzQzOzM4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC96c21hbGxvYy5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7c3dhcC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3N3YXBfdGFibGUuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O2ludGVybmFsLmhcJiMzNDtcbiBcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5AQCAtMTgyLDYgJiM0MzsxODMsMTAgQEAgc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqenN3YXBfc2hyaW5rZXI7XG4gICogICAgICAgICAgICAgIHdyaXRlYmFjayBsb2dpYy4gVGhlIGVudHJ5IGlzIG9ubHkgcmVjbGFpbWVkIGJ5IHRoZSB3cml0ZWJhY2tcbiAgKiAgICAgICAgICAgICAgbG9naWMgaWYgcmVmZXJlbmNlZCBpcyB1bnNldC4gU2VlIGNvbW1lbnRzIGluIHRoZSBzaHJpbmtlclxuICAqICAgICAgICAgICAgICBzZWN0aW9uIGZvciBjb250ZXh0LlxuJiM0MzsgKiBzd3BfdGJfdmFsIC0gdGhlIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgc2F2ZWQgd2hlbiB0aGlzIHpzd2FwX2VudHJ5XG4mIzQzOyAqICAgICAgICAgICAgICByZXBsYWNlZCBhIFNoYWRvdyBvciBQRk4gZW50cnkuIEl0IHByZXNlcnZlcyB0aGUgc3dhcCBjb3VudCxcbiYjNDM7ICogICAgICAgICAgICAgIHplcm8gZmxhZywgYW5kIHdvcmtpbmcgc2V0IHNoYWRvdyBpbmZvcm1hdGlvbiAoU0hBRE9XX1ZBTClcbiYjNDM7ICogICAgICAgICAgICAgIHRoYXQgdGhlIFNoYWRvdyBlbnRyeSBjYXJyaWVkLlxuICAqIHBvb2wgLSB0aGUgenN3YXBfcG9vbCB0aGUgZW50cnkmIzM5O3MgZGF0YSBpcyBpblxuICAqIGhhbmRsZSAtIHpzbWFsbG9jIGFsbG9jYXRpb24gaGFuZGxlIHRoYXQgc3RvcmVzIHRoZSBjb21wcmVzc2VkIHBhZ2UgZGF0YVxuICAqIG9iamNnIC0gdGhlIG9ial9jZ3JvdXAgdGhhdCB0aGUgY29tcHJlc3NlZCBtZW1vcnkgaXMgY2hhcmdlZCB0b1xuQEAgLTE5MSwxNSAmIzQzOzE5NiwxMyBAQCBzdHJ1Y3QgenN3YXBfZW50cnkge1xuIFx0c3dwX2VudHJ5X3Qgc3dwZW50cnk7XG4gXHR1bnNpZ25lZCBpbnQgbGVuZ3RoO1xuIFx0Ym9vbCByZWZlcmVuY2VkO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3dwX3RiX3ZhbDtcbiBcdHN0cnVjdCB6c3dhcF9wb29sICpwb29sO1xuIFx0dW5zaWduZWQgbG9uZyBoYW5kbGU7XG4gXHRzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2c7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkIGxydTtcbiB9O1xuIFxuLXN0YXRpYyBzdHJ1Y3QgeGFycmF5ICp6c3dhcF90cmVlc1tNQVhfU1dBUEZJTEVTXTtcbi1zdGF0aWMgdW5zaWduZWQgaW50IG5yX3pzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdO1xuLVxuIC8qIFJDVS1wcm90ZWN0ZWQgaXRlcmF0aW9uICovXG4gc3RhdGljIExJU1RfSEVBRCh6c3dhcF9wb29scyk7XG4gLyogcHJvdGVjdHMgenN3YXBfcG9vbHMgbGlzdCBtb2RpZmljYXRpb24gKi9cbkBAIC0yMjUsMTUgJiM0MzsyMjgsNiBAQCBzdGF0aWMgYm9vbCB6c3dhcF9oYXNfcG9vbDtcbiAqIGhlbHBlcnMgYW5kIGZ3ZCBkZWNsYXJhdGlvbnNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIFxuLS8qIE9uZSBzd2FwIGFkZHJlc3Mgc3BhY2UgZm9yIGVhY2ggNjRNIHN3YXAgc3BhY2UgKi9cbi0jZGVmaW5lIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQgMTRcbi0jZGVmaW5lIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMgKDEgXHUwMDNjXHUwMDNjIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQpXG4tc3RhdGljIGlubGluZSBzdHJ1Y3QgeGFycmF5ICpzd2FwX3pzd2FwX3RyZWUoc3dwX2VudHJ5X3Qgc3dwKVxuLXtcbi1cdHJldHVybiBcdTAwMjZ6c3dhcF90cmVlc1tzd3BfdHlwZShzd3ApXVtzd3Bfb2Zmc2V0KHN3cClcbi1cdFx0XHUwMDNlXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlRdO1xuLX1cbi1cbiAjZGVmaW5lIHpzd2FwX3Bvb2xfZGVidWcobXNnLCBwKVx0XHRcdFxcXG4gXHRwcl9kZWJ1ZyhcJiMzNDslcyBwb29sICVzXFxuXCYjMzQ7LCBtc2csIChwKS1cdTAwM2V0Zm1fbmFtZSlcbiBcbkBAIC03NjIsNyAmIzQzOzc1Niw3IEBAIHN0YXRpYyB2b2lkIHpzd2FwX2VudHJ5X2NhY2hlX2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSlcbiAgKiBDYXJyaWVzIG91dCB0aGUgY29tbW9uIHBhdHRlcm4gb2YgZnJlZWluZyBhbiBlbnRyeSYjMzk7cyB6c21hbGxvYyBhbGxvY2F0aW9uLFxuICAqIGZyZWVpbmcgdGhlIGVudHJ5IGl0c2VsZiwgYW5kIGRlY3JlbWVudGluZyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBwYWdlcy5cbiAgKi9cbi1zdGF0aWMgdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXG4mIzQzO3ZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KVxuIHtcbiBcdHpzd2FwX2xydV9kZWwoXHUwMDI2enN3YXBfbGlzdF9scnUsIGVudHJ5KTtcbiBcdHpzX2ZyZWUoZW50cnktXHUwMDNlcG9vbC1cdTAwM2V6c19wb29sLCBlbnRyeS1cdTAwM2VoYW5kbGUpO1xuQEAgLTk4NywxMSAmIzQzOzk4MSwxMiBAQCBzdGF0aWMgYm9vbCB6c3dhcF9kZWNvbXByZXNzKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSxcbiBcdFx0XHRcdCBzd3BfZW50cnlfdCBzd3BlbnRyeSlcbiB7XG4tXHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xuIFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cGVudHJ5KTtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4gXHRzdHJ1Y3QgbWVtcG9saWN5ICptcG9sO1xuIFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzd3BfdGI7XG4gXHRpbnQgcmV0ID0gMDtcbiBcbiBcdC8qIHRyeSB0byBhbGxvY2F0ZSBzd2FwIGNhY2hlIGZvbGlvICovXG5AQCAtOTk5LDkgJiM0Mzs5OTQsMjUgQEAgc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSxcbiBcdGlmICghc2kpXG4gXHRcdHJldHVybiAtRUVYSVNUO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogVmVyaWZ5IHRoZSBzd2FwIHRhYmxlIFBvaW50ZXIgZW50cnkgc3RpbGwgcmVmZXJlbmNlcyB0aGlzXG4mIzQzO1x0ICogenN3YXBfZW50cnkuIElmIHRoZSBlbnRyeSB3YXMgaW52YWxpZGF0ZWQgb3IgcmVwbGFjZWQgYnkgYVxuJiM0MztcdCAqIGNvbmN1cnJlbnQgc3RvcmUsIHRoZSBQb2ludGVyIHdpbGwgYmUgZ29uZSBvciBwb2ludCBlbHNld2hlcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2ksIG9mZnNldCk7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuJiM0MztcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuJiM0MztcdGlmICghc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSB8fFxuJiM0MztcdCAgICBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpICE9IGVudHJ5KSB7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRcdHB1dF9zd2FwX2RldmljZShzaSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHR9XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4mIzQzO1xuIFx0bXBvbCA9IGdldF90YXNrX3BvbGljeShjdXJyZW50KTtcbiBcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLFxuLVx0XHRcdFx0ICAgICAgIE5PX0lOVEVSTEVBVkVfSU5ERVgpO1xuJiM0MztcdFx0XHRcdCAgICAgICBOT19JTlRFUkxFQVZFX0lOREVYLCBOVUxMKTtcbiBcdHB1dF9zd2FwX2RldmljZShzaSk7XG4gXG4gXHQvKlxuQEAgLTEwMTUsMjcgJiM0MzsxMDI2LDE1IEBAIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHRcdHJldHVybiBQVFJfRVJSKGZvbGlvKTtcbiBcbiBcdC8qXG4tXHQgKiBmb2xpbyBpcyBsb2NrZWQsIGFuZCB0aGUgc3dhcGNhY2hlIGlzIG5vdyBzZWN1cmVkIGFnYWluc3Rcbi1cdCAqIGNvbmN1cnJlbnQgc3dhcHBpbmcgdG8gYW5kIGZyb20gdGhlIHNsb3QsIGFuZCBjb25jdXJyZW50XG4tXHQgKiBzd2Fwb2ZmIHNvIHdlIGNhbiBzYWZlbHkgZGVyZWZlcmVuY2UgdGhlIHpzd2FwIHRyZWUgaGVyZS5cbi1cdCAqIFZlcmlmeSB0aGF0IHRoZSBzd2FwIGVudHJ5IGhhc24mIzM5O3QgYmVlbiBpbnZhbGlkYXRlZCBhbmQgcmVjeWNsZWRcbi1cdCAqIGJlaGluZCBvdXIgYmFja3MsIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGEgbmV3IHN3YXAgZm9saW8gd2l0aFxuLVx0ICogb2xkIGNvbXByZXNzZWQgZGF0YS4gT25seSB3aGVuIHRoaXMgaXMgc3VjY2Vzc2Z1bCBjYW4gdGhlIGVudHJ5XG4tXHQgKiBiZSBkZXJlZmVyZW5jZWQuXG4mIzQzO1x0ICogVGhlIGZvbGlvIGlzIG5vdyBsb2NrZWQgYW5kIGluIHN3YXAgY2FjaGUsIHNvIGNvbmN1cnJlbnRcbiYjNDM7XHQgKiBzdG9yZXMgYXJlIGJsb2NrZWQuIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8gYWxyZWFkeVxuJiM0MztcdCAqIG92ZXJ3cm90ZSB0aGUgUG9pbnRlciBlbnRyeSB3aXRoIGEgUEZOLlxuIFx0ICovXG4tXHR0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cGVudHJ5KTtcbi1cdGlmIChlbnRyeSAhPSB4YV9sb2FkKHRyZWUsIG9mZnNldCkpIHtcbi1cdFx0cmV0ID0gLUVOT01FTTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4gXHRpZiAoIXpzd2FwX2RlY29tcHJlc3MoZW50cnksIGZvbGlvKSkge1xuIFx0XHRyZXQgPSAtRUlPO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4tXG4gXHRjb3VudF92bV9ldmVudChaU1dQV0IpO1xuIFx0aWYgKGVudHJ5LVx1MDAzZW9iamNnKVxuIFx0XHRjb3VudF9vYmpjZ19ldmVudHMoZW50cnktXHUwMDNlb2JqY2csIFpTV1BXQiwgMSk7XG5AQCAtMTEwNSwzNiAmIzQzOzExMDQsMjIgQEAgc3RhdGljIGVudW0gbHJ1X3N0YXR1cyBzaHJpbmtfbWVtY2dfY2Ioc3RydWN0IGxpc3RfaGVhZCAqaXRlbSwgc3RydWN0IGxpc3RfbHJ1X29cbiBcdH1cbiBcbiBcdC8qXG4tXHQgKiBBcyBzb29uIGFzIHdlIGRyb3AgdGhlIExSVSBsb2NrLCB0aGUgZW50cnkgY2FuIGJlIGZyZWVkIGJ5XG4tXHQgKiBhIGNvbmN1cnJlbnQgaW52YWxpZGF0aW9uLiBUaGlzIG1lYW5zIHRoZSBmb2xsb3dpbmc6XG4tXHQgKlxuLVx0ICogMS4gV2UgZXh0cmFjdCB0aGUgc3dwX2VudHJ5X3QgdG8gdGhlIHN0YWNrLCBhbGxvd2luZ1xuLVx0ICogICAgenN3YXBfd3JpdGViYWNrX2VudHJ5KCkgdG8gcGluIHRoZSBzd2FwIGVudHJ5IGFuZFxuLVx0ICogICAgdGhlbiB2YWxpZGF0ZSB0aGUgenN3YXAgZW50cnkgYWdhaW5zdCB0aGF0IHN3YXAgZW50cnkmIzM5O3Ncbi1cdCAqICAgIHRyZWUgdXNpbmcgcG9pbnRlciB2YWx1ZSBjb21wYXJpc29uLiBPbmx5IHdoZW4gdGhhdFxuLVx0ICogICAgaXMgc3VjY2Vzc2Z1bCBjYW4gdGhlIGVudHJ5IGJlIGRlcmVmZXJlbmNlZC5cbi1cdCAqXG4tXHQgKiAyLiBVc3VhbGx5LCBvYmplY3RzIGFyZSB0YWtlbiBvZmYgdGhlIExSVSBmb3IgcmVjbGFpbS4gSW5cbi1cdCAqICAgIHRoaXMgY2FzZSB0aGlzIGlzbiYjMzk7dCBwb3NzaWJsZSwgYmVjYXVzZSBpZiByZWNsYWltIGZhaWxzXG4tXHQgKiAgICBmb3Igd2hhdGV2ZXIgcmVhc29uLCB3ZSBoYXZlIG5vIG1lYW5zIG9mIGtub3dpbmcgaWYgdGhlXG4tXHQgKiAgICBlbnRyeSBpcyBhbGl2ZSB0byBwdXQgaXQgYmFjayBvbiB0aGUgTFJVLlxuJiM0MztcdCAqIEFmdGVyIHdlIGRyb3AgdGhlIExSVSBsb2NrLCB0aGUgZW50cnkgbWF5IGJlIGZyZWVkIGJ5IGFcbiYjNDM7XHQgKiBjb25jdXJyZW50IHN3YXAgc2xvdCBmcmVlLiAgVGhpcyBpcyBzYWZlIGJlY2F1c2VcbiYjNDM7XHQgKiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSByZWNoZWNrcyB0aGUgc3dhcCB0YWJsZSB1bmRlclxuJiM0MztcdCAqIGNpLVx1MDAzZWxvY2sgYmVmb3JlIGRlcmVmZXJlbmNpbmcgZW50cnk7IGlmIHRoZSBQb2ludGVyIGlzXG4mIzQzO1x0ICogZ29uZSBpdCBiYWlscyBvdXQuXG4gXHQgKlxuLVx0ICogICAgU28gcm90YXRlIGl0IGJlZm9yZSBkcm9wcGluZyB0aGUgbG9jay4gSWYgdGhlIGVudHJ5IGlzXG4tXHQgKiAgICB3cml0dGVuIGJhY2sgb3IgaW52YWxpZGF0ZWQsIHRoZSBmcmVlIHBhdGggd2lsbCB1bmxpbmtcbi1cdCAqICAgIGl0LiBGb3IgZmFpbHVyZXMsIHJvdGF0aW9uIGlzIHRoZSByaWdodCB0aGluZyBhcyB3ZWxsLlxuLVx0ICpcbi1cdCAqICAgIFRlbXBvcmFyeSBmYWlsdXJlcywgd2hlcmUgdGhlIHNhbWUgZW50cnkgc2hvdWxkIGJlIHRyaWVkXG4tXHQgKiAgICBhZ2FpbiBpbW1lZGlhdGVseSwgYWxtb3N0IG5ldmVyIGhhcHBlbiBmb3IgdGhpcyBzaHJpbmtlci5cbi1cdCAqICAgIFdlIGRvbiYjMzk7dCBkbyBhbnkgdHJ5bG9ja2luZzsgLUVOT01FTSBjb21lcyBjbG9zZXN0LFxuLVx0ICogICAgYnV0IHRoYXQmIzM5O3MgZXh0cmVtZWx5IHJhcmUgYW5kIGRvZXNuJiMzOTt0IGhhcHBlbiBzcHVyaW91c2x5XG4tXHQgKiAgICBlaXRoZXIuIERvbiYjMzk7dCBib3RoZXIgZGlzdGluZ3Vpc2hpbmcgdGhpcyBjYXNlLlxuJiM0MztcdCAqIFJvdGF0ZSB0aGUgZW50cnkgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrOiBpZiBpdCBnZXRzXG4mIzQzO1x0ICogd3JpdHRlbiBiYWNrIG9yIGludmFsaWRhdGVkIHRoZSBmcmVlIHBhdGggd2lsbCB1bmxpbmtcbiYjNDM7XHQgKiBpdCBmcm9tIHRoZSBMUlUuICBGb3IgZmFpbHVyZXMgcm90YXRpb24gaXMgZmluZS5cbiBcdCAqL1xuIFx0bGlzdF9tb3ZlX3RhaWwoaXRlbSwgXHUwMDI2bC1cdTAwM2VsaXN0KTtcbiBcbiBcdC8qXG4tXHQgKiBPbmNlIHRoZSBscnUgbG9jayBpcyBkcm9wcGVkLCB0aGUgZW50cnkgbWlnaHQgZ2V0IGZyZWVkLiBUaGVcbi1cdCAqIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2ssIGFuZCBlbnRyeSBpc24mIzM5O3QgZGVyZWYmIzM5O2QgYWdhaW5cbi1cdCAqIHVudGlsIHRoZSBlbnRyeSBpcyB2ZXJpZmllZCB0byBzdGlsbCBiZSBhbGl2ZSBpbiB0aGUgdHJlZS5cbiYjNDM7XHQgKiBUaGUgc3dwZW50cnkgaXMgY29waWVkIHRvIHRoZSBzdGFjayBzbyB3ZSBjYW4gcGluIHRoZSBzd2FwXG4mIzQzO1x0ICogZGV2aWNlIGFuZCB2YWxpZGF0ZSB0aGUgZW50cnkmIzM5O3Mgc3dhcCB0YWJsZSBQb2ludGVyIHVuZGVyXG4mIzQzO1x0ICogY2ktXHUwMDNlbG9jayBpbiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKS5cbiBcdCAqL1xuIFx0c3dwZW50cnkgPSBlbnRyeS1cdTAwM2Vzd3BlbnRyeTtcbiBcbkBAIC0xMzk4LDcgJiM0MzsxMzgzLDExIEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbClcbiB7XG4gXHRzd3BfZW50cnlfdCBwYWdlX3N3cGVudHJ5ID0gcGFnZV9zd2FwX2VudHJ5KHBhZ2UpO1xuLVx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgKm9sZDtcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCAqb2xkID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiYjNDM7XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQocGFnZV9zd3BlbnRyeSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzd3BfdGI7XG4gXG4gXHQvKiBhbGxvY2F0ZSBlbnRyeSAqL1xuIFx0ZW50cnkgPSB6c3dhcF9lbnRyeV9jYWNoZV9hbGxvYyhHRlBfS0VSTkVMLCBwYWdlX3RvX25pZChwYWdlKSk7XG5AQCAtMTQxMCwzMSAmIzQzOzEzOTksNDkgQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdGlmICghenN3YXBfY29tcHJlc3MocGFnZSwgZW50cnksIHBvb2wpKVxuIFx0XHRnb3RvIGNvbXByZXNzX2ZhaWxlZDtcbiBcbi1cdG9sZCA9IHhhX3N0b3JlKHN3YXBfenN3YXBfdHJlZShwYWdlX3N3cGVudHJ5KSxcbi1cdFx0ICAgICAgIHN3cF9vZmZzZXQocGFnZV9zd3BlbnRyeSksXG4tXHRcdCAgICAgICBlbnRyeSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoeGFfaXNfZXJyKG9sZCkpIHtcbi1cdFx0aW50IGVyciA9IHhhX2VycihvbGQpO1xuLVxuLVx0XHRXQVJOX09OQ0UoZXJyICE9IC1FTk9NRU0sIFwmIzM0O3VuZXhwZWN0ZWQgeGFycmF5IGVycm9yOiAlZFxcblwmIzM0OywgZXJyKTtcbi1cdFx0enN3YXBfcmVqZWN0X2FsbG9jX2ZhaWwmIzQzOyYjNDM7O1xuLVx0XHRnb3RvIHN0b3JlX2ZhaWxlZDtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFN0b3JlIHRoZSB6c3dhcF9lbnRyeSBwb2ludGVyIGluIHRoZSBzd2FwIHRhYmxlIGFzIGFcbiYjNDM7XHQgKiBQb2ludGVyLXR5cGUgZW50cnksIHJlcGxhY2luZyB0aGUgUEZOIG9yIFNoYWRvdyBlbnRyeS5cbiYjNDM7XHQgKiBUaGUgZnVsbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlIChpbmNsdWRpbmcgd29ya2luZyBzZXRcbiYjNDM7XHQgKiBzaGFkb3cpIGlzIHByZXNlcnZlZCBpbiBlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsLlxuJiM0MztcdCAqIEZvbGlvIGxvY2sgc2VyaWFsaXplcyBjb25jdXJyZW50IHN0b3Jlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzaSA9IF9fc3dhcF9lbnRyeV90b19pbmZvKHBhZ2Vfc3dwZW50cnkpO1xuJiM0MztcdGNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTtcbiYjNDM7XHRpZiAoc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogU2F2ZSB0aGUgY29tcGxldGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZVxuJiM0MztcdFx0ICogKFNoYWRvdyBvciBQRk4pLCBwcmVzZXJ2aW5nIHN3YXAgY291bnQsIHplcm8gZmxhZyxcbiYjNDM7XHRcdCAqIGFuZCB3b3JraW5nIHNldCBzaGFkb3cgaW5mb3JtYXRpb24uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGVudHJ5LVx1MDAzZXN3cF90Yl92YWwgPSBzd3BfdGI7XG4mIzQzO1x0fSBlbHNlIGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogUmVwbGFjaW5nIGFuIGV4aXN0aW5nIFBvaW50ZXIgZW50cnkgKGUuZy4gZnJvbSBhXG4mIzQzO1x0XHQgKiByZWRpcnRpZWQgZm9saW8pLiBJbmhlcml0IHRoZSBzYXZlZCBzd2FwIHRhYmxlIHZhbHVlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRvbGQgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuJiM0MztcdFx0ZW50cnktXHUwMDNlc3dwX3RiX3ZhbCA9IG9sZC1cdTAwM2Vzd3BfdGJfdmFsO1xuIFx0fVxuLVxuJiM0MztcdF9fc3dhcF90YWJsZV9zZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIsXG4mIzQzO1x0XHRcdCBwb2ludGVyX3RvX3N3cF90YihlbnRyeSkpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuIFx0Lypcbi1cdCAqIFdlIG1heSBoYXZlIGhhZCBhbiBleGlzdGluZyBlbnRyeSB0aGF0IGJlY2FtZSBzdGFsZSB3aGVuXG4tXHQgKiB0aGUgZm9saW8gd2FzIHJlZGlydGllZCBhbmQgbm93IHRoZSBuZXcgdmVyc2lvbiBpcyBiZWluZ1xuLVx0ICogc3dhcHBlZCBvdXQuIEdldCByaWQgb2YgdGhlIG9sZC5cbiYjNDM7XHQgKiBJZiB3ZSBoYWQgYW4gZXhpc3RpbmcgenN3YXAgZW50cnkgZnJvbSB0aGUgc3dhcCB0YWJsZVxuJiM0MztcdCAqIChlLmcuIGZyb20gYSBwcmV2aW91cyByZWRpcnRpZWQgZm9saW8pLCBnZXQgcmlkIG9mIGl0XG4mIzQzO1x0ICogb3V0c2lkZSB0aGUgbG9jay5cbiBcdCAqL1xuIFx0aWYgKG9sZClcbiBcdFx0enN3YXBfZW50cnlfZnJlZShvbGQpO1xuIFxuIFx0Lypcbi1cdCAqIFRoZSBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIHRoZSB0cmVlLCB0aGVyZSBpc1xuLVx0ICogbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2wgYW5kIG9iamNnLFxuLVx0ICogY2hhcmdlIHpzd2FwIG1lbW9yeSwgYW5kIGluY3JlbWVudCB6c3dhcF9zdG9yZWRfcGFnZXMuXG4mIzQzO1x0ICogVGhlIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4gdGhlIHN3YXAgdGFibGUsXG4mIzQzO1x0ICogdGhlcmUgaXMgbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2xcbiYjNDM7XHQgKiBhbmQgb2JqY2csIGNoYXJnZSB6c3dhcCBtZW1vcnksIGFuZCBpbmNyZW1lbnQgenN3YXBfc3RvcmVkX3BhZ2VzLlxuIFx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXG4tXHQgKiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUuXG4mIzQzO1x0ICogd2hlbiB0aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzd2FwIHRhYmxlLlxuIFx0ICovXG4gXHR6c3dhcF9wb29sX2dldChwb29sKTtcbiBcdGlmIChvYmpjZykge1xuQEAgLTE0NDYsOCAmIzQzOzE0NTMsOCBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0XHRhdG9taWNfbG9uZ19pbmMoXHUwMDI2enN3YXBfc3RvcmVkX2luY29tcHJlc3NpYmxlX3BhZ2VzKTtcbiBcbiBcdC8qXG4tXHQgKiBXZSBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBlbnRyeSB3aGlsZSBpdCYjMzk7cyBhbHJlYWR5IGluIHhhcnJheS5cbi1cdCAqIFRoaXMgaXMgc2FmZSBiZWNhdXNlOlxuJiM0MztcdCAqIFdlIGZpbmlzaCBpbml0aWFsaXppbmcgdGhlIGVudHJ5IHdoaWxlIGl0JiMzOTtzIGFscmVhZHkgaW4gdGhlXG4mIzQzO1x0ICogc3dhcCB0YWJsZS4gVGhpcyBpcyBzYWZlIGJlY2F1c2U6XG4gXHQgKlxuIFx0ICogMS4gQ29uY3VycmVudCBzdG9yZXMgYW5kIGludmFsaWRhdGlvbnMgYXJlIGV4Y2x1ZGVkIGJ5IGZvbGlvIGxvY2suXG4gXHQgKlxuQEAgLTE0NjYsOCAmIzQzOzE0NzMsNiBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLFxuIFxuIFx0cmV0dXJuIHRydWU7XG4gXG4tc3RvcmVfZmFpbGVkOlxuLVx0enNfZnJlZShwb29sLVx1MDAzZXpzX3Bvb2wsIGVudHJ5LVx1MDAzZWhhbmRsZSk7XG4gY29tcHJlc3NfZmFpbGVkOlxuIFx0enN3YXBfZW50cnlfY2FjaGVfZnJlZShlbnRyeSk7XG4gXHRyZXR1cm4gZmFsc2U7XG5AQCAtMTU0NiwxMSAmIzQzOzE1NTEsMzEgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0XHR1bnNpZ25lZCB0eXBlID0gc3dwX3R5cGUoc3dwKTtcbiBcdFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4gXHRcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4tXHRcdHN0cnVjdCB4YXJyYXkgKnRyZWU7XG4mIzQzO1x0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuJiM0MztcdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcztcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgc3dwX3RiO1xuIFxuJiM0MztcdFx0c2lzID0gX19zd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcbiBcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG4tXHRcdFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7XG4tXHRcdFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgJiM0MzsgaW5kZXgpO1xuJiM0MztcdFx0XHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaXMsIG9mZnNldCAmIzQzOyBpbmRleCk7XG4mIzQzO1x0XHRcdHNwaW5fbG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRcdFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgKG9mZnNldCAmIzQzOyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSKTtcbiYjNDM7XHRcdFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcbiYjNDM7XHRcdFx0XHRlbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XG4mIzQzO1x0XHRcdFx0LypcbiYjNDM7XHRcdFx0XHQgKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzd2FwIHRhYmxlIGVudHJ5XG4mIzQzO1x0XHRcdFx0ICogKFNoYWRvdyBvciBQRk4pIHRoYXQgd2FzIHNhdmVkIHdoZW4gdGhlXG4mIzQzO1x0XHRcdFx0ICogUG9pbnRlciBlbnRyeSB3YXMgY3JlYXRlZCwgcmF0aGVyIHRoYW5cbiYjNDM7XHRcdFx0XHQgKiB6ZXJvaW5nIHRoZSBzbG90LiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHN3YXBcbiYjNDM7XHRcdFx0XHQgKiBjb3VudCBhbmQgZmxhZ3Mgc28gdGhlIHN3YXAgY2FjaGUgZm9saW9cbiYjNDM7XHRcdFx0XHQgKiBjYW4gYmUgY29ycmVjdGx5IGNsZWFuZWQgdXAgbGF0ZXIuXG4mIzQzO1x0XHRcdFx0ICovXG4mIzQzO1x0XHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgKG9mZnNldCAmIzQzOyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSLFxuJiM0MztcdFx0XHRcdFx0XHQgZW50cnktXHUwMDNlc3dwX3RiX3ZhbCk7XG4mIzQzO1x0XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdFx0ZW50cnkgPSBOVUxMO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuIFx0XHRcdGlmIChlbnRyeSlcbiBcdFx0XHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuIFx0XHR9XG5AQCAtMTU2Miw2ICYjNDM7MTU4NywxMSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gLyoqXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbiYjNDM7ICogQHplbnRyeTogenN3YXBfZW50cnkgcG9pbnRlciBleHRyYWN0ZWQgZnJvbSBzd2FwIHRhYmxlLCBvciBOVUxMXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSB6c3dhcF9lbnRyeSB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIHN3YXAgdGFibGUgUG9pbnRlciBlbnRyeSBieVxuJiM0MzsgKiBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvIGJlZm9yZSBpdCBvdmVyd3JvdGUgdGhlIGVudHJ5IHdpdGggYSBQRk4uXG4mIzQzOyAqIElmIEB6ZW50cnkgaXMgTlVMTCwgdGhlIHNsb3Qgd2FzIG5vdCBiYWNrZWQgYnkgenN3YXAuXG4gICpcbiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmVcbiAgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxuQEAgLTE1NzksMTIgJiM0MzsxNjA5LDkgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xuICAqICBsb2NrZWQgb24gcmV0dXJuLlxuICAqL1xuLWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4mIzQzO2ludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHZvaWQgKnplbnRyeSlcbiB7XG4tXHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cdTAwM2Vzd2FwO1xuLVx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4tXHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cCk7XG4tXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuJiM0MztcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSB6ZW50cnk7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XG5AQCAtMTYwMiw3ICYjNDM7MTYyOSw2IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuIFxuLVx0ZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7XG4gXHRpZiAoIWVudHJ5KVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbkBAIC0xNjI1LDcgJiM0MzsxNjUxLDYgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdCAqIGNvbXByZXNzaW9uIHdvcmsuXG4gXHQgKi9cbiBcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0eGFfZXJhc2UodHJlZSwgb2Zmc2V0KTtcbiBcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuIFxuIFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbkBAIC0xNjM1LDUyICYjNDM7MTY2MCwxNTkgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiB2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKVxuIHtcbiBcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xuLVx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xuJiM0MztcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3dwX3RiO1xuIFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTtcbiBcbi1cdGlmICh4YV9lbXB0eSh0cmVlKSlcbiYjNDM7XHRzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoc3dwKSk7XG4mIzQzO1x0Y2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2ksIG9mZnNldCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEbyBhIGxvY2tsZXNzIHBlZWsgZmlyc3QuICBJZiBjaS1cdTAwM2Vsb2NrIGlzIGFscmVhZHkgaGVsZCBieVxuJiM0MztcdCAqIHRoZSBjYWxsZXIgKGUuZy4gX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKSwgYW5kIHRoZVxuJiM0MztcdCAqIFBvaW50ZXIgaGFzIGFscmVhZHkgYmVlbiBjbGVhcmVkLCB3ZSBjYW4gYmFpbCBvdXQgd2l0aG91dFxuJiM0MztcdCAqIHNlbGYtZGVhZGxvY2tpbmcuXG4mIzQzO1x0ICovXG4mIzQzO1x0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XG4mIzQzO1x0aWYgKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuJiM0MztcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuJiM0MztcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4mIzQzO1x0XHRlbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSAoU2hhZG93IG9yIFBGTilcbiYjNDM7XHRcdCAqIHRoYXQgd2FzIHNhdmVkIGluIHN3cF90Yl92YWwgd2hlbiB0aGUgUG9pbnRlciBlbnRyeVxuJiM0MztcdFx0ICogd2FzIGNyZWF0ZWQuICBUaGlzIHByZXNlcnZlcyBzd2FwIGNvdW50IGFuZCBmbGFnc1xuJiM0MztcdFx0ICogZm9yIHRoZSBzdWJzZXF1ZW50IHNsb3QtZnJlZSBwYXRoLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSLFxuJiM0MztcdFx0XHRcdCBlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0ZW50cnkgPSBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiYjNDM7XG4gXHRpZiAoZW50cnkpXG4gXHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuIH1cbiBcbi1pbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuJiM0MzsvKlxuJiM0MzsgKiBFeHRyYWN0IHRoZSB3b3JraW5nIHNldCBzaGFkb3cgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxuJiM0MzsgKiBUaGUgc2hhZG93IGlzIHJlY292ZXJlZCBmcm9tIHpzd2FwX2VudHJ5LVx1MDAzZXN3cF90Yl92YWwgd2hpY2ggcHJlc2VydmVzXG4mIzQzOyAqIHRoZSBvcmlnaW5hbCBTaGFkb3cgZW50cnkgdmFsdWUuIFRoZSBzaGFkb3cgY2FuIHRoZW4gYmUgdXNlZCBieVxuJiM0MzsgKiB3b3JraW5nc2V0X3JlZmF1bHQoKSBmb3IgcmVmYXVsdCBkaXN0YW5jZSBjYWxjdWxhdGlvbi5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuIHtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWVzLCAqdHJlZTtcbi1cdHVuc2lnbmVkIGludCBuciwgaTtcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNhdmVkID0gZW50cnktXHUwMDNlc3dwX3RiX3ZhbDtcbiBcbi1cdG5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcbi1cdHRyZWVzID0ga3Z6YWxsb2Nfb2JqcygqdHJlZSwgbnIpO1xuLVx0aWYgKCF0cmVlcykge1xuLVx0XHRwcl9lcnIoXCYjMzQ7YWxsb2MgZmFpbGVkLCB6c3dhcCBkaXNhYmxlZCBmb3Igc3dhcCB0eXBlICVkXFxuXCYjMzQ7LCB0eXBlKTtcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXHR9XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBzd3BfdGJfdmFsIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeS4gIE9ubHlcbiYjNDM7XHQgKiBTaGFkb3cgZW50cmllcyBjYXJyeSB3b3JraW5nc2V0IGluZm9ybWF0aW9uOyBQRk4gYW5kIE5VTExcbiYjNDM7XHQgKiBlbnRyaWVzIGhhdmUgbm8gc2hhZG93IHRvIGV4dHJhY3QuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFzd3BfdGJfaXNfc2hhZG93KHNhdmVkKSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKHZvaWQgKikoc2F2ZWQgXHUwMDI2IH5TV1BfVEJfRkxBR1NfTUFTSyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlYWQgdGhlIHN3YXAgY291bnQgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LiBUaGUgY291bnRcbiYjNDM7ICogYW5kIGZsYWdzIGFyZSBzdG9yZWQgaW4genN3YXBfZW50cnktXHUwMDNlc3dwX3RiX3ZhbCB3aGljaCBwcmVzZXJ2ZXMgdGhlXG4mIzQzOyAqIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgKFNoYWRvdyBvciBQRk4gZm9ybWF0KS5cbiYjNDM7ICovXG4mIzQzO3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZWFkIHRoZSBmbGFncyBmcm9tIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXG4mIzQzOyAqL1xuJiM0Mzt1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIF9fc3dwX3RiX2dldF9mbGFncyhlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbiYjNDM7fVxuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuLVx0XHR4YV9pbml0KHRyZWVzICYjNDM7IGkpO1xuJiM0MzsvKlxuJiM0MzsgKiBJbmNyZW1lbnQgdGhlIHN3YXAgY291bnQgb2YgYSBQb2ludGVyLXR5cGUgc3dhcCB0YWJsZSBlbnRyeS5cbiYjNDM7ICogVGhlIGNvdW50IGlzIHN0b3JlZCBpbiB6c3dhcF9lbnRyeS1cdTAwM2Vzd3BfdGJfdmFsIGZvciBjb3VudHMgYmVsb3dcbiYjNDM7ICogU1dQX1RCX0NPVU5UX01BWCwgYW5kIG92ZXJmbG93cyBpbnRvIHRoZSBjbHVzdGVyJiMzOTtzIGV4dGVuZF90YWJsZVxuJiM0MzsgKiBqdXN0IGxpa2Ugbm9ybWFsIFNoYWRvdy9QRk4gZW50cmllcyBkby4gIFJldHVybnMgMCBvbiBzdWNjZXNzLFxuJiM0MzsgKiAtRU5PTUVNIGlmIGNvdW50IHdvdWxkIG92ZXJmbG93IGFuZCBubyBleHRlbmRfdGFibGUgaXMgYXZhaWxhYmxlLlxuJiM0MzsgKi9cbiYjNDM7aW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHVuc2lnbmVkIGludCBjaV9vZmYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwpO1xuIFxuLVx0bnJfenN3YXBfdHJlZXNbdHlwZV0gPSBucjtcbi1cdHpzd2FwX3RyZWVzW3R5cGVdID0gdHJlZXM7XG4mIzQzO1x0aWYgKGNvdW50IFx1MDAzYyBTV1BfVEJfQ09VTlRfTUFYKSB7XG4mIzQzO1x0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgY291bnQgJiM0MzsgMSk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1x0LyogY291bnQgPT0gTUFYLCBvdmVyZmxvdyBpbnRvIGV4dGVuZF90YWJsZSAqL1xuJiM0MztcdGlmICghY2ktXHUwMDNlZXh0ZW5kX3RhYmxlKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0Y291bnQgPSBjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcbiYjNDM7XHRpZiAoY291bnQgPT0gMClcbiYjNDM7XHRcdGNvdW50ID0gU1dQX1RCX0NPVU5UX01BWDtcbiYjNDM7XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcbiBcdHJldHVybiAwO1xuIH1cbiBcbi12b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpXG4mIzQzOy8qXG4mIzQzOyAqIERlY3JlbWVudCB0aGUgc3dhcCBjb3VudCBvZiBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxuJiM0MzsgKiBIYW5kbGVzIGJvdGggaW5saW5lIGNvdW50IChpbiBzd3BfdGJfdmFsKSBhbmQgb3ZlcmZsb3dlZCBjb3VudFxuJiM0MzsgKiAoaW4gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlKSwgbWF0Y2hpbmcgdGhlIGxvZ2ljIHVzZWQgYnkgbm9ybWFsIGVudHJpZXMuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIHpzd2FwX3N3cF90Yl9wdXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4mIzQzO1x0XHRcdCAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKVxuIHtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWVzID0genN3YXBfdHJlZXNbdHlwZV07XG4tXHR1bnNpZ25lZCBpbnQgaTtcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwpO1xuJiM0MztcbiYjNDM7XHRWTV9XQVJOX09OX09OQ0UoY291bnQgPT0gMCk7XG4gXG4tXHRpZiAoIXRyZWVzKVxuJiM0MztcdGlmIChjb3VudCA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XG4mIzQzO1x0XHRpZiAoIWNpLVx1MDAzZWV4dGVuZF90YWJsZSkge1xuJiM0MztcdFx0XHRjb3VudC0tO1xuJiM0MztcdFx0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCwgY291bnQpO1xuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjb3VudCA9IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xuJiM0MztcdFx0LyogT3ZlcmZsb3cgc3RhcnRzIHdpdGggU1dQX1RCX0NPVU5UX01BWCAqL1xuJiM0MztcdFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFx1MDAzYyBTV1BfVEJfQ09VTlRfTUFYKTtcbiYjNDM7XHRcdGNvdW50LS07XG4mIzQzO1x0XHRpZiAoY291bnQgPT0gKFNXUF9UQl9DT1VOVF9NQVggLSAxKSkge1xuJiM0MztcdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IDA7XG4mIzQzO1x0XHRcdGVudHJ5LVx1MDAzZXN3cF90Yl92YWwgPSBfX3N3cF90Yl9ta19jb3VudChlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgIGNvdW50KTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7XG4mIzQzO1x0XHR9XG4gXHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0ZW50cnktXHUwMDNlc3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwsIGNvdW50IC0gMSk7XG4mIzQzO31cbiBcbi1cdC8qIHRyeV90b191bnVzZSgpIGludmFsaWRhdGVkIGFsbCB0aGUgZW50cmllcyBhbHJlYWR5ICovXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl96c3dhcF90cmVlc1t0eXBlXTsgaSYjNDM7JiM0MzspXG4tXHRcdFdBUk5fT05fT05DRSgheGFfZW1wdHkodHJlZXMgJiM0MzsgaSkpO1xuJiM0MztpbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiBcbi1cdGt2ZnJlZSh0cmVlcyk7XG4tXHRucl96c3dhcF90cmVlc1t0eXBlXSA9IDA7XG4tXHR6c3dhcF90cmVlc1t0eXBlXSA9IE5VTEw7XG4mIzQzO3ZvaWQgenN3YXBfc3dhcG9mZihpbnQgdHlwZSlcbiYjNDM7e1xuIH1cbiBcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMTU6MTE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7WlNXQVAmIzM0OywKICAgICYjMzQ7WlNXQVBfREVGQVVMVF9PTiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX3N0b3JlJiMzNDssCiAgICAmIzM0O3pzd2FwX2xvYWQmIzM0OywKICAgICYjMzQ7enN3YXBfaW52YWxpZGF0ZSYjMzQ7LAogICAgJiMzNDt6c3dhcF93cml0ZWJhY2tfZW50cnkmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvJiMzNDssCiAgICAmIzM0O19fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeSYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMmIzM0OywKICAgICYjMzQ7X19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5JiMzNDssCiAgICAmIzM0O3pzd2FwX3N3cF90Yl9kdXBfY291bnQmIzM0OywKICAgICYjMzQ7enN3YXBfc3dwX3RiX3B1dF9jb3VudCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGYyMDExOTg1ODc2MzEyMTVmNzA4ZjU4ODZhOTgxMDMyM2ZiYzIzOTkKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEp1bCA3IDE1OjExOjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC96c3dhcC5oIGIvaW5jbHVkZS9saW51eC96c3dhcC5oCmluZGV4IDMwYzE5M2ExMjA3ZTE2Li40ZjU1YzhkMGM0YzU0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC96c3dhcC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvenN3YXAuaApAQCAtMjYsNyAmIzQzOzI2LDcgQEAgc3RydWN0IHpzd2FwX2xydXZlY19zdGF0ZSB7CiAKIHVuc2lnbmVkIGxvbmcgenN3YXBfdG90YWxfcGFnZXModm9pZCk7CiBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pOwotaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbyk7CiYjNDM7aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KTsKIHZvaWQgenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnlfdCBzd3ApOwogaW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiB2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpOwpAQCAtNDQsNyAmIzQzOzQ0LDcgQEAgc3RhdGljIGlubGluZSBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7c3RhdGljIGlubGluZSBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB2b2lkICp6ZW50cnkpCiB7CiAJcmV0dXJuIC1FTk9FTlQ7CiB9CmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmMKaW5kZXggYjIzZjQ5NGZjYzgzZGEuLjFjZTgyMDFlZDg2ZTI0IDEwMDY0NAotLS0gYS9tbS9wYWdlX2lvLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9pby5jCkBAIC02NTgsNyAmIzQzOzY1OCw3IEBAIHN0YXRpYyB2b2lkIHN3YXBfcmVhZF9mb2xpb19iZGV2X2FzeW5jKHN0cnVjdCBmb2xpbyAqZm9saW8sCiAJc3VibWl0X2JpbyhiaW8pOwogfQogCi12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZykKJiM0Mzt2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KQogewogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBfX3N3YXBfZW50cnlfdG9faW5mbyhmb2xpby0mZ3Q7c3dhcCk7CiAJYm9vbCBzeW5jaHJvbm91cyA9IHNpcy0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NZTkNIUk9OT1VTX0lPOwpAQCAtNjg2LDcgJiM0Mzs2ODYsNyBAQCB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZykKIAkJZ290byBmaW5pc2g7CiAJfQogCi0JaWYgKHpzd2FwX2xvYWQoZm9saW8pICE9IC1FTk9FTlQpCiYjNDM7CWlmICh6c3dhcF9sb2FkKGZvbGlvLCB6ZW50cnkpICE9IC1FTk9FTlQpCiAJCWdvdG8gZmluaXNoOwogCiAJLyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovCmRpZmYgLS1naXQgYS9tbS9zd2FwLmggYi9tbS9zd2FwLmgKaW5kZXggNDRhYjhlMWU1OTViMDguLjg0ZTEzYmE2ZTYwNWMzIDEwMDY0NAotLS0gYS9tbS9zd2FwLmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcC5oCkBAIC0yMTAsNiAmIzQzOzIxMCw0MSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jbHVzdGVyX3VubG9ja19pcnEoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSkKIAogZXh0ZXJuIGludCBzd2FwX3JldHJ5X3RhYmxlX2FsbG9jKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnApOwogCiYjNDM7c3RydWN0IHpzd2FwX2VudHJ5OwomIzQzOyNpZmRlZiBDT05GSUdfWlNXQVAKJiM0Mzt2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90Yik7CiYjNDM7dW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiKTsKJiM0Mzt1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpOwomIzQzO2ludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLAomIzQzOwkJCSAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHVuc2lnbmVkIGludCBjaV9vZmYpOwomIzQzO3ZvaWQgenN3YXBfc3dwX3RiX3B1dF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YiwKJiM0MzsJCQkgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZik7CiYjNDM7dm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpOwomIzQzOyNlbHNlCiYjNDM7c3RhdGljIGlubGluZSB2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YikKJiM0Mzt7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YikKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90YikKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztzdGF0aWMgaW5saW5lIGludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLAomIzQzOwkJCQkJIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiYjNDM7CQkJCQkgdW5zaWduZWQgaW50IGNpX29mZikKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgenN3YXBfc3dwX3RiX3B1dF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YiwKJiM0MzsJCQkJCSAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKJiM0MzsJCQkJCSAgdW5zaWduZWQgaW50IGNpX29mZikge30KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KSB7fQomIzQzOyNlbmRpZgomIzQzOwogLyoKICAqIEJlbG93IGFyZSB0aGUgY29yZSByb3V0aW5lcyBmb3IgZG9pbmcgc3dhcCBmb3IgYSBmb2xpby4KICAqIEFsbCBoZWxwZXJzIHJlcXVpcmVzIHRoZSBmb2xpbyB0byBiZSBsb2NrZWQsIGFuZCBhIGxvY2tlZCBmb2xpbwpAQCAtMjQxLDcgJiM0MzsyNzYsNyBAQCBleHRlcm4gdm9pZCBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogLyogbGludXgvbW0vcGFnZV9pby5jICovCiBpbnQgc2lvX3Bvb2xfaW5pdCh2b2lkKTsKIHN0cnVjdCBzd2FwX2lvY2I7Ci12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zyk7CiYjNDM7dm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsIHZvaWQgKnplbnRyeSk7CiB2b2lkIF9fc3dhcF9yZWFkX3VucGx1ZyhzdHJ1Y3Qgc3dhcF9pb2NiICpwbHVnKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX3JlYWRfdW5wbHVnKHN0cnVjdCBzd2FwX2lvY2IgKnBsdWcpCiB7CkBAIC0zMDMsMTMgJiM0MzszMzgsMTYgQEAgc3RhdGljIGlubGluZSBib29sIGZvbGlvX21hdGNoZXNfc3dhcF9lbnRyeShjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvLAogYm9vbCBzd2FwX2NhY2hlX2hhc19mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSk7CiBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfZ2V0X2ZvbGlvKHN3cF9lbnRyeV90IGVudHJ5KTsKIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSk7CiYjNDM7Ym9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pOwogdm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTsKIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BfZW50cnlfdCB0YXJnZXRfZW50cnksIGdmcF90IGdmcF9tYXNrLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvcmRlcnMsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLAotCQkJCSAgICAgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpOwomIzQzOwkJCQkgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LAomIzQzOwkJCQkgICAgIHZvaWQgKip6ZW50cnkpOwogLyogQmVsb3cgaGVscGVycyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gbG9jayBhbmQgcGFzcyBpbiB0aGUgc3dhcCBjbHVzdGVyLiAqLwogdm9pZCBfX3N3YXBfY2FjaGVfYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCi0JCQkgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpOwomIzQzOwkJCSAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwKJiM0MzsJCQkgICAgdm9pZCAqKnplbnRyeSk7CiB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkJCSAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTsKIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKQEAgLTM4MSw3ICYjNDM7NDE5LDggQEAgc3RhdGljIGlubGluZSB2b2lkIGZvbGlvX3B1dF9zd2FwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpwYWdlKQogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsCiYjNDM7CQkJCSAgIHZvaWQgKnplbnRyeSkKIHsKIH0KIApAQCAtNDUzLDYgJiM0Mzs0OTIsMTEgQEAgc3RhdGljIGlubGluZSB2b2lkICpzd2FwX2NhY2hlX2dldF9zaGFkb3coc3dwX2VudHJ5X3QgZW50cnkpCiAJcmV0dXJuIE5VTEw7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewogfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDZmZDZlMzQxNWI3MThiLi42MGQ5MzdjNmIzOTIyNCAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtMTc1LDE2ICYjNDM7MTc1LDI5IEBAIHN0YXRpYyBpbnQgX19zd2FwX2NhY2hlX2FkZF9jaGVjayhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogCW9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7CiAJaWYgKHN3cF90Yl9pc19mb2xpbyhvbGRfdGIpKQogCQlyZXR1cm4gLUVFWElTVDsKLQlpZiAoIV9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKQomIzQzOwlpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkgewomIzQzOwkJaWYgKCF6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpCiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CX0gZWxzZSBpZiAoIV9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKSB7CiAJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiAJaWYgKHNoYWRvd3AgJmFtcDsmYW1wOyBzd3BfdGJfaXNfc2hhZG93KG9sZF90YikpCiAJCSpzaGFkb3dwID0gc3dwX3RiX3RvX3NoYWRvdyhvbGRfdGIpOwomIzQzOwllbHNlIGlmIChzaGFkb3dwICZhbXA7JmFtcDsgc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkKJiM0MzsJCSpzaGFkb3dwID0genN3YXBfc3dwX3RiX2dldF9zaGFkb3cob2xkX3RiKTsKIAlpZiAobWVtY2dfaWQpCiAJCSptZW1jZ19pZCA9IF9fc3dhcF9jZ3JvdXBfZ2V0KGNpLCBjaV9vZmYpOwogCiAJaWYgKG5yID09IDEpCiAJCXJldHVybiAwOwogCiYjNDM7CS8qCiYjNDM7CSAqIEZvciBtdWx0aS1zbG90IHJhbmdlcywgUG9pbnRlciBlbnRyaWVzIGFyZSBub3QgZXhwZWN0ZWQgc2luY2UKJiM0MzsJICogenN3YXAgZG9lcyBub3Qgc3VwcG9ydCBsYXJnZSBmb2xpb3MuIFJldHVybiAtRUJVU1kgZm9yIHNhZmV0eS4KJiM0MzsJICovCiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKQomIzQzOwkJcmV0dXJuIC1FQlVTWTsKJiM0MzsKIAlpc196ZXJvID0gX19zd2FwX3RhYmxlX3Rlc3RfemVybyhjaSwgY2lfb2ZmKTsKIAljaV9vZmYgPSByb3VuZF9kb3duKGNpX29mZiwgbnIpOwogCWNpX2VuZCA9IGNpX29mZiAmIzQzOyBucjsKQEAgLTIwMSw3ICYjNDM7MjE0LDggQEAgc3RhdGljIGludCBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiB9CiAKIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKLQkJCQkgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSkKJiM0MzsJCQkJICAgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksCiYjNDM7CQkJCSAgICAgIHZvaWQgKip6ZW50cnkpCiB7CiAJdW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSksIGNpX2VuZDsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwpAQCAtMjE2LDcgJiM0MzsyMzAsMzQgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogCWRvIHsKIAkJb2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTsKIAkJVk1fV0FSTl9PTl9PTkNFKHN3cF90Yl9pc19mb2xpbyhvbGRfdGIpKTsKLQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBwZm5fdG9fc3dwX3RiKHBmbiwgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiBJZiB0aGUgb2xkIGVudHJ5IGlzIGEgUG9pbnRlciAoenN3YXAgY29tcHJlc3NlZCBkYXRhKSwKJiM0MzsJCSAqIGV4dHJhY3QgdGhlIHpzd2FwX2VudHJ5IGZvciB0aGUgY2FsbGVyIGFuZCBwcmVzZXJ2ZQomIzQzOwkJICogaXRzIGZsYWdzLiBUaGUgUG9pbnRlciBlbnRyeSBoYXMgbm8gaW5saW5lIGZsYWdzLgomIzQzOwkJICovCiYjNDM7CQlpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkgewomIzQzOwkJCXVuc2lnbmVkIGNoYXIgcGZsYWdzID0genN3YXBfc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpOwomIzQzOwkJCS8qCiYjNDM7CQkJICogSWYgc3dwX3RiX3ZhbCBjYXJyaWVzIFNXUF9UQl9DT1VOVF9NQVgsIHRoZQomIzQzOwkJCSAqIHJlYWwgb3ZlcmZsb3cgY291bnQgbGl2ZXMgaW4gY2ktJmd0O2V4dGVuZF90YWJsZS4KJiM0MzsJCQkgKiBQdWxsIGl0IHNvIHRoZSBuZXcgUEZOIGNhcnJpZXMgdGhlIGNvcnJlY3QgY291bnQKJiM0MzsJCQkgKiBhbmQgd29uJiMzOTt0IGxhdGVyIGNyYXNoIG9uIGEgbWlzc2luZyBleHRlbmRfdGFibGUuCiYjNDM7CQkJICovCiYjNDM7CQkJaWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7CiYjNDM7CQkJCXVuc2lnbmVkIGNoYXIgcmVhbCA9IFNXUF9UQl9DT1VOVF9NQVggLSAxOwomIzQzOwkJCQlpZiAoY2ktJmd0O2V4dGVuZF90YWJsZSAmYW1wOyZhbXA7IGNpLSZndDtleHRlbmRfdGFibGVbY2lfb2ZmXSkKJiM0MzsJCQkJCXJlYWwgPSBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl07CiYjNDM7CQkJCXBmbGFncyA9IChyZWFsICZsdDsmbHQ7IChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgfAomIzQzOwkJCQkJIChwZmxhZ3MgJmFtcDsgKCgxICZsdDsmbHQ7IChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgLSAxKSk7CiYjNDM7CQkJfQomIzQzOwkJCWlmICh6ZW50cnkgJmFtcDsmYW1wOyAhKnplbnRyeSkKJiM0MzsJCQkJKnplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKG9sZF90Yik7CiYjNDM7CQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLAomIzQzOwkJCQlwZm5fdG9fc3dwX3RiKHBmbiwgcGZsYWdzKSk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCV9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwKJiM0MzsJCQkJcGZuX3RvX3N3cF90YihwZm4sIF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7CiYjNDM7CQl9CiAJfSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiAmbHQ7IGNpX2VuZCk7CiAKIAlmb2xpb19yZWZfYWRkKGZvbGlvLCBucl9wYWdlcyk7CkBAIC0yMzksMTEgJiM0MzsyODAsMTIgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogICogdGhhdCBob2xkcyB0aGUgZW50cmllcy4KICAqLwogdm9pZCBfX3N3YXBfY2FjaGVfYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCi0JCQkgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpCiYjNDM7CQkJICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LAomIzQzOwkJCSAgICB2b2lkICoqemVudHJ5KQogewogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiAKLQlfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnkpOwomIzQzOwlfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnksIHplbnRyeSk7CiAJbm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9QQUdFUywgbnJfcGFnZXMpOwogCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU1dBUENBQ0hFLCBucl9wYWdlcyk7CiB9CkBAIC0yNjksMTUgJiM0MzszMTEsMjggQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogCWNpX29mZiA9IGNpX3N0YXJ0OwogCWRvIHsKIAkJb2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTsKLQkJV0FSTl9PTl9PTkNFKCFzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSB8fAotCQkJICAgICBzd3BfdGJfdG9fZm9saW8ob2xkX3RiKSAhPSBmb2xpbyk7Ci0JCWlmIChfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSkKLQkJCWZvbGlvX3N3YXBwZWQgPSB0cnVlOwotCQllbHNlCi0JCQluZWVkX2ZyZWUgPSB0cnVlOwotCQkvKiBJZiBzaGFkb3cgaXMgTlVMTCwgd2Ugc2V0IGFuIGVtcHR5IHNoYWRvdy4gKi8KLQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdywKLQkJCQkgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiBJZiB6c3dhcCBhbHJlYWR5IHN0b3JlZCBkYXRhIGZvciB0aGlzIHNsb3QKJiM0MzsJCSAqICh6c3dhcF9zdG9yZSB3cm90ZSBhIFBvaW50ZXIgZW50cnkpLCBsZWF2ZSBpdAomIzQzOwkJICogaW4gcGxhY2UuIFRoZSBjb3VudCBhbmQgZmxhZ3MgYXJlIHN0b3JlZCBpbiB0aGUKJiM0MzsJCSAqIHpzd2FwX2VudHJ5IHN0cnVjdC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpIHsKJiM0MzsJCQlpZiAoenN3YXBfc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKQomIzQzOwkJCQlmb2xpb19zd2FwcGVkID0gdHJ1ZTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCW5lZWRfZnJlZSA9IHRydWU7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCVdBUk5fT05fT05DRSghc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikgfHwKJiM0MzsJCQkJICAgICBzd3BfdGJfdG9fZm9saW8ob2xkX3RiKSAhPSBmb2xpbyk7CiYjNDM7CQkJaWYgKF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKQomIzQzOwkJCQlmb2xpb19zd2FwcGVkID0gdHJ1ZTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCW5lZWRfZnJlZSA9IHRydWU7CiYjNDM7CQkJLyogSWYgc2hhZG93IGlzIE5VTEwsIHdlIHNldCBhbiBlbXB0eSBzaGFkb3cuICovCiYjNDM7CQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdywKJiM0MzsJCQkJCSBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpOwomIzQzOwkJfQogCX0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgJmx0OyBjaV9lbmQpOwogCiAJZm9saW8tJmd0O3N3YXAudmFsID0gMDsKQEAgLTI4OCw3ICYjNDM7MzQzLDE0IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAl9IGVsc2UgaWYgKG5lZWRfZnJlZSkgewogCQljaV9vZmYgPSBjaV9zdGFydDsKIAkJZG8gewotCQkJaWYgKCFfX3N3cF90Yl9nZXRfY291bnQoX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkpCiYjNDM7CQkJdW5zaWduZWQgbG9uZyB0YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7CiYjNDM7CQkJdW5zaWduZWQgY2hhciBjbnQ7CiYjNDM7CiYjNDM7CQkJaWYgKHN3cF90Yl9pc19wb2ludGVyKHRiKSkKJiM0MzsJCQkJY250ID0genN3YXBfc3dwX3RiX2dldF9jb3VudCh0Yik7CiYjNDM7CQkJZWxzZQomIzQzOwkJCQljbnQgPSBfX3N3cF90Yl9nZXRfY291bnQodGIpOwomIzQzOwkJCWlmICghY250KQogCQkJCV9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzaSwgY2ksIGNpX29mZiwgMSk7CiAJCX0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgJmx0OyBjaV9lbmQpOwogCX0KQEAgLTQwMyw3ICYjNDM7NDY1LDggQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAJCQkJCXN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCwKIAkJCQkJdW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwKLQkJCQkJc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpCiYjNDM7CQkJCQlzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCwKJiM0MzsJCQkJCXZvaWQgKip6ZW50cnkpCiB7CiAJaW50IGVycjsKIAlzd3BfZW50cnlfdCBlbnRyeTsKQEAgLTQ1MCw3ICYjNDM7NTEzLDcgQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAKIAlfX2ZvbGlvX3NldF9sb2NrZWQoZm9saW8pOwogCV9fZm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pOwotCV9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSk7CiYjNDM7CV9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSwgemVudHJ5KTsKIAlzcGluX3VubG9jaygmYW1wO2NpLSZndDtsb2NrKTsKIAogCWlmIChtZW1fY2dyb3VwX3N3YXBpbl9jaGFyZ2VfZm9saW8oZm9saW8sIG1lbWNnX2lkLApAQCAtNTA3LDcgJiM0Mzs1NzAsOCBAQCBzdGF0aWMgc3RydWN0IGZvbGlvICpfX3N3YXBfY2FjaGVfYWxsb2Moc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKICAqLwogc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb3JkZXJzLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwKLQkJCQkgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KQomIzQzOwkJCQkgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LAomIzQzOwkJCQkgICAgIHZvaWQgKip6ZW50cnkpCiB7CiAJaW50IG9yZGVyLCBlcnI7CiAJc3RydWN0IGZvbGlvICpyZXQ7CkBAIC01MjAsOSAmIzQzOzU4NCwxMiBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfYWxsb2NfZm9saW8oc3dwX2VudHJ5X3QgdGFyZ19lbnRyeSwgZ2ZwX3QgZ2ZwLAogCWlmIChXQVJOX09OX09OQ0UoIW9yZGVycyB8fCAoMVVMICZsdDsmbHQ7IG9yZGVyKSAmZ3Q7IFNXQVBGSUxFX0NMVVNURVIpKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAomIzQzOwlpZiAoemVudHJ5KQomIzQzOwkJKnplbnRyeSA9IE5VTEw7CiYjNDM7CiAJZG8gewogCQlyZXQgPSBfX3N3YXBfY2FjaGVfYWxsb2MoY2ksIHRhcmdfZW50cnksIGdmcCwgb3JkZXIsCi0JCQkJCSB2bWYsIG1wb2wsIGlseCk7CiYjNDM7CQkJCQkgdm1mLCBtcG9sLCBpbHgsIHplbnRyeSk7CiAJCWlmICghSVNfRVJSKHJldCkpCiAJCQlicmVhazsKIAkJZXJyID0gUFRSX0VSUihyZXQpOwpAQCAtNjM4LDE4ICYjNDM7NzA1LDIwIEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfcmVhZF9mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLAogCQkJCQkgICBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZywgYm9vbCByZWFkYWhlYWQpCiB7CiAJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJdm9pZCAqemVudHJ5OwogCiAJZG8gewogCQlmb2xpbyA9IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKGVudHJ5KTsKIAkJaWYgKGZvbGlvKQogCQkJcmV0dXJuIGZvbGlvOwotCQlmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgQklUKDApLCBOVUxMLCBtcG9sLCBpbHgpOwomIzQzOwkJZm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKGVudHJ5LCBnZnAsIEJJVCgwKSwgTlVMTCwgbXBvbCwgaWx4LAomIzQzOwkJCQkJICAgICAgICZhbXA7emVudHJ5KTsKIAl9IHdoaWxlIChQVFJfRVJSKGZvbGlvKSA9PSAtRUVYSVNUKTsKIAogCWlmIChJU19FUlJfT1JfTlVMTChmb2xpbykpCiAJCXJldHVybiBOVUxMOwogCi0Jc3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnKTsKJiM0MzsJc3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnLCB6ZW50cnkpOwogCWlmIChyZWFkYWhlYWQpIHsKIAkJZm9saW9fc2V0X3JlYWRhaGVhZChmb2xpbyk7CiAJCWNvdW50X3ZtX2V2ZW50KFNXQVBfUkEpOwpAQCAtNjc4LDE4ICYjNDM7NzQ3LDIwIEBAIHN0cnVjdCBmb2xpbyAqc3dhcGluX3N5bmMoc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCwgdW5zaWduZWQgbG9uZyBvcmRlcnMsCiAJCQkgICBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpCiB7CiAJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJdm9pZCAqemVudHJ5OwogCiAJZG8gewogCQlmb2xpbyA9IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKGVudHJ5KTsKIAkJaWYgKGZvbGlvKQogCQkJcmV0dXJuIGZvbGlvOwotCQlmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCk7CiYjNDM7CQlmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCwKJiM0MzsJCQkJCSAgICAgICAmYW1wO3plbnRyeSk7CiAJfSB3aGlsZSAoUFRSX0VSUihmb2xpbykgPT0gLUVFWElTVCk7CiAKIAlpZiAoSVNfRVJSKGZvbGlvKSkKIAkJcmV0dXJuIGZvbGlvOwogCi0Jc3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBOVUxMKTsKJiM0MzsJc3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBOVUxMLCB6ZW50cnkpOwogCXJldHVybiBmb2xpbzsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vc3dhcF90YWJsZS5oIGIvbW0vc3dhcF90YWJsZS5oCmluZGV4IGU2NjEzZTYyZjhkMGY2Li42MzE4YmY4YWE3NmIwYyAxMDA2NDQKLS0tIGEvbW0vc3dhcF90YWJsZS5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfdGFibGUuaApAQCAtMjgsNyAmIzQzOzI4LDcgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUgewogICogTlVMTDogICAgIHwtLS0tLS0tLS0tLS0tLS0tIDAgLS0tLS0tLS0tLS0tLS0tfCAtIEZyZWUgc2xvdAogICogU2hhZG93OiAgIHxTV0FQX0NPVU5UfFp8LS0tLSBTSEFET1dfVkFMIC0tLXwxfCAtIFN3YXBwZWQgb3V0IHNsb3QKICAqIFBGTjogICAgICB8U1dBUF9DT1VOVHxafC0tLS0tLSBQRk4gLS0tLS0tLXwxMHwgLSBDYWNoZWQgc2xvdAotICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIChVbnVzZWQpCiYjNDM7ICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIFpzd2FwIGNvbXByZXNzZWQgZW50cnkKICAqIEJhZDogICAgICB8LS0tLS0tLS0tLS0tLSAxIC0tLS0tLS0tLS0tLS18MTAwMHwgLSBCYWQgc2xvdAogICoKICAqIENPVU5UIGlzIGBTV1BfVEJfQ09VTlRfQklUU2AgbG9uZywgWiBpcyB0aGUgYFNXUF9UQl9aRVJPX0ZMQUdgIGJpdCwKQEAgLTQ5LDkgJiM0Mzs0OSwxMSBAQCBzdHJ1Y3Qgc3dhcF9tZW1jZ190YWJsZSB7CiAgKiAtIFBGTjogU3dhcCBzbG90IGlzIGluIHVzZSwgYW5kIGNhY2hlZC4gTWVtY2cgaW5mbyBpcyByZWNvcmRlZCBvbiB0aGUgcGFnZQogICogICBzdHJ1Y3QuCiAgKgotICogLSBQb2ludGVyOiBVbnVzZWQgeWV0LiBgMGIxMDBgIGlzIHJlc2VydmVkIGZvciBwb3RlbnRpYWwgcG9pbnRlciB1c2FnZQotICogICBiZWNhdXNlIG9ubHkgdGhlIGxvd2VyIHRocmVlIGJpdHMgY2FuIGJlIHVzZWQgYXMgYSBtYXJrZXIgZm9yIDggYnl0ZXMKLSAqICAgYWxpZ25lZCBwb2ludGVycy4KJiM0MzsgKiAtIFBvaW50ZXI6IFN0b3JlcyBhIGRpcmVjdCBwb2ludGVyIHRvIGEgenN3YXBfZW50cnkgd2hlbiB0aGUgc3dhcCBzbG90JiMzOTtzCiYjNDM7ICogICBjb21wcmVzc2VkIGRhdGEgcmVzaWRlcyBpbiB6c3dhcC4gVGhlIHN3YXAgY291bnQgKGlmIGFueSkgaXMgc3RvcmVkIGluCiYjNDM7ICogICB0aGUgenN3YXBfZW50cnkgc3RydWN0IHJhdGhlciB0aGFuIGlubGluZSwgc2luY2UgdGhlIHBvaW50ZXIgb2NjdXBpZXMKJiM0MzsgKiAgIGFsbCB1cHBlciBiaXRzLiBgMGIxMDBgIGlzIHVzZWQgYXMgdGhlIG1hcmtlciBiZWNhdXNlIHpzd2FwX2VudHJ5CiYjNDM7ICogICBwb2ludGVycyBhcmUgYXQgbGVhc3QgOC1ieXRlIGFsaWduZWQsIGxlYXZpbmcgdGhlIGxvd2VyIHRocmVlIGJpdHMgZnJlZS4KICAqCiAgKiAtIEJhZDogU3dhcCBzbG90IGlzIHJlc2VydmVkLCBwcm90ZWN0cyBzd2FwIGhlYWRlciBvciBob2xlcyBvbiBzd2FwIGRldmljZXMuCiAgKi8KQEAgLTc4LDYgJiM0Mzs4MCw5IEBAIHN0cnVjdCBzd2FwX21lbWNnX3RhYmxlIHsKIC8qIFRoZSBmaXJzdCBmbGFnIGlzIHplcm8gYml0IChTV0FQX1RBQkxFX0hBU19aRVJPRkxBRykgKi8KICNkZWZpbmUgU1dQX1RCX1pFUk9fRkxBRwlCSVQoQklUU19QRVJfTE9ORyAtIFNXUF9UQl9GTEFHU19CSVRTKQogCiYjNDM7LyogUG9pbnRlcjogenN3YXBfZW50cnkgcG9pbnRlciBzdG9yZWQgZGlyZWN0bHksIGVuZHMgd2l0aCAwYjEwMCAqLwomIzQzOyNkZWZpbmUgU1dQX1RCX1BPSU5URVJfTUFSSwkwYjEwMFVMCiYjNDM7CiAvKiBCYWQgc2xvdDogZW5kcyB3aXRoIDBiMTAwMCBhbmQgcmVzdHMgb2YgYml0cyBhcmUgYWxsIDEgKi8KICNkZWZpbmUgU1dQX1RCX0JBRAkJKCh+MFVMKSAmbHQ7Jmx0OyAzKQogCkBAIC0xNjYsNiAmIzQzOzE3MSwxMSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX2JhZCh1bnNpZ25lZCBsb25nIHN3cF90YikKIAlyZXR1cm4gc3dwX3RiID09IFNXUF9UQl9CQUQ7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX3BvaW50ZXIodW5zaWduZWQgbG9uZyBzd3BfdGIpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHN3cF90YiAmYW1wOyAoQklUKDMpIC0gMSkpID09IFNXUF9UQl9QT0lOVEVSX01BUks7CiYjNDM7fQomIzQzOwogc3RhdGljIGlubGluZSBib29sIHN3cF90Yl9pc19jb3VudGFibGUodW5zaWduZWQgbG9uZyBzd3BfdGIpCiB7CiAJcmV0dXJuIChzd3BfdGJfaXNfc2hhZG93KHN3cF90YikgfHwgc3dwX3RiX2lzX2ZvbGlvKHN3cF90YikgfHwKQEAgLTE4OCw2ICYjNDM7MTk4LDIzIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3dwX3RiX3RvX3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YikKIAlyZXR1cm4gKHZvaWQgKikoc3dwX3RiICZhbXA7IH5TV1BfVEJfRkxBR1NfTUFTSyk7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9pbnRlcl90b19zd3BfdGIodm9pZCAqcHRyKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZylwdHI7CiYjNDM7CiYjNDM7CUJVSUxEX0JVR19PTihzaXplb2YodW5zaWduZWQgbG9uZykgIT0gc2l6ZW9mKHZvaWQgKikpOwomIzQzOwkvKiBQb2ludGVycyBhcmUgOC1ieXRlIGFsaWduZWQsIGxvdyAzIGJpdHMgbXVzdCBiZSBjbGVhciAqLwomIzQzOwlWTV9XQVJOX09OX09OQ0UodmFsICZhbXA7IChCSVQoMykgLSAxKSk7CiYjNDM7CXJldHVybiB2YWwgfCBTV1BfVEJfUE9JTlRFUl9NQVJLOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgKnN3cF90Yl90b19wb2ludGVyKHVuc2lnbmVkIGxvbmcgc3dwX3RiKQomIzQzO3sKJiM0MzsJVk1fV0FSTl9PTighc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSk7CiYjNDM7CS8qIENsZWFyIHRoZSBsb3cgMy1iaXQgbWFya2VyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KJiM0MzsJcmV0dXJuICh2b2lkICopKHN3cF90YiAmYW1wOyB+KCh1bnNpZ25lZCBsb25nKShCSVQoMykgLSAxKSkpOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpCiB7CiAJVk1fV0FSTl9PTighc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKTsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IGE2MDJlNTgyMDUxM2E4Li4xODkyNWU0NjI1NzFiMSAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwZmlsZS5jCkBAIC05MzUsNyAmIzQzOzkzNSw4IEBAIHN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlucl9wYWdlcyA9IDEgJmx0OyZsdDsgb3JkZXI7CiAJCXN3YXBfY2x1c3Rlcl9hc3NlcnRfZW1wdHkoY2ksIGNpX29mZiwgbnJfcGFnZXMsIGZhbHNlKTsKIAkJX19zd2FwX2NhY2hlX2FkZF9mb2xpbyhjaSwgZm9saW8sIHN3cF9lbnRyeShzaS0mZ3Q7dHlwZSwKLQkJCQkJCQkgICAgY2lfb2ZmICYjNDM7IGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSkpKTsKJiM0MzsJCQkJCQkJICAgIGNpX29mZiAmIzQzOyBjbHVzdGVyX29mZnNldChzaSwgY2kpKSwKJiM0MzsJCQkJICAgICAgIE5VTEwpOwogCX0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfSElCRVJOQVRJT04pKSB7CiAJCW9yZGVyID0gMDsKIAkJbnJfcGFnZXMgPSAxOwpAQCAtMTUzNiwyNSAmIzQzOzE1MzcsNTEgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5KHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7Y2ktJmd0O2xvY2spOwogCXN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7CiYjNDM7CiYjNDM7CS8qIFBvaW50ZXIgZW50cmllcyBzdG9yZSBjb3VudCBpbiB0aGUgenN3YXBfZW50cnkgc3RydWN0ICovCiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7CiYjNDM7CQl6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHN3cF90YiwgY2ksIGNpX29mZik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAljb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChzd3BfdGIpOwogCiAJVk1fV0FSTl9PTl9PTkNFKGNvdW50ICZsdDs9IDApOwogCVZNX1dBUk5fT05fT05DRShjb3VudCAmZ3Q7IFNXUF9UQl9DT1VOVF9NQVgpOwotCi0JaWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHsKLQkJY291bnQgPSBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl07Ci0JCS8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi8KLQkJVk1fV0FSTl9PTl9PTkNFKGNvdW50ICZsdDsgU1dQX1RCX0NPVU5UX01BWCk7Ci0JCWNvdW50LS07Ci0JCWlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7Ci0JCQljaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwOwotCQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7CiYjNDM7CQlpZiAoY291bnQgPT0gU1dQX1RCX0NPVU5UX01BWCkgewomIzQzOwkJCWlmICghY2ktJmd0O2V4dGVuZF90YWJsZSkgewomIzQzOwkJCQkvKgomIzQzOwkJCQkgKiBNQVggd2l0aG91dCBleHRlbmRfdGFibGU6IE1BWCBpcyB0aGUgcmVhbAomIzQzOwkJCQkgKiBjb3VudC4gIERlY3JlbWVudCBhbmQgd3JpdGUgYmFjayBpbmxpbmUuCiYjNDM7CQkJCSAqLwomIzQzOwkJCQljb3VudC0tOwomIzQzOwkJCQlfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsCiYjNDM7CQkJCQlfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7CiYjNDM7CQkJfSBlbHNlIHsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogTUFYIHdpdGggZXh0ZW5kX3RhYmxlOiByZWFsIGNvdW50IGxpdmVzIGluCiYjNDM7CQkJCSAqIGNpLSZndDtleHRlbmRfdGFibGVbY2lfb2ZmXS4gIFB1bGwsIGRlY3JlbWVudAomIzQzOwkJCQkgKiBpdCwgYW5kIGVpdGhlciBtb3ZlIGl0IGJhY2sgaW5saW5lIChpZiBub3cKJiM0MzsJCQkJICogZml0cykgb3Igd3JpdGUgaXQgYmFjayB0byB0aGUgZXh0ZW5kIHRhYmxlLgomIzQzOwkJCQkgKi8KJiM0MzsJCQkJY291bnQgPSBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl07CiYjNDM7CQkJCS8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi8KJiM0MzsJCQkJVk1fV0FSTl9PTl9PTkNFKGNvdW50ICZsdDsgU1dQX1RCX0NPVU5UX01BWCk7CiYjNDM7CQkJCWNvdW50LS07CiYjNDM7CQkJCWlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7CiYjNDM7CQkJCQljaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwOwomIzQzOwkJCQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLAomIzQzOwkJCQkJCV9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgY291bnQpKTsKJiM0MzsJCQkJfSBlbHNlIHsKJiM0MzsJCQkJCWNpLSZndDtleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50OwomIzQzOwkJCQl9CiYjNDM7CQkJfQogCQl9IGVsc2UgewotCQkJY2ktJmd0O2V4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7CiYjNDM7CQkJLyogY291bnQgJmx0OyBNQVg6IHNpbXBsZSBpbmxpbmUgZGVjcmVtZW50ICovCiYjNDM7CQkJY291bnQtLTsKJiM0MzsJCQlfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsCiYjNDM7CQkJCV9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgY291bnQpKTsKIAkJfQotCX0gZWxzZSB7Ci0JCV9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgX19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCAtLWNvdW50KSk7Ci0JfQogCiAJLyoKIAkgKiBgU1dQX1RCX0NPVU5UX01BWCAtIDFgIHRyaWdnZXJzIGV4dGVuZCB0YWJsZSBhbGxvY2F0aW9uLiBJZiB0aGUKQEAgLTE1OTYsNyAmIzQzOzE2MjMsMTggQEAgc3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAljaV9lbmQgPSBjaV9vZmYgJiM0MzsgbnI7CiAJZG8gewogCQlzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpOwotCQlpZiAoc3dwX3RiX2dldF9jb3VudChzd3BfdGIpID09IDEpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5OwomIzQzOwkJICogaGFuZGxlIHRoZW0gYmVmb3JlIHN3cF90Yl9nZXRfY291bnQgKHdoaWNoIHJldHVybnMKJiM0MzsJCSAqIC1FSU5WQUwgZm9yIG5vbi1jb3VudGFibGUgdHlwZXMpLgomIzQzOwkJICovCiYjNDM7CQlpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkgewomIzQzOwkJCWlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgPT0gMSkgewomIzQzOwkJCQlpZiAoY2lfYmF0Y2ggPT0gLTEpCiYjNDM7CQkJCQljaV9iYXRjaCA9IGNpX29mZjsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJfSBlbHNlIGlmIChzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgPT0gMSkgewogCQkJLyogY291bnQgPT0gMSBhbmQgbm9uLWNhY2hlZCBzbG90cyB3aWxsIGJlIGJhdGNoIGZyZWVkLiAqLwogCQkJaWYgKCFzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSkgewogCQkJCWlmIChjaV9iYXRjaCA9PSAtMSkKQEAgLTE2NDcsNiAmIzQzOzE2ODUsMTEgQEAgc3RhdGljIGludCBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkvKiBCYWQgb3Igc3BlY2lhbCBzbG90cyBjYW4mIzM5O3QgYmUgaGFuZGxlZCAqLwogCWlmIChXQVJOX09OX09OQ0Uoc3dwX3RiX2lzX2JhZChzd3BfdGIpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CS8qIFBvaW50ZXIgZW50cmllcyBzdG9yZSBjb3VudCBpbiB0aGUgenN3YXBfZW50cnkgc3RydWN0ICovCiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKQomIzQzOwkJcmV0dXJuIHpzd2FwX3N3cF90Yl9kdXBfY291bnQoc3dwX3RiLCBjaSwgY2lfb2ZmKTsKJiM0MzsKIAljb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChzd3BfdGIpOwogCS8qIE11c3QgYmUgZWl0aGVyIGNhY2hlZCBvciBoYXZlIGEgY291bnQgYWxyZWFkeSAqLwogCWlmIChXQVJOX09OX09OQ0UoIWNvdW50ICZhbXA7JmFtcDsgIXN3cF90Yl9pc19mb2xpbyhzd3BfdGIpKSkKQEAgLTE5MjMsMTMgJiM0MzsxOTY2LDI2IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkJb2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTsKIAkJLyoKIAkJICogRnJlZWluZyBpcyBkb25lIGFmdGVyIHJlbGVhc2Ugb2YgdGhlIGxhc3Qgc3dhcCBjb3VudAotCQkgKiByZWYsIG9yIGFmdGVyIHN3YXAgY2FjaGUgaXMgZHJvcHBlZAomIzQzOwkJICogcmVmLCBvciBhZnRlciBzd2FwIGNhY2hlIGlzIGRyb3BwZWQuIEEgUG9pbnRlciBlbnRyeQomIzQzOwkJICogbWVhbnMgenN3YXAgaGFzIGEgY29tcHJlc3NlZCBjb3B5OyB0aGUgeGFycmF5IHN0aWxsCiYjNDM7CQkgKiBob2xkcyB0aGUgZW50cnkgYW5kIHpzd2FwX2ludmFsaWRhdGUgd2lsbCBmcmVlIGl0LgogCQkgKi8KLQkJVk1fV0FSTl9PTighc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpIHx8IF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpICZndDsgMSk7CiYjNDM7CQlpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkgewomIzQzOwkJCVZNX1dBUk5fT04oenN3YXBfc3dwX3RiX2dldF9jb3VudChvbGRfdGIpICZndDsgMSk7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBGcmVlIHRoZSB6c3dhcCBlbnRyeSBub3cgdW5kZXIgY2ktJmd0O2xvY2sgd2hpbGUKJiM0MzsJCQkgKiB0aGUgUG9pbnRlciBpcyBzdGlsbCBpbiB0aGUgc3dhcCB0YWJsZS4gIE9uY2UKJiM0MzsJCQkgKiB3ZSBudWxsIHRoZSBzbG90LCB0aGUgZW50cnkgd291bGQgYmUgbGVha2VkLgomIzQzOwkJCSAqLwomIzQzOwkJCXpzd2FwX2VudHJ5X2ZyZWUoc3dwX3RiX3RvX3BvaW50ZXIob2xkX3RiKSk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCVZNX1dBUk5fT04oIXN3cF90Yl9pc19zaGFkb3cob2xkX3RiKSB8fAomIzQzOwkJCQkgICBfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSAmZ3Q7IDEpOwomIzQzOwkJfQogCiAJCS8qIFJlc2V0dGluZyB0aGUgc2xvdCB0byBOVUxMIGFsc28gY2xlYXJzIHRoZSBpbmxpbmUgZmxhZ3MuICovCiAJCV9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgbnVsbF90b19zd3BfdGIoKSk7Ci0JCWlmICghU1dBUF9UQUJMRV9IQVNfWkVST0ZMQUcpCiYjNDM7CQlpZiAoIVNXQVBfVEFCTEVfSEFTX1pFUk9GTEFHICZhbXA7JmFtcDsgIXN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpCiAJCQlfX3N3YXBfdGFibGVfY2xlYXJfemVybyhjaSwgY2lfb2ZmKTsKIAogCQkvKgpAQCAtMTk2MSw4ICYjNDM7MjAxNywxMSBAQCBpbnQgX19zd2FwX2NvdW50KHN3cF9lbnRyeV90IGVudHJ5KQogewogCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBfX3N3YXBfZW50cnlfdG9fY2x1c3RlcihlbnRyeSk7CiAJdW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTsKIAotCXJldHVybiBzd3BfdGJfZ2V0X2NvdW50KF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpOwomIzQzOwlpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkKJiM0MzsJCXJldHVybiB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7CiYjNDM7CXJldHVybiBzd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7CiB9CiAKIC8qKgpAQCAtMTk4MCw2ICYjNDM7MjAzOSw4IEBAIGJvb2wgc3dhcF9lbnRyeV9zd2FwcGVkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3dwX2VudHJ5X3QgZW50cnkpCiAJc3dwX3RiID0gc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpOwogCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwogCiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKQomIzQzOwkJcmV0dXJuIHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSAmZ3Q7IDA7CiAJcmV0dXJuIHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSAmZ3Q7IDA7CiB9CiAKQEAgLTIwMjAsNyAmIzQzOzIwODEsNyBAQCBpbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSkKICAqCiAgKiBDb250ZXh0OiBDYWxsZXIgbXVzdCBlbnN1cmUgdGhlIGZvbGlvIGlzIGxvY2tlZCBhbmQgaW4gdGhlIHN3YXAgY2FjaGUuCiAgKi8KLXN0YXRpYyBib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbykKJiM0Mztib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbykKIHsKIAlzd3BfZW50cnlfdCBlbnRyeSA9IGZvbGlvLSZndDtzd2FwOwogCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7CkBAIC0yNTU2LDggJiM0MzsyNjE3LDEyIEBAIHN0YXRpYyBpbnQgdW51c2VfcHRlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQlpZiAoIWZvbGlvKSB7CiAJCQlzd3BfdGIgPSBzd2FwX3RhYmxlX2dldChfX3N3YXBfZW50cnlfdG9fY2x1c3RlcihlbnRyeSksCiAJCQkJCQlzd3BfY2x1c3Rlcl9vZmZzZXQoZW50cnkpKTsKLQkJCWlmIChzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgJmx0Oz0gMCkKJiM0MzsJCQlpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkgewomIzQzOwkJCQlpZiAoenN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpICZsdDs9IDApCiYjNDM7CQkJCQljb250aW51ZTsKJiM0MzsJCQl9IGVsc2UgaWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSAmbHQ7PSAwKSB7CiAJCQkJY29udGludWU7CiYjNDM7CQkJfQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApkaWZmIC0tZ2l0IGEvbW0venN3YXAuYyBiL21tL3pzd2FwLmMKaW5kZXggNzYxY2Q2OTllMGEzZTYuLmY5NzYyZDBhNTk2YWI0IDEwMDY0NAotLS0gYS9tbS96c3dhcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3pzd2FwLmMKQEAgLTM4LDYgJiM0MzszOCw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvenNtYWxsb2MuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtzd2FwLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7c3dhcF90YWJsZS5oJiMzNDsKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4Miw2ICYjNDM7MTgzLDEwIEBAIHN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKnpzd2FwX3Nocmlua2VyOwogICogICAgICAgICAgICAgIHdyaXRlYmFjayBsb2dpYy4gVGhlIGVudHJ5IGlzIG9ubHkgcmVjbGFpbWVkIGJ5IHRoZSB3cml0ZWJhY2sKICAqICAgICAgICAgICAgICBsb2dpYyBpZiByZWZlcmVuY2VkIGlzIHVuc2V0LiBTZWUgY29tbWVudHMgaW4gdGhlIHNocmlua2VyCiAgKiAgICAgICAgICAgICAgc2VjdGlvbiBmb3IgY29udGV4dC4KJiM0MzsgKiBzd3BfdGJfdmFsIC0gdGhlIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgc2F2ZWQgd2hlbiB0aGlzIHpzd2FwX2VudHJ5CiYjNDM7ICogICAgICAgICAgICAgIHJlcGxhY2VkIGEgU2hhZG93IG9yIFBGTiBlbnRyeS4gSXQgcHJlc2VydmVzIHRoZSBzd2FwIGNvdW50LAomIzQzOyAqICAgICAgICAgICAgICB6ZXJvIGZsYWcsIGFuZCB3b3JraW5nIHNldCBzaGFkb3cgaW5mb3JtYXRpb24gKFNIQURPV19WQUwpCiYjNDM7ICogICAgICAgICAgICAgIHRoYXQgdGhlIFNoYWRvdyBlbnRyeSBjYXJyaWVkLgogICogcG9vbCAtIHRoZSB6c3dhcF9wb29sIHRoZSBlbnRyeSYjMzk7cyBkYXRhIGlzIGluCiAgKiBoYW5kbGUgLSB6c21hbGxvYyBhbGxvY2F0aW9uIGhhbmRsZSB0aGF0IHN0b3JlcyB0aGUgY29tcHJlc3NlZCBwYWdlIGRhdGEKICAqIG9iamNnIC0gdGhlIG9ial9jZ3JvdXAgdGhhdCB0aGUgY29tcHJlc3NlZCBtZW1vcnkgaXMgY2hhcmdlZCB0bwpAQCAtMTkxLDE1ICYjNDM7MTk2LDEzIEBAIHN0cnVjdCB6c3dhcF9lbnRyeSB7CiAJc3dwX2VudHJ5X3Qgc3dwZW50cnk7CiAJdW5zaWduZWQgaW50IGxlbmd0aDsKIAlib29sIHJlZmVyZW5jZWQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3dwX3RiX3ZhbDsKIAlzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbDsKIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsKIAlzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2c7CiAJc3RydWN0IGxpc3RfaGVhZCBscnU7CiB9OwogCi1zdGF0aWMgc3RydWN0IHhhcnJheSAqenN3YXBfdHJlZXNbTUFYX1NXQVBGSUxFU107Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5yX3pzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdOwotCiAvKiBSQ1UtcHJvdGVjdGVkIGl0ZXJhdGlvbiAqLwogc3RhdGljIExJU1RfSEVBRCh6c3dhcF9wb29scyk7CiAvKiBwcm90ZWN0cyB6c3dhcF9wb29scyBsaXN0IG1vZGlmaWNhdGlvbiAqLwpAQCAtMjI1LDE1ICYjNDM7MjI4LDYgQEAgc3RhdGljIGJvb2wgenN3YXBfaGFzX3Bvb2w7CiAqIGhlbHBlcnMgYW5kIGZ3ZCBkZWNsYXJhdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE9uZSBzd2FwIGFkZHJlc3Mgc3BhY2UgZm9yIGVhY2ggNjRNIHN3YXAgc3BhY2UgKi8KLSNkZWZpbmUgWlNXQVBfQUREUkVTU19TUEFDRV9TSElGVCAxNAotI2RlZmluZSBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTICgxICZsdDsmbHQ7IFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQpCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB4YXJyYXkgKnN3YXBfenN3YXBfdHJlZShzd3BfZW50cnlfdCBzd3ApCi17Ci0JcmV0dXJuICZhbXA7enN3YXBfdHJlZXNbc3dwX3R5cGUoc3dwKV1bc3dwX29mZnNldChzd3ApCi0JCSZndDsmZ3Q7IFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlRdOwotfQotCiAjZGVmaW5lIHpzd2FwX3Bvb2xfZGVidWcobXNnLCBwKQkJCVwKIAlwcl9kZWJ1ZygmIzM0OyVzIHBvb2wgJXNcbiYjMzQ7LCBtc2csIChwKS0mZ3Q7dGZtX25hbWUpCiAKQEAgLTc2Miw3ICYjNDM7NzU2LDcgQEAgc3RhdGljIHZvaWQgenN3YXBfZW50cnlfY2FjaGVfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KQogICogQ2FycmllcyBvdXQgdGhlIGNvbW1vbiBwYXR0ZXJuIG9mIGZyZWVpbmcgYW4gZW50cnkmIzM5O3MgenNtYWxsb2MgYWxsb2NhdGlvbiwKICAqIGZyZWVpbmcgdGhlIGVudHJ5IGl0c2VsZiwgYW5kIGRlY3JlbWVudGluZyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBwYWdlcy4KICAqLwotc3RhdGljIHZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KQomIzQzO3ZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KQogewogCXpzd2FwX2xydV9kZWwoJmFtcDt6c3dhcF9saXN0X2xydSwgZW50cnkpOwogCXpzX2ZyZWUoZW50cnktJmd0O3Bvb2wtJmd0O3pzX3Bvb2wsIGVudHJ5LSZndDtoYW5kbGUpOwpAQCAtOTg3LDExICYjNDM7OTgxLDEyIEBAIHN0YXRpYyBib29sIHpzd2FwX2RlY29tcHJlc3Moc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbykKIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksCiAJCQkJIHN3cF9lbnRyeV90IHN3cGVudHJ5KQogewotCXN0cnVjdCB4YXJyYXkgKnRyZWU7CiAJcGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cGVudHJ5KTsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvOwogCXN0cnVjdCBtZW1wb2xpY3kgKm1wb2w7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwomIzQzOwl1bnNpZ25lZCBsb25nIHN3cF90YjsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIHRyeSB0byBhbGxvY2F0ZSBzd2FwIGNhY2hlIGZvbGlvICovCkBAIC05OTksOSAmIzQzOzk5NCwyNSBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LAogCWlmICghc2kpCiAJCXJldHVybiAtRUVYSVNUOwogCiYjNDM7CS8qCiYjNDM7CSAqIFZlcmlmeSB0aGUgc3dhcCB0YWJsZSBQb2ludGVyIGVudHJ5IHN0aWxsIHJlZmVyZW5jZXMgdGhpcwomIzQzOwkgKiB6c3dhcF9lbnRyeS4gSWYgdGhlIGVudHJ5IHdhcyBpbnZhbGlkYXRlZCBvciByZXBsYWNlZCBieSBhCiYjNDM7CSAqIGNvbmN1cnJlbnQgc3RvcmUsIHRoZSBQb2ludGVyIHdpbGwgYmUgZ29uZSBvciBwb2ludCBlbHNld2hlcmUuCiYjNDM7CSAqLwomIzQzOwljaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgb2Zmc2V0KTsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7Y2ktJmd0O2xvY2spOwomIzQzOwlzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTsKJiM0MzsJaWYgKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpIHx8CiYjNDM7CSAgICBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpICE9IGVudHJ5KSB7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsJCXB1dF9zd2FwX2RldmljZShzaSk7CiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJfQomIzQzOwlzcGluX3VubG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsKIAltcG9sID0gZ2V0X3Rhc2tfcG9saWN5KGN1cnJlbnQpOwogCWZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLAotCQkJCSAgICAgICBOT19JTlRFUkxFQVZFX0lOREVYKTsKJiM0MzsJCQkJICAgICAgIE5PX0lOVEVSTEVBVkVfSU5ERVgsIE5VTEwpOwogCXB1dF9zd2FwX2RldmljZShzaSk7CiAKIAkvKgpAQCAtMTAxNSwyNyAmIzQzOzEwMjYsMTUgQEAgc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwKIAkJcmV0dXJuIFBUUl9FUlIoZm9saW8pOwogCiAJLyoKLQkgKiBmb2xpbyBpcyBsb2NrZWQsIGFuZCB0aGUgc3dhcGNhY2hlIGlzIG5vdyBzZWN1cmVkIGFnYWluc3QKLQkgKiBjb25jdXJyZW50IHN3YXBwaW5nIHRvIGFuZCBmcm9tIHRoZSBzbG90LCBhbmQgY29uY3VycmVudAotCSAqIHN3YXBvZmYgc28gd2UgY2FuIHNhZmVseSBkZXJlZmVyZW5jZSB0aGUgenN3YXAgdHJlZSBoZXJlLgotCSAqIFZlcmlmeSB0aGF0IHRoZSBzd2FwIGVudHJ5IGhhc24mIzM5O3QgYmVlbiBpbnZhbGlkYXRlZCBhbmQgcmVjeWNsZWQKLQkgKiBiZWhpbmQgb3VyIGJhY2tzLCB0byBhdm9pZCBvdmVyd3JpdGluZyBhIG5ldyBzd2FwIGZvbGlvIHdpdGgKLQkgKiBvbGQgY29tcHJlc3NlZCBkYXRhLiBPbmx5IHdoZW4gdGhpcyBpcyBzdWNjZXNzZnVsIGNhbiB0aGUgZW50cnkKLQkgKiBiZSBkZXJlZmVyZW5jZWQuCiYjNDM7CSAqIFRoZSBmb2xpbyBpcyBub3cgbG9ja2VkIGFuZCBpbiBzd2FwIGNhY2hlLCBzbyBjb25jdXJyZW50CiYjNDM7CSAqIHN0b3JlcyBhcmUgYmxvY2tlZC4gX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyBhbHJlYWR5CiYjNDM7CSAqIG92ZXJ3cm90ZSB0aGUgUG9pbnRlciBlbnRyeSB3aXRoIGEgUEZOLgogCSAqLwotCXRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwZW50cnkpOwotCWlmIChlbnRyeSAhPSB4YV9sb2FkKHRyZWUsIG9mZnNldCkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJaWYgKCF6c3dhcF9kZWNvbXByZXNzKGVudHJ5LCBmb2xpbykpIHsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCi0JeGFfZXJhc2UodHJlZSwgb2Zmc2V0KTsKLQogCWNvdW50X3ZtX2V2ZW50KFpTV1BXQik7CiAJaWYgKGVudHJ5LSZndDtvYmpjZykKIAkJY291bnRfb2JqY2dfZXZlbnRzKGVudHJ5LSZndDtvYmpjZywgWlNXUFdCLCAxKTsKQEAgLTExMDUsMzYgJiM0MzsxMTA0LDIyIEBAIHN0YXRpYyBlbnVtIGxydV9zdGF0dXMgc2hyaW5rX21lbWNnX2NiKHN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sIHN0cnVjdCBsaXN0X2xydV9vCiAJfQogCiAJLyoKLQkgKiBBcyBzb29uIGFzIHdlIGRyb3AgdGhlIExSVSBsb2NrLCB0aGUgZW50cnkgY2FuIGJlIGZyZWVkIGJ5Ci0JICogYSBjb25jdXJyZW50IGludmFsaWRhdGlvbi4gVGhpcyBtZWFucyB0aGUgZm9sbG93aW5nOgotCSAqCi0JICogMS4gV2UgZXh0cmFjdCB0aGUgc3dwX2VudHJ5X3QgdG8gdGhlIHN0YWNrLCBhbGxvd2luZwotCSAqICAgIHpzd2FwX3dyaXRlYmFja19lbnRyeSgpIHRvIHBpbiB0aGUgc3dhcCBlbnRyeSBhbmQKLQkgKiAgICB0aGVuIHZhbGlkYXRlIHRoZSB6c3dhcCBlbnRyeSBhZ2FpbnN0IHRoYXQgc3dhcCBlbnRyeSYjMzk7cwotCSAqICAgIHRyZWUgdXNpbmcgcG9pbnRlciB2YWx1ZSBjb21wYXJpc29uLiBPbmx5IHdoZW4gdGhhdAotCSAqICAgIGlzIHN1Y2Nlc3NmdWwgY2FuIHRoZSBlbnRyeSBiZSBkZXJlZmVyZW5jZWQuCi0JICoKLQkgKiAyLiBVc3VhbGx5LCBvYmplY3RzIGFyZSB0YWtlbiBvZmYgdGhlIExSVSBmb3IgcmVjbGFpbS4gSW4KLQkgKiAgICB0aGlzIGNhc2UgdGhpcyBpc24mIzM5O3QgcG9zc2libGUsIGJlY2F1c2UgaWYgcmVjbGFpbSBmYWlscwotCSAqICAgIGZvciB3aGF0ZXZlciByZWFzb24sIHdlIGhhdmUgbm8gbWVhbnMgb2Yga25vd2luZyBpZiB0aGUKLQkgKiAgICBlbnRyeSBpcyBhbGl2ZSB0byBwdXQgaXQgYmFjayBvbiB0aGUgTFJVLgomIzQzOwkgKiBBZnRlciB3ZSBkcm9wIHRoZSBMUlUgbG9jaywgdGhlIGVudHJ5IG1heSBiZSBmcmVlZCBieSBhCiYjNDM7CSAqIGNvbmN1cnJlbnQgc3dhcCBzbG90IGZyZWUuICBUaGlzIGlzIHNhZmUgYmVjYXVzZQomIzQzOwkgKiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSByZWNoZWNrcyB0aGUgc3dhcCB0YWJsZSB1bmRlcgomIzQzOwkgKiBjaS0mZ3Q7bG9jayBiZWZvcmUgZGVyZWZlcmVuY2luZyBlbnRyeTsgaWYgdGhlIFBvaW50ZXIgaXMKJiM0MzsJICogZ29uZSBpdCBiYWlscyBvdXQuCiAJICoKLQkgKiAgICBTbyByb3RhdGUgaXQgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrLiBJZiB0aGUgZW50cnkgaXMKLQkgKiAgICB3cml0dGVuIGJhY2sgb3IgaW52YWxpZGF0ZWQsIHRoZSBmcmVlIHBhdGggd2lsbCB1bmxpbmsKLQkgKiAgICBpdC4gRm9yIGZhaWx1cmVzLCByb3RhdGlvbiBpcyB0aGUgcmlnaHQgdGhpbmcgYXMgd2VsbC4KLQkgKgotCSAqICAgIFRlbXBvcmFyeSBmYWlsdXJlcywgd2hlcmUgdGhlIHNhbWUgZW50cnkgc2hvdWxkIGJlIHRyaWVkCi0JICogICAgYWdhaW4gaW1tZWRpYXRlbHksIGFsbW9zdCBuZXZlciBoYXBwZW4gZm9yIHRoaXMgc2hyaW5rZXIuCi0JICogICAgV2UgZG9uJiMzOTt0IGRvIGFueSB0cnlsb2NraW5nOyAtRU5PTUVNIGNvbWVzIGNsb3Nlc3QsCi0JICogICAgYnV0IHRoYXQmIzM5O3MgZXh0cmVtZWx5IHJhcmUgYW5kIGRvZXNuJiMzOTt0IGhhcHBlbiBzcHVyaW91c2x5Ci0JICogICAgZWl0aGVyLiBEb24mIzM5O3QgYm90aGVyIGRpc3Rpbmd1aXNoaW5nIHRoaXMgY2FzZS4KJiM0MzsJICogUm90YXRlIHRoZSBlbnRyeSBiZWZvcmUgZHJvcHBpbmcgdGhlIGxvY2s6IGlmIGl0IGdldHMKJiM0MzsJICogd3JpdHRlbiBiYWNrIG9yIGludmFsaWRhdGVkIHRoZSBmcmVlIHBhdGggd2lsbCB1bmxpbmsKJiM0MzsJICogaXQgZnJvbSB0aGUgTFJVLiAgRm9yIGZhaWx1cmVzIHJvdGF0aW9uIGlzIGZpbmUuCiAJICovCiAJbGlzdF9tb3ZlX3RhaWwoaXRlbSwgJmFtcDtsLSZndDtsaXN0KTsKIAogCS8qCi0JICogT25jZSB0aGUgbHJ1IGxvY2sgaXMgZHJvcHBlZCwgdGhlIGVudHJ5IG1pZ2h0IGdldCBmcmVlZC4gVGhlCi0JICogc3dwZW50cnkgaXMgY29waWVkIHRvIHRoZSBzdGFjaywgYW5kIGVudHJ5IGlzbiYjMzk7dCBkZXJlZiYjMzk7ZCBhZ2FpbgotCSAqIHVudGlsIHRoZSBlbnRyeSBpcyB2ZXJpZmllZCB0byBzdGlsbCBiZSBhbGl2ZSBpbiB0aGUgdHJlZS4KJiM0MzsJICogVGhlIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2sgc28gd2UgY2FuIHBpbiB0aGUgc3dhcAomIzQzOwkgKiBkZXZpY2UgYW5kIHZhbGlkYXRlIHRoZSBlbnRyeSYjMzk7cyBzd2FwIHRhYmxlIFBvaW50ZXIgdW5kZXIKJiM0MzsJICogY2ktJmd0O2xvY2sgaW4genN3YXBfd3JpdGViYWNrX2VudHJ5KCkuCiAJICovCiAJc3dwZW50cnkgPSBlbnRyeS0mZ3Q7c3dwZW50cnk7CiAKQEAgLTEzOTgsNyAmIzQzOzEzODMsMTEgQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCSAgICAgc3RydWN0IHpzd2FwX3Bvb2wgKnBvb2wpCiB7CiAJc3dwX2VudHJ5X3QgcGFnZV9zd3BlbnRyeSA9IHBhZ2Vfc3dhcF9lbnRyeShwYWdlKTsKLQlzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCAqb2xkOwomIzQzOwlzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCAqb2xkID0gTlVMTDsKJiM0MzsJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwomIzQzOwlwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQocGFnZV9zd3BlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3dwX3RiOwogCiAJLyogYWxsb2NhdGUgZW50cnkgKi8KIAllbnRyeSA9IHpzd2FwX2VudHJ5X2NhY2hlX2FsbG9jKEdGUF9LRVJORUwsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKQEAgLTE0MTAsMzEgJiM0MzsxMzk5LDQ5IEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCiAJaWYgKCF6c3dhcF9jb21wcmVzcyhwYWdlLCBlbnRyeSwgcG9vbCkpCiAJCWdvdG8gY29tcHJlc3NfZmFpbGVkOwogCi0Jb2xkID0geGFfc3RvcmUoc3dhcF96c3dhcF90cmVlKHBhZ2Vfc3dwZW50cnkpLAotCQkgICAgICAgc3dwX29mZnNldChwYWdlX3N3cGVudHJ5KSwKLQkJICAgICAgIGVudHJ5LCBHRlBfS0VSTkVMKTsKLQlpZiAoeGFfaXNfZXJyKG9sZCkpIHsKLQkJaW50IGVyciA9IHhhX2VycihvbGQpOwotCi0JCVdBUk5fT05DRShlcnIgIT0gLUVOT01FTSwgJiMzNDt1bmV4cGVjdGVkIHhhcnJheSBlcnJvcjogJWRcbiYjMzQ7LCBlcnIpOwotCQl6c3dhcF9yZWplY3RfYWxsb2NfZmFpbCYjNDM7JiM0Mzs7Ci0JCWdvdG8gc3RvcmVfZmFpbGVkOwomIzQzOwkvKgomIzQzOwkgKiBTdG9yZSB0aGUgenN3YXBfZW50cnkgcG9pbnRlciBpbiB0aGUgc3dhcCB0YWJsZSBhcyBhCiYjNDM7CSAqIFBvaW50ZXItdHlwZSBlbnRyeSwgcmVwbGFjaW5nIHRoZSBQRk4gb3IgU2hhZG93IGVudHJ5LgomIzQzOwkgKiBUaGUgZnVsbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlIChpbmNsdWRpbmcgd29ya2luZyBzZXQKJiM0MzsJICogc2hhZG93KSBpcyBwcmVzZXJ2ZWQgaW4gZW50cnktJmd0O3N3cF90Yl92YWwuCiYjNDM7CSAqIEZvbGlvIGxvY2sgc2VyaWFsaXplcyBjb25jdXJyZW50IHN0b3Jlcy4KJiM0MzsJICovCiYjNDM7CXNpID0gX19zd2FwX2VudHJ5X3RvX2luZm8ocGFnZV9zd3BlbnRyeSk7CiYjNDM7CWNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpOwomIzQzOwlzcGluX2xvY2soJmFtcDtjaS0mZ3Q7bG9jayk7CiYjNDM7CXN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpOwomIzQzOwlpZiAoc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKSB7CiYjNDM7CQkvKgomIzQzOwkJICogU2F2ZSB0aGUgY29tcGxldGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZQomIzQzOwkJICogKFNoYWRvdyBvciBQRk4pLCBwcmVzZXJ2aW5nIHN3YXAgY291bnQsIHplcm8gZmxhZywKJiM0MzsJCSAqIGFuZCB3b3JraW5nIHNldCBzaGFkb3cgaW5mb3JtYXRpb24uCiYjNDM7CQkgKi8KJiM0MzsJCWVudHJ5LSZndDtzd3BfdGJfdmFsID0gc3dwX3RiOwomIzQzOwl9IGVsc2UgaWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBSZXBsYWNpbmcgYW4gZXhpc3RpbmcgUG9pbnRlciBlbnRyeSAoZS5nLiBmcm9tIGEKJiM0MzsJCSAqIHJlZGlydGllZCBmb2xpbykuIEluaGVyaXQgdGhlIHNhdmVkIHN3YXAgdGFibGUgdmFsdWUuCiYjNDM7CQkgKi8KJiM0MzsJCW9sZCA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7CiYjNDM7CQllbnRyeS0mZ3Q7c3dwX3RiX3ZhbCA9IG9sZC0mZ3Q7c3dwX3RiX3ZhbDsKIAl9Ci0KJiM0MzsJX19zd2FwX3RhYmxlX3NldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUiwKJiM0MzsJCQkgcG9pbnRlcl90b19zd3BfdGIoZW50cnkpKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtjaS0mZ3Q7bG9jayk7CiAJLyoKLQkgKiBXZSBtYXkgaGF2ZSBoYWQgYW4gZXhpc3RpbmcgZW50cnkgdGhhdCBiZWNhbWUgc3RhbGUgd2hlbgotCSAqIHRoZSBmb2xpbyB3YXMgcmVkaXJ0aWVkIGFuZCBub3cgdGhlIG5ldyB2ZXJzaW9uIGlzIGJlaW5nCi0JICogc3dhcHBlZCBvdXQuIEdldCByaWQgb2YgdGhlIG9sZC4KJiM0MzsJICogSWYgd2UgaGFkIGFuIGV4aXN0aW5nIHpzd2FwIGVudHJ5IGZyb20gdGhlIHN3YXAgdGFibGUKJiM0MzsJICogKGUuZy4gZnJvbSBhIHByZXZpb3VzIHJlZGlydGllZCBmb2xpbyksIGdldCByaWQgb2YgaXQKJiM0MzsJICogb3V0c2lkZSB0aGUgbG9jay4KIAkgKi8KIAlpZiAob2xkKQogCQl6c3dhcF9lbnRyeV9mcmVlKG9sZCk7CiAKIAkvKgotCSAqIFRoZSBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIHRoZSB0cmVlLCB0aGVyZSBpcwotCSAqIG5vIGZ1cnRoZXIgcG9zc2liaWxpdHkgb2YgZmFpbHVyZS4gR3JhYiByZWZzIHRvIHRoZSBwb29sIGFuZCBvYmpjZywKLQkgKiBjaGFyZ2UgenN3YXAgbWVtb3J5LCBhbmQgaW5jcmVtZW50IHpzd2FwX3N0b3JlZF9wYWdlcy4KJiM0MzsJICogVGhlIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4gdGhlIHN3YXAgdGFibGUsCiYjNDM7CSAqIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcG9zc2liaWxpdHkgb2YgZmFpbHVyZS4gR3JhYiByZWZzIHRvIHRoZSBwb29sCiYjNDM7CSAqIGFuZCBvYmpjZywgY2hhcmdlIHpzd2FwIG1lbW9yeSwgYW5kIGluY3JlbWVudCB6c3dhcF9zdG9yZWRfcGFnZXMuCiAJICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpCi0JICogd2hlbiB0aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgomIzQzOwkgKiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHN3YXAgdGFibGUuCiAJICovCiAJenN3YXBfcG9vbF9nZXQocG9vbCk7CiAJaWYgKG9iamNnKSB7CkBAIC0xNDQ2LDggJiM0MzsxNDUzLDggQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJYXRvbWljX2xvbmdfaW5jKCZhbXA7enN3YXBfc3RvcmVkX2luY29tcHJlc3NpYmxlX3BhZ2VzKTsKIAogCS8qCi0JICogV2UgZmluaXNoIGluaXRpYWxpemluZyB0aGUgZW50cnkgd2hpbGUgaXQmIzM5O3MgYWxyZWFkeSBpbiB4YXJyYXkuCi0JICogVGhpcyBpcyBzYWZlIGJlY2F1c2U6CiYjNDM7CSAqIFdlIGZpbmlzaCBpbml0aWFsaXppbmcgdGhlIGVudHJ5IHdoaWxlIGl0JiMzOTtzIGFscmVhZHkgaW4gdGhlCiYjNDM7CSAqIHN3YXAgdGFibGUuIFRoaXMgaXMgc2FmZSBiZWNhdXNlOgogCSAqCiAJICogMS4gQ29uY3VycmVudCBzdG9yZXMgYW5kIGludmFsaWRhdGlvbnMgYXJlIGV4Y2x1ZGVkIGJ5IGZvbGlvIGxvY2suCiAJICoKQEAgLTE0NjYsOCAmIzQzOzE0NzMsNiBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLAogCiAJcmV0dXJuIHRydWU7CiAKLXN0b3JlX2ZhaWxlZDoKLQl6c19mcmVlKHBvb2wtJmd0O3pzX3Bvb2wsIGVudHJ5LSZndDtoYW5kbGUpOwogY29tcHJlc3NfZmFpbGVkOgogCXpzd2FwX2VudHJ5X2NhY2hlX2ZyZWUoZW50cnkpOwogCXJldHVybiBmYWxzZTsKQEAgLTE1NDYsMTEgJiM0MzsxNTUxLDMxIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIAkJdW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7CiAJCXBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApOwogCQlzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5OwotCQlzdHJ1Y3QgeGFycmF5ICp0cmVlOwomIzQzOwkJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTsKJiM0MzsJCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXM7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHN3cF90YjsKIAomIzQzOwkJc2lzID0gX19zd2FwX3R5cGVfdG9faW5mbyh0eXBlKTsKIAkJZm9yIChpbmRleCA9IDA7IGluZGV4ICZsdDsgbnJfcGFnZXM7ICYjNDM7JiM0MztpbmRleCkgewotCQkJdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7Ci0JCQllbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCAmIzQzOyBpbmRleCk7CiYjNDM7CQkJY2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2lzLCBvZmZzZXQgJiM0MzsgaW5kZXgpOwomIzQzOwkJCXNwaW5fbG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsJCQlzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCAob2Zmc2V0ICYjNDM7IGluZGV4KSAlIFNXQVBGSUxFX0NMVVNURVIpOwomIzQzOwkJCWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7CiYjNDM7CQkJCWVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeQomIzQzOwkJCQkgKiAoU2hhZG93IG9yIFBGTikgdGhhdCB3YXMgc2F2ZWQgd2hlbiB0aGUKJiM0MzsJCQkJICogUG9pbnRlciBlbnRyeSB3YXMgY3JlYXRlZCwgcmF0aGVyIHRoYW4KJiM0MzsJCQkJICogemVyb2luZyB0aGUgc2xvdC4gIFRoaXMgcHJlc2VydmVzIHRoZSBzd2FwCiYjNDM7CQkJCSAqIGNvdW50IGFuZCBmbGFncyBzbyB0aGUgc3dhcCBjYWNoZSBmb2xpbwomIzQzOwkJCQkgKiBjYW4gYmUgY29ycmVjdGx5IGNsZWFuZWQgdXAgbGF0ZXIuCiYjNDM7CQkJCSAqLwomIzQzOwkJCQlfX3N3YXBfdGFibGVfc2V0KGNpLCAob2Zmc2V0ICYjNDM7IGluZGV4KSAlIFNXQVBGSUxFX0NMVVNURVIsCiYjNDM7CQkJCQkJIGVudHJ5LSZndDtzd3BfdGJfdmFsKTsKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQllbnRyeSA9IE5VTEw7CiYjNDM7CQkJfQomIzQzOwkJCXNwaW5fdW5sb2NrKCZhbXA7Y2ktJmd0O2xvY2spOwogCQkJaWYgKGVudHJ5KQogCQkJCXpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpOwogCQl9CkBAIC0xNTYyLDYgJiM0MzsxNTg3LDExIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIC8qKgogICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXAKICAqIEBmb2xpbzogZm9saW8gdG8gbG9hZAomIzQzOyAqIEB6ZW50cnk6IHpzd2FwX2VudHJ5IHBvaW50ZXIgZXh0cmFjdGVkIGZyb20gc3dhcCB0YWJsZSwgb3IgTlVMTAomIzQzOyAqCiYjNDM7ICogVGhlIHpzd2FwX2VudHJ5IHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgc3dhcCB0YWJsZSBQb2ludGVyIGVudHJ5IGJ5CiYjNDM7ICogX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyBiZWZvcmUgaXQgb3Zlcndyb3RlIHRoZSBlbnRyeSB3aXRoIGEgUEZOLgomIzQzOyAqIElmIEB6ZW50cnkgaXMgTlVMTCwgdGhlIHNsb3Qgd2FzIG5vdCBiYWNrZWQgYnkgenN3YXAuCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lCiAgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOgpAQCAtMTU3OSwxMiAmIzQzOzE2MDksOSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAgKiAgLUVOT0VOVDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIG5vdCBpbiB6c3dhcC4gVGhlIGZvbGlvIHJlbWFpbnMKICAqICBsb2NrZWQgb24gcmV0dXJuLgogICovCi1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQomIzQzO2ludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHZvaWQgKnplbnRyeSkKIHsKLQlzd3BfZW50cnlfdCBzd3AgPSBmb2xpby0mZ3Q7c3dhcDsKLQlwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTsKLQlzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cCk7Ci0Jc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTsKJiM0MzsJc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHplbnRyeTsKIAogCVZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTsKIAlWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7CkBAIC0xNjAyLDcgJiM0MzsxNjI5LDYgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTE2MjUsNyAmIzQzOzE2NTEsNiBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCSAqIGNvbXByZXNzaW9uIHdvcmsuCiAJICovCiAJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7Ci0JeGFfZXJhc2UodHJlZSwgb2Zmc2V0KTsKIAl6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTsKIAogCWZvbGlvX3VubG9jayhmb2xpbyk7CkBAIC0xNjM1LDUyICYjNDM7MTY2MCwxNTkgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbykKIHZvaWQgenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnlfdCBzd3ApCiB7CiAJcGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7Ci0Jc3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3dwX3RiOwogCXN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7CiAKLQlpZiAoeGFfZW1wdHkodHJlZSkpCiYjNDM7CXNpID0gX19zd2FwX3R5cGVfdG9faW5mbyhzd3BfdHlwZShzd3ApKTsKJiM0MzsJY2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2ksIG9mZnNldCk7CiYjNDM7CS8qCiYjNDM7CSAqIERvIGEgbG9ja2xlc3MgcGVlayBmaXJzdC4gIElmIGNpLSZndDtsb2NrIGlzIGFscmVhZHkgaGVsZCBieQomIzQzOwkgKiB0aGUgY2FsbGVyIChlLmcuIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyksIGFuZCB0aGUKJiM0MzsJICogUG9pbnRlciBoYXMgYWxyZWFkeSBiZWVuIGNsZWFyZWQsIHdlIGNhbiBiYWlsIG91dCB3aXRob3V0CiYjNDM7CSAqIHNlbGYtZGVhZGxvY2tpbmcuCiYjNDM7CSAqLwomIzQzOwlzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTsKJiM0MzsJaWYgKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKQogCQlyZXR1cm47CiAKLQllbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsJc3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7CiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7CiYjNDM7CQllbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7CiYjNDM7CQkvKgomIzQzOwkJICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSAoU2hhZG93IG9yIFBGTikKJiM0MzsJCSAqIHRoYXQgd2FzIHNhdmVkIGluIHN3cF90Yl92YWwgd2hlbiB0aGUgUG9pbnRlciBlbnRyeQomIzQzOwkJICogd2FzIGNyZWF0ZWQuICBUaGlzIHByZXNlcnZlcyBzd2FwIGNvdW50IGFuZCBmbGFncwomIzQzOwkJICogZm9yIHRoZSBzdWJzZXF1ZW50IHNsb3QtZnJlZSBwYXRoLgomIzQzOwkJICovCiYjNDM7CQlfX3N3YXBfdGFibGVfc2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSLAomIzQzOwkJCQkgZW50cnktJmd0O3N3cF90Yl92YWwpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJZW50cnkgPSBOVUxMOwomIzQzOwl9CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7Y2ktJmd0O2xvY2spOwomIzQzOwogCWlmIChlbnRyeSkKIAkJenN3YXBfZW50cnlfZnJlZShlbnRyeSk7CiB9CiAKLWludCB6c3dhcF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiYjNDM7LyoKJiM0MzsgKiBFeHRyYWN0IHRoZSB3b3JraW5nIHNldCBzaGFkb3cgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LgomIzQzOyAqIFRoZSBzaGFkb3cgaXMgcmVjb3ZlcmVkIGZyb20genN3YXBfZW50cnktJmd0O3N3cF90Yl92YWwgd2hpY2ggcHJlc2VydmVzCiYjNDM7ICogdGhlIG9yaWdpbmFsIFNoYWRvdyBlbnRyeSB2YWx1ZS4gVGhlIHNoYWRvdyBjYW4gdGhlbiBiZSB1c2VkIGJ5CiYjNDM7ICogd29ya2luZ3NldF9yZWZhdWx0KCkgZm9yIHJlZmF1bHQgZGlzdGFuY2UgY2FsY3VsYXRpb24uCiYjNDM7ICovCiYjNDM7dm9pZCAqenN3YXBfc3dwX3RiX2dldF9zaGFkb3codW5zaWduZWQgbG9uZyBzd3BfdGIpCiB7Ci0Jc3RydWN0IHhhcnJheSAqdHJlZXMsICp0cmVlOwotCXVuc2lnbmVkIGludCBuciwgaTsKJiM0MzsJc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc2F2ZWQgPSBlbnRyeS0mZ3Q7c3dwX3RiX3ZhbDsKIAotCW5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTsKLQl0cmVlcyA9IGt2emFsbG9jX29ianMoKnRyZWUsIG5yKTsKLQlpZiAoIXRyZWVzKSB7Ci0JCXByX2VycigmIzM0O2FsbG9jIGZhaWxlZCwgenN3YXAgZGlzYWJsZWQgZm9yIHN3YXAgdHlwZSAlZFxuJiMzNDssIHR5cGUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CiYjNDM7CS8qCiYjNDM7CSAqIHN3cF90Yl92YWwgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzd2FwIHRhYmxlIGVudHJ5LiAgT25seQomIzQzOwkgKiBTaGFkb3cgZW50cmllcyBjYXJyeSB3b3JraW5nc2V0IGluZm9ybWF0aW9uOyBQRk4gYW5kIE5VTEwKJiM0MzsJICogZW50cmllcyBoYXZlIG5vIHNoYWRvdyB0byBleHRyYWN0LgomIzQzOwkgKi8KJiM0MzsJaWYgKCFzd3BfdGJfaXNfc2hhZG93KHNhdmVkKSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlyZXR1cm4gKHZvaWQgKikoc2F2ZWQgJmFtcDsgflNXUF9UQl9GTEFHU19NQVNLKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZWFkIHRoZSBzd2FwIGNvdW50IGZyb20gYSBQb2ludGVyLXR5cGUgc3dhcCB0YWJsZSBlbnRyeS4gVGhlIGNvdW50CiYjNDM7ICogYW5kIGZsYWdzIGFyZSBzdG9yZWQgaW4genN3YXBfZW50cnktJmd0O3N3cF90Yl92YWwgd2hpY2ggcHJlc2VydmVzIHRoZQomIzQzOyAqIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgKFNoYWRvdyBvciBQRk4gZm9ybWF0KS4KJiM0MzsgKi8KJiM0Mzt1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTsKJiM0MzsKJiM0MzsJcmV0dXJuIF9fc3dwX3RiX2dldF9jb3VudChlbnRyeS0mZ3Q7c3dwX3RiX3ZhbCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVhZCB0aGUgZmxhZ3MgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LgomIzQzOyAqLwomIzQzO3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90YikKJiM0Mzt7CiYjNDM7CXN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpOwomIzQzOwomIzQzOwlyZXR1cm4gX19zd3BfdGJfZ2V0X2ZsYWdzKGVudHJ5LSZndDtzd3BfdGJfdmFsKTsKJiM0Mzt9CiAKLQlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KQotCQl4YV9pbml0KHRyZWVzICYjNDM7IGkpOwomIzQzOy8qCiYjNDM7ICogSW5jcmVtZW50IHRoZSBzd2FwIGNvdW50IG9mIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuCiYjNDM7ICogVGhlIGNvdW50IGlzIHN0b3JlZCBpbiB6c3dhcF9lbnRyeS0mZ3Q7c3dwX3RiX3ZhbCBmb3IgY291bnRzIGJlbG93CiYjNDM7ICogU1dQX1RCX0NPVU5UX01BWCwgYW5kIG92ZXJmbG93cyBpbnRvIHRoZSBjbHVzdGVyJiMzOTtzIGV4dGVuZF90YWJsZQomIzQzOyAqIGp1c3QgbGlrZSBub3JtYWwgU2hhZG93L1BGTiBlbnRyaWVzIGRvLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCiYjNDM7ICogLUVOT01FTSBpZiBjb3VudCB3b3VsZCBvdmVyZmxvdyBhbmQgbm8gZXh0ZW5kX3RhYmxlIGlzIGF2YWlsYWJsZS4KJiM0MzsgKi8KJiM0MztpbnQgenN3YXBfc3dwX3RiX2R1cF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YiwKJiM0MzsJCQkgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKQomIzQzO3sKJiM0MzsJc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7CiYjNDM7CXVuc2lnbmVkIGNoYXIgY291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktJmd0O3N3cF90Yl92YWwpOwogCi0JbnJfenN3YXBfdHJlZXNbdHlwZV0gPSBucjsKLQl6c3dhcF90cmVlc1t0eXBlXSA9IHRyZWVzOwomIzQzOwlpZiAoY291bnQgJmx0OyBTV1BfVEJfQ09VTlRfTUFYKSB7CiYjNDM7CQllbnRyeS0mZ3Q7c3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LSZndDtzd3BfdGJfdmFsLAomIzQzOwkJCQkJCSAgICAgIGNvdW50ICYjNDM7IDEpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsJLyogY291bnQgPT0gTUFYLCBvdmVyZmxvdyBpbnRvIGV4dGVuZF90YWJsZSAqLwomIzQzOwlpZiAoIWNpLSZndDtleHRlbmRfdGFibGUpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJY291bnQgPSBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl07CiYjNDM7CWlmIChjb3VudCA9PSAwKQomIzQzOwkJY291bnQgPSBTV1BfVEJfQ09VTlRfTUFYOwomIzQzOwljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CWNpLSZndDtleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50OwogCXJldHVybiAwOwogfQogCi12b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpCiYjNDM7LyoKJiM0MzsgKiBEZWNyZW1lbnQgdGhlIHN3YXAgY291bnQgb2YgYSBQb2ludGVyLXR5cGUgc3dhcCB0YWJsZSBlbnRyeS4KJiM0MzsgKiBIYW5kbGVzIGJvdGggaW5saW5lIGNvdW50IChpbiBzd3BfdGJfdmFsKSBhbmQgb3ZlcmZsb3dlZCBjb3VudAomIzQzOyAqIChpbiBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlKSwgbWF0Y2hpbmcgdGhlIGxvZ2ljIHVzZWQgYnkgbm9ybWFsIGVudHJpZXMuCiYjNDM7ICovCiYjNDM7dm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLAomIzQzOwkJCSAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKQogewotCXN0cnVjdCB4YXJyYXkgKnRyZWVzID0genN3YXBfdHJlZXNbdHlwZV07Ci0JdW5zaWduZWQgaW50IGk7CiYjNDM7CXN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpOwomIzQzOwl1bnNpZ25lZCBjaGFyIGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LSZndDtzd3BfdGJfdmFsKTsKJiM0MzsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKGNvdW50ID09IDApOwogCi0JaWYgKCF0cmVlcykKJiM0MzsJaWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHsKJiM0MzsJCWlmICghY2ktJmd0O2V4dGVuZF90YWJsZSkgewomIzQzOwkJCWNvdW50LS07CiYjNDM7CQkJZW50cnktJmd0O3N3cF90Yl92YWwgPSBfX3N3cF90Yl9ta19jb3VudChlbnRyeS0mZ3Q7c3dwX3RiX3ZhbCwgY291bnQpOwomIzQzOwkJCXJldHVybjsKJiM0MzsJCX0KJiM0MzsJCWNvdW50ID0gY2ktJmd0O2V4dGVuZF90YWJsZVtjaV9vZmZdOwomIzQzOwkJLyogT3ZlcmZsb3cgc3RhcnRzIHdpdGggU1dQX1RCX0NPVU5UX01BWCAqLwomIzQzOwkJVk1fV0FSTl9PTl9PTkNFKGNvdW50ICZsdDsgU1dQX1RCX0NPVU5UX01BWCk7CiYjNDM7CQljb3VudC0tOwomIzQzOwkJaWYgKGNvdW50ID09IChTV1BfVEJfQ09VTlRfTUFYIC0gMSkpIHsKJiM0MzsJCQljaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwOwomIzQzOwkJCWVudHJ5LSZndDtzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktJmd0O3N3cF90Yl92YWwsCiYjNDM7CQkJCQkJCSAgICAgIGNvdW50KTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJY2ktJmd0O2V4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7CiYjNDM7CQl9CiAJCXJldHVybjsKJiM0MzsJfQomIzQzOwllbnRyeS0mZ3Q7c3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LSZndDtzd3BfdGJfdmFsLCBjb3VudCAtIDEpOwomIzQzO30KIAotCS8qIHRyeV90b191bnVzZSgpIGludmFsaWRhdGVkIGFsbCB0aGUgZW50cmllcyBhbHJlYWR5ICovCi0JZm9yIChpID0gMDsgaSAmbHQ7IG5yX3pzd2FwX3RyZWVzW3R5cGVdOyBpJiM0MzsmIzQzOykKLQkJV0FSTl9PTl9PTkNFKCF4YV9lbXB0eSh0cmVlcyAmIzQzOyBpKSk7CiYjNDM7aW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KIAotCWt2ZnJlZSh0cmVlcyk7Ci0JbnJfenN3YXBfdHJlZXNbdHlwZV0gPSAwOwotCXpzd2FwX3RyZWVzW3R5cGVdID0gTlVMTDsKJiM0Mzt2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpCiYjNDM7ewogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3ODg0CgkJCQkJCQlvdXRwdXQ6IDI0CgkJCQkJCQl0aG91Z2h0czogNjYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgWnN3YXAgRW50cnkgU3RvcmFnZSBQYXRjaCoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IGEgcGF0Y2ggaGVyZSB0aGF0JiMzOTtzIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IGB6c3dhcGAgbWFuYWdlcyBpdHMgZW50cmllcy4gSW5zdGVhZCBvZiB1c2luZyB0aGF0IHNlcGFyYXRlIGB4YXJyYXlgIHdlJiMzOTtyZSB1c2VkIHRvIChgenN3YXBfdHJlZXNgKSwgaXQmIzM5O3Mgbm93IGRpcmVjdGx5IGxpbmtpbmcgYSBwb2ludGVyIHRvIHRoZSBgenN3YXBfZW50cnlgIHN0cnVjdHVyZSB3aXRoaW4gdGhlIHN3YXAgdGFibGVzIHRoZW1zZWx2ZXMgKGBzd2FwX21hcGAgb3IgYHN3YXBfY2x1c3Rlcl9pbmZvYCkuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBhcmNoaXRlY3R1cmFsIHNoaWZ0LiBJIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIHJvYnVzdC4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byB2ZXJpZnkgaXRzIGZ1bmN0aW9uYWxpdHkuIFRoaXMgaXMgYSBjb21wbGV0ZSBwYXJhZGlnbSBzaGlmdCBpbiB6c3dhcCYjMzk7cyBlbnRyeSB0cmFja2luZy4gSXMgenN3YXAgZXZlbiByZWFjaGFibGUgaWYgdGhpcyBmYWlscz8gWWVzLCBpdCYjMzk7cyBhIGNvcmUgZmVhdHVyZSwgc28gdGhhdCYjMzk7cyBhIGNoZWNrLiBJcyB0aGlzIGNoYW5nZSB3b3J0aHkgb2YgZnV6emluZz8gQWJzb2x1dGVseTsgaXQmIzM5O3MgYSByYWRpY2FsIG1vZGlmaWNhdGlvbiB0byBob3cgc3dhcCBhbmQgenN3YXAgaW50ZXJhY3QuIFRoYXQgbmVjZXNzaXRhdGVzIGZ1enppbmcgdG8gcm9vdCBvdXQgYW55IHN1YnRsZSBidWdzLgoKTm93LCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyB0aGlzIHBhdGNoIHRvdWNoZXMuIExvb2tzIGxpa2UgdGhlIGNvcmUgYG1tL3pzd2FwLmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYCBhcmUgd2hlcmUgdGhlIGJ1bGsgb2YgdGhlIGNoYW5nZXMgcmVzaWRlLiBGcm9tIGEgcXVpY2sgc2NhbiwgaXQgbG9va3MgbGlrZSB0aGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZDogYHpzd2FwX3N0b3JlYCwgYHpzd2FwX2xvYWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGB6c3dhcF93cml0ZWJhY2tfZW50cnlgLCBgenN3YXBfc3RvcmVfcGFnZWAsIGBfX3N3YXBfY2FjaGVfYWRkX2ZvbGlvYCwgYF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9gLCBgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpb2AsIGBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlgLCBgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzYCwgYHN3YXBfcHV0X2VudHJpZXNfY2x1c3RlcmAsIGFuZCBgX19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5YC4gSSBuZWVkIHRvIGRpZyBpbnRvIHRob3NlIGZ1bmN0aW9ucy4gTGV0IG1lIHJldmlldyBgbW0venN3YXAuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBMb29rcyBsaWtlIGl0JiMzOTtzIGEgZmV3IG1vcmUgdGhhbiB0aGUgbGlzdCBJIGluaXRpYWxseSBjb25zdHJ1Y3RlZDogYHpzd2FwX3N0b3JlYCwgYHpzd2FwX2xvYWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGB6c3dhcF93cml0ZWJhY2tfZW50cnlgLCBgenN3YXBfc3dwX3RiX2R1cF9jb3VudGAsIGB6c3dhcF9zd3BfdGJfcHV0X2NvdW50YCwgYHpzd2FwX3N3cF90Yl9nZXRfc2hhZG93YCwgYHpzd2FwX3N3cF90Yl9nZXRfY291bnRgLCBgenN3YXBfc3dwX3RiX2dldF9mbGFnc2AuIGBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrYCwgYF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9gLCBgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpb2AsIGBfX3N3YXBfY2FjaGVfYWxsb2NgLCBgc3dhcF9jYWNoZV9hbGxvY19mb2xpb2AsIGBzd2FwX2NhY2hlX3JlYWRfZm9saW9gLCBgc3dhcGluX3N5bmNgLiBgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllc2AsIGBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlgLCBgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyYCwgYF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeWAsIGBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXNgLCBgX19zd2FwX2NvdW50YCwgYHN3YXBfZW50cnlfc3dhcHBlZGAsIGB1bnVzZV9wdGVfcmFuZ2VgLgoKTmV4dCwgSSBuZWVkIHRvIGlkZW50aWZ5IGFueSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIGBDT05GSUdfWlNXQVBgIGlzIG9idmlvdXNseSBlc3NlbnRpYWwuIEkgc2hvdWxkIGNoZWNrIGBtbS9LY29uZmlnYCBvciBldmVuIGBtbS96c3dhcC5jYCBpdHNlbGYgdG8gY29uZmlybSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzIG9yIGltcGxpY2F0aW9ucy4gYENPTkZJR19TV0FQYCBpcyBpbXBsaWNpdGx5IGVuYWJsZWQgd2hlbiBgQ09ORklHX1pTV0FQYCBpcywgc28gSSYjMzk7bGwga2VlcCBhbiBleWUgb3V0IGZvciBhbnkgb3RoZXJzIHRoYXQgbWlnaHQgYmUgcmVxdWlyZWQgb3IgYWZmZWN0ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMTU6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFpTV0FQJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9MTI9bWVudWNvbmZpZyBTV0FQXG4tLVxubW0vS2NvbmZpZy0yMS1cbm1tL0tjb25maWc6MjI6Y29uZmlnIFpTV0FQXG5tbS9LY29uZmlnLTIzLVx0Ym9vbCBcJiMzNDtDb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy0zNC1cbm1tL0tjb25maWc6MzU6Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cbm1tL0tjb25maWctMzYtXHRib29sIFwmIzM0O0VuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZy00NC1cbm1tL0tjb25maWc6NDU6Y29uZmlnIFpTV0FQX1NIUklOS0VSX0RFRkFVTFRfT05cbm1tL0tjb25maWctNDYtXHRib29sIFwmIzM0O1NocmluayB0aGUgenN3YXAgcG9vbCBvbiBtZW1vcnkgcHJlc3N1cmVcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTU5PWNob2ljZVxuLS1cbm1tL0tjb25maWctNzYtXG5tbS9LY29uZmlnOjc3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfREVGTEFURVxubW0vS2NvbmZpZy03OC1cdGJvb2wgXCYjMzQ7RGVmbGF0ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctODItXG5tbS9LY29uZmlnOjgzOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFpPXG5tbS9LY29uZmlnLTg0LVx0Ym9vbCBcJiMzNDtMWk9cJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg4LVxubW0vS2NvbmZpZzo4OTpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXzg0MlxubW0vS2NvbmZpZy05MC1cdGJvb2wgXCYjMzQ7ODQyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NC1cbm1tL0tjb25maWc6OTU6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRcbm1tL0tjb25maWctOTYtXHRib29sIFwmIzM0O0xaNFwmIzM0O1xuLS1cbm1tL0tjb25maWctMTAwLVxubW0vS2NvbmZpZzoxMDE6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRIQ1xubW0vS2NvbmZpZy0xMDItXHRib29sIFwmIzM0O0xaNEhDXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy0xMDYtXG5tbS9LY29uZmlnOjEwNzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX1pTVERcbm1tL0tjb25maWctMTA4LVx0Ym9vbCBcJiMzNDt6c3RkXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz0xMTI9ZW5kY2hvaWNlXG5tbS9LY29uZmlnLTExMy1cbm1tL0tjb25maWc6MTE0OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRcbm1tL0tjb25maWctMTE1LSAgICAgICBzdHJpbmdcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAxNToxMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTgzNwoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkgd2VyZSBteSBvd246CgoqKkVuYWJsaW5nIFpTV0FQOiBBIFN0cmVhbWxpbmVkIFBhdGggdG8gUGVyZm9ybWFuY2UqKgoKUmlnaHQsIHNvIEkmIzM5O20gdGhpbmtpbmcsIGdpdmVuIHRoZSBjb250ZXh0LCBlbmFibGluZyBgWlNXQVBgIGFuZCBzZXR0aW5nIGBaU1dBUF9ERUZBVUxUX09OYCBzZWVtcyBsaWtlIHRoZSBzZW5zaWJsZSBuZXh0IHN0ZXAuICBXZSYjMzk7cmUgbG9va2luZyBmb3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLCBhbmQgdGhpcyBpcyBhIGNsYXNzaWMgYXBwcm9hY2guCgpCZWZvcmUgSSBqdW1wIHRvIGFueSBjb25jbHVzaW9ucywgSSYjMzk7ZCBiZXR0ZXIgZG91YmxlLWNoZWNrIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gU28sIGxldCYjMzk7cyBoZWFkIG92ZXIgdG8gYG1tL0tjb25maWdgIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG9idmlvdXMgY29uZmxpY3RzIG9yIHByZXJlcXVpc2l0ZXMgSSYjMzk7dmUgbWlzc2VkLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiB0aGF0IGFyZWEgLSBlbnN1cmUgdGhlcmUgaXMgbm90aGluZyBwcmV2ZW50aW5nIG9yIHJlcXVpcmluZyBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gR290dGEgbWFrZSBzdXJlIHRoZXJlIGFyZW4mIzM5O3QgYW55IGdvdGNoYXMgaW4gdGhlIHNldHVwLCBvciBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mLiBCZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IHdoZW4gbWFraW5nIHRoZXNlIGtpbmRzIG9mIGNoYW5nZXMuICBUaGVuLCB3ZSBjYW4gZXZhbHVhdGUgdGhlIGJyb2FkZXIgaW1wbGljYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBaU1dBUF9ERUZBVUxUX09OJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9MjI9Y29uZmlnIFpTV0FQXG4tLVxubW0vS2NvbmZpZy0zNC1cbm1tL0tjb25maWc6MzU6Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cbm1tL0tjb25maWctMzYtXHRib29sIFwmIzM0O0VuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMTU6MTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAxNzkKCQkJCQkJCW91dHB1dDogMjQ1CgkJCQkJCQl0aG91Z2h0czogNzE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFpzd2FwIENoYW5nZXMqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIHpzd2FwIHBhdGNoLCBhbmQgaGVyZSYjMzk7cyBteSB0cmFpbiBvZiB0aG91Z2h0LiBGaXJzdCwgSSBuZWVkIHRvIHBpbnBvaW50IHRoZSBrZXkgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBoYXZlIGJlZW4gdG91Y2hlZC4gSSBzdGFydGVkIGJ5IGlkZW50aWZ5aW5nIGEgbGlzdCBvZiBzeW1ib2xzIEkgc2VlIGFzIHBvdGVudGlhbGx5IGltcG9ydGFudC4gTGV0JiMzOTtzIHNlZS4uLiBJJiMzOTt2ZSBnb3QgYHpzd2FwX3N0b3JlYCwgYHpzd2FwX2xvYWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGB6c3dhcF93cml0ZWJhY2tfZW50cnlgLCBgX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpb2AsIGBfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvYCwgYF9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeWAsIGBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXNgLCBgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyYCwgYW5kIGBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBvZiB0aGVzZSBhcmUgYWN0dWFsbHkgKnNpZ25pZmljYW50KiBpbiB0ZXJtcyBvZiBjaGFuZ2VzLgoKTmV4dCwgSSYjMzk7bSBjaGVja2luZyB0aGVpciBzY29wZS4gSXMgaXQgc3RhdGljIG9yIGV4cG9ydGVkPyBJJiMzOTt2ZSBmaWx0ZXJlZCB0aGUgbGlzdCBkb3duLCBmb2N1c2luZyBvbiBmdW5jdGlvbnMgYW5kIGdsb2JhbHMgdGhhdCBhcmUgZXhwb3NlZCBvciBoYXZlIHN1YnN0YW50aWFsIGxvZ2ljIGludm9sdmVkLiBNeSByZXZpc2VkIGtleSBsaXN0IG5vdyBsb29rcyBsaWtlOiBgenN3YXBfc3RvcmVgLCBgenN3YXBfbG9hZGAsIGB6c3dhcF9pbnZhbGlkYXRlYCwgYHpzd2FwX3dyaXRlYmFja19lbnRyeWAsIGBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvYCwgYF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9gLCBgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5YCwgYF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllc2AsIGFuZCBgX19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5YC4gSSB0aGVuIGlkZW50aWZpZWQgdGhhdCBgenN3YXBfc3dwX3RiX2R1cF9jb3VudGAgYW5kIGB6c3dhcF9zd3BfdGJfcHV0X2NvdW50YCBhcmUgYWxzbyBnbG9iYWwsIG1lYW5pbmcgdGhleSBuZWVkIHRvIGJlIHdhdGNoZWQuCgpOb3cgSSB1bmRlcnN0YW5kIHRoZSBjb3JlIG9mIHRoZSBjaGFuZ2U6IHRoZSBwYXRjaCBpcyBmdW5kYW1lbnRhbGx5IGFsdGVyaW5nIGhvdyB6c3dhcCBtYW5hZ2VzIGNvbXByZXNzZWQgcGFnZXMuIEl0JiMzOTtzIGVtYmVkZGluZyB0aGUgYHpzd2FwX2VudHJ5YCBwb2ludGVycyBkaXJlY3RseSBpbnRvIHRoZSBgc3dhcF9jbHVzdGVyX2luZm9gIHN0cnVjdHVyZXMuIFRoaXMgaXMgYSBiaWcgZGVhbCBiZWNhdXNlIGl0IG1lYW5zIHRoZSBjb3JlIHN3YXAgYWxsb2NhdGlvbiwgZnJlZWluZywgYW5kIGxvb2t1cCBwYXRocyBhcmUgYmVpbmcgcmVzaGFwZWQuIFRoaXMgaXMgd2hlcmUgSSBzdGFydCB0aGlua2luZyBhYm91dCB0aGUgcG90ZW50aWFsIHBpdGZhbGxzIGFuZCB0aGUgYXJlYXMgSSBuZWVkIHRvIGZvY3VzIG9uLgoKVGhpcyBhcHByb2FjaCB3aWxsIGludHJvZHVjZSBtZW1vcnkgbWFuYWdlbWVudCBjb25zaWRlcmF0aW9ucywgYW5kIEkgbmVlZCB0byBlbnN1cmUgdGhhdCBjb25jdXJyZW50IHN3YXAgb3BlcmF0aW9ucyBkb24mIzM5O3QgbGVhZCB0byBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3IgZXJyb3JzIGluIHN3YXAgYWNjb3VudGluZy4gSSYjMzk7bSBhbHJlYWR5IG1lbnRhbGx5IGZsYWdnaW5nIHRoaXMgZm9yIHRob3JvdWdoIGZ1enppbmcgYW5kIHJpZ29yb3VzIHRlc3RpbmcuCgpGaW5hbGx5LCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBhcmUgc2V0LiBJIG5lZWQgYFpTV0FQYCBlbmFibGVkLCBhbmQsIGZvciBkZWZhdWx0IHVzYWdlLCBgWlNXQVBfREVGQVVMVF9PTmAgYXMgd2VsbC4gV2l0aCB0aGlzIGRvbmUsIEkmIzM5O20gcmVhZHkgdG8gY2FsbCB0aGUgbmV4dCBzdGVwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtaU1dBUCYjMzQ7LAogICAgJiMzNDtaU1dBUF9ERUZBVUxUX09OJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7enN3YXBfc3RvcmUmIzM0OywKICAgICYjMzQ7enN3YXBfbG9hZCYjMzQ7LAogICAgJiMzNDt6c3dhcF9pbnZhbGlkYXRlJiMzNDssCiAgICAmIzM0O3pzd2FwX3dyaXRlYmFja19lbnRyeSYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9kb19kZWxfZm9saW8mIzM0OywKICAgICYjMzQ7X19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5JiMzNDssCiAgICAmIzM0O19fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkmIzM0OywKICAgICYjMzQ7enN3YXBfc3dwX3RiX2R1cF9jb3VudCYjMzQ7LAogICAgJiMzNDt6c3dhcF9zd3BfdGJfcHV0X2NvdW50JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZ1bmRhbWVudGFsbHkgY2hhbmdlcyBob3cgenN3YXAgdHJhY2tzIGNvbXByZXNzZWQgcGFnZXMgYnkgZW1iZWRkaW5nIGB6c3dhcF9lbnRyeWAgcG9pbnRlcnMgZGlyZWN0bHkgaW50byB0aGUgY29yZSBzd2FwIHRhYmxlIChgc3dhcF9jbHVzdGVyX2luZm9gKSByYXRoZXIgdGhhbiB1c2luZyBhIHNlcGFyYXRlIHhhcnJheSAoYHpzd2FwX3RyZWVzYCkuIFRoaXMgYWZmZWN0cyBjb3JlIHN3YXAgYWxsb2NhdGlvbiwgZnJlZWluZywgYW5kIGxvb2t1cCBwYXRocywgcmVxdWlyaW5nIGZ1enppbmcgdG8gZW5zdXJlIG5vIG1lbW9yeSBsZWFrcywgdXNlLWFmdGVyLWZyZWVzLCBvciBzd2FwIGFjY291bnRpbmcgZXJyb3JzIG9jY3VyIGR1cmluZyBjb25jdXJyZW50IHN3YXAgb3BlcmF0aW9ucy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7WlNXQVAmIzM0OywKICAgICYjMzQ7WlNXQVBfREVGQVVMVF9PTiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX3N0b3JlJiMzNDssCiAgICAmIzM0O3pzd2FwX2xvYWQmIzM0OywKICAgICYjMzQ7enN3YXBfaW52YWxpZGF0ZSYjMzQ7LAogICAgJiMzNDt6c3dhcF93cml0ZWJhY2tfZW50cnkmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvJiMzNDssCiAgICAmIzM0O19fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeSYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMmIzM0OywKICAgICYjMzQ7X19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5JiMzNDssCiAgICAmIzM0O3pzd2FwX3N3cF90Yl9kdXBfY291bnQmIzM0OywKICAgICYjMzQ7enN3YXBfc3dwX3RiX3B1dF9jb3VudCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0wN1QxNToxMToyMS42NTYxMjU5NzJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzAyNjQ4MjAxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiWlNXQVBfREVGQVVMVF9PTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9sb2FkXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCIsXG4gICAgXCJ6c3dhcF93cml0ZWJhY2tfZW50cnlcIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeVwiLFxuICAgIFwiX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzXCIsXG4gICAgXCJfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlcIixcbiAgICBcInpzd2FwX3N3cF90Yl9kdXBfY291bnRcIixcbiAgICBcInpzd2FwX3N3cF90Yl9wdXRfY291bnRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDE1OjExOjIxLjY1NjEzMTg5MloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzI3NTg4NDI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZjIwMTE5ODU4NzYzMTIxNWY3MDhmNTg4NmE5ODEwMzIzZmJjMjM5OVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEp1bCA3IDE1OjExOjE4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvenN3YXAuaCBiL2luY2x1ZGUvbGludXgvenN3YXAuaFxcbmluZGV4IDMwYzE5M2ExMjA3ZTE2Li40ZjU1YzhkMGM0YzU0MiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3pzd2FwLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3pzd2FwLmhcXG5AQCAtMjYsNyArMjYsNyBAQCBzdHJ1Y3QgenN3YXBfbHJ1dmVjX3N0YXRlIHtcXG4gXFxuIHVuc2lnbmVkIGxvbmcgenN3YXBfdG90YWxfcGFnZXModm9pZCk7XFxuIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuLWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbitpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB2b2lkICp6ZW50cnkpO1xcbiB2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcXG4gaW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XFxuIHZvaWQgenN3YXBfc3dhcG9mZihpbnQgdHlwZSk7XFxuQEAgLTQ0LDcgKzQ0LDcgQEAgc3RhdGljIGlubGluZSBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdHJldHVybiBmYWxzZTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbitzdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHZvaWQgKnplbnRyeSlcXG4ge1xcbiBcXHRyZXR1cm4gLUVOT0VOVDtcXG4gfVxcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmNcXG5pbmRleCBiMjNmNDk0ZmNjODNkYS4uMWNlODIwMWVkODZlMjQgMTAwNjQ0XFxuLS0tIGEvbW0vcGFnZV9pby5jXFxuKysrIGIvbW0vcGFnZV9pby5jXFxuQEAgLTY1OCw3ICs2NTgsNyBAQCBzdGF0aWMgdm9pZCBzd2FwX3JlYWRfZm9saW9fYmRldl9hc3luYyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbiBcXHRzdWJtaXRfYmlvKGJpbyk7XFxuIH1cXG4gXFxuLXZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKVxcbit2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KVxcbiB7XFxuIFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBfX3N3YXBfZW50cnlfdG9faW5mbyhmb2xpby1cXHUwMDNlc3dhcCk7XFxuIFxcdGJvb2wgc3luY2hyb25vdXMgPSBzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NZTkNIUk9OT1VTX0lPO1xcbkBAIC02ODYsNyArNjg2LDcgQEAgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcpXFxuIFxcdFxcdGdvdG8gZmluaXNoO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoenN3YXBfbG9hZChmb2xpbykgIT0gLUVOT0VOVClcXG4rXFx0aWYgKHpzd2FwX2xvYWQoZm9saW8sIHplbnRyeSkgIT0gLUVOT0VOVClcXG4gXFx0XFx0Z290byBmaW5pc2g7XFxuIFxcbiBcXHQvKiBXZSBoYXZlIHRvIHJlYWQgZnJvbSBzbG93ZXIgZGV2aWNlcy4gSW5jcmVhc2UgenN3YXAgcHJvdGVjdGlvbi4gKi9cXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcC5oIGIvbW0vc3dhcC5oXFxuaW5kZXggNDRhYjhlMWU1OTViMDguLjg0ZTEzYmE2ZTYwNWMzIDEwMDY0NFxcbi0tLSBhL21tL3N3YXAuaFxcbisrKyBiL21tL3N3YXAuaFxcbkBAIC0yMTAsNiArMjEwLDQxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2NsdXN0ZXJfdW5sb2NrX2lycShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxcbiBcXG4gZXh0ZXJuIGludCBzd2FwX3JldHJ5X3RhYmxlX2FsbG9jKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnApO1xcbiBcXG4rc3RydWN0IHpzd2FwX2VudHJ5O1xcbisjaWZkZWYgQ09ORklHX1pTV0FQXFxuK3ZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKTtcXG4rdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiKTtcXG4rdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2ZsYWdzKHVuc2lnbmVkIGxvbmcgc3dwX3RiKTtcXG4raW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXFxuK1xcdFxcdFxcdCAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHVuc2lnbmVkIGludCBjaV9vZmYpO1xcbit2b2lkIHpzd2FwX3N3cF90Yl9wdXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXFxuK1xcdFxcdFxcdCAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKTtcXG4rdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpO1xcbisjZWxzZVxcbitzdGF0aWMgaW5saW5lIHZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbit7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2ZsYWdzKHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK3N0YXRpYyBpbmxpbmUgaW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbitcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IGNpX29mZilcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitzdGF0aWMgaW5saW5lIHZvaWQgenN3YXBfc3dwX3RiX3B1dF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YixcXG4rXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbitcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCBjaV9vZmYpIHt9XFxuK3N0YXRpYyBpbmxpbmUgdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpIHt9XFxuKyNlbmRpZlxcbitcXG4gLypcXG4gICogQmVsb3cgYXJlIHRoZSBjb3JlIHJvdXRpbmVzIGZvciBkb2luZyBzd2FwIGZvciBhIGZvbGlvLlxcbiAgKiBBbGwgaGVscGVycyByZXF1aXJlcyB0aGUgZm9saW8gdG8gYmUgbG9ja2VkLCBhbmQgYSBsb2NrZWQgZm9saW9cXG5AQCAtMjQxLDcgKzI3Niw3IEBAIGV4dGVybiB2b2lkIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIC8qIGxpbnV4L21tL3BhZ2VfaW8uYyAqL1xcbiBpbnQgc2lvX3Bvb2xfaW5pdCh2b2lkKTtcXG4gc3RydWN0IHN3YXBfaW9jYjtcXG4tdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcpO1xcbit2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KTtcXG4gdm9pZCBfX3N3YXBfcmVhZF91bnBsdWcoc3RydWN0IHN3YXBfaW9jYiAqcGx1Zyk7XFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX3JlYWRfdW5wbHVnKHN0cnVjdCBzd2FwX2lvY2IgKnBsdWcpXFxuIHtcXG5AQCAtMzAzLDEzICszMzgsMTYgQEAgc3RhdGljIGlubGluZSBib29sIGZvbGlvX21hdGNoZXNfc3dhcF9lbnRyeShjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbiBib29sIHN3YXBfY2FjaGVfaGFzX2ZvbGlvKHN3cF9lbnRyeV90IGVudHJ5KTtcXG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2dldF9mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSk7XFxuIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSk7XFxuK2Jvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4gdm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdldF9lbnRyeSwgZ2ZwX3QgZ2ZwX21hc2ssXFxuIFxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBvcmRlcnMsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLFxcbi1cXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KTtcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCxcXG4rXFx0XFx0XFx0XFx0ICAgICB2b2lkICoqemVudHJ5KTtcXG4gLyogQmVsb3cgaGVscGVycyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gbG9jayBhbmQgcGFzcyBpbiB0aGUgc3dhcCBjbHVzdGVyLiAqL1xcbiB2b2lkIF9fc3dhcF9jYWNoZV9hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4tXFx0XFx0XFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5KTtcXG4rXFx0XFx0XFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LFxcbitcXHRcXHRcXHQgICAgdm9pZCAqKnplbnRyeSk7XFxuIHZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXHRcXHRcXHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XFxuIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5AQCAtMzgxLDcgKzQxOSw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBmb2xpb19wdXRfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcXG4ge1xcbiB9XFxuIFxcbi1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKVxcbitzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnLFxcbitcXHRcXHRcXHRcXHQgICB2b2lkICp6ZW50cnkpXFxuIHtcXG4gfVxcbiBcXG5AQCAtNDUzLDYgKzQ5MiwxMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSlcXG4gXFx0cmV0dXJuIE5VTEw7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbiBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4ge1xcbiB9XFxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xcbmluZGV4IDZmZDZlMzQxNWI3MThiLi42MGQ5MzdjNmIzOTIyNCAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcXG5AQCAtMTc1LDE2ICsxNzUsMjkgQEAgc3RhdGljIGludCBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuIFxcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XFxuIFxcdGlmIChzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSlcXG4gXFx0XFx0cmV0dXJuIC1FRVhJU1Q7XFxuLVxcdGlmICghX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXFxuK1xcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XFxuK1xcdFxcdGlmICghenN3YXBfc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0fSBlbHNlIGlmICghX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpIHtcXG4gXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4gXFx0aWYgKHNoYWRvd3AgXFx1MDAyNlxcdTAwMjYgc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpKVxcbiBcXHRcXHQqc2hhZG93cCA9IHN3cF90Yl90b19zaGFkb3cob2xkX3RiKTtcXG4rXFx0ZWxzZSBpZiAoc2hhZG93cCBcXHUwMDI2XFx1MDAyNiBzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKVxcbitcXHRcXHQqc2hhZG93cCA9IHpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KG9sZF90Yik7XFxuIFxcdGlmIChtZW1jZ19pZClcXG4gXFx0XFx0Km1lbWNnX2lkID0gX19zd2FwX2Nncm91cF9nZXQoY2ksIGNpX29mZik7XFxuIFxcbiBcXHRpZiAobnIgPT0gMSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcbitcXHQvKlxcbitcXHQgKiBGb3IgbXVsdGktc2xvdCByYW5nZXMsIFBvaW50ZXIgZW50cmllcyBhcmUgbm90IGV4cGVjdGVkIHNpbmNlXFxuK1xcdCAqIHpzd2FwIGRvZXMgbm90IHN1cHBvcnQgbGFyZ2UgZm9saW9zLiBSZXR1cm4gLUVCVVNZIGZvciBzYWZldHkuXFxuK1xcdCAqL1xcbitcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSlcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFxuIFxcdGlzX3plcm8gPSBfX3N3YXBfdGFibGVfdGVzdF96ZXJvKGNpLCBjaV9vZmYpO1xcbiBcXHRjaV9vZmYgPSByb3VuZF9kb3duKGNpX29mZiwgbnIpO1xcbiBcXHRjaV9lbmQgPSBjaV9vZmYgKyBucjtcXG5AQCAtMjAxLDcgKzIxNCw4IEBAIHN0YXRpYyBpbnQgX19zd2FwX2NhY2hlX2FkZF9jaGVjayhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLVxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5KVxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdm9pZCAqKnplbnRyeSlcXG4ge1xcbiBcXHR1bnNpZ25lZCBpbnQgY2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KGVudHJ5KSwgY2lfZW5kO1xcbiBcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbkBAIC0yMTYsNyArMjMwLDM0IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gXFx0ZG8ge1xcbiBcXHRcXHRvbGRfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xcbiBcXHRcXHRWTV9XQVJOX09OX09OQ0Uoc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikpO1xcbi1cXHRcXHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIHBmbl90b19zd3BfdGIocGZuLCBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpO1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBJZiB0aGUgb2xkIGVudHJ5IGlzIGEgUG9pbnRlciAoenN3YXAgY29tcHJlc3NlZCBkYXRhKSxcXG4rXFx0XFx0ICogZXh0cmFjdCB0aGUgenN3YXBfZW50cnkgZm9yIHRoZSBjYWxsZXIgYW5kIHByZXNlcnZlXFxuK1xcdFxcdCAqIGl0cyBmbGFncy4gVGhlIFBvaW50ZXIgZW50cnkgaGFzIG5vIGlubGluZSBmbGFncy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGNoYXIgcGZsYWdzID0genN3YXBfc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpO1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBJZiBzd3BfdGJfdmFsIGNhcnJpZXMgU1dQX1RCX0NPVU5UX01BWCwgdGhlXFxuK1xcdFxcdFxcdCAqIHJlYWwgb3ZlcmZsb3cgY291bnQgbGl2ZXMgaW4gY2ktXFx1MDAzZWV4dGVuZF90YWJsZS5cXG4rXFx0XFx0XFx0ICogUHVsbCBpdCBzbyB0aGUgbmV3IFBGTiBjYXJyaWVzIHRoZSBjb3JyZWN0IGNvdW50XFxuK1xcdFxcdFxcdCAqIGFuZCB3b24ndCBsYXRlciBjcmFzaCBvbiBhIG1pc3NpbmcgZXh0ZW5kX3RhYmxlLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XFxuK1xcdFxcdFxcdFxcdHVuc2lnbmVkIGNoYXIgcmVhbCA9IFNXUF9UQl9DT1VOVF9NQVggLSAxO1xcbitcXHRcXHRcXHRcXHRpZiAoY2ktXFx1MDAzZWV4dGVuZF90YWJsZSBcXHUwMDI2XFx1MDAyNiBjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0pXFxuK1xcdFxcdFxcdFxcdFxcdHJlYWwgPSBjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XFxuK1xcdFxcdFxcdFxcdHBmbGFncyA9IChyZWFsIFxcdTAwM2NcXHUwMDNjIChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgfFxcbitcXHRcXHRcXHRcXHRcXHQgKHBmbGFncyBcXHUwMDI2ICgoMSBcXHUwMDNjXFx1MDAzYyAoU1dQX1RCX0ZMQUdTX0JJVFMgLSBTV1BfVEJfQ09VTlRfQklUUykpIC0gMSkpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlmICh6ZW50cnkgXFx1MDAyNlxcdTAwMjYgISp6ZW50cnkpXFxuK1xcdFxcdFxcdFxcdCp6ZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihvbGRfdGIpO1xcbitcXHRcXHRcXHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXFxuK1xcdFxcdFxcdFxcdHBmbl90b19zd3BfdGIocGZuLCBwZmxhZ3MpKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxcbitcXHRcXHRcXHRcXHRwZm5fdG9fc3dwX3RiKHBmbiwgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTtcXG4rXFx0XFx0fVxcbiBcXHR9IHdoaWxlICgrK2NpX29mZiBcXHUwMDNjIGNpX2VuZCk7XFxuIFxcbiBcXHRmb2xpb19yZWZfYWRkKGZvbGlvLCBucl9wYWdlcyk7XFxuQEAgLTIzOSwxMSArMjgwLDEyIEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gICogdGhhdCBob2xkcyB0aGUgZW50cmllcy5cXG4gICovXFxuIHZvaWQgX19zd2FwX2NhY2hlX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbi1cXHRcXHRcXHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpXFxuK1xcdFxcdFxcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcXG4rXFx0XFx0XFx0ICAgIHZvaWQgKip6ZW50cnkpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG4gXFxuLVxcdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSk7XFxuK1xcdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSwgemVudHJ5KTtcXG4gXFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9QQUdFUywgbnJfcGFnZXMpO1xcbiBcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NXQVBDQUNIRSwgbnJfcGFnZXMpO1xcbiB9XFxuQEAgLTI2OSwxNSArMzExLDI4IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gXFx0Y2lfb2ZmID0gY2lfc3RhcnQ7XFxuIFxcdGRvIHtcXG4gXFx0XFx0b2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcXG4tXFx0XFx0V0FSTl9PTl9PTkNFKCFzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSB8fFxcbi1cXHRcXHRcXHQgICAgIHN3cF90Yl90b19mb2xpbyhvbGRfdGIpICE9IGZvbGlvKTtcXG4tXFx0XFx0aWYgKF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxcbi1cXHRcXHRcXHRmb2xpb19zd2FwcGVkID0gdHJ1ZTtcXG4tXFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRuZWVkX2ZyZWUgPSB0cnVlO1xcbi1cXHRcXHQvKiBJZiBzaGFkb3cgaXMgTlVMTCwgd2Ugc2V0IGFuIGVtcHR5IHNoYWRvdy4gKi9cXG4tXFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdyxcXG4tXFx0XFx0XFx0XFx0IF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIElmIHpzd2FwIGFscmVhZHkgc3RvcmVkIGRhdGEgZm9yIHRoaXMgc2xvdFxcbitcXHRcXHQgKiAoenN3YXBfc3RvcmUgd3JvdGUgYSBQb2ludGVyIGVudHJ5KSwgbGVhdmUgaXRcXG4rXFx0XFx0ICogaW4gcGxhY2UuIFRoZSBjb3VudCBhbmQgZmxhZ3MgYXJlIHN0b3JlZCBpbiB0aGVcXG4rXFx0XFx0ICogenN3YXBfZW50cnkgc3RydWN0LlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpIHtcXG4rXFx0XFx0XFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcXG4rXFx0XFx0XFx0XFx0Zm9saW9fc3dhcHBlZCA9IHRydWU7XFxuK1xcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0XFx0bmVlZF9mcmVlID0gdHJ1ZTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0V0FSTl9PTl9PTkNFKCFzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSB8fFxcbitcXHRcXHRcXHRcXHQgICAgIHN3cF90Yl90b19mb2xpbyhvbGRfdGIpICE9IGZvbGlvKTtcXG4rXFx0XFx0XFx0aWYgKF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxcbitcXHRcXHRcXHRcXHRmb2xpb19zd2FwcGVkID0gdHJ1ZTtcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRuZWVkX2ZyZWUgPSB0cnVlO1xcbitcXHRcXHRcXHQvKiBJZiBzaGFkb3cgaXMgTlVMTCwgd2Ugc2V0IGFuIGVtcHR5IHNoYWRvdy4gKi9cXG4rXFx0XFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdyxcXG4rXFx0XFx0XFx0XFx0XFx0IF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XFxuK1xcdFxcdH1cXG4gXFx0fSB3aGlsZSAoKytjaV9vZmYgXFx1MDAzYyBjaV9lbmQpO1xcbiBcXG4gXFx0Zm9saW8tXFx1MDAzZXN3YXAudmFsID0gMDtcXG5AQCAtMjg4LDcgKzM0MywxNCBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuIFxcdH0gZWxzZSBpZiAobmVlZF9mcmVlKSB7XFxuIFxcdFxcdGNpX29mZiA9IGNpX3N0YXJ0O1xcbiBcXHRcXHRkbyB7XFxuLVxcdFxcdFxcdGlmICghX19zd3BfdGJfZ2V0X2NvdW50KF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpKVxcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHRiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcXG4rXFx0XFx0XFx0dW5zaWduZWQgY2hhciBjbnQ7XFxuK1xcbitcXHRcXHRcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIodGIpKVxcbitcXHRcXHRcXHRcXHRjbnQgPSB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHRiKTtcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRjbnQgPSBfX3N3cF90Yl9nZXRfY291bnQodGIpO1xcbitcXHRcXHRcXHRpZiAoIWNudClcXG4gXFx0XFx0XFx0XFx0X19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHNpLCBjaSwgY2lfb2ZmLCAxKTtcXG4gXFx0XFx0fSB3aGlsZSAoKytjaV9vZmYgXFx1MDAzYyBjaV9lbmQpO1xcbiBcXHR9XFxuQEAgLTQwMyw3ICs0NjUsOCBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKl9fc3dhcF9jYWNoZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXHRcXHRcXHRcXHRcXHRzd3BfZW50cnlfdCB0YXJnX2VudHJ5LCBnZnBfdCBnZnAsXFxuIFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IHZtX2ZhdWx0ICp2bWYsXFxuLVxcdFxcdFxcdFxcdFxcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KVxcbitcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCxcXG4rXFx0XFx0XFx0XFx0XFx0dm9pZCAqKnplbnRyeSlcXG4ge1xcbiBcXHRpbnQgZXJyO1xcbiBcXHRzd3BfZW50cnlfdCBlbnRyeTtcXG5AQCAtNDUwLDcgKzUxMyw3IEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKl9fc3dhcF9jYWNoZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXG4gXFx0X19mb2xpb19zZXRfbG9ja2VkKGZvbGlvKTtcXG4gXFx0X19mb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7XFxuLVxcdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSk7XFxuK1xcdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSwgemVudHJ5KTtcXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4gXFxuIFxcdGlmIChtZW1fY2dyb3VwX3N3YXBpbl9jaGFyZ2VfZm9saW8oZm9saW8sIG1lbWNnX2lkLFxcbkBAIC01MDcsNyArNTcwLDggQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuICAqL1xcbiBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfYWxsb2NfZm9saW8oc3dwX2VudHJ5X3QgdGFyZ19lbnRyeSwgZ2ZwX3QgZ2ZwLFxcbiBcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgb3JkZXJzLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZixcXG4tXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseClcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCxcXG4rXFx0XFx0XFx0XFx0ICAgICB2b2lkICoqemVudHJ5KVxcbiB7XFxuIFxcdGludCBvcmRlciwgZXJyO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKnJldDtcXG5AQCAtNTIwLDkgKzU4NCwxMiBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfYWxsb2NfZm9saW8oc3dwX2VudHJ5X3QgdGFyZ19lbnRyeSwgZ2ZwX3QgZ2ZwLFxcbiBcXHRpZiAoV0FSTl9PTl9PTkNFKCFvcmRlcnMgfHwgKDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcikgXFx1MDAzZSBTV0FQRklMRV9DTFVTVEVSKSlcXG4gXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbitcXHRpZiAoemVudHJ5KVxcbitcXHRcXHQqemVudHJ5ID0gTlVMTDtcXG4rXFxuIFxcdGRvIHtcXG4gXFx0XFx0cmV0ID0gX19zd2FwX2NhY2hlX2FsbG9jKGNpLCB0YXJnX2VudHJ5LCBnZnAsIG9yZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHQgdm1mLCBtcG9sLCBpbHgpO1xcbitcXHRcXHRcXHRcXHRcXHQgdm1mLCBtcG9sLCBpbHgsIHplbnRyeSk7XFxuIFxcdFxcdGlmICghSVNfRVJSKHJldCkpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRlcnIgPSBQVFJfRVJSKHJldCk7XFxuQEAgLTYzOCwxOCArNzA1LDIwIEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfcmVhZF9mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLFxcbiBcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZywgYm9vbCByZWFkYWhlYWQpXFxuIHtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4rXFx0dm9pZCAqemVudHJ5O1xcbiBcXG4gXFx0ZG8ge1xcbiBcXHRcXHRmb2xpbyA9IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKGVudHJ5KTtcXG4gXFx0XFx0aWYgKGZvbGlvKVxcbiBcXHRcXHRcXHRyZXR1cm4gZm9saW87XFxuLVxcdFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhlbnRyeSwgZ2ZwLCBCSVQoMCksIE5VTEwsIG1wb2wsIGlseCk7XFxuK1xcdFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhlbnRyeSwgZ2ZwLCBCSVQoMCksIE5VTEwsIG1wb2wsIGlseCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZ6ZW50cnkpO1xcbiBcXHR9IHdoaWxlIChQVFJfRVJSKGZvbGlvKSA9PSAtRUVYSVNUKTtcXG4gXFxuIFxcdGlmIChJU19FUlJfT1JfTlVMTChmb2xpbykpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4tXFx0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnKTtcXG4rXFx0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnLCB6ZW50cnkpO1xcbiBcXHRpZiAocmVhZGFoZWFkKSB7XFxuIFxcdFxcdGZvbGlvX3NldF9yZWFkYWhlYWQoZm9saW8pO1xcbiBcXHRcXHRjb3VudF92bV9ldmVudChTV0FQX1JBKTtcXG5AQCAtNjc4LDE4ICs3NDcsMjAgQEAgc3RydWN0IGZvbGlvICpzd2FwaW5fc3luYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBsb25nIG9yZGVycyxcXG4gXFx0XFx0XFx0ICAgc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KVxcbiB7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuK1xcdHZvaWQgKnplbnRyeTtcXG4gXFxuIFxcdGRvIHtcXG4gXFx0XFx0Zm9saW8gPSBzd2FwX2NhY2hlX2dldF9mb2xpbyhlbnRyeSk7XFxuIFxcdFxcdGlmIChmb2xpbylcXG4gXFx0XFx0XFx0cmV0dXJuIGZvbGlvO1xcbi1cXHRcXHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCk7XFxuK1xcdFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhlbnRyeSwgZ2ZwLCBvcmRlcnMsIHZtZiwgbXBvbCwgaWx4LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNnplbnRyeSk7XFxuIFxcdH0gd2hpbGUgKFBUUl9FUlIoZm9saW8pID09IC1FRVhJU1QpO1xcbiBcXG4gXFx0aWYgKElTX0VSUihmb2xpbykpXFxuIFxcdFxcdHJldHVybiBmb2xpbztcXG4gXFxuLVxcdHN3YXBfcmVhZF9mb2xpbyhmb2xpbywgTlVMTCk7XFxuK1xcdHN3YXBfcmVhZF9mb2xpbyhmb2xpbywgTlVMTCwgemVudHJ5KTtcXG4gXFx0cmV0dXJuIGZvbGlvO1xcbiB9XFxuIFxcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3RhYmxlLmggYi9tbS9zd2FwX3RhYmxlLmhcXG5pbmRleCBlNjYxM2U2MmY4ZDBmNi4uNjMxOGJmOGFhNzZiMGMgMTAwNjQ0XFxuLS0tIGEvbW0vc3dhcF90YWJsZS5oXFxuKysrIGIvbW0vc3dhcF90YWJsZS5oXFxuQEAgLTI4LDcgKzI4LDcgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUge1xcbiAgKiBOVUxMOiAgICAgfC0tLS0tLS0tLS0tLS0tLS0gMCAtLS0tLS0tLS0tLS0tLS18IC0gRnJlZSBzbG90XFxuICAqIFNoYWRvdzogICB8U1dBUF9DT1VOVHxafC0tLS0gU0hBRE9XX1ZBTCAtLS18MXwgLSBTd2FwcGVkIG91dCBzbG90XFxuICAqIFBGTjogICAgICB8U1dBUF9DT1VOVHxafC0tLS0tLSBQRk4gLS0tLS0tLXwxMHwgLSBDYWNoZWQgc2xvdFxcbi0gKiBQb2ludGVyOiAgfC0tLS0tLS0tLS0tIFBvaW50ZXIgLS0tLS0tLS0tLXwxMDB8IC0gKFVudXNlZClcXG4rICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIFpzd2FwIGNvbXByZXNzZWQgZW50cnlcXG4gICogQmFkOiAgICAgIHwtLS0tLS0tLS0tLS0tIDEgLS0tLS0tLS0tLS0tLXwxMDAwfCAtIEJhZCBzbG90XFxuICAqXFxuICAqIENPVU5UIGlzIGBTV1BfVEJfQ09VTlRfQklUU2AgbG9uZywgWiBpcyB0aGUgYFNXUF9UQl9aRVJPX0ZMQUdgIGJpdCxcXG5AQCAtNDksOSArNDksMTEgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUge1xcbiAgKiAtIFBGTjogU3dhcCBzbG90IGlzIGluIHVzZSwgYW5kIGNhY2hlZC4gTWVtY2cgaW5mbyBpcyByZWNvcmRlZCBvbiB0aGUgcGFnZVxcbiAgKiAgIHN0cnVjdC5cXG4gICpcXG4tICogLSBQb2ludGVyOiBVbnVzZWQgeWV0LiBgMGIxMDBgIGlzIHJlc2VydmVkIGZvciBwb3RlbnRpYWwgcG9pbnRlciB1c2FnZVxcbi0gKiAgIGJlY2F1c2Ugb25seSB0aGUgbG93ZXIgdGhyZWUgYml0cyBjYW4gYmUgdXNlZCBhcyBhIG1hcmtlciBmb3IgOCBieXRlc1xcbi0gKiAgIGFsaWduZWQgcG9pbnRlcnMuXFxuKyAqIC0gUG9pbnRlcjogU3RvcmVzIGEgZGlyZWN0IHBvaW50ZXIgdG8gYSB6c3dhcF9lbnRyeSB3aGVuIHRoZSBzd2FwIHNsb3Qnc1xcbisgKiAgIGNvbXByZXNzZWQgZGF0YSByZXNpZGVzIGluIHpzd2FwLiBUaGUgc3dhcCBjb3VudCAoaWYgYW55KSBpcyBzdG9yZWQgaW5cXG4rICogICB0aGUgenN3YXBfZW50cnkgc3RydWN0IHJhdGhlciB0aGFuIGlubGluZSwgc2luY2UgdGhlIHBvaW50ZXIgb2NjdXBpZXNcXG4rICogICBhbGwgdXBwZXIgYml0cy4gYDBiMTAwYCBpcyB1c2VkIGFzIHRoZSBtYXJrZXIgYmVjYXVzZSB6c3dhcF9lbnRyeVxcbisgKiAgIHBvaW50ZXJzIGFyZSBhdCBsZWFzdCA4LWJ5dGUgYWxpZ25lZCwgbGVhdmluZyB0aGUgbG93ZXIgdGhyZWUgYml0cyBmcmVlLlxcbiAgKlxcbiAgKiAtIEJhZDogU3dhcCBzbG90IGlzIHJlc2VydmVkLCBwcm90ZWN0cyBzd2FwIGhlYWRlciBvciBob2xlcyBvbiBzd2FwIGRldmljZXMuXFxuICAqL1xcbkBAIC03OCw2ICs4MCw5IEBAIHN0cnVjdCBzd2FwX21lbWNnX3RhYmxlIHtcXG4gLyogVGhlIGZpcnN0IGZsYWcgaXMgemVybyBiaXQgKFNXQVBfVEFCTEVfSEFTX1pFUk9GTEFHKSAqL1xcbiAjZGVmaW5lIFNXUF9UQl9aRVJPX0ZMQUdcXHRCSVQoQklUU19QRVJfTE9ORyAtIFNXUF9UQl9GTEFHU19CSVRTKVxcbiBcXG4rLyogUG9pbnRlcjogenN3YXBfZW50cnkgcG9pbnRlciBzdG9yZWQgZGlyZWN0bHksIGVuZHMgd2l0aCAwYjEwMCAqL1xcbisjZGVmaW5lIFNXUF9UQl9QT0lOVEVSX01BUktcXHQwYjEwMFVMXFxuK1xcbiAvKiBCYWQgc2xvdDogZW5kcyB3aXRoIDBiMTAwMCBhbmQgcmVzdHMgb2YgYml0cyBhcmUgYWxsIDEgKi9cXG4gI2RlZmluZSBTV1BfVEJfQkFEXFx0XFx0KCh+MFVMKSBcXHUwMDNjXFx1MDAzYyAzKVxcbiBcXG5AQCAtMTY2LDYgKzE3MSwxMSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX2JhZCh1bnNpZ25lZCBsb25nIHN3cF90YilcXG4gXFx0cmV0dXJuIHN3cF90YiA9PSBTV1BfVEJfQkFEO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX3BvaW50ZXIodW5zaWduZWQgbG9uZyBzd3BfdGIpXFxuK3tcXG4rXFx0cmV0dXJuIChzd3BfdGIgXFx1MDAyNiAoQklUKDMpIC0gMSkpID09IFNXUF9UQl9QT0lOVEVSX01BUks7XFxuK31cXG4rXFxuIHN0YXRpYyBpbmxpbmUgYm9vbCBzd3BfdGJfaXNfY291bnRhYmxlKHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbiB7XFxuIFxcdHJldHVybiAoc3dwX3RiX2lzX3NoYWRvdyhzd3BfdGIpIHx8IHN3cF90Yl9pc19mb2xpbyhzd3BfdGIpIHx8XFxuQEAgLTE4OCw2ICsxOTgsMjMgQEAgc3RhdGljIGlubGluZSB2b2lkICpzd3BfdGJfdG9fc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbiBcXHRyZXR1cm4gKHZvaWQgKikoc3dwX3RiIFxcdTAwMjYgflNXUF9UQl9GTEFHU19NQVNLKTtcXG4gfVxcbiBcXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvaW50ZXJfdG9fc3dwX3RiKHZvaWQgKnB0cilcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHZhbCA9ICh1bnNpZ25lZCBsb25nKXB0cjtcXG4rXFxuK1xcdEJVSUxEX0JVR19PTihzaXplb2YodW5zaWduZWQgbG9uZykgIT0gc2l6ZW9mKHZvaWQgKikpO1xcbitcXHQvKiBQb2ludGVycyBhcmUgOC1ieXRlIGFsaWduZWQsIGxvdyAzIGJpdHMgbXVzdCBiZSBjbGVhciAqL1xcbitcXHRWTV9XQVJOX09OX09OQ0UodmFsIFxcdTAwMjYgKEJJVCgzKSAtIDEpKTtcXG4rXFx0cmV0dXJuIHZhbCB8IFNXUF9UQl9QT0lOVEVSX01BUks7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3dwX3RiX3RvX3BvaW50ZXIodW5zaWduZWQgbG9uZyBzd3BfdGIpXFxuK3tcXG4rXFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSk7XFxuK1xcdC8qIENsZWFyIHRoZSBsb3cgMy1iaXQgbWFya2VyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi9cXG4rXFx0cmV0dXJuICh2b2lkICopKHN3cF90YiBcXHUwMDI2IH4oKHVuc2lnbmVkIGxvbmcpKEJJVCgzKSAtIDEpKSk7XFxuK31cXG4rXFxuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpXFxuIHtcXG4gXFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKTtcXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmNcXG5pbmRleCBhNjAyZTU4MjA1MTNhOC4uMTg5MjVlNDYyNTcxYjEgMTAwNjQ0XFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xcbisrKyBiL21tL3N3YXBmaWxlLmNcXG5AQCAtOTM1LDcgKzkzNSw4IEBAIHN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRucl9wYWdlcyA9IDEgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuIFxcdFxcdHN3YXBfY2x1c3Rlcl9hc3NlcnRfZW1wdHkoY2ksIGNpX29mZiwgbnJfcGFnZXMsIGZhbHNlKTtcXG4gXFx0XFx0X19zd2FwX2NhY2hlX2FkZF9mb2xpbyhjaSwgZm9saW8sIHN3cF9lbnRyeShzaS1cXHUwMDNldHlwZSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGNpX29mZiArIGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSkpKTtcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGNpX29mZiArIGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSkpLFxcbitcXHRcXHRcXHRcXHQgICAgICAgTlVMTCk7XFxuIFxcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfSElCRVJOQVRJT04pKSB7XFxuIFxcdFxcdG9yZGVyID0gMDtcXG4gXFx0XFx0bnJfcGFnZXMgPSAxO1xcbkBAIC0xNTM2LDI1ICsxNTM3LDUxIEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXG4gXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2Y2ktXFx1MDAzZWxvY2spO1xcbiBcXHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xcbitcXG4rXFx0LyogUG9pbnRlciBlbnRyaWVzIHN0b3JlIGNvdW50IGluIHRoZSB6c3dhcF9lbnRyeSBzdHJ1Y3QgKi9cXG4rXFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcXG4rXFx0XFx0enN3YXBfc3dwX3RiX3B1dF9jb3VudChzd3BfdGIsIGNpLCBjaV9vZmYpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuIFxcdGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7XFxuIFxcbiBcXHRWTV9XQVJOX09OX09OQ0UoY291bnQgXFx1MDAzYz0gMCk7XFxuIFxcdFZNX1dBUk5fT05fT05DRShjb3VudCBcXHUwMDNlIFNXUF9UQl9DT1VOVF9NQVgpO1xcbi1cXG4tXFx0aWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHtcXG4tXFx0XFx0Y291bnQgPSBjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XFxuLVxcdFxcdC8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi9cXG4tXFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFxcdTAwM2MgU1dQX1RCX0NPVU5UX01BWCk7XFxuLVxcdFxcdGNvdW50LS07XFxuLVxcdFxcdGlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7XFxuLVxcdFxcdFxcdGNpLVxcdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IDA7XFxuLVxcdFxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgX19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xcbitcXHRcXHRpZiAoY291bnQgPT0gU1dQX1RCX0NPVU5UX01BWCkge1xcbitcXHRcXHRcXHRpZiAoIWNpLVxcdTAwM2VleHRlbmRfdGFibGUpIHtcXG4rXFx0XFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0XFx0ICogTUFYIHdpdGhvdXQgZXh0ZW5kX3RhYmxlOiBNQVggaXMgdGhlIHJlYWxcXG4rXFx0XFx0XFx0XFx0ICogY291bnQuICBEZWNyZW1lbnQgYW5kIHdyaXRlIGJhY2sgaW5saW5lLlxcbitcXHRcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0XFx0Y291bnQtLTtcXG4rXFx0XFx0XFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxcbitcXHRcXHRcXHRcXHRcXHRfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7XFxuK1xcdFxcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdFxcdCAqIE1BWCB3aXRoIGV4dGVuZF90YWJsZTogcmVhbCBjb3VudCBsaXZlcyBpblxcbitcXHRcXHRcXHRcXHQgKiBjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0uICBQdWxsLCBkZWNyZW1lbnRcXG4rXFx0XFx0XFx0XFx0ICogaXQsIGFuZCBlaXRoZXIgbW92ZSBpdCBiYWNrIGlubGluZSAoaWYgbm93XFxuK1xcdFxcdFxcdFxcdCAqIGZpdHMpIG9yIHdyaXRlIGl0IGJhY2sgdG8gdGhlIGV4dGVuZCB0YWJsZS5cXG4rXFx0XFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdFxcdGNvdW50ID0gY2ktXFx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xcbitcXHRcXHRcXHRcXHQvKiBPdmVyZmxvdyBzdGFydHMgd2l0aCBTV1BfVEJfQ09VTlRfTUFYICovXFxuK1xcdFxcdFxcdFxcdFZNX1dBUk5fT05fT05DRShjb3VudCBcXHUwMDNjIFNXUF9UQl9DT1VOVF9NQVgpO1xcbitcXHRcXHRcXHRcXHRjb3VudC0tO1xcbitcXHRcXHRcXHRcXHRpZiAoY291bnQgPT0gKFNXUF9UQl9DT1VOVF9NQVggLSAxKSkge1xcbitcXHRcXHRcXHRcXHRcXHRjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwO1xcbitcXHRcXHRcXHRcXHRcXHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdF9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgY291bnQpKTtcXG4rXFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0XFx0XFx0Y2ktXFx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0fVxcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcXG4rXFx0XFx0XFx0LyogY291bnQgXFx1MDAzYyBNQVg6IHNpbXBsZSBpbmxpbmUgZGVjcmVtZW50ICovXFxuK1xcdFxcdFxcdGNvdW50LS07XFxuK1xcdFxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZixcXG4rXFx0XFx0XFx0XFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xcbiBcXHRcXHR9XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgX19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCAtLWNvdW50KSk7XFxuLVxcdH1cXG4gXFxuIFxcdC8qXFxuIFxcdCAqIGBTV1BfVEJfQ09VTlRfTUFYIC0gMWAgdHJpZ2dlcnMgZXh0ZW5kIHRhYmxlIGFsbG9jYXRpb24uIElmIHRoZVxcbkBAIC0xNTk2LDcgKzE2MjMsMTggQEAgc3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0Y2lfZW5kID0gY2lfb2ZmICsgbnI7XFxuIFxcdGRvIHtcXG4gXFx0XFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcXG4tXFx0XFx0aWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFBvaW50ZXIgZW50cmllcyBzdG9yZSBjb3VudCBpbiB0aGUgenN3YXBfZW50cnk7XFxuK1xcdFxcdCAqIGhhbmRsZSB0aGVtIGJlZm9yZSBzd3BfdGJfZ2V0X2NvdW50ICh3aGljaCByZXR1cm5zXFxuK1xcdFxcdCAqIC1FSU5WQUwgZm9yIG5vbi1jb3VudGFibGUgdHlwZXMpLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcXG4rXFx0XFx0XFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XFxuK1xcdFxcdFxcdFxcdGlmIChjaV9iYXRjaCA9PSAtMSlcXG4rXFx0XFx0XFx0XFx0XFx0Y2lfYmF0Y2ggPSBjaV9vZmY7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH0gZWxzZSBpZiAoc3dwX3RiX2dldF9jb3VudChzd3BfdGIpID09IDEpIHtcXG4gXFx0XFx0XFx0LyogY291bnQgPT0gMSBhbmQgbm9uLWNhY2hlZCBzbG90cyB3aWxsIGJlIGJhdGNoIGZyZWVkLiAqL1xcbiBcXHRcXHRcXHRpZiAoIXN3cF90Yl9pc19mb2xpbyhzd3BfdGIpKSB7XFxuIFxcdFxcdFxcdFxcdGlmIChjaV9iYXRjaCA9PSAtMSlcXG5AQCAtMTY0Nyw2ICsxNjg1LDExIEBAIHN0YXRpYyBpbnQgX19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5KHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuIFxcdC8qIEJhZCBvciBzcGVjaWFsIHNsb3RzIGNhbid0IGJlIGhhbmRsZWQgKi9cXG4gXFx0aWYgKFdBUk5fT05fT05DRShzd3BfdGJfaXNfYmFkKHN3cF90YikpKVxcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qIFBvaW50ZXIgZW50cmllcyBzdG9yZSBjb3VudCBpbiB0aGUgenN3YXBfZW50cnkgc3RydWN0ICovXFxuK1xcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxcbitcXHRcXHRyZXR1cm4genN3YXBfc3dwX3RiX2R1cF9jb3VudChzd3BfdGIsIGNpLCBjaV9vZmYpO1xcbitcXG4gXFx0Y291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcXG4gXFx0LyogTXVzdCBiZSBlaXRoZXIgY2FjaGVkIG9yIGhhdmUgYSBjb3VudCBhbHJlYWR5ICovXFxuIFxcdGlmIChXQVJOX09OX09OQ0UoIWNvdW50IFxcdTAwMjZcXHUwMDI2ICFzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSkpXFxuQEAgLTE5MjMsMTMgKzE5NjYsMjYgQEAgdm9pZCBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRvbGRfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBGcmVlaW5nIGlzIGRvbmUgYWZ0ZXIgcmVsZWFzZSBvZiB0aGUgbGFzdCBzd2FwIGNvdW50XFxuLVxcdFxcdCAqIHJlZiwgb3IgYWZ0ZXIgc3dhcCBjYWNoZSBpcyBkcm9wcGVkXFxuK1xcdFxcdCAqIHJlZiwgb3IgYWZ0ZXIgc3dhcCBjYWNoZSBpcyBkcm9wcGVkLiBBIFBvaW50ZXIgZW50cnlcXG4rXFx0XFx0ICogbWVhbnMgenN3YXAgaGFzIGEgY29tcHJlc3NlZCBjb3B5OyB0aGUgeGFycmF5IHN0aWxsXFxuK1xcdFxcdCAqIGhvbGRzIHRoZSBlbnRyeSBhbmQgenN3YXBfaW52YWxpZGF0ZSB3aWxsIGZyZWUgaXQuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRWTV9XQVJOX09OKCFzd3BfdGJfaXNfc2hhZG93KG9sZF90YikgfHwgX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikgXFx1MDAzZSAxKTtcXG4rXFx0XFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpIHtcXG4rXFx0XFx0XFx0Vk1fV0FSTl9PTih6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikgXFx1MDAzZSAxKTtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogRnJlZSB0aGUgenN3YXAgZW50cnkgbm93IHVuZGVyIGNpLVxcdTAwM2Vsb2NrIHdoaWxlXFxuK1xcdFxcdFxcdCAqIHRoZSBQb2ludGVyIGlzIHN0aWxsIGluIHRoZSBzd2FwIHRhYmxlLiAgT25jZVxcbitcXHRcXHRcXHQgKiB3ZSBudWxsIHRoZSBzbG90LCB0aGUgZW50cnkgd291bGQgYmUgbGVha2VkLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0enN3YXBfZW50cnlfZnJlZShzd3BfdGJfdG9fcG9pbnRlcihvbGRfdGIpKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpIHx8XFxuK1xcdFxcdFxcdFxcdCAgIF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpIFxcdTAwM2UgMSk7XFxuK1xcdFxcdH1cXG4gXFxuIFxcdFxcdC8qIFJlc2V0dGluZyB0aGUgc2xvdCB0byBOVUxMIGFsc28gY2xlYXJzIHRoZSBpbmxpbmUgZmxhZ3MuICovXFxuIFxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgbnVsbF90b19zd3BfdGIoKSk7XFxuLVxcdFxcdGlmICghU1dBUF9UQUJMRV9IQVNfWkVST0ZMQUcpXFxuK1xcdFxcdGlmICghU1dBUF9UQUJMRV9IQVNfWkVST0ZMQUcgXFx1MDAyNlxcdTAwMjYgIXN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXFxuIFxcdFxcdFxcdF9fc3dhcF90YWJsZV9jbGVhcl96ZXJvKGNpLCBjaV9vZmYpO1xcbiBcXG4gXFx0XFx0LypcXG5AQCAtMTk2MSw4ICsyMDE3LDExIEBAIGludCBfX3N3YXBfY291bnQoc3dwX2VudHJ5X3QgZW50cnkpXFxuIHtcXG4gXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IF9fc3dhcF9lbnRyeV90b19jbHVzdGVyKGVudHJ5KTtcXG4gXFx0dW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcXG4gXFxuLVxcdHJldHVybiBzd3BfdGJfZ2V0X2NvdW50KF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpO1xcbitcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSlcXG4rXFx0XFx0cmV0dXJuIHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcXG4rXFx0cmV0dXJuIHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTE5ODAsNiArMjAzOSw4IEBAIGJvb2wgc3dhcF9lbnRyeV9zd2FwcGVkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3dwX2VudHJ5X3QgZW50cnkpXFxuIFxcdHN3cF90YiA9IHN3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTtcXG4gXFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XFxuIFxcbitcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSlcXG4rXFx0XFx0cmV0dXJuIHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcXHUwMDNlIDA7XFxuIFxcdHJldHVybiBzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXFx1MDAzZSAwO1xcbiB9XFxuIFxcbkBAIC0yMDIwLDcgKzIwODEsNyBAQCBpbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSlcXG4gICpcXG4gICogQ29udGV4dDogQ2FsbGVyIG11c3QgZW5zdXJlIHRoZSBmb2xpbyBpcyBsb2NrZWQgYW5kIGluIHRoZSBzd2FwIGNhY2hlLlxcbiAgKi9cXG4tc3RhdGljIGJvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbitib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4ge1xcbiBcXHRzd3BfZW50cnlfdCBlbnRyeSA9IGZvbGlvLVxcdTAwM2Vzd2FwO1xcbiBcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xcbkBAIC0yNTU2LDggKzI2MTcsMTIgQEAgc3RhdGljIGludCB1bnVzZV9wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxuIFxcdFxcdGlmICghZm9saW8pIHtcXG4gXFx0XFx0XFx0c3dwX3RiID0gc3dhcF90YWJsZV9nZXQoX19zd2FwX2VudHJ5X3RvX2NsdXN0ZXIoZW50cnkpLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRzd3BfY2x1c3Rlcl9vZmZzZXQoZW50cnkpKTtcXG4tXFx0XFx0XFx0aWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcXHUwMDNjPSAwKVxcbitcXHRcXHRcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkge1xcbitcXHRcXHRcXHRcXHRpZiAoenN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpIFxcdTAwM2M9IDApXFxuK1xcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9IGVsc2UgaWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcXHUwMDNjPSAwKSB7XFxuIFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiBcXHRcXHR9XFxuIFxcbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xcbmluZGV4IDc2MWNkNjk5ZTBhM2U2Li5mOTc2MmQwYTU5NmFiNCAxMDA2NDRcXG4tLS0gYS9tbS96c3dhcC5jXFxuKysrIGIvbW0venN3YXAuY1xcbkBAIC0zOCw2ICszOCw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC96c21hbGxvYy5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcInN3YXAuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInN3YXBfdGFibGUuaFxcXCJcXG4gI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuIFxcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXFxuQEAgLTE4Miw2ICsxODMsMTAgQEAgc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqenN3YXBfc2hyaW5rZXI7XFxuICAqICAgICAgICAgICAgICB3cml0ZWJhY2sgbG9naWMuIFRoZSBlbnRyeSBpcyBvbmx5IHJlY2xhaW1lZCBieSB0aGUgd3JpdGViYWNrXFxuICAqICAgICAgICAgICAgICBsb2dpYyBpZiByZWZlcmVuY2VkIGlzIHVuc2V0LiBTZWUgY29tbWVudHMgaW4gdGhlIHNocmlua2VyXFxuICAqICAgICAgICAgICAgICBzZWN0aW9uIGZvciBjb250ZXh0LlxcbisgKiBzd3BfdGJfdmFsIC0gdGhlIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgc2F2ZWQgd2hlbiB0aGlzIHpzd2FwX2VudHJ5XFxuKyAqICAgICAgICAgICAgICByZXBsYWNlZCBhIFNoYWRvdyBvciBQRk4gZW50cnkuIEl0IHByZXNlcnZlcyB0aGUgc3dhcCBjb3VudCxcXG4rICogICAgICAgICAgICAgIHplcm8gZmxhZywgYW5kIHdvcmtpbmcgc2V0IHNoYWRvdyBpbmZvcm1hdGlvbiAoU0hBRE9XX1ZBTClcXG4rICogICAgICAgICAgICAgIHRoYXQgdGhlIFNoYWRvdyBlbnRyeSBjYXJyaWVkLlxcbiAgKiBwb29sIC0gdGhlIHpzd2FwX3Bvb2wgdGhlIGVudHJ5J3MgZGF0YSBpcyBpblxcbiAgKiBoYW5kbGUgLSB6c21hbGxvYyBhbGxvY2F0aW9uIGhhbmRsZSB0aGF0IHN0b3JlcyB0aGUgY29tcHJlc3NlZCBwYWdlIGRhdGFcXG4gICogb2JqY2cgLSB0aGUgb2JqX2Nncm91cCB0aGF0IHRoZSBjb21wcmVzc2VkIG1lbW9yeSBpcyBjaGFyZ2VkIHRvXFxuQEAgLTE5MSwxNSArMTk2LDEzIEBAIHN0cnVjdCB6c3dhcF9lbnRyeSB7XFxuIFxcdHN3cF9lbnRyeV90IHN3cGVudHJ5O1xcbiBcXHR1bnNpZ25lZCBpbnQgbGVuZ3RoO1xcbiBcXHRib29sIHJlZmVyZW5jZWQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3dwX3RiX3ZhbDtcXG4gXFx0c3RydWN0IHpzd2FwX3Bvb2wgKnBvb2w7XFxuIFxcdHVuc2lnbmVkIGxvbmcgaGFuZGxlO1xcbiBcXHRzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2c7XFxuIFxcdHN0cnVjdCBsaXN0X2hlYWQgbHJ1O1xcbiB9O1xcbiBcXG4tc3RhdGljIHN0cnVjdCB4YXJyYXkgKnpzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdO1xcbi1zdGF0aWMgdW5zaWduZWQgaW50IG5yX3pzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdO1xcbi1cXG4gLyogUkNVLXByb3RlY3RlZCBpdGVyYXRpb24gKi9cXG4gc3RhdGljIExJU1RfSEVBRCh6c3dhcF9wb29scyk7XFxuIC8qIHByb3RlY3RzIHpzd2FwX3Bvb2xzIGxpc3QgbW9kaWZpY2F0aW9uICovXFxuQEAgLTIyNSwxNSArMjI4LDYgQEAgc3RhdGljIGJvb2wgenN3YXBfaGFzX3Bvb2w7XFxuICogaGVscGVycyBhbmQgZndkIGRlY2xhcmF0aW9uc1xcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xcbiBcXG4tLyogT25lIHN3YXAgYWRkcmVzcyBzcGFjZSBmb3IgZWFjaCA2NE0gc3dhcCBzcGFjZSAqL1xcbi0jZGVmaW5lIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQgMTRcXG4tI2RlZmluZSBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTICgxIFxcdTAwM2NcXHUwMDNjIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQpXFxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHhhcnJheSAqc3dhcF96c3dhcF90cmVlKHN3cF9lbnRyeV90IHN3cClcXG4te1xcbi1cXHRyZXR1cm4gXFx1MDAyNnpzd2FwX3RyZWVzW3N3cF90eXBlKHN3cCldW3N3cF9vZmZzZXQoc3dwKVxcbi1cXHRcXHRcXHUwMDNlXFx1MDAzZSBaU1dBUF9BRERSRVNTX1NQQUNFX1NISUZUXTtcXG4tfVxcbi1cXG4gI2RlZmluZSB6c3dhcF9wb29sX2RlYnVnKG1zZywgcClcXHRcXHRcXHRcXFxcXFxuIFxcdHByX2RlYnVnKFxcXCIlcyBwb29sICVzXFxcXG5cXFwiLCBtc2csIChwKS1cXHUwMDNldGZtX25hbWUpXFxuIFxcbkBAIC03NjIsNyArNzU2LDcgQEAgc3RhdGljIHZvaWQgenN3YXBfZW50cnlfY2FjaGVfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KVxcbiAgKiBDYXJyaWVzIG91dCB0aGUgY29tbW9uIHBhdHRlcm4gb2YgZnJlZWluZyBhbiBlbnRyeSdzIHpzbWFsbG9jIGFsbG9jYXRpb24sXFxuICAqIGZyZWVpbmcgdGhlIGVudHJ5IGl0c2VsZiwgYW5kIGRlY3JlbWVudGluZyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBwYWdlcy5cXG4gICovXFxuLXN0YXRpYyB2b2lkIHpzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSlcXG4rdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXFxuIHtcXG4gXFx0enN3YXBfbHJ1X2RlbChcXHUwMDI2enN3YXBfbGlzdF9scnUsIGVudHJ5KTtcXG4gXFx0enNfZnJlZShlbnRyeS1cXHUwMDNlcG9vbC1cXHUwMDNlenNfcG9vbCwgZW50cnktXFx1MDAzZWhhbmRsZSk7XFxuQEAgLTk4NywxMSArOTgxLDEyIEBAIHN0YXRpYyBib29sIHpzd2FwX2RlY29tcHJlc3Moc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4gc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSxcXG4gXFx0XFx0XFx0XFx0IHN3cF9lbnRyeV90IHN3cGVudHJ5KVxcbiB7XFxuLVxcdHN0cnVjdCB4YXJyYXkgKnRyZWU7XFxuIFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3BlbnRyeSk7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuIFxcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2w7XFxuIFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4rXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4rXFx0dW5zaWduZWQgbG9uZyBzd3BfdGI7XFxuIFxcdGludCByZXQgPSAwO1xcbiBcXG4gXFx0LyogdHJ5IHRvIGFsbG9jYXRlIHN3YXAgY2FjaGUgZm9saW8gKi9cXG5AQCAtOTk5LDkgKzk5NCwyNSBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LFxcbiBcXHRpZiAoIXNpKVxcbiBcXHRcXHRyZXR1cm4gLUVFWElTVDtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFZlcmlmeSB0aGUgc3dhcCB0YWJsZSBQb2ludGVyIGVudHJ5IHN0aWxsIHJlZmVyZW5jZXMgdGhpc1xcbitcXHQgKiB6c3dhcF9lbnRyeS4gSWYgdGhlIGVudHJ5IHdhcyBpbnZhbGlkYXRlZCBvciByZXBsYWNlZCBieSBhXFxuK1xcdCAqIGNvbmN1cnJlbnQgc3RvcmUsIHRoZSBQb2ludGVyIHdpbGwgYmUgZ29uZSBvciBwb2ludCBlbHNld2hlcmUuXFxuK1xcdCAqL1xcbitcXHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgb2Zmc2V0KTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuK1xcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xcbitcXHRpZiAoIXN3cF90Yl9pc19wb2ludGVyKHN3cF90YikgfHxcXG4rXFx0ICAgIHN3cF90Yl90b19wb2ludGVyKHN3cF90YikgIT0gZW50cnkpIHtcXG4rXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFx0XFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdH1cXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFxuIFxcdG1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7XFxuIFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLFxcbi1cXHRcXHRcXHRcXHQgICAgICAgTk9fSU5URVJMRUFWRV9JTkRFWCk7XFxuK1xcdFxcdFxcdFxcdCAgICAgICBOT19JTlRFUkxFQVZFX0lOREVYLCBOVUxMKTtcXG4gXFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4gXFxuIFxcdC8qXFxuQEAgLTEwMTUsMjcgKzEwMjYsMTUgQEAgc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSxcXG4gXFx0XFx0cmV0dXJuIFBUUl9FUlIoZm9saW8pO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogZm9saW8gaXMgbG9ja2VkLCBhbmQgdGhlIHN3YXBjYWNoZSBpcyBub3cgc2VjdXJlZCBhZ2FpbnN0XFxuLVxcdCAqIGNvbmN1cnJlbnQgc3dhcHBpbmcgdG8gYW5kIGZyb20gdGhlIHNsb3QsIGFuZCBjb25jdXJyZW50XFxuLVxcdCAqIHN3YXBvZmYgc28gd2UgY2FuIHNhZmVseSBkZXJlZmVyZW5jZSB0aGUgenN3YXAgdHJlZSBoZXJlLlxcbi1cXHQgKiBWZXJpZnkgdGhhdCB0aGUgc3dhcCBlbnRyeSBoYXNuJ3QgYmVlbiBpbnZhbGlkYXRlZCBhbmQgcmVjeWNsZWRcXG4tXFx0ICogYmVoaW5kIG91ciBiYWNrcywgdG8gYXZvaWQgb3ZlcndyaXRpbmcgYSBuZXcgc3dhcCBmb2xpbyB3aXRoXFxuLVxcdCAqIG9sZCBjb21wcmVzc2VkIGRhdGEuIE9ubHkgd2hlbiB0aGlzIGlzIHN1Y2Nlc3NmdWwgY2FuIHRoZSBlbnRyeVxcbi1cXHQgKiBiZSBkZXJlZmVyZW5jZWQuXFxuK1xcdCAqIFRoZSBmb2xpbyBpcyBub3cgbG9ja2VkIGFuZCBpbiBzd2FwIGNhY2hlLCBzbyBjb25jdXJyZW50XFxuK1xcdCAqIHN0b3JlcyBhcmUgYmxvY2tlZC4gX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyBhbHJlYWR5XFxuK1xcdCAqIG92ZXJ3cm90ZSB0aGUgUG9pbnRlciBlbnRyeSB3aXRoIGEgUEZOLlxcbiBcXHQgKi9cXG4tXFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BlbnRyeSk7XFxuLVxcdGlmIChlbnRyeSAhPSB4YV9sb2FkKHRyZWUsIG9mZnNldCkpIHtcXG4tXFx0XFx0cmV0ID0gLUVOT01FTTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4tXFxuIFxcdGlmICghenN3YXBfZGVjb21wcmVzcyhlbnRyeSwgZm9saW8pKSB7XFxuIFxcdFxcdHJldCA9IC1FSU87XFxuIFxcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbi1cXHR4YV9lcmFzZSh0cmVlLCBvZmZzZXQpO1xcbi1cXG4gXFx0Y291bnRfdm1fZXZlbnQoWlNXUFdCKTtcXG4gXFx0aWYgKGVudHJ5LVxcdTAwM2VvYmpjZylcXG4gXFx0XFx0Y291bnRfb2JqY2dfZXZlbnRzKGVudHJ5LVxcdTAwM2VvYmpjZywgWlNXUFdCLCAxKTtcXG5AQCAtMTEwNSwzNiArMTEwNCwyMiBAQCBzdGF0aWMgZW51bSBscnVfc3RhdHVzIHNocmlua19tZW1jZ19jYihzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCBzdHJ1Y3QgbGlzdF9scnVfb1xcbiBcXHR9XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBBcyBzb29uIGFzIHdlIGRyb3AgdGhlIExSVSBsb2NrLCB0aGUgZW50cnkgY2FuIGJlIGZyZWVkIGJ5XFxuLVxcdCAqIGEgY29uY3VycmVudCBpbnZhbGlkYXRpb24uIFRoaXMgbWVhbnMgdGhlIGZvbGxvd2luZzpcXG4tXFx0ICpcXG4tXFx0ICogMS4gV2UgZXh0cmFjdCB0aGUgc3dwX2VudHJ5X3QgdG8gdGhlIHN0YWNrLCBhbGxvd2luZ1xcbi1cXHQgKiAgICB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSB0byBwaW4gdGhlIHN3YXAgZW50cnkgYW5kXFxuLVxcdCAqICAgIHRoZW4gdmFsaWRhdGUgdGhlIHpzd2FwIGVudHJ5IGFnYWluc3QgdGhhdCBzd2FwIGVudHJ5J3NcXG4tXFx0ICogICAgdHJlZSB1c2luZyBwb2ludGVyIHZhbHVlIGNvbXBhcmlzb24uIE9ubHkgd2hlbiB0aGF0XFxuLVxcdCAqICAgIGlzIHN1Y2Nlc3NmdWwgY2FuIHRoZSBlbnRyeSBiZSBkZXJlZmVyZW5jZWQuXFxuLVxcdCAqXFxuLVxcdCAqIDIuIFVzdWFsbHksIG9iamVjdHMgYXJlIHRha2VuIG9mZiB0aGUgTFJVIGZvciByZWNsYWltLiBJblxcbi1cXHQgKiAgICB0aGlzIGNhc2UgdGhpcyBpc24ndCBwb3NzaWJsZSwgYmVjYXVzZSBpZiByZWNsYWltIGZhaWxzXFxuLVxcdCAqICAgIGZvciB3aGF0ZXZlciByZWFzb24sIHdlIGhhdmUgbm8gbWVhbnMgb2Yga25vd2luZyBpZiB0aGVcXG4tXFx0ICogICAgZW50cnkgaXMgYWxpdmUgdG8gcHV0IGl0IGJhY2sgb24gdGhlIExSVS5cXG4rXFx0ICogQWZ0ZXIgd2UgZHJvcCB0aGUgTFJVIGxvY2ssIHRoZSBlbnRyeSBtYXkgYmUgZnJlZWQgYnkgYVxcbitcXHQgKiBjb25jdXJyZW50IHN3YXAgc2xvdCBmcmVlLiAgVGhpcyBpcyBzYWZlIGJlY2F1c2VcXG4rXFx0ICogenN3YXBfd3JpdGViYWNrX2VudHJ5KCkgcmVjaGVja3MgdGhlIHN3YXAgdGFibGUgdW5kZXJcXG4rXFx0ICogY2ktXFx1MDAzZWxvY2sgYmVmb3JlIGRlcmVmZXJlbmNpbmcgZW50cnk7IGlmIHRoZSBQb2ludGVyIGlzXFxuK1xcdCAqIGdvbmUgaXQgYmFpbHMgb3V0LlxcbiBcXHQgKlxcbi1cXHQgKiAgICBTbyByb3RhdGUgaXQgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrLiBJZiB0aGUgZW50cnkgaXNcXG4tXFx0ICogICAgd3JpdHRlbiBiYWNrIG9yIGludmFsaWRhdGVkLCB0aGUgZnJlZSBwYXRoIHdpbGwgdW5saW5rXFxuLVxcdCAqICAgIGl0LiBGb3IgZmFpbHVyZXMsIHJvdGF0aW9uIGlzIHRoZSByaWdodCB0aGluZyBhcyB3ZWxsLlxcbi1cXHQgKlxcbi1cXHQgKiAgICBUZW1wb3JhcnkgZmFpbHVyZXMsIHdoZXJlIHRoZSBzYW1lIGVudHJ5IHNob3VsZCBiZSB0cmllZFxcbi1cXHQgKiAgICBhZ2FpbiBpbW1lZGlhdGVseSwgYWxtb3N0IG5ldmVyIGhhcHBlbiBmb3IgdGhpcyBzaHJpbmtlci5cXG4tXFx0ICogICAgV2UgZG9uJ3QgZG8gYW55IHRyeWxvY2tpbmc7IC1FTk9NRU0gY29tZXMgY2xvc2VzdCxcXG4tXFx0ICogICAgYnV0IHRoYXQncyBleHRyZW1lbHkgcmFyZSBhbmQgZG9lc24ndCBoYXBwZW4gc3B1cmlvdXNseVxcbi1cXHQgKiAgICBlaXRoZXIuIERvbid0IGJvdGhlciBkaXN0aW5ndWlzaGluZyB0aGlzIGNhc2UuXFxuK1xcdCAqIFJvdGF0ZSB0aGUgZW50cnkgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrOiBpZiBpdCBnZXRzXFxuK1xcdCAqIHdyaXR0ZW4gYmFjayBvciBpbnZhbGlkYXRlZCB0aGUgZnJlZSBwYXRoIHdpbGwgdW5saW5rXFxuK1xcdCAqIGl0IGZyb20gdGhlIExSVS4gIEZvciBmYWlsdXJlcyByb3RhdGlvbiBpcyBmaW5lLlxcbiBcXHQgKi9cXG4gXFx0bGlzdF9tb3ZlX3RhaWwoaXRlbSwgXFx1MDAyNmwtXFx1MDAzZWxpc3QpO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogT25jZSB0aGUgbHJ1IGxvY2sgaXMgZHJvcHBlZCwgdGhlIGVudHJ5IG1pZ2h0IGdldCBmcmVlZC4gVGhlXFxuLVxcdCAqIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2ssIGFuZCBlbnRyeSBpc24ndCBkZXJlZidkIGFnYWluXFxuLVxcdCAqIHVudGlsIHRoZSBlbnRyeSBpcyB2ZXJpZmllZCB0byBzdGlsbCBiZSBhbGl2ZSBpbiB0aGUgdHJlZS5cXG4rXFx0ICogVGhlIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2sgc28gd2UgY2FuIHBpbiB0aGUgc3dhcFxcbitcXHQgKiBkZXZpY2UgYW5kIHZhbGlkYXRlIHRoZSBlbnRyeSdzIHN3YXAgdGFibGUgUG9pbnRlciB1bmRlclxcbitcXHQgKiBjaS1cXHUwMDNlbG9jayBpbiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKS5cXG4gXFx0ICovXFxuIFxcdHN3cGVudHJ5ID0gZW50cnktXFx1MDAzZXN3cGVudHJ5O1xcbiBcXG5AQCAtMTM5OCw3ICsxMzgzLDExIEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXFxuIFxcdFxcdFxcdCAgICAgc3RydWN0IHpzd2FwX3Bvb2wgKnBvb2wpXFxuIHtcXG4gXFx0c3dwX2VudHJ5X3QgcGFnZV9zd3BlbnRyeSA9IHBhZ2Vfc3dhcF9lbnRyeShwYWdlKTtcXG4tXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgKm9sZDtcXG4rXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgKm9sZCA9IE5VTEw7XFxuK1xcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XFxuK1xcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4rXFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHBhZ2Vfc3dwZW50cnkpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcXG4gXFxuIFxcdC8qIGFsbG9jYXRlIGVudHJ5ICovXFxuIFxcdGVudHJ5ID0genN3YXBfZW50cnlfY2FjaGVfYWxsb2MoR0ZQX0tFUk5FTCwgcGFnZV90b19uaWQocGFnZSkpO1xcbkBAIC0xNDEwLDMxICsxMzk5LDQ5IEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXFxuIFxcdGlmICghenN3YXBfY29tcHJlc3MocGFnZSwgZW50cnksIHBvb2wpKVxcbiBcXHRcXHRnb3RvIGNvbXByZXNzX2ZhaWxlZDtcXG4gXFxuLVxcdG9sZCA9IHhhX3N0b3JlKHN3YXBfenN3YXBfdHJlZShwYWdlX3N3cGVudHJ5KSxcXG4tXFx0XFx0ICAgICAgIHN3cF9vZmZzZXQocGFnZV9zd3BlbnRyeSksXFxuLVxcdFxcdCAgICAgICBlbnRyeSwgR0ZQX0tFUk5FTCk7XFxuLVxcdGlmICh4YV9pc19lcnIob2xkKSkge1xcbi1cXHRcXHRpbnQgZXJyID0geGFfZXJyKG9sZCk7XFxuLVxcbi1cXHRcXHRXQVJOX09OQ0UoZXJyICE9IC1FTk9NRU0sIFxcXCJ1bmV4cGVjdGVkIHhhcnJheSBlcnJvcjogJWRcXFxcblxcXCIsIGVycik7XFxuLVxcdFxcdHpzd2FwX3JlamVjdF9hbGxvY19mYWlsKys7XFxuLVxcdFxcdGdvdG8gc3RvcmVfZmFpbGVkO1xcbitcXHQvKlxcbitcXHQgKiBTdG9yZSB0aGUgenN3YXBfZW50cnkgcG9pbnRlciBpbiB0aGUgc3dhcCB0YWJsZSBhcyBhXFxuK1xcdCAqIFBvaW50ZXItdHlwZSBlbnRyeSwgcmVwbGFjaW5nIHRoZSBQRk4gb3IgU2hhZG93IGVudHJ5LlxcbitcXHQgKiBUaGUgZnVsbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlIChpbmNsdWRpbmcgd29ya2luZyBzZXRcXG4rXFx0ICogc2hhZG93KSBpcyBwcmVzZXJ2ZWQgaW4gZW50cnktXFx1MDAzZXN3cF90Yl92YWwuXFxuK1xcdCAqIEZvbGlvIGxvY2sgc2VyaWFsaXplcyBjb25jdXJyZW50IHN0b3Jlcy5cXG4rXFx0ICovXFxuK1xcdHNpID0gX19zd2FwX2VudHJ5X3RvX2luZm8ocGFnZV9zd3BlbnRyeSk7XFxuK1xcdGNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpO1xcbitcXHRzcGluX2xvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XFxuK1xcdGlmIChzd3BfdGJfaXNfY291bnRhYmxlKHN3cF90YikpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogU2F2ZSB0aGUgY29tcGxldGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZVxcbitcXHRcXHQgKiAoU2hhZG93IG9yIFBGTiksIHByZXNlcnZpbmcgc3dhcCBjb3VudCwgemVybyBmbGFnLFxcbitcXHRcXHQgKiBhbmQgd29ya2luZyBzZXQgc2hhZG93IGluZm9ybWF0aW9uLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0ZW50cnktXFx1MDAzZXN3cF90Yl92YWwgPSBzd3BfdGI7XFxuK1xcdH0gZWxzZSBpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBSZXBsYWNpbmcgYW4gZXhpc3RpbmcgUG9pbnRlciBlbnRyeSAoZS5nLiBmcm9tIGFcXG4rXFx0XFx0ICogcmVkaXJ0aWVkIGZvbGlvKS4gSW5oZXJpdCB0aGUgc2F2ZWQgc3dhcCB0YWJsZSB2YWx1ZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdG9sZCA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XFxuK1xcdFxcdGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsID0gb2xkLVxcdTAwM2Vzd3BfdGJfdmFsO1xcbiBcXHR9XFxuLVxcbitcXHRfX3N3YXBfdGFibGVfc2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSLFxcbitcXHRcXHRcXHQgcG9pbnRlcl90b19zd3BfdGIoZW50cnkpKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4gXFx0LypcXG4tXFx0ICogV2UgbWF5IGhhdmUgaGFkIGFuIGV4aXN0aW5nIGVudHJ5IHRoYXQgYmVjYW1lIHN0YWxlIHdoZW5cXG4tXFx0ICogdGhlIGZvbGlvIHdhcyByZWRpcnRpZWQgYW5kIG5vdyB0aGUgbmV3IHZlcnNpb24gaXMgYmVpbmdcXG4tXFx0ICogc3dhcHBlZCBvdXQuIEdldCByaWQgb2YgdGhlIG9sZC5cXG4rXFx0ICogSWYgd2UgaGFkIGFuIGV4aXN0aW5nIHpzd2FwIGVudHJ5IGZyb20gdGhlIHN3YXAgdGFibGVcXG4rXFx0ICogKGUuZy4gZnJvbSBhIHByZXZpb3VzIHJlZGlydGllZCBmb2xpbyksIGdldCByaWQgb2YgaXRcXG4rXFx0ICogb3V0c2lkZSB0aGUgbG9jay5cXG4gXFx0ICovXFxuIFxcdGlmIChvbGQpXFxuIFxcdFxcdHpzd2FwX2VudHJ5X2ZyZWUob2xkKTtcXG4gXFxuIFxcdC8qXFxuLVxcdCAqIFRoZSBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIHRoZSB0cmVlLCB0aGVyZSBpc1xcbi1cXHQgKiBubyBmdXJ0aGVyIHBvc3NpYmlsaXR5IG9mIGZhaWx1cmUuIEdyYWIgcmVmcyB0byB0aGUgcG9vbCBhbmQgb2JqY2csXFxuLVxcdCAqIGNoYXJnZSB6c3dhcCBtZW1vcnksIGFuZCBpbmNyZW1lbnQgenN3YXBfc3RvcmVkX3BhZ2VzLlxcbitcXHQgKiBUaGUgZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IGNvbXByZXNzZWQgYW5kIHN0b3JlZCBpbiB0aGUgc3dhcCB0YWJsZSxcXG4rXFx0ICogdGhlcmUgaXMgbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2xcXG4rXFx0ICogYW5kIG9iamNnLCBjaGFyZ2UgenN3YXAgbWVtb3J5LCBhbmQgaW5jcmVtZW50IHpzd2FwX3N0b3JlZF9wYWdlcy5cXG4gXFx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXFxuLVxcdCAqIHdoZW4gdGhlIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS5cXG4rXFx0ICogd2hlbiB0aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzd2FwIHRhYmxlLlxcbiBcXHQgKi9cXG4gXFx0enN3YXBfcG9vbF9nZXQocG9vbCk7XFxuIFxcdGlmIChvYmpjZykge1xcbkBAIC0xNDQ2LDggKzE0NTMsOCBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLFxcbiBcXHRcXHRhdG9taWNfbG9uZ19pbmMoXFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBXZSBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBlbnRyeSB3aGlsZSBpdCdzIGFscmVhZHkgaW4geGFycmF5Llxcbi1cXHQgKiBUaGlzIGlzIHNhZmUgYmVjYXVzZTpcXG4rXFx0ICogV2UgZmluaXNoIGluaXRpYWxpemluZyB0aGUgZW50cnkgd2hpbGUgaXQncyBhbHJlYWR5IGluIHRoZVxcbitcXHQgKiBzd2FwIHRhYmxlLiBUaGlzIGlzIHNhZmUgYmVjYXVzZTpcXG4gXFx0ICpcXG4gXFx0ICogMS4gQ29uY3VycmVudCBzdG9yZXMgYW5kIGludmFsaWRhdGlvbnMgYXJlIGV4Y2x1ZGVkIGJ5IGZvbGlvIGxvY2suXFxuIFxcdCAqXFxuQEAgLTE0NjYsOCArMTQ3Myw2IEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXFxuIFxcbiBcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuLXN0b3JlX2ZhaWxlZDpcXG4tXFx0enNfZnJlZShwb29sLVxcdTAwM2V6c19wb29sLCBlbnRyeS1cXHUwMDNlaGFuZGxlKTtcXG4gY29tcHJlc3NfZmFpbGVkOlxcbiBcXHR6c3dhcF9lbnRyeV9jYWNoZV9mcmVlKGVudHJ5KTtcXG4gXFx0cmV0dXJuIGZhbHNlO1xcbkBAIC0xNTQ2LDExICsxNTUxLDMxIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0XFx0dW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7XFxuIFxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbiBcXHRcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xcbi1cXHRcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xcbitcXHRcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xcbitcXHRcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcXG4gXFxuK1xcdFxcdHNpcyA9IF9fc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XFxuIFxcdFxcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KSB7XFxuLVxcdFxcdFxcdHRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XFxuLVxcdFxcdFxcdGVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0ICsgaW5kZXgpO1xcbitcXHRcXHRcXHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaXMsIG9mZnNldCArIGluZGV4KTtcXG4rXFx0XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdFxcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIChvZmZzZXQgKyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSKTtcXG4rXFx0XFx0XFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcXG4rXFx0XFx0XFx0XFx0ZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xcbitcXHRcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHRcXHQgKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzd2FwIHRhYmxlIGVudHJ5XFxuK1xcdFxcdFxcdFxcdCAqIChTaGFkb3cgb3IgUEZOKSB0aGF0IHdhcyBzYXZlZCB3aGVuIHRoZVxcbitcXHRcXHRcXHRcXHQgKiBQb2ludGVyIGVudHJ5IHdhcyBjcmVhdGVkLCByYXRoZXIgdGhhblxcbitcXHRcXHRcXHRcXHQgKiB6ZXJvaW5nIHRoZSBzbG90LiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHN3YXBcXG4rXFx0XFx0XFx0XFx0ICogY291bnQgYW5kIGZsYWdzIHNvIHRoZSBzd2FwIGNhY2hlIGZvbGlvXFxuK1xcdFxcdFxcdFxcdCAqIGNhbiBiZSBjb3JyZWN0bHkgY2xlYW5lZCB1cCBsYXRlci5cXG4rXFx0XFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIChvZmZzZXQgKyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgZW50cnktXFx1MDAzZXN3cF90Yl92YWwpO1xcbitcXHRcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRcXHRlbnRyeSA9IE5VTEw7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4gXFx0XFx0XFx0aWYgKGVudHJ5KVxcbiBcXHRcXHRcXHRcXHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcXG4gXFx0XFx0fVxcbkBAIC0xNTYyLDYgKzE1ODcsMTEgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiAvKipcXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcXG4gICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXFxuKyAqIEB6ZW50cnk6IHpzd2FwX2VudHJ5IHBvaW50ZXIgZXh0cmFjdGVkIGZyb20gc3dhcCB0YWJsZSwgb3IgTlVMTFxcbisgKlxcbisgKiBUaGUgenN3YXBfZW50cnkgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBzd2FwIHRhYmxlIFBvaW50ZXIgZW50cnkgYnlcXG4rICogX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyBiZWZvcmUgaXQgb3Zlcndyb3RlIHRoZSBlbnRyeSB3aXRoIGEgUEZOLlxcbisgKiBJZiBAemVudHJ5IGlzIE5VTEwsIHRoZSBzbG90IHdhcyBub3QgYmFja2VkIGJ5IHpzd2FwLlxcbiAgKlxcbiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmVcXG4gICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcXG5AQCAtMTU3OSwxMiArMTYwOSw5IEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gICogIC1FTk9FTlQ6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBub3QgaW4genN3YXAuIFRoZSBmb2xpbyByZW1haW5zXFxuICAqICBsb2NrZWQgb24gcmV0dXJuLlxcbiAgKi9cXG4taW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4raW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KVxcbiB7XFxuLVxcdHN3cF9lbnRyeV90IHN3cCA9IGZvbGlvLVxcdTAwM2Vzd2FwO1xcbi1cXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcXG4tXFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xcbi1cXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xcbitcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gemVudHJ5O1xcbiBcXG4gXFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xcbiBcXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XFxuQEAgLTE2MDIsNyArMTYyOSw2IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXHR9XFxuIFxcbi1cXHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcXG4gXFx0aWYgKCFlbnRyeSlcXG4gXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIFxcbkBAIC0xNjI1LDcgKzE2NTEsNiBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHQgKiBjb21wcmVzc2lvbiB3b3JrLlxcbiBcXHQgKi9cXG4gXFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuLVxcdHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XFxuIFxcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xcbiBcXG4gXFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG5AQCAtMTYzNSw1MiArMTY2MCwxNTkgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gdm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcXG4ge1xcbiBcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcXG4tXFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xcbitcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3dwX3RiO1xcbiBcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xcbiBcXG4tXFx0aWYgKHhhX2VtcHR5KHRyZWUpKVxcbitcXHRzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoc3dwKSk7XFxuK1xcdGNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpO1xcbitcXHQvKlxcbitcXHQgKiBEbyBhIGxvY2tsZXNzIHBlZWsgZmlyc3QuICBJZiBjaS1cXHUwMDNlbG9jayBpcyBhbHJlYWR5IGhlbGQgYnlcXG4rXFx0ICogdGhlIGNhbGxlciAoZS5nLiBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMpLCBhbmQgdGhlXFxuK1xcdCAqIFBvaW50ZXIgaGFzIGFscmVhZHkgYmVlbiBjbGVhcmVkLCB3ZSBjYW4gYmFpbCBvdXQgd2l0aG91dFxcbitcXHQgKiBzZWxmLWRlYWRsb2NraW5nLlxcbitcXHQgKi9cXG4rXFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XFxuK1xcdGlmICghc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4tXFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQpO1xcbitcXHRzcGluX2xvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XFxuK1xcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XFxuK1xcdFxcdGVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSAoU2hhZG93IG9yIFBGTilcXG4rXFx0XFx0ICogdGhhdCB3YXMgc2F2ZWQgaW4gc3dwX3RiX3ZhbCB3aGVuIHRoZSBQb2ludGVyIGVudHJ5XFxuK1xcdFxcdCAqIHdhcyBjcmVhdGVkLiAgVGhpcyBwcmVzZXJ2ZXMgc3dhcCBjb3VudCBhbmQgZmxhZ3NcXG4rXFx0XFx0ICogZm9yIHRoZSBzdWJzZXF1ZW50IHNsb3QtZnJlZSBwYXRoLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUixcXG4rXFx0XFx0XFx0XFx0IGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0ZW50cnkgPSBOVUxMO1xcbitcXHR9XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuK1xcbiBcXHRpZiAoZW50cnkpXFxuIFxcdFxcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xcbiB9XFxuIFxcbi1pbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbisvKlxcbisgKiBFeHRyYWN0IHRoZSB3b3JraW5nIHNldCBzaGFkb3cgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxcbisgKiBUaGUgc2hhZG93IGlzIHJlY292ZXJlZCBmcm9tIHpzd2FwX2VudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsIHdoaWNoIHByZXNlcnZlc1xcbisgKiB0aGUgb3JpZ2luYWwgU2hhZG93IGVudHJ5IHZhbHVlLiBUaGUgc2hhZG93IGNhbiB0aGVuIGJlIHVzZWQgYnlcXG4rICogd29ya2luZ3NldF9yZWZhdWx0KCkgZm9yIHJlZmF1bHQgZGlzdGFuY2UgY2FsY3VsYXRpb24uXFxuKyAqL1xcbit2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YilcXG4ge1xcbi1cXHRzdHJ1Y3QgeGFycmF5ICp0cmVlcywgKnRyZWU7XFxuLVxcdHVuc2lnbmVkIGludCBuciwgaTtcXG4rXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2F2ZWQgPSBlbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbDtcXG4gXFxuLVxcdG5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcXG4tXFx0dHJlZXMgPSBrdnphbGxvY19vYmpzKCp0cmVlLCBucik7XFxuLVxcdGlmICghdHJlZXMpIHtcXG4tXFx0XFx0cHJfZXJyKFxcXCJhbGxvYyBmYWlsZWQsIHpzd2FwIGRpc2FibGVkIGZvciBzd2FwIHR5cGUgJWRcXFxcblxcXCIsIHR5cGUpO1xcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFx0fVxcbitcXHQvKlxcbitcXHQgKiBzd3BfdGJfdmFsIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeS4gIE9ubHlcXG4rXFx0ICogU2hhZG93IGVudHJpZXMgY2Fycnkgd29ya2luZ3NldCBpbmZvcm1hdGlvbjsgUEZOIGFuZCBOVUxMXFxuK1xcdCAqIGVudHJpZXMgaGF2ZSBubyBzaGFkb3cgdG8gZXh0cmFjdC5cXG4rXFx0ICovXFxuK1xcdGlmICghc3dwX3RiX2lzX3NoYWRvdyhzYXZlZCkpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXG4rXFx0cmV0dXJuICh2b2lkICopKHNhdmVkIFxcdTAwMjYgflNXUF9UQl9GTEFHU19NQVNLKTtcXG4rfVxcbitcXG4rLypcXG4rICogUmVhZCB0aGUgc3dhcCBjb3VudCBmcm9tIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuIFRoZSBjb3VudFxcbisgKiBhbmQgZmxhZ3MgYXJlIHN0b3JlZCBpbiB6c3dhcF9lbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbCB3aGljaCBwcmVzZXJ2ZXMgdGhlXFxuKyAqIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgKFNoYWRvdyBvciBQRk4gZm9ybWF0KS5cXG4rICovXFxuK3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YilcXG4re1xcbitcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcXG4rXFxuK1xcdHJldHVybiBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktXFx1MDAzZXN3cF90Yl92YWwpO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZWFkIHRoZSBmbGFncyBmcm9tIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXFxuKyAqL1xcbit1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpXFxuK3tcXG4rXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XFxuK1xcbitcXHRyZXR1cm4gX19zd3BfdGJfZ2V0X2ZsYWdzKGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsKTtcXG4rfVxcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yOyBpKyspXFxuLVxcdFxcdHhhX2luaXQodHJlZXMgKyBpKTtcXG4rLypcXG4rICogSW5jcmVtZW50IHRoZSBzd2FwIGNvdW50IG9mIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXFxuKyAqIFRoZSBjb3VudCBpcyBzdG9yZWQgaW4genN3YXBfZW50cnktXFx1MDAzZXN3cF90Yl92YWwgZm9yIGNvdW50cyBiZWxvd1xcbisgKiBTV1BfVEJfQ09VTlRfTUFYLCBhbmQgb3ZlcmZsb3dzIGludG8gdGhlIGNsdXN0ZXIncyBleHRlbmRfdGFibGVcXG4rICoganVzdCBsaWtlIG5vcm1hbCBTaGFkb3cvUEZOIGVudHJpZXMgZG8uICBSZXR1cm5zIDAgb24gc3VjY2VzcyxcXG4rICogLUVOT01FTSBpZiBjb3VudCB3b3VsZCBvdmVyZmxvdyBhbmQgbm8gZXh0ZW5kX3RhYmxlIGlzIGF2YWlsYWJsZS5cXG4rICovXFxuK2ludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxcbitcXHRcXHRcXHQgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKVxcbit7XFxuK1xcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xcbitcXHR1bnNpZ25lZCBjaGFyIGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsKTtcXG4gXFxuLVxcdG5yX3pzd2FwX3RyZWVzW3R5cGVdID0gbnI7XFxuLVxcdHpzd2FwX3RyZWVzW3R5cGVdID0gdHJlZXM7XFxuK1xcdGlmIChjb3VudCBcXHUwMDNjIFNXUF9UQl9DT1VOVF9NQVgpIHtcXG4rXFx0XFx0ZW50cnktXFx1MDAzZXN3cF90Yl92YWwgPSBfX3N3cF90Yl9ta19jb3VudChlbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgY291bnQgKyAxKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFx0LyogY291bnQgPT0gTUFYLCBvdmVyZmxvdyBpbnRvIGV4dGVuZF90YWJsZSAqL1xcbitcXHRpZiAoIWNpLVxcdTAwM2VleHRlbmRfdGFibGUpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHRjb3VudCA9IGNpLVxcdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcXG4rXFx0aWYgKGNvdW50ID09IDApXFxuK1xcdFxcdGNvdW50ID0gU1dQX1RCX0NPVU5UX01BWDtcXG4rXFx0Y291bnQrKztcXG4rXFx0Y2ktXFx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi12b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpXFxuKy8qXFxuKyAqIERlY3JlbWVudCB0aGUgc3dhcCBjb3VudCBvZiBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxcbisgKiBIYW5kbGVzIGJvdGggaW5saW5lIGNvdW50IChpbiBzd3BfdGJfdmFsKSBhbmQgb3ZlcmZsb3dlZCBjb3VudFxcbisgKiAoaW4gY2ktXFx1MDAzZWV4dGVuZF90YWJsZSksIG1hdGNoaW5nIHRoZSBsb2dpYyB1c2VkIGJ5IG5vcm1hbCBlbnRyaWVzLlxcbisgKi9cXG4rdm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxcbitcXHRcXHRcXHQgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZilcXG4ge1xcbi1cXHRzdHJ1Y3QgeGFycmF5ICp0cmVlcyA9IHpzd2FwX3RyZWVzW3R5cGVdO1xcbi1cXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XFxuK1xcdHVuc2lnbmVkIGNoYXIgY291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktXFx1MDAzZXN3cF90Yl92YWwpO1xcbitcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50ID09IDApO1xcbiBcXG4tXFx0aWYgKCF0cmVlcylcXG4rXFx0aWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHtcXG4rXFx0XFx0aWYgKCFjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlKSB7XFxuK1xcdFxcdFxcdGNvdW50LS07XFxuK1xcdFxcdFxcdGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXFx1MDAzZXN3cF90Yl92YWwsIGNvdW50KTtcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbitcXHRcXHR9XFxuK1xcdFxcdGNvdW50ID0gY2ktXFx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xcbitcXHRcXHQvKiBPdmVyZmxvdyBzdGFydHMgd2l0aCBTV1BfVEJfQ09VTlRfTUFYICovXFxuK1xcdFxcdFZNX1dBUk5fT05fT05DRShjb3VudCBcXHUwMDNjIFNXUF9UQl9DT1VOVF9NQVgpO1xcbitcXHRcXHRjb3VudC0tO1xcbitcXHRcXHRpZiAoY291bnQgPT0gKFNXUF9UQl9DT1VOVF9NQVggLSAxKSkge1xcbitcXHRcXHRcXHRjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwO1xcbitcXHRcXHRcXHRlbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBjb3VudCk7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGNpLVxcdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50O1xcbitcXHRcXHR9XFxuIFxcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRlbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsLCBjb3VudCAtIDEpO1xcbit9XFxuIFxcbi1cXHQvKiB0cnlfdG9fdW51c2UoKSBpbnZhbGlkYXRlZCBhbGwgdGhlIGVudHJpZXMgYWxyZWFkeSAqL1xcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfenN3YXBfdHJlZXNbdHlwZV07IGkrKylcXG4tXFx0XFx0V0FSTl9PTl9PTkNFKCF4YV9lbXB0eSh0cmVlcyArIGkpKTtcXG4raW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbiBcXG4tXFx0a3ZmcmVlKHRyZWVzKTtcXG4tXFx0bnJfenN3YXBfdHJlZXNbdHlwZV0gPSAwO1xcbi1cXHR6c3dhcF90cmVlc1t0eXBlXSA9IE5VTEw7XFxuK3ZvaWQgenN3YXBfc3dhcG9mZihpbnQgdHlwZSlcXG4re1xcbiB9XFxuIFxcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDE1OjExOjIyLjM4NDUxMzY5WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjI5ODA4MzM4NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiWlNXQVBfREVGQVVMVF9PTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9sb2FkXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCIsXG4gICAgXCJ6c3dhcF93cml0ZWJhY2tfZW50cnlcIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeVwiLFxuICAgIFwiX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzXCIsXG4gICAgXCJfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlcIixcbiAgICBcInpzd2FwX3N3cF90Yl9kdXBfY291bnRcIixcbiAgICBcInpzd2FwX3N3cF90Yl9wdXRfY291bnRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZjIwMTE5ODU4NzYzMTIxNWY3MDhmNTg4NmE5ODEwMzIzZmJjMjM5OVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDcgMTU6MTE6MTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3pzd2FwLmggYi9pbmNsdWRlL2xpbnV4L3pzd2FwLmhcbmluZGV4IDMwYzE5M2ExMjA3ZTE2Li40ZjU1YzhkMGM0YzU0MiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvenN3YXAuaFxuKysrIGIvaW5jbHVkZS9saW51eC96c3dhcC5oXG5AQCAtMjYsNyArMjYsNyBAQCBzdHJ1Y3QgenN3YXBfbHJ1dmVjX3N0YXRlIHtcbiBcbiB1bnNpZ25lZCBsb25nIHpzd2FwX3RvdGFsX3BhZ2VzKHZvaWQpO1xuIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4taW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4raW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KTtcbiB2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcbiBpbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTtcbiB2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpO1xuQEAgLTQ0LDcgKzQ0LDcgQEAgc3RhdGljIGlubGluZSBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRyZXR1cm4gZmFsc2U7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbitzdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHZvaWQgKnplbnRyeSlcbiB7XG4gXHRyZXR1cm4gLUVOT0VOVDtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vcGFnZV9pby5jIGIvbW0vcGFnZV9pby5jXG5pbmRleCBiMjNmNDk0ZmNjODNkYS4uMWNlODIwMWVkODZlMjQgMTAwNjQ0XG4tLS0gYS9tbS9wYWdlX2lvLmNcbisrKyBiL21tL3BhZ2VfaW8uY1xuQEAgLTY1OCw3ICs2NTgsNyBAQCBzdGF0aWMgdm9pZCBzd2FwX3JlYWRfZm9saW9fYmRldl9hc3luYyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIFx0c3VibWl0X2JpbyhiaW8pO1xuIH1cbiBcbi12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zylcbit2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBfX3N3YXBfZW50cnlfdG9faW5mbyhmb2xpby1cdTAwM2Vzd2FwKTtcbiBcdGJvb2wgc3luY2hyb25vdXMgPSBzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TWU5DSFJPTk9VU19JTztcbkBAIC02ODYsNyArNjg2LDcgQEAgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcpXG4gXHRcdGdvdG8gZmluaXNoO1xuIFx0fVxuIFxuLVx0aWYgKHpzd2FwX2xvYWQoZm9saW8pICE9IC1FTk9FTlQpXG4rXHRpZiAoenN3YXBfbG9hZChmb2xpbywgemVudHJ5KSAhPSAtRU5PRU5UKVxuIFx0XHRnb3RvIGZpbmlzaDtcbiBcbiBcdC8qIFdlIGhhdmUgdG8gcmVhZCBmcm9tIHNsb3dlciBkZXZpY2VzLiBJbmNyZWFzZSB6c3dhcCBwcm90ZWN0aW9uLiAqL1xuZGlmZiAtLWdpdCBhL21tL3N3YXAuaCBiL21tL3N3YXAuaFxuaW5kZXggNDRhYjhlMWU1OTViMDguLjg0ZTEzYmE2ZTYwNWMzIDEwMDY0NFxuLS0tIGEvbW0vc3dhcC5oXG4rKysgYi9tbS9zd2FwLmhcbkBAIC0yMTAsNiArMjEwLDQxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2NsdXN0ZXJfdW5sb2NrX2lycShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxuIFxuIGV4dGVybiBpbnQgc3dhcF9yZXRyeV90YWJsZV9hbGxvYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwKTtcbiBcbitzdHJ1Y3QgenN3YXBfZW50cnk7XG4rI2lmZGVmIENPTkZJR19aU1dBUFxuK3ZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKTtcbit1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpO1xuK3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90Yik7XG4raW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4rXHRcdFx0ICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZik7XG4rdm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuK1x0XHRcdCAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKTtcbit2b2lkIHpzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSk7XG4rI2Vsc2VcbitzdGF0aWMgaW5saW5lIHZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuK3tcbitcdHJldHVybiBOVUxMO1xuK31cbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK3N0YXRpYyBpbmxpbmUgaW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4rXHRcdFx0XHRcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuK1x0XHRcdFx0XHQgdW5zaWduZWQgaW50IGNpX29mZilcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rc3RhdGljIGlubGluZSB2b2lkIHpzd2FwX3N3cF90Yl9wdXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4rXHRcdFx0XHRcdCAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbitcdFx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgY2lfb2ZmKSB7fVxuK3N0YXRpYyBpbmxpbmUgdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpIHt9XG4rI2VuZGlmXG4rXG4gLypcbiAgKiBCZWxvdyBhcmUgdGhlIGNvcmUgcm91dGluZXMgZm9yIGRvaW5nIHN3YXAgZm9yIGEgZm9saW8uXG4gICogQWxsIGhlbHBlcnMgcmVxdWlyZXMgdGhlIGZvbGlvIHRvIGJlIGxvY2tlZCwgYW5kIGEgbG9ja2VkIGZvbGlvXG5AQCAtMjQxLDcgKzI3Niw3IEBAIGV4dGVybiB2b2lkIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gLyogbGludXgvbW0vcGFnZV9pby5jICovXG4gaW50IHNpb19wb29sX2luaXQodm9pZCk7XG4gc3RydWN0IHN3YXBfaW9jYjtcbi12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zyk7XG4rdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsIHZvaWQgKnplbnRyeSk7XG4gdm9pZCBfX3N3YXBfcmVhZF91bnBsdWcoc3RydWN0IHN3YXBfaW9jYiAqcGx1Zyk7XG4gc3RhdGljIGlubGluZSB2b2lkIHN3YXBfcmVhZF91bnBsdWcoc3RydWN0IHN3YXBfaW9jYiAqcGx1ZylcbiB7XG5AQCAtMzAzLDEzICszMzgsMTYgQEAgc3RhdGljIGlubGluZSBib29sIGZvbGlvX21hdGNoZXNfc3dhcF9lbnRyeShjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIGJvb2wgc3dhcF9jYWNoZV9oYXNfZm9saW8oc3dwX2VudHJ5X3QgZW50cnkpO1xuIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9nZXRfZm9saW8oc3dwX2VudHJ5X3QgZW50cnkpO1xuIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSk7XG4rYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbyk7XG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdldF9lbnRyeSwgZ2ZwX3QgZ2ZwX21hc2ssXG4gXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgb3JkZXJzLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZixcbi1cdFx0XHRcdCAgICAgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpO1xuK1x0XHRcdFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCxcbitcdFx0XHRcdCAgICAgdm9pZCAqKnplbnRyeSk7XG4gLyogQmVsb3cgaGVscGVycyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gbG9jayBhbmQgcGFzcyBpbiB0aGUgc3dhcCBjbHVzdGVyLiAqL1xuIHZvaWQgX19zd2FwX2NhY2hlX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuLVx0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSk7XG4rXHRcdFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LFxuK1x0XHRcdCAgICB2b2lkICoqemVudHJ5KTtcbiB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XG4gdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuQEAgLTM4MSw3ICs0MTksOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKVxuK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsXG4rXHRcdFx0XHQgICB2b2lkICp6ZW50cnkpXG4ge1xuIH1cbiBcbkBAIC00NTMsNiArNDkyLDExIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3dhcF9jYWNoZV9nZXRfc2hhZG93KHN3cF9lbnRyeV90IGVudHJ5KVxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4re1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4gfVxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNmZkNmUzNDE1YjcxOGIuLjYwZDkzN2M2YjM5MjI0IDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0xNzUsMTYgKzE3NSwyOSBAQCBzdGF0aWMgaW50IF9fc3dhcF9jYWNoZV9hZGRfY2hlY2soc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4gXHRpZiAoc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikpXG4gXHRcdHJldHVybiAtRUVYSVNUO1xuLVx0aWYgKCFfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcbitcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XG4rXHRcdGlmICghenN3YXBfc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0fSBlbHNlIGlmICghX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpIHtcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4gXHRpZiAoc2hhZG93cCBcdTAwMjZcdTAwMjYgc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpKVxuIFx0XHQqc2hhZG93cCA9IHN3cF90Yl90b19zaGFkb3cob2xkX3RiKTtcbitcdGVsc2UgaWYgKHNoYWRvd3AgXHUwMDI2XHUwMDI2IHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXG4rXHRcdCpzaGFkb3dwID0genN3YXBfc3dwX3RiX2dldF9zaGFkb3cob2xkX3RiKTtcbiBcdGlmIChtZW1jZ19pZClcbiBcdFx0Km1lbWNnX2lkID0gX19zd2FwX2Nncm91cF9nZXQoY2ksIGNpX29mZik7XG4gXG4gXHRpZiAobnIgPT0gMSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4rXHQvKlxuK1x0ICogRm9yIG11bHRpLXNsb3QgcmFuZ2VzLCBQb2ludGVyIGVudHJpZXMgYXJlIG5vdCBleHBlY3RlZCBzaW5jZVxuK1x0ICogenN3YXAgZG9lcyBub3Qgc3VwcG9ydCBsYXJnZSBmb2xpb3MuIFJldHVybiAtRUJVU1kgZm9yIHNhZmV0eS5cbitcdCAqL1xuK1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4gXHRpc196ZXJvID0gX19zd2FwX3RhYmxlX3Rlc3RfemVybyhjaSwgY2lfb2ZmKTtcbiBcdGNpX29mZiA9IHJvdW5kX2Rvd24oY2lfb2ZmLCBucik7XG4gXHRjaV9lbmQgPSBjaV9vZmYgKyBucjtcbkBAIC0yMDEsNyArMjE0LDggQEAgc3RhdGljIGludCBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gfVxuIFxuIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi1cdFx0XHRcdCAgICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5KVxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksXG4rXHRcdFx0XHQgICAgICB2b2lkICoqemVudHJ5KVxuIHtcbiBcdHVuc2lnbmVkIGludCBjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQoZW50cnkpLCBjaV9lbmQ7XG4gXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuQEAgLTIxNiw3ICsyMzAsMzQgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0ZG8ge1xuIFx0XHRvbGRfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuIFx0XHRWTV9XQVJOX09OX09OQ0Uoc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikpO1xuLVx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIHBmbl90b19zd3BfdGIocGZuLCBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpO1xuK1x0XHQvKlxuK1x0XHQgKiBJZiB0aGUgb2xkIGVudHJ5IGlzIGEgUG9pbnRlciAoenN3YXAgY29tcHJlc3NlZCBkYXRhKSxcbitcdFx0ICogZXh0cmFjdCB0aGUgenN3YXBfZW50cnkgZm9yIHRoZSBjYWxsZXIgYW5kIHByZXNlcnZlXG4rXHRcdCAqIGl0cyBmbGFncy4gVGhlIFBvaW50ZXIgZW50cnkgaGFzIG5vIGlubGluZSBmbGFncy5cbitcdFx0ICovXG4rXHRcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XG4rXHRcdFx0dW5zaWduZWQgY2hhciBwZmxhZ3MgPSB6c3dhcF9zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90Yik7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBJZiBzd3BfdGJfdmFsIGNhcnJpZXMgU1dQX1RCX0NPVU5UX01BWCwgdGhlXG4rXHRcdFx0ICogcmVhbCBvdmVyZmxvdyBjb3VudCBsaXZlcyBpbiBjaS1cdTAwM2VleHRlbmRfdGFibGUuXG4rXHRcdFx0ICogUHVsbCBpdCBzbyB0aGUgbmV3IFBGTiBjYXJyaWVzIHRoZSBjb3JyZWN0IGNvdW50XG4rXHRcdFx0ICogYW5kIHdvbid0IGxhdGVyIGNyYXNoIG9uIGEgbWlzc2luZyBleHRlbmRfdGFibGUuXG4rXHRcdFx0ICovXG4rXHRcdFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XG4rXHRcdFx0XHR1bnNpZ25lZCBjaGFyIHJlYWwgPSBTV1BfVEJfQ09VTlRfTUFYIC0gMTtcbitcdFx0XHRcdGlmIChjaS1cdTAwM2VleHRlbmRfdGFibGUgXHUwMDI2XHUwMDI2IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdKVxuK1x0XHRcdFx0XHRyZWFsID0gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XG4rXHRcdFx0XHRwZmxhZ3MgPSAocmVhbCBcdTAwM2NcdTAwM2MgKFNXUF9UQl9GTEFHU19CSVRTIC0gU1dQX1RCX0NPVU5UX0JJVFMpKSB8XG4rXHRcdFx0XHRcdCAocGZsYWdzIFx1MDAyNiAoKDEgXHUwMDNjXHUwMDNjIChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgLSAxKSk7XG4rXHRcdFx0fVxuK1x0XHRcdGlmICh6ZW50cnkgXHUwMDI2XHUwMDI2ICEqemVudHJ5KVxuK1x0XHRcdFx0KnplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKG9sZF90Yik7XG4rXHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxuK1x0XHRcdFx0cGZuX3RvX3N3cF90YihwZm4sIHBmbGFncykpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZixcbitcdFx0XHRcdHBmbl90b19zd3BfdGIocGZuLCBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpO1xuK1x0XHR9XG4gXHR9IHdoaWxlICgrK2NpX29mZiBcdTAwM2MgY2lfZW5kKTtcbiBcbiBcdGZvbGlvX3JlZl9hZGQoZm9saW8sIG5yX3BhZ2VzKTtcbkBAIC0yMzksMTEgKzI4MCwxMiBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gICogdGhhdCBob2xkcyB0aGUgZW50cmllcy5cbiAgKi9cbiB2b2lkIF9fc3dhcF9jYWNoZV9hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpXG4rXHRcdFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LFxuK1x0XHRcdCAgICB2b2lkICoqemVudHJ5KVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4gXG4tXHRfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnkpO1xuK1x0X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhjaSwgZm9saW8sIGVudHJ5LCB6ZW50cnkpO1xuIFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9QQUdFUywgbnJfcGFnZXMpO1xuIFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TV0FQQ0FDSEUsIG5yX3BhZ2VzKTtcbiB9XG5AQCAtMjY5LDE1ICszMTEsMjggQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0Y2lfb2ZmID0gY2lfc3RhcnQ7XG4gXHRkbyB7XG4gXHRcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4tXHRcdFdBUk5fT05fT05DRSghc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikgfHxcbi1cdFx0XHQgICAgIHN3cF90Yl90b19mb2xpbyhvbGRfdGIpICE9IGZvbGlvKTtcbi1cdFx0aWYgKF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxuLVx0XHRcdGZvbGlvX3N3YXBwZWQgPSB0cnVlO1xuLVx0XHRlbHNlXG4tXHRcdFx0bmVlZF9mcmVlID0gdHJ1ZTtcbi1cdFx0LyogSWYgc2hhZG93IGlzIE5VTEwsIHdlIHNldCBhbiBlbXB0eSBzaGFkb3cuICovXG4tXHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgc2hhZG93X3RvX3N3cF90YihzaGFkb3csXG4tXHRcdFx0XHQgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTtcbitcdFx0LypcbitcdFx0ICogSWYgenN3YXAgYWxyZWFkeSBzdG9yZWQgZGF0YSBmb3IgdGhpcyBzbG90XG4rXHRcdCAqICh6c3dhcF9zdG9yZSB3cm90ZSBhIFBvaW50ZXIgZW50cnkpLCBsZWF2ZSBpdFxuK1x0XHQgKiBpbiBwbGFjZS4gVGhlIGNvdW50IGFuZCBmbGFncyBhcmUgc3RvcmVkIGluIHRoZVxuK1x0XHQgKiB6c3dhcF9lbnRyeSBzdHJ1Y3QuXG4rXHRcdCAqL1xuK1x0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkge1xuK1x0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXG4rXHRcdFx0XHRmb2xpb19zd2FwcGVkID0gdHJ1ZTtcbitcdFx0XHRlbHNlXG4rXHRcdFx0XHRuZWVkX2ZyZWUgPSB0cnVlO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdFdBUk5fT05fT05DRSghc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikgfHxcbitcdFx0XHRcdCAgICAgc3dwX3RiX3RvX2ZvbGlvKG9sZF90YikgIT0gZm9saW8pO1xuK1x0XHRcdGlmIChfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcbitcdFx0XHRcdGZvbGlvX3N3YXBwZWQgPSB0cnVlO1xuK1x0XHRcdGVsc2VcbitcdFx0XHRcdG5lZWRfZnJlZSA9IHRydWU7XG4rXHRcdFx0LyogSWYgc2hhZG93IGlzIE5VTEwsIHdlIHNldCBhbiBlbXB0eSBzaGFkb3cuICovXG4rXHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdyxcbitcdFx0XHRcdFx0IF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XG4rXHRcdH1cbiBcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFxuIFx0Zm9saW8tXHUwMDNlc3dhcC52YWwgPSAwO1xuQEAgLTI4OCw3ICszNDMsMTQgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0fSBlbHNlIGlmIChuZWVkX2ZyZWUpIHtcbiBcdFx0Y2lfb2ZmID0gY2lfc3RhcnQ7XG4gXHRcdGRvIHtcbi1cdFx0XHRpZiAoIV9fc3dwX3RiX2dldF9jb3VudChfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSlcbitcdFx0XHR1bnNpZ25lZCBsb25nIHRiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbitcdFx0XHR1bnNpZ25lZCBjaGFyIGNudDtcbitcbitcdFx0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIodGIpKVxuK1x0XHRcdFx0Y250ID0genN3YXBfc3dwX3RiX2dldF9jb3VudCh0Yik7XG4rXHRcdFx0ZWxzZVxuK1x0XHRcdFx0Y250ID0gX19zd3BfdGJfZ2V0X2NvdW50KHRiKTtcbitcdFx0XHRpZiAoIWNudClcbiBcdFx0XHRcdF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzaSwgY2ksIGNpX29mZiwgMSk7XG4gXHRcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuQEAgLTQwMyw3ICs0NjUsOCBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXHRcdFx0XHRcdHN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCxcbiBcdFx0XHRcdFx0dW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZixcbi1cdFx0XHRcdFx0c3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpXG4rXHRcdFx0XHRcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LFxuK1x0XHRcdFx0XHR2b2lkICoqemVudHJ5KVxuIHtcbiBcdGludCBlcnI7XG4gXHRzd3BfZW50cnlfdCBlbnRyeTtcbkBAIC00NTAsNyArNTEzLDcgQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXG4gXHRfX2ZvbGlvX3NldF9sb2NrZWQoZm9saW8pO1xuIFx0X19mb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7XG4tXHRfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnkpO1xuK1x0X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhjaSwgZm9saW8sIGVudHJ5LCB6ZW50cnkpO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXG4gXHRpZiAobWVtX2Nncm91cF9zd2FwaW5fY2hhcmdlX2ZvbGlvKGZvbGlvLCBtZW1jZ19pZCxcbkBAIC01MDcsNyArNTcwLDggQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gICovXG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCxcbiBcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBvcmRlcnMsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseClcbitcdFx0XHRcdCAgICAgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgsXG4rXHRcdFx0XHQgICAgIHZvaWQgKip6ZW50cnkpXG4ge1xuIFx0aW50IG9yZGVyLCBlcnI7XG4gXHRzdHJ1Y3QgZm9saW8gKnJldDtcbkBAIC01MjAsOSArNTg0LDEyIEBAIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BfZW50cnlfdCB0YXJnX2VudHJ5LCBnZnBfdCBnZnAsXG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFvcmRlcnMgfHwgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpIFx1MDAzZSBTV0FQRklMRV9DTFVTVEVSKSlcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4rXHRpZiAoemVudHJ5KVxuK1x0XHQqemVudHJ5ID0gTlVMTDtcbitcbiBcdGRvIHtcbiBcdFx0cmV0ID0gX19zd2FwX2NhY2hlX2FsbG9jKGNpLCB0YXJnX2VudHJ5LCBnZnAsIG9yZGVyLFxuLVx0XHRcdFx0XHQgdm1mLCBtcG9sLCBpbHgpO1xuK1x0XHRcdFx0XHQgdm1mLCBtcG9sLCBpbHgsIHplbnRyeSk7XG4gXHRcdGlmICghSVNfRVJSKHJldCkpXG4gXHRcdFx0YnJlYWs7XG4gXHRcdGVyciA9IFBUUl9FUlIocmV0KTtcbkBAIC02MzgsMTggKzcwNSwyMCBAQCBzdGF0aWMgc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX3JlYWRfZm9saW8oc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCxcbiBcdFx0XHRcdFx0ICAgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsIGJvb2wgcmVhZGFoZWFkKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXHR2b2lkICp6ZW50cnk7XG4gXG4gXHRkbyB7XG4gXHRcdGZvbGlvID0gc3dhcF9jYWNoZV9nZXRfZm9saW8oZW50cnkpO1xuIFx0XHRpZiAoZm9saW8pXG4gXHRcdFx0cmV0dXJuIGZvbGlvO1xuLVx0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgQklUKDApLCBOVUxMLCBtcG9sLCBpbHgpO1xuK1x0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgQklUKDApLCBOVUxMLCBtcG9sLCBpbHgsXG4rXHRcdFx0XHRcdCAgICAgICBcdTAwMjZ6ZW50cnkpO1xuIFx0fSB3aGlsZSAoUFRSX0VSUihmb2xpbykgPT0gLUVFWElTVCk7XG4gXG4gXHRpZiAoSVNfRVJSX09SX05VTEwoZm9saW8pKVxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbi1cdHN3YXBfcmVhZF9mb2xpbyhmb2xpbywgcGx1Zyk7XG4rXHRzd2FwX3JlYWRfZm9saW8oZm9saW8sIHBsdWcsIHplbnRyeSk7XG4gXHRpZiAocmVhZGFoZWFkKSB7XG4gXHRcdGZvbGlvX3NldF9yZWFkYWhlYWQoZm9saW8pO1xuIFx0XHRjb3VudF92bV9ldmVudChTV0FQX1JBKTtcbkBAIC02NzgsMTggKzc0NywyMCBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBpbl9zeW5jKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnAsIHVuc2lnbmVkIGxvbmcgb3JkZXJzLFxuIFx0XHRcdCAgIHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseClcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0dm9pZCAqemVudHJ5O1xuIFxuIFx0ZG8ge1xuIFx0XHRmb2xpbyA9IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKGVudHJ5KTtcbiBcdFx0aWYgKGZvbGlvKVxuIFx0XHRcdHJldHVybiBmb2xpbztcbi1cdFx0Zm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKGVudHJ5LCBnZnAsIG9yZGVycywgdm1mLCBtcG9sLCBpbHgpO1xuK1x0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCxcbitcdFx0XHRcdFx0ICAgICAgIFx1MDAyNnplbnRyeSk7XG4gXHR9IHdoaWxlIChQVFJfRVJSKGZvbGlvKSA9PSAtRUVYSVNUKTtcbiBcbiBcdGlmIChJU19FUlIoZm9saW8pKVxuIFx0XHRyZXR1cm4gZm9saW87XG4gXG4tXHRzd2FwX3JlYWRfZm9saW8oZm9saW8sIE5VTEwpO1xuK1x0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBOVUxMLCB6ZW50cnkpO1xuIFx0cmV0dXJuIGZvbGlvO1xuIH1cbiBcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3RhYmxlLmggYi9tbS9zd2FwX3RhYmxlLmhcbmluZGV4IGU2NjEzZTYyZjhkMGY2Li42MzE4YmY4YWE3NmIwYyAxMDA2NDRcbi0tLSBhL21tL3N3YXBfdGFibGUuaFxuKysrIGIvbW0vc3dhcF90YWJsZS5oXG5AQCAtMjgsNyArMjgsNyBAQCBzdHJ1Y3Qgc3dhcF9tZW1jZ190YWJsZSB7XG4gICogTlVMTDogICAgIHwtLS0tLS0tLS0tLS0tLS0tIDAgLS0tLS0tLS0tLS0tLS0tfCAtIEZyZWUgc2xvdFxuICAqIFNoYWRvdzogICB8U1dBUF9DT1VOVHxafC0tLS0gU0hBRE9XX1ZBTCAtLS18MXwgLSBTd2FwcGVkIG91dCBzbG90XG4gICogUEZOOiAgICAgIHxTV0FQX0NPVU5UfFp8LS0tLS0tIFBGTiAtLS0tLS0tfDEwfCAtIENhY2hlZCBzbG90XG4tICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIChVbnVzZWQpXG4rICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIFpzd2FwIGNvbXByZXNzZWQgZW50cnlcbiAgKiBCYWQ6ICAgICAgfC0tLS0tLS0tLS0tLS0gMSAtLS0tLS0tLS0tLS0tfDEwMDB8IC0gQmFkIHNsb3RcbiAgKlxuICAqIENPVU5UIGlzIGBTV1BfVEJfQ09VTlRfQklUU2AgbG9uZywgWiBpcyB0aGUgYFNXUF9UQl9aRVJPX0ZMQUdgIGJpdCxcbkBAIC00OSw5ICs0OSwxMSBAQCBzdHJ1Y3Qgc3dhcF9tZW1jZ190YWJsZSB7XG4gICogLSBQRk46IFN3YXAgc2xvdCBpcyBpbiB1c2UsIGFuZCBjYWNoZWQuIE1lbWNnIGluZm8gaXMgcmVjb3JkZWQgb24gdGhlIHBhZ2VcbiAgKiAgIHN0cnVjdC5cbiAgKlxuLSAqIC0gUG9pbnRlcjogVW51c2VkIHlldC4gYDBiMTAwYCBpcyByZXNlcnZlZCBmb3IgcG90ZW50aWFsIHBvaW50ZXIgdXNhZ2Vcbi0gKiAgIGJlY2F1c2Ugb25seSB0aGUgbG93ZXIgdGhyZWUgYml0cyBjYW4gYmUgdXNlZCBhcyBhIG1hcmtlciBmb3IgOCBieXRlc1xuLSAqICAgYWxpZ25lZCBwb2ludGVycy5cbisgKiAtIFBvaW50ZXI6IFN0b3JlcyBhIGRpcmVjdCBwb2ludGVyIHRvIGEgenN3YXBfZW50cnkgd2hlbiB0aGUgc3dhcCBzbG90J3NcbisgKiAgIGNvbXByZXNzZWQgZGF0YSByZXNpZGVzIGluIHpzd2FwLiBUaGUgc3dhcCBjb3VudCAoaWYgYW55KSBpcyBzdG9yZWQgaW5cbisgKiAgIHRoZSB6c3dhcF9lbnRyeSBzdHJ1Y3QgcmF0aGVyIHRoYW4gaW5saW5lLCBzaW5jZSB0aGUgcG9pbnRlciBvY2N1cGllc1xuKyAqICAgYWxsIHVwcGVyIGJpdHMuIGAwYjEwMGAgaXMgdXNlZCBhcyB0aGUgbWFya2VyIGJlY2F1c2UgenN3YXBfZW50cnlcbisgKiAgIHBvaW50ZXJzIGFyZSBhdCBsZWFzdCA4LWJ5dGUgYWxpZ25lZCwgbGVhdmluZyB0aGUgbG93ZXIgdGhyZWUgYml0cyBmcmVlLlxuICAqXG4gICogLSBCYWQ6IFN3YXAgc2xvdCBpcyByZXNlcnZlZCwgcHJvdGVjdHMgc3dhcCBoZWFkZXIgb3IgaG9sZXMgb24gc3dhcCBkZXZpY2VzLlxuICAqL1xuQEAgLTc4LDYgKzgwLDkgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUge1xuIC8qIFRoZSBmaXJzdCBmbGFnIGlzIHplcm8gYml0IChTV0FQX1RBQkxFX0hBU19aRVJPRkxBRykgKi9cbiAjZGVmaW5lIFNXUF9UQl9aRVJPX0ZMQUdcdEJJVChCSVRTX1BFUl9MT05HIC0gU1dQX1RCX0ZMQUdTX0JJVFMpXG4gXG4rLyogUG9pbnRlcjogenN3YXBfZW50cnkgcG9pbnRlciBzdG9yZWQgZGlyZWN0bHksIGVuZHMgd2l0aCAwYjEwMCAqL1xuKyNkZWZpbmUgU1dQX1RCX1BPSU5URVJfTUFSS1x0MGIxMDBVTFxuK1xuIC8qIEJhZCBzbG90OiBlbmRzIHdpdGggMGIxMDAwIGFuZCByZXN0cyBvZiBiaXRzIGFyZSBhbGwgMSAqL1xuICNkZWZpbmUgU1dQX1RCX0JBRFx0XHQoKH4wVUwpIFx1MDAzY1x1MDAzYyAzKVxuIFxuQEAgLTE2Niw2ICsxNzEsMTEgQEAgc3RhdGljIGlubGluZSBib29sIHN3cF90Yl9pc19iYWQodW5zaWduZWQgbG9uZyBzd3BfdGIpXG4gXHRyZXR1cm4gc3dwX3RiID09IFNXUF9UQl9CQUQ7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBzd3BfdGJfaXNfcG9pbnRlcih1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRyZXR1cm4gKHN3cF90YiBcdTAwMjYgKEJJVCgzKSAtIDEpKSA9PSBTV1BfVEJfUE9JTlRFUl9NQVJLO1xuK31cbitcbiBzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX2NvdW50YWJsZSh1bnNpZ25lZCBsb25nIHN3cF90YilcbiB7XG4gXHRyZXR1cm4gKHN3cF90Yl9pc19zaGFkb3coc3dwX3RiKSB8fCBzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSB8fFxuQEAgLTE4OCw2ICsxOTgsMjMgQEAgc3RhdGljIGlubGluZSB2b2lkICpzd3BfdGJfdG9fc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuIFx0cmV0dXJuICh2b2lkICopKHN3cF90YiBcdTAwMjYgflNXUF9UQl9GTEFHU19NQVNLKTtcbiB9XG4gXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvaW50ZXJfdG9fc3dwX3RiKHZvaWQgKnB0cilcbit7XG4rXHR1bnNpZ25lZCBsb25nIHZhbCA9ICh1bnNpZ25lZCBsb25nKXB0cjtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2YodW5zaWduZWQgbG9uZykgIT0gc2l6ZW9mKHZvaWQgKikpO1xuK1x0LyogUG9pbnRlcnMgYXJlIDgtYnl0ZSBhbGlnbmVkLCBsb3cgMyBiaXRzIG11c3QgYmUgY2xlYXIgKi9cbitcdFZNX1dBUk5fT05fT05DRSh2YWwgXHUwMDI2IChCSVQoMykgLSAxKSk7XG4rXHRyZXR1cm4gdmFsIHwgU1dQX1RCX1BPSU5URVJfTUFSSztcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkICpzd3BfdGJfdG9fcG9pbnRlcih1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRWTV9XQVJOX09OKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKTtcbitcdC8qIENsZWFyIHRoZSBsb3cgMy1iaXQgbWFya2VyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi9cbitcdHJldHVybiAodm9pZCAqKShzd3BfdGIgXHUwMDI2IH4oKHVuc2lnbmVkIGxvbmcpKEJJVCgzKSAtIDEpKSk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpXG4ge1xuIFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKTtcbmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuY1xuaW5kZXggYTYwMmU1ODIwNTEzYTguLjE4OTI1ZTQ2MjU3MWIxIDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuKysrIGIvbW0vc3dhcGZpbGUuY1xuQEAgLTkzNSw3ICs5MzUsOCBAQCBzdGF0aWMgYm9vbCBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0bnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiBcdFx0c3dhcF9jbHVzdGVyX2Fzc2VydF9lbXB0eShjaSwgY2lfb2ZmLCBucl9wYWdlcywgZmFsc2UpO1xuIFx0XHRfX3N3YXBfY2FjaGVfYWRkX2ZvbGlvKGNpLCBmb2xpbywgc3dwX2VudHJ5KHNpLVx1MDAzZXR5cGUsXG4tXHRcdFx0XHRcdFx0XHQgICAgY2lfb2ZmICsgY2x1c3Rlcl9vZmZzZXQoc2ksIGNpKSkpO1xuK1x0XHRcdFx0XHRcdFx0ICAgIGNpX29mZiArIGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSkpLFxuK1x0XHRcdFx0ICAgICAgIE5VTEwpO1xuIFx0fSBlbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19ISUJFUk5BVElPTikpIHtcbiBcdFx0b3JkZXIgPSAwO1xuIFx0XHRucl9wYWdlcyA9IDE7XG5AQCAtMTUzNiwyNSArMTUzNyw1MSBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcbiBcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuK1xuK1x0LyogUG9pbnRlciBlbnRyaWVzIHN0b3JlIGNvdW50IGluIHRoZSB6c3dhcF9lbnRyeSBzdHJ1Y3QgKi9cbitcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4rXHRcdHpzd2FwX3N3cF90Yl9wdXRfY291bnQoc3dwX3RiLCBjaSwgY2lfb2ZmKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0Y291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcbiBcbiBcdFZNX1dBUk5fT05fT05DRShjb3VudCBcdTAwM2M9IDApO1xuIFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFx1MDAzZSBTV1BfVEJfQ09VTlRfTUFYKTtcbi1cbi1cdGlmIChjb3VudCA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XG4tXHRcdGNvdW50ID0gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XG4tXHRcdC8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi9cbi1cdFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFx1MDAzYyBTV1BfVEJfQ09VTlRfTUFYKTtcbi1cdFx0Y291bnQtLTtcbi1cdFx0aWYgKGNvdW50ID09IChTV1BfVEJfQ09VTlRfTUFYIC0gMSkpIHtcbi1cdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IDA7XG4tXHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7XG4rXHRcdGlmIChjb3VudCA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XG4rXHRcdFx0aWYgKCFjaS1cdTAwM2VleHRlbmRfdGFibGUpIHtcbitcdFx0XHRcdC8qXG4rXHRcdFx0XHQgKiBNQVggd2l0aG91dCBleHRlbmRfdGFibGU6IE1BWCBpcyB0aGUgcmVhbFxuK1x0XHRcdFx0ICogY291bnQuICBEZWNyZW1lbnQgYW5kIHdyaXRlIGJhY2sgaW5saW5lLlxuK1x0XHRcdFx0ICovXG4rXHRcdFx0XHRjb3VudC0tO1xuK1x0XHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxuK1x0XHRcdFx0XHRfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7XG4rXHRcdFx0fSBlbHNlIHtcbitcdFx0XHRcdC8qXG4rXHRcdFx0XHQgKiBNQVggd2l0aCBleHRlbmRfdGFibGU6IHJlYWwgY291bnQgbGl2ZXMgaW5cbitcdFx0XHRcdCAqIGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdLiAgUHVsbCwgZGVjcmVtZW50XG4rXHRcdFx0XHQgKiBpdCwgYW5kIGVpdGhlciBtb3ZlIGl0IGJhY2sgaW5saW5lIChpZiBub3dcbitcdFx0XHRcdCAqIGZpdHMpIG9yIHdyaXRlIGl0IGJhY2sgdG8gdGhlIGV4dGVuZCB0YWJsZS5cbitcdFx0XHRcdCAqL1xuK1x0XHRcdFx0Y291bnQgPSBjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcbitcdFx0XHRcdC8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi9cbitcdFx0XHRcdFZNX1dBUk5fT05fT05DRShjb3VudCBcdTAwM2MgU1dQX1RCX0NPVU5UX01BWCk7XG4rXHRcdFx0XHRjb3VudC0tO1xuK1x0XHRcdFx0aWYgKGNvdW50ID09IChTV1BfVEJfQ09VTlRfTUFYIC0gMSkpIHtcbitcdFx0XHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwO1xuK1x0XHRcdFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXG4rXHRcdFx0XHRcdFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuK1x0XHRcdFx0fSBlbHNlIHtcbitcdFx0XHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcbitcdFx0XHRcdH1cbitcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcbitcdFx0XHQvKiBjb3VudCBcdTAwM2MgTUFYOiBzaW1wbGUgaW5saW5lIGRlY3JlbWVudCAqL1xuK1x0XHRcdGNvdW50LS07XG4rXHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxuK1x0XHRcdFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuIFx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIF9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgLS1jb3VudCkpO1xuLVx0fVxuIFxuIFx0LypcbiBcdCAqIGBTV1BfVEJfQ09VTlRfTUFYIC0gMWAgdHJpZ2dlcnMgZXh0ZW5kIHRhYmxlIGFsbG9jYXRpb24uIElmIHRoZVxuQEAgLTE1OTYsNyArMTYyMywxOCBAQCBzdGF0aWMgdm9pZCBzd2FwX3B1dF9lbnRyaWVzX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0Y2lfZW5kID0gY2lfb2ZmICsgbnI7XG4gXHRkbyB7XG4gXHRcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4tXHRcdGlmIChzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgPT0gMSkge1xuK1x0XHQvKlxuK1x0XHQgKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5O1xuK1x0XHQgKiBoYW5kbGUgdGhlbSBiZWZvcmUgc3dwX3RiX2dldF9jb3VudCAod2hpY2ggcmV0dXJuc1xuK1x0XHQgKiAtRUlOVkFMIGZvciBub24tY291bnRhYmxlIHR5cGVzKS5cbitcdFx0ICovXG4rXHRcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4rXHRcdFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XG4rXHRcdFx0XHRpZiAoY2lfYmF0Y2ggPT0gLTEpXG4rXHRcdFx0XHRcdGNpX2JhdGNoID0gY2lfb2ZmO1xuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0fVxuK1x0XHR9IGVsc2UgaWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XG4gXHRcdFx0LyogY291bnQgPT0gMSBhbmQgbm9uLWNhY2hlZCBzbG90cyB3aWxsIGJlIGJhdGNoIGZyZWVkLiAqL1xuIFx0XHRcdGlmICghc3dwX3RiX2lzX2ZvbGlvKHN3cF90YikpIHtcbiBcdFx0XHRcdGlmIChjaV9iYXRjaCA9PSAtMSlcbkBAIC0xNjQ3LDYgKzE2ODUsMTEgQEAgc3RhdGljIGludCBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdC8qIEJhZCBvciBzcGVjaWFsIHNsb3RzIGNhbid0IGJlIGhhbmRsZWQgKi9cbiBcdGlmIChXQVJOX09OX09OQ0Uoc3dwX3RiX2lzX2JhZChzd3BfdGIpKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHQvKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5IHN0cnVjdCAqL1xuK1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpXG4rXHRcdHJldHVybiB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHN3cF90YiwgY2ksIGNpX29mZik7XG4rXG4gXHRjb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChzd3BfdGIpO1xuIFx0LyogTXVzdCBiZSBlaXRoZXIgY2FjaGVkIG9yIGhhdmUgYSBjb3VudCBhbHJlYWR5ICovXG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFjb3VudCBcdTAwMjZcdTAwMjYgIXN3cF90Yl9pc19mb2xpbyhzd3BfdGIpKSlcbkBAIC0xOTIzLDEzICsxOTY2LDI2IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0b2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbiBcdFx0LypcbiBcdFx0ICogRnJlZWluZyBpcyBkb25lIGFmdGVyIHJlbGVhc2Ugb2YgdGhlIGxhc3Qgc3dhcCBjb3VudFxuLVx0XHQgKiByZWYsIG9yIGFmdGVyIHN3YXAgY2FjaGUgaXMgZHJvcHBlZFxuK1x0XHQgKiByZWYsIG9yIGFmdGVyIHN3YXAgY2FjaGUgaXMgZHJvcHBlZC4gQSBQb2ludGVyIGVudHJ5XG4rXHRcdCAqIG1lYW5zIHpzd2FwIGhhcyBhIGNvbXByZXNzZWQgY29weTsgdGhlIHhhcnJheSBzdGlsbFxuK1x0XHQgKiBob2xkcyB0aGUgZW50cnkgYW5kIHpzd2FwX2ludmFsaWRhdGUgd2lsbCBmcmVlIGl0LlxuIFx0XHQgKi9cbi1cdFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpIHx8IF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpIFx1MDAzZSAxKTtcbitcdFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpIHtcbitcdFx0XHRWTV9XQVJOX09OKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSBcdTAwM2UgMSk7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBGcmVlIHRoZSB6c3dhcCBlbnRyeSBub3cgdW5kZXIgY2ktXHUwMDNlbG9jayB3aGlsZVxuK1x0XHRcdCAqIHRoZSBQb2ludGVyIGlzIHN0aWxsIGluIHRoZSBzd2FwIHRhYmxlLiAgT25jZVxuK1x0XHRcdCAqIHdlIG51bGwgdGhlIHNsb3QsIHRoZSBlbnRyeSB3b3VsZCBiZSBsZWFrZWQuXG4rXHRcdFx0ICovXG4rXHRcdFx0enN3YXBfZW50cnlfZnJlZShzd3BfdGJfdG9fcG9pbnRlcihvbGRfdGIpKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRWTV9XQVJOX09OKCFzd3BfdGJfaXNfc2hhZG93KG9sZF90YikgfHxcbitcdFx0XHRcdCAgIF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpIFx1MDAzZSAxKTtcbitcdFx0fVxuIFxuIFx0XHQvKiBSZXNldHRpbmcgdGhlIHNsb3QgdG8gTlVMTCBhbHNvIGNsZWFycyB0aGUgaW5saW5lIGZsYWdzLiAqL1xuIFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIG51bGxfdG9fc3dwX3RiKCkpO1xuLVx0XHRpZiAoIVNXQVBfVEFCTEVfSEFTX1pFUk9GTEFHKVxuK1x0XHRpZiAoIVNXQVBfVEFCTEVfSEFTX1pFUk9GTEFHIFx1MDAyNlx1MDAyNiAhc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSlcbiBcdFx0XHRfX3N3YXBfdGFibGVfY2xlYXJfemVybyhjaSwgY2lfb2ZmKTtcbiBcbiBcdFx0LypcbkBAIC0xOTYxLDggKzIwMTcsMTEgQEAgaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gX19zd2FwX2VudHJ5X3RvX2NsdXN0ZXIoZW50cnkpO1xuIFx0dW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSk7XG4rXHR1bnNpZ25lZCBsb25nIHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4gXG4tXHRyZXR1cm4gc3dwX3RiX2dldF9jb3VudChfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKTtcbitcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxuK1x0XHRyZXR1cm4genN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpO1xuK1x0cmV0dXJuIHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcbiB9XG4gXG4gLyoqXG5AQCAtMTk4MCw2ICsyMDM5LDggQEAgYm9vbCBzd2FwX2VudHJ5X3N3YXBwZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzd3BfZW50cnlfdCBlbnRyeSlcbiBcdHN3cF90YiA9IHN3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuIFxuK1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpXG4rXHRcdHJldHVybiB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXHUwMDNlIDA7XG4gXHRyZXR1cm4gc3dwX3RiX2dldF9jb3VudChzd3BfdGIpIFx1MDAzZSAwO1xuIH1cbiBcbkBAIC0yMDIwLDcgKzIwODEsNyBAQCBpbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbiAgKlxuICAqIENvbnRleHQ6IENhbGxlciBtdXN0IGVuc3VyZSB0aGUgZm9saW8gaXMgbG9ja2VkIGFuZCBpbiB0aGUgc3dhcCBjYWNoZS5cbiAgKi9cbi1zdGF0aWMgYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4rYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0c3dwX2VudHJ5X3QgZW50cnkgPSBmb2xpby1cdTAwM2Vzd2FwO1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbkBAIC0yNTU2LDggKzI2MTcsMTIgQEAgc3RhdGljIGludCB1bnVzZV9wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG4gXHRcdGlmICghZm9saW8pIHtcbiBcdFx0XHRzd3BfdGIgPSBzd2FwX3RhYmxlX2dldChfX3N3YXBfZW50cnlfdG9fY2x1c3RlcihlbnRyeSksXG4gXHRcdFx0XHRcdFx0c3dwX2NsdXN0ZXJfb2Zmc2V0KGVudHJ5KSk7XG4tXHRcdFx0aWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcdTAwM2M9IDApXG4rXHRcdFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcbitcdFx0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXHUwMDNjPSAwKVxuK1x0XHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9IGVsc2UgaWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcdTAwM2M9IDApIHtcbiBcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdFx0fVxuIFxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCA3NjFjZDY5OWUwYTNlNi4uZjk3NjJkMGE1OTZhYjQgMTAwNjQ0XG4tLS0gYS9tbS96c3dhcC5jXG4rKysgYi9tbS96c3dhcC5jXG5AQCAtMzgsNiArMzgsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3pzbWFsbG9jLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcInN3YXAuaFwiXG4rI2luY2x1ZGUgXCJzd2FwX3RhYmxlLmhcIlxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gXG4gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQEAgLTE4Miw2ICsxODMsMTAgQEAgc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqenN3YXBfc2hyaW5rZXI7XG4gICogICAgICAgICAgICAgIHdyaXRlYmFjayBsb2dpYy4gVGhlIGVudHJ5IGlzIG9ubHkgcmVjbGFpbWVkIGJ5IHRoZSB3cml0ZWJhY2tcbiAgKiAgICAgICAgICAgICAgbG9naWMgaWYgcmVmZXJlbmNlZCBpcyB1bnNldC4gU2VlIGNvbW1lbnRzIGluIHRoZSBzaHJpbmtlclxuICAqICAgICAgICAgICAgICBzZWN0aW9uIGZvciBjb250ZXh0LlxuKyAqIHN3cF90Yl92YWwgLSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZSBzYXZlZCB3aGVuIHRoaXMgenN3YXBfZW50cnlcbisgKiAgICAgICAgICAgICAgcmVwbGFjZWQgYSBTaGFkb3cgb3IgUEZOIGVudHJ5LiBJdCBwcmVzZXJ2ZXMgdGhlIHN3YXAgY291bnQsXG4rICogICAgICAgICAgICAgIHplcm8gZmxhZywgYW5kIHdvcmtpbmcgc2V0IHNoYWRvdyBpbmZvcm1hdGlvbiAoU0hBRE9XX1ZBTClcbisgKiAgICAgICAgICAgICAgdGhhdCB0aGUgU2hhZG93IGVudHJ5IGNhcnJpZWQuXG4gICogcG9vbCAtIHRoZSB6c3dhcF9wb29sIHRoZSBlbnRyeSdzIGRhdGEgaXMgaW5cbiAgKiBoYW5kbGUgLSB6c21hbGxvYyBhbGxvY2F0aW9uIGhhbmRsZSB0aGF0IHN0b3JlcyB0aGUgY29tcHJlc3NlZCBwYWdlIGRhdGFcbiAgKiBvYmpjZyAtIHRoZSBvYmpfY2dyb3VwIHRoYXQgdGhlIGNvbXByZXNzZWQgbWVtb3J5IGlzIGNoYXJnZWQgdG9cbkBAIC0xOTEsMTUgKzE5NiwxMyBAQCBzdHJ1Y3QgenN3YXBfZW50cnkge1xuIFx0c3dwX2VudHJ5X3Qgc3dwZW50cnk7XG4gXHR1bnNpZ25lZCBpbnQgbGVuZ3RoO1xuIFx0Ym9vbCByZWZlcmVuY2VkO1xuK1x0dW5zaWduZWQgbG9uZyBzd3BfdGJfdmFsO1xuIFx0c3RydWN0IHpzd2FwX3Bvb2wgKnBvb2w7XG4gXHR1bnNpZ25lZCBsb25nIGhhbmRsZTtcbiBcdHN0cnVjdCBvYmpfY2dyb3VwICpvYmpjZztcbiBcdHN0cnVjdCBsaXN0X2hlYWQgbHJ1O1xuIH07XG4gXG4tc3RhdGljIHN0cnVjdCB4YXJyYXkgKnpzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdO1xuLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfenN3YXBfdHJlZXNbTUFYX1NXQVBGSUxFU107XG4tXG4gLyogUkNVLXByb3RlY3RlZCBpdGVyYXRpb24gKi9cbiBzdGF0aWMgTElTVF9IRUFEKHpzd2FwX3Bvb2xzKTtcbiAvKiBwcm90ZWN0cyB6c3dhcF9wb29scyBsaXN0IG1vZGlmaWNhdGlvbiAqL1xuQEAgLTIyNSwxNSArMjI4LDYgQEAgc3RhdGljIGJvb2wgenN3YXBfaGFzX3Bvb2w7XG4gKiBoZWxwZXJzIGFuZCBmd2QgZGVjbGFyYXRpb25zXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiBcbi0vKiBPbmUgc3dhcCBhZGRyZXNzIHNwYWNlIGZvciBlYWNoIDY0TSBzd2FwIHNwYWNlICovXG4tI2RlZmluZSBaU1dBUF9BRERSRVNTX1NQQUNFX1NISUZUIDE0XG4tI2RlZmluZSBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTICgxIFx1MDAzY1x1MDAzYyBaU1dBUF9BRERSRVNTX1NQQUNFX1NISUZUKVxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHhhcnJheSAqc3dhcF96c3dhcF90cmVlKHN3cF9lbnRyeV90IHN3cClcbi17XG4tXHRyZXR1cm4gXHUwMDI2enN3YXBfdHJlZXNbc3dwX3R5cGUoc3dwKV1bc3dwX29mZnNldChzd3ApXG4tXHRcdFx1MDAzZVx1MDAzZSBaU1dBUF9BRERSRVNTX1NQQUNFX1NISUZUXTtcbi19XG4tXG4gI2RlZmluZSB6c3dhcF9wb29sX2RlYnVnKG1zZywgcClcdFx0XHRcXFxuIFx0cHJfZGVidWcoXCIlcyBwb29sICVzXFxuXCIsIG1zZywgKHApLVx1MDAzZXRmbV9uYW1lKVxuIFxuQEAgLTc2Miw3ICs3NTYsNyBAQCBzdGF0aWMgdm9pZCB6c3dhcF9lbnRyeV9jYWNoZV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXG4gICogQ2FycmllcyBvdXQgdGhlIGNvbW1vbiBwYXR0ZXJuIG9mIGZyZWVpbmcgYW4gZW50cnkncyB6c21hbGxvYyBhbGxvY2F0aW9uLFxuICAqIGZyZWVpbmcgdGhlIGVudHJ5IGl0c2VsZiwgYW5kIGRlY3JlbWVudGluZyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBwYWdlcy5cbiAgKi9cbi1zdGF0aWMgdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXG4rdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXG4ge1xuIFx0enN3YXBfbHJ1X2RlbChcdTAwMjZ6c3dhcF9saXN0X2xydSwgZW50cnkpO1xuIFx0enNfZnJlZShlbnRyeS1cdTAwM2Vwb29sLVx1MDAzZXpzX3Bvb2wsIGVudHJ5LVx1MDAzZWhhbmRsZSk7XG5AQCAtOTg3LDExICs5ODEsMTIgQEAgc3RhdGljIGJvb2wgenN3YXBfZGVjb21wcmVzcyhzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHRcdFx0XHQgc3dwX2VudHJ5X3Qgc3dwZW50cnkpXG4ge1xuLVx0c3RydWN0IHhhcnJheSAqdHJlZTtcbiBcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3BlbnRyeSk7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuIFx0c3RydWN0IG1lbXBvbGljeSAqbXBvbDtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbitcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4rXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcbiBcdGludCByZXQgPSAwO1xuIFxuIFx0LyogdHJ5IHRvIGFsbG9jYXRlIHN3YXAgY2FjaGUgZm9saW8gKi9cbkBAIC05OTksOSArOTk0LDI1IEBAIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHRpZiAoIXNpKVxuIFx0XHRyZXR1cm4gLUVFWElTVDtcbiBcbitcdC8qXG4rXHQgKiBWZXJpZnkgdGhlIHN3YXAgdGFibGUgUG9pbnRlciBlbnRyeSBzdGlsbCByZWZlcmVuY2VzIHRoaXNcbitcdCAqIHpzd2FwX2VudHJ5LiBJZiB0aGUgZW50cnkgd2FzIGludmFsaWRhdGVkIG9yIHJlcGxhY2VkIGJ5IGFcbitcdCAqIGNvbmN1cnJlbnQgc3RvcmUsIHRoZSBQb2ludGVyIHdpbGwgYmUgZ29uZSBvciBwb2ludCBlbHNld2hlcmUuXG4rXHQgKi9cbitcdGNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1x0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XG4rXHRpZiAoIXN3cF90Yl9pc19wb2ludGVyKHN3cF90YikgfHxcbitcdCAgICBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpICE9IGVudHJ5KSB7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1x0XHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdH1cbitcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1xuIFx0bXBvbCA9IGdldF90YXNrX3BvbGljeShjdXJyZW50KTtcbiBcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLFxuLVx0XHRcdFx0ICAgICAgIE5PX0lOVEVSTEVBVkVfSU5ERVgpO1xuK1x0XHRcdFx0ICAgICAgIE5PX0lOVEVSTEVBVkVfSU5ERVgsIE5VTEwpO1xuIFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcbiBcbiBcdC8qXG5AQCAtMTAxNSwyNyArMTAyNiwxNSBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LFxuIFx0XHRyZXR1cm4gUFRSX0VSUihmb2xpbyk7XG4gXG4gXHQvKlxuLVx0ICogZm9saW8gaXMgbG9ja2VkLCBhbmQgdGhlIHN3YXBjYWNoZSBpcyBub3cgc2VjdXJlZCBhZ2FpbnN0XG4tXHQgKiBjb25jdXJyZW50IHN3YXBwaW5nIHRvIGFuZCBmcm9tIHRoZSBzbG90LCBhbmQgY29uY3VycmVudFxuLVx0ICogc3dhcG9mZiBzbyB3ZSBjYW4gc2FmZWx5IGRlcmVmZXJlbmNlIHRoZSB6c3dhcCB0cmVlIGhlcmUuXG4tXHQgKiBWZXJpZnkgdGhhdCB0aGUgc3dhcCBlbnRyeSBoYXNuJ3QgYmVlbiBpbnZhbGlkYXRlZCBhbmQgcmVjeWNsZWRcbi1cdCAqIGJlaGluZCBvdXIgYmFja3MsIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGEgbmV3IHN3YXAgZm9saW8gd2l0aFxuLVx0ICogb2xkIGNvbXByZXNzZWQgZGF0YS4gT25seSB3aGVuIHRoaXMgaXMgc3VjY2Vzc2Z1bCBjYW4gdGhlIGVudHJ5XG4tXHQgKiBiZSBkZXJlZmVyZW5jZWQuXG4rXHQgKiBUaGUgZm9saW8gaXMgbm93IGxvY2tlZCBhbmQgaW4gc3dhcCBjYWNoZSwgc28gY29uY3VycmVudFxuK1x0ICogc3RvcmVzIGFyZSBibG9ja2VkLiBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvIGFscmVhZHlcbitcdCAqIG92ZXJ3cm90ZSB0aGUgUG9pbnRlciBlbnRyeSB3aXRoIGEgUEZOLlxuIFx0ICovXG4tXHR0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cGVudHJ5KTtcbi1cdGlmIChlbnRyeSAhPSB4YV9sb2FkKHRyZWUsIG9mZnNldCkpIHtcbi1cdFx0cmV0ID0gLUVOT01FTTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4gXHRpZiAoIXpzd2FwX2RlY29tcHJlc3MoZW50cnksIGZvbGlvKSkge1xuIFx0XHRyZXQgPSAtRUlPO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4tXG4gXHRjb3VudF92bV9ldmVudChaU1dQV0IpO1xuIFx0aWYgKGVudHJ5LVx1MDAzZW9iamNnKVxuIFx0XHRjb3VudF9vYmpjZ19ldmVudHMoZW50cnktXHUwMDNlb2JqY2csIFpTV1BXQiwgMSk7XG5AQCAtMTEwNSwzNiArMTEwNCwyMiBAQCBzdGF0aWMgZW51bSBscnVfc3RhdHVzIHNocmlua19tZW1jZ19jYihzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCBzdHJ1Y3QgbGlzdF9scnVfb1xuIFx0fVxuIFxuIFx0Lypcbi1cdCAqIEFzIHNvb24gYXMgd2UgZHJvcCB0aGUgTFJVIGxvY2ssIHRoZSBlbnRyeSBjYW4gYmUgZnJlZWQgYnlcbi1cdCAqIGEgY29uY3VycmVudCBpbnZhbGlkYXRpb24uIFRoaXMgbWVhbnMgdGhlIGZvbGxvd2luZzpcbi1cdCAqXG4tXHQgKiAxLiBXZSBleHRyYWN0IHRoZSBzd3BfZW50cnlfdCB0byB0aGUgc3RhY2ssIGFsbG93aW5nXG4tXHQgKiAgICB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSB0byBwaW4gdGhlIHN3YXAgZW50cnkgYW5kXG4tXHQgKiAgICB0aGVuIHZhbGlkYXRlIHRoZSB6c3dhcCBlbnRyeSBhZ2FpbnN0IHRoYXQgc3dhcCBlbnRyeSdzXG4tXHQgKiAgICB0cmVlIHVzaW5nIHBvaW50ZXIgdmFsdWUgY29tcGFyaXNvbi4gT25seSB3aGVuIHRoYXRcbi1cdCAqICAgIGlzIHN1Y2Nlc3NmdWwgY2FuIHRoZSBlbnRyeSBiZSBkZXJlZmVyZW5jZWQuXG4tXHQgKlxuLVx0ICogMi4gVXN1YWxseSwgb2JqZWN0cyBhcmUgdGFrZW4gb2ZmIHRoZSBMUlUgZm9yIHJlY2xhaW0uIEluXG4tXHQgKiAgICB0aGlzIGNhc2UgdGhpcyBpc24ndCBwb3NzaWJsZSwgYmVjYXVzZSBpZiByZWNsYWltIGZhaWxzXG4tXHQgKiAgICBmb3Igd2hhdGV2ZXIgcmVhc29uLCB3ZSBoYXZlIG5vIG1lYW5zIG9mIGtub3dpbmcgaWYgdGhlXG4tXHQgKiAgICBlbnRyeSBpcyBhbGl2ZSB0byBwdXQgaXQgYmFjayBvbiB0aGUgTFJVLlxuK1x0ICogQWZ0ZXIgd2UgZHJvcCB0aGUgTFJVIGxvY2ssIHRoZSBlbnRyeSBtYXkgYmUgZnJlZWQgYnkgYVxuK1x0ICogY29uY3VycmVudCBzd2FwIHNsb3QgZnJlZS4gIFRoaXMgaXMgc2FmZSBiZWNhdXNlXG4rXHQgKiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSByZWNoZWNrcyB0aGUgc3dhcCB0YWJsZSB1bmRlclxuK1x0ICogY2ktXHUwMDNlbG9jayBiZWZvcmUgZGVyZWZlcmVuY2luZyBlbnRyeTsgaWYgdGhlIFBvaW50ZXIgaXNcbitcdCAqIGdvbmUgaXQgYmFpbHMgb3V0LlxuIFx0ICpcbi1cdCAqICAgIFNvIHJvdGF0ZSBpdCBiZWZvcmUgZHJvcHBpbmcgdGhlIGxvY2suIElmIHRoZSBlbnRyeSBpc1xuLVx0ICogICAgd3JpdHRlbiBiYWNrIG9yIGludmFsaWRhdGVkLCB0aGUgZnJlZSBwYXRoIHdpbGwgdW5saW5rXG4tXHQgKiAgICBpdC4gRm9yIGZhaWx1cmVzLCByb3RhdGlvbiBpcyB0aGUgcmlnaHQgdGhpbmcgYXMgd2VsbC5cbi1cdCAqXG4tXHQgKiAgICBUZW1wb3JhcnkgZmFpbHVyZXMsIHdoZXJlIHRoZSBzYW1lIGVudHJ5IHNob3VsZCBiZSB0cmllZFxuLVx0ICogICAgYWdhaW4gaW1tZWRpYXRlbHksIGFsbW9zdCBuZXZlciBoYXBwZW4gZm9yIHRoaXMgc2hyaW5rZXIuXG4tXHQgKiAgICBXZSBkb24ndCBkbyBhbnkgdHJ5bG9ja2luZzsgLUVOT01FTSBjb21lcyBjbG9zZXN0LFxuLVx0ICogICAgYnV0IHRoYXQncyBleHRyZW1lbHkgcmFyZSBhbmQgZG9lc24ndCBoYXBwZW4gc3B1cmlvdXNseVxuLVx0ICogICAgZWl0aGVyLiBEb24ndCBib3RoZXIgZGlzdGluZ3Vpc2hpbmcgdGhpcyBjYXNlLlxuK1x0ICogUm90YXRlIHRoZSBlbnRyeSBiZWZvcmUgZHJvcHBpbmcgdGhlIGxvY2s6IGlmIGl0IGdldHNcbitcdCAqIHdyaXR0ZW4gYmFjayBvciBpbnZhbGlkYXRlZCB0aGUgZnJlZSBwYXRoIHdpbGwgdW5saW5rXG4rXHQgKiBpdCBmcm9tIHRoZSBMUlUuICBGb3IgZmFpbHVyZXMgcm90YXRpb24gaXMgZmluZS5cbiBcdCAqL1xuIFx0bGlzdF9tb3ZlX3RhaWwoaXRlbSwgXHUwMDI2bC1cdTAwM2VsaXN0KTtcbiBcbiBcdC8qXG4tXHQgKiBPbmNlIHRoZSBscnUgbG9jayBpcyBkcm9wcGVkLCB0aGUgZW50cnkgbWlnaHQgZ2V0IGZyZWVkLiBUaGVcbi1cdCAqIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2ssIGFuZCBlbnRyeSBpc24ndCBkZXJlZidkIGFnYWluXG4tXHQgKiB1bnRpbCB0aGUgZW50cnkgaXMgdmVyaWZpZWQgdG8gc3RpbGwgYmUgYWxpdmUgaW4gdGhlIHRyZWUuXG4rXHQgKiBUaGUgc3dwZW50cnkgaXMgY29waWVkIHRvIHRoZSBzdGFjayBzbyB3ZSBjYW4gcGluIHRoZSBzd2FwXG4rXHQgKiBkZXZpY2UgYW5kIHZhbGlkYXRlIHRoZSBlbnRyeSdzIHN3YXAgdGFibGUgUG9pbnRlciB1bmRlclxuK1x0ICogY2ktXHUwMDNlbG9jayBpbiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKS5cbiBcdCAqL1xuIFx0c3dwZW50cnkgPSBlbnRyeS1cdTAwM2Vzd3BlbnRyeTtcbiBcbkBAIC0xMzk4LDcgKzEzODMsMTEgQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdFx0XHQgICAgIHN0cnVjdCB6c3dhcF9wb29sICpwb29sKVxuIHtcbiBcdHN3cF9lbnRyeV90IHBhZ2Vfc3dwZW50cnkgPSBwYWdlX3N3YXBfZW50cnkocGFnZSk7XG4tXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCAqb2xkO1xuK1x0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgKm9sZCA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuK1x0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHBhZ2Vfc3dwZW50cnkpO1xuK1x0dW5zaWduZWQgbG9uZyBzd3BfdGI7XG4gXG4gXHQvKiBhbGxvY2F0ZSBlbnRyeSAqL1xuIFx0ZW50cnkgPSB6c3dhcF9lbnRyeV9jYWNoZV9hbGxvYyhHRlBfS0VSTkVMLCBwYWdlX3RvX25pZChwYWdlKSk7XG5AQCAtMTQxMCwzMSArMTM5OSw0OSBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0aWYgKCF6c3dhcF9jb21wcmVzcyhwYWdlLCBlbnRyeSwgcG9vbCkpXG4gXHRcdGdvdG8gY29tcHJlc3NfZmFpbGVkO1xuIFxuLVx0b2xkID0geGFfc3RvcmUoc3dhcF96c3dhcF90cmVlKHBhZ2Vfc3dwZW50cnkpLFxuLVx0XHQgICAgICAgc3dwX29mZnNldChwYWdlX3N3cGVudHJ5KSxcbi1cdFx0ICAgICAgIGVudHJ5LCBHRlBfS0VSTkVMKTtcbi1cdGlmICh4YV9pc19lcnIob2xkKSkge1xuLVx0XHRpbnQgZXJyID0geGFfZXJyKG9sZCk7XG4tXG4tXHRcdFdBUk5fT05DRShlcnIgIT0gLUVOT01FTSwgXCJ1bmV4cGVjdGVkIHhhcnJheSBlcnJvcjogJWRcXG5cIiwgZXJyKTtcbi1cdFx0enN3YXBfcmVqZWN0X2FsbG9jX2ZhaWwrKztcbi1cdFx0Z290byBzdG9yZV9mYWlsZWQ7XG4rXHQvKlxuK1x0ICogU3RvcmUgdGhlIHpzd2FwX2VudHJ5IHBvaW50ZXIgaW4gdGhlIHN3YXAgdGFibGUgYXMgYVxuK1x0ICogUG9pbnRlci10eXBlIGVudHJ5LCByZXBsYWNpbmcgdGhlIFBGTiBvciBTaGFkb3cgZW50cnkuXG4rXHQgKiBUaGUgZnVsbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlIChpbmNsdWRpbmcgd29ya2luZyBzZXRcbitcdCAqIHNoYWRvdykgaXMgcHJlc2VydmVkIGluIGVudHJ5LVx1MDAzZXN3cF90Yl92YWwuXG4rXHQgKiBGb2xpbyBsb2NrIHNlcmlhbGl6ZXMgY29uY3VycmVudCBzdG9yZXMuXG4rXHQgKi9cbitcdHNpID0gX19zd2FwX2VudHJ5X3RvX2luZm8ocGFnZV9zd3BlbnRyeSk7XG4rXHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgb2Zmc2V0KTtcbitcdHNwaW5fbG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbitcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuK1x0aWYgKHN3cF90Yl9pc19jb3VudGFibGUoc3dwX3RiKSkge1xuK1x0XHQvKlxuK1x0XHQgKiBTYXZlIHRoZSBjb21wbGV0ZSBvcmlnaW5hbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlXG4rXHRcdCAqIChTaGFkb3cgb3IgUEZOKSwgcHJlc2VydmluZyBzd2FwIGNvdW50LCB6ZXJvIGZsYWcsXG4rXHRcdCAqIGFuZCB3b3JraW5nIHNldCBzaGFkb3cgaW5mb3JtYXRpb24uXG4rXHRcdCAqL1xuK1x0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gc3dwX3RiO1xuK1x0fSBlbHNlIGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFJlcGxhY2luZyBhbiBleGlzdGluZyBQb2ludGVyIGVudHJ5IChlLmcuIGZyb20gYVxuK1x0XHQgKiByZWRpcnRpZWQgZm9saW8pLiBJbmhlcml0IHRoZSBzYXZlZCBzd2FwIHRhYmxlIHZhbHVlLlxuK1x0XHQgKi9cbitcdFx0b2xkID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcdFx0ZW50cnktXHUwMDNlc3dwX3RiX3ZhbCA9IG9sZC1cdTAwM2Vzd3BfdGJfdmFsO1xuIFx0fVxuLVxuK1x0X19zd2FwX3RhYmxlX3NldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUixcbitcdFx0XHQgcG9pbnRlcl90b19zd3BfdGIoZW50cnkpKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuIFx0Lypcbi1cdCAqIFdlIG1heSBoYXZlIGhhZCBhbiBleGlzdGluZyBlbnRyeSB0aGF0IGJlY2FtZSBzdGFsZSB3aGVuXG4tXHQgKiB0aGUgZm9saW8gd2FzIHJlZGlydGllZCBhbmQgbm93IHRoZSBuZXcgdmVyc2lvbiBpcyBiZWluZ1xuLVx0ICogc3dhcHBlZCBvdXQuIEdldCByaWQgb2YgdGhlIG9sZC5cbitcdCAqIElmIHdlIGhhZCBhbiBleGlzdGluZyB6c3dhcCBlbnRyeSBmcm9tIHRoZSBzd2FwIHRhYmxlXG4rXHQgKiAoZS5nLiBmcm9tIGEgcHJldmlvdXMgcmVkaXJ0aWVkIGZvbGlvKSwgZ2V0IHJpZCBvZiBpdFxuK1x0ICogb3V0c2lkZSB0aGUgbG9jay5cbiBcdCAqL1xuIFx0aWYgKG9sZClcbiBcdFx0enN3YXBfZW50cnlfZnJlZShvbGQpO1xuIFxuIFx0Lypcbi1cdCAqIFRoZSBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIHRoZSB0cmVlLCB0aGVyZSBpc1xuLVx0ICogbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2wgYW5kIG9iamNnLFxuLVx0ICogY2hhcmdlIHpzd2FwIG1lbW9yeSwgYW5kIGluY3JlbWVudCB6c3dhcF9zdG9yZWRfcGFnZXMuXG4rXHQgKiBUaGUgZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IGNvbXByZXNzZWQgYW5kIHN0b3JlZCBpbiB0aGUgc3dhcCB0YWJsZSxcbitcdCAqIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcG9zc2liaWxpdHkgb2YgZmFpbHVyZS4gR3JhYiByZWZzIHRvIHRoZSBwb29sXG4rXHQgKiBhbmQgb2JqY2csIGNoYXJnZSB6c3dhcCBtZW1vcnksIGFuZCBpbmNyZW1lbnQgenN3YXBfc3RvcmVkX3BhZ2VzLlxuIFx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXG4tXHQgKiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUuXG4rXHQgKiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHN3YXAgdGFibGUuXG4gXHQgKi9cbiBcdHpzd2FwX3Bvb2xfZ2V0KHBvb2wpO1xuIFx0aWYgKG9iamNnKSB7XG5AQCAtMTQ0Niw4ICsxNDUzLDggQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdFx0YXRvbWljX2xvbmdfaW5jKFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XG4gXG4gXHQvKlxuLVx0ICogV2UgZmluaXNoIGluaXRpYWxpemluZyB0aGUgZW50cnkgd2hpbGUgaXQncyBhbHJlYWR5IGluIHhhcnJheS5cbi1cdCAqIFRoaXMgaXMgc2FmZSBiZWNhdXNlOlxuK1x0ICogV2UgZmluaXNoIGluaXRpYWxpemluZyB0aGUgZW50cnkgd2hpbGUgaXQncyBhbHJlYWR5IGluIHRoZVxuK1x0ICogc3dhcCB0YWJsZS4gVGhpcyBpcyBzYWZlIGJlY2F1c2U6XG4gXHQgKlxuIFx0ICogMS4gQ29uY3VycmVudCBzdG9yZXMgYW5kIGludmFsaWRhdGlvbnMgYXJlIGV4Y2x1ZGVkIGJ5IGZvbGlvIGxvY2suXG4gXHQgKlxuQEAgLTE0NjYsOCArMTQ3Myw2IEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXG4gXHRyZXR1cm4gdHJ1ZTtcbiBcbi1zdG9yZV9mYWlsZWQ6XG4tXHR6c19mcmVlKHBvb2wtXHUwMDNlenNfcG9vbCwgZW50cnktXHUwMDNlaGFuZGxlKTtcbiBjb21wcmVzc19mYWlsZWQ6XG4gXHR6c3dhcF9lbnRyeV9jYWNoZV9mcmVlKGVudHJ5KTtcbiBcdHJldHVybiBmYWxzZTtcbkBAIC0xNTQ2LDExICsxNTUxLDMxIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0dW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7XG4gXHRcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xuIFx0XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuLVx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xuK1x0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuK1x0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzO1xuK1x0XHR1bnNpZ25lZCBsb25nIHN3cF90YjtcbiBcbitcdFx0c2lzID0gX19zd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcbiBcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgKytpbmRleCkge1xuLVx0XHRcdHRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XG4tXHRcdFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgKyBpbmRleCk7XG4rXHRcdFx0Y2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2lzLCBvZmZzZXQgKyBpbmRleCk7XG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1x0XHRcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIChvZmZzZXQgKyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSKTtcbitcdFx0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkge1xuK1x0XHRcdFx0ZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuK1x0XHRcdFx0LypcbitcdFx0XHRcdCAqIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnlcbitcdFx0XHRcdCAqIChTaGFkb3cgb3IgUEZOKSB0aGF0IHdhcyBzYXZlZCB3aGVuIHRoZVxuK1x0XHRcdFx0ICogUG9pbnRlciBlbnRyeSB3YXMgY3JlYXRlZCwgcmF0aGVyIHRoYW5cbitcdFx0XHRcdCAqIHplcm9pbmcgdGhlIHNsb3QuICBUaGlzIHByZXNlcnZlcyB0aGUgc3dhcFxuK1x0XHRcdFx0ICogY291bnQgYW5kIGZsYWdzIHNvIHRoZSBzd2FwIGNhY2hlIGZvbGlvXG4rXHRcdFx0XHQgKiBjYW4gYmUgY29ycmVjdGx5IGNsZWFuZWQgdXAgbGF0ZXIuXG4rXHRcdFx0XHQgKi9cbitcdFx0XHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIChvZmZzZXQgKyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSLFxuK1x0XHRcdFx0XHRcdCBlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbitcdFx0XHR9IGVsc2Uge1xuK1x0XHRcdFx0ZW50cnkgPSBOVUxMO1xuK1x0XHRcdH1cbitcdFx0XHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiBcdFx0XHRpZiAoZW50cnkpXG4gXHRcdFx0XHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcbiBcdFx0fVxuQEAgLTE1NjIsNiArMTU4NywxMSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gLyoqXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbisgKiBAemVudHJ5OiB6c3dhcF9lbnRyeSBwb2ludGVyIGV4dHJhY3RlZCBmcm9tIHN3YXAgdGFibGUsIG9yIE5VTExcbisgKlxuKyAqIFRoZSB6c3dhcF9lbnRyeSB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIHN3YXAgdGFibGUgUG9pbnRlciBlbnRyeSBieVxuKyAqIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8gYmVmb3JlIGl0IG92ZXJ3cm90ZSB0aGUgZW50cnkgd2l0aCBhIFBGTi5cbisgKiBJZiBAemVudHJ5IGlzIE5VTEwsIHRoZSBzbG90IHdhcyBub3QgYmFja2VkIGJ5IHpzd2FwLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXG4gICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcbkBAIC0xNTc5LDEyICsxNjA5LDkgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xuICAqICBsb2NrZWQgb24gcmV0dXJuLlxuICAqL1xuLWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4raW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KVxuIHtcbi1cdHN3cF9lbnRyeV90IHN3cCA9IGZvbGlvLVx1MDAzZXN3YXA7XG4tXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcbi1cdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4rXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gemVudHJ5O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xuIFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xuQEAgLTE2MDIsNyArMTYyOSw2IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuIFxuLVx0ZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7XG4gXHRpZiAoIWVudHJ5KVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbkBAIC0xNjI1LDcgKzE2NTEsNiBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0ICogY29tcHJlc3Npb24gd29yay5cbiBcdCAqL1xuIFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHR4YV9lcmFzZSh0cmVlLCBvZmZzZXQpO1xuIFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XG4gXG4gXHRmb2xpb191bmxvY2soZm9saW8pO1xuQEAgLTE2MzUsNTIgKzE2NjAsMTU5IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gdm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcbiB7XG4gXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcbitcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4rXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4rXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcbiBcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4gXG4tXHRpZiAoeGFfZW1wdHkodHJlZSkpXG4rXHRzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoc3dwKSk7XG4rXHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgb2Zmc2V0KTtcbitcdC8qXG4rXHQgKiBEbyBhIGxvY2tsZXNzIHBlZWsgZmlyc3QuICBJZiBjaS1cdTAwM2Vsb2NrIGlzIGFscmVhZHkgaGVsZCBieVxuK1x0ICogdGhlIGNhbGxlciAoZS5nLiBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMpLCBhbmQgdGhlXG4rXHQgKiBQb2ludGVyIGhhcyBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgd2UgY2FuIGJhaWwgb3V0IHdpdGhvdXRcbitcdCAqIHNlbGYtZGVhZGxvY2tpbmcuXG4rXHQgKi9cbitcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuK1x0aWYgKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4rXHRzcGluX2xvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4rXHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTtcbitcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4rXHRcdGVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcdFx0LypcbitcdFx0ICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSAoU2hhZG93IG9yIFBGTilcbitcdFx0ICogdGhhdCB3YXMgc2F2ZWQgaW4gc3dwX3RiX3ZhbCB3aGVuIHRoZSBQb2ludGVyIGVudHJ5XG4rXHRcdCAqIHdhcyBjcmVhdGVkLiAgVGhpcyBwcmVzZXJ2ZXMgc3dhcCBjb3VudCBhbmQgZmxhZ3NcbitcdFx0ICogZm9yIHRoZSBzdWJzZXF1ZW50IHNsb3QtZnJlZSBwYXRoLlxuK1x0XHQgKi9cbitcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUixcbitcdFx0XHRcdCBlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbitcdH0gZWxzZSB7XG4rXHRcdGVudHJ5ID0gTlVMTDtcbitcdH1cbitcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1xuIFx0aWYgKGVudHJ5KVxuIFx0XHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcbiB9XG4gXG4taW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbisvKlxuKyAqIEV4dHJhY3QgdGhlIHdvcmtpbmcgc2V0IHNoYWRvdyBmcm9tIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXG4rICogVGhlIHNoYWRvdyBpcyByZWNvdmVyZWQgZnJvbSB6c3dhcF9lbnRyeS1cdTAwM2Vzd3BfdGJfdmFsIHdoaWNoIHByZXNlcnZlc1xuKyAqIHRoZSBvcmlnaW5hbCBTaGFkb3cgZW50cnkgdmFsdWUuIFRoZSBzaGFkb3cgY2FuIHRoZW4gYmUgdXNlZCBieVxuKyAqIHdvcmtpbmdzZXRfcmVmYXVsdCgpIGZvciByZWZhdWx0IGRpc3RhbmNlIGNhbGN1bGF0aW9uLlxuKyAqL1xuK3ZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuIHtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWVzLCAqdHJlZTtcbi1cdHVuc2lnbmVkIGludCBuciwgaTtcbitcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuK1x0dW5zaWduZWQgbG9uZyBzYXZlZCA9IGVudHJ5LVx1MDAzZXN3cF90Yl92YWw7XG4gXG4tXHRuciA9IERJVl9ST1VORF9VUChucl9wYWdlcywgWlNXQVBfQUREUkVTU19TUEFDRV9QQUdFUyk7XG4tXHR0cmVlcyA9IGt2emFsbG9jX29ianMoKnRyZWUsIG5yKTtcbi1cdGlmICghdHJlZXMpIHtcbi1cdFx0cHJfZXJyKFwiYWxsb2MgZmFpbGVkLCB6c3dhcCBkaXNhYmxlZCBmb3Igc3dhcCB0eXBlICVkXFxuXCIsIHR5cGUpO1xuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdH1cbitcdC8qXG4rXHQgKiBzd3BfdGJfdmFsIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeS4gIE9ubHlcbitcdCAqIFNoYWRvdyBlbnRyaWVzIGNhcnJ5IHdvcmtpbmdzZXQgaW5mb3JtYXRpb247IFBGTiBhbmQgTlVMTFxuK1x0ICogZW50cmllcyBoYXZlIG5vIHNoYWRvdyB0byBleHRyYWN0LlxuK1x0ICovXG4rXHRpZiAoIXN3cF90Yl9pc19zaGFkb3coc2F2ZWQpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdHJldHVybiAodm9pZCAqKShzYXZlZCBcdTAwMjYgflNXUF9UQl9GTEFHU19NQVNLKTtcbit9XG4rXG4rLypcbisgKiBSZWFkIHRoZSBzd2FwIGNvdW50IGZyb20gYSBQb2ludGVyLXR5cGUgc3dhcCB0YWJsZSBlbnRyeS4gVGhlIGNvdW50XG4rICogYW5kIGZsYWdzIGFyZSBzdG9yZWQgaW4genN3YXBfZW50cnktXHUwMDNlc3dwX3RiX3ZhbCB3aGljaCBwcmVzZXJ2ZXMgdGhlXG4rICogb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZSAoU2hhZG93IG9yIFBGTiBmb3JtYXQpLlxuKyAqL1xuK3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcbitcdHJldHVybiBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCk7XG4rfVxuK1xuKy8qXG4rICogUmVhZCB0aGUgZmxhZ3MgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxuKyAqL1xuK3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcbitcdHJldHVybiBfX3N3cF90Yl9nZXRfZmxhZ3MoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCk7XG4rfVxuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKylcbi1cdFx0eGFfaW5pdCh0cmVlcyArIGkpO1xuKy8qXG4rICogSW5jcmVtZW50IHRoZSBzd2FwIGNvdW50IG9mIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXG4rICogVGhlIGNvdW50IGlzIHN0b3JlZCBpbiB6c3dhcF9lbnRyeS1cdTAwM2Vzd3BfdGJfdmFsIGZvciBjb3VudHMgYmVsb3dcbisgKiBTV1BfVEJfQ09VTlRfTUFYLCBhbmQgb3ZlcmZsb3dzIGludG8gdGhlIGNsdXN0ZXIncyBleHRlbmRfdGFibGVcbisgKiBqdXN0IGxpa2Ugbm9ybWFsIFNoYWRvdy9QRk4gZW50cmllcyBkby4gIFJldHVybnMgMCBvbiBzdWNjZXNzLFxuKyAqIC1FTk9NRU0gaWYgY291bnQgd291bGQgb3ZlcmZsb3cgYW5kIG5vIGV4dGVuZF90YWJsZSBpcyBhdmFpbGFibGUuXG4rICovXG4raW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4rXHRcdFx0ICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZilcbit7XG4rXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcdHVuc2lnbmVkIGNoYXIgY291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCk7XG4gXG4tXHRucl96c3dhcF90cmVlc1t0eXBlXSA9IG5yO1xuLVx0enN3YXBfdHJlZXNbdHlwZV0gPSB0cmVlcztcbitcdGlmIChjb3VudCBcdTAwM2MgU1dQX1RCX0NPVU5UX01BWCkge1xuK1x0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCxcbitcdFx0XHRcdFx0XHQgICAgICBjb3VudCArIDEpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcdC8qIGNvdW50ID09IE1BWCwgb3ZlcmZsb3cgaW50byBleHRlbmRfdGFibGUgKi9cbitcdGlmICghY2ktXHUwMDNlZXh0ZW5kX3RhYmxlKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdGNvdW50ID0gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XG4rXHRpZiAoY291bnQgPT0gMClcbitcdFx0Y291bnQgPSBTV1BfVEJfQ09VTlRfTUFYO1xuK1x0Y291bnQrKztcbitcdGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tdm9pZCB6c3dhcF9zd2Fwb2ZmKGludCB0eXBlKVxuKy8qXG4rICogRGVjcmVtZW50IHRoZSBzd2FwIGNvdW50IG9mIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXG4rICogSGFuZGxlcyBib3RoIGlubGluZSBjb3VudCAoaW4gc3dwX3RiX3ZhbCkgYW5kIG92ZXJmbG93ZWQgY291bnRcbisgKiAoaW4gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlKSwgbWF0Y2hpbmcgdGhlIGxvZ2ljIHVzZWQgYnkgbm9ybWFsIGVudHJpZXMuXG4rICovXG4rdm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuK1x0XHRcdCAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKVxuIHtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWVzID0genN3YXBfdHJlZXNbdHlwZV07XG4tXHR1bnNpZ25lZCBpbnQgaTtcbitcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuK1x0dW5zaWduZWQgY2hhciBjb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbitcbitcdFZNX1dBUk5fT05fT05DRShjb3VudCA9PSAwKTtcbiBcbi1cdGlmICghdHJlZXMpXG4rXHRpZiAoY291bnQgPT0gU1dQX1RCX0NPVU5UX01BWCkge1xuK1x0XHRpZiAoIWNpLVx1MDAzZWV4dGVuZF90YWJsZSkge1xuK1x0XHRcdGNvdW50LS07XG4rXHRcdFx0ZW50cnktXHUwMDNlc3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwsIGNvdW50KTtcbitcdFx0XHRyZXR1cm47XG4rXHRcdH1cbitcdFx0Y291bnQgPSBjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcbitcdFx0LyogT3ZlcmZsb3cgc3RhcnRzIHdpdGggU1dQX1RCX0NPVU5UX01BWCAqL1xuK1x0XHRWTV9XQVJOX09OX09OQ0UoY291bnQgXHUwMDNjIFNXUF9UQl9DT1VOVF9NQVgpO1xuK1x0XHRjb3VudC0tO1xuK1x0XHRpZiAoY291bnQgPT0gKFNXUF9UQl9DT1VOVF9NQVggLSAxKSkge1xuK1x0XHRcdGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gMDtcbitcdFx0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCxcbitcdFx0XHRcdFx0XHRcdCAgICAgIGNvdW50KTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50O1xuK1x0XHR9XG4gXHRcdHJldHVybjtcbitcdH1cbitcdGVudHJ5LVx1MDAzZXN3cF90Yl92YWwgPSBfX3N3cF90Yl9ta19jb3VudChlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsLCBjb3VudCAtIDEpO1xuK31cbiBcbi1cdC8qIHRyeV90b191bnVzZSgpIGludmFsaWRhdGVkIGFsbCB0aGUgZW50cmllcyBhbHJlYWR5ICovXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl96c3dhcF90cmVlc1t0eXBlXTsgaSsrKVxuLVx0XHRXQVJOX09OX09OQ0UoIXhhX2VtcHR5KHRyZWVzICsgaSkpO1xuK2ludCB6c3dhcF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuIFxuLVx0a3ZmcmVlKHRyZWVzKTtcbi1cdG5yX3pzd2FwX3RyZWVzW3R5cGVdID0gMDtcbi1cdHpzd2FwX3RyZWVzW3R5cGVdID0gTlVMTDtcbit2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpXG4re1xuIH1cbiBcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QxNToxMToyMi4zODQ1MTUwN1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyMjM4OTU2NDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgWnN3YXAgRW50cnkgU3RvcmFnZSBQYXRjaCoqXG5cbk9rYXksIHNvIHdlJ3ZlIGdvdCBhIHBhdGNoIGhlcmUgdGhhdCdzIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IGB6c3dhcGAgbWFuYWdlcyBpdHMgZW50cmllcy4gSW5zdGVhZCBvZiB1c2luZyB0aGF0IHNlcGFyYXRlIGB4YXJyYXlgIHdlJ3JlIHVzZWQgdG8gKGB6c3dhcF90cmVlc2ApLCBpdCdzIG5vdyBkaXJlY3RseSBsaW5raW5nIGEgcG9pbnRlciB0byB0aGUgYHpzd2FwX2VudHJ5YCBzdHJ1Y3R1cmUgd2l0aGluIHRoZSBzd2FwIHRhYmxlcyB0aGVtc2VsdmVzIChgc3dhcF9tYXBgIG9yIGBzd2FwX2NsdXN0ZXJfaW5mb2ApLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgYXJjaGl0ZWN0dXJhbCBzaGlmdC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyByb2J1c3QuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0byB2ZXJpZnkgaXRzIGZ1bmN0aW9uYWxpdHkuIFRoaXMgaXMgYSBjb21wbGV0ZSBwYXJhZGlnbSBzaGlmdCBpbiB6c3dhcCdzIGVudHJ5IHRyYWNraW5nLiBJcyB6c3dhcCBldmVuIHJlYWNoYWJsZSBpZiB0aGlzIGZhaWxzPyBZZXMsIGl0J3MgYSBjb3JlIGZlYXR1cmUsIHNvIHRoYXQncyBhIGNoZWNrLiBJcyB0aGlzIGNoYW5nZSB3b3J0aHkgb2YgZnV6emluZz8gQWJzb2x1dGVseTsgaXQncyBhIHJhZGljYWwgbW9kaWZpY2F0aW9uIHRvIGhvdyBzd2FwIGFuZCB6c3dhcCBpbnRlcmFjdC4gVGhhdCBuZWNlc3NpdGF0ZXMgZnV6emluZyB0byByb290IG91dCBhbnkgc3VidGxlIGJ1Z3MuXG5cbk5vdywgSSBuZWVkIHRvIHBpbnBvaW50IHRoZSBjcml0aWNhbCBmdW5jdGlvbnMgdGhpcyBwYXRjaCB0b3VjaGVzLiBMb29rcyBsaWtlIHRoZSBjb3JlIGBtbS96c3dhcC5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AgYXJlIHdoZXJlIHRoZSBidWxrIG9mIHRoZSBjaGFuZ2VzIHJlc2lkZS4gRnJvbSBhIHF1aWNrIHNjYW4sIGl0IGxvb2tzIGxpa2UgdGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQ6IGB6c3dhcF9zdG9yZWAsIGB6c3dhcF9sb2FkYCwgYHpzd2FwX2ludmFsaWRhdGVgLCBgenN3YXBfd3JpdGViYWNrX2VudHJ5YCwgYHpzd2FwX3N0b3JlX3BhZ2VgLCBgX19zd2FwX2NhY2hlX2FkZF9mb2xpb2AsIGBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvYCwgYF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9gLCBgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5YCwgYF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllc2AsIGBzd2FwX3B1dF9lbnRyaWVzX2NsdXN0ZXJgLCBhbmQgYF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeWAuIEkgbmVlZCB0byBkaWcgaW50byB0aG9zZSBmdW5jdGlvbnMuIExldCBtZSByZXZpZXcgYG1tL3pzd2FwLmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYC4gTG9va3MgbGlrZSBpdCdzIGEgZmV3IG1vcmUgdGhhbiB0aGUgbGlzdCBJIGluaXRpYWxseSBjb25zdHJ1Y3RlZDogYHpzd2FwX3N0b3JlYCwgYHpzd2FwX2xvYWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGB6c3dhcF93cml0ZWJhY2tfZW50cnlgLCBgenN3YXBfc3dwX3RiX2R1cF9jb3VudGAsIGB6c3dhcF9zd3BfdGJfcHV0X2NvdW50YCwgYHpzd2FwX3N3cF90Yl9nZXRfc2hhZG93YCwgYHpzd2FwX3N3cF90Yl9nZXRfY291bnRgLCBgenN3YXBfc3dwX3RiX2dldF9mbGFnc2AuIGBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrYCwgYF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9gLCBgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpb2AsIGBfX3N3YXBfY2FjaGVfYWxsb2NgLCBgc3dhcF9jYWNoZV9hbGxvY19mb2xpb2AsIGBzd2FwX2NhY2hlX3JlYWRfZm9saW9gLCBgc3dhcGluX3N5bmNgLiBgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllc2AsIGBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlgLCBgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyYCwgYF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeWAsIGBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXNgLCBgX19zd2FwX2NvdW50YCwgYHN3YXBfZW50cnlfc3dhcHBlZGAsIGB1bnVzZV9wdGVfcmFuZ2VgLlxuXG5OZXh0LCBJIG5lZWQgdG8gaWRlbnRpZnkgYW55IHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gYENPTkZJR19aU1dBUGAgaXMgb2J2aW91c2x5IGVzc2VudGlhbC4gSSBzaG91bGQgY2hlY2sgYG1tL0tjb25maWdgIG9yIGV2ZW4gYG1tL3pzd2FwLmNgIGl0c2VsZiB0byBjb25maXJtIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgb3IgaW1wbGljYXRpb25zLiBgQ09ORklHX1NXQVBgIGlzIGltcGxpY2l0bHkgZW5hYmxlZCB3aGVuIGBDT05GSUdfWlNXQVBgIGlzLCBzbyBJJ2xsIGtlZXAgYW4gZXllIG91dCBmb3IgYW55IG90aGVycyB0aGF0IG1pZ2h0IGJlIHJlcXVpcmVkIG9yIGFmZmVjdGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzg4NCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY2MywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDE1OjExOjM0LjYyMzQ3NDY4WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM3NDA0MDY2NjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFpTV0FQXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTEyPW1lbnVjb25maWcgU1dBUFxcbi0tXFxubW0vS2NvbmZpZy0yMS1cXG5tbS9LY29uZmlnOjIyOmNvbmZpZyBaU1dBUFxcbm1tL0tjb25maWctMjMtXFx0Ym9vbCBcXFwiQ29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1xcXCJcXG4tLVxcbm1tL0tjb25maWctMzQtXFxubW0vS2NvbmZpZzozNTpjb25maWcgWlNXQVBfREVGQVVMVF9PTlxcbm1tL0tjb25maWctMzYtXFx0Ym9vbCBcXFwiRW5hYmxlIHRoZSBjb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzIGJ5IGRlZmF1bHRcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTQ0LVxcbm1tL0tjb25maWc6NDU6Y29uZmlnIFpTV0FQX1NIUklOS0VSX0RFRkFVTFRfT05cXG5tbS9LY29uZmlnLTQ2LVxcdGJvb2wgXFxcIlNocmluayB0aGUgenN3YXAgcG9vbCBvbiBtZW1vcnkgcHJlc3N1cmVcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTU5PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy03Ni1cXG5tbS9LY29uZmlnOjc3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfREVGTEFURVxcbm1tL0tjb25maWctNzgtXFx0Ym9vbCBcXFwiRGVmbGF0ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODItXFxubW0vS2NvbmZpZzo4Mzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaT1xcbm1tL0tjb25maWctODQtXFx0Ym9vbCBcXFwiTFpPXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04OC1cXG5tbS9LY29uZmlnOjg5OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfODQyXFxubW0vS2NvbmZpZy05MC1cXHRib29sIFxcXCI4NDJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0LVxcbm1tL0tjb25maWc6OTU6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRcXG5tbS9LY29uZmlnLTk2LVxcdGJvb2wgXFxcIkxaNFxcXCJcXG4tLVxcbm1tL0tjb25maWctMTAwLVxcbm1tL0tjb25maWc6MTAxOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0SENcXG5tbS9LY29uZmlnLTEwMi1cXHRib29sIFxcXCJMWjRIQ1xcXCJcXG4tLVxcbm1tL0tjb25maWctMTA2LVxcbm1tL0tjb25maWc6MTA3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfWlNURFxcbm1tL0tjb25maWctMTA4LVxcdGJvb2wgXFxcInpzdGRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTExMj1lbmRjaG9pY2VcXG5tbS9LY29uZmlnLTExMy1cXG5tbS9LY29uZmlnOjExNDpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXFxubW0vS2NvbmZpZy0xMTUtICAgICAgIHN0cmluZ1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QxNToxMTozOC4zNjM4ODc4MDdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNTgxNDU0NTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSB3ZXJlIG15IG93bjpcblxuKipFbmFibGluZyBaU1dBUDogQSBTdHJlYW1saW5lZCBQYXRoIHRvIFBlcmZvcm1hbmNlKipcblxuUmlnaHQsIHNvIEknbSB0aGlua2luZywgZ2l2ZW4gdGhlIGNvbnRleHQsIGVuYWJsaW5nIGBaU1dBUGAgYW5kIHNldHRpbmcgYFpTV0FQX0RFRkFVTFRfT05gIHNlZW1zIGxpa2UgdGhlIHNlbnNpYmxlIG5leHQgc3RlcC4gIFdlJ3JlIGxvb2tpbmcgZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cywgYW5kIHRoaXMgaXMgYSBjbGFzc2ljIGFwcHJvYWNoLlxuXG5CZWZvcmUgSSBqdW1wIHRvIGFueSBjb25jbHVzaW9ucywgSSdkIGJldHRlciBkb3VibGUtY2hlY2sgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBTbywgbGV0J3MgaGVhZCBvdmVyIHRvIGBtbS9LY29uZmlnYCBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvYnZpb3VzIGNvbmZsaWN0cyBvciBwcmVyZXF1aXNpdGVzIEkndmUgbWlzc2VkLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiB0aGF0IGFyZWEgLSBlbnN1cmUgdGhlcmUgaXMgbm90aGluZyBwcmV2ZW50aW5nIG9yIHJlcXVpcmluZyBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gR290dGEgbWFrZSBzdXJlIHRoZXJlIGFyZW4ndCBhbnkgZ290Y2hhcyBpbiB0aGUgc2V0dXAsIG9yIGRlcGVuZGVuY2llcyBJIG5lZWQgdG8gYmUgYXdhcmUgb2YuIEJldHRlciBzYWZlIHRoYW4gc29ycnkgd2hlbiBtYWtpbmcgdGhlc2Uga2luZHMgb2YgY2hhbmdlcy4gIFRoZW4sIHdlIGNhbiBldmFsdWF0ZSB0aGUgYnJvYWRlciBpbXBsaWNhdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5ODM3LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMTU6MTE6NDEuOTQ1MzQ2NDE0WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQwNzM4MDk2MzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFpTV0FQX0RFRkFVTFRfT05cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9MjI9Y29uZmlnIFpTV0FQXFxuLS1cXG5tbS9LY29uZmlnLTM0LVxcbm1tL0tjb25maWc6MzU6Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cXG5tbS9LY29uZmlnLTM2LVxcdGJvb2wgXFxcIkVuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QxNToxMTo0Ni4wMTkxNjE3NjlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjQ4NzgzMzA0NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBac3dhcCBDaGFuZ2VzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgenN3YXAgcGF0Y2gsIGFuZCBoZXJlJ3MgbXkgdHJhaW4gb2YgdGhvdWdodC4gRmlyc3QsIEkgbmVlZCB0byBwaW5wb2ludCB0aGUga2V5IGZ1bmN0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaGF2ZSBiZWVuIHRvdWNoZWQuIEkgc3RhcnRlZCBieSBpZGVudGlmeWluZyBhIGxpc3Qgb2Ygc3ltYm9scyBJIHNlZSBhcyBwb3RlbnRpYWxseSBpbXBvcnRhbnQuIExldCdzIHNlZS4uLiBJJ3ZlIGdvdCBgenN3YXBfc3RvcmVgLCBgenN3YXBfbG9hZGAsIGB6c3dhcF9pbnZhbGlkYXRlYCwgYHpzd2FwX3dyaXRlYmFja19lbnRyeWAsIGBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvYCwgYF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9gLCBgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5YCwgYF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllc2AsIGBzd2FwX3B1dF9lbnRyaWVzX2NsdXN0ZXJgLCBhbmQgYF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeWAuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIG9mIHRoZXNlIGFyZSBhY3R1YWxseSAqc2lnbmlmaWNhbnQqIGluIHRlcm1zIG9mIGNoYW5nZXMuXG5cbk5leHQsIEknbSBjaGVja2luZyB0aGVpciBzY29wZS4gSXMgaXQgc3RhdGljIG9yIGV4cG9ydGVkPyBJJ3ZlIGZpbHRlcmVkIHRoZSBsaXN0IGRvd24sIGZvY3VzaW5nIG9uIGZ1bmN0aW9ucyBhbmQgZ2xvYmFscyB0aGF0IGFyZSBleHBvc2VkIG9yIGhhdmUgc3Vic3RhbnRpYWwgbG9naWMgaW52b2x2ZWQuIE15IHJldmlzZWQga2V5IGxpc3Qgbm93IGxvb2tzIGxpa2U6IGB6c3dhcF9zdG9yZWAsIGB6c3dhcF9sb2FkYCwgYHpzd2FwX2ludmFsaWRhdGVgLCBgenN3YXBfd3JpdGViYWNrX2VudHJ5YCwgYF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9gLCBgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpb2AsIGBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlgLCBgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzYCwgYW5kIGBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlgLiBJIHRoZW4gaWRlbnRpZmllZCB0aGF0IGB6c3dhcF9zd3BfdGJfZHVwX2NvdW50YCBhbmQgYHpzd2FwX3N3cF90Yl9wdXRfY291bnRgIGFyZSBhbHNvIGdsb2JhbCwgbWVhbmluZyB0aGV5IG5lZWQgdG8gYmUgd2F0Y2hlZC5cblxuTm93IEkgdW5kZXJzdGFuZCB0aGUgY29yZSBvZiB0aGUgY2hhbmdlOiB0aGUgcGF0Y2ggaXMgZnVuZGFtZW50YWxseSBhbHRlcmluZyBob3cgenN3YXAgbWFuYWdlcyBjb21wcmVzc2VkIHBhZ2VzLiBJdCdzIGVtYmVkZGluZyB0aGUgYHpzd2FwX2VudHJ5YCBwb2ludGVycyBkaXJlY3RseSBpbnRvIHRoZSBgc3dhcF9jbHVzdGVyX2luZm9gIHN0cnVjdHVyZXMuIFRoaXMgaXMgYSBiaWcgZGVhbCBiZWNhdXNlIGl0IG1lYW5zIHRoZSBjb3JlIHN3YXAgYWxsb2NhdGlvbiwgZnJlZWluZywgYW5kIGxvb2t1cCBwYXRocyBhcmUgYmVpbmcgcmVzaGFwZWQuIFRoaXMgaXMgd2hlcmUgSSBzdGFydCB0aGlua2luZyBhYm91dCB0aGUgcG90ZW50aWFsIHBpdGZhbGxzIGFuZCB0aGUgYXJlYXMgSSBuZWVkIHRvIGZvY3VzIG9uLlxuXG5UaGlzIGFwcHJvYWNoIHdpbGwgaW50cm9kdWNlIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnNpZGVyYXRpb25zLCBhbmQgSSBuZWVkIHRvIGVuc3VyZSB0aGF0IGNvbmN1cnJlbnQgc3dhcCBvcGVyYXRpb25zIGRvbid0IGxlYWQgdG8gbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZXMsIG9yIGVycm9ycyBpbiBzd2FwIGFjY291bnRpbmcuIEknbSBhbHJlYWR5IG1lbnRhbGx5IGZsYWdnaW5nIHRoaXMgZm9yIHRob3JvdWdoIGZ1enppbmcgYW5kIHJpZ29yb3VzIHRlc3RpbmcuXG5cbkZpbmFsbHksIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzZXQuIEkgbmVlZCBgWlNXQVBgIGVuYWJsZWQsIGFuZCwgZm9yIGRlZmF1bHQgdXNhZ2UsIGBaU1dBUF9ERUZBVUxUX09OYCBhcyB3ZWxsLiBXaXRoIHRoaXMgZG9uZSwgSSdtIHJlYWR5IHRvIGNhbGwgdGhlIG5leHQgc3RlcC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAxNzksIk91dHB1dFRva2VucyI6MjQ1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDE1OjExOjU4LjUwNjk5OTc3NVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc1NTkyNjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiWlNXQVBfREVGQVVMVF9PTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9sb2FkXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCIsXG4gICAgXCJ6c3dhcF93cml0ZWJhY2tfZW50cnlcIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeVwiLFxuICAgIFwiX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzXCIsXG4gICAgXCJfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlcIixcbiAgICBcInpzd2FwX3N3cF90Yl9kdXBfY291bnRcIixcbiAgICBcInpzd2FwX3N3cF90Yl9wdXRfY291bnRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiWlNXQVBcIixcbiAgICBcIlpTV0FQX0RFRkFVTFRfT05cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6c3dhcF9zdG9yZVwiLFxuICAgIFwienN3YXBfbG9hZFwiLFxuICAgIFwienN3YXBfaW52YWxpZGF0ZVwiLFxuICAgIFwienN3YXBfd3JpdGViYWNrX2VudHJ5XCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvXCIsXG4gICAgXCJfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlcIixcbiAgICBcIl9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllc1wiLFxuICAgIFwiX19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5XCIsXG4gICAgXCJ6c3dhcF9zd3BfdGJfZHVwX2NvdW50XCIsXG4gICAgXCJ6c3dhcF9zd3BfdGJfcHV0X2NvdW50XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZnVuZGFtZW50YWxseSBjaGFuZ2VzIGhvdyB6c3dhcCB0cmFja3MgY29tcHJlc3NlZCBwYWdlcyBieSBlbWJlZGRpbmcgYHpzd2FwX2VudHJ5YCBwb2ludGVycyBkaXJlY3RseSBpbnRvIHRoZSBjb3JlIHN3YXAgdGFibGUgKGBzd2FwX2NsdXN0ZXJfaW5mb2ApIHJhdGhlciB0aGFuIHVzaW5nIGEgc2VwYXJhdGUgeGFycmF5IChgenN3YXBfdHJlZXNgKS4gVGhpcyBhZmZlY3RzIGNvcmUgc3dhcCBhbGxvY2F0aW9uLCBmcmVlaW5nLCBhbmQgbG9va3VwIHBhdGhzLCByZXF1aXJpbmcgZnV6emluZyB0byBlbnN1cmUgbm8gbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZXMsIG9yIHN3YXAgYWNjb3VudGluZyBlcnJvcnMgb2NjdXIgZHVyaW5nIGNvbmN1cnJlbnQgc3dhcCBvcGVyYXRpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflow2hc96[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-07 14:54:02 +0000 UTC FinishedAt: 2026-07-07 15:12:00 +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": "01bc0932614c2d3c35e732f54d249b5897d94307", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ZSWAP", "ZSWAP_DEFAULT_ON" ], "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": "01bc0932614c2d3c35e732f54d249b5897d94307", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ZSWAP", "ZSWAP_DEFAULT_ON" ], "series_id": "1a9cfadb-ed85-48c1-b1b3-a3c12ea99471" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "zswap_store", "zswap_load", "zswap_invalidate", "zswap_writeback_entry", "__swap_cache_do_add_folio", "__swap_cache_do_del_folio", "__swap_cluster_put_entry", "__swap_cluster_free_entries", "__swap_cluster_dup_entry", "zswap_swp_tb_dup_count", "zswap_swp_tb_put_count" ], "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+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1pTV0FQJiMzNDssCiAgICAmIzM0O1pTV0FQX0RFRkFVTFRfT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICAgJiMzNDt6c3dhcF9sb2FkJiMzNDssCiAgICAmIzM0O3pzd2FwX2ludmFsaWRhdGUmIzM0OywKICAgICYjMzQ7enN3YXBfd3JpdGViYWNrX2VudHJ5JiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8mIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpbyYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnkmIzM0OywKICAgICYjMzQ7X19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzJiMzNDssCiAgICAmIzM0O19fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeSYjMzQ7LAogICAgJiMzNDt6c3dhcF9zd3BfdGJfZHVwX2NvdW50JiMzNDssCiAgICAmIzM0O3pzd2FwX3N3cF90Yl9wdXRfY291bnQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZnVuZGFtZW50YWxseSBjaGFuZ2VzIGhvdyB6c3dhcCB0cmFja3MgY29tcHJlc3NlZCBwYWdlcyBieSBlbWJlZGRpbmcgYHpzd2FwX2VudHJ5YCBwb2ludGVycyBkaXJlY3RseSBpbnRvIHRoZSBjb3JlIHN3YXAgdGFibGUgKGBzd2FwX2NsdXN0ZXJfaW5mb2ApIHJhdGhlciB0aGFuIHVzaW5nIGEgc2VwYXJhdGUgeGFycmF5IChgenN3YXBfdHJlZXNgKS4gVGhpcyBhZmZlY3RzIGNvcmUgc3dhcCBhbGxvY2F0aW9uLCBmcmVlaW5nLCBhbmQgbG9va3VwIHBhdGhzLCByZXF1aXJpbmcgZnV6emluZyB0byBlbnN1cmUgbm8gbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZXMsIG9yIHN3YXAgYWNjb3VudGluZyBlcnJvcnMgb2NjdXIgZHVyaW5nIGNvbmN1cnJlbnQgc3dhcCBvcGVyYXRpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZjIwMTE5ODU4NzYzMTIxNWY3MDhmNTg4NmE5ODEwMzIzZmJjMjM5OVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDcgMTU6MTE6MTggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC96c3dhcC5oIGIvaW5jbHVkZS9saW51eC96c3dhcC5oXG5pbmRleCAzMGMxOTNhMTIwN2UxNi4uNGY1NWM4ZDBjNGM1NDIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3pzd2FwLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvenN3YXAuaFxuQEAgLTI2LDcgJiM0MzsyNiw3IEBAIHN0cnVjdCB6c3dhcF9scnV2ZWNfc3RhdGUge1xuIFxuIHVuc2lnbmVkIGxvbmcgenN3YXBfdG90YWxfcGFnZXModm9pZCk7XG4gYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbiYjNDM7aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KTtcbiB2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcbiBpbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTtcbiB2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpO1xuQEAgLTQ0LDcgJiM0Mzs0NCw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KVxuIHtcbiBcdHJldHVybiAtRU5PRU5UO1xuIH1cbmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmNcbmluZGV4IGIyM2Y0OTRmY2M4M2RhLi4xY2U4MjAxZWQ4NmUyNCAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfaW8uY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9pby5jXG5AQCAtNjU4LDcgJiM0Mzs2NTgsNyBAQCBzdGF0aWMgdm9pZCBzd2FwX3JlYWRfZm9saW9fYmRldl9hc3luYyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIFx0c3VibWl0X2JpbyhiaW8pO1xuIH1cbiBcbi12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZylcbiYjNDM7dm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsIHZvaWQgKnplbnRyeSlcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzID0gX19zd2FwX2VudHJ5X3RvX2luZm8oZm9saW8tXHUwMDNlc3dhcCk7XG4gXHRib29sIHN5bmNocm9ub3VzID0gc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU1lOQ0hST05PVVNfSU87XG5AQCAtNjg2LDcgJiM0Mzs2ODYsNyBAQCB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZylcbiBcdFx0Z290byBmaW5pc2g7XG4gXHR9XG4gXG4tXHRpZiAoenN3YXBfbG9hZChmb2xpbykgIT0gLUVOT0VOVClcbiYjNDM7XHRpZiAoenN3YXBfbG9hZChmb2xpbywgemVudHJ5KSAhPSAtRU5PRU5UKVxuIFx0XHRnb3RvIGZpbmlzaDtcbiBcbiBcdC8qIFdlIGhhdmUgdG8gcmVhZCBmcm9tIHNsb3dlciBkZXZpY2VzLiBJbmNyZWFzZSB6c3dhcCBwcm90ZWN0aW9uLiAqL1xuZGlmZiAtLWdpdCBhL21tL3N3YXAuaCBiL21tL3N3YXAuaFxuaW5kZXggNDRhYjhlMWU1OTViMDguLjg0ZTEzYmE2ZTYwNWMzIDEwMDY0NFxuLS0tIGEvbW0vc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwLmhcbkBAIC0yMTAsNiAmIzQzOzIxMCw0MSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jbHVzdGVyX3VubG9ja19pcnEoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSlcbiBcbiBleHRlcm4gaW50IHN3YXBfcmV0cnlfdGFibGVfYWxsb2Moc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCk7XG4gXG4mIzQzO3N0cnVjdCB6c3dhcF9lbnRyeTtcbiYjNDM7I2lmZGVmIENPTkZJR19aU1dBUFxuJiM0Mzt2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90Yik7XG4mIzQzO3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90Yik7XG4mIzQzO3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90Yik7XG4mIzQzO2ludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuJiM0MztcdFx0XHQgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKTtcbiYjNDM7dm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuJiM0MztcdFx0XHQgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZik7XG4mIzQzO3ZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KTtcbiYjNDM7I2Vsc2VcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztzdGF0aWMgaW5saW5lIGludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4mIzQzO1x0XHRcdFx0XHQgdW5zaWduZWQgaW50IGNpX29mZilcbiYjNDM7e1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuJiM0MztcdFx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgY2lfb2ZmKSB7fVxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KSB7fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4gLypcbiAgKiBCZWxvdyBhcmUgdGhlIGNvcmUgcm91dGluZXMgZm9yIGRvaW5nIHN3YXAgZm9yIGEgZm9saW8uXG4gICogQWxsIGhlbHBlcnMgcmVxdWlyZXMgdGhlIGZvbGlvIHRvIGJlIGxvY2tlZCwgYW5kIGEgbG9ja2VkIGZvbGlvXG5AQCAtMjQxLDcgJiM0MzsyNzYsNyBAQCBleHRlcm4gdm9pZCBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIC8qIGxpbnV4L21tL3BhZ2VfaW8uYyAqL1xuIGludCBzaW9fcG9vbF9pbml0KHZvaWQpO1xuIHN0cnVjdCBzd2FwX2lvY2I7XG4tdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcpO1xuJiM0Mzt2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KTtcbiB2b2lkIF9fc3dhcF9yZWFkX3VucGx1ZyhzdHJ1Y3Qgc3dhcF9pb2NiICpwbHVnKTtcbiBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX3VucGx1ZyhzdHJ1Y3Qgc3dhcF9pb2NiICpwbHVnKVxuIHtcbkBAIC0zMDMsMTMgJiM0MzszMzgsMTYgQEAgc3RhdGljIGlubGluZSBib29sIGZvbGlvX21hdGNoZXNfc3dhcF9lbnRyeShjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIGJvb2wgc3dhcF9jYWNoZV9oYXNfZm9saW8oc3dwX2VudHJ5X3QgZW50cnkpO1xuIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9nZXRfZm9saW8oc3dwX2VudHJ5X3QgZW50cnkpO1xuIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSk7XG4mIzQzO2Jvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbiB2b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BfZW50cnlfdCB0YXJnZXRfZW50cnksIGdmcF90IGdmcF9tYXNrLFxuIFx0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIG9yZGVycywgc3RydWN0IHZtX2ZhdWx0ICp2bWYsXG4tXHRcdFx0XHQgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KTtcbiYjNDM7XHRcdFx0XHQgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LFxuJiM0MztcdFx0XHRcdCAgICAgdm9pZCAqKnplbnRyeSk7XG4gLyogQmVsb3cgaGVscGVycyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gbG9jayBhbmQgcGFzcyBpbiB0aGUgc3dhcCBjbHVzdGVyLiAqL1xuIHZvaWQgX19zd2FwX2NhY2hlX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuLVx0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSk7XG4mIzQzO1x0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcbiYjNDM7XHRcdFx0ICAgIHZvaWQgKip6ZW50cnkpO1xuIHZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTtcbiB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5AQCAtMzgxLDcgJiM0Mzs0MTksOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKVxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnLFxuJiM0MztcdFx0XHRcdCAgIHZvaWQgKnplbnRyeSlcbiB7XG4gfVxuIFxuQEAgLTQ1Myw2ICYjNDM7NDkyLDExIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3dhcF9jYWNoZV9nZXRfc2hhZG93KHN3cF9lbnRyeV90IGVudHJ5KVxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCA2ZmQ2ZTM0MTViNzE4Yi4uNjBkOTM3YzZiMzkyMjQgMTAwNjQ0XG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfc3RhdGUuY1xuQEAgLTE3NSwxNiAmIzQzOzE3NSwyOSBAQCBzdGF0aWMgaW50IF9fc3dhcF9jYWNoZV9hZGRfY2hlY2soc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4gXHRpZiAoc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikpXG4gXHRcdHJldHVybiAtRUVYSVNUO1xuLVx0aWYgKCFfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcbiYjNDM7XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkge1xuJiM0MztcdFx0aWYgKCF6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdH0gZWxzZSBpZiAoIV9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKSB7XG4gXHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdH1cbiBcdGlmIChzaGFkb3dwIFx1MDAyNlx1MDAyNiBzd3BfdGJfaXNfc2hhZG93KG9sZF90YikpXG4gXHRcdCpzaGFkb3dwID0gc3dwX3RiX3RvX3NoYWRvdyhvbGRfdGIpO1xuJiM0MztcdGVsc2UgaWYgKHNoYWRvd3AgXHUwMDI2XHUwMDI2IHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXG4mIzQzO1x0XHQqc2hhZG93cCA9IHpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KG9sZF90Yik7XG4gXHRpZiAobWVtY2dfaWQpXG4gXHRcdCptZW1jZ19pZCA9IF9fc3dhcF9jZ3JvdXBfZ2V0KGNpLCBjaV9vZmYpO1xuIFxuIFx0aWYgKG5yID09IDEpXG4gXHRcdHJldHVybiAwO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogRm9yIG11bHRpLXNsb3QgcmFuZ2VzLCBQb2ludGVyIGVudHJpZXMgYXJlIG5vdCBleHBlY3RlZCBzaW5jZVxuJiM0MztcdCAqIHpzd2FwIGRvZXMgbm90IHN1cHBvcnQgbGFyZ2UgZm9saW9zLiBSZXR1cm4gLUVCVVNZIGZvciBzYWZldHkuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcbiBcdGlzX3plcm8gPSBfX3N3YXBfdGFibGVfdGVzdF96ZXJvKGNpLCBjaV9vZmYpO1xuIFx0Y2lfb2ZmID0gcm91bmRfZG93bihjaV9vZmYsIG5yKTtcbiBcdGNpX2VuZCA9IGNpX29mZiAmIzQzOyBucjtcbkBAIC0yMDEsNyAmIzQzOzIxNCw4IEBAIHN0YXRpYyBpbnQgX19zd2FwX2NhY2hlX2FkZF9jaGVjayhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4tXHRcdFx0XHQgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSlcbiYjNDM7XHRcdFx0XHQgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcbiYjNDM7XHRcdFx0XHQgICAgICB2b2lkICoqemVudHJ5KVxuIHtcbiBcdHVuc2lnbmVkIGludCBjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQoZW50cnkpLCBjaV9lbmQ7XG4gXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuQEAgLTIxNiw3ICYjNDM7MjMwLDM0IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdGRvIHtcbiBcdFx0b2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbiBcdFx0Vk1fV0FSTl9PTl9PTkNFKHN3cF90Yl9pc19mb2xpbyhvbGRfdGIpKTtcbi1cdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBwZm5fdG9fc3dwX3RiKHBmbiwgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBJZiB0aGUgb2xkIGVudHJ5IGlzIGEgUG9pbnRlciAoenN3YXAgY29tcHJlc3NlZCBkYXRhKSxcbiYjNDM7XHRcdCAqIGV4dHJhY3QgdGhlIHpzd2FwX2VudHJ5IGZvciB0aGUgY2FsbGVyIGFuZCBwcmVzZXJ2ZVxuJiM0MztcdFx0ICogaXRzIGZsYWdzLiBUaGUgUG9pbnRlciBlbnRyeSBoYXMgbm8gaW5saW5lIGZsYWdzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBjaGFyIHBmbGFncyA9IHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKTtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogSWYgc3dwX3RiX3ZhbCBjYXJyaWVzIFNXUF9UQl9DT1VOVF9NQVgsIHRoZVxuJiM0MztcdFx0XHQgKiByZWFsIG92ZXJmbG93IGNvdW50IGxpdmVzIGluIGNpLVx1MDAzZWV4dGVuZF90YWJsZS5cbiYjNDM7XHRcdFx0ICogUHVsbCBpdCBzbyB0aGUgbmV3IFBGTiBjYXJyaWVzIHRoZSBjb3JyZWN0IGNvdW50XG4mIzQzO1x0XHRcdCAqIGFuZCB3b24mIzM5O3QgbGF0ZXIgY3Jhc2ggb24gYSBtaXNzaW5nIGV4dGVuZF90YWJsZS5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikgPT0gU1dQX1RCX0NPVU5UX01BWCkge1xuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGNoYXIgcmVhbCA9IFNXUF9UQl9DT1VOVF9NQVggLSAxO1xuJiM0MztcdFx0XHRcdGlmIChjaS1cdTAwM2VleHRlbmRfdGFibGUgXHUwMDI2XHUwMDI2IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdKVxuJiM0MztcdFx0XHRcdFx0cmVhbCA9IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xuJiM0MztcdFx0XHRcdHBmbGFncyA9IChyZWFsIFx1MDAzY1x1MDAzYyAoU1dQX1RCX0ZMQUdTX0JJVFMgLSBTV1BfVEJfQ09VTlRfQklUUykpIHxcbiYjNDM7XHRcdFx0XHRcdCAocGZsYWdzIFx1MDAyNiAoKDEgXHUwMDNjXHUwMDNjIChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgLSAxKSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0aWYgKHplbnRyeSBcdTAwMjZcdTAwMjYgISp6ZW50cnkpXG4mIzQzO1x0XHRcdFx0KnplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKG9sZF90Yik7XG4mIzQzO1x0XHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZixcbiYjNDM7XHRcdFx0XHRwZm5fdG9fc3dwX3RiKHBmbiwgcGZsYWdzKSk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXG4mIzQzO1x0XHRcdFx0cGZuX3RvX3N3cF90YihwZm4sIF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XG4mIzQzO1x0XHR9XG4gXHR9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFxuIFx0Zm9saW9fcmVmX2FkZChmb2xpbywgbnJfcGFnZXMpO1xuQEAgLTIzOSwxMSAmIzQzOzI4MCwxMiBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gICogdGhhdCBob2xkcyB0aGUgZW50cmllcy5cbiAgKi9cbiB2b2lkIF9fc3dhcF9jYWNoZV9hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpXG4mIzQzO1x0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcbiYjNDM7XHRcdFx0ICAgIHZvaWQgKip6ZW50cnkpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbiBcbi1cdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSk7XG4mIzQzO1x0X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhjaSwgZm9saW8sIGVudHJ5LCB6ZW50cnkpO1xuIFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9QQUdFUywgbnJfcGFnZXMpO1xuIFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TV0FQQ0FDSEUsIG5yX3BhZ2VzKTtcbiB9XG5AQCAtMjY5LDE1ICYjNDM7MzExLDI4IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdGNpX29mZiA9IGNpX3N0YXJ0O1xuIFx0ZG8ge1xuIFx0XHRvbGRfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuLVx0XHRXQVJOX09OX09OQ0UoIXN3cF90Yl9pc19mb2xpbyhvbGRfdGIpIHx8XG4tXHRcdFx0ICAgICBzd3BfdGJfdG9fZm9saW8ob2xkX3RiKSAhPSBmb2xpbyk7XG4tXHRcdGlmIChfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcbi1cdFx0XHRmb2xpb19zd2FwcGVkID0gdHJ1ZTtcbi1cdFx0ZWxzZVxuLVx0XHRcdG5lZWRfZnJlZSA9IHRydWU7XG4tXHRcdC8qIElmIHNoYWRvdyBpcyBOVUxMLCB3ZSBzZXQgYW4gZW1wdHkgc2hhZG93LiAqL1xuLVx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIHNoYWRvd190b19zd3BfdGIoc2hhZG93LFxuLVx0XHRcdFx0IF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogSWYgenN3YXAgYWxyZWFkeSBzdG9yZWQgZGF0YSBmb3IgdGhpcyBzbG90XG4mIzQzO1x0XHQgKiAoenN3YXBfc3RvcmUgd3JvdGUgYSBQb2ludGVyIGVudHJ5KSwgbGVhdmUgaXRcbiYjNDM7XHRcdCAqIGluIHBsYWNlLiBUaGUgY291bnQgYW5kIGZsYWdzIGFyZSBzdG9yZWQgaW4gdGhlXG4mIzQzO1x0XHQgKiB6c3dhcF9lbnRyeSBzdHJ1Y3QuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XG4mIzQzO1x0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXG4mIzQzO1x0XHRcdFx0Zm9saW9fc3dhcHBlZCA9IHRydWU7XG4mIzQzO1x0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRuZWVkX2ZyZWUgPSB0cnVlO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0V0FSTl9PTl9PTkNFKCFzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSB8fFxuJiM0MztcdFx0XHRcdCAgICAgc3dwX3RiX3RvX2ZvbGlvKG9sZF90YikgIT0gZm9saW8pO1xuJiM0MztcdFx0XHRpZiAoX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXG4mIzQzO1x0XHRcdFx0Zm9saW9fc3dhcHBlZCA9IHRydWU7XG4mIzQzO1x0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRuZWVkX2ZyZWUgPSB0cnVlO1xuJiM0MztcdFx0XHQvKiBJZiBzaGFkb3cgaXMgTlVMTCwgd2Ugc2V0IGFuIGVtcHR5IHNoYWRvdy4gKi9cbiYjNDM7XHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdyxcbiYjNDM7XHRcdFx0XHRcdCBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpO1xuJiM0MztcdFx0fVxuIFx0fSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiBcdTAwM2MgY2lfZW5kKTtcbiBcbiBcdGZvbGlvLVx1MDAzZXN3YXAudmFsID0gMDtcbkBAIC0yODgsNyAmIzQzOzM0MywxNCBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXHR9IGVsc2UgaWYgKG5lZWRfZnJlZSkge1xuIFx0XHRjaV9vZmYgPSBjaV9zdGFydDtcbiBcdFx0ZG8ge1xuLVx0XHRcdGlmICghX19zd3BfdGJfZ2V0X2NvdW50KF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpKVxuJiM0MztcdFx0XHR1bnNpZ25lZCBsb25nIHRiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbiYjNDM7XHRcdFx0dW5zaWduZWQgY2hhciBjbnQ7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIodGIpKVxuJiM0MztcdFx0XHRcdGNudCA9IHpzd2FwX3N3cF90Yl9nZXRfY291bnQodGIpO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0Y250ID0gX19zd3BfdGJfZ2V0X2NvdW50KHRiKTtcbiYjNDM7XHRcdFx0aWYgKCFjbnQpXG4gXHRcdFx0XHRfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc2ksIGNpLCBjaV9vZmYsIDEpO1xuIFx0XHR9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuQEAgLTQwMyw3ICYjNDM7NDY1LDggQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKl9fc3dhcF9jYWNoZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0XHRcdFx0XHRzd3BfZW50cnlfdCB0YXJnX2VudHJ5LCBnZnBfdCBnZnAsXG4gXHRcdFx0XHRcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IHZtX2ZhdWx0ICp2bWYsXG4tXHRcdFx0XHRcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KVxuJiM0MztcdFx0XHRcdFx0c3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgsXG4mIzQzO1x0XHRcdFx0XHR2b2lkICoqemVudHJ5KVxuIHtcbiBcdGludCBlcnI7XG4gXHRzd3BfZW50cnlfdCBlbnRyeTtcbkBAIC00NTAsNyAmIzQzOzUxMyw3IEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKl9fc3dhcF9jYWNoZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFxuIFx0X19mb2xpb19zZXRfbG9ja2VkKGZvbGlvKTtcbiBcdF9fZm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pO1xuLVx0X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhjaSwgZm9saW8sIGVudHJ5KTtcbiYjNDM7XHRfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnksIHplbnRyeSk7XG4gXHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiBcbiBcdGlmIChtZW1fY2dyb3VwX3N3YXBpbl9jaGFyZ2VfZm9saW8oZm9saW8sIG1lbWNnX2lkLFxuQEAgLTUwNyw3ICYjNDM7NTcwLDggQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gICovXG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCxcbiBcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBvcmRlcnMsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseClcbiYjNDM7XHRcdFx0XHQgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LFxuJiM0MztcdFx0XHRcdCAgICAgdm9pZCAqKnplbnRyeSlcbiB7XG4gXHRpbnQgb3JkZXIsIGVycjtcbiBcdHN0cnVjdCBmb2xpbyAqcmV0O1xuQEAgLTUyMCw5ICYjNDM7NTg0LDEyIEBAIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BfZW50cnlfdCB0YXJnX2VudHJ5LCBnZnBfdCBnZnAsXG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFvcmRlcnMgfHwgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpIFx1MDAzZSBTV0FQRklMRV9DTFVTVEVSKSlcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4mIzQzO1x0aWYgKHplbnRyeSlcbiYjNDM7XHRcdCp6ZW50cnkgPSBOVUxMO1xuJiM0MztcbiBcdGRvIHtcbiBcdFx0cmV0ID0gX19zd2FwX2NhY2hlX2FsbG9jKGNpLCB0YXJnX2VudHJ5LCBnZnAsIG9yZGVyLFxuLVx0XHRcdFx0XHQgdm1mLCBtcG9sLCBpbHgpO1xuJiM0MztcdFx0XHRcdFx0IHZtZiwgbXBvbCwgaWx4LCB6ZW50cnkpO1xuIFx0XHRpZiAoIUlTX0VSUihyZXQpKVxuIFx0XHRcdGJyZWFrO1xuIFx0XHRlcnIgPSBQVFJfRVJSKHJldCk7XG5AQCAtNjM4LDE4ICYjNDM7NzA1LDIwIEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfcmVhZF9mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLFxuIFx0XHRcdFx0XHQgICBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZywgYm9vbCByZWFkYWhlYWQpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHR2b2lkICp6ZW50cnk7XG4gXG4gXHRkbyB7XG4gXHRcdGZvbGlvID0gc3dhcF9jYWNoZV9nZXRfZm9saW8oZW50cnkpO1xuIFx0XHRpZiAoZm9saW8pXG4gXHRcdFx0cmV0dXJuIGZvbGlvO1xuLVx0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgQklUKDApLCBOVUxMLCBtcG9sLCBpbHgpO1xuJiM0MztcdFx0Zm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKGVudHJ5LCBnZnAsIEJJVCgwKSwgTlVMTCwgbXBvbCwgaWx4LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIFx1MDAyNnplbnRyeSk7XG4gXHR9IHdoaWxlIChQVFJfRVJSKGZvbGlvKSA9PSAtRUVYSVNUKTtcbiBcbiBcdGlmIChJU19FUlJfT1JfTlVMTChmb2xpbykpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuLVx0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnKTtcbiYjNDM7XHRzd2FwX3JlYWRfZm9saW8oZm9saW8sIHBsdWcsIHplbnRyeSk7XG4gXHRpZiAocmVhZGFoZWFkKSB7XG4gXHRcdGZvbGlvX3NldF9yZWFkYWhlYWQoZm9saW8pO1xuIFx0XHRjb3VudF92bV9ldmVudChTV0FQX1JBKTtcbkBAIC02NzgsMTggJiM0Mzs3NDcsMjAgQEAgc3RydWN0IGZvbGlvICpzd2FwaW5fc3luYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBsb25nIG9yZGVycyxcbiBcdFx0XHQgICBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHR2b2lkICp6ZW50cnk7XG4gXG4gXHRkbyB7XG4gXHRcdGZvbGlvID0gc3dhcF9jYWNoZV9nZXRfZm9saW8oZW50cnkpO1xuIFx0XHRpZiAoZm9saW8pXG4gXHRcdFx0cmV0dXJuIGZvbGlvO1xuLVx0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCk7XG4mIzQzO1x0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBcdTAwMjZ6ZW50cnkpO1xuIFx0fSB3aGlsZSAoUFRSX0VSUihmb2xpbykgPT0gLUVFWElTVCk7XG4gXG4gXHRpZiAoSVNfRVJSKGZvbGlvKSlcbiBcdFx0cmV0dXJuIGZvbGlvO1xuIFxuLVx0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBOVUxMKTtcbiYjNDM7XHRzd2FwX3JlYWRfZm9saW8oZm9saW8sIE5VTEwsIHplbnRyeSk7XG4gXHRyZXR1cm4gZm9saW87XG4gfVxuIFxuZGlmZiAtLWdpdCBhL21tL3N3YXBfdGFibGUuaCBiL21tL3N3YXBfdGFibGUuaFxuaW5kZXggZTY2MTNlNjJmOGQwZjYuLjYzMThiZjhhYTc2YjBjIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF90YWJsZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwX3RhYmxlLmhcbkBAIC0yOCw3ICYjNDM7MjgsNyBAQCBzdHJ1Y3Qgc3dhcF9tZW1jZ190YWJsZSB7XG4gICogTlVMTDogICAgIHwtLS0tLS0tLS0tLS0tLS0tIDAgLS0tLS0tLS0tLS0tLS0tfCAtIEZyZWUgc2xvdFxuICAqIFNoYWRvdzogICB8U1dBUF9DT1VOVHxafC0tLS0gU0hBRE9XX1ZBTCAtLS18MXwgLSBTd2FwcGVkIG91dCBzbG90XG4gICogUEZOOiAgICAgIHxTV0FQX0NPVU5UfFp8LS0tLS0tIFBGTiAtLS0tLS0tfDEwfCAtIENhY2hlZCBzbG90XG4tICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIChVbnVzZWQpXG4mIzQzOyAqIFBvaW50ZXI6ICB8LS0tLS0tLS0tLS0gUG9pbnRlciAtLS0tLS0tLS0tfDEwMHwgLSBac3dhcCBjb21wcmVzc2VkIGVudHJ5XG4gICogQmFkOiAgICAgIHwtLS0tLS0tLS0tLS0tIDEgLS0tLS0tLS0tLS0tLXwxMDAwfCAtIEJhZCBzbG90XG4gICpcbiAgKiBDT1VOVCBpcyBgU1dQX1RCX0NPVU5UX0JJVFNgIGxvbmcsIFogaXMgdGhlIGBTV1BfVEJfWkVST19GTEFHYCBiaXQsXG5AQCAtNDksOSAmIzQzOzQ5LDExIEBAIHN0cnVjdCBzd2FwX21lbWNnX3RhYmxlIHtcbiAgKiAtIFBGTjogU3dhcCBzbG90IGlzIGluIHVzZSwgYW5kIGNhY2hlZC4gTWVtY2cgaW5mbyBpcyByZWNvcmRlZCBvbiB0aGUgcGFnZVxuICAqICAgc3RydWN0LlxuICAqXG4tICogLSBQb2ludGVyOiBVbnVzZWQgeWV0LiBgMGIxMDBgIGlzIHJlc2VydmVkIGZvciBwb3RlbnRpYWwgcG9pbnRlciB1c2FnZVxuLSAqICAgYmVjYXVzZSBvbmx5IHRoZSBsb3dlciB0aHJlZSBiaXRzIGNhbiBiZSB1c2VkIGFzIGEgbWFya2VyIGZvciA4IGJ5dGVzXG4tICogICBhbGlnbmVkIHBvaW50ZXJzLlxuJiM0MzsgKiAtIFBvaW50ZXI6IFN0b3JlcyBhIGRpcmVjdCBwb2ludGVyIHRvIGEgenN3YXBfZW50cnkgd2hlbiB0aGUgc3dhcCBzbG90JiMzOTtzXG4mIzQzOyAqICAgY29tcHJlc3NlZCBkYXRhIHJlc2lkZXMgaW4genN3YXAuIFRoZSBzd2FwIGNvdW50IChpZiBhbnkpIGlzIHN0b3JlZCBpblxuJiM0MzsgKiAgIHRoZSB6c3dhcF9lbnRyeSBzdHJ1Y3QgcmF0aGVyIHRoYW4gaW5saW5lLCBzaW5jZSB0aGUgcG9pbnRlciBvY2N1cGllc1xuJiM0MzsgKiAgIGFsbCB1cHBlciBiaXRzLiBgMGIxMDBgIGlzIHVzZWQgYXMgdGhlIG1hcmtlciBiZWNhdXNlIHpzd2FwX2VudHJ5XG4mIzQzOyAqICAgcG9pbnRlcnMgYXJlIGF0IGxlYXN0IDgtYnl0ZSBhbGlnbmVkLCBsZWF2aW5nIHRoZSBsb3dlciB0aHJlZSBiaXRzIGZyZWUuXG4gICpcbiAgKiAtIEJhZDogU3dhcCBzbG90IGlzIHJlc2VydmVkLCBwcm90ZWN0cyBzd2FwIGhlYWRlciBvciBob2xlcyBvbiBzd2FwIGRldmljZXMuXG4gICovXG5AQCAtNzgsNiAmIzQzOzgwLDkgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUge1xuIC8qIFRoZSBmaXJzdCBmbGFnIGlzIHplcm8gYml0IChTV0FQX1RBQkxFX0hBU19aRVJPRkxBRykgKi9cbiAjZGVmaW5lIFNXUF9UQl9aRVJPX0ZMQUdcdEJJVChCSVRTX1BFUl9MT05HIC0gU1dQX1RCX0ZMQUdTX0JJVFMpXG4gXG4mIzQzOy8qIFBvaW50ZXI6IHpzd2FwX2VudHJ5IHBvaW50ZXIgc3RvcmVkIGRpcmVjdGx5LCBlbmRzIHdpdGggMGIxMDAgKi9cbiYjNDM7I2RlZmluZSBTV1BfVEJfUE9JTlRFUl9NQVJLXHQwYjEwMFVMXG4mIzQzO1xuIC8qIEJhZCBzbG90OiBlbmRzIHdpdGggMGIxMDAwIGFuZCByZXN0cyBvZiBiaXRzIGFyZSBhbGwgMSAqL1xuICNkZWZpbmUgU1dQX1RCX0JBRFx0XHQoKH4wVUwpIFx1MDAzY1x1MDAzYyAzKVxuIFxuQEAgLTE2Niw2ICYjNDM7MTcxLDExIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBzd3BfdGJfaXNfYmFkKHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuIFx0cmV0dXJuIHN3cF90YiA9PSBTV1BfVEJfQkFEO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHN3cF90Yl9pc19wb2ludGVyKHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIChzd3BfdGIgXHUwMDI2IChCSVQoMykgLSAxKSkgPT0gU1dQX1RCX1BPSU5URVJfTUFSSztcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX2NvdW50YWJsZSh1bnNpZ25lZCBsb25nIHN3cF90YilcbiB7XG4gXHRyZXR1cm4gKHN3cF90Yl9pc19zaGFkb3coc3dwX3RiKSB8fCBzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSB8fFxuQEAgLTE4OCw2ICYjNDM7MTk4LDIzIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3dwX3RiX3RvX3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YilcbiBcdHJldHVybiAodm9pZCAqKShzd3BfdGIgXHUwMDI2IH5TV1BfVEJfRkxBR1NfTUFTSyk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9pbnRlcl90b19zd3BfdGIodm9pZCAqcHRyKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZylwdHI7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2YodW5zaWduZWQgbG9uZykgIT0gc2l6ZW9mKHZvaWQgKikpO1xuJiM0MztcdC8qIFBvaW50ZXJzIGFyZSA4LWJ5dGUgYWxpZ25lZCwgbG93IDMgYml0cyBtdXN0IGJlIGNsZWFyICovXG4mIzQzO1x0Vk1fV0FSTl9PTl9PTkNFKHZhbCBcdTAwMjYgKEJJVCgzKSAtIDEpKTtcbiYjNDM7XHRyZXR1cm4gdmFsIHwgU1dQX1RCX1BPSU5URVJfTUFSSztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpzd3BfdGJfdG9fcG9pbnRlcih1bnNpZ25lZCBsb25nIHN3cF90YilcbiYjNDM7e1xuJiM0MztcdFZNX1dBUk5fT04oIXN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpO1xuJiM0MztcdC8qIENsZWFyIHRoZSBsb3cgMy1iaXQgbWFya2VyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi9cbiYjNDM7XHRyZXR1cm4gKHZvaWQgKikoc3dwX3RiIFx1MDAyNiB+KCh1bnNpZ25lZCBsb25nKShCSVQoMykgLSAxKSkpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpXG4ge1xuIFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKTtcbmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuY1xuaW5kZXggYTYwMmU1ODIwNTEzYTguLjE4OTI1ZTQ2MjU3MWIxIDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuY1xuQEAgLTkzNSw3ICYjNDM7OTM1LDggQEAgc3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdG5yX3BhZ2VzID0gMSBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4gXHRcdHN3YXBfY2x1c3Rlcl9hc3NlcnRfZW1wdHkoY2ksIGNpX29mZiwgbnJfcGFnZXMsIGZhbHNlKTtcbiBcdFx0X19zd2FwX2NhY2hlX2FkZF9mb2xpbyhjaSwgZm9saW8sIHN3cF9lbnRyeShzaS1cdTAwM2V0eXBlLFxuLVx0XHRcdFx0XHRcdFx0ICAgIGNpX29mZiAmIzQzOyBjbHVzdGVyX29mZnNldChzaSwgY2kpKSk7XG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgIGNpX29mZiAmIzQzOyBjbHVzdGVyX29mZnNldChzaSwgY2kpKSxcbiYjNDM7XHRcdFx0XHQgICAgICAgTlVMTCk7XG4gXHR9IGVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX0hJQkVSTkFUSU9OKSkge1xuIFx0XHRvcmRlciA9IDA7XG4gXHRcdG5yX3BhZ2VzID0gMTtcbkBAIC0xNTM2LDI1ICYjNDM7MTUzNyw1MSBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcbiBcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuJiM0MztcbiYjNDM7XHQvKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5IHN0cnVjdCAqL1xuJiM0MztcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4mIzQzO1x0XHR6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHN3cF90YiwgY2ksIGNpX29mZik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiBcdGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0UoY291bnQgXHUwMDNjPSAwKTtcbiBcdFZNX1dBUk5fT05fT05DRShjb3VudCBcdTAwM2UgU1dQX1RCX0NPVU5UX01BWCk7XG4tXG4tXHRpZiAoY291bnQgPT0gU1dQX1RCX0NPVU5UX01BWCkge1xuLVx0XHRjb3VudCA9IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xuLVx0XHQvKiBPdmVyZmxvdyBzdGFydHMgd2l0aCBTV1BfVEJfQ09VTlRfTUFYICovXG4tXHRcdFZNX1dBUk5fT05fT05DRShjb3VudCBcdTAwM2MgU1dQX1RCX0NPVU5UX01BWCk7XG4tXHRcdGNvdW50LS07XG4tXHRcdGlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7XG4tXHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwO1xuLVx0XHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgX19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuJiM0MztcdFx0aWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHtcbiYjNDM7XHRcdFx0aWYgKCFjaS1cdTAwM2VleHRlbmRfdGFibGUpIHtcbiYjNDM7XHRcdFx0XHQvKlxuJiM0MztcdFx0XHRcdCAqIE1BWCB3aXRob3V0IGV4dGVuZF90YWJsZTogTUFYIGlzIHRoZSByZWFsXG4mIzQzO1x0XHRcdFx0ICogY291bnQuICBEZWNyZW1lbnQgYW5kIHdyaXRlIGJhY2sgaW5saW5lLlxuJiM0MztcdFx0XHRcdCAqL1xuJiM0MztcdFx0XHRcdGNvdW50LS07XG4mIzQzO1x0XHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxuJiM0MztcdFx0XHRcdFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuJiM0MztcdFx0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRcdC8qXG4mIzQzO1x0XHRcdFx0ICogTUFYIHdpdGggZXh0ZW5kX3RhYmxlOiByZWFsIGNvdW50IGxpdmVzIGluXG4mIzQzO1x0XHRcdFx0ICogY2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0uICBQdWxsLCBkZWNyZW1lbnRcbiYjNDM7XHRcdFx0XHQgKiBpdCwgYW5kIGVpdGhlciBtb3ZlIGl0IGJhY2sgaW5saW5lIChpZiBub3dcbiYjNDM7XHRcdFx0XHQgKiBmaXRzKSBvciB3cml0ZSBpdCBiYWNrIHRvIHRoZSBleHRlbmQgdGFibGUuXG4mIzQzO1x0XHRcdFx0ICovXG4mIzQzO1x0XHRcdFx0Y291bnQgPSBjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcbiYjNDM7XHRcdFx0XHQvKiBPdmVyZmxvdyBzdGFydHMgd2l0aCBTV1BfVEJfQ09VTlRfTUFYICovXG4mIzQzO1x0XHRcdFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFx1MDAzYyBTV1BfVEJfQ09VTlRfTUFYKTtcbiYjNDM7XHRcdFx0XHRjb3VudC0tO1xuJiM0MztcdFx0XHRcdGlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7XG4mIzQzO1x0XHRcdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IDA7XG4mIzQzO1x0XHRcdFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXG4mIzQzO1x0XHRcdFx0XHRcdF9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgY291bnQpKTtcbiYjNDM7XHRcdFx0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdH1cbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50O1xuJiM0MztcdFx0XHQvKiBjb3VudCBcdTAwM2MgTUFYOiBzaW1wbGUgaW5saW5lIGRlY3JlbWVudCAqL1xuJiM0MztcdFx0XHRjb3VudC0tO1xuJiM0MztcdFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXG4mIzQzO1x0XHRcdFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuIFx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIF9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgLS1jb3VudCkpO1xuLVx0fVxuIFxuIFx0LypcbiBcdCAqIGBTV1BfVEJfQ09VTlRfTUFYIC0gMWAgdHJpZ2dlcnMgZXh0ZW5kIHRhYmxlIGFsbG9jYXRpb24uIElmIHRoZVxuQEAgLTE1OTYsNyAmIzQzOzE2MjMsMTggQEAgc3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdGNpX2VuZCA9IGNpX29mZiAmIzQzOyBucjtcbiBcdGRvIHtcbiBcdFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbi1cdFx0aWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogUG9pbnRlciBlbnRyaWVzIHN0b3JlIGNvdW50IGluIHRoZSB6c3dhcF9lbnRyeTtcbiYjNDM7XHRcdCAqIGhhbmRsZSB0aGVtIGJlZm9yZSBzd3BfdGJfZ2V0X2NvdW50ICh3aGljaCByZXR1cm5zXG4mIzQzO1x0XHQgKiAtRUlOVkFMIGZvciBub24tY291bnRhYmxlIHR5cGVzKS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcbiYjNDM7XHRcdFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XG4mIzQzO1x0XHRcdFx0aWYgKGNpX2JhdGNoID09IC0xKVxuJiM0MztcdFx0XHRcdFx0Y2lfYmF0Y2ggPSBjaV9vZmY7XG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH0gZWxzZSBpZiAoc3dwX3RiX2dldF9jb3VudChzd3BfdGIpID09IDEpIHtcbiBcdFx0XHQvKiBjb3VudCA9PSAxIGFuZCBub24tY2FjaGVkIHNsb3RzIHdpbGwgYmUgYmF0Y2ggZnJlZWQuICovXG4gXHRcdFx0aWYgKCFzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSkge1xuIFx0XHRcdFx0aWYgKGNpX2JhdGNoID09IC0xKVxuQEAgLTE2NDcsNiAmIzQzOzE2ODUsMTEgQEAgc3RhdGljIGludCBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdC8qIEJhZCBvciBzcGVjaWFsIHNsb3RzIGNhbiYjMzk7dCBiZSBoYW5kbGVkICovXG4gXHRpZiAoV0FSTl9PTl9PTkNFKHN3cF90Yl9pc19iYWQoc3dwX3RiKSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHQvKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5IHN0cnVjdCAqL1xuJiM0MztcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxuJiM0MztcdFx0cmV0dXJuIHpzd2FwX3N3cF90Yl9kdXBfY291bnQoc3dwX3RiLCBjaSwgY2lfb2ZmKTtcbiYjNDM7XG4gXHRjb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChzd3BfdGIpO1xuIFx0LyogTXVzdCBiZSBlaXRoZXIgY2FjaGVkIG9yIGhhdmUgYSBjb3VudCBhbHJlYWR5ICovXG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFjb3VudCBcdTAwMjZcdTAwMjYgIXN3cF90Yl9pc19mb2xpbyhzd3BfdGIpKSlcbkBAIC0xOTIzLDEzICYjNDM7MTk2NiwyNiBAQCB2b2lkIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4gXHRcdC8qXG4gXHRcdCAqIEZyZWVpbmcgaXMgZG9uZSBhZnRlciByZWxlYXNlIG9mIHRoZSBsYXN0IHN3YXAgY291bnRcbi1cdFx0ICogcmVmLCBvciBhZnRlciBzd2FwIGNhY2hlIGlzIGRyb3BwZWRcbiYjNDM7XHRcdCAqIHJlZiwgb3IgYWZ0ZXIgc3dhcCBjYWNoZSBpcyBkcm9wcGVkLiBBIFBvaW50ZXIgZW50cnlcbiYjNDM7XHRcdCAqIG1lYW5zIHpzd2FwIGhhcyBhIGNvbXByZXNzZWQgY29weTsgdGhlIHhhcnJheSBzdGlsbFxuJiM0MztcdFx0ICogaG9sZHMgdGhlIGVudHJ5IGFuZCB6c3dhcF9pbnZhbGlkYXRlIHdpbGwgZnJlZSBpdC5cbiBcdFx0ICovXG4tXHRcdFZNX1dBUk5fT04oIXN3cF90Yl9pc19zaGFkb3cob2xkX3RiKSB8fCBfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSBcdTAwM2UgMSk7XG4mIzQzO1x0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkge1xuJiM0MztcdFx0XHRWTV9XQVJOX09OKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSBcdTAwM2UgMSk7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIEZyZWUgdGhlIHpzd2FwIGVudHJ5IG5vdyB1bmRlciBjaS1cdTAwM2Vsb2NrIHdoaWxlXG4mIzQzO1x0XHRcdCAqIHRoZSBQb2ludGVyIGlzIHN0aWxsIGluIHRoZSBzd2FwIHRhYmxlLiAgT25jZVxuJiM0MztcdFx0XHQgKiB3ZSBudWxsIHRoZSBzbG90LCB0aGUgZW50cnkgd291bGQgYmUgbGVha2VkLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0enN3YXBfZW50cnlfZnJlZShzd3BfdGJfdG9fcG9pbnRlcihvbGRfdGIpKTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdFZNX1dBUk5fT04oIXN3cF90Yl9pc19zaGFkb3cob2xkX3RiKSB8fFxuJiM0MztcdFx0XHRcdCAgIF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpIFx1MDAzZSAxKTtcbiYjNDM7XHRcdH1cbiBcbiBcdFx0LyogUmVzZXR0aW5nIHRoZSBzbG90IHRvIE5VTEwgYWxzbyBjbGVhcnMgdGhlIGlubGluZSBmbGFncy4gKi9cbiBcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBudWxsX3RvX3N3cF90YigpKTtcbi1cdFx0aWYgKCFTV0FQX1RBQkxFX0hBU19aRVJPRkxBRylcbiYjNDM7XHRcdGlmICghU1dBUF9UQUJMRV9IQVNfWkVST0ZMQUcgXHUwMDI2XHUwMDI2ICFzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKVxuIFx0XHRcdF9fc3dhcF90YWJsZV9jbGVhcl96ZXJvKGNpLCBjaV9vZmYpO1xuIFxuIFx0XHQvKlxuQEAgLTE5NjEsOCAmIzQzOzIwMTcsMTEgQEAgaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gX19zd2FwX2VudHJ5X3RvX2NsdXN0ZXIoZW50cnkpO1xuIFx0dW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuIFxuLVx0cmV0dXJuIHN3cF90Yl9nZXRfY291bnQoX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSk7XG4mIzQzO1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpXG4mIzQzO1x0XHRyZXR1cm4genN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpO1xuJiM0MztcdHJldHVybiBzd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7XG4gfVxuIFxuIC8qKlxuQEAgLTE5ODAsNiAmIzQzOzIwMzksOCBAQCBib29sIHN3YXBfZW50cnlfc3dhcHBlZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN3cF9lbnRyeV90IGVudHJ5KVxuIFx0c3dwX3RiID0gc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuIFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4gXG4mIzQzO1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpXG4mIzQzO1x0XHRyZXR1cm4genN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpIFx1MDAzZSAwO1xuIFx0cmV0dXJuIHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcdTAwM2UgMDtcbiB9XG4gXG5AQCAtMjAyMCw3ICYjNDM7MjA4MSw3IEBAIGludCBzd3Bfc3dhcGNvdW50KHN3cF9lbnRyeV90IGVudHJ5KVxuICAqXG4gICogQ29udGV4dDogQ2FsbGVyIG11c3QgZW5zdXJlIHRoZSBmb2xpbyBpcyBsb2NrZWQgYW5kIGluIHRoZSBzd2FwIGNhY2hlLlxuICAqL1xuLXN0YXRpYyBib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7Ym9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0c3dwX2VudHJ5X3QgZW50cnkgPSBmb2xpby1cdTAwM2Vzd2FwO1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbkBAIC0yNTU2LDggJiM0MzsyNjE3LDEyIEBAIHN0YXRpYyBpbnQgdW51c2VfcHRlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0XHRpZiAoIWZvbGlvKSB7XG4gXHRcdFx0c3dwX3RiID0gc3dhcF90YWJsZV9nZXQoX19zd2FwX2VudHJ5X3RvX2NsdXN0ZXIoZW50cnkpLFxuIFx0XHRcdFx0XHRcdHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSkpO1xuLVx0XHRcdGlmIChzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXHUwMDNjPSAwKVxuJiM0MztcdFx0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkge1xuJiM0MztcdFx0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXHUwMDNjPSAwKVxuJiM0MztcdFx0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH0gZWxzZSBpZiAoc3dwX3RiX2dldF9jb3VudChzd3BfdGIpIFx1MDAzYz0gMCkge1xuIFx0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdFx0fVxuIFxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCA3NjFjZDY5OWUwYTNlNi4uZjk3NjJkMGE1OTZhYjQgMTAwNjQ0XG4tLS0gYS9tbS96c3dhcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS96c3dhcC5jXG5AQCAtMzgsNiAmIzQzOzM4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC96c21hbGxvYy5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7c3dhcC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3N3YXBfdGFibGUuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O2ludGVybmFsLmhcJiMzNDtcbiBcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5AQCAtMTgyLDYgJiM0MzsxODMsMTAgQEAgc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqenN3YXBfc2hyaW5rZXI7XG4gICogICAgICAgICAgICAgIHdyaXRlYmFjayBsb2dpYy4gVGhlIGVudHJ5IGlzIG9ubHkgcmVjbGFpbWVkIGJ5IHRoZSB3cml0ZWJhY2tcbiAgKiAgICAgICAgICAgICAgbG9naWMgaWYgcmVmZXJlbmNlZCBpcyB1bnNldC4gU2VlIGNvbW1lbnRzIGluIHRoZSBzaHJpbmtlclxuICAqICAgICAgICAgICAgICBzZWN0aW9uIGZvciBjb250ZXh0LlxuJiM0MzsgKiBzd3BfdGJfdmFsIC0gdGhlIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgc2F2ZWQgd2hlbiB0aGlzIHpzd2FwX2VudHJ5XG4mIzQzOyAqICAgICAgICAgICAgICByZXBsYWNlZCBhIFNoYWRvdyBvciBQRk4gZW50cnkuIEl0IHByZXNlcnZlcyB0aGUgc3dhcCBjb3VudCxcbiYjNDM7ICogICAgICAgICAgICAgIHplcm8gZmxhZywgYW5kIHdvcmtpbmcgc2V0IHNoYWRvdyBpbmZvcm1hdGlvbiAoU0hBRE9XX1ZBTClcbiYjNDM7ICogICAgICAgICAgICAgIHRoYXQgdGhlIFNoYWRvdyBlbnRyeSBjYXJyaWVkLlxuICAqIHBvb2wgLSB0aGUgenN3YXBfcG9vbCB0aGUgZW50cnkmIzM5O3MgZGF0YSBpcyBpblxuICAqIGhhbmRsZSAtIHpzbWFsbG9jIGFsbG9jYXRpb24gaGFuZGxlIHRoYXQgc3RvcmVzIHRoZSBjb21wcmVzc2VkIHBhZ2UgZGF0YVxuICAqIG9iamNnIC0gdGhlIG9ial9jZ3JvdXAgdGhhdCB0aGUgY29tcHJlc3NlZCBtZW1vcnkgaXMgY2hhcmdlZCB0b1xuQEAgLTE5MSwxNSAmIzQzOzE5NiwxMyBAQCBzdHJ1Y3QgenN3YXBfZW50cnkge1xuIFx0c3dwX2VudHJ5X3Qgc3dwZW50cnk7XG4gXHR1bnNpZ25lZCBpbnQgbGVuZ3RoO1xuIFx0Ym9vbCByZWZlcmVuY2VkO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3dwX3RiX3ZhbDtcbiBcdHN0cnVjdCB6c3dhcF9wb29sICpwb29sO1xuIFx0dW5zaWduZWQgbG9uZyBoYW5kbGU7XG4gXHRzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2c7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkIGxydTtcbiB9O1xuIFxuLXN0YXRpYyBzdHJ1Y3QgeGFycmF5ICp6c3dhcF90cmVlc1tNQVhfU1dBUEZJTEVTXTtcbi1zdGF0aWMgdW5zaWduZWQgaW50IG5yX3pzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdO1xuLVxuIC8qIFJDVS1wcm90ZWN0ZWQgaXRlcmF0aW9uICovXG4gc3RhdGljIExJU1RfSEVBRCh6c3dhcF9wb29scyk7XG4gLyogcHJvdGVjdHMgenN3YXBfcG9vbHMgbGlzdCBtb2RpZmljYXRpb24gKi9cbkBAIC0yMjUsMTUgJiM0MzsyMjgsNiBAQCBzdGF0aWMgYm9vbCB6c3dhcF9oYXNfcG9vbDtcbiAqIGhlbHBlcnMgYW5kIGZ3ZCBkZWNsYXJhdGlvbnNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIFxuLS8qIE9uZSBzd2FwIGFkZHJlc3Mgc3BhY2UgZm9yIGVhY2ggNjRNIHN3YXAgc3BhY2UgKi9cbi0jZGVmaW5lIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQgMTRcbi0jZGVmaW5lIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMgKDEgXHUwMDNjXHUwMDNjIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQpXG4tc3RhdGljIGlubGluZSBzdHJ1Y3QgeGFycmF5ICpzd2FwX3pzd2FwX3RyZWUoc3dwX2VudHJ5X3Qgc3dwKVxuLXtcbi1cdHJldHVybiBcdTAwMjZ6c3dhcF90cmVlc1tzd3BfdHlwZShzd3ApXVtzd3Bfb2Zmc2V0KHN3cClcbi1cdFx0XHUwMDNlXHUwMDNlIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlRdO1xuLX1cbi1cbiAjZGVmaW5lIHpzd2FwX3Bvb2xfZGVidWcobXNnLCBwKVx0XHRcdFxcXG4gXHRwcl9kZWJ1ZyhcJiMzNDslcyBwb29sICVzXFxuXCYjMzQ7LCBtc2csIChwKS1cdTAwM2V0Zm1fbmFtZSlcbiBcbkBAIC03NjIsNyAmIzQzOzc1Niw3IEBAIHN0YXRpYyB2b2lkIHpzd2FwX2VudHJ5X2NhY2hlX2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSlcbiAgKiBDYXJyaWVzIG91dCB0aGUgY29tbW9uIHBhdHRlcm4gb2YgZnJlZWluZyBhbiBlbnRyeSYjMzk7cyB6c21hbGxvYyBhbGxvY2F0aW9uLFxuICAqIGZyZWVpbmcgdGhlIGVudHJ5IGl0c2VsZiwgYW5kIGRlY3JlbWVudGluZyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBwYWdlcy5cbiAgKi9cbi1zdGF0aWMgdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXG4mIzQzO3ZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KVxuIHtcbiBcdHpzd2FwX2xydV9kZWwoXHUwMDI2enN3YXBfbGlzdF9scnUsIGVudHJ5KTtcbiBcdHpzX2ZyZWUoZW50cnktXHUwMDNlcG9vbC1cdTAwM2V6c19wb29sLCBlbnRyeS1cdTAwM2VoYW5kbGUpO1xuQEAgLTk4NywxMSAmIzQzOzk4MSwxMiBAQCBzdGF0aWMgYm9vbCB6c3dhcF9kZWNvbXByZXNzKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSxcbiBcdFx0XHRcdCBzd3BfZW50cnlfdCBzd3BlbnRyeSlcbiB7XG4tXHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xuIFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cGVudHJ5KTtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4gXHRzdHJ1Y3QgbWVtcG9saWN5ICptcG9sO1xuIFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzd3BfdGI7XG4gXHRpbnQgcmV0ID0gMDtcbiBcbiBcdC8qIHRyeSB0byBhbGxvY2F0ZSBzd2FwIGNhY2hlIGZvbGlvICovXG5AQCAtOTk5LDkgJiM0Mzs5OTQsMjUgQEAgc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSxcbiBcdGlmICghc2kpXG4gXHRcdHJldHVybiAtRUVYSVNUO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogVmVyaWZ5IHRoZSBzd2FwIHRhYmxlIFBvaW50ZXIgZW50cnkgc3RpbGwgcmVmZXJlbmNlcyB0aGlzXG4mIzQzO1x0ICogenN3YXBfZW50cnkuIElmIHRoZSBlbnRyeSB3YXMgaW52YWxpZGF0ZWQgb3IgcmVwbGFjZWQgYnkgYVxuJiM0MztcdCAqIGNvbmN1cnJlbnQgc3RvcmUsIHRoZSBQb2ludGVyIHdpbGwgYmUgZ29uZSBvciBwb2ludCBlbHNld2hlcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2ksIG9mZnNldCk7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuJiM0MztcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuJiM0MztcdGlmICghc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSB8fFxuJiM0MztcdCAgICBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpICE9IGVudHJ5KSB7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRcdHB1dF9zd2FwX2RldmljZShzaSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHR9XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4mIzQzO1xuIFx0bXBvbCA9IGdldF90YXNrX3BvbGljeShjdXJyZW50KTtcbiBcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLFxuLVx0XHRcdFx0ICAgICAgIE5PX0lOVEVSTEVBVkVfSU5ERVgpO1xuJiM0MztcdFx0XHRcdCAgICAgICBOT19JTlRFUkxFQVZFX0lOREVYLCBOVUxMKTtcbiBcdHB1dF9zd2FwX2RldmljZShzaSk7XG4gXG4gXHQvKlxuQEAgLTEwMTUsMjcgJiM0MzsxMDI2LDE1IEBAIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHRcdHJldHVybiBQVFJfRVJSKGZvbGlvKTtcbiBcbiBcdC8qXG4tXHQgKiBmb2xpbyBpcyBsb2NrZWQsIGFuZCB0aGUgc3dhcGNhY2hlIGlzIG5vdyBzZWN1cmVkIGFnYWluc3Rcbi1cdCAqIGNvbmN1cnJlbnQgc3dhcHBpbmcgdG8gYW5kIGZyb20gdGhlIHNsb3QsIGFuZCBjb25jdXJyZW50XG4tXHQgKiBzd2Fwb2ZmIHNvIHdlIGNhbiBzYWZlbHkgZGVyZWZlcmVuY2UgdGhlIHpzd2FwIHRyZWUgaGVyZS5cbi1cdCAqIFZlcmlmeSB0aGF0IHRoZSBzd2FwIGVudHJ5IGhhc24mIzM5O3QgYmVlbiBpbnZhbGlkYXRlZCBhbmQgcmVjeWNsZWRcbi1cdCAqIGJlaGluZCBvdXIgYmFja3MsIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGEgbmV3IHN3YXAgZm9saW8gd2l0aFxuLVx0ICogb2xkIGNvbXByZXNzZWQgZGF0YS4gT25seSB3aGVuIHRoaXMgaXMgc3VjY2Vzc2Z1bCBjYW4gdGhlIGVudHJ5XG4tXHQgKiBiZSBkZXJlZmVyZW5jZWQuXG4mIzQzO1x0ICogVGhlIGZvbGlvIGlzIG5vdyBsb2NrZWQgYW5kIGluIHN3YXAgY2FjaGUsIHNvIGNvbmN1cnJlbnRcbiYjNDM7XHQgKiBzdG9yZXMgYXJlIGJsb2NrZWQuIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8gYWxyZWFkeVxuJiM0MztcdCAqIG92ZXJ3cm90ZSB0aGUgUG9pbnRlciBlbnRyeSB3aXRoIGEgUEZOLlxuIFx0ICovXG4tXHR0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cGVudHJ5KTtcbi1cdGlmIChlbnRyeSAhPSB4YV9sb2FkKHRyZWUsIG9mZnNldCkpIHtcbi1cdFx0cmV0ID0gLUVOT01FTTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4gXHRpZiAoIXpzd2FwX2RlY29tcHJlc3MoZW50cnksIGZvbGlvKSkge1xuIFx0XHRyZXQgPSAtRUlPO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4tXG4gXHRjb3VudF92bV9ldmVudChaU1dQV0IpO1xuIFx0aWYgKGVudHJ5LVx1MDAzZW9iamNnKVxuIFx0XHRjb3VudF9vYmpjZ19ldmVudHMoZW50cnktXHUwMDNlb2JqY2csIFpTV1BXQiwgMSk7XG5AQCAtMTEwNSwzNiAmIzQzOzExMDQsMjIgQEAgc3RhdGljIGVudW0gbHJ1X3N0YXR1cyBzaHJpbmtfbWVtY2dfY2Ioc3RydWN0IGxpc3RfaGVhZCAqaXRlbSwgc3RydWN0IGxpc3RfbHJ1X29cbiBcdH1cbiBcbiBcdC8qXG4tXHQgKiBBcyBzb29uIGFzIHdlIGRyb3AgdGhlIExSVSBsb2NrLCB0aGUgZW50cnkgY2FuIGJlIGZyZWVkIGJ5XG4tXHQgKiBhIGNvbmN1cnJlbnQgaW52YWxpZGF0aW9uLiBUaGlzIG1lYW5zIHRoZSBmb2xsb3dpbmc6XG4tXHQgKlxuLVx0ICogMS4gV2UgZXh0cmFjdCB0aGUgc3dwX2VudHJ5X3QgdG8gdGhlIHN0YWNrLCBhbGxvd2luZ1xuLVx0ICogICAgenN3YXBfd3JpdGViYWNrX2VudHJ5KCkgdG8gcGluIHRoZSBzd2FwIGVudHJ5IGFuZFxuLVx0ICogICAgdGhlbiB2YWxpZGF0ZSB0aGUgenN3YXAgZW50cnkgYWdhaW5zdCB0aGF0IHN3YXAgZW50cnkmIzM5O3Ncbi1cdCAqICAgIHRyZWUgdXNpbmcgcG9pbnRlciB2YWx1ZSBjb21wYXJpc29uLiBPbmx5IHdoZW4gdGhhdFxuLVx0ICogICAgaXMgc3VjY2Vzc2Z1bCBjYW4gdGhlIGVudHJ5IGJlIGRlcmVmZXJlbmNlZC5cbi1cdCAqXG4tXHQgKiAyLiBVc3VhbGx5LCBvYmplY3RzIGFyZSB0YWtlbiBvZmYgdGhlIExSVSBmb3IgcmVjbGFpbS4gSW5cbi1cdCAqICAgIHRoaXMgY2FzZSB0aGlzIGlzbiYjMzk7dCBwb3NzaWJsZSwgYmVjYXVzZSBpZiByZWNsYWltIGZhaWxzXG4tXHQgKiAgICBmb3Igd2hhdGV2ZXIgcmVhc29uLCB3ZSBoYXZlIG5vIG1lYW5zIG9mIGtub3dpbmcgaWYgdGhlXG4tXHQgKiAgICBlbnRyeSBpcyBhbGl2ZSB0byBwdXQgaXQgYmFjayBvbiB0aGUgTFJVLlxuJiM0MztcdCAqIEFmdGVyIHdlIGRyb3AgdGhlIExSVSBsb2NrLCB0aGUgZW50cnkgbWF5IGJlIGZyZWVkIGJ5IGFcbiYjNDM7XHQgKiBjb25jdXJyZW50IHN3YXAgc2xvdCBmcmVlLiAgVGhpcyBpcyBzYWZlIGJlY2F1c2VcbiYjNDM7XHQgKiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSByZWNoZWNrcyB0aGUgc3dhcCB0YWJsZSB1bmRlclxuJiM0MztcdCAqIGNpLVx1MDAzZWxvY2sgYmVmb3JlIGRlcmVmZXJlbmNpbmcgZW50cnk7IGlmIHRoZSBQb2ludGVyIGlzXG4mIzQzO1x0ICogZ29uZSBpdCBiYWlscyBvdXQuXG4gXHQgKlxuLVx0ICogICAgU28gcm90YXRlIGl0IGJlZm9yZSBkcm9wcGluZyB0aGUgbG9jay4gSWYgdGhlIGVudHJ5IGlzXG4tXHQgKiAgICB3cml0dGVuIGJhY2sgb3IgaW52YWxpZGF0ZWQsIHRoZSBmcmVlIHBhdGggd2lsbCB1bmxpbmtcbi1cdCAqICAgIGl0LiBGb3IgZmFpbHVyZXMsIHJvdGF0aW9uIGlzIHRoZSByaWdodCB0aGluZyBhcyB3ZWxsLlxuLVx0ICpcbi1cdCAqICAgIFRlbXBvcmFyeSBmYWlsdXJlcywgd2hlcmUgdGhlIHNhbWUgZW50cnkgc2hvdWxkIGJlIHRyaWVkXG4tXHQgKiAgICBhZ2FpbiBpbW1lZGlhdGVseSwgYWxtb3N0IG5ldmVyIGhhcHBlbiBmb3IgdGhpcyBzaHJpbmtlci5cbi1cdCAqICAgIFdlIGRvbiYjMzk7dCBkbyBhbnkgdHJ5bG9ja2luZzsgLUVOT01FTSBjb21lcyBjbG9zZXN0LFxuLVx0ICogICAgYnV0IHRoYXQmIzM5O3MgZXh0cmVtZWx5IHJhcmUgYW5kIGRvZXNuJiMzOTt0IGhhcHBlbiBzcHVyaW91c2x5XG4tXHQgKiAgICBlaXRoZXIuIERvbiYjMzk7dCBib3RoZXIgZGlzdGluZ3Vpc2hpbmcgdGhpcyBjYXNlLlxuJiM0MztcdCAqIFJvdGF0ZSB0aGUgZW50cnkgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrOiBpZiBpdCBnZXRzXG4mIzQzO1x0ICogd3JpdHRlbiBiYWNrIG9yIGludmFsaWRhdGVkIHRoZSBmcmVlIHBhdGggd2lsbCB1bmxpbmtcbiYjNDM7XHQgKiBpdCBmcm9tIHRoZSBMUlUuICBGb3IgZmFpbHVyZXMgcm90YXRpb24gaXMgZmluZS5cbiBcdCAqL1xuIFx0bGlzdF9tb3ZlX3RhaWwoaXRlbSwgXHUwMDI2bC1cdTAwM2VsaXN0KTtcbiBcbiBcdC8qXG4tXHQgKiBPbmNlIHRoZSBscnUgbG9jayBpcyBkcm9wcGVkLCB0aGUgZW50cnkgbWlnaHQgZ2V0IGZyZWVkLiBUaGVcbi1cdCAqIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2ssIGFuZCBlbnRyeSBpc24mIzM5O3QgZGVyZWYmIzM5O2QgYWdhaW5cbi1cdCAqIHVudGlsIHRoZSBlbnRyeSBpcyB2ZXJpZmllZCB0byBzdGlsbCBiZSBhbGl2ZSBpbiB0aGUgdHJlZS5cbiYjNDM7XHQgKiBUaGUgc3dwZW50cnkgaXMgY29waWVkIHRvIHRoZSBzdGFjayBzbyB3ZSBjYW4gcGluIHRoZSBzd2FwXG4mIzQzO1x0ICogZGV2aWNlIGFuZCB2YWxpZGF0ZSB0aGUgZW50cnkmIzM5O3Mgc3dhcCB0YWJsZSBQb2ludGVyIHVuZGVyXG4mIzQzO1x0ICogY2ktXHUwMDNlbG9jayBpbiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKS5cbiBcdCAqL1xuIFx0c3dwZW50cnkgPSBlbnRyeS1cdTAwM2Vzd3BlbnRyeTtcbiBcbkBAIC0xMzk4LDcgJiM0MzsxMzgzLDExIEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbClcbiB7XG4gXHRzd3BfZW50cnlfdCBwYWdlX3N3cGVudHJ5ID0gcGFnZV9zd2FwX2VudHJ5KHBhZ2UpO1xuLVx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgKm9sZDtcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCAqb2xkID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiYjNDM7XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQocGFnZV9zd3BlbnRyeSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzd3BfdGI7XG4gXG4gXHQvKiBhbGxvY2F0ZSBlbnRyeSAqL1xuIFx0ZW50cnkgPSB6c3dhcF9lbnRyeV9jYWNoZV9hbGxvYyhHRlBfS0VSTkVMLCBwYWdlX3RvX25pZChwYWdlKSk7XG5AQCAtMTQxMCwzMSAmIzQzOzEzOTksNDkgQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdGlmICghenN3YXBfY29tcHJlc3MocGFnZSwgZW50cnksIHBvb2wpKVxuIFx0XHRnb3RvIGNvbXByZXNzX2ZhaWxlZDtcbiBcbi1cdG9sZCA9IHhhX3N0b3JlKHN3YXBfenN3YXBfdHJlZShwYWdlX3N3cGVudHJ5KSxcbi1cdFx0ICAgICAgIHN3cF9vZmZzZXQocGFnZV9zd3BlbnRyeSksXG4tXHRcdCAgICAgICBlbnRyeSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoeGFfaXNfZXJyKG9sZCkpIHtcbi1cdFx0aW50IGVyciA9IHhhX2VycihvbGQpO1xuLVxuLVx0XHRXQVJOX09OQ0UoZXJyICE9IC1FTk9NRU0sIFwmIzM0O3VuZXhwZWN0ZWQgeGFycmF5IGVycm9yOiAlZFxcblwmIzM0OywgZXJyKTtcbi1cdFx0enN3YXBfcmVqZWN0X2FsbG9jX2ZhaWwmIzQzOyYjNDM7O1xuLVx0XHRnb3RvIHN0b3JlX2ZhaWxlZDtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFN0b3JlIHRoZSB6c3dhcF9lbnRyeSBwb2ludGVyIGluIHRoZSBzd2FwIHRhYmxlIGFzIGFcbiYjNDM7XHQgKiBQb2ludGVyLXR5cGUgZW50cnksIHJlcGxhY2luZyB0aGUgUEZOIG9yIFNoYWRvdyBlbnRyeS5cbiYjNDM7XHQgKiBUaGUgZnVsbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlIChpbmNsdWRpbmcgd29ya2luZyBzZXRcbiYjNDM7XHQgKiBzaGFkb3cpIGlzIHByZXNlcnZlZCBpbiBlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsLlxuJiM0MztcdCAqIEZvbGlvIGxvY2sgc2VyaWFsaXplcyBjb25jdXJyZW50IHN0b3Jlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzaSA9IF9fc3dhcF9lbnRyeV90b19pbmZvKHBhZ2Vfc3dwZW50cnkpO1xuJiM0MztcdGNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTtcbiYjNDM7XHRpZiAoc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogU2F2ZSB0aGUgY29tcGxldGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZVxuJiM0MztcdFx0ICogKFNoYWRvdyBvciBQRk4pLCBwcmVzZXJ2aW5nIHN3YXAgY291bnQsIHplcm8gZmxhZyxcbiYjNDM7XHRcdCAqIGFuZCB3b3JraW5nIHNldCBzaGFkb3cgaW5mb3JtYXRpb24uXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGVudHJ5LVx1MDAzZXN3cF90Yl92YWwgPSBzd3BfdGI7XG4mIzQzO1x0fSBlbHNlIGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogUmVwbGFjaW5nIGFuIGV4aXN0aW5nIFBvaW50ZXIgZW50cnkgKGUuZy4gZnJvbSBhXG4mIzQzO1x0XHQgKiByZWRpcnRpZWQgZm9saW8pLiBJbmhlcml0IHRoZSBzYXZlZCBzd2FwIHRhYmxlIHZhbHVlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRvbGQgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuJiM0MztcdFx0ZW50cnktXHUwMDNlc3dwX3RiX3ZhbCA9IG9sZC1cdTAwM2Vzd3BfdGJfdmFsO1xuIFx0fVxuLVxuJiM0MztcdF9fc3dhcF90YWJsZV9zZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIsXG4mIzQzO1x0XHRcdCBwb2ludGVyX3RvX3N3cF90YihlbnRyeSkpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuIFx0Lypcbi1cdCAqIFdlIG1heSBoYXZlIGhhZCBhbiBleGlzdGluZyBlbnRyeSB0aGF0IGJlY2FtZSBzdGFsZSB3aGVuXG4tXHQgKiB0aGUgZm9saW8gd2FzIHJlZGlydGllZCBhbmQgbm93IHRoZSBuZXcgdmVyc2lvbiBpcyBiZWluZ1xuLVx0ICogc3dhcHBlZCBvdXQuIEdldCByaWQgb2YgdGhlIG9sZC5cbiYjNDM7XHQgKiBJZiB3ZSBoYWQgYW4gZXhpc3RpbmcgenN3YXAgZW50cnkgZnJvbSB0aGUgc3dhcCB0YWJsZVxuJiM0MztcdCAqIChlLmcuIGZyb20gYSBwcmV2aW91cyByZWRpcnRpZWQgZm9saW8pLCBnZXQgcmlkIG9mIGl0XG4mIzQzO1x0ICogb3V0c2lkZSB0aGUgbG9jay5cbiBcdCAqL1xuIFx0aWYgKG9sZClcbiBcdFx0enN3YXBfZW50cnlfZnJlZShvbGQpO1xuIFxuIFx0Lypcbi1cdCAqIFRoZSBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIHRoZSB0cmVlLCB0aGVyZSBpc1xuLVx0ICogbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2wgYW5kIG9iamNnLFxuLVx0ICogY2hhcmdlIHpzd2FwIG1lbW9yeSwgYW5kIGluY3JlbWVudCB6c3dhcF9zdG9yZWRfcGFnZXMuXG4mIzQzO1x0ICogVGhlIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4gdGhlIHN3YXAgdGFibGUsXG4mIzQzO1x0ICogdGhlcmUgaXMgbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2xcbiYjNDM7XHQgKiBhbmQgb2JqY2csIGNoYXJnZSB6c3dhcCBtZW1vcnksIGFuZCBpbmNyZW1lbnQgenN3YXBfc3RvcmVkX3BhZ2VzLlxuIFx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXG4tXHQgKiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUuXG4mIzQzO1x0ICogd2hlbiB0aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzd2FwIHRhYmxlLlxuIFx0ICovXG4gXHR6c3dhcF9wb29sX2dldChwb29sKTtcbiBcdGlmIChvYmpjZykge1xuQEAgLTE0NDYsOCAmIzQzOzE0NTMsOCBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0XHRhdG9taWNfbG9uZ19pbmMoXHUwMDI2enN3YXBfc3RvcmVkX2luY29tcHJlc3NpYmxlX3BhZ2VzKTtcbiBcbiBcdC8qXG4tXHQgKiBXZSBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBlbnRyeSB3aGlsZSBpdCYjMzk7cyBhbHJlYWR5IGluIHhhcnJheS5cbi1cdCAqIFRoaXMgaXMgc2FmZSBiZWNhdXNlOlxuJiM0MztcdCAqIFdlIGZpbmlzaCBpbml0aWFsaXppbmcgdGhlIGVudHJ5IHdoaWxlIGl0JiMzOTtzIGFscmVhZHkgaW4gdGhlXG4mIzQzO1x0ICogc3dhcCB0YWJsZS4gVGhpcyBpcyBzYWZlIGJlY2F1c2U6XG4gXHQgKlxuIFx0ICogMS4gQ29uY3VycmVudCBzdG9yZXMgYW5kIGludmFsaWRhdGlvbnMgYXJlIGV4Y2x1ZGVkIGJ5IGZvbGlvIGxvY2suXG4gXHQgKlxuQEAgLTE0NjYsOCAmIzQzOzE0NzMsNiBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLFxuIFxuIFx0cmV0dXJuIHRydWU7XG4gXG4tc3RvcmVfZmFpbGVkOlxuLVx0enNfZnJlZShwb29sLVx1MDAzZXpzX3Bvb2wsIGVudHJ5LVx1MDAzZWhhbmRsZSk7XG4gY29tcHJlc3NfZmFpbGVkOlxuIFx0enN3YXBfZW50cnlfY2FjaGVfZnJlZShlbnRyeSk7XG4gXHRyZXR1cm4gZmFsc2U7XG5AQCAtMTU0NiwxMSAmIzQzOzE1NTEsMzEgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0XHR1bnNpZ25lZCB0eXBlID0gc3dwX3R5cGUoc3dwKTtcbiBcdFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4gXHRcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4tXHRcdHN0cnVjdCB4YXJyYXkgKnRyZWU7XG4mIzQzO1x0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuJiM0MztcdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcztcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgc3dwX3RiO1xuIFxuJiM0MztcdFx0c2lzID0gX19zd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcbiBcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG4tXHRcdFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7XG4tXHRcdFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgJiM0MzsgaW5kZXgpO1xuJiM0MztcdFx0XHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaXMsIG9mZnNldCAmIzQzOyBpbmRleCk7XG4mIzQzO1x0XHRcdHNwaW5fbG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRcdFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgKG9mZnNldCAmIzQzOyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSKTtcbiYjNDM7XHRcdFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcbiYjNDM7XHRcdFx0XHRlbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XG4mIzQzO1x0XHRcdFx0LypcbiYjNDM7XHRcdFx0XHQgKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzd2FwIHRhYmxlIGVudHJ5XG4mIzQzO1x0XHRcdFx0ICogKFNoYWRvdyBvciBQRk4pIHRoYXQgd2FzIHNhdmVkIHdoZW4gdGhlXG4mIzQzO1x0XHRcdFx0ICogUG9pbnRlciBlbnRyeSB3YXMgY3JlYXRlZCwgcmF0aGVyIHRoYW5cbiYjNDM7XHRcdFx0XHQgKiB6ZXJvaW5nIHRoZSBzbG90LiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHN3YXBcbiYjNDM7XHRcdFx0XHQgKiBjb3VudCBhbmQgZmxhZ3Mgc28gdGhlIHN3YXAgY2FjaGUgZm9saW9cbiYjNDM7XHRcdFx0XHQgKiBjYW4gYmUgY29ycmVjdGx5IGNsZWFuZWQgdXAgbGF0ZXIuXG4mIzQzO1x0XHRcdFx0ICovXG4mIzQzO1x0XHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgKG9mZnNldCAmIzQzOyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSLFxuJiM0MztcdFx0XHRcdFx0XHQgZW50cnktXHUwMDNlc3dwX3RiX3ZhbCk7XG4mIzQzO1x0XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdFx0ZW50cnkgPSBOVUxMO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuIFx0XHRcdGlmIChlbnRyeSlcbiBcdFx0XHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuIFx0XHR9XG5AQCAtMTU2Miw2ICYjNDM7MTU4NywxMSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gLyoqXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbiYjNDM7ICogQHplbnRyeTogenN3YXBfZW50cnkgcG9pbnRlciBleHRyYWN0ZWQgZnJvbSBzd2FwIHRhYmxlLCBvciBOVUxMXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSB6c3dhcF9lbnRyeSB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIHN3YXAgdGFibGUgUG9pbnRlciBlbnRyeSBieVxuJiM0MzsgKiBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvIGJlZm9yZSBpdCBvdmVyd3JvdGUgdGhlIGVudHJ5IHdpdGggYSBQRk4uXG4mIzQzOyAqIElmIEB6ZW50cnkgaXMgTlVMTCwgdGhlIHNsb3Qgd2FzIG5vdCBiYWNrZWQgYnkgenN3YXAuXG4gICpcbiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmVcbiAgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxuQEAgLTE1NzksMTIgJiM0MzsxNjA5LDkgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xuICAqICBsb2NrZWQgb24gcmV0dXJuLlxuICAqL1xuLWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4mIzQzO2ludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHZvaWQgKnplbnRyeSlcbiB7XG4tXHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cdTAwM2Vzd2FwO1xuLVx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4tXHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cCk7XG4tXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuJiM0MztcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSB6ZW50cnk7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XG5AQCAtMTYwMiw3ICYjNDM7MTYyOSw2IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuIFxuLVx0ZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7XG4gXHRpZiAoIWVudHJ5KVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbkBAIC0xNjI1LDcgJiM0MzsxNjUxLDYgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdCAqIGNvbXByZXNzaW9uIHdvcmsuXG4gXHQgKi9cbiBcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0eGFfZXJhc2UodHJlZSwgb2Zmc2V0KTtcbiBcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuIFxuIFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbkBAIC0xNjM1LDUyICYjNDM7MTY2MCwxNTkgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiB2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKVxuIHtcbiBcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xuLVx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xuJiM0MztcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3dwX3RiO1xuIFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTtcbiBcbi1cdGlmICh4YV9lbXB0eSh0cmVlKSlcbiYjNDM7XHRzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoc3dwKSk7XG4mIzQzO1x0Y2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2ksIG9mZnNldCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEbyBhIGxvY2tsZXNzIHBlZWsgZmlyc3QuICBJZiBjaS1cdTAwM2Vsb2NrIGlzIGFscmVhZHkgaGVsZCBieVxuJiM0MztcdCAqIHRoZSBjYWxsZXIgKGUuZy4gX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKSwgYW5kIHRoZVxuJiM0MztcdCAqIFBvaW50ZXIgaGFzIGFscmVhZHkgYmVlbiBjbGVhcmVkLCB3ZSBjYW4gYmFpbCBvdXQgd2l0aG91dFxuJiM0MztcdCAqIHNlbGYtZGVhZGxvY2tpbmcuXG4mIzQzO1x0ICovXG4mIzQzO1x0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XG4mIzQzO1x0aWYgKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuJiM0MztcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuJiM0MztcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4mIzQzO1x0XHRlbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSAoU2hhZG93IG9yIFBGTilcbiYjNDM7XHRcdCAqIHRoYXQgd2FzIHNhdmVkIGluIHN3cF90Yl92YWwgd2hlbiB0aGUgUG9pbnRlciBlbnRyeVxuJiM0MztcdFx0ICogd2FzIGNyZWF0ZWQuICBUaGlzIHByZXNlcnZlcyBzd2FwIGNvdW50IGFuZCBmbGFnc1xuJiM0MztcdFx0ICogZm9yIHRoZSBzdWJzZXF1ZW50IHNsb3QtZnJlZSBwYXRoLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSLFxuJiM0MztcdFx0XHRcdCBlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0ZW50cnkgPSBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiYjNDM7XG4gXHRpZiAoZW50cnkpXG4gXHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuIH1cbiBcbi1pbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuJiM0MzsvKlxuJiM0MzsgKiBFeHRyYWN0IHRoZSB3b3JraW5nIHNldCBzaGFkb3cgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxuJiM0MzsgKiBUaGUgc2hhZG93IGlzIHJlY292ZXJlZCBmcm9tIHpzd2FwX2VudHJ5LVx1MDAzZXN3cF90Yl92YWwgd2hpY2ggcHJlc2VydmVzXG4mIzQzOyAqIHRoZSBvcmlnaW5hbCBTaGFkb3cgZW50cnkgdmFsdWUuIFRoZSBzaGFkb3cgY2FuIHRoZW4gYmUgdXNlZCBieVxuJiM0MzsgKiB3b3JraW5nc2V0X3JlZmF1bHQoKSBmb3IgcmVmYXVsdCBkaXN0YW5jZSBjYWxjdWxhdGlvbi5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuIHtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWVzLCAqdHJlZTtcbi1cdHVuc2lnbmVkIGludCBuciwgaTtcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNhdmVkID0gZW50cnktXHUwMDNlc3dwX3RiX3ZhbDtcbiBcbi1cdG5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcbi1cdHRyZWVzID0ga3Z6YWxsb2Nfb2JqcygqdHJlZSwgbnIpO1xuLVx0aWYgKCF0cmVlcykge1xuLVx0XHRwcl9lcnIoXCYjMzQ7YWxsb2MgZmFpbGVkLCB6c3dhcCBkaXNhYmxlZCBmb3Igc3dhcCB0eXBlICVkXFxuXCYjMzQ7LCB0eXBlKTtcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXHR9XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBzd3BfdGJfdmFsIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeS4gIE9ubHlcbiYjNDM7XHQgKiBTaGFkb3cgZW50cmllcyBjYXJyeSB3b3JraW5nc2V0IGluZm9ybWF0aW9uOyBQRk4gYW5kIE5VTExcbiYjNDM7XHQgKiBlbnRyaWVzIGhhdmUgbm8gc2hhZG93IHRvIGV4dHJhY3QuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFzd3BfdGJfaXNfc2hhZG93KHNhdmVkKSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKHZvaWQgKikoc2F2ZWQgXHUwMDI2IH5TV1BfVEJfRkxBR1NfTUFTSyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlYWQgdGhlIHN3YXAgY291bnQgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LiBUaGUgY291bnRcbiYjNDM7ICogYW5kIGZsYWdzIGFyZSBzdG9yZWQgaW4genN3YXBfZW50cnktXHUwMDNlc3dwX3RiX3ZhbCB3aGljaCBwcmVzZXJ2ZXMgdGhlXG4mIzQzOyAqIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgKFNoYWRvdyBvciBQRk4gZm9ybWF0KS5cbiYjNDM7ICovXG4mIzQzO3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZWFkIHRoZSBmbGFncyBmcm9tIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXG4mIzQzOyAqL1xuJiM0Mzt1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIF9fc3dwX3RiX2dldF9mbGFncyhlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbiYjNDM7fVxuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuLVx0XHR4YV9pbml0KHRyZWVzICYjNDM7IGkpO1xuJiM0MzsvKlxuJiM0MzsgKiBJbmNyZW1lbnQgdGhlIHN3YXAgY291bnQgb2YgYSBQb2ludGVyLXR5cGUgc3dhcCB0YWJsZSBlbnRyeS5cbiYjNDM7ICogVGhlIGNvdW50IGlzIHN0b3JlZCBpbiB6c3dhcF9lbnRyeS1cdTAwM2Vzd3BfdGJfdmFsIGZvciBjb3VudHMgYmVsb3dcbiYjNDM7ICogU1dQX1RCX0NPVU5UX01BWCwgYW5kIG92ZXJmbG93cyBpbnRvIHRoZSBjbHVzdGVyJiMzOTtzIGV4dGVuZF90YWJsZVxuJiM0MzsgKiBqdXN0IGxpa2Ugbm9ybWFsIFNoYWRvdy9QRk4gZW50cmllcyBkby4gIFJldHVybnMgMCBvbiBzdWNjZXNzLFxuJiM0MzsgKiAtRU5PTUVNIGlmIGNvdW50IHdvdWxkIG92ZXJmbG93IGFuZCBubyBleHRlbmRfdGFibGUgaXMgYXZhaWxhYmxlLlxuJiM0MzsgKi9cbiYjNDM7aW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHVuc2lnbmVkIGludCBjaV9vZmYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwpO1xuIFxuLVx0bnJfenN3YXBfdHJlZXNbdHlwZV0gPSBucjtcbi1cdHpzd2FwX3RyZWVzW3R5cGVdID0gdHJlZXM7XG4mIzQzO1x0aWYgKGNvdW50IFx1MDAzYyBTV1BfVEJfQ09VTlRfTUFYKSB7XG4mIzQzO1x0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgY291bnQgJiM0MzsgMSk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1x0LyogY291bnQgPT0gTUFYLCBvdmVyZmxvdyBpbnRvIGV4dGVuZF90YWJsZSAqL1xuJiM0MztcdGlmICghY2ktXHUwMDNlZXh0ZW5kX3RhYmxlKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0Y291bnQgPSBjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcbiYjNDM7XHRpZiAoY291bnQgPT0gMClcbiYjNDM7XHRcdGNvdW50ID0gU1dQX1RCX0NPVU5UX01BWDtcbiYjNDM7XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcbiBcdHJldHVybiAwO1xuIH1cbiBcbi12b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpXG4mIzQzOy8qXG4mIzQzOyAqIERlY3JlbWVudCB0aGUgc3dhcCBjb3VudCBvZiBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxuJiM0MzsgKiBIYW5kbGVzIGJvdGggaW5saW5lIGNvdW50IChpbiBzd3BfdGJfdmFsKSBhbmQgb3ZlcmZsb3dlZCBjb3VudFxuJiM0MzsgKiAoaW4gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlKSwgbWF0Y2hpbmcgdGhlIGxvZ2ljIHVzZWQgYnkgbm9ybWFsIGVudHJpZXMuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIHpzd2FwX3N3cF90Yl9wdXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4mIzQzO1x0XHRcdCAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKVxuIHtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWVzID0genN3YXBfdHJlZXNbdHlwZV07XG4tXHR1bnNpZ25lZCBpbnQgaTtcbiYjNDM7XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyIGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwpO1xuJiM0MztcbiYjNDM7XHRWTV9XQVJOX09OX09OQ0UoY291bnQgPT0gMCk7XG4gXG4tXHRpZiAoIXRyZWVzKVxuJiM0MztcdGlmIChjb3VudCA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XG4mIzQzO1x0XHRpZiAoIWNpLVx1MDAzZWV4dGVuZF90YWJsZSkge1xuJiM0MztcdFx0XHRjb3VudC0tO1xuJiM0MztcdFx0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCwgY291bnQpO1xuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjb3VudCA9IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xuJiM0MztcdFx0LyogT3ZlcmZsb3cgc3RhcnRzIHdpdGggU1dQX1RCX0NPVU5UX01BWCAqL1xuJiM0MztcdFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFx1MDAzYyBTV1BfVEJfQ09VTlRfTUFYKTtcbiYjNDM7XHRcdGNvdW50LS07XG4mIzQzO1x0XHRpZiAoY291bnQgPT0gKFNXUF9UQl9DT1VOVF9NQVggLSAxKSkge1xuJiM0MztcdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IDA7XG4mIzQzO1x0XHRcdGVudHJ5LVx1MDAzZXN3cF90Yl92YWwgPSBfX3N3cF90Yl9ta19jb3VudChlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgIGNvdW50KTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7XG4mIzQzO1x0XHR9XG4gXHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0ZW50cnktXHUwMDNlc3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwsIGNvdW50IC0gMSk7XG4mIzQzO31cbiBcbi1cdC8qIHRyeV90b191bnVzZSgpIGludmFsaWRhdGVkIGFsbCB0aGUgZW50cmllcyBhbHJlYWR5ICovXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl96c3dhcF90cmVlc1t0eXBlXTsgaSYjNDM7JiM0MzspXG4tXHRcdFdBUk5fT05fT05DRSgheGFfZW1wdHkodHJlZXMgJiM0MzsgaSkpO1xuJiM0MztpbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiBcbi1cdGt2ZnJlZSh0cmVlcyk7XG4tXHRucl96c3dhcF90cmVlc1t0eXBlXSA9IDA7XG4tXHR6c3dhcF90cmVlc1t0eXBlXSA9IE5VTEw7XG4mIzQzO3ZvaWQgenN3YXBfc3dhcG9mZihpbnQgdHlwZSlcbiYjNDM7e1xuIH1cbiBcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMTU6MTE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7WlNXQVAmIzM0OywKICAgICYjMzQ7WlNXQVBfREVGQVVMVF9PTiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX3N0b3JlJiMzNDssCiAgICAmIzM0O3pzd2FwX2xvYWQmIzM0OywKICAgICYjMzQ7enN3YXBfaW52YWxpZGF0ZSYjMzQ7LAogICAgJiMzNDt6c3dhcF93cml0ZWJhY2tfZW50cnkmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvJiMzNDssCiAgICAmIzM0O19fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeSYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMmIzM0OywKICAgICYjMzQ7X19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5JiMzNDssCiAgICAmIzM0O3pzd2FwX3N3cF90Yl9kdXBfY291bnQmIzM0OywKICAgICYjMzQ7enN3YXBfc3dwX3RiX3B1dF9jb3VudCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGYyMDExOTg1ODc2MzEyMTVmNzA4ZjU4ODZhOTgxMDMyM2ZiYzIzOTkKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEp1bCA3IDE1OjExOjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC96c3dhcC5oIGIvaW5jbHVkZS9saW51eC96c3dhcC5oCmluZGV4IDMwYzE5M2ExMjA3ZTE2Li40ZjU1YzhkMGM0YzU0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC96c3dhcC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvenN3YXAuaApAQCAtMjYsNyAmIzQzOzI2LDcgQEAgc3RydWN0IHpzd2FwX2xydXZlY19zdGF0ZSB7CiAKIHVuc2lnbmVkIGxvbmcgenN3YXBfdG90YWxfcGFnZXModm9pZCk7CiBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pOwotaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbyk7CiYjNDM7aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KTsKIHZvaWQgenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnlfdCBzd3ApOwogaW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiB2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpOwpAQCAtNDQsNyAmIzQzOzQ0LDcgQEAgc3RhdGljIGlubGluZSBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7c3RhdGljIGlubGluZSBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB2b2lkICp6ZW50cnkpCiB7CiAJcmV0dXJuIC1FTk9FTlQ7CiB9CmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmMKaW5kZXggYjIzZjQ5NGZjYzgzZGEuLjFjZTgyMDFlZDg2ZTI0IDEwMDY0NAotLS0gYS9tbS9wYWdlX2lvLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9pby5jCkBAIC02NTgsNyAmIzQzOzY1OCw3IEBAIHN0YXRpYyB2b2lkIHN3YXBfcmVhZF9mb2xpb19iZGV2X2FzeW5jKHN0cnVjdCBmb2xpbyAqZm9saW8sCiAJc3VibWl0X2JpbyhiaW8pOwogfQogCi12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZykKJiM0Mzt2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KQogewogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBfX3N3YXBfZW50cnlfdG9faW5mbyhmb2xpby0mZ3Q7c3dhcCk7CiAJYm9vbCBzeW5jaHJvbm91cyA9IHNpcy0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NZTkNIUk9OT1VTX0lPOwpAQCAtNjg2LDcgJiM0Mzs2ODYsNyBAQCB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZykKIAkJZ290byBmaW5pc2g7CiAJfQogCi0JaWYgKHpzd2FwX2xvYWQoZm9saW8pICE9IC1FTk9FTlQpCiYjNDM7CWlmICh6c3dhcF9sb2FkKGZvbGlvLCB6ZW50cnkpICE9IC1FTk9FTlQpCiAJCWdvdG8gZmluaXNoOwogCiAJLyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovCmRpZmYgLS1naXQgYS9tbS9zd2FwLmggYi9tbS9zd2FwLmgKaW5kZXggNDRhYjhlMWU1OTViMDguLjg0ZTEzYmE2ZTYwNWMzIDEwMDY0NAotLS0gYS9tbS9zd2FwLmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcC5oCkBAIC0yMTAsNiAmIzQzOzIxMCw0MSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jbHVzdGVyX3VubG9ja19pcnEoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSkKIAogZXh0ZXJuIGludCBzd2FwX3JldHJ5X3RhYmxlX2FsbG9jKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnApOwogCiYjNDM7c3RydWN0IHpzd2FwX2VudHJ5OwomIzQzOyNpZmRlZiBDT05GSUdfWlNXQVAKJiM0Mzt2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90Yik7CiYjNDM7dW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiKTsKJiM0Mzt1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpOwomIzQzO2ludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLAomIzQzOwkJCSAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHVuc2lnbmVkIGludCBjaV9vZmYpOwomIzQzO3ZvaWQgenN3YXBfc3dwX3RiX3B1dF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YiwKJiM0MzsJCQkgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZik7CiYjNDM7dm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpOwomIzQzOyNlbHNlCiYjNDM7c3RhdGljIGlubGluZSB2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YikKJiM0Mzt7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YikKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90YikKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztzdGF0aWMgaW5saW5lIGludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLAomIzQzOwkJCQkJIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiYjNDM7CQkJCQkgdW5zaWduZWQgaW50IGNpX29mZikKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgenN3YXBfc3dwX3RiX3B1dF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YiwKJiM0MzsJCQkJCSAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKJiM0MzsJCQkJCSAgdW5zaWduZWQgaW50IGNpX29mZikge30KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KSB7fQomIzQzOyNlbmRpZgomIzQzOwogLyoKICAqIEJlbG93IGFyZSB0aGUgY29yZSByb3V0aW5lcyBmb3IgZG9pbmcgc3dhcCBmb3IgYSBmb2xpby4KICAqIEFsbCBoZWxwZXJzIHJlcXVpcmVzIHRoZSBmb2xpbyB0byBiZSBsb2NrZWQsIGFuZCBhIGxvY2tlZCBmb2xpbwpAQCAtMjQxLDcgJiM0MzsyNzYsNyBAQCBleHRlcm4gdm9pZCBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogLyogbGludXgvbW0vcGFnZV9pby5jICovCiBpbnQgc2lvX3Bvb2xfaW5pdCh2b2lkKTsKIHN0cnVjdCBzd2FwX2lvY2I7Ci12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zyk7CiYjNDM7dm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsIHZvaWQgKnplbnRyeSk7CiB2b2lkIF9fc3dhcF9yZWFkX3VucGx1ZyhzdHJ1Y3Qgc3dhcF9pb2NiICpwbHVnKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX3JlYWRfdW5wbHVnKHN0cnVjdCBzd2FwX2lvY2IgKnBsdWcpCiB7CkBAIC0zMDMsMTMgJiM0MzszMzgsMTYgQEAgc3RhdGljIGlubGluZSBib29sIGZvbGlvX21hdGNoZXNfc3dhcF9lbnRyeShjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvLAogYm9vbCBzd2FwX2NhY2hlX2hhc19mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSk7CiBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfZ2V0X2ZvbGlvKHN3cF9lbnRyeV90IGVudHJ5KTsKIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSk7CiYjNDM7Ym9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pOwogdm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTsKIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BfZW50cnlfdCB0YXJnZXRfZW50cnksIGdmcF90IGdmcF9tYXNrLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvcmRlcnMsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLAotCQkJCSAgICAgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpOwomIzQzOwkJCQkgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LAomIzQzOwkJCQkgICAgIHZvaWQgKip6ZW50cnkpOwogLyogQmVsb3cgaGVscGVycyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gbG9jayBhbmQgcGFzcyBpbiB0aGUgc3dhcCBjbHVzdGVyLiAqLwogdm9pZCBfX3N3YXBfY2FjaGVfYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCi0JCQkgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpOwomIzQzOwkJCSAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwKJiM0MzsJCQkgICAgdm9pZCAqKnplbnRyeSk7CiB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkJCSAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTsKIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKQEAgLTM4MSw3ICYjNDM7NDE5LDggQEAgc3RhdGljIGlubGluZSB2b2lkIGZvbGlvX3B1dF9zd2FwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpwYWdlKQogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsCiYjNDM7CQkJCSAgIHZvaWQgKnplbnRyeSkKIHsKIH0KIApAQCAtNDUzLDYgJiM0Mzs0OTIsMTEgQEAgc3RhdGljIGlubGluZSB2b2lkICpzd2FwX2NhY2hlX2dldF9zaGFkb3coc3dwX2VudHJ5X3QgZW50cnkpCiAJcmV0dXJuIE5VTEw7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewogfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDZmZDZlMzQxNWI3MThiLi42MGQ5MzdjNmIzOTIyNCAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtMTc1LDE2ICYjNDM7MTc1LDI5IEBAIHN0YXRpYyBpbnQgX19zd2FwX2NhY2hlX2FkZF9jaGVjayhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogCW9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7CiAJaWYgKHN3cF90Yl9pc19mb2xpbyhvbGRfdGIpKQogCQlyZXR1cm4gLUVFWElTVDsKLQlpZiAoIV9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKQomIzQzOwlpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkgewomIzQzOwkJaWYgKCF6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpCiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CX0gZWxzZSBpZiAoIV9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKSB7CiAJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiAJaWYgKHNoYWRvd3AgJmFtcDsmYW1wOyBzd3BfdGJfaXNfc2hhZG93KG9sZF90YikpCiAJCSpzaGFkb3dwID0gc3dwX3RiX3RvX3NoYWRvdyhvbGRfdGIpOwomIzQzOwllbHNlIGlmIChzaGFkb3dwICZhbXA7JmFtcDsgc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkKJiM0MzsJCSpzaGFkb3dwID0genN3YXBfc3dwX3RiX2dldF9zaGFkb3cob2xkX3RiKTsKIAlpZiAobWVtY2dfaWQpCiAJCSptZW1jZ19pZCA9IF9fc3dhcF9jZ3JvdXBfZ2V0KGNpLCBjaV9vZmYpOwogCiAJaWYgKG5yID09IDEpCiAJCXJldHVybiAwOwogCiYjNDM7CS8qCiYjNDM7CSAqIEZvciBtdWx0aS1zbG90IHJhbmdlcywgUG9pbnRlciBlbnRyaWVzIGFyZSBub3QgZXhwZWN0ZWQgc2luY2UKJiM0MzsJICogenN3YXAgZG9lcyBub3Qgc3VwcG9ydCBsYXJnZSBmb2xpb3MuIFJldHVybiAtRUJVU1kgZm9yIHNhZmV0eS4KJiM0MzsJICovCiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKQomIzQzOwkJcmV0dXJuIC1FQlVTWTsKJiM0MzsKIAlpc196ZXJvID0gX19zd2FwX3RhYmxlX3Rlc3RfemVybyhjaSwgY2lfb2ZmKTsKIAljaV9vZmYgPSByb3VuZF9kb3duKGNpX29mZiwgbnIpOwogCWNpX2VuZCA9IGNpX29mZiAmIzQzOyBucjsKQEAgLTIwMSw3ICYjNDM7MjE0LDggQEAgc3RhdGljIGludCBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiB9CiAKIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKLQkJCQkgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSkKJiM0MzsJCQkJICAgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksCiYjNDM7CQkJCSAgICAgIHZvaWQgKip6ZW50cnkpCiB7CiAJdW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSksIGNpX2VuZDsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwpAQCAtMjE2LDcgJiM0MzsyMzAsMzQgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogCWRvIHsKIAkJb2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTsKIAkJVk1fV0FSTl9PTl9PTkNFKHN3cF90Yl9pc19mb2xpbyhvbGRfdGIpKTsKLQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBwZm5fdG9fc3dwX3RiKHBmbiwgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiBJZiB0aGUgb2xkIGVudHJ5IGlzIGEgUG9pbnRlciAoenN3YXAgY29tcHJlc3NlZCBkYXRhKSwKJiM0MzsJCSAqIGV4dHJhY3QgdGhlIHpzd2FwX2VudHJ5IGZvciB0aGUgY2FsbGVyIGFuZCBwcmVzZXJ2ZQomIzQzOwkJICogaXRzIGZsYWdzLiBUaGUgUG9pbnRlciBlbnRyeSBoYXMgbm8gaW5saW5lIGZsYWdzLgomIzQzOwkJICovCiYjNDM7CQlpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkgewomIzQzOwkJCXVuc2lnbmVkIGNoYXIgcGZsYWdzID0genN3YXBfc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpOwomIzQzOwkJCS8qCiYjNDM7CQkJICogSWYgc3dwX3RiX3ZhbCBjYXJyaWVzIFNXUF9UQl9DT1VOVF9NQVgsIHRoZQomIzQzOwkJCSAqIHJlYWwgb3ZlcmZsb3cgY291bnQgbGl2ZXMgaW4gY2ktJmd0O2V4dGVuZF90YWJsZS4KJiM0MzsJCQkgKiBQdWxsIGl0IHNvIHRoZSBuZXcgUEZOIGNhcnJpZXMgdGhlIGNvcnJlY3QgY291bnQKJiM0MzsJCQkgKiBhbmQgd29uJiMzOTt0IGxhdGVyIGNyYXNoIG9uIGEgbWlzc2luZyBleHRlbmRfdGFibGUuCiYjNDM7CQkJICovCiYjNDM7CQkJaWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7CiYjNDM7CQkJCXVuc2lnbmVkIGNoYXIgcmVhbCA9IFNXUF9UQl9DT1VOVF9NQVggLSAxOwomIzQzOwkJCQlpZiAoY2ktJmd0O2V4dGVuZF90YWJsZSAmYW1wOyZhbXA7IGNpLSZndDtleHRlbmRfdGFibGVbY2lfb2ZmXSkKJiM0MzsJCQkJCXJlYWwgPSBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl07CiYjNDM7CQkJCXBmbGFncyA9IChyZWFsICZsdDsmbHQ7IChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgfAomIzQzOwkJCQkJIChwZmxhZ3MgJmFtcDsgKCgxICZsdDsmbHQ7IChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgLSAxKSk7CiYjNDM7CQkJfQomIzQzOwkJCWlmICh6ZW50cnkgJmFtcDsmYW1wOyAhKnplbnRyeSkKJiM0MzsJCQkJKnplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKG9sZF90Yik7CiYjNDM7CQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLAomIzQzOwkJCQlwZm5fdG9fc3dwX3RiKHBmbiwgcGZsYWdzKSk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCV9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwKJiM0MzsJCQkJcGZuX3RvX3N3cF90YihwZm4sIF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7CiYjNDM7CQl9CiAJfSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiAmbHQ7IGNpX2VuZCk7CiAKIAlmb2xpb19yZWZfYWRkKGZvbGlvLCBucl9wYWdlcyk7CkBAIC0yMzksMTEgJiM0MzsyODAsMTIgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogICogdGhhdCBob2xkcyB0aGUgZW50cmllcy4KICAqLwogdm9pZCBfX3N3YXBfY2FjaGVfYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCi0JCQkgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpCiYjNDM7CQkJICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LAomIzQzOwkJCSAgICB2b2lkICoqemVudHJ5KQogewogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiAKLQlfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnkpOwomIzQzOwlfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnksIHplbnRyeSk7CiAJbm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9QQUdFUywgbnJfcGFnZXMpOwogCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU1dBUENBQ0hFLCBucl9wYWdlcyk7CiB9CkBAIC0yNjksMTUgJiM0MzszMTEsMjggQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogCWNpX29mZiA9IGNpX3N0YXJ0OwogCWRvIHsKIAkJb2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTsKLQkJV0FSTl9PTl9PTkNFKCFzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSB8fAotCQkJICAgICBzd3BfdGJfdG9fZm9saW8ob2xkX3RiKSAhPSBmb2xpbyk7Ci0JCWlmIChfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSkKLQkJCWZvbGlvX3N3YXBwZWQgPSB0cnVlOwotCQllbHNlCi0JCQluZWVkX2ZyZWUgPSB0cnVlOwotCQkvKiBJZiBzaGFkb3cgaXMgTlVMTCwgd2Ugc2V0IGFuIGVtcHR5IHNoYWRvdy4gKi8KLQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdywKLQkJCQkgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiBJZiB6c3dhcCBhbHJlYWR5IHN0b3JlZCBkYXRhIGZvciB0aGlzIHNsb3QKJiM0MzsJCSAqICh6c3dhcF9zdG9yZSB3cm90ZSBhIFBvaW50ZXIgZW50cnkpLCBsZWF2ZSBpdAomIzQzOwkJICogaW4gcGxhY2UuIFRoZSBjb3VudCBhbmQgZmxhZ3MgYXJlIHN0b3JlZCBpbiB0aGUKJiM0MzsJCSAqIHpzd2FwX2VudHJ5IHN0cnVjdC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpIHsKJiM0MzsJCQlpZiAoenN3YXBfc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKQomIzQzOwkJCQlmb2xpb19zd2FwcGVkID0gdHJ1ZTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCW5lZWRfZnJlZSA9IHRydWU7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCVdBUk5fT05fT05DRSghc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikgfHwKJiM0MzsJCQkJICAgICBzd3BfdGJfdG9fZm9saW8ob2xkX3RiKSAhPSBmb2xpbyk7CiYjNDM7CQkJaWYgKF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKQomIzQzOwkJCQlmb2xpb19zd2FwcGVkID0gdHJ1ZTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCW5lZWRfZnJlZSA9IHRydWU7CiYjNDM7CQkJLyogSWYgc2hhZG93IGlzIE5VTEwsIHdlIHNldCBhbiBlbXB0eSBzaGFkb3cuICovCiYjNDM7CQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdywKJiM0MzsJCQkJCSBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpOwomIzQzOwkJfQogCX0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgJmx0OyBjaV9lbmQpOwogCiAJZm9saW8tJmd0O3N3YXAudmFsID0gMDsKQEAgLTI4OCw3ICYjNDM7MzQzLDE0IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAl9IGVsc2UgaWYgKG5lZWRfZnJlZSkgewogCQljaV9vZmYgPSBjaV9zdGFydDsKIAkJZG8gewotCQkJaWYgKCFfX3N3cF90Yl9nZXRfY291bnQoX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkpCiYjNDM7CQkJdW5zaWduZWQgbG9uZyB0YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7CiYjNDM7CQkJdW5zaWduZWQgY2hhciBjbnQ7CiYjNDM7CiYjNDM7CQkJaWYgKHN3cF90Yl9pc19wb2ludGVyKHRiKSkKJiM0MzsJCQkJY250ID0genN3YXBfc3dwX3RiX2dldF9jb3VudCh0Yik7CiYjNDM7CQkJZWxzZQomIzQzOwkJCQljbnQgPSBfX3N3cF90Yl9nZXRfY291bnQodGIpOwomIzQzOwkJCWlmICghY250KQogCQkJCV9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzaSwgY2ksIGNpX29mZiwgMSk7CiAJCX0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgJmx0OyBjaV9lbmQpOwogCX0KQEAgLTQwMyw3ICYjNDM7NDY1LDggQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLAogc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAJCQkJCXN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCwKIAkJCQkJdW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwKLQkJCQkJc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpCiYjNDM7CQkJCQlzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCwKJiM0MzsJCQkJCXZvaWQgKip6ZW50cnkpCiB7CiAJaW50IGVycjsKIAlzd3BfZW50cnlfdCBlbnRyeTsKQEAgLTQ1MCw3ICYjNDM7NTEzLDcgQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAKIAlfX2ZvbGlvX3NldF9sb2NrZWQoZm9saW8pOwogCV9fZm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pOwotCV9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSk7CiYjNDM7CV9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSwgemVudHJ5KTsKIAlzcGluX3VubG9jaygmYW1wO2NpLSZndDtsb2NrKTsKIAogCWlmIChtZW1fY2dyb3VwX3N3YXBpbl9jaGFyZ2VfZm9saW8oZm9saW8sIG1lbWNnX2lkLApAQCAtNTA3LDcgJiM0Mzs1NzAsOCBAQCBzdGF0aWMgc3RydWN0IGZvbGlvICpfX3N3YXBfY2FjaGVfYWxsb2Moc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKICAqLwogc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb3JkZXJzLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwKLQkJCQkgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KQomIzQzOwkJCQkgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LAomIzQzOwkJCQkgICAgIHZvaWQgKip6ZW50cnkpCiB7CiAJaW50IG9yZGVyLCBlcnI7CiAJc3RydWN0IGZvbGlvICpyZXQ7CkBAIC01MjAsOSAmIzQzOzU4NCwxMiBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfYWxsb2NfZm9saW8oc3dwX2VudHJ5X3QgdGFyZ19lbnRyeSwgZ2ZwX3QgZ2ZwLAogCWlmIChXQVJOX09OX09OQ0UoIW9yZGVycyB8fCAoMVVMICZsdDsmbHQ7IG9yZGVyKSAmZ3Q7IFNXQVBGSUxFX0NMVVNURVIpKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAomIzQzOwlpZiAoemVudHJ5KQomIzQzOwkJKnplbnRyeSA9IE5VTEw7CiYjNDM7CiAJZG8gewogCQlyZXQgPSBfX3N3YXBfY2FjaGVfYWxsb2MoY2ksIHRhcmdfZW50cnksIGdmcCwgb3JkZXIsCi0JCQkJCSB2bWYsIG1wb2wsIGlseCk7CiYjNDM7CQkJCQkgdm1mLCBtcG9sLCBpbHgsIHplbnRyeSk7CiAJCWlmICghSVNfRVJSKHJldCkpCiAJCQlicmVhazsKIAkJZXJyID0gUFRSX0VSUihyZXQpOwpAQCAtNjM4LDE4ICYjNDM7NzA1LDIwIEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfcmVhZF9mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLAogCQkJCQkgICBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZywgYm9vbCByZWFkYWhlYWQpCiB7CiAJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJdm9pZCAqemVudHJ5OwogCiAJZG8gewogCQlmb2xpbyA9IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKGVudHJ5KTsKIAkJaWYgKGZvbGlvKQogCQkJcmV0dXJuIGZvbGlvOwotCQlmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgQklUKDApLCBOVUxMLCBtcG9sLCBpbHgpOwomIzQzOwkJZm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKGVudHJ5LCBnZnAsIEJJVCgwKSwgTlVMTCwgbXBvbCwgaWx4LAomIzQzOwkJCQkJICAgICAgICZhbXA7emVudHJ5KTsKIAl9IHdoaWxlIChQVFJfRVJSKGZvbGlvKSA9PSAtRUVYSVNUKTsKIAogCWlmIChJU19FUlJfT1JfTlVMTChmb2xpbykpCiAJCXJldHVybiBOVUxMOwogCi0Jc3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnKTsKJiM0MzsJc3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnLCB6ZW50cnkpOwogCWlmIChyZWFkYWhlYWQpIHsKIAkJZm9saW9fc2V0X3JlYWRhaGVhZChmb2xpbyk7CiAJCWNvdW50X3ZtX2V2ZW50KFNXQVBfUkEpOwpAQCAtNjc4LDE4ICYjNDM7NzQ3LDIwIEBAIHN0cnVjdCBmb2xpbyAqc3dhcGluX3N5bmMoc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCwgdW5zaWduZWQgbG9uZyBvcmRlcnMsCiAJCQkgICBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpCiB7CiAJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJdm9pZCAqemVudHJ5OwogCiAJZG8gewogCQlmb2xpbyA9IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKGVudHJ5KTsKIAkJaWYgKGZvbGlvKQogCQkJcmV0dXJuIGZvbGlvOwotCQlmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCk7CiYjNDM7CQlmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCwKJiM0MzsJCQkJCSAgICAgICAmYW1wO3plbnRyeSk7CiAJfSB3aGlsZSAoUFRSX0VSUihmb2xpbykgPT0gLUVFWElTVCk7CiAKIAlpZiAoSVNfRVJSKGZvbGlvKSkKIAkJcmV0dXJuIGZvbGlvOwogCi0Jc3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBOVUxMKTsKJiM0MzsJc3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBOVUxMLCB6ZW50cnkpOwogCXJldHVybiBmb2xpbzsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vc3dhcF90YWJsZS5oIGIvbW0vc3dhcF90YWJsZS5oCmluZGV4IGU2NjEzZTYyZjhkMGY2Li42MzE4YmY4YWE3NmIwYyAxMDA2NDQKLS0tIGEvbW0vc3dhcF90YWJsZS5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfdGFibGUuaApAQCAtMjgsNyAmIzQzOzI4LDcgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUgewogICogTlVMTDogICAgIHwtLS0tLS0tLS0tLS0tLS0tIDAgLS0tLS0tLS0tLS0tLS0tfCAtIEZyZWUgc2xvdAogICogU2hhZG93OiAgIHxTV0FQX0NPVU5UfFp8LS0tLSBTSEFET1dfVkFMIC0tLXwxfCAtIFN3YXBwZWQgb3V0IHNsb3QKICAqIFBGTjogICAgICB8U1dBUF9DT1VOVHxafC0tLS0tLSBQRk4gLS0tLS0tLXwxMHwgLSBDYWNoZWQgc2xvdAotICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIChVbnVzZWQpCiYjNDM7ICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIFpzd2FwIGNvbXByZXNzZWQgZW50cnkKICAqIEJhZDogICAgICB8LS0tLS0tLS0tLS0tLSAxIC0tLS0tLS0tLS0tLS18MTAwMHwgLSBCYWQgc2xvdAogICoKICAqIENPVU5UIGlzIGBTV1BfVEJfQ09VTlRfQklUU2AgbG9uZywgWiBpcyB0aGUgYFNXUF9UQl9aRVJPX0ZMQUdgIGJpdCwKQEAgLTQ5LDkgJiM0Mzs0OSwxMSBAQCBzdHJ1Y3Qgc3dhcF9tZW1jZ190YWJsZSB7CiAgKiAtIFBGTjogU3dhcCBzbG90IGlzIGluIHVzZSwgYW5kIGNhY2hlZC4gTWVtY2cgaW5mbyBpcyByZWNvcmRlZCBvbiB0aGUgcGFnZQogICogICBzdHJ1Y3QuCiAgKgotICogLSBQb2ludGVyOiBVbnVzZWQgeWV0LiBgMGIxMDBgIGlzIHJlc2VydmVkIGZvciBwb3RlbnRpYWwgcG9pbnRlciB1c2FnZQotICogICBiZWNhdXNlIG9ubHkgdGhlIGxvd2VyIHRocmVlIGJpdHMgY2FuIGJlIHVzZWQgYXMgYSBtYXJrZXIgZm9yIDggYnl0ZXMKLSAqICAgYWxpZ25lZCBwb2ludGVycy4KJiM0MzsgKiAtIFBvaW50ZXI6IFN0b3JlcyBhIGRpcmVjdCBwb2ludGVyIHRvIGEgenN3YXBfZW50cnkgd2hlbiB0aGUgc3dhcCBzbG90JiMzOTtzCiYjNDM7ICogICBjb21wcmVzc2VkIGRhdGEgcmVzaWRlcyBpbiB6c3dhcC4gVGhlIHN3YXAgY291bnQgKGlmIGFueSkgaXMgc3RvcmVkIGluCiYjNDM7ICogICB0aGUgenN3YXBfZW50cnkgc3RydWN0IHJhdGhlciB0aGFuIGlubGluZSwgc2luY2UgdGhlIHBvaW50ZXIgb2NjdXBpZXMKJiM0MzsgKiAgIGFsbCB1cHBlciBiaXRzLiBgMGIxMDBgIGlzIHVzZWQgYXMgdGhlIG1hcmtlciBiZWNhdXNlIHpzd2FwX2VudHJ5CiYjNDM7ICogICBwb2ludGVycyBhcmUgYXQgbGVhc3QgOC1ieXRlIGFsaWduZWQsIGxlYXZpbmcgdGhlIGxvd2VyIHRocmVlIGJpdHMgZnJlZS4KICAqCiAgKiAtIEJhZDogU3dhcCBzbG90IGlzIHJlc2VydmVkLCBwcm90ZWN0cyBzd2FwIGhlYWRlciBvciBob2xlcyBvbiBzd2FwIGRldmljZXMuCiAgKi8KQEAgLTc4LDYgJiM0Mzs4MCw5IEBAIHN0cnVjdCBzd2FwX21lbWNnX3RhYmxlIHsKIC8qIFRoZSBmaXJzdCBmbGFnIGlzIHplcm8gYml0IChTV0FQX1RBQkxFX0hBU19aRVJPRkxBRykgKi8KICNkZWZpbmUgU1dQX1RCX1pFUk9fRkxBRwlCSVQoQklUU19QRVJfTE9ORyAtIFNXUF9UQl9GTEFHU19CSVRTKQogCiYjNDM7LyogUG9pbnRlcjogenN3YXBfZW50cnkgcG9pbnRlciBzdG9yZWQgZGlyZWN0bHksIGVuZHMgd2l0aCAwYjEwMCAqLwomIzQzOyNkZWZpbmUgU1dQX1RCX1BPSU5URVJfTUFSSwkwYjEwMFVMCiYjNDM7CiAvKiBCYWQgc2xvdDogZW5kcyB3aXRoIDBiMTAwMCBhbmQgcmVzdHMgb2YgYml0cyBhcmUgYWxsIDEgKi8KICNkZWZpbmUgU1dQX1RCX0JBRAkJKCh+MFVMKSAmbHQ7Jmx0OyAzKQogCkBAIC0xNjYsNiAmIzQzOzE3MSwxMSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX2JhZCh1bnNpZ25lZCBsb25nIHN3cF90YikKIAlyZXR1cm4gc3dwX3RiID09IFNXUF9UQl9CQUQ7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX3BvaW50ZXIodW5zaWduZWQgbG9uZyBzd3BfdGIpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHN3cF90YiAmYW1wOyAoQklUKDMpIC0gMSkpID09IFNXUF9UQl9QT0lOVEVSX01BUks7CiYjNDM7fQomIzQzOwogc3RhdGljIGlubGluZSBib29sIHN3cF90Yl9pc19jb3VudGFibGUodW5zaWduZWQgbG9uZyBzd3BfdGIpCiB7CiAJcmV0dXJuIChzd3BfdGJfaXNfc2hhZG93KHN3cF90YikgfHwgc3dwX3RiX2lzX2ZvbGlvKHN3cF90YikgfHwKQEAgLTE4OCw2ICYjNDM7MTk4LDIzIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3dwX3RiX3RvX3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YikKIAlyZXR1cm4gKHZvaWQgKikoc3dwX3RiICZhbXA7IH5TV1BfVEJfRkxBR1NfTUFTSyk7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9pbnRlcl90b19zd3BfdGIodm9pZCAqcHRyKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZylwdHI7CiYjNDM7CiYjNDM7CUJVSUxEX0JVR19PTihzaXplb2YodW5zaWduZWQgbG9uZykgIT0gc2l6ZW9mKHZvaWQgKikpOwomIzQzOwkvKiBQb2ludGVycyBhcmUgOC1ieXRlIGFsaWduZWQsIGxvdyAzIGJpdHMgbXVzdCBiZSBjbGVhciAqLwomIzQzOwlWTV9XQVJOX09OX09OQ0UodmFsICZhbXA7IChCSVQoMykgLSAxKSk7CiYjNDM7CXJldHVybiB2YWwgfCBTV1BfVEJfUE9JTlRFUl9NQVJLOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgKnN3cF90Yl90b19wb2ludGVyKHVuc2lnbmVkIGxvbmcgc3dwX3RiKQomIzQzO3sKJiM0MzsJVk1fV0FSTl9PTighc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSk7CiYjNDM7CS8qIENsZWFyIHRoZSBsb3cgMy1iaXQgbWFya2VyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KJiM0MzsJcmV0dXJuICh2b2lkICopKHN3cF90YiAmYW1wOyB+KCh1bnNpZ25lZCBsb25nKShCSVQoMykgLSAxKSkpOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpCiB7CiAJVk1fV0FSTl9PTighc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKTsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IGE2MDJlNTgyMDUxM2E4Li4xODkyNWU0NjI1NzFiMSAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwZmlsZS5jCkBAIC05MzUsNyAmIzQzOzkzNSw4IEBAIHN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlucl9wYWdlcyA9IDEgJmx0OyZsdDsgb3JkZXI7CiAJCXN3YXBfY2x1c3Rlcl9hc3NlcnRfZW1wdHkoY2ksIGNpX29mZiwgbnJfcGFnZXMsIGZhbHNlKTsKIAkJX19zd2FwX2NhY2hlX2FkZF9mb2xpbyhjaSwgZm9saW8sIHN3cF9lbnRyeShzaS0mZ3Q7dHlwZSwKLQkJCQkJCQkgICAgY2lfb2ZmICYjNDM7IGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSkpKTsKJiM0MzsJCQkJCQkJICAgIGNpX29mZiAmIzQzOyBjbHVzdGVyX29mZnNldChzaSwgY2kpKSwKJiM0MzsJCQkJICAgICAgIE5VTEwpOwogCX0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfSElCRVJOQVRJT04pKSB7CiAJCW9yZGVyID0gMDsKIAkJbnJfcGFnZXMgPSAxOwpAQCAtMTUzNiwyNSAmIzQzOzE1MzcsNTEgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5KHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7Y2ktJmd0O2xvY2spOwogCXN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7CiYjNDM7CiYjNDM7CS8qIFBvaW50ZXIgZW50cmllcyBzdG9yZSBjb3VudCBpbiB0aGUgenN3YXBfZW50cnkgc3RydWN0ICovCiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7CiYjNDM7CQl6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHN3cF90YiwgY2ksIGNpX29mZik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAljb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChzd3BfdGIpOwogCiAJVk1fV0FSTl9PTl9PTkNFKGNvdW50ICZsdDs9IDApOwogCVZNX1dBUk5fT05fT05DRShjb3VudCAmZ3Q7IFNXUF9UQl9DT1VOVF9NQVgpOwotCi0JaWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHsKLQkJY291bnQgPSBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl07Ci0JCS8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi8KLQkJVk1fV0FSTl9PTl9PTkNFKGNvdW50ICZsdDsgU1dQX1RCX0NPVU5UX01BWCk7Ci0JCWNvdW50LS07Ci0JCWlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7Ci0JCQljaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwOwotCQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7CiYjNDM7CQlpZiAoY291bnQgPT0gU1dQX1RCX0NPVU5UX01BWCkgewomIzQzOwkJCWlmICghY2ktJmd0O2V4dGVuZF90YWJsZSkgewomIzQzOwkJCQkvKgomIzQzOwkJCQkgKiBNQVggd2l0aG91dCBleHRlbmRfdGFibGU6IE1BWCBpcyB0aGUgcmVhbAomIzQzOwkJCQkgKiBjb3VudC4gIERlY3JlbWVudCBhbmQgd3JpdGUgYmFjayBpbmxpbmUuCiYjNDM7CQkJCSAqLwomIzQzOwkJCQljb3VudC0tOwomIzQzOwkJCQlfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsCiYjNDM7CQkJCQlfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7CiYjNDM7CQkJfSBlbHNlIHsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogTUFYIHdpdGggZXh0ZW5kX3RhYmxlOiByZWFsIGNvdW50IGxpdmVzIGluCiYjNDM7CQkJCSAqIGNpLSZndDtleHRlbmRfdGFibGVbY2lfb2ZmXS4gIFB1bGwsIGRlY3JlbWVudAomIzQzOwkJCQkgKiBpdCwgYW5kIGVpdGhlciBtb3ZlIGl0IGJhY2sgaW5saW5lIChpZiBub3cKJiM0MzsJCQkJICogZml0cykgb3Igd3JpdGUgaXQgYmFjayB0byB0aGUgZXh0ZW5kIHRhYmxlLgomIzQzOwkJCQkgKi8KJiM0MzsJCQkJY291bnQgPSBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl07CiYjNDM7CQkJCS8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi8KJiM0MzsJCQkJVk1fV0FSTl9PTl9PTkNFKGNvdW50ICZsdDsgU1dQX1RCX0NPVU5UX01BWCk7CiYjNDM7CQkJCWNvdW50LS07CiYjNDM7CQkJCWlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7CiYjNDM7CQkJCQljaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwOwomIzQzOwkJCQkJX19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLAomIzQzOwkJCQkJCV9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgY291bnQpKTsKJiM0MzsJCQkJfSBlbHNlIHsKJiM0MzsJCQkJCWNpLSZndDtleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50OwomIzQzOwkJCQl9CiYjNDM7CQkJfQogCQl9IGVsc2UgewotCQkJY2ktJmd0O2V4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7CiYjNDM7CQkJLyogY291bnQgJmx0OyBNQVg6IHNpbXBsZSBpbmxpbmUgZGVjcmVtZW50ICovCiYjNDM7CQkJY291bnQtLTsKJiM0MzsJCQlfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsCiYjNDM7CQkJCV9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgY291bnQpKTsKIAkJfQotCX0gZWxzZSB7Ci0JCV9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgX19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCAtLWNvdW50KSk7Ci0JfQogCiAJLyoKIAkgKiBgU1dQX1RCX0NPVU5UX01BWCAtIDFgIHRyaWdnZXJzIGV4dGVuZCB0YWJsZSBhbGxvY2F0aW9uLiBJZiB0aGUKQEAgLTE1OTYsNyAmIzQzOzE2MjMsMTggQEAgc3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAljaV9lbmQgPSBjaV9vZmYgJiM0MzsgbnI7CiAJZG8gewogCQlzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpOwotCQlpZiAoc3dwX3RiX2dldF9jb3VudChzd3BfdGIpID09IDEpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5OwomIzQzOwkJICogaGFuZGxlIHRoZW0gYmVmb3JlIHN3cF90Yl9nZXRfY291bnQgKHdoaWNoIHJldHVybnMKJiM0MzsJCSAqIC1FSU5WQUwgZm9yIG5vbi1jb3VudGFibGUgdHlwZXMpLgomIzQzOwkJICovCiYjNDM7CQlpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkgewomIzQzOwkJCWlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgPT0gMSkgewomIzQzOwkJCQlpZiAoY2lfYmF0Y2ggPT0gLTEpCiYjNDM7CQkJCQljaV9iYXRjaCA9IGNpX29mZjsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJfSBlbHNlIGlmIChzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgPT0gMSkgewogCQkJLyogY291bnQgPT0gMSBhbmQgbm9uLWNhY2hlZCBzbG90cyB3aWxsIGJlIGJhdGNoIGZyZWVkLiAqLwogCQkJaWYgKCFzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSkgewogCQkJCWlmIChjaV9iYXRjaCA9PSAtMSkKQEAgLTE2NDcsNiAmIzQzOzE2ODUsMTEgQEAgc3RhdGljIGludCBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkvKiBCYWQgb3Igc3BlY2lhbCBzbG90cyBjYW4mIzM5O3QgYmUgaGFuZGxlZCAqLwogCWlmIChXQVJOX09OX09OQ0Uoc3dwX3RiX2lzX2JhZChzd3BfdGIpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CS8qIFBvaW50ZXIgZW50cmllcyBzdG9yZSBjb3VudCBpbiB0aGUgenN3YXBfZW50cnkgc3RydWN0ICovCiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKQomIzQzOwkJcmV0dXJuIHpzd2FwX3N3cF90Yl9kdXBfY291bnQoc3dwX3RiLCBjaSwgY2lfb2ZmKTsKJiM0MzsKIAljb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChzd3BfdGIpOwogCS8qIE11c3QgYmUgZWl0aGVyIGNhY2hlZCBvciBoYXZlIGEgY291bnQgYWxyZWFkeSAqLwogCWlmIChXQVJOX09OX09OQ0UoIWNvdW50ICZhbXA7JmFtcDsgIXN3cF90Yl9pc19mb2xpbyhzd3BfdGIpKSkKQEAgLTE5MjMsMTMgJiM0MzsxOTY2LDI2IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkJb2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTsKIAkJLyoKIAkJICogRnJlZWluZyBpcyBkb25lIGFmdGVyIHJlbGVhc2Ugb2YgdGhlIGxhc3Qgc3dhcCBjb3VudAotCQkgKiByZWYsIG9yIGFmdGVyIHN3YXAgY2FjaGUgaXMgZHJvcHBlZAomIzQzOwkJICogcmVmLCBvciBhZnRlciBzd2FwIGNhY2hlIGlzIGRyb3BwZWQuIEEgUG9pbnRlciBlbnRyeQomIzQzOwkJICogbWVhbnMgenN3YXAgaGFzIGEgY29tcHJlc3NlZCBjb3B5OyB0aGUgeGFycmF5IHN0aWxsCiYjNDM7CQkgKiBob2xkcyB0aGUgZW50cnkgYW5kIHpzd2FwX2ludmFsaWRhdGUgd2lsbCBmcmVlIGl0LgogCQkgKi8KLQkJVk1fV0FSTl9PTighc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpIHx8IF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpICZndDsgMSk7CiYjNDM7CQlpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkgewomIzQzOwkJCVZNX1dBUk5fT04oenN3YXBfc3dwX3RiX2dldF9jb3VudChvbGRfdGIpICZndDsgMSk7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBGcmVlIHRoZSB6c3dhcCBlbnRyeSBub3cgdW5kZXIgY2ktJmd0O2xvY2sgd2hpbGUKJiM0MzsJCQkgKiB0aGUgUG9pbnRlciBpcyBzdGlsbCBpbiB0aGUgc3dhcCB0YWJsZS4gIE9uY2UKJiM0MzsJCQkgKiB3ZSBudWxsIHRoZSBzbG90LCB0aGUgZW50cnkgd291bGQgYmUgbGVha2VkLgomIzQzOwkJCSAqLwomIzQzOwkJCXpzd2FwX2VudHJ5X2ZyZWUoc3dwX3RiX3RvX3BvaW50ZXIob2xkX3RiKSk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCVZNX1dBUk5fT04oIXN3cF90Yl9pc19zaGFkb3cob2xkX3RiKSB8fAomIzQzOwkJCQkgICBfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSAmZ3Q7IDEpOwomIzQzOwkJfQogCiAJCS8qIFJlc2V0dGluZyB0aGUgc2xvdCB0byBOVUxMIGFsc28gY2xlYXJzIHRoZSBpbmxpbmUgZmxhZ3MuICovCiAJCV9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgbnVsbF90b19zd3BfdGIoKSk7Ci0JCWlmICghU1dBUF9UQUJMRV9IQVNfWkVST0ZMQUcpCiYjNDM7CQlpZiAoIVNXQVBfVEFCTEVfSEFTX1pFUk9GTEFHICZhbXA7JmFtcDsgIXN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpCiAJCQlfX3N3YXBfdGFibGVfY2xlYXJfemVybyhjaSwgY2lfb2ZmKTsKIAogCQkvKgpAQCAtMTk2MSw4ICYjNDM7MjAxNywxMSBAQCBpbnQgX19zd2FwX2NvdW50KHN3cF9lbnRyeV90IGVudHJ5KQogewogCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBfX3N3YXBfZW50cnlfdG9fY2x1c3RlcihlbnRyeSk7CiAJdW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTsKIAotCXJldHVybiBzd3BfdGJfZ2V0X2NvdW50KF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpOwomIzQzOwlpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkKJiM0MzsJCXJldHVybiB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7CiYjNDM7CXJldHVybiBzd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7CiB9CiAKIC8qKgpAQCAtMTk4MCw2ICYjNDM7MjAzOSw4IEBAIGJvb2wgc3dhcF9lbnRyeV9zd2FwcGVkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3dwX2VudHJ5X3QgZW50cnkpCiAJc3dwX3RiID0gc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpOwogCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwogCiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKQomIzQzOwkJcmV0dXJuIHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSAmZ3Q7IDA7CiAJcmV0dXJuIHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSAmZ3Q7IDA7CiB9CiAKQEAgLTIwMjAsNyAmIzQzOzIwODEsNyBAQCBpbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSkKICAqCiAgKiBDb250ZXh0OiBDYWxsZXIgbXVzdCBlbnN1cmUgdGhlIGZvbGlvIGlzIGxvY2tlZCBhbmQgaW4gdGhlIHN3YXAgY2FjaGUuCiAgKi8KLXN0YXRpYyBib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbykKJiM0Mztib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbykKIHsKIAlzd3BfZW50cnlfdCBlbnRyeSA9IGZvbGlvLSZndDtzd2FwOwogCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7CkBAIC0yNTU2LDggJiM0MzsyNjE3LDEyIEBAIHN0YXRpYyBpbnQgdW51c2VfcHRlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQlpZiAoIWZvbGlvKSB7CiAJCQlzd3BfdGIgPSBzd2FwX3RhYmxlX2dldChfX3N3YXBfZW50cnlfdG9fY2x1c3RlcihlbnRyeSksCiAJCQkJCQlzd3BfY2x1c3Rlcl9vZmZzZXQoZW50cnkpKTsKLQkJCWlmIChzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgJmx0Oz0gMCkKJiM0MzsJCQlpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkgewomIzQzOwkJCQlpZiAoenN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpICZsdDs9IDApCiYjNDM7CQkJCQljb250aW51ZTsKJiM0MzsJCQl9IGVsc2UgaWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSAmbHQ7PSAwKSB7CiAJCQkJY29udGludWU7CiYjNDM7CQkJfQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApkaWZmIC0tZ2l0IGEvbW0venN3YXAuYyBiL21tL3pzd2FwLmMKaW5kZXggNzYxY2Q2OTllMGEzZTYuLmY5NzYyZDBhNTk2YWI0IDEwMDY0NAotLS0gYS9tbS96c3dhcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3pzd2FwLmMKQEAgLTM4LDYgJiM0MzszOCw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvenNtYWxsb2MuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtzd2FwLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7c3dhcF90YWJsZS5oJiMzNDsKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4Miw2ICYjNDM7MTgzLDEwIEBAIHN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKnpzd2FwX3Nocmlua2VyOwogICogICAgICAgICAgICAgIHdyaXRlYmFjayBsb2dpYy4gVGhlIGVudHJ5IGlzIG9ubHkgcmVjbGFpbWVkIGJ5IHRoZSB3cml0ZWJhY2sKICAqICAgICAgICAgICAgICBsb2dpYyBpZiByZWZlcmVuY2VkIGlzIHVuc2V0LiBTZWUgY29tbWVudHMgaW4gdGhlIHNocmlua2VyCiAgKiAgICAgICAgICAgICAgc2VjdGlvbiBmb3IgY29udGV4dC4KJiM0MzsgKiBzd3BfdGJfdmFsIC0gdGhlIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgc2F2ZWQgd2hlbiB0aGlzIHpzd2FwX2VudHJ5CiYjNDM7ICogICAgICAgICAgICAgIHJlcGxhY2VkIGEgU2hhZG93IG9yIFBGTiBlbnRyeS4gSXQgcHJlc2VydmVzIHRoZSBzd2FwIGNvdW50LAomIzQzOyAqICAgICAgICAgICAgICB6ZXJvIGZsYWcsIGFuZCB3b3JraW5nIHNldCBzaGFkb3cgaW5mb3JtYXRpb24gKFNIQURPV19WQUwpCiYjNDM7ICogICAgICAgICAgICAgIHRoYXQgdGhlIFNoYWRvdyBlbnRyeSBjYXJyaWVkLgogICogcG9vbCAtIHRoZSB6c3dhcF9wb29sIHRoZSBlbnRyeSYjMzk7cyBkYXRhIGlzIGluCiAgKiBoYW5kbGUgLSB6c21hbGxvYyBhbGxvY2F0aW9uIGhhbmRsZSB0aGF0IHN0b3JlcyB0aGUgY29tcHJlc3NlZCBwYWdlIGRhdGEKICAqIG9iamNnIC0gdGhlIG9ial9jZ3JvdXAgdGhhdCB0aGUgY29tcHJlc3NlZCBtZW1vcnkgaXMgY2hhcmdlZCB0bwpAQCAtMTkxLDE1ICYjNDM7MTk2LDEzIEBAIHN0cnVjdCB6c3dhcF9lbnRyeSB7CiAJc3dwX2VudHJ5X3Qgc3dwZW50cnk7CiAJdW5zaWduZWQgaW50IGxlbmd0aDsKIAlib29sIHJlZmVyZW5jZWQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3dwX3RiX3ZhbDsKIAlzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbDsKIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsKIAlzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2c7CiAJc3RydWN0IGxpc3RfaGVhZCBscnU7CiB9OwogCi1zdGF0aWMgc3RydWN0IHhhcnJheSAqenN3YXBfdHJlZXNbTUFYX1NXQVBGSUxFU107Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5yX3pzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdOwotCiAvKiBSQ1UtcHJvdGVjdGVkIGl0ZXJhdGlvbiAqLwogc3RhdGljIExJU1RfSEVBRCh6c3dhcF9wb29scyk7CiAvKiBwcm90ZWN0cyB6c3dhcF9wb29scyBsaXN0IG1vZGlmaWNhdGlvbiAqLwpAQCAtMjI1LDE1ICYjNDM7MjI4LDYgQEAgc3RhdGljIGJvb2wgenN3YXBfaGFzX3Bvb2w7CiAqIGhlbHBlcnMgYW5kIGZ3ZCBkZWNsYXJhdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE9uZSBzd2FwIGFkZHJlc3Mgc3BhY2UgZm9yIGVhY2ggNjRNIHN3YXAgc3BhY2UgKi8KLSNkZWZpbmUgWlNXQVBfQUREUkVTU19TUEFDRV9TSElGVCAxNAotI2RlZmluZSBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTICgxICZsdDsmbHQ7IFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQpCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB4YXJyYXkgKnN3YXBfenN3YXBfdHJlZShzd3BfZW50cnlfdCBzd3ApCi17Ci0JcmV0dXJuICZhbXA7enN3YXBfdHJlZXNbc3dwX3R5cGUoc3dwKV1bc3dwX29mZnNldChzd3ApCi0JCSZndDsmZ3Q7IFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlRdOwotfQotCiAjZGVmaW5lIHpzd2FwX3Bvb2xfZGVidWcobXNnLCBwKQkJCVwKIAlwcl9kZWJ1ZygmIzM0OyVzIHBvb2wgJXNcbiYjMzQ7LCBtc2csIChwKS0mZ3Q7dGZtX25hbWUpCiAKQEAgLTc2Miw3ICYjNDM7NzU2LDcgQEAgc3RhdGljIHZvaWQgenN3YXBfZW50cnlfY2FjaGVfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KQogICogQ2FycmllcyBvdXQgdGhlIGNvbW1vbiBwYXR0ZXJuIG9mIGZyZWVpbmcgYW4gZW50cnkmIzM5O3MgenNtYWxsb2MgYWxsb2NhdGlvbiwKICAqIGZyZWVpbmcgdGhlIGVudHJ5IGl0c2VsZiwgYW5kIGRlY3JlbWVudGluZyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBwYWdlcy4KICAqLwotc3RhdGljIHZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KQomIzQzO3ZvaWQgenN3YXBfZW50cnlfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KQogewogCXpzd2FwX2xydV9kZWwoJmFtcDt6c3dhcF9saXN0X2xydSwgZW50cnkpOwogCXpzX2ZyZWUoZW50cnktJmd0O3Bvb2wtJmd0O3pzX3Bvb2wsIGVudHJ5LSZndDtoYW5kbGUpOwpAQCAtOTg3LDExICYjNDM7OTgxLDEyIEBAIHN0YXRpYyBib29sIHpzd2FwX2RlY29tcHJlc3Moc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbykKIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksCiAJCQkJIHN3cF9lbnRyeV90IHN3cGVudHJ5KQogewotCXN0cnVjdCB4YXJyYXkgKnRyZWU7CiAJcGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cGVudHJ5KTsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvOwogCXN0cnVjdCBtZW1wb2xpY3kgKm1wb2w7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwomIzQzOwl1bnNpZ25lZCBsb25nIHN3cF90YjsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIHRyeSB0byBhbGxvY2F0ZSBzd2FwIGNhY2hlIGZvbGlvICovCkBAIC05OTksOSAmIzQzOzk5NCwyNSBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LAogCWlmICghc2kpCiAJCXJldHVybiAtRUVYSVNUOwogCiYjNDM7CS8qCiYjNDM7CSAqIFZlcmlmeSB0aGUgc3dhcCB0YWJsZSBQb2ludGVyIGVudHJ5IHN0aWxsIHJlZmVyZW5jZXMgdGhpcwomIzQzOwkgKiB6c3dhcF9lbnRyeS4gSWYgdGhlIGVudHJ5IHdhcyBpbnZhbGlkYXRlZCBvciByZXBsYWNlZCBieSBhCiYjNDM7CSAqIGNvbmN1cnJlbnQgc3RvcmUsIHRoZSBQb2ludGVyIHdpbGwgYmUgZ29uZSBvciBwb2ludCBlbHNld2hlcmUuCiYjNDM7CSAqLwomIzQzOwljaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgb2Zmc2V0KTsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7Y2ktJmd0O2xvY2spOwomIzQzOwlzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTsKJiM0MzsJaWYgKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpIHx8CiYjNDM7CSAgICBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpICE9IGVudHJ5KSB7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsJCXB1dF9zd2FwX2RldmljZShzaSk7CiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJfQomIzQzOwlzcGluX3VubG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsKIAltcG9sID0gZ2V0X3Rhc2tfcG9saWN5KGN1cnJlbnQpOwogCWZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLAotCQkJCSAgICAgICBOT19JTlRFUkxFQVZFX0lOREVYKTsKJiM0MzsJCQkJICAgICAgIE5PX0lOVEVSTEVBVkVfSU5ERVgsIE5VTEwpOwogCXB1dF9zd2FwX2RldmljZShzaSk7CiAKIAkvKgpAQCAtMTAxNSwyNyAmIzQzOzEwMjYsMTUgQEAgc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwKIAkJcmV0dXJuIFBUUl9FUlIoZm9saW8pOwogCiAJLyoKLQkgKiBmb2xpbyBpcyBsb2NrZWQsIGFuZCB0aGUgc3dhcGNhY2hlIGlzIG5vdyBzZWN1cmVkIGFnYWluc3QKLQkgKiBjb25jdXJyZW50IHN3YXBwaW5nIHRvIGFuZCBmcm9tIHRoZSBzbG90LCBhbmQgY29uY3VycmVudAotCSAqIHN3YXBvZmYgc28gd2UgY2FuIHNhZmVseSBkZXJlZmVyZW5jZSB0aGUgenN3YXAgdHJlZSBoZXJlLgotCSAqIFZlcmlmeSB0aGF0IHRoZSBzd2FwIGVudHJ5IGhhc24mIzM5O3QgYmVlbiBpbnZhbGlkYXRlZCBhbmQgcmVjeWNsZWQKLQkgKiBiZWhpbmQgb3VyIGJhY2tzLCB0byBhdm9pZCBvdmVyd3JpdGluZyBhIG5ldyBzd2FwIGZvbGlvIHdpdGgKLQkgKiBvbGQgY29tcHJlc3NlZCBkYXRhLiBPbmx5IHdoZW4gdGhpcyBpcyBzdWNjZXNzZnVsIGNhbiB0aGUgZW50cnkKLQkgKiBiZSBkZXJlZmVyZW5jZWQuCiYjNDM7CSAqIFRoZSBmb2xpbyBpcyBub3cgbG9ja2VkIGFuZCBpbiBzd2FwIGNhY2hlLCBzbyBjb25jdXJyZW50CiYjNDM7CSAqIHN0b3JlcyBhcmUgYmxvY2tlZC4gX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyBhbHJlYWR5CiYjNDM7CSAqIG92ZXJ3cm90ZSB0aGUgUG9pbnRlciBlbnRyeSB3aXRoIGEgUEZOLgogCSAqLwotCXRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwZW50cnkpOwotCWlmIChlbnRyeSAhPSB4YV9sb2FkKHRyZWUsIG9mZnNldCkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJaWYgKCF6c3dhcF9kZWNvbXByZXNzKGVudHJ5LCBmb2xpbykpIHsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCi0JeGFfZXJhc2UodHJlZSwgb2Zmc2V0KTsKLQogCWNvdW50X3ZtX2V2ZW50KFpTV1BXQik7CiAJaWYgKGVudHJ5LSZndDtvYmpjZykKIAkJY291bnRfb2JqY2dfZXZlbnRzKGVudHJ5LSZndDtvYmpjZywgWlNXUFdCLCAxKTsKQEAgLTExMDUsMzYgJiM0MzsxMTA0LDIyIEBAIHN0YXRpYyBlbnVtIGxydV9zdGF0dXMgc2hyaW5rX21lbWNnX2NiKHN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sIHN0cnVjdCBsaXN0X2xydV9vCiAJfQogCiAJLyoKLQkgKiBBcyBzb29uIGFzIHdlIGRyb3AgdGhlIExSVSBsb2NrLCB0aGUgZW50cnkgY2FuIGJlIGZyZWVkIGJ5Ci0JICogYSBjb25jdXJyZW50IGludmFsaWRhdGlvbi4gVGhpcyBtZWFucyB0aGUgZm9sbG93aW5nOgotCSAqCi0JICogMS4gV2UgZXh0cmFjdCB0aGUgc3dwX2VudHJ5X3QgdG8gdGhlIHN0YWNrLCBhbGxvd2luZwotCSAqICAgIHpzd2FwX3dyaXRlYmFja19lbnRyeSgpIHRvIHBpbiB0aGUgc3dhcCBlbnRyeSBhbmQKLQkgKiAgICB0aGVuIHZhbGlkYXRlIHRoZSB6c3dhcCBlbnRyeSBhZ2FpbnN0IHRoYXQgc3dhcCBlbnRyeSYjMzk7cwotCSAqICAgIHRyZWUgdXNpbmcgcG9pbnRlciB2YWx1ZSBjb21wYXJpc29uLiBPbmx5IHdoZW4gdGhhdAotCSAqICAgIGlzIHN1Y2Nlc3NmdWwgY2FuIHRoZSBlbnRyeSBiZSBkZXJlZmVyZW5jZWQuCi0JICoKLQkgKiAyLiBVc3VhbGx5LCBvYmplY3RzIGFyZSB0YWtlbiBvZmYgdGhlIExSVSBmb3IgcmVjbGFpbS4gSW4KLQkgKiAgICB0aGlzIGNhc2UgdGhpcyBpc24mIzM5O3QgcG9zc2libGUsIGJlY2F1c2UgaWYgcmVjbGFpbSBmYWlscwotCSAqICAgIGZvciB3aGF0ZXZlciByZWFzb24sIHdlIGhhdmUgbm8gbWVhbnMgb2Yga25vd2luZyBpZiB0aGUKLQkgKiAgICBlbnRyeSBpcyBhbGl2ZSB0byBwdXQgaXQgYmFjayBvbiB0aGUgTFJVLgomIzQzOwkgKiBBZnRlciB3ZSBkcm9wIHRoZSBMUlUgbG9jaywgdGhlIGVudHJ5IG1heSBiZSBmcmVlZCBieSBhCiYjNDM7CSAqIGNvbmN1cnJlbnQgc3dhcCBzbG90IGZyZWUuICBUaGlzIGlzIHNhZmUgYmVjYXVzZQomIzQzOwkgKiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSByZWNoZWNrcyB0aGUgc3dhcCB0YWJsZSB1bmRlcgomIzQzOwkgKiBjaS0mZ3Q7bG9jayBiZWZvcmUgZGVyZWZlcmVuY2luZyBlbnRyeTsgaWYgdGhlIFBvaW50ZXIgaXMKJiM0MzsJICogZ29uZSBpdCBiYWlscyBvdXQuCiAJICoKLQkgKiAgICBTbyByb3RhdGUgaXQgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrLiBJZiB0aGUgZW50cnkgaXMKLQkgKiAgICB3cml0dGVuIGJhY2sgb3IgaW52YWxpZGF0ZWQsIHRoZSBmcmVlIHBhdGggd2lsbCB1bmxpbmsKLQkgKiAgICBpdC4gRm9yIGZhaWx1cmVzLCByb3RhdGlvbiBpcyB0aGUgcmlnaHQgdGhpbmcgYXMgd2VsbC4KLQkgKgotCSAqICAgIFRlbXBvcmFyeSBmYWlsdXJlcywgd2hlcmUgdGhlIHNhbWUgZW50cnkgc2hvdWxkIGJlIHRyaWVkCi0JICogICAgYWdhaW4gaW1tZWRpYXRlbHksIGFsbW9zdCBuZXZlciBoYXBwZW4gZm9yIHRoaXMgc2hyaW5rZXIuCi0JICogICAgV2UgZG9uJiMzOTt0IGRvIGFueSB0cnlsb2NraW5nOyAtRU5PTUVNIGNvbWVzIGNsb3Nlc3QsCi0JICogICAgYnV0IHRoYXQmIzM5O3MgZXh0cmVtZWx5IHJhcmUgYW5kIGRvZXNuJiMzOTt0IGhhcHBlbiBzcHVyaW91c2x5Ci0JICogICAgZWl0aGVyLiBEb24mIzM5O3QgYm90aGVyIGRpc3Rpbmd1aXNoaW5nIHRoaXMgY2FzZS4KJiM0MzsJICogUm90YXRlIHRoZSBlbnRyeSBiZWZvcmUgZHJvcHBpbmcgdGhlIGxvY2s6IGlmIGl0IGdldHMKJiM0MzsJICogd3JpdHRlbiBiYWNrIG9yIGludmFsaWRhdGVkIHRoZSBmcmVlIHBhdGggd2lsbCB1bmxpbmsKJiM0MzsJICogaXQgZnJvbSB0aGUgTFJVLiAgRm9yIGZhaWx1cmVzIHJvdGF0aW9uIGlzIGZpbmUuCiAJICovCiAJbGlzdF9tb3ZlX3RhaWwoaXRlbSwgJmFtcDtsLSZndDtsaXN0KTsKIAogCS8qCi0JICogT25jZSB0aGUgbHJ1IGxvY2sgaXMgZHJvcHBlZCwgdGhlIGVudHJ5IG1pZ2h0IGdldCBmcmVlZC4gVGhlCi0JICogc3dwZW50cnkgaXMgY29waWVkIHRvIHRoZSBzdGFjaywgYW5kIGVudHJ5IGlzbiYjMzk7dCBkZXJlZiYjMzk7ZCBhZ2FpbgotCSAqIHVudGlsIHRoZSBlbnRyeSBpcyB2ZXJpZmllZCB0byBzdGlsbCBiZSBhbGl2ZSBpbiB0aGUgdHJlZS4KJiM0MzsJICogVGhlIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2sgc28gd2UgY2FuIHBpbiB0aGUgc3dhcAomIzQzOwkgKiBkZXZpY2UgYW5kIHZhbGlkYXRlIHRoZSBlbnRyeSYjMzk7cyBzd2FwIHRhYmxlIFBvaW50ZXIgdW5kZXIKJiM0MzsJICogY2ktJmd0O2xvY2sgaW4genN3YXBfd3JpdGViYWNrX2VudHJ5KCkuCiAJICovCiAJc3dwZW50cnkgPSBlbnRyeS0mZ3Q7c3dwZW50cnk7CiAKQEAgLTEzOTgsNyAmIzQzOzEzODMsMTEgQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCSAgICAgc3RydWN0IHpzd2FwX3Bvb2wgKnBvb2wpCiB7CiAJc3dwX2VudHJ5X3QgcGFnZV9zd3BlbnRyeSA9IHBhZ2Vfc3dhcF9lbnRyeShwYWdlKTsKLQlzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCAqb2xkOwomIzQzOwlzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCAqb2xkID0gTlVMTDsKJiM0MzsJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwomIzQzOwlwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQocGFnZV9zd3BlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3dwX3RiOwogCiAJLyogYWxsb2NhdGUgZW50cnkgKi8KIAllbnRyeSA9IHpzd2FwX2VudHJ5X2NhY2hlX2FsbG9jKEdGUF9LRVJORUwsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKQEAgLTE0MTAsMzEgJiM0MzsxMzk5LDQ5IEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCiAJaWYgKCF6c3dhcF9jb21wcmVzcyhwYWdlLCBlbnRyeSwgcG9vbCkpCiAJCWdvdG8gY29tcHJlc3NfZmFpbGVkOwogCi0Jb2xkID0geGFfc3RvcmUoc3dhcF96c3dhcF90cmVlKHBhZ2Vfc3dwZW50cnkpLAotCQkgICAgICAgc3dwX29mZnNldChwYWdlX3N3cGVudHJ5KSwKLQkJICAgICAgIGVudHJ5LCBHRlBfS0VSTkVMKTsKLQlpZiAoeGFfaXNfZXJyKG9sZCkpIHsKLQkJaW50IGVyciA9IHhhX2VycihvbGQpOwotCi0JCVdBUk5fT05DRShlcnIgIT0gLUVOT01FTSwgJiMzNDt1bmV4cGVjdGVkIHhhcnJheSBlcnJvcjogJWRcbiYjMzQ7LCBlcnIpOwotCQl6c3dhcF9yZWplY3RfYWxsb2NfZmFpbCYjNDM7JiM0Mzs7Ci0JCWdvdG8gc3RvcmVfZmFpbGVkOwomIzQzOwkvKgomIzQzOwkgKiBTdG9yZSB0aGUgenN3YXBfZW50cnkgcG9pbnRlciBpbiB0aGUgc3dhcCB0YWJsZSBhcyBhCiYjNDM7CSAqIFBvaW50ZXItdHlwZSBlbnRyeSwgcmVwbGFjaW5nIHRoZSBQRk4gb3IgU2hhZG93IGVudHJ5LgomIzQzOwkgKiBUaGUgZnVsbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlIChpbmNsdWRpbmcgd29ya2luZyBzZXQKJiM0MzsJICogc2hhZG93KSBpcyBwcmVzZXJ2ZWQgaW4gZW50cnktJmd0O3N3cF90Yl92YWwuCiYjNDM7CSAqIEZvbGlvIGxvY2sgc2VyaWFsaXplcyBjb25jdXJyZW50IHN0b3Jlcy4KJiM0MzsJICovCiYjNDM7CXNpID0gX19zd2FwX2VudHJ5X3RvX2luZm8ocGFnZV9zd3BlbnRyeSk7CiYjNDM7CWNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpOwomIzQzOwlzcGluX2xvY2soJmFtcDtjaS0mZ3Q7bG9jayk7CiYjNDM7CXN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpOwomIzQzOwlpZiAoc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKSB7CiYjNDM7CQkvKgomIzQzOwkJICogU2F2ZSB0aGUgY29tcGxldGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZQomIzQzOwkJICogKFNoYWRvdyBvciBQRk4pLCBwcmVzZXJ2aW5nIHN3YXAgY291bnQsIHplcm8gZmxhZywKJiM0MzsJCSAqIGFuZCB3b3JraW5nIHNldCBzaGFkb3cgaW5mb3JtYXRpb24uCiYjNDM7CQkgKi8KJiM0MzsJCWVudHJ5LSZndDtzd3BfdGJfdmFsID0gc3dwX3RiOwomIzQzOwl9IGVsc2UgaWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBSZXBsYWNpbmcgYW4gZXhpc3RpbmcgUG9pbnRlciBlbnRyeSAoZS5nLiBmcm9tIGEKJiM0MzsJCSAqIHJlZGlydGllZCBmb2xpbykuIEluaGVyaXQgdGhlIHNhdmVkIHN3YXAgdGFibGUgdmFsdWUuCiYjNDM7CQkgKi8KJiM0MzsJCW9sZCA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7CiYjNDM7CQllbnRyeS0mZ3Q7c3dwX3RiX3ZhbCA9IG9sZC0mZ3Q7c3dwX3RiX3ZhbDsKIAl9Ci0KJiM0MzsJX19zd2FwX3RhYmxlX3NldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUiwKJiM0MzsJCQkgcG9pbnRlcl90b19zd3BfdGIoZW50cnkpKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtjaS0mZ3Q7bG9jayk7CiAJLyoKLQkgKiBXZSBtYXkgaGF2ZSBoYWQgYW4gZXhpc3RpbmcgZW50cnkgdGhhdCBiZWNhbWUgc3RhbGUgd2hlbgotCSAqIHRoZSBmb2xpbyB3YXMgcmVkaXJ0aWVkIGFuZCBub3cgdGhlIG5ldyB2ZXJzaW9uIGlzIGJlaW5nCi0JICogc3dhcHBlZCBvdXQuIEdldCByaWQgb2YgdGhlIG9sZC4KJiM0MzsJICogSWYgd2UgaGFkIGFuIGV4aXN0aW5nIHpzd2FwIGVudHJ5IGZyb20gdGhlIHN3YXAgdGFibGUKJiM0MzsJICogKGUuZy4gZnJvbSBhIHByZXZpb3VzIHJlZGlydGllZCBmb2xpbyksIGdldCByaWQgb2YgaXQKJiM0MzsJICogb3V0c2lkZSB0aGUgbG9jay4KIAkgKi8KIAlpZiAob2xkKQogCQl6c3dhcF9lbnRyeV9mcmVlKG9sZCk7CiAKIAkvKgotCSAqIFRoZSBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIHRoZSB0cmVlLCB0aGVyZSBpcwotCSAqIG5vIGZ1cnRoZXIgcG9zc2liaWxpdHkgb2YgZmFpbHVyZS4gR3JhYiByZWZzIHRvIHRoZSBwb29sIGFuZCBvYmpjZywKLQkgKiBjaGFyZ2UgenN3YXAgbWVtb3J5LCBhbmQgaW5jcmVtZW50IHpzd2FwX3N0b3JlZF9wYWdlcy4KJiM0MzsJICogVGhlIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4gdGhlIHN3YXAgdGFibGUsCiYjNDM7CSAqIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcG9zc2liaWxpdHkgb2YgZmFpbHVyZS4gR3JhYiByZWZzIHRvIHRoZSBwb29sCiYjNDM7CSAqIGFuZCBvYmpjZywgY2hhcmdlIHpzd2FwIG1lbW9yeSwgYW5kIGluY3JlbWVudCB6c3dhcF9zdG9yZWRfcGFnZXMuCiAJICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpCi0JICogd2hlbiB0aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgomIzQzOwkgKiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHN3YXAgdGFibGUuCiAJICovCiAJenN3YXBfcG9vbF9nZXQocG9vbCk7CiAJaWYgKG9iamNnKSB7CkBAIC0xNDQ2LDggJiM0MzsxNDUzLDggQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJYXRvbWljX2xvbmdfaW5jKCZhbXA7enN3YXBfc3RvcmVkX2luY29tcHJlc3NpYmxlX3BhZ2VzKTsKIAogCS8qCi0JICogV2UgZmluaXNoIGluaXRpYWxpemluZyB0aGUgZW50cnkgd2hpbGUgaXQmIzM5O3MgYWxyZWFkeSBpbiB4YXJyYXkuCi0JICogVGhpcyBpcyBzYWZlIGJlY2F1c2U6CiYjNDM7CSAqIFdlIGZpbmlzaCBpbml0aWFsaXppbmcgdGhlIGVudHJ5IHdoaWxlIGl0JiMzOTtzIGFscmVhZHkgaW4gdGhlCiYjNDM7CSAqIHN3YXAgdGFibGUuIFRoaXMgaXMgc2FmZSBiZWNhdXNlOgogCSAqCiAJICogMS4gQ29uY3VycmVudCBzdG9yZXMgYW5kIGludmFsaWRhdGlvbnMgYXJlIGV4Y2x1ZGVkIGJ5IGZvbGlvIGxvY2suCiAJICoKQEAgLTE0NjYsOCAmIzQzOzE0NzMsNiBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLAogCiAJcmV0dXJuIHRydWU7CiAKLXN0b3JlX2ZhaWxlZDoKLQl6c19mcmVlKHBvb2wtJmd0O3pzX3Bvb2wsIGVudHJ5LSZndDtoYW5kbGUpOwogY29tcHJlc3NfZmFpbGVkOgogCXpzd2FwX2VudHJ5X2NhY2hlX2ZyZWUoZW50cnkpOwogCXJldHVybiBmYWxzZTsKQEAgLTE1NDYsMTEgJiM0MzsxNTUxLDMxIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIAkJdW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7CiAJCXBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApOwogCQlzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5OwotCQlzdHJ1Y3QgeGFycmF5ICp0cmVlOwomIzQzOwkJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTsKJiM0MzsJCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXM7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHN3cF90YjsKIAomIzQzOwkJc2lzID0gX19zd2FwX3R5cGVfdG9faW5mbyh0eXBlKTsKIAkJZm9yIChpbmRleCA9IDA7IGluZGV4ICZsdDsgbnJfcGFnZXM7ICYjNDM7JiM0MztpbmRleCkgewotCQkJdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7Ci0JCQllbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCAmIzQzOyBpbmRleCk7CiYjNDM7CQkJY2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2lzLCBvZmZzZXQgJiM0MzsgaW5kZXgpOwomIzQzOwkJCXNwaW5fbG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsJCQlzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCAob2Zmc2V0ICYjNDM7IGluZGV4KSAlIFNXQVBGSUxFX0NMVVNURVIpOwomIzQzOwkJCWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7CiYjNDM7CQkJCWVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeQomIzQzOwkJCQkgKiAoU2hhZG93IG9yIFBGTikgdGhhdCB3YXMgc2F2ZWQgd2hlbiB0aGUKJiM0MzsJCQkJICogUG9pbnRlciBlbnRyeSB3YXMgY3JlYXRlZCwgcmF0aGVyIHRoYW4KJiM0MzsJCQkJICogemVyb2luZyB0aGUgc2xvdC4gIFRoaXMgcHJlc2VydmVzIHRoZSBzd2FwCiYjNDM7CQkJCSAqIGNvdW50IGFuZCBmbGFncyBzbyB0aGUgc3dhcCBjYWNoZSBmb2xpbwomIzQzOwkJCQkgKiBjYW4gYmUgY29ycmVjdGx5IGNsZWFuZWQgdXAgbGF0ZXIuCiYjNDM7CQkJCSAqLwomIzQzOwkJCQlfX3N3YXBfdGFibGVfc2V0KGNpLCAob2Zmc2V0ICYjNDM7IGluZGV4KSAlIFNXQVBGSUxFX0NMVVNURVIsCiYjNDM7CQkJCQkJIGVudHJ5LSZndDtzd3BfdGJfdmFsKTsKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQllbnRyeSA9IE5VTEw7CiYjNDM7CQkJfQomIzQzOwkJCXNwaW5fdW5sb2NrKCZhbXA7Y2ktJmd0O2xvY2spOwogCQkJaWYgKGVudHJ5KQogCQkJCXpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpOwogCQl9CkBAIC0xNTYyLDYgJiM0MzsxNTg3LDExIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIC8qKgogICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXAKICAqIEBmb2xpbzogZm9saW8gdG8gbG9hZAomIzQzOyAqIEB6ZW50cnk6IHpzd2FwX2VudHJ5IHBvaW50ZXIgZXh0cmFjdGVkIGZyb20gc3dhcCB0YWJsZSwgb3IgTlVMTAomIzQzOyAqCiYjNDM7ICogVGhlIHpzd2FwX2VudHJ5IHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgc3dhcCB0YWJsZSBQb2ludGVyIGVudHJ5IGJ5CiYjNDM7ICogX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyBiZWZvcmUgaXQgb3Zlcndyb3RlIHRoZSBlbnRyeSB3aXRoIGEgUEZOLgomIzQzOyAqIElmIEB6ZW50cnkgaXMgTlVMTCwgdGhlIHNsb3Qgd2FzIG5vdCBiYWNrZWQgYnkgenN3YXAuCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lCiAgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOgpAQCAtMTU3OSwxMiAmIzQzOzE2MDksOSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAgKiAgLUVOT0VOVDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIG5vdCBpbiB6c3dhcC4gVGhlIGZvbGlvIHJlbWFpbnMKICAqICBsb2NrZWQgb24gcmV0dXJuLgogICovCi1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQomIzQzO2ludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHZvaWQgKnplbnRyeSkKIHsKLQlzd3BfZW50cnlfdCBzd3AgPSBmb2xpby0mZ3Q7c3dhcDsKLQlwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTsKLQlzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cCk7Ci0Jc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTsKJiM0MzsJc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHplbnRyeTsKIAogCVZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTsKIAlWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7CkBAIC0xNjAyLDcgJiM0MzsxNjI5LDYgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTE2MjUsNyAmIzQzOzE2NTEsNiBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCSAqIGNvbXByZXNzaW9uIHdvcmsuCiAJICovCiAJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7Ci0JeGFfZXJhc2UodHJlZSwgb2Zmc2V0KTsKIAl6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTsKIAogCWZvbGlvX3VubG9jayhmb2xpbyk7CkBAIC0xNjM1LDUyICYjNDM7MTY2MCwxNTkgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbykKIHZvaWQgenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnlfdCBzd3ApCiB7CiAJcGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7Ci0Jc3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3dwX3RiOwogCXN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7CiAKLQlpZiAoeGFfZW1wdHkodHJlZSkpCiYjNDM7CXNpID0gX19zd2FwX3R5cGVfdG9faW5mbyhzd3BfdHlwZShzd3ApKTsKJiM0MzsJY2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2ksIG9mZnNldCk7CiYjNDM7CS8qCiYjNDM7CSAqIERvIGEgbG9ja2xlc3MgcGVlayBmaXJzdC4gIElmIGNpLSZndDtsb2NrIGlzIGFscmVhZHkgaGVsZCBieQomIzQzOwkgKiB0aGUgY2FsbGVyIChlLmcuIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyksIGFuZCB0aGUKJiM0MzsJICogUG9pbnRlciBoYXMgYWxyZWFkeSBiZWVuIGNsZWFyZWQsIHdlIGNhbiBiYWlsIG91dCB3aXRob3V0CiYjNDM7CSAqIHNlbGYtZGVhZGxvY2tpbmcuCiYjNDM7CSAqLwomIzQzOwlzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTsKJiM0MzsJaWYgKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKQogCQlyZXR1cm47CiAKLQllbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsJc3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7CiYjNDM7CWlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7CiYjNDM7CQllbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7CiYjNDM7CQkvKgomIzQzOwkJICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSAoU2hhZG93IG9yIFBGTikKJiM0MzsJCSAqIHRoYXQgd2FzIHNhdmVkIGluIHN3cF90Yl92YWwgd2hlbiB0aGUgUG9pbnRlciBlbnRyeQomIzQzOwkJICogd2FzIGNyZWF0ZWQuICBUaGlzIHByZXNlcnZlcyBzd2FwIGNvdW50IGFuZCBmbGFncwomIzQzOwkJICogZm9yIHRoZSBzdWJzZXF1ZW50IHNsb3QtZnJlZSBwYXRoLgomIzQzOwkJICovCiYjNDM7CQlfX3N3YXBfdGFibGVfc2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSLAomIzQzOwkJCQkgZW50cnktJmd0O3N3cF90Yl92YWwpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJZW50cnkgPSBOVUxMOwomIzQzOwl9CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7Y2ktJmd0O2xvY2spOwomIzQzOwogCWlmIChlbnRyeSkKIAkJenN3YXBfZW50cnlfZnJlZShlbnRyeSk7CiB9CiAKLWludCB6c3dhcF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiYjNDM7LyoKJiM0MzsgKiBFeHRyYWN0IHRoZSB3b3JraW5nIHNldCBzaGFkb3cgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LgomIzQzOyAqIFRoZSBzaGFkb3cgaXMgcmVjb3ZlcmVkIGZyb20genN3YXBfZW50cnktJmd0O3N3cF90Yl92YWwgd2hpY2ggcHJlc2VydmVzCiYjNDM7ICogdGhlIG9yaWdpbmFsIFNoYWRvdyBlbnRyeSB2YWx1ZS4gVGhlIHNoYWRvdyBjYW4gdGhlbiBiZSB1c2VkIGJ5CiYjNDM7ICogd29ya2luZ3NldF9yZWZhdWx0KCkgZm9yIHJlZmF1bHQgZGlzdGFuY2UgY2FsY3VsYXRpb24uCiYjNDM7ICovCiYjNDM7dm9pZCAqenN3YXBfc3dwX3RiX2dldF9zaGFkb3codW5zaWduZWQgbG9uZyBzd3BfdGIpCiB7Ci0Jc3RydWN0IHhhcnJheSAqdHJlZXMsICp0cmVlOwotCXVuc2lnbmVkIGludCBuciwgaTsKJiM0MzsJc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc2F2ZWQgPSBlbnRyeS0mZ3Q7c3dwX3RiX3ZhbDsKIAotCW5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTsKLQl0cmVlcyA9IGt2emFsbG9jX29ianMoKnRyZWUsIG5yKTsKLQlpZiAoIXRyZWVzKSB7Ci0JCXByX2VycigmIzM0O2FsbG9jIGZhaWxlZCwgenN3YXAgZGlzYWJsZWQgZm9yIHN3YXAgdHlwZSAlZFxuJiMzNDssIHR5cGUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CiYjNDM7CS8qCiYjNDM7CSAqIHN3cF90Yl92YWwgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzd2FwIHRhYmxlIGVudHJ5LiAgT25seQomIzQzOwkgKiBTaGFkb3cgZW50cmllcyBjYXJyeSB3b3JraW5nc2V0IGluZm9ybWF0aW9uOyBQRk4gYW5kIE5VTEwKJiM0MzsJICogZW50cmllcyBoYXZlIG5vIHNoYWRvdyB0byBleHRyYWN0LgomIzQzOwkgKi8KJiM0MzsJaWYgKCFzd3BfdGJfaXNfc2hhZG93KHNhdmVkKSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlyZXR1cm4gKHZvaWQgKikoc2F2ZWQgJmFtcDsgflNXUF9UQl9GTEFHU19NQVNLKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZWFkIHRoZSBzd2FwIGNvdW50IGZyb20gYSBQb2ludGVyLXR5cGUgc3dhcCB0YWJsZSBlbnRyeS4gVGhlIGNvdW50CiYjNDM7ICogYW5kIGZsYWdzIGFyZSBzdG9yZWQgaW4genN3YXBfZW50cnktJmd0O3N3cF90Yl92YWwgd2hpY2ggcHJlc2VydmVzIHRoZQomIzQzOyAqIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgKFNoYWRvdyBvciBQRk4gZm9ybWF0KS4KJiM0MzsgKi8KJiM0Mzt1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTsKJiM0MzsKJiM0MzsJcmV0dXJuIF9fc3dwX3RiX2dldF9jb3VudChlbnRyeS0mZ3Q7c3dwX3RiX3ZhbCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVhZCB0aGUgZmxhZ3MgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LgomIzQzOyAqLwomIzQzO3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90YikKJiM0Mzt7CiYjNDM7CXN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpOwomIzQzOwomIzQzOwlyZXR1cm4gX19zd3BfdGJfZ2V0X2ZsYWdzKGVudHJ5LSZndDtzd3BfdGJfdmFsKTsKJiM0Mzt9CiAKLQlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KQotCQl4YV9pbml0KHRyZWVzICYjNDM7IGkpOwomIzQzOy8qCiYjNDM7ICogSW5jcmVtZW50IHRoZSBzd2FwIGNvdW50IG9mIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuCiYjNDM7ICogVGhlIGNvdW50IGlzIHN0b3JlZCBpbiB6c3dhcF9lbnRyeS0mZ3Q7c3dwX3RiX3ZhbCBmb3IgY291bnRzIGJlbG93CiYjNDM7ICogU1dQX1RCX0NPVU5UX01BWCwgYW5kIG92ZXJmbG93cyBpbnRvIHRoZSBjbHVzdGVyJiMzOTtzIGV4dGVuZF90YWJsZQomIzQzOyAqIGp1c3QgbGlrZSBub3JtYWwgU2hhZG93L1BGTiBlbnRyaWVzIGRvLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCiYjNDM7ICogLUVOT01FTSBpZiBjb3VudCB3b3VsZCBvdmVyZmxvdyBhbmQgbm8gZXh0ZW5kX3RhYmxlIGlzIGF2YWlsYWJsZS4KJiM0MzsgKi8KJiM0MztpbnQgenN3YXBfc3dwX3RiX2R1cF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YiwKJiM0MzsJCQkgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKQomIzQzO3sKJiM0MzsJc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7CiYjNDM7CXVuc2lnbmVkIGNoYXIgY291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktJmd0O3N3cF90Yl92YWwpOwogCi0JbnJfenN3YXBfdHJlZXNbdHlwZV0gPSBucjsKLQl6c3dhcF90cmVlc1t0eXBlXSA9IHRyZWVzOwomIzQzOwlpZiAoY291bnQgJmx0OyBTV1BfVEJfQ09VTlRfTUFYKSB7CiYjNDM7CQllbnRyeS0mZ3Q7c3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LSZndDtzd3BfdGJfdmFsLAomIzQzOwkJCQkJCSAgICAgIGNvdW50ICYjNDM7IDEpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsJLyogY291bnQgPT0gTUFYLCBvdmVyZmxvdyBpbnRvIGV4dGVuZF90YWJsZSAqLwomIzQzOwlpZiAoIWNpLSZndDtleHRlbmRfdGFibGUpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJY291bnQgPSBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl07CiYjNDM7CWlmIChjb3VudCA9PSAwKQomIzQzOwkJY291bnQgPSBTV1BfVEJfQ09VTlRfTUFYOwomIzQzOwljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CWNpLSZndDtleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50OwogCXJldHVybiAwOwogfQogCi12b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpCiYjNDM7LyoKJiM0MzsgKiBEZWNyZW1lbnQgdGhlIHN3YXAgY291bnQgb2YgYSBQb2ludGVyLXR5cGUgc3dhcCB0YWJsZSBlbnRyeS4KJiM0MzsgKiBIYW5kbGVzIGJvdGggaW5saW5lIGNvdW50IChpbiBzd3BfdGJfdmFsKSBhbmQgb3ZlcmZsb3dlZCBjb3VudAomIzQzOyAqIChpbiBjaS0mZ3Q7ZXh0ZW5kX3RhYmxlKSwgbWF0Y2hpbmcgdGhlIGxvZ2ljIHVzZWQgYnkgbm9ybWFsIGVudHJpZXMuCiYjNDM7ICovCiYjNDM7dm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLAomIzQzOwkJCSAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKQogewotCXN0cnVjdCB4YXJyYXkgKnRyZWVzID0genN3YXBfdHJlZXNbdHlwZV07Ci0JdW5zaWduZWQgaW50IGk7CiYjNDM7CXN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpOwomIzQzOwl1bnNpZ25lZCBjaGFyIGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LSZndDtzd3BfdGJfdmFsKTsKJiM0MzsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKGNvdW50ID09IDApOwogCi0JaWYgKCF0cmVlcykKJiM0MzsJaWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHsKJiM0MzsJCWlmICghY2ktJmd0O2V4dGVuZF90YWJsZSkgewomIzQzOwkJCWNvdW50LS07CiYjNDM7CQkJZW50cnktJmd0O3N3cF90Yl92YWwgPSBfX3N3cF90Yl9ta19jb3VudChlbnRyeS0mZ3Q7c3dwX3RiX3ZhbCwgY291bnQpOwomIzQzOwkJCXJldHVybjsKJiM0MzsJCX0KJiM0MzsJCWNvdW50ID0gY2ktJmd0O2V4dGVuZF90YWJsZVtjaV9vZmZdOwomIzQzOwkJLyogT3ZlcmZsb3cgc3RhcnRzIHdpdGggU1dQX1RCX0NPVU5UX01BWCAqLwomIzQzOwkJVk1fV0FSTl9PTl9PTkNFKGNvdW50ICZsdDsgU1dQX1RCX0NPVU5UX01BWCk7CiYjNDM7CQljb3VudC0tOwomIzQzOwkJaWYgKGNvdW50ID09IChTV1BfVEJfQ09VTlRfTUFYIC0gMSkpIHsKJiM0MzsJCQljaS0mZ3Q7ZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwOwomIzQzOwkJCWVudHJ5LSZndDtzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktJmd0O3N3cF90Yl92YWwsCiYjNDM7CQkJCQkJCSAgICAgIGNvdW50KTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJY2ktJmd0O2V4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7CiYjNDM7CQl9CiAJCXJldHVybjsKJiM0MzsJfQomIzQzOwllbnRyeS0mZ3Q7c3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LSZndDtzd3BfdGJfdmFsLCBjb3VudCAtIDEpOwomIzQzO30KIAotCS8qIHRyeV90b191bnVzZSgpIGludmFsaWRhdGVkIGFsbCB0aGUgZW50cmllcyBhbHJlYWR5ICovCi0JZm9yIChpID0gMDsgaSAmbHQ7IG5yX3pzd2FwX3RyZWVzW3R5cGVdOyBpJiM0MzsmIzQzOykKLQkJV0FSTl9PTl9PTkNFKCF4YV9lbXB0eSh0cmVlcyAmIzQzOyBpKSk7CiYjNDM7aW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KIAotCWt2ZnJlZSh0cmVlcyk7Ci0JbnJfenN3YXBfdHJlZXNbdHlwZV0gPSAwOwotCXpzd2FwX3RyZWVzW3R5cGVdID0gTlVMTDsKJiM0Mzt2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpCiYjNDM7ewogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3ODg0CgkJCQkJCQlvdXRwdXQ6IDI0CgkJCQkJCQl0aG91Z2h0czogNjYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgWnN3YXAgRW50cnkgU3RvcmFnZSBQYXRjaCoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IGEgcGF0Y2ggaGVyZSB0aGF0JiMzOTtzIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IGB6c3dhcGAgbWFuYWdlcyBpdHMgZW50cmllcy4gSW5zdGVhZCBvZiB1c2luZyB0aGF0IHNlcGFyYXRlIGB4YXJyYXlgIHdlJiMzOTtyZSB1c2VkIHRvIChgenN3YXBfdHJlZXNgKSwgaXQmIzM5O3Mgbm93IGRpcmVjdGx5IGxpbmtpbmcgYSBwb2ludGVyIHRvIHRoZSBgenN3YXBfZW50cnlgIHN0cnVjdHVyZSB3aXRoaW4gdGhlIHN3YXAgdGFibGVzIHRoZW1zZWx2ZXMgKGBzd2FwX21hcGAgb3IgYHN3YXBfY2x1c3Rlcl9pbmZvYCkuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBhcmNoaXRlY3R1cmFsIHNoaWZ0LiBJIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIHJvYnVzdC4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byB2ZXJpZnkgaXRzIGZ1bmN0aW9uYWxpdHkuIFRoaXMgaXMgYSBjb21wbGV0ZSBwYXJhZGlnbSBzaGlmdCBpbiB6c3dhcCYjMzk7cyBlbnRyeSB0cmFja2luZy4gSXMgenN3YXAgZXZlbiByZWFjaGFibGUgaWYgdGhpcyBmYWlscz8gWWVzLCBpdCYjMzk7cyBhIGNvcmUgZmVhdHVyZSwgc28gdGhhdCYjMzk7cyBhIGNoZWNrLiBJcyB0aGlzIGNoYW5nZSB3b3J0aHkgb2YgZnV6emluZz8gQWJzb2x1dGVseTsgaXQmIzM5O3MgYSByYWRpY2FsIG1vZGlmaWNhdGlvbiB0byBob3cgc3dhcCBhbmQgenN3YXAgaW50ZXJhY3QuIFRoYXQgbmVjZXNzaXRhdGVzIGZ1enppbmcgdG8gcm9vdCBvdXQgYW55IHN1YnRsZSBidWdzLgoKTm93LCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyB0aGlzIHBhdGNoIHRvdWNoZXMuIExvb2tzIGxpa2UgdGhlIGNvcmUgYG1tL3pzd2FwLmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYCBhcmUgd2hlcmUgdGhlIGJ1bGsgb2YgdGhlIGNoYW5nZXMgcmVzaWRlLiBGcm9tIGEgcXVpY2sgc2NhbiwgaXQgbG9va3MgbGlrZSB0aGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZDogYHpzd2FwX3N0b3JlYCwgYHpzd2FwX2xvYWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGB6c3dhcF93cml0ZWJhY2tfZW50cnlgLCBgenN3YXBfc3RvcmVfcGFnZWAsIGBfX3N3YXBfY2FjaGVfYWRkX2ZvbGlvYCwgYF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9gLCBgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpb2AsIGBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlgLCBgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzYCwgYHN3YXBfcHV0X2VudHJpZXNfY2x1c3RlcmAsIGFuZCBgX19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5YC4gSSBuZWVkIHRvIGRpZyBpbnRvIHRob3NlIGZ1bmN0aW9ucy4gTGV0IG1lIHJldmlldyBgbW0venN3YXAuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBMb29rcyBsaWtlIGl0JiMzOTtzIGEgZmV3IG1vcmUgdGhhbiB0aGUgbGlzdCBJIGluaXRpYWxseSBjb25zdHJ1Y3RlZDogYHpzd2FwX3N0b3JlYCwgYHpzd2FwX2xvYWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGB6c3dhcF93cml0ZWJhY2tfZW50cnlgLCBgenN3YXBfc3dwX3RiX2R1cF9jb3VudGAsIGB6c3dhcF9zd3BfdGJfcHV0X2NvdW50YCwgYHpzd2FwX3N3cF90Yl9nZXRfc2hhZG93YCwgYHpzd2FwX3N3cF90Yl9nZXRfY291bnRgLCBgenN3YXBfc3dwX3RiX2dldF9mbGFnc2AuIGBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrYCwgYF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9gLCBgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpb2AsIGBfX3N3YXBfY2FjaGVfYWxsb2NgLCBgc3dhcF9jYWNoZV9hbGxvY19mb2xpb2AsIGBzd2FwX2NhY2hlX3JlYWRfZm9saW9gLCBgc3dhcGluX3N5bmNgLiBgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllc2AsIGBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlgLCBgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyYCwgYF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeWAsIGBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXNgLCBgX19zd2FwX2NvdW50YCwgYHN3YXBfZW50cnlfc3dhcHBlZGAsIGB1bnVzZV9wdGVfcmFuZ2VgLgoKTmV4dCwgSSBuZWVkIHRvIGlkZW50aWZ5IGFueSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIGBDT05GSUdfWlNXQVBgIGlzIG9idmlvdXNseSBlc3NlbnRpYWwuIEkgc2hvdWxkIGNoZWNrIGBtbS9LY29uZmlnYCBvciBldmVuIGBtbS96c3dhcC5jYCBpdHNlbGYgdG8gY29uZmlybSBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzIG9yIGltcGxpY2F0aW9ucy4gYENPTkZJR19TV0FQYCBpcyBpbXBsaWNpdGx5IGVuYWJsZWQgd2hlbiBgQ09ORklHX1pTV0FQYCBpcywgc28gSSYjMzk7bGwga2VlcCBhbiBleWUgb3V0IGZvciBhbnkgb3RoZXJzIHRoYXQgbWlnaHQgYmUgcmVxdWlyZWQgb3IgYWZmZWN0ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMTU6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFpTV0FQJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9MTI9bWVudWNvbmZpZyBTV0FQXG4tLVxubW0vS2NvbmZpZy0yMS1cbm1tL0tjb25maWc6MjI6Y29uZmlnIFpTV0FQXG5tbS9LY29uZmlnLTIzLVx0Ym9vbCBcJiMzNDtDb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy0zNC1cbm1tL0tjb25maWc6MzU6Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cbm1tL0tjb25maWctMzYtXHRib29sIFwmIzM0O0VuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZy00NC1cbm1tL0tjb25maWc6NDU6Y29uZmlnIFpTV0FQX1NIUklOS0VSX0RFRkFVTFRfT05cbm1tL0tjb25maWctNDYtXHRib29sIFwmIzM0O1NocmluayB0aGUgenN3YXAgcG9vbCBvbiBtZW1vcnkgcHJlc3N1cmVcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTU5PWNob2ljZVxuLS1cbm1tL0tjb25maWctNzYtXG5tbS9LY29uZmlnOjc3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfREVGTEFURVxubW0vS2NvbmZpZy03OC1cdGJvb2wgXCYjMzQ7RGVmbGF0ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctODItXG5tbS9LY29uZmlnOjgzOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFpPXG5tbS9LY29uZmlnLTg0LVx0Ym9vbCBcJiMzNDtMWk9cJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg4LVxubW0vS2NvbmZpZzo4OTpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXzg0MlxubW0vS2NvbmZpZy05MC1cdGJvb2wgXCYjMzQ7ODQyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NC1cbm1tL0tjb25maWc6OTU6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRcbm1tL0tjb25maWctOTYtXHRib29sIFwmIzM0O0xaNFwmIzM0O1xuLS1cbm1tL0tjb25maWctMTAwLVxubW0vS2NvbmZpZzoxMDE6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRIQ1xubW0vS2NvbmZpZy0xMDItXHRib29sIFwmIzM0O0xaNEhDXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy0xMDYtXG5tbS9LY29uZmlnOjEwNzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX1pTVERcbm1tL0tjb25maWctMTA4LVx0Ym9vbCBcJiMzNDt6c3RkXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz0xMTI9ZW5kY2hvaWNlXG5tbS9LY29uZmlnLTExMy1cbm1tL0tjb25maWc6MTE0OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRcbm1tL0tjb25maWctMTE1LSAgICAgICBzdHJpbmdcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAxNToxMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTgzNwoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkgd2VyZSBteSBvd246CgoqKkVuYWJsaW5nIFpTV0FQOiBBIFN0cmVhbWxpbmVkIFBhdGggdG8gUGVyZm9ybWFuY2UqKgoKUmlnaHQsIHNvIEkmIzM5O20gdGhpbmtpbmcsIGdpdmVuIHRoZSBjb250ZXh0LCBlbmFibGluZyBgWlNXQVBgIGFuZCBzZXR0aW5nIGBaU1dBUF9ERUZBVUxUX09OYCBzZWVtcyBsaWtlIHRoZSBzZW5zaWJsZSBuZXh0IHN0ZXAuICBXZSYjMzk7cmUgbG9va2luZyBmb3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLCBhbmQgdGhpcyBpcyBhIGNsYXNzaWMgYXBwcm9hY2guCgpCZWZvcmUgSSBqdW1wIHRvIGFueSBjb25jbHVzaW9ucywgSSYjMzk7ZCBiZXR0ZXIgZG91YmxlLWNoZWNrIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gU28sIGxldCYjMzk7cyBoZWFkIG92ZXIgdG8gYG1tL0tjb25maWdgIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG9idmlvdXMgY29uZmxpY3RzIG9yIHByZXJlcXVpc2l0ZXMgSSYjMzk7dmUgbWlzc2VkLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiB0aGF0IGFyZWEgLSBlbnN1cmUgdGhlcmUgaXMgbm90aGluZyBwcmV2ZW50aW5nIG9yIHJlcXVpcmluZyBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gR290dGEgbWFrZSBzdXJlIHRoZXJlIGFyZW4mIzM5O3QgYW55IGdvdGNoYXMgaW4gdGhlIHNldHVwLCBvciBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mLiBCZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IHdoZW4gbWFraW5nIHRoZXNlIGtpbmRzIG9mIGNoYW5nZXMuICBUaGVuLCB3ZSBjYW4gZXZhbHVhdGUgdGhlIGJyb2FkZXIgaW1wbGljYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBaU1dBUF9ERUZBVUxUX09OJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9MjI9Y29uZmlnIFpTV0FQXG4tLVxubW0vS2NvbmZpZy0zNC1cbm1tL0tjb25maWc6MzU6Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cbm1tL0tjb25maWctMzYtXHRib29sIFwmIzM0O0VuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMTU6MTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAxNzkKCQkJCQkJCW91dHB1dDogMjQ1CgkJCQkJCQl0aG91Z2h0czogNzE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFpzd2FwIENoYW5nZXMqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIHpzd2FwIHBhdGNoLCBhbmQgaGVyZSYjMzk7cyBteSB0cmFpbiBvZiB0aG91Z2h0LiBGaXJzdCwgSSBuZWVkIHRvIHBpbnBvaW50IHRoZSBrZXkgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBoYXZlIGJlZW4gdG91Y2hlZC4gSSBzdGFydGVkIGJ5IGlkZW50aWZ5aW5nIGEgbGlzdCBvZiBzeW1ib2xzIEkgc2VlIGFzIHBvdGVudGlhbGx5IGltcG9ydGFudC4gTGV0JiMzOTtzIHNlZS4uLiBJJiMzOTt2ZSBnb3QgYHpzd2FwX3N0b3JlYCwgYHpzd2FwX2xvYWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGB6c3dhcF93cml0ZWJhY2tfZW50cnlgLCBgX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpb2AsIGBfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvYCwgYF9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeWAsIGBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXNgLCBgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyYCwgYW5kIGBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBvZiB0aGVzZSBhcmUgYWN0dWFsbHkgKnNpZ25pZmljYW50KiBpbiB0ZXJtcyBvZiBjaGFuZ2VzLgoKTmV4dCwgSSYjMzk7bSBjaGVja2luZyB0aGVpciBzY29wZS4gSXMgaXQgc3RhdGljIG9yIGV4cG9ydGVkPyBJJiMzOTt2ZSBmaWx0ZXJlZCB0aGUgbGlzdCBkb3duLCBmb2N1c2luZyBvbiBmdW5jdGlvbnMgYW5kIGdsb2JhbHMgdGhhdCBhcmUgZXhwb3NlZCBvciBoYXZlIHN1YnN0YW50aWFsIGxvZ2ljIGludm9sdmVkLiBNeSByZXZpc2VkIGtleSBsaXN0IG5vdyBsb29rcyBsaWtlOiBgenN3YXBfc3RvcmVgLCBgenN3YXBfbG9hZGAsIGB6c3dhcF9pbnZhbGlkYXRlYCwgYHpzd2FwX3dyaXRlYmFja19lbnRyeWAsIGBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvYCwgYF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9gLCBgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5YCwgYF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllc2AsIGFuZCBgX19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5YC4gSSB0aGVuIGlkZW50aWZpZWQgdGhhdCBgenN3YXBfc3dwX3RiX2R1cF9jb3VudGAgYW5kIGB6c3dhcF9zd3BfdGJfcHV0X2NvdW50YCBhcmUgYWxzbyBnbG9iYWwsIG1lYW5pbmcgdGhleSBuZWVkIHRvIGJlIHdhdGNoZWQuCgpOb3cgSSB1bmRlcnN0YW5kIHRoZSBjb3JlIG9mIHRoZSBjaGFuZ2U6IHRoZSBwYXRjaCBpcyBmdW5kYW1lbnRhbGx5IGFsdGVyaW5nIGhvdyB6c3dhcCBtYW5hZ2VzIGNvbXByZXNzZWQgcGFnZXMuIEl0JiMzOTtzIGVtYmVkZGluZyB0aGUgYHpzd2FwX2VudHJ5YCBwb2ludGVycyBkaXJlY3RseSBpbnRvIHRoZSBgc3dhcF9jbHVzdGVyX2luZm9gIHN0cnVjdHVyZXMuIFRoaXMgaXMgYSBiaWcgZGVhbCBiZWNhdXNlIGl0IG1lYW5zIHRoZSBjb3JlIHN3YXAgYWxsb2NhdGlvbiwgZnJlZWluZywgYW5kIGxvb2t1cCBwYXRocyBhcmUgYmVpbmcgcmVzaGFwZWQuIFRoaXMgaXMgd2hlcmUgSSBzdGFydCB0aGlua2luZyBhYm91dCB0aGUgcG90ZW50aWFsIHBpdGZhbGxzIGFuZCB0aGUgYXJlYXMgSSBuZWVkIHRvIGZvY3VzIG9uLgoKVGhpcyBhcHByb2FjaCB3aWxsIGludHJvZHVjZSBtZW1vcnkgbWFuYWdlbWVudCBjb25zaWRlcmF0aW9ucywgYW5kIEkgbmVlZCB0byBlbnN1cmUgdGhhdCBjb25jdXJyZW50IHN3YXAgb3BlcmF0aW9ucyBkb24mIzM5O3QgbGVhZCB0byBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3IgZXJyb3JzIGluIHN3YXAgYWNjb3VudGluZy4gSSYjMzk7bSBhbHJlYWR5IG1lbnRhbGx5IGZsYWdnaW5nIHRoaXMgZm9yIHRob3JvdWdoIGZ1enppbmcgYW5kIHJpZ29yb3VzIHRlc3RpbmcuCgpGaW5hbGx5LCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBhcmUgc2V0LiBJIG5lZWQgYFpTV0FQYCBlbmFibGVkLCBhbmQsIGZvciBkZWZhdWx0IHVzYWdlLCBgWlNXQVBfREVGQVVMVF9PTmAgYXMgd2VsbC4gV2l0aCB0aGlzIGRvbmUsIEkmIzM5O20gcmVhZHkgdG8gY2FsbCB0aGUgbmV4dCBzdGVwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDE1OjExPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtaU1dBUCYjMzQ7LAogICAgJiMzNDtaU1dBUF9ERUZBVUxUX09OJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7enN3YXBfc3RvcmUmIzM0OywKICAgICYjMzQ7enN3YXBfbG9hZCYjMzQ7LAogICAgJiMzNDt6c3dhcF9pbnZhbGlkYXRlJiMzNDssCiAgICAmIzM0O3pzd2FwX3dyaXRlYmFja19lbnRyeSYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9kb19kZWxfZm9saW8mIzM0OywKICAgICYjMzQ7X19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5JiMzNDssCiAgICAmIzM0O19fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkmIzM0OywKICAgICYjMzQ7enN3YXBfc3dwX3RiX2R1cF9jb3VudCYjMzQ7LAogICAgJiMzNDt6c3dhcF9zd3BfdGJfcHV0X2NvdW50JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZ1bmRhbWVudGFsbHkgY2hhbmdlcyBob3cgenN3YXAgdHJhY2tzIGNvbXByZXNzZWQgcGFnZXMgYnkgZW1iZWRkaW5nIGB6c3dhcF9lbnRyeWAgcG9pbnRlcnMgZGlyZWN0bHkgaW50byB0aGUgY29yZSBzd2FwIHRhYmxlIChgc3dhcF9jbHVzdGVyX2luZm9gKSByYXRoZXIgdGhhbiB1c2luZyBhIHNlcGFyYXRlIHhhcnJheSAoYHpzd2FwX3RyZWVzYCkuIFRoaXMgYWZmZWN0cyBjb3JlIHN3YXAgYWxsb2NhdGlvbiwgZnJlZWluZywgYW5kIGxvb2t1cCBwYXRocywgcmVxdWlyaW5nIGZ1enppbmcgdG8gZW5zdXJlIG5vIG1lbW9yeSBsZWFrcywgdXNlLWFmdGVyLWZyZWVzLCBvciBzd2FwIGFjY291bnRpbmcgZXJyb3JzIG9jY3VyIGR1cmluZyBjb25jdXJyZW50IHN3YXAgb3BlcmF0aW9ucy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7WlNXQVAmIzM0OywKICAgICYjMzQ7WlNXQVBfREVGQVVMVF9PTiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX3N0b3JlJiMzNDssCiAgICAmIzM0O3pzd2FwX2xvYWQmIzM0OywKICAgICYjMzQ7enN3YXBfaW52YWxpZGF0ZSYjMzQ7LAogICAgJiMzNDt6c3dhcF93cml0ZWJhY2tfZW50cnkmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvJiMzNDssCiAgICAmIzM0O19fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeSYjMzQ7LAogICAgJiMzNDtfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMmIzM0OywKICAgICYjMzQ7X19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5JiMzNDssCiAgICAmIzM0O3pzd2FwX3N3cF90Yl9kdXBfY291bnQmIzM0OywKICAgICYjMzQ7enN3YXBfc3dwX3RiX3B1dF9jb3VudCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0wN1QxNToxMToyMS42NTYxMjU5NzJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzAyNjQ4MjAxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiWlNXQVBfREVGQVVMVF9PTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9sb2FkXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCIsXG4gICAgXCJ6c3dhcF93cml0ZWJhY2tfZW50cnlcIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeVwiLFxuICAgIFwiX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzXCIsXG4gICAgXCJfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlcIixcbiAgICBcInpzd2FwX3N3cF90Yl9kdXBfY291bnRcIixcbiAgICBcInpzd2FwX3N3cF90Yl9wdXRfY291bnRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDE1OjExOjIxLjY1NjEzMTg5MloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzI3NTg4NDI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZjIwMTE5ODU4NzYzMTIxNWY3MDhmNTg4NmE5ODEwMzIzZmJjMjM5OVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEp1bCA3IDE1OjExOjE4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvenN3YXAuaCBiL2luY2x1ZGUvbGludXgvenN3YXAuaFxcbmluZGV4IDMwYzE5M2ExMjA3ZTE2Li40ZjU1YzhkMGM0YzU0MiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3pzd2FwLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3pzd2FwLmhcXG5AQCAtMjYsNyArMjYsNyBAQCBzdHJ1Y3QgenN3YXBfbHJ1dmVjX3N0YXRlIHtcXG4gXFxuIHVuc2lnbmVkIGxvbmcgenN3YXBfdG90YWxfcGFnZXModm9pZCk7XFxuIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuLWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbitpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB2b2lkICp6ZW50cnkpO1xcbiB2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcXG4gaW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XFxuIHZvaWQgenN3YXBfc3dhcG9mZihpbnQgdHlwZSk7XFxuQEAgLTQ0LDcgKzQ0LDcgQEAgc3RhdGljIGlubGluZSBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdHJldHVybiBmYWxzZTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbitzdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHZvaWQgKnplbnRyeSlcXG4ge1xcbiBcXHRyZXR1cm4gLUVOT0VOVDtcXG4gfVxcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmNcXG5pbmRleCBiMjNmNDk0ZmNjODNkYS4uMWNlODIwMWVkODZlMjQgMTAwNjQ0XFxuLS0tIGEvbW0vcGFnZV9pby5jXFxuKysrIGIvbW0vcGFnZV9pby5jXFxuQEAgLTY1OCw3ICs2NTgsNyBAQCBzdGF0aWMgdm9pZCBzd2FwX3JlYWRfZm9saW9fYmRldl9hc3luYyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbiBcXHRzdWJtaXRfYmlvKGJpbyk7XFxuIH1cXG4gXFxuLXZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKVxcbit2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KVxcbiB7XFxuIFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBfX3N3YXBfZW50cnlfdG9faW5mbyhmb2xpby1cXHUwMDNlc3dhcCk7XFxuIFxcdGJvb2wgc3luY2hyb25vdXMgPSBzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NZTkNIUk9OT1VTX0lPO1xcbkBAIC02ODYsNyArNjg2LDcgQEAgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcpXFxuIFxcdFxcdGdvdG8gZmluaXNoO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoenN3YXBfbG9hZChmb2xpbykgIT0gLUVOT0VOVClcXG4rXFx0aWYgKHpzd2FwX2xvYWQoZm9saW8sIHplbnRyeSkgIT0gLUVOT0VOVClcXG4gXFx0XFx0Z290byBmaW5pc2g7XFxuIFxcbiBcXHQvKiBXZSBoYXZlIHRvIHJlYWQgZnJvbSBzbG93ZXIgZGV2aWNlcy4gSW5jcmVhc2UgenN3YXAgcHJvdGVjdGlvbi4gKi9cXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcC5oIGIvbW0vc3dhcC5oXFxuaW5kZXggNDRhYjhlMWU1OTViMDguLjg0ZTEzYmE2ZTYwNWMzIDEwMDY0NFxcbi0tLSBhL21tL3N3YXAuaFxcbisrKyBiL21tL3N3YXAuaFxcbkBAIC0yMTAsNiArMjEwLDQxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2NsdXN0ZXJfdW5sb2NrX2lycShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxcbiBcXG4gZXh0ZXJuIGludCBzd2FwX3JldHJ5X3RhYmxlX2FsbG9jKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnApO1xcbiBcXG4rc3RydWN0IHpzd2FwX2VudHJ5O1xcbisjaWZkZWYgQ09ORklHX1pTV0FQXFxuK3ZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKTtcXG4rdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiKTtcXG4rdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2ZsYWdzKHVuc2lnbmVkIGxvbmcgc3dwX3RiKTtcXG4raW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXFxuK1xcdFxcdFxcdCAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHVuc2lnbmVkIGludCBjaV9vZmYpO1xcbit2b2lkIHpzd2FwX3N3cF90Yl9wdXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXFxuK1xcdFxcdFxcdCAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKTtcXG4rdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpO1xcbisjZWxzZVxcbitzdGF0aWMgaW5saW5lIHZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbit7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB6c3dhcF9zd3BfdGJfZ2V0X2ZsYWdzKHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK3N0YXRpYyBpbmxpbmUgaW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbitcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IGNpX29mZilcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitzdGF0aWMgaW5saW5lIHZvaWQgenN3YXBfc3dwX3RiX3B1dF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YixcXG4rXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbitcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCBjaV9vZmYpIHt9XFxuK3N0YXRpYyBpbmxpbmUgdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpIHt9XFxuKyNlbmRpZlxcbitcXG4gLypcXG4gICogQmVsb3cgYXJlIHRoZSBjb3JlIHJvdXRpbmVzIGZvciBkb2luZyBzd2FwIGZvciBhIGZvbGlvLlxcbiAgKiBBbGwgaGVscGVycyByZXF1aXJlcyB0aGUgZm9saW8gdG8gYmUgbG9ja2VkLCBhbmQgYSBsb2NrZWQgZm9saW9cXG5AQCAtMjQxLDcgKzI3Niw3IEBAIGV4dGVybiB2b2lkIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIC8qIGxpbnV4L21tL3BhZ2VfaW8uYyAqL1xcbiBpbnQgc2lvX3Bvb2xfaW5pdCh2b2lkKTtcXG4gc3RydWN0IHN3YXBfaW9jYjtcXG4tdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcpO1xcbit2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KTtcXG4gdm9pZCBfX3N3YXBfcmVhZF91bnBsdWcoc3RydWN0IHN3YXBfaW9jYiAqcGx1Zyk7XFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX3JlYWRfdW5wbHVnKHN0cnVjdCBzd2FwX2lvY2IgKnBsdWcpXFxuIHtcXG5AQCAtMzAzLDEzICszMzgsMTYgQEAgc3RhdGljIGlubGluZSBib29sIGZvbGlvX21hdGNoZXNfc3dhcF9lbnRyeShjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbiBib29sIHN3YXBfY2FjaGVfaGFzX2ZvbGlvKHN3cF9lbnRyeV90IGVudHJ5KTtcXG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2dldF9mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSk7XFxuIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSk7XFxuK2Jvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4gdm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdldF9lbnRyeSwgZ2ZwX3QgZ2ZwX21hc2ssXFxuIFxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBvcmRlcnMsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLFxcbi1cXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KTtcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCxcXG4rXFx0XFx0XFx0XFx0ICAgICB2b2lkICoqemVudHJ5KTtcXG4gLyogQmVsb3cgaGVscGVycyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gbG9jayBhbmQgcGFzcyBpbiB0aGUgc3dhcCBjbHVzdGVyLiAqL1xcbiB2b2lkIF9fc3dhcF9jYWNoZV9hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4tXFx0XFx0XFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5KTtcXG4rXFx0XFx0XFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LFxcbitcXHRcXHRcXHQgICAgdm9pZCAqKnplbnRyeSk7XFxuIHZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXHRcXHRcXHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XFxuIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5AQCAtMzgxLDcgKzQxOSw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBmb2xpb19wdXRfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcXG4ge1xcbiB9XFxuIFxcbi1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKVxcbitzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnLFxcbitcXHRcXHRcXHRcXHQgICB2b2lkICp6ZW50cnkpXFxuIHtcXG4gfVxcbiBcXG5AQCAtNDUzLDYgKzQ5MiwxMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSlcXG4gXFx0cmV0dXJuIE5VTEw7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbiBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4ge1xcbiB9XFxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xcbmluZGV4IDZmZDZlMzQxNWI3MThiLi42MGQ5MzdjNmIzOTIyNCAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcXG5AQCAtMTc1LDE2ICsxNzUsMjkgQEAgc3RhdGljIGludCBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuIFxcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XFxuIFxcdGlmIChzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSlcXG4gXFx0XFx0cmV0dXJuIC1FRVhJU1Q7XFxuLVxcdGlmICghX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXFxuK1xcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XFxuK1xcdFxcdGlmICghenN3YXBfc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0fSBlbHNlIGlmICghX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpIHtcXG4gXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4gXFx0aWYgKHNoYWRvd3AgXFx1MDAyNlxcdTAwMjYgc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpKVxcbiBcXHRcXHQqc2hhZG93cCA9IHN3cF90Yl90b19zaGFkb3cob2xkX3RiKTtcXG4rXFx0ZWxzZSBpZiAoc2hhZG93cCBcXHUwMDI2XFx1MDAyNiBzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKVxcbitcXHRcXHQqc2hhZG93cCA9IHpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KG9sZF90Yik7XFxuIFxcdGlmIChtZW1jZ19pZClcXG4gXFx0XFx0Km1lbWNnX2lkID0gX19zd2FwX2Nncm91cF9nZXQoY2ksIGNpX29mZik7XFxuIFxcbiBcXHRpZiAobnIgPT0gMSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcbitcXHQvKlxcbitcXHQgKiBGb3IgbXVsdGktc2xvdCByYW5nZXMsIFBvaW50ZXIgZW50cmllcyBhcmUgbm90IGV4cGVjdGVkIHNpbmNlXFxuK1xcdCAqIHpzd2FwIGRvZXMgbm90IHN1cHBvcnQgbGFyZ2UgZm9saW9zLiBSZXR1cm4gLUVCVVNZIGZvciBzYWZldHkuXFxuK1xcdCAqL1xcbitcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSlcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFxuIFxcdGlzX3plcm8gPSBfX3N3YXBfdGFibGVfdGVzdF96ZXJvKGNpLCBjaV9vZmYpO1xcbiBcXHRjaV9vZmYgPSByb3VuZF9kb3duKGNpX29mZiwgbnIpO1xcbiBcXHRjaV9lbmQgPSBjaV9vZmYgKyBucjtcXG5AQCAtMjAxLDcgKzIxNCw4IEBAIHN0YXRpYyBpbnQgX19zd2FwX2NhY2hlX2FkZF9jaGVjayhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLVxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5KVxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdm9pZCAqKnplbnRyeSlcXG4ge1xcbiBcXHR1bnNpZ25lZCBpbnQgY2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KGVudHJ5KSwgY2lfZW5kO1xcbiBcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbkBAIC0yMTYsNyArMjMwLDM0IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gXFx0ZG8ge1xcbiBcXHRcXHRvbGRfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xcbiBcXHRcXHRWTV9XQVJOX09OX09OQ0Uoc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikpO1xcbi1cXHRcXHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIHBmbl90b19zd3BfdGIocGZuLCBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpO1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBJZiB0aGUgb2xkIGVudHJ5IGlzIGEgUG9pbnRlciAoenN3YXAgY29tcHJlc3NlZCBkYXRhKSxcXG4rXFx0XFx0ICogZXh0cmFjdCB0aGUgenN3YXBfZW50cnkgZm9yIHRoZSBjYWxsZXIgYW5kIHByZXNlcnZlXFxuK1xcdFxcdCAqIGl0cyBmbGFncy4gVGhlIFBvaW50ZXIgZW50cnkgaGFzIG5vIGlubGluZSBmbGFncy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGNoYXIgcGZsYWdzID0genN3YXBfc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpO1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBJZiBzd3BfdGJfdmFsIGNhcnJpZXMgU1dQX1RCX0NPVU5UX01BWCwgdGhlXFxuK1xcdFxcdFxcdCAqIHJlYWwgb3ZlcmZsb3cgY291bnQgbGl2ZXMgaW4gY2ktXFx1MDAzZWV4dGVuZF90YWJsZS5cXG4rXFx0XFx0XFx0ICogUHVsbCBpdCBzbyB0aGUgbmV3IFBGTiBjYXJyaWVzIHRoZSBjb3JyZWN0IGNvdW50XFxuK1xcdFxcdFxcdCAqIGFuZCB3b24ndCBsYXRlciBjcmFzaCBvbiBhIG1pc3NpbmcgZXh0ZW5kX3RhYmxlLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XFxuK1xcdFxcdFxcdFxcdHVuc2lnbmVkIGNoYXIgcmVhbCA9IFNXUF9UQl9DT1VOVF9NQVggLSAxO1xcbitcXHRcXHRcXHRcXHRpZiAoY2ktXFx1MDAzZWV4dGVuZF90YWJsZSBcXHUwMDI2XFx1MDAyNiBjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0pXFxuK1xcdFxcdFxcdFxcdFxcdHJlYWwgPSBjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XFxuK1xcdFxcdFxcdFxcdHBmbGFncyA9IChyZWFsIFxcdTAwM2NcXHUwMDNjIChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgfFxcbitcXHRcXHRcXHRcXHRcXHQgKHBmbGFncyBcXHUwMDI2ICgoMSBcXHUwMDNjXFx1MDAzYyAoU1dQX1RCX0ZMQUdTX0JJVFMgLSBTV1BfVEJfQ09VTlRfQklUUykpIC0gMSkpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlmICh6ZW50cnkgXFx1MDAyNlxcdTAwMjYgISp6ZW50cnkpXFxuK1xcdFxcdFxcdFxcdCp6ZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihvbGRfdGIpO1xcbitcXHRcXHRcXHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXFxuK1xcdFxcdFxcdFxcdHBmbl90b19zd3BfdGIocGZuLCBwZmxhZ3MpKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxcbitcXHRcXHRcXHRcXHRwZm5fdG9fc3dwX3RiKHBmbiwgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTtcXG4rXFx0XFx0fVxcbiBcXHR9IHdoaWxlICgrK2NpX29mZiBcXHUwMDNjIGNpX2VuZCk7XFxuIFxcbiBcXHRmb2xpb19yZWZfYWRkKGZvbGlvLCBucl9wYWdlcyk7XFxuQEAgLTIzOSwxMSArMjgwLDEyIEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gICogdGhhdCBob2xkcyB0aGUgZW50cmllcy5cXG4gICovXFxuIHZvaWQgX19zd2FwX2NhY2hlX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbi1cXHRcXHRcXHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpXFxuK1xcdFxcdFxcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSxcXG4rXFx0XFx0XFx0ICAgIHZvaWQgKip6ZW50cnkpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG4gXFxuLVxcdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSk7XFxuK1xcdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSwgemVudHJ5KTtcXG4gXFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9QQUdFUywgbnJfcGFnZXMpO1xcbiBcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NXQVBDQUNIRSwgbnJfcGFnZXMpO1xcbiB9XFxuQEAgLTI2OSwxNSArMzExLDI4IEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gXFx0Y2lfb2ZmID0gY2lfc3RhcnQ7XFxuIFxcdGRvIHtcXG4gXFx0XFx0b2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcXG4tXFx0XFx0V0FSTl9PTl9PTkNFKCFzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSB8fFxcbi1cXHRcXHRcXHQgICAgIHN3cF90Yl90b19mb2xpbyhvbGRfdGIpICE9IGZvbGlvKTtcXG4tXFx0XFx0aWYgKF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxcbi1cXHRcXHRcXHRmb2xpb19zd2FwcGVkID0gdHJ1ZTtcXG4tXFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRuZWVkX2ZyZWUgPSB0cnVlO1xcbi1cXHRcXHQvKiBJZiBzaGFkb3cgaXMgTlVMTCwgd2Ugc2V0IGFuIGVtcHR5IHNoYWRvdy4gKi9cXG4tXFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdyxcXG4tXFx0XFx0XFx0XFx0IF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIElmIHpzd2FwIGFscmVhZHkgc3RvcmVkIGRhdGEgZm9yIHRoaXMgc2xvdFxcbitcXHRcXHQgKiAoenN3YXBfc3RvcmUgd3JvdGUgYSBQb2ludGVyIGVudHJ5KSwgbGVhdmUgaXRcXG4rXFx0XFx0ICogaW4gcGxhY2UuIFRoZSBjb3VudCBhbmQgZmxhZ3MgYXJlIHN0b3JlZCBpbiB0aGVcXG4rXFx0XFx0ICogenN3YXBfZW50cnkgc3RydWN0LlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpIHtcXG4rXFx0XFx0XFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcXG4rXFx0XFx0XFx0XFx0Zm9saW9fc3dhcHBlZCA9IHRydWU7XFxuK1xcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0XFx0bmVlZF9mcmVlID0gdHJ1ZTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0V0FSTl9PTl9PTkNFKCFzd3BfdGJfaXNfZm9saW8ob2xkX3RiKSB8fFxcbitcXHRcXHRcXHRcXHQgICAgIHN3cF90Yl90b19mb2xpbyhvbGRfdGIpICE9IGZvbGlvKTtcXG4rXFx0XFx0XFx0aWYgKF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxcbitcXHRcXHRcXHRcXHRmb2xpb19zd2FwcGVkID0gdHJ1ZTtcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRuZWVkX2ZyZWUgPSB0cnVlO1xcbitcXHRcXHRcXHQvKiBJZiBzaGFkb3cgaXMgTlVMTCwgd2Ugc2V0IGFuIGVtcHR5IHNoYWRvdy4gKi9cXG4rXFx0XFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdyxcXG4rXFx0XFx0XFx0XFx0XFx0IF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XFxuK1xcdFxcdH1cXG4gXFx0fSB3aGlsZSAoKytjaV9vZmYgXFx1MDAzYyBjaV9lbmQpO1xcbiBcXG4gXFx0Zm9saW8tXFx1MDAzZXN3YXAudmFsID0gMDtcXG5AQCAtMjg4LDcgKzM0MywxNCBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuIFxcdH0gZWxzZSBpZiAobmVlZF9mcmVlKSB7XFxuIFxcdFxcdGNpX29mZiA9IGNpX3N0YXJ0O1xcbiBcXHRcXHRkbyB7XFxuLVxcdFxcdFxcdGlmICghX19zd3BfdGJfZ2V0X2NvdW50KF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpKVxcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHRiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcXG4rXFx0XFx0XFx0dW5zaWduZWQgY2hhciBjbnQ7XFxuK1xcbitcXHRcXHRcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIodGIpKVxcbitcXHRcXHRcXHRcXHRjbnQgPSB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHRiKTtcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRjbnQgPSBfX3N3cF90Yl9nZXRfY291bnQodGIpO1xcbitcXHRcXHRcXHRpZiAoIWNudClcXG4gXFx0XFx0XFx0XFx0X19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHNpLCBjaSwgY2lfb2ZmLCAxKTtcXG4gXFx0XFx0fSB3aGlsZSAoKytjaV9vZmYgXFx1MDAzYyBjaV9lbmQpO1xcbiBcXHR9XFxuQEAgLTQwMyw3ICs0NjUsOCBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKl9fc3dhcF9jYWNoZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXHRcXHRcXHRcXHRcXHRzd3BfZW50cnlfdCB0YXJnX2VudHJ5LCBnZnBfdCBnZnAsXFxuIFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IHZtX2ZhdWx0ICp2bWYsXFxuLVxcdFxcdFxcdFxcdFxcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KVxcbitcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCxcXG4rXFx0XFx0XFx0XFx0XFx0dm9pZCAqKnplbnRyeSlcXG4ge1xcbiBcXHRpbnQgZXJyO1xcbiBcXHRzd3BfZW50cnlfdCBlbnRyeTtcXG5AQCAtNDUwLDcgKzUxMyw3IEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKl9fc3dhcF9jYWNoZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXG4gXFx0X19mb2xpb19zZXRfbG9ja2VkKGZvbGlvKTtcXG4gXFx0X19mb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7XFxuLVxcdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSk7XFxuK1xcdF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oY2ksIGZvbGlvLCBlbnRyeSwgemVudHJ5KTtcXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4gXFxuIFxcdGlmIChtZW1fY2dyb3VwX3N3YXBpbl9jaGFyZ2VfZm9saW8oZm9saW8sIG1lbWNnX2lkLFxcbkBAIC01MDcsNyArNTcwLDggQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuICAqL1xcbiBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfYWxsb2NfZm9saW8oc3dwX2VudHJ5X3QgdGFyZ19lbnRyeSwgZ2ZwX3QgZ2ZwLFxcbiBcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgb3JkZXJzLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZixcXG4tXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseClcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCxcXG4rXFx0XFx0XFx0XFx0ICAgICB2b2lkICoqemVudHJ5KVxcbiB7XFxuIFxcdGludCBvcmRlciwgZXJyO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKnJldDtcXG5AQCAtNTIwLDkgKzU4NCwxMiBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfYWxsb2NfZm9saW8oc3dwX2VudHJ5X3QgdGFyZ19lbnRyeSwgZ2ZwX3QgZ2ZwLFxcbiBcXHRpZiAoV0FSTl9PTl9PTkNFKCFvcmRlcnMgfHwgKDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcikgXFx1MDAzZSBTV0FQRklMRV9DTFVTVEVSKSlcXG4gXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbitcXHRpZiAoemVudHJ5KVxcbitcXHRcXHQqemVudHJ5ID0gTlVMTDtcXG4rXFxuIFxcdGRvIHtcXG4gXFx0XFx0cmV0ID0gX19zd2FwX2NhY2hlX2FsbG9jKGNpLCB0YXJnX2VudHJ5LCBnZnAsIG9yZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHQgdm1mLCBtcG9sLCBpbHgpO1xcbitcXHRcXHRcXHRcXHRcXHQgdm1mLCBtcG9sLCBpbHgsIHplbnRyeSk7XFxuIFxcdFxcdGlmICghSVNfRVJSKHJldCkpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRlcnIgPSBQVFJfRVJSKHJldCk7XFxuQEAgLTYzOCwxOCArNzA1LDIwIEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKnN3YXBfY2FjaGVfcmVhZF9mb2xpbyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLFxcbiBcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1ZywgYm9vbCByZWFkYWhlYWQpXFxuIHtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4rXFx0dm9pZCAqemVudHJ5O1xcbiBcXG4gXFx0ZG8ge1xcbiBcXHRcXHRmb2xpbyA9IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKGVudHJ5KTtcXG4gXFx0XFx0aWYgKGZvbGlvKVxcbiBcXHRcXHRcXHRyZXR1cm4gZm9saW87XFxuLVxcdFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhlbnRyeSwgZ2ZwLCBCSVQoMCksIE5VTEwsIG1wb2wsIGlseCk7XFxuK1xcdFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhlbnRyeSwgZ2ZwLCBCSVQoMCksIE5VTEwsIG1wb2wsIGlseCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZ6ZW50cnkpO1xcbiBcXHR9IHdoaWxlIChQVFJfRVJSKGZvbGlvKSA9PSAtRUVYSVNUKTtcXG4gXFxuIFxcdGlmIChJU19FUlJfT1JfTlVMTChmb2xpbykpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4tXFx0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnKTtcXG4rXFx0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBwbHVnLCB6ZW50cnkpO1xcbiBcXHRpZiAocmVhZGFoZWFkKSB7XFxuIFxcdFxcdGZvbGlvX3NldF9yZWFkYWhlYWQoZm9saW8pO1xcbiBcXHRcXHRjb3VudF92bV9ldmVudChTV0FQX1JBKTtcXG5AQCAtNjc4LDE4ICs3NDcsMjAgQEAgc3RydWN0IGZvbGlvICpzd2FwaW5fc3luYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBsb25nIG9yZGVycyxcXG4gXFx0XFx0XFx0ICAgc3RydWN0IHZtX2ZhdWx0ICp2bWYsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4KVxcbiB7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuK1xcdHZvaWQgKnplbnRyeTtcXG4gXFxuIFxcdGRvIHtcXG4gXFx0XFx0Zm9saW8gPSBzd2FwX2NhY2hlX2dldF9mb2xpbyhlbnRyeSk7XFxuIFxcdFxcdGlmIChmb2xpbylcXG4gXFx0XFx0XFx0cmV0dXJuIGZvbGlvO1xcbi1cXHRcXHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCk7XFxuK1xcdFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhlbnRyeSwgZ2ZwLCBvcmRlcnMsIHZtZiwgbXBvbCwgaWx4LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNnplbnRyeSk7XFxuIFxcdH0gd2hpbGUgKFBUUl9FUlIoZm9saW8pID09IC1FRVhJU1QpO1xcbiBcXG4gXFx0aWYgKElTX0VSUihmb2xpbykpXFxuIFxcdFxcdHJldHVybiBmb2xpbztcXG4gXFxuLVxcdHN3YXBfcmVhZF9mb2xpbyhmb2xpbywgTlVMTCk7XFxuK1xcdHN3YXBfcmVhZF9mb2xpbyhmb2xpbywgTlVMTCwgemVudHJ5KTtcXG4gXFx0cmV0dXJuIGZvbGlvO1xcbiB9XFxuIFxcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3RhYmxlLmggYi9tbS9zd2FwX3RhYmxlLmhcXG5pbmRleCBlNjYxM2U2MmY4ZDBmNi4uNjMxOGJmOGFhNzZiMGMgMTAwNjQ0XFxuLS0tIGEvbW0vc3dhcF90YWJsZS5oXFxuKysrIGIvbW0vc3dhcF90YWJsZS5oXFxuQEAgLTI4LDcgKzI4LDcgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUge1xcbiAgKiBOVUxMOiAgICAgfC0tLS0tLS0tLS0tLS0tLS0gMCAtLS0tLS0tLS0tLS0tLS18IC0gRnJlZSBzbG90XFxuICAqIFNoYWRvdzogICB8U1dBUF9DT1VOVHxafC0tLS0gU0hBRE9XX1ZBTCAtLS18MXwgLSBTd2FwcGVkIG91dCBzbG90XFxuICAqIFBGTjogICAgICB8U1dBUF9DT1VOVHxafC0tLS0tLSBQRk4gLS0tLS0tLXwxMHwgLSBDYWNoZWQgc2xvdFxcbi0gKiBQb2ludGVyOiAgfC0tLS0tLS0tLS0tIFBvaW50ZXIgLS0tLS0tLS0tLXwxMDB8IC0gKFVudXNlZClcXG4rICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIFpzd2FwIGNvbXByZXNzZWQgZW50cnlcXG4gICogQmFkOiAgICAgIHwtLS0tLS0tLS0tLS0tIDEgLS0tLS0tLS0tLS0tLXwxMDAwfCAtIEJhZCBzbG90XFxuICAqXFxuICAqIENPVU5UIGlzIGBTV1BfVEJfQ09VTlRfQklUU2AgbG9uZywgWiBpcyB0aGUgYFNXUF9UQl9aRVJPX0ZMQUdgIGJpdCxcXG5AQCAtNDksOSArNDksMTEgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUge1xcbiAgKiAtIFBGTjogU3dhcCBzbG90IGlzIGluIHVzZSwgYW5kIGNhY2hlZC4gTWVtY2cgaW5mbyBpcyByZWNvcmRlZCBvbiB0aGUgcGFnZVxcbiAgKiAgIHN0cnVjdC5cXG4gICpcXG4tICogLSBQb2ludGVyOiBVbnVzZWQgeWV0LiBgMGIxMDBgIGlzIHJlc2VydmVkIGZvciBwb3RlbnRpYWwgcG9pbnRlciB1c2FnZVxcbi0gKiAgIGJlY2F1c2Ugb25seSB0aGUgbG93ZXIgdGhyZWUgYml0cyBjYW4gYmUgdXNlZCBhcyBhIG1hcmtlciBmb3IgOCBieXRlc1xcbi0gKiAgIGFsaWduZWQgcG9pbnRlcnMuXFxuKyAqIC0gUG9pbnRlcjogU3RvcmVzIGEgZGlyZWN0IHBvaW50ZXIgdG8gYSB6c3dhcF9lbnRyeSB3aGVuIHRoZSBzd2FwIHNsb3Qnc1xcbisgKiAgIGNvbXByZXNzZWQgZGF0YSByZXNpZGVzIGluIHpzd2FwLiBUaGUgc3dhcCBjb3VudCAoaWYgYW55KSBpcyBzdG9yZWQgaW5cXG4rICogICB0aGUgenN3YXBfZW50cnkgc3RydWN0IHJhdGhlciB0aGFuIGlubGluZSwgc2luY2UgdGhlIHBvaW50ZXIgb2NjdXBpZXNcXG4rICogICBhbGwgdXBwZXIgYml0cy4gYDBiMTAwYCBpcyB1c2VkIGFzIHRoZSBtYXJrZXIgYmVjYXVzZSB6c3dhcF9lbnRyeVxcbisgKiAgIHBvaW50ZXJzIGFyZSBhdCBsZWFzdCA4LWJ5dGUgYWxpZ25lZCwgbGVhdmluZyB0aGUgbG93ZXIgdGhyZWUgYml0cyBmcmVlLlxcbiAgKlxcbiAgKiAtIEJhZDogU3dhcCBzbG90IGlzIHJlc2VydmVkLCBwcm90ZWN0cyBzd2FwIGhlYWRlciBvciBob2xlcyBvbiBzd2FwIGRldmljZXMuXFxuICAqL1xcbkBAIC03OCw2ICs4MCw5IEBAIHN0cnVjdCBzd2FwX21lbWNnX3RhYmxlIHtcXG4gLyogVGhlIGZpcnN0IGZsYWcgaXMgemVybyBiaXQgKFNXQVBfVEFCTEVfSEFTX1pFUk9GTEFHKSAqL1xcbiAjZGVmaW5lIFNXUF9UQl9aRVJPX0ZMQUdcXHRCSVQoQklUU19QRVJfTE9ORyAtIFNXUF9UQl9GTEFHU19CSVRTKVxcbiBcXG4rLyogUG9pbnRlcjogenN3YXBfZW50cnkgcG9pbnRlciBzdG9yZWQgZGlyZWN0bHksIGVuZHMgd2l0aCAwYjEwMCAqL1xcbisjZGVmaW5lIFNXUF9UQl9QT0lOVEVSX01BUktcXHQwYjEwMFVMXFxuK1xcbiAvKiBCYWQgc2xvdDogZW5kcyB3aXRoIDBiMTAwMCBhbmQgcmVzdHMgb2YgYml0cyBhcmUgYWxsIDEgKi9cXG4gI2RlZmluZSBTV1BfVEJfQkFEXFx0XFx0KCh+MFVMKSBcXHUwMDNjXFx1MDAzYyAzKVxcbiBcXG5AQCAtMTY2LDYgKzE3MSwxMSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX2JhZCh1bnNpZ25lZCBsb25nIHN3cF90YilcXG4gXFx0cmV0dXJuIHN3cF90YiA9PSBTV1BfVEJfQkFEO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX3BvaW50ZXIodW5zaWduZWQgbG9uZyBzd3BfdGIpXFxuK3tcXG4rXFx0cmV0dXJuIChzd3BfdGIgXFx1MDAyNiAoQklUKDMpIC0gMSkpID09IFNXUF9UQl9QT0lOVEVSX01BUks7XFxuK31cXG4rXFxuIHN0YXRpYyBpbmxpbmUgYm9vbCBzd3BfdGJfaXNfY291bnRhYmxlKHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbiB7XFxuIFxcdHJldHVybiAoc3dwX3RiX2lzX3NoYWRvdyhzd3BfdGIpIHx8IHN3cF90Yl9pc19mb2xpbyhzd3BfdGIpIHx8XFxuQEAgLTE4OCw2ICsxOTgsMjMgQEAgc3RhdGljIGlubGluZSB2b2lkICpzd3BfdGJfdG9fc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxcbiBcXHRyZXR1cm4gKHZvaWQgKikoc3dwX3RiIFxcdTAwMjYgflNXUF9UQl9GTEFHU19NQVNLKTtcXG4gfVxcbiBcXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvaW50ZXJfdG9fc3dwX3RiKHZvaWQgKnB0cilcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHZhbCA9ICh1bnNpZ25lZCBsb25nKXB0cjtcXG4rXFxuK1xcdEJVSUxEX0JVR19PTihzaXplb2YodW5zaWduZWQgbG9uZykgIT0gc2l6ZW9mKHZvaWQgKikpO1xcbitcXHQvKiBQb2ludGVycyBhcmUgOC1ieXRlIGFsaWduZWQsIGxvdyAzIGJpdHMgbXVzdCBiZSBjbGVhciAqL1xcbitcXHRWTV9XQVJOX09OX09OQ0UodmFsIFxcdTAwMjYgKEJJVCgzKSAtIDEpKTtcXG4rXFx0cmV0dXJuIHZhbCB8IFNXUF9UQl9QT0lOVEVSX01BUks7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3dwX3RiX3RvX3BvaW50ZXIodW5zaWduZWQgbG9uZyBzd3BfdGIpXFxuK3tcXG4rXFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSk7XFxuK1xcdC8qIENsZWFyIHRoZSBsb3cgMy1iaXQgbWFya2VyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi9cXG4rXFx0cmV0dXJuICh2b2lkICopKHN3cF90YiBcXHUwMDI2IH4oKHVuc2lnbmVkIGxvbmcpKEJJVCgzKSAtIDEpKSk7XFxuK31cXG4rXFxuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpXFxuIHtcXG4gXFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKTtcXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmNcXG5pbmRleCBhNjAyZTU4MjA1MTNhOC4uMTg5MjVlNDYyNTcxYjEgMTAwNjQ0XFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xcbisrKyBiL21tL3N3YXBmaWxlLmNcXG5AQCAtOTM1LDcgKzkzNSw4IEBAIHN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRucl9wYWdlcyA9IDEgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuIFxcdFxcdHN3YXBfY2x1c3Rlcl9hc3NlcnRfZW1wdHkoY2ksIGNpX29mZiwgbnJfcGFnZXMsIGZhbHNlKTtcXG4gXFx0XFx0X19zd2FwX2NhY2hlX2FkZF9mb2xpbyhjaSwgZm9saW8sIHN3cF9lbnRyeShzaS1cXHUwMDNldHlwZSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGNpX29mZiArIGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSkpKTtcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGNpX29mZiArIGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSkpLFxcbitcXHRcXHRcXHRcXHQgICAgICAgTlVMTCk7XFxuIFxcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfSElCRVJOQVRJT04pKSB7XFxuIFxcdFxcdG9yZGVyID0gMDtcXG4gXFx0XFx0bnJfcGFnZXMgPSAxO1xcbkBAIC0xNTM2LDI1ICsxNTM3LDUxIEBAIHN0YXRpYyB2b2lkIF9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXG4gXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2Y2ktXFx1MDAzZWxvY2spO1xcbiBcXHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xcbitcXG4rXFx0LyogUG9pbnRlciBlbnRyaWVzIHN0b3JlIGNvdW50IGluIHRoZSB6c3dhcF9lbnRyeSBzdHJ1Y3QgKi9cXG4rXFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcXG4rXFx0XFx0enN3YXBfc3dwX3RiX3B1dF9jb3VudChzd3BfdGIsIGNpLCBjaV9vZmYpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuIFxcdGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KHN3cF90Yik7XFxuIFxcbiBcXHRWTV9XQVJOX09OX09OQ0UoY291bnQgXFx1MDAzYz0gMCk7XFxuIFxcdFZNX1dBUk5fT05fT05DRShjb3VudCBcXHUwMDNlIFNXUF9UQl9DT1VOVF9NQVgpO1xcbi1cXG4tXFx0aWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHtcXG4tXFx0XFx0Y291bnQgPSBjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XFxuLVxcdFxcdC8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi9cXG4tXFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFxcdTAwM2MgU1dQX1RCX0NPVU5UX01BWCk7XFxuLVxcdFxcdGNvdW50LS07XFxuLVxcdFxcdGlmIChjb3VudCA9PSAoU1dQX1RCX0NPVU5UX01BWCAtIDEpKSB7XFxuLVxcdFxcdFxcdGNpLVxcdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IDA7XFxuLVxcdFxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgX19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xcbitcXHRcXHRpZiAoY291bnQgPT0gU1dQX1RCX0NPVU5UX01BWCkge1xcbitcXHRcXHRcXHRpZiAoIWNpLVxcdTAwM2VleHRlbmRfdGFibGUpIHtcXG4rXFx0XFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0XFx0ICogTUFYIHdpdGhvdXQgZXh0ZW5kX3RhYmxlOiBNQVggaXMgdGhlIHJlYWxcXG4rXFx0XFx0XFx0XFx0ICogY291bnQuICBEZWNyZW1lbnQgYW5kIHdyaXRlIGJhY2sgaW5saW5lLlxcbitcXHRcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0XFx0Y291bnQtLTtcXG4rXFx0XFx0XFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxcbitcXHRcXHRcXHRcXHRcXHRfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7XFxuK1xcdFxcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdFxcdCAqIE1BWCB3aXRoIGV4dGVuZF90YWJsZTogcmVhbCBjb3VudCBsaXZlcyBpblxcbitcXHRcXHRcXHRcXHQgKiBjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0uICBQdWxsLCBkZWNyZW1lbnRcXG4rXFx0XFx0XFx0XFx0ICogaXQsIGFuZCBlaXRoZXIgbW92ZSBpdCBiYWNrIGlubGluZSAoaWYgbm93XFxuK1xcdFxcdFxcdFxcdCAqIGZpdHMpIG9yIHdyaXRlIGl0IGJhY2sgdG8gdGhlIGV4dGVuZCB0YWJsZS5cXG4rXFx0XFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdFxcdGNvdW50ID0gY2ktXFx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xcbitcXHRcXHRcXHRcXHQvKiBPdmVyZmxvdyBzdGFydHMgd2l0aCBTV1BfVEJfQ09VTlRfTUFYICovXFxuK1xcdFxcdFxcdFxcdFZNX1dBUk5fT05fT05DRShjb3VudCBcXHUwMDNjIFNXUF9UQl9DT1VOVF9NQVgpO1xcbitcXHRcXHRcXHRcXHRjb3VudC0tO1xcbitcXHRcXHRcXHRcXHRpZiAoY291bnQgPT0gKFNXUF9UQl9DT1VOVF9NQVggLSAxKSkge1xcbitcXHRcXHRcXHRcXHRcXHRjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwO1xcbitcXHRcXHRcXHRcXHRcXHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdF9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgY291bnQpKTtcXG4rXFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0XFx0XFx0Y2ktXFx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0fVxcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcXG4rXFx0XFx0XFx0LyogY291bnQgXFx1MDAzYyBNQVg6IHNpbXBsZSBpbmxpbmUgZGVjcmVtZW50ICovXFxuK1xcdFxcdFxcdGNvdW50LS07XFxuK1xcdFxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZixcXG4rXFx0XFx0XFx0XFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xcbiBcXHRcXHR9XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgX19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCAtLWNvdW50KSk7XFxuLVxcdH1cXG4gXFxuIFxcdC8qXFxuIFxcdCAqIGBTV1BfVEJfQ09VTlRfTUFYIC0gMWAgdHJpZ2dlcnMgZXh0ZW5kIHRhYmxlIGFsbG9jYXRpb24uIElmIHRoZVxcbkBAIC0xNTk2LDcgKzE2MjMsMTggQEAgc3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0Y2lfZW5kID0gY2lfb2ZmICsgbnI7XFxuIFxcdGRvIHtcXG4gXFx0XFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcXG4tXFx0XFx0aWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFBvaW50ZXIgZW50cmllcyBzdG9yZSBjb3VudCBpbiB0aGUgenN3YXBfZW50cnk7XFxuK1xcdFxcdCAqIGhhbmRsZSB0aGVtIGJlZm9yZSBzd3BfdGJfZ2V0X2NvdW50ICh3aGljaCByZXR1cm5zXFxuK1xcdFxcdCAqIC1FSU5WQUwgZm9yIG5vbi1jb3VudGFibGUgdHlwZXMpLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcXG4rXFx0XFx0XFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XFxuK1xcdFxcdFxcdFxcdGlmIChjaV9iYXRjaCA9PSAtMSlcXG4rXFx0XFx0XFx0XFx0XFx0Y2lfYmF0Y2ggPSBjaV9vZmY7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH0gZWxzZSBpZiAoc3dwX3RiX2dldF9jb3VudChzd3BfdGIpID09IDEpIHtcXG4gXFx0XFx0XFx0LyogY291bnQgPT0gMSBhbmQgbm9uLWNhY2hlZCBzbG90cyB3aWxsIGJlIGJhdGNoIGZyZWVkLiAqL1xcbiBcXHRcXHRcXHRpZiAoIXN3cF90Yl9pc19mb2xpbyhzd3BfdGIpKSB7XFxuIFxcdFxcdFxcdFxcdGlmIChjaV9iYXRjaCA9PSAtMSlcXG5AQCAtMTY0Nyw2ICsxNjg1LDExIEBAIHN0YXRpYyBpbnQgX19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5KHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuIFxcdC8qIEJhZCBvciBzcGVjaWFsIHNsb3RzIGNhbid0IGJlIGhhbmRsZWQgKi9cXG4gXFx0aWYgKFdBUk5fT05fT05DRShzd3BfdGJfaXNfYmFkKHN3cF90YikpKVxcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qIFBvaW50ZXIgZW50cmllcyBzdG9yZSBjb3VudCBpbiB0aGUgenN3YXBfZW50cnkgc3RydWN0ICovXFxuK1xcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxcbitcXHRcXHRyZXR1cm4genN3YXBfc3dwX3RiX2R1cF9jb3VudChzd3BfdGIsIGNpLCBjaV9vZmYpO1xcbitcXG4gXFx0Y291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcXG4gXFx0LyogTXVzdCBiZSBlaXRoZXIgY2FjaGVkIG9yIGhhdmUgYSBjb3VudCBhbHJlYWR5ICovXFxuIFxcdGlmIChXQVJOX09OX09OQ0UoIWNvdW50IFxcdTAwMjZcXHUwMDI2ICFzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSkpXFxuQEAgLTE5MjMsMTMgKzE5NjYsMjYgQEAgdm9pZCBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRvbGRfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBGcmVlaW5nIGlzIGRvbmUgYWZ0ZXIgcmVsZWFzZSBvZiB0aGUgbGFzdCBzd2FwIGNvdW50XFxuLVxcdFxcdCAqIHJlZiwgb3IgYWZ0ZXIgc3dhcCBjYWNoZSBpcyBkcm9wcGVkXFxuK1xcdFxcdCAqIHJlZiwgb3IgYWZ0ZXIgc3dhcCBjYWNoZSBpcyBkcm9wcGVkLiBBIFBvaW50ZXIgZW50cnlcXG4rXFx0XFx0ICogbWVhbnMgenN3YXAgaGFzIGEgY29tcHJlc3NlZCBjb3B5OyB0aGUgeGFycmF5IHN0aWxsXFxuK1xcdFxcdCAqIGhvbGRzIHRoZSBlbnRyeSBhbmQgenN3YXBfaW52YWxpZGF0ZSB3aWxsIGZyZWUgaXQuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRWTV9XQVJOX09OKCFzd3BfdGJfaXNfc2hhZG93KG9sZF90YikgfHwgX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikgXFx1MDAzZSAxKTtcXG4rXFx0XFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpIHtcXG4rXFx0XFx0XFx0Vk1fV0FSTl9PTih6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikgXFx1MDAzZSAxKTtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogRnJlZSB0aGUgenN3YXAgZW50cnkgbm93IHVuZGVyIGNpLVxcdTAwM2Vsb2NrIHdoaWxlXFxuK1xcdFxcdFxcdCAqIHRoZSBQb2ludGVyIGlzIHN0aWxsIGluIHRoZSBzd2FwIHRhYmxlLiAgT25jZVxcbitcXHRcXHRcXHQgKiB3ZSBudWxsIHRoZSBzbG90LCB0aGUgZW50cnkgd291bGQgYmUgbGVha2VkLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0enN3YXBfZW50cnlfZnJlZShzd3BfdGJfdG9fcG9pbnRlcihvbGRfdGIpKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpIHx8XFxuK1xcdFxcdFxcdFxcdCAgIF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpIFxcdTAwM2UgMSk7XFxuK1xcdFxcdH1cXG4gXFxuIFxcdFxcdC8qIFJlc2V0dGluZyB0aGUgc2xvdCB0byBOVUxMIGFsc28gY2xlYXJzIHRoZSBpbmxpbmUgZmxhZ3MuICovXFxuIFxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgbnVsbF90b19zd3BfdGIoKSk7XFxuLVxcdFxcdGlmICghU1dBUF9UQUJMRV9IQVNfWkVST0ZMQUcpXFxuK1xcdFxcdGlmICghU1dBUF9UQUJMRV9IQVNfWkVST0ZMQUcgXFx1MDAyNlxcdTAwMjYgIXN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXFxuIFxcdFxcdFxcdF9fc3dhcF90YWJsZV9jbGVhcl96ZXJvKGNpLCBjaV9vZmYpO1xcbiBcXG4gXFx0XFx0LypcXG5AQCAtMTk2MSw4ICsyMDE3LDExIEBAIGludCBfX3N3YXBfY291bnQoc3dwX2VudHJ5X3QgZW50cnkpXFxuIHtcXG4gXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IF9fc3dhcF9lbnRyeV90b19jbHVzdGVyKGVudHJ5KTtcXG4gXFx0dW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcXG4gXFxuLVxcdHJldHVybiBzd3BfdGJfZ2V0X2NvdW50KF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpO1xcbitcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSlcXG4rXFx0XFx0cmV0dXJuIHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcXG4rXFx0cmV0dXJuIHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTE5ODAsNiArMjAzOSw4IEBAIGJvb2wgc3dhcF9lbnRyeV9zd2FwcGVkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3dwX2VudHJ5X3QgZW50cnkpXFxuIFxcdHN3cF90YiA9IHN3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTtcXG4gXFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XFxuIFxcbitcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSlcXG4rXFx0XFx0cmV0dXJuIHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcXHUwMDNlIDA7XFxuIFxcdHJldHVybiBzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXFx1MDAzZSAwO1xcbiB9XFxuIFxcbkBAIC0yMDIwLDcgKzIwODEsNyBAQCBpbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSlcXG4gICpcXG4gICogQ29udGV4dDogQ2FsbGVyIG11c3QgZW5zdXJlIHRoZSBmb2xpbyBpcyBsb2NrZWQgYW5kIGluIHRoZSBzd2FwIGNhY2hlLlxcbiAgKi9cXG4tc3RhdGljIGJvb2wgZm9saW9fbWF5YmVfc3dhcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbitib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4ge1xcbiBcXHRzd3BfZW50cnlfdCBlbnRyeSA9IGZvbGlvLVxcdTAwM2Vzd2FwO1xcbiBcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xcbkBAIC0yNTU2LDggKzI2MTcsMTIgQEAgc3RhdGljIGludCB1bnVzZV9wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxuIFxcdFxcdGlmICghZm9saW8pIHtcXG4gXFx0XFx0XFx0c3dwX3RiID0gc3dhcF90YWJsZV9nZXQoX19zd2FwX2VudHJ5X3RvX2NsdXN0ZXIoZW50cnkpLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRzd3BfY2x1c3Rlcl9vZmZzZXQoZW50cnkpKTtcXG4tXFx0XFx0XFx0aWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcXHUwMDNjPSAwKVxcbitcXHRcXHRcXHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkge1xcbitcXHRcXHRcXHRcXHRpZiAoenN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpIFxcdTAwM2M9IDApXFxuK1xcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9IGVsc2UgaWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcXHUwMDNjPSAwKSB7XFxuIFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiBcXHRcXHR9XFxuIFxcbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xcbmluZGV4IDc2MWNkNjk5ZTBhM2U2Li5mOTc2MmQwYTU5NmFiNCAxMDA2NDRcXG4tLS0gYS9tbS96c3dhcC5jXFxuKysrIGIvbW0venN3YXAuY1xcbkBAIC0zOCw2ICszOCw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC96c21hbGxvYy5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcInN3YXAuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInN3YXBfdGFibGUuaFxcXCJcXG4gI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuIFxcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXFxuQEAgLTE4Miw2ICsxODMsMTAgQEAgc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqenN3YXBfc2hyaW5rZXI7XFxuICAqICAgICAgICAgICAgICB3cml0ZWJhY2sgbG9naWMuIFRoZSBlbnRyeSBpcyBvbmx5IHJlY2xhaW1lZCBieSB0aGUgd3JpdGViYWNrXFxuICAqICAgICAgICAgICAgICBsb2dpYyBpZiByZWZlcmVuY2VkIGlzIHVuc2V0LiBTZWUgY29tbWVudHMgaW4gdGhlIHNocmlua2VyXFxuICAqICAgICAgICAgICAgICBzZWN0aW9uIGZvciBjb250ZXh0LlxcbisgKiBzd3BfdGJfdmFsIC0gdGhlIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgc2F2ZWQgd2hlbiB0aGlzIHpzd2FwX2VudHJ5XFxuKyAqICAgICAgICAgICAgICByZXBsYWNlZCBhIFNoYWRvdyBvciBQRk4gZW50cnkuIEl0IHByZXNlcnZlcyB0aGUgc3dhcCBjb3VudCxcXG4rICogICAgICAgICAgICAgIHplcm8gZmxhZywgYW5kIHdvcmtpbmcgc2V0IHNoYWRvdyBpbmZvcm1hdGlvbiAoU0hBRE9XX1ZBTClcXG4rICogICAgICAgICAgICAgIHRoYXQgdGhlIFNoYWRvdyBlbnRyeSBjYXJyaWVkLlxcbiAgKiBwb29sIC0gdGhlIHpzd2FwX3Bvb2wgdGhlIGVudHJ5J3MgZGF0YSBpcyBpblxcbiAgKiBoYW5kbGUgLSB6c21hbGxvYyBhbGxvY2F0aW9uIGhhbmRsZSB0aGF0IHN0b3JlcyB0aGUgY29tcHJlc3NlZCBwYWdlIGRhdGFcXG4gICogb2JqY2cgLSB0aGUgb2JqX2Nncm91cCB0aGF0IHRoZSBjb21wcmVzc2VkIG1lbW9yeSBpcyBjaGFyZ2VkIHRvXFxuQEAgLTE5MSwxNSArMTk2LDEzIEBAIHN0cnVjdCB6c3dhcF9lbnRyeSB7XFxuIFxcdHN3cF9lbnRyeV90IHN3cGVudHJ5O1xcbiBcXHR1bnNpZ25lZCBpbnQgbGVuZ3RoO1xcbiBcXHRib29sIHJlZmVyZW5jZWQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3dwX3RiX3ZhbDtcXG4gXFx0c3RydWN0IHpzd2FwX3Bvb2wgKnBvb2w7XFxuIFxcdHVuc2lnbmVkIGxvbmcgaGFuZGxlO1xcbiBcXHRzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2c7XFxuIFxcdHN0cnVjdCBsaXN0X2hlYWQgbHJ1O1xcbiB9O1xcbiBcXG4tc3RhdGljIHN0cnVjdCB4YXJyYXkgKnpzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdO1xcbi1zdGF0aWMgdW5zaWduZWQgaW50IG5yX3pzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdO1xcbi1cXG4gLyogUkNVLXByb3RlY3RlZCBpdGVyYXRpb24gKi9cXG4gc3RhdGljIExJU1RfSEVBRCh6c3dhcF9wb29scyk7XFxuIC8qIHByb3RlY3RzIHpzd2FwX3Bvb2xzIGxpc3QgbW9kaWZpY2F0aW9uICovXFxuQEAgLTIyNSwxNSArMjI4LDYgQEAgc3RhdGljIGJvb2wgenN3YXBfaGFzX3Bvb2w7XFxuICogaGVscGVycyBhbmQgZndkIGRlY2xhcmF0aW9uc1xcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xcbiBcXG4tLyogT25lIHN3YXAgYWRkcmVzcyBzcGFjZSBmb3IgZWFjaCA2NE0gc3dhcCBzcGFjZSAqL1xcbi0jZGVmaW5lIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQgMTRcXG4tI2RlZmluZSBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTICgxIFxcdTAwM2NcXHUwMDNjIFpTV0FQX0FERFJFU1NfU1BBQ0VfU0hJRlQpXFxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHhhcnJheSAqc3dhcF96c3dhcF90cmVlKHN3cF9lbnRyeV90IHN3cClcXG4te1xcbi1cXHRyZXR1cm4gXFx1MDAyNnpzd2FwX3RyZWVzW3N3cF90eXBlKHN3cCldW3N3cF9vZmZzZXQoc3dwKVxcbi1cXHRcXHRcXHUwMDNlXFx1MDAzZSBaU1dBUF9BRERSRVNTX1NQQUNFX1NISUZUXTtcXG4tfVxcbi1cXG4gI2RlZmluZSB6c3dhcF9wb29sX2RlYnVnKG1zZywgcClcXHRcXHRcXHRcXFxcXFxuIFxcdHByX2RlYnVnKFxcXCIlcyBwb29sICVzXFxcXG5cXFwiLCBtc2csIChwKS1cXHUwMDNldGZtX25hbWUpXFxuIFxcbkBAIC03NjIsNyArNzU2LDcgQEAgc3RhdGljIHZvaWQgenN3YXBfZW50cnlfY2FjaGVfZnJlZShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5KVxcbiAgKiBDYXJyaWVzIG91dCB0aGUgY29tbW9uIHBhdHRlcm4gb2YgZnJlZWluZyBhbiBlbnRyeSdzIHpzbWFsbG9jIGFsbG9jYXRpb24sXFxuICAqIGZyZWVpbmcgdGhlIGVudHJ5IGl0c2VsZiwgYW5kIGRlY3JlbWVudGluZyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBwYWdlcy5cXG4gICovXFxuLXN0YXRpYyB2b2lkIHpzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSlcXG4rdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXFxuIHtcXG4gXFx0enN3YXBfbHJ1X2RlbChcXHUwMDI2enN3YXBfbGlzdF9scnUsIGVudHJ5KTtcXG4gXFx0enNfZnJlZShlbnRyeS1cXHUwMDNlcG9vbC1cXHUwMDNlenNfcG9vbCwgZW50cnktXFx1MDAzZWhhbmRsZSk7XFxuQEAgLTk4NywxMSArOTgxLDEyIEBAIHN0YXRpYyBib29sIHpzd2FwX2RlY29tcHJlc3Moc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4gc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSxcXG4gXFx0XFx0XFx0XFx0IHN3cF9lbnRyeV90IHN3cGVudHJ5KVxcbiB7XFxuLVxcdHN0cnVjdCB4YXJyYXkgKnRyZWU7XFxuIFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3BlbnRyeSk7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuIFxcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2w7XFxuIFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4rXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4rXFx0dW5zaWduZWQgbG9uZyBzd3BfdGI7XFxuIFxcdGludCByZXQgPSAwO1xcbiBcXG4gXFx0LyogdHJ5IHRvIGFsbG9jYXRlIHN3YXAgY2FjaGUgZm9saW8gKi9cXG5AQCAtOTk5LDkgKzk5NCwyNSBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LFxcbiBcXHRpZiAoIXNpKVxcbiBcXHRcXHRyZXR1cm4gLUVFWElTVDtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFZlcmlmeSB0aGUgc3dhcCB0YWJsZSBQb2ludGVyIGVudHJ5IHN0aWxsIHJlZmVyZW5jZXMgdGhpc1xcbitcXHQgKiB6c3dhcF9lbnRyeS4gSWYgdGhlIGVudHJ5IHdhcyBpbnZhbGlkYXRlZCBvciByZXBsYWNlZCBieSBhXFxuK1xcdCAqIGNvbmN1cnJlbnQgc3RvcmUsIHRoZSBQb2ludGVyIHdpbGwgYmUgZ29uZSBvciBwb2ludCBlbHNld2hlcmUuXFxuK1xcdCAqL1xcbitcXHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgb2Zmc2V0KTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuK1xcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xcbitcXHRpZiAoIXN3cF90Yl9pc19wb2ludGVyKHN3cF90YikgfHxcXG4rXFx0ICAgIHN3cF90Yl90b19wb2ludGVyKHN3cF90YikgIT0gZW50cnkpIHtcXG4rXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFx0XFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdH1cXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFxuIFxcdG1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7XFxuIFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLFxcbi1cXHRcXHRcXHRcXHQgICAgICAgTk9fSU5URVJMRUFWRV9JTkRFWCk7XFxuK1xcdFxcdFxcdFxcdCAgICAgICBOT19JTlRFUkxFQVZFX0lOREVYLCBOVUxMKTtcXG4gXFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4gXFxuIFxcdC8qXFxuQEAgLTEwMTUsMjcgKzEwMjYsMTUgQEAgc3RhdGljIGludCB6c3dhcF93cml0ZWJhY2tfZW50cnkoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSxcXG4gXFx0XFx0cmV0dXJuIFBUUl9FUlIoZm9saW8pO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogZm9saW8gaXMgbG9ja2VkLCBhbmQgdGhlIHN3YXBjYWNoZSBpcyBub3cgc2VjdXJlZCBhZ2FpbnN0XFxuLVxcdCAqIGNvbmN1cnJlbnQgc3dhcHBpbmcgdG8gYW5kIGZyb20gdGhlIHNsb3QsIGFuZCBjb25jdXJyZW50XFxuLVxcdCAqIHN3YXBvZmYgc28gd2UgY2FuIHNhZmVseSBkZXJlZmVyZW5jZSB0aGUgenN3YXAgdHJlZSBoZXJlLlxcbi1cXHQgKiBWZXJpZnkgdGhhdCB0aGUgc3dhcCBlbnRyeSBoYXNuJ3QgYmVlbiBpbnZhbGlkYXRlZCBhbmQgcmVjeWNsZWRcXG4tXFx0ICogYmVoaW5kIG91ciBiYWNrcywgdG8gYXZvaWQgb3ZlcndyaXRpbmcgYSBuZXcgc3dhcCBmb2xpbyB3aXRoXFxuLVxcdCAqIG9sZCBjb21wcmVzc2VkIGRhdGEuIE9ubHkgd2hlbiB0aGlzIGlzIHN1Y2Nlc3NmdWwgY2FuIHRoZSBlbnRyeVxcbi1cXHQgKiBiZSBkZXJlZmVyZW5jZWQuXFxuK1xcdCAqIFRoZSBmb2xpbyBpcyBub3cgbG9ja2VkIGFuZCBpbiBzd2FwIGNhY2hlLCBzbyBjb25jdXJyZW50XFxuK1xcdCAqIHN0b3JlcyBhcmUgYmxvY2tlZC4gX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyBhbHJlYWR5XFxuK1xcdCAqIG92ZXJ3cm90ZSB0aGUgUG9pbnRlciBlbnRyeSB3aXRoIGEgUEZOLlxcbiBcXHQgKi9cXG4tXFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BlbnRyeSk7XFxuLVxcdGlmIChlbnRyeSAhPSB4YV9sb2FkKHRyZWUsIG9mZnNldCkpIHtcXG4tXFx0XFx0cmV0ID0gLUVOT01FTTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4tXFxuIFxcdGlmICghenN3YXBfZGVjb21wcmVzcyhlbnRyeSwgZm9saW8pKSB7XFxuIFxcdFxcdHJldCA9IC1FSU87XFxuIFxcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbi1cXHR4YV9lcmFzZSh0cmVlLCBvZmZzZXQpO1xcbi1cXG4gXFx0Y291bnRfdm1fZXZlbnQoWlNXUFdCKTtcXG4gXFx0aWYgKGVudHJ5LVxcdTAwM2VvYmpjZylcXG4gXFx0XFx0Y291bnRfb2JqY2dfZXZlbnRzKGVudHJ5LVxcdTAwM2VvYmpjZywgWlNXUFdCLCAxKTtcXG5AQCAtMTEwNSwzNiArMTEwNCwyMiBAQCBzdGF0aWMgZW51bSBscnVfc3RhdHVzIHNocmlua19tZW1jZ19jYihzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCBzdHJ1Y3QgbGlzdF9scnVfb1xcbiBcXHR9XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBBcyBzb29uIGFzIHdlIGRyb3AgdGhlIExSVSBsb2NrLCB0aGUgZW50cnkgY2FuIGJlIGZyZWVkIGJ5XFxuLVxcdCAqIGEgY29uY3VycmVudCBpbnZhbGlkYXRpb24uIFRoaXMgbWVhbnMgdGhlIGZvbGxvd2luZzpcXG4tXFx0ICpcXG4tXFx0ICogMS4gV2UgZXh0cmFjdCB0aGUgc3dwX2VudHJ5X3QgdG8gdGhlIHN0YWNrLCBhbGxvd2luZ1xcbi1cXHQgKiAgICB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSB0byBwaW4gdGhlIHN3YXAgZW50cnkgYW5kXFxuLVxcdCAqICAgIHRoZW4gdmFsaWRhdGUgdGhlIHpzd2FwIGVudHJ5IGFnYWluc3QgdGhhdCBzd2FwIGVudHJ5J3NcXG4tXFx0ICogICAgdHJlZSB1c2luZyBwb2ludGVyIHZhbHVlIGNvbXBhcmlzb24uIE9ubHkgd2hlbiB0aGF0XFxuLVxcdCAqICAgIGlzIHN1Y2Nlc3NmdWwgY2FuIHRoZSBlbnRyeSBiZSBkZXJlZmVyZW5jZWQuXFxuLVxcdCAqXFxuLVxcdCAqIDIuIFVzdWFsbHksIG9iamVjdHMgYXJlIHRha2VuIG9mZiB0aGUgTFJVIGZvciByZWNsYWltLiBJblxcbi1cXHQgKiAgICB0aGlzIGNhc2UgdGhpcyBpc24ndCBwb3NzaWJsZSwgYmVjYXVzZSBpZiByZWNsYWltIGZhaWxzXFxuLVxcdCAqICAgIGZvciB3aGF0ZXZlciByZWFzb24sIHdlIGhhdmUgbm8gbWVhbnMgb2Yga25vd2luZyBpZiB0aGVcXG4tXFx0ICogICAgZW50cnkgaXMgYWxpdmUgdG8gcHV0IGl0IGJhY2sgb24gdGhlIExSVS5cXG4rXFx0ICogQWZ0ZXIgd2UgZHJvcCB0aGUgTFJVIGxvY2ssIHRoZSBlbnRyeSBtYXkgYmUgZnJlZWQgYnkgYVxcbitcXHQgKiBjb25jdXJyZW50IHN3YXAgc2xvdCBmcmVlLiAgVGhpcyBpcyBzYWZlIGJlY2F1c2VcXG4rXFx0ICogenN3YXBfd3JpdGViYWNrX2VudHJ5KCkgcmVjaGVja3MgdGhlIHN3YXAgdGFibGUgdW5kZXJcXG4rXFx0ICogY2ktXFx1MDAzZWxvY2sgYmVmb3JlIGRlcmVmZXJlbmNpbmcgZW50cnk7IGlmIHRoZSBQb2ludGVyIGlzXFxuK1xcdCAqIGdvbmUgaXQgYmFpbHMgb3V0LlxcbiBcXHQgKlxcbi1cXHQgKiAgICBTbyByb3RhdGUgaXQgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrLiBJZiB0aGUgZW50cnkgaXNcXG4tXFx0ICogICAgd3JpdHRlbiBiYWNrIG9yIGludmFsaWRhdGVkLCB0aGUgZnJlZSBwYXRoIHdpbGwgdW5saW5rXFxuLVxcdCAqICAgIGl0LiBGb3IgZmFpbHVyZXMsIHJvdGF0aW9uIGlzIHRoZSByaWdodCB0aGluZyBhcyB3ZWxsLlxcbi1cXHQgKlxcbi1cXHQgKiAgICBUZW1wb3JhcnkgZmFpbHVyZXMsIHdoZXJlIHRoZSBzYW1lIGVudHJ5IHNob3VsZCBiZSB0cmllZFxcbi1cXHQgKiAgICBhZ2FpbiBpbW1lZGlhdGVseSwgYWxtb3N0IG5ldmVyIGhhcHBlbiBmb3IgdGhpcyBzaHJpbmtlci5cXG4tXFx0ICogICAgV2UgZG9uJ3QgZG8gYW55IHRyeWxvY2tpbmc7IC1FTk9NRU0gY29tZXMgY2xvc2VzdCxcXG4tXFx0ICogICAgYnV0IHRoYXQncyBleHRyZW1lbHkgcmFyZSBhbmQgZG9lc24ndCBoYXBwZW4gc3B1cmlvdXNseVxcbi1cXHQgKiAgICBlaXRoZXIuIERvbid0IGJvdGhlciBkaXN0aW5ndWlzaGluZyB0aGlzIGNhc2UuXFxuK1xcdCAqIFJvdGF0ZSB0aGUgZW50cnkgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrOiBpZiBpdCBnZXRzXFxuK1xcdCAqIHdyaXR0ZW4gYmFjayBvciBpbnZhbGlkYXRlZCB0aGUgZnJlZSBwYXRoIHdpbGwgdW5saW5rXFxuK1xcdCAqIGl0IGZyb20gdGhlIExSVS4gIEZvciBmYWlsdXJlcyByb3RhdGlvbiBpcyBmaW5lLlxcbiBcXHQgKi9cXG4gXFx0bGlzdF9tb3ZlX3RhaWwoaXRlbSwgXFx1MDAyNmwtXFx1MDAzZWxpc3QpO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogT25jZSB0aGUgbHJ1IGxvY2sgaXMgZHJvcHBlZCwgdGhlIGVudHJ5IG1pZ2h0IGdldCBmcmVlZC4gVGhlXFxuLVxcdCAqIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2ssIGFuZCBlbnRyeSBpc24ndCBkZXJlZidkIGFnYWluXFxuLVxcdCAqIHVudGlsIHRoZSBlbnRyeSBpcyB2ZXJpZmllZCB0byBzdGlsbCBiZSBhbGl2ZSBpbiB0aGUgdHJlZS5cXG4rXFx0ICogVGhlIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2sgc28gd2UgY2FuIHBpbiB0aGUgc3dhcFxcbitcXHQgKiBkZXZpY2UgYW5kIHZhbGlkYXRlIHRoZSBlbnRyeSdzIHN3YXAgdGFibGUgUG9pbnRlciB1bmRlclxcbitcXHQgKiBjaS1cXHUwMDNlbG9jayBpbiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKS5cXG4gXFx0ICovXFxuIFxcdHN3cGVudHJ5ID0gZW50cnktXFx1MDAzZXN3cGVudHJ5O1xcbiBcXG5AQCAtMTM5OCw3ICsxMzgzLDExIEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXFxuIFxcdFxcdFxcdCAgICAgc3RydWN0IHpzd2FwX3Bvb2wgKnBvb2wpXFxuIHtcXG4gXFx0c3dwX2VudHJ5X3QgcGFnZV9zd3BlbnRyeSA9IHBhZ2Vfc3dhcF9lbnRyeShwYWdlKTtcXG4tXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgKm9sZDtcXG4rXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgKm9sZCA9IE5VTEw7XFxuK1xcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XFxuK1xcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4rXFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHBhZ2Vfc3dwZW50cnkpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcXG4gXFxuIFxcdC8qIGFsbG9jYXRlIGVudHJ5ICovXFxuIFxcdGVudHJ5ID0genN3YXBfZW50cnlfY2FjaGVfYWxsb2MoR0ZQX0tFUk5FTCwgcGFnZV90b19uaWQocGFnZSkpO1xcbkBAIC0xNDEwLDMxICsxMzk5LDQ5IEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXFxuIFxcdGlmICghenN3YXBfY29tcHJlc3MocGFnZSwgZW50cnksIHBvb2wpKVxcbiBcXHRcXHRnb3RvIGNvbXByZXNzX2ZhaWxlZDtcXG4gXFxuLVxcdG9sZCA9IHhhX3N0b3JlKHN3YXBfenN3YXBfdHJlZShwYWdlX3N3cGVudHJ5KSxcXG4tXFx0XFx0ICAgICAgIHN3cF9vZmZzZXQocGFnZV9zd3BlbnRyeSksXFxuLVxcdFxcdCAgICAgICBlbnRyeSwgR0ZQX0tFUk5FTCk7XFxuLVxcdGlmICh4YV9pc19lcnIob2xkKSkge1xcbi1cXHRcXHRpbnQgZXJyID0geGFfZXJyKG9sZCk7XFxuLVxcbi1cXHRcXHRXQVJOX09OQ0UoZXJyICE9IC1FTk9NRU0sIFxcXCJ1bmV4cGVjdGVkIHhhcnJheSBlcnJvcjogJWRcXFxcblxcXCIsIGVycik7XFxuLVxcdFxcdHpzd2FwX3JlamVjdF9hbGxvY19mYWlsKys7XFxuLVxcdFxcdGdvdG8gc3RvcmVfZmFpbGVkO1xcbitcXHQvKlxcbitcXHQgKiBTdG9yZSB0aGUgenN3YXBfZW50cnkgcG9pbnRlciBpbiB0aGUgc3dhcCB0YWJsZSBhcyBhXFxuK1xcdCAqIFBvaW50ZXItdHlwZSBlbnRyeSwgcmVwbGFjaW5nIHRoZSBQRk4gb3IgU2hhZG93IGVudHJ5LlxcbitcXHQgKiBUaGUgZnVsbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlIChpbmNsdWRpbmcgd29ya2luZyBzZXRcXG4rXFx0ICogc2hhZG93KSBpcyBwcmVzZXJ2ZWQgaW4gZW50cnktXFx1MDAzZXN3cF90Yl92YWwuXFxuK1xcdCAqIEZvbGlvIGxvY2sgc2VyaWFsaXplcyBjb25jdXJyZW50IHN0b3Jlcy5cXG4rXFx0ICovXFxuK1xcdHNpID0gX19zd2FwX2VudHJ5X3RvX2luZm8ocGFnZV9zd3BlbnRyeSk7XFxuK1xcdGNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpO1xcbitcXHRzcGluX2xvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XFxuK1xcdGlmIChzd3BfdGJfaXNfY291bnRhYmxlKHN3cF90YikpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogU2F2ZSB0aGUgY29tcGxldGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZVxcbitcXHRcXHQgKiAoU2hhZG93IG9yIFBGTiksIHByZXNlcnZpbmcgc3dhcCBjb3VudCwgemVybyBmbGFnLFxcbitcXHRcXHQgKiBhbmQgd29ya2luZyBzZXQgc2hhZG93IGluZm9ybWF0aW9uLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0ZW50cnktXFx1MDAzZXN3cF90Yl92YWwgPSBzd3BfdGI7XFxuK1xcdH0gZWxzZSBpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBSZXBsYWNpbmcgYW4gZXhpc3RpbmcgUG9pbnRlciBlbnRyeSAoZS5nLiBmcm9tIGFcXG4rXFx0XFx0ICogcmVkaXJ0aWVkIGZvbGlvKS4gSW5oZXJpdCB0aGUgc2F2ZWQgc3dhcCB0YWJsZSB2YWx1ZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdG9sZCA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XFxuK1xcdFxcdGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsID0gb2xkLVxcdTAwM2Vzd3BfdGJfdmFsO1xcbiBcXHR9XFxuLVxcbitcXHRfX3N3YXBfdGFibGVfc2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSLFxcbitcXHRcXHRcXHQgcG9pbnRlcl90b19zd3BfdGIoZW50cnkpKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4gXFx0LypcXG4tXFx0ICogV2UgbWF5IGhhdmUgaGFkIGFuIGV4aXN0aW5nIGVudHJ5IHRoYXQgYmVjYW1lIHN0YWxlIHdoZW5cXG4tXFx0ICogdGhlIGZvbGlvIHdhcyByZWRpcnRpZWQgYW5kIG5vdyB0aGUgbmV3IHZlcnNpb24gaXMgYmVpbmdcXG4tXFx0ICogc3dhcHBlZCBvdXQuIEdldCByaWQgb2YgdGhlIG9sZC5cXG4rXFx0ICogSWYgd2UgaGFkIGFuIGV4aXN0aW5nIHpzd2FwIGVudHJ5IGZyb20gdGhlIHN3YXAgdGFibGVcXG4rXFx0ICogKGUuZy4gZnJvbSBhIHByZXZpb3VzIHJlZGlydGllZCBmb2xpbyksIGdldCByaWQgb2YgaXRcXG4rXFx0ICogb3V0c2lkZSB0aGUgbG9jay5cXG4gXFx0ICovXFxuIFxcdGlmIChvbGQpXFxuIFxcdFxcdHpzd2FwX2VudHJ5X2ZyZWUob2xkKTtcXG4gXFxuIFxcdC8qXFxuLVxcdCAqIFRoZSBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIHRoZSB0cmVlLCB0aGVyZSBpc1xcbi1cXHQgKiBubyBmdXJ0aGVyIHBvc3NpYmlsaXR5IG9mIGZhaWx1cmUuIEdyYWIgcmVmcyB0byB0aGUgcG9vbCBhbmQgb2JqY2csXFxuLVxcdCAqIGNoYXJnZSB6c3dhcCBtZW1vcnksIGFuZCBpbmNyZW1lbnQgenN3YXBfc3RvcmVkX3BhZ2VzLlxcbitcXHQgKiBUaGUgZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IGNvbXByZXNzZWQgYW5kIHN0b3JlZCBpbiB0aGUgc3dhcCB0YWJsZSxcXG4rXFx0ICogdGhlcmUgaXMgbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2xcXG4rXFx0ICogYW5kIG9iamNnLCBjaGFyZ2UgenN3YXAgbWVtb3J5LCBhbmQgaW5jcmVtZW50IHpzd2FwX3N0b3JlZF9wYWdlcy5cXG4gXFx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXFxuLVxcdCAqIHdoZW4gdGhlIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS5cXG4rXFx0ICogd2hlbiB0aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzd2FwIHRhYmxlLlxcbiBcXHQgKi9cXG4gXFx0enN3YXBfcG9vbF9nZXQocG9vbCk7XFxuIFxcdGlmIChvYmpjZykge1xcbkBAIC0xNDQ2LDggKzE0NTMsOCBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLFxcbiBcXHRcXHRhdG9taWNfbG9uZ19pbmMoXFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBXZSBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBlbnRyeSB3aGlsZSBpdCdzIGFscmVhZHkgaW4geGFycmF5Llxcbi1cXHQgKiBUaGlzIGlzIHNhZmUgYmVjYXVzZTpcXG4rXFx0ICogV2UgZmluaXNoIGluaXRpYWxpemluZyB0aGUgZW50cnkgd2hpbGUgaXQncyBhbHJlYWR5IGluIHRoZVxcbitcXHQgKiBzd2FwIHRhYmxlLiBUaGlzIGlzIHNhZmUgYmVjYXVzZTpcXG4gXFx0ICpcXG4gXFx0ICogMS4gQ29uY3VycmVudCBzdG9yZXMgYW5kIGludmFsaWRhdGlvbnMgYXJlIGV4Y2x1ZGVkIGJ5IGZvbGlvIGxvY2suXFxuIFxcdCAqXFxuQEAgLTE0NjYsOCArMTQ3Myw2IEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXFxuIFxcbiBcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuLXN0b3JlX2ZhaWxlZDpcXG4tXFx0enNfZnJlZShwb29sLVxcdTAwM2V6c19wb29sLCBlbnRyeS1cXHUwMDNlaGFuZGxlKTtcXG4gY29tcHJlc3NfZmFpbGVkOlxcbiBcXHR6c3dhcF9lbnRyeV9jYWNoZV9mcmVlKGVudHJ5KTtcXG4gXFx0cmV0dXJuIGZhbHNlO1xcbkBAIC0xNTQ2LDExICsxNTUxLDMxIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0XFx0dW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7XFxuIFxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbiBcXHRcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xcbi1cXHRcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xcbitcXHRcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xcbitcXHRcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcXG4gXFxuK1xcdFxcdHNpcyA9IF9fc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XFxuIFxcdFxcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KSB7XFxuLVxcdFxcdFxcdHRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XFxuLVxcdFxcdFxcdGVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0ICsgaW5kZXgpO1xcbitcXHRcXHRcXHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaXMsIG9mZnNldCArIGluZGV4KTtcXG4rXFx0XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdFxcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIChvZmZzZXQgKyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSKTtcXG4rXFx0XFx0XFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcXG4rXFx0XFx0XFx0XFx0ZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xcbitcXHRcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHRcXHQgKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzd2FwIHRhYmxlIGVudHJ5XFxuK1xcdFxcdFxcdFxcdCAqIChTaGFkb3cgb3IgUEZOKSB0aGF0IHdhcyBzYXZlZCB3aGVuIHRoZVxcbitcXHRcXHRcXHRcXHQgKiBQb2ludGVyIGVudHJ5IHdhcyBjcmVhdGVkLCByYXRoZXIgdGhhblxcbitcXHRcXHRcXHRcXHQgKiB6ZXJvaW5nIHRoZSBzbG90LiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHN3YXBcXG4rXFx0XFx0XFx0XFx0ICogY291bnQgYW5kIGZsYWdzIHNvIHRoZSBzd2FwIGNhY2hlIGZvbGlvXFxuK1xcdFxcdFxcdFxcdCAqIGNhbiBiZSBjb3JyZWN0bHkgY2xlYW5lZCB1cCBsYXRlci5cXG4rXFx0XFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdFxcdF9fc3dhcF90YWJsZV9zZXQoY2ksIChvZmZzZXQgKyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgZW50cnktXFx1MDAzZXN3cF90Yl92YWwpO1xcbitcXHRcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRcXHRlbnRyeSA9IE5VTEw7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4gXFx0XFx0XFx0aWYgKGVudHJ5KVxcbiBcXHRcXHRcXHRcXHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcXG4gXFx0XFx0fVxcbkBAIC0xNTYyLDYgKzE1ODcsMTEgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiAvKipcXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcXG4gICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXFxuKyAqIEB6ZW50cnk6IHpzd2FwX2VudHJ5IHBvaW50ZXIgZXh0cmFjdGVkIGZyb20gc3dhcCB0YWJsZSwgb3IgTlVMTFxcbisgKlxcbisgKiBUaGUgenN3YXBfZW50cnkgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBzd2FwIHRhYmxlIFBvaW50ZXIgZW50cnkgYnlcXG4rICogX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyBiZWZvcmUgaXQgb3Zlcndyb3RlIHRoZSBlbnRyeSB3aXRoIGEgUEZOLlxcbisgKiBJZiBAemVudHJ5IGlzIE5VTEwsIHRoZSBzbG90IHdhcyBub3QgYmFja2VkIGJ5IHpzd2FwLlxcbiAgKlxcbiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmVcXG4gICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcXG5AQCAtMTU3OSwxMiArMTYwOSw5IEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gICogIC1FTk9FTlQ6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBub3QgaW4genN3YXAuIFRoZSBmb2xpbyByZW1haW5zXFxuICAqICBsb2NrZWQgb24gcmV0dXJuLlxcbiAgKi9cXG4taW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4raW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KVxcbiB7XFxuLVxcdHN3cF9lbnRyeV90IHN3cCA9IGZvbGlvLVxcdTAwM2Vzd2FwO1xcbi1cXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcXG4tXFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xcbi1cXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xcbitcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gemVudHJ5O1xcbiBcXG4gXFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xcbiBcXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XFxuQEAgLTE2MDIsNyArMTYyOSw2IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXHR9XFxuIFxcbi1cXHRlbnRyeSA9IHhhX2xvYWQodHJlZSwgb2Zmc2V0KTtcXG4gXFx0aWYgKCFlbnRyeSlcXG4gXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIFxcbkBAIC0xNjI1LDcgKzE2NTEsNiBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHQgKiBjb21wcmVzc2lvbiB3b3JrLlxcbiBcXHQgKi9cXG4gXFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuLVxcdHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XFxuIFxcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xcbiBcXG4gXFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG5AQCAtMTYzNSw1MiArMTY2MCwxNTkgQEAgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gdm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcXG4ge1xcbiBcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcXG4tXFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xcbitcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3dwX3RiO1xcbiBcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xcbiBcXG4tXFx0aWYgKHhhX2VtcHR5KHRyZWUpKVxcbitcXHRzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoc3dwKSk7XFxuK1xcdGNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpO1xcbitcXHQvKlxcbitcXHQgKiBEbyBhIGxvY2tsZXNzIHBlZWsgZmlyc3QuICBJZiBjaS1cXHUwMDNlbG9jayBpcyBhbHJlYWR5IGhlbGQgYnlcXG4rXFx0ICogdGhlIGNhbGxlciAoZS5nLiBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMpLCBhbmQgdGhlXFxuK1xcdCAqIFBvaW50ZXIgaGFzIGFscmVhZHkgYmVlbiBjbGVhcmVkLCB3ZSBjYW4gYmFpbCBvdXQgd2l0aG91dFxcbitcXHQgKiBzZWxmLWRlYWRsb2NraW5nLlxcbitcXHQgKi9cXG4rXFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XFxuK1xcdGlmICghc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4tXFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQpO1xcbitcXHRzcGluX2xvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFx0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XFxuK1xcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XFxuK1xcdFxcdGVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSAoU2hhZG93IG9yIFBGTilcXG4rXFx0XFx0ICogdGhhdCB3YXMgc2F2ZWQgaW4gc3dwX3RiX3ZhbCB3aGVuIHRoZSBQb2ludGVyIGVudHJ5XFxuK1xcdFxcdCAqIHdhcyBjcmVhdGVkLiAgVGhpcyBwcmVzZXJ2ZXMgc3dhcCBjb3VudCBhbmQgZmxhZ3NcXG4rXFx0XFx0ICogZm9yIHRoZSBzdWJzZXF1ZW50IHNsb3QtZnJlZSBwYXRoLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0X19zd2FwX3RhYmxlX3NldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUixcXG4rXFx0XFx0XFx0XFx0IGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0ZW50cnkgPSBOVUxMO1xcbitcXHR9XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuK1xcbiBcXHRpZiAoZW50cnkpXFxuIFxcdFxcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xcbiB9XFxuIFxcbi1pbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbisvKlxcbisgKiBFeHRyYWN0IHRoZSB3b3JraW5nIHNldCBzaGFkb3cgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxcbisgKiBUaGUgc2hhZG93IGlzIHJlY292ZXJlZCBmcm9tIHpzd2FwX2VudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsIHdoaWNoIHByZXNlcnZlc1xcbisgKiB0aGUgb3JpZ2luYWwgU2hhZG93IGVudHJ5IHZhbHVlLiBUaGUgc2hhZG93IGNhbiB0aGVuIGJlIHVzZWQgYnlcXG4rICogd29ya2luZ3NldF9yZWZhdWx0KCkgZm9yIHJlZmF1bHQgZGlzdGFuY2UgY2FsY3VsYXRpb24uXFxuKyAqL1xcbit2b2lkICp6c3dhcF9zd3BfdGJfZ2V0X3NoYWRvdyh1bnNpZ25lZCBsb25nIHN3cF90YilcXG4ge1xcbi1cXHRzdHJ1Y3QgeGFycmF5ICp0cmVlcywgKnRyZWU7XFxuLVxcdHVuc2lnbmVkIGludCBuciwgaTtcXG4rXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2F2ZWQgPSBlbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbDtcXG4gXFxuLVxcdG5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcXG4tXFx0dHJlZXMgPSBrdnphbGxvY19vYmpzKCp0cmVlLCBucik7XFxuLVxcdGlmICghdHJlZXMpIHtcXG4tXFx0XFx0cHJfZXJyKFxcXCJhbGxvYyBmYWlsZWQsIHpzd2FwIGRpc2FibGVkIGZvciBzd2FwIHR5cGUgJWRcXFxcblxcXCIsIHR5cGUpO1xcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFx0fVxcbitcXHQvKlxcbitcXHQgKiBzd3BfdGJfdmFsIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeS4gIE9ubHlcXG4rXFx0ICogU2hhZG93IGVudHJpZXMgY2Fycnkgd29ya2luZ3NldCBpbmZvcm1hdGlvbjsgUEZOIGFuZCBOVUxMXFxuK1xcdCAqIGVudHJpZXMgaGF2ZSBubyBzaGFkb3cgdG8gZXh0cmFjdC5cXG4rXFx0ICovXFxuK1xcdGlmICghc3dwX3RiX2lzX3NoYWRvdyhzYXZlZCkpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXG4rXFx0cmV0dXJuICh2b2lkICopKHNhdmVkIFxcdTAwMjYgflNXUF9UQl9GTEFHU19NQVNLKTtcXG4rfVxcbitcXG4rLypcXG4rICogUmVhZCB0aGUgc3dhcCBjb3VudCBmcm9tIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuIFRoZSBjb3VudFxcbisgKiBhbmQgZmxhZ3MgYXJlIHN0b3JlZCBpbiB6c3dhcF9lbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbCB3aGljaCBwcmVzZXJ2ZXMgdGhlXFxuKyAqIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnkgdmFsdWUgKFNoYWRvdyBvciBQRk4gZm9ybWF0KS5cXG4rICovXFxuK3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90YilcXG4re1xcbitcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcXG4rXFxuK1xcdHJldHVybiBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktXFx1MDAzZXN3cF90Yl92YWwpO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZWFkIHRoZSBmbGFncyBmcm9tIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXFxuKyAqL1xcbit1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpXFxuK3tcXG4rXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XFxuK1xcbitcXHRyZXR1cm4gX19zd3BfdGJfZ2V0X2ZsYWdzKGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsKTtcXG4rfVxcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yOyBpKyspXFxuLVxcdFxcdHhhX2luaXQodHJlZXMgKyBpKTtcXG4rLypcXG4rICogSW5jcmVtZW50IHRoZSBzd2FwIGNvdW50IG9mIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXFxuKyAqIFRoZSBjb3VudCBpcyBzdG9yZWQgaW4genN3YXBfZW50cnktXFx1MDAzZXN3cF90Yl92YWwgZm9yIGNvdW50cyBiZWxvd1xcbisgKiBTV1BfVEJfQ09VTlRfTUFYLCBhbmQgb3ZlcmZsb3dzIGludG8gdGhlIGNsdXN0ZXIncyBleHRlbmRfdGFibGVcXG4rICoganVzdCBsaWtlIG5vcm1hbCBTaGFkb3cvUEZOIGVudHJpZXMgZG8uICBSZXR1cm5zIDAgb24gc3VjY2VzcyxcXG4rICogLUVOT01FTSBpZiBjb3VudCB3b3VsZCBvdmVyZmxvdyBhbmQgbm8gZXh0ZW5kX3RhYmxlIGlzIGF2YWlsYWJsZS5cXG4rICovXFxuK2ludCB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxcbitcXHRcXHRcXHQgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKVxcbit7XFxuK1xcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xcbitcXHR1bnNpZ25lZCBjaGFyIGNvdW50ID0gX19zd3BfdGJfZ2V0X2NvdW50KGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsKTtcXG4gXFxuLVxcdG5yX3pzd2FwX3RyZWVzW3R5cGVdID0gbnI7XFxuLVxcdHpzd2FwX3RyZWVzW3R5cGVdID0gdHJlZXM7XFxuK1xcdGlmIChjb3VudCBcXHUwMDNjIFNXUF9UQl9DT1VOVF9NQVgpIHtcXG4rXFx0XFx0ZW50cnktXFx1MDAzZXN3cF90Yl92YWwgPSBfX3N3cF90Yl9ta19jb3VudChlbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgY291bnQgKyAxKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFx0LyogY291bnQgPT0gTUFYLCBvdmVyZmxvdyBpbnRvIGV4dGVuZF90YWJsZSAqL1xcbitcXHRpZiAoIWNpLVxcdTAwM2VleHRlbmRfdGFibGUpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHRjb3VudCA9IGNpLVxcdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcXG4rXFx0aWYgKGNvdW50ID09IDApXFxuK1xcdFxcdGNvdW50ID0gU1dQX1RCX0NPVU5UX01BWDtcXG4rXFx0Y291bnQrKztcXG4rXFx0Y2ktXFx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi12b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpXFxuKy8qXFxuKyAqIERlY3JlbWVudCB0aGUgc3dhcCBjb3VudCBvZiBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxcbisgKiBIYW5kbGVzIGJvdGggaW5saW5lIGNvdW50IChpbiBzd3BfdGJfdmFsKSBhbmQgb3ZlcmZsb3dlZCBjb3VudFxcbisgKiAoaW4gY2ktXFx1MDAzZWV4dGVuZF90YWJsZSksIG1hdGNoaW5nIHRoZSBsb2dpYyB1c2VkIGJ5IG5vcm1hbCBlbnRyaWVzLlxcbisgKi9cXG4rdm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxcbitcXHRcXHRcXHQgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZilcXG4ge1xcbi1cXHRzdHJ1Y3QgeGFycmF5ICp0cmVlcyA9IHpzd2FwX3RyZWVzW3R5cGVdO1xcbi1cXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKHN3cF90Yik7XFxuK1xcdHVuc2lnbmVkIGNoYXIgY291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktXFx1MDAzZXN3cF90Yl92YWwpO1xcbitcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50ID09IDApO1xcbiBcXG4tXFx0aWYgKCF0cmVlcylcXG4rXFx0aWYgKGNvdW50ID09IFNXUF9UQl9DT1VOVF9NQVgpIHtcXG4rXFx0XFx0aWYgKCFjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlKSB7XFxuK1xcdFxcdFxcdGNvdW50LS07XFxuK1xcdFxcdFxcdGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXFx1MDAzZXN3cF90Yl92YWwsIGNvdW50KTtcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbitcXHRcXHR9XFxuK1xcdFxcdGNvdW50ID0gY2ktXFx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdO1xcbitcXHRcXHQvKiBPdmVyZmxvdyBzdGFydHMgd2l0aCBTV1BfVEJfQ09VTlRfTUFYICovXFxuK1xcdFxcdFZNX1dBUk5fT05fT05DRShjb3VudCBcXHUwMDNjIFNXUF9UQl9DT1VOVF9NQVgpO1xcbitcXHRcXHRjb3VudC0tO1xcbitcXHRcXHRpZiAoY291bnQgPT0gKFNXUF9UQl9DT1VOVF9NQVggLSAxKSkge1xcbitcXHRcXHRcXHRjaS1cXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwO1xcbitcXHRcXHRcXHRlbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBjb3VudCk7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGNpLVxcdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50O1xcbitcXHRcXHR9XFxuIFxcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRlbnRyeS1cXHUwMDNlc3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LVxcdTAwM2Vzd3BfdGJfdmFsLCBjb3VudCAtIDEpO1xcbit9XFxuIFxcbi1cXHQvKiB0cnlfdG9fdW51c2UoKSBpbnZhbGlkYXRlZCBhbGwgdGhlIGVudHJpZXMgYWxyZWFkeSAqL1xcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfenN3YXBfdHJlZXNbdHlwZV07IGkrKylcXG4tXFx0XFx0V0FSTl9PTl9PTkNFKCF4YV9lbXB0eSh0cmVlcyArIGkpKTtcXG4raW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbiBcXG4tXFx0a3ZmcmVlKHRyZWVzKTtcXG4tXFx0bnJfenN3YXBfdHJlZXNbdHlwZV0gPSAwO1xcbi1cXHR6c3dhcF90cmVlc1t0eXBlXSA9IE5VTEw7XFxuK3ZvaWQgenN3YXBfc3dhcG9mZihpbnQgdHlwZSlcXG4re1xcbiB9XFxuIFxcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDE1OjExOjIyLjM4NDUxMzY5WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjI5ODA4MzM4NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiWlNXQVBfREVGQVVMVF9PTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9sb2FkXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCIsXG4gICAgXCJ6c3dhcF93cml0ZWJhY2tfZW50cnlcIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeVwiLFxuICAgIFwiX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzXCIsXG4gICAgXCJfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlcIixcbiAgICBcInpzd2FwX3N3cF90Yl9kdXBfY291bnRcIixcbiAgICBcInpzd2FwX3N3cF90Yl9wdXRfY291bnRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZjIwMTE5ODU4NzYzMTIxNWY3MDhmNTg4NmE5ODEwMzIzZmJjMjM5OVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDcgMTU6MTE6MTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3pzd2FwLmggYi9pbmNsdWRlL2xpbnV4L3pzd2FwLmhcbmluZGV4IDMwYzE5M2ExMjA3ZTE2Li40ZjU1YzhkMGM0YzU0MiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvenN3YXAuaFxuKysrIGIvaW5jbHVkZS9saW51eC96c3dhcC5oXG5AQCAtMjYsNyArMjYsNyBAQCBzdHJ1Y3QgenN3YXBfbHJ1dmVjX3N0YXRlIHtcbiBcbiB1bnNpZ25lZCBsb25nIHpzd2FwX3RvdGFsX3BhZ2VzKHZvaWQpO1xuIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4taW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4raW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KTtcbiB2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKTtcbiBpbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTtcbiB2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpO1xuQEAgLTQ0LDcgKzQ0LDcgQEAgc3RhdGljIGlubGluZSBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRyZXR1cm4gZmFsc2U7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbitzdGF0aWMgaW5saW5lIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHZvaWQgKnplbnRyeSlcbiB7XG4gXHRyZXR1cm4gLUVOT0VOVDtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vcGFnZV9pby5jIGIvbW0vcGFnZV9pby5jXG5pbmRleCBiMjNmNDk0ZmNjODNkYS4uMWNlODIwMWVkODZlMjQgMTAwNjQ0XG4tLS0gYS9tbS9wYWdlX2lvLmNcbisrKyBiL21tL3BhZ2VfaW8uY1xuQEAgLTY1OCw3ICs2NTgsNyBAQCBzdGF0aWMgdm9pZCBzd2FwX3JlYWRfZm9saW9fYmRldl9hc3luYyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIFx0c3VibWl0X2JpbyhiaW8pO1xuIH1cbiBcbi12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zylcbit2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zywgdm9pZCAqemVudHJ5KVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBfX3N3YXBfZW50cnlfdG9faW5mbyhmb2xpby1cdTAwM2Vzd2FwKTtcbiBcdGJvb2wgc3luY2hyb25vdXMgPSBzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TWU5DSFJPTk9VU19JTztcbkBAIC02ODYsNyArNjg2LDcgQEAgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcpXG4gXHRcdGdvdG8gZmluaXNoO1xuIFx0fVxuIFxuLVx0aWYgKHpzd2FwX2xvYWQoZm9saW8pICE9IC1FTk9FTlQpXG4rXHRpZiAoenN3YXBfbG9hZChmb2xpbywgemVudHJ5KSAhPSAtRU5PRU5UKVxuIFx0XHRnb3RvIGZpbmlzaDtcbiBcbiBcdC8qIFdlIGhhdmUgdG8gcmVhZCBmcm9tIHNsb3dlciBkZXZpY2VzLiBJbmNyZWFzZSB6c3dhcCBwcm90ZWN0aW9uLiAqL1xuZGlmZiAtLWdpdCBhL21tL3N3YXAuaCBiL21tL3N3YXAuaFxuaW5kZXggNDRhYjhlMWU1OTViMDguLjg0ZTEzYmE2ZTYwNWMzIDEwMDY0NFxuLS0tIGEvbW0vc3dhcC5oXG4rKysgYi9tbS9zd2FwLmhcbkBAIC0yMTAsNiArMjEwLDQxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2NsdXN0ZXJfdW5sb2NrX2lycShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxuIFxuIGV4dGVybiBpbnQgc3dhcF9yZXRyeV90YWJsZV9hbGxvYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwKTtcbiBcbitzdHJ1Y3QgenN3YXBfZW50cnk7XG4rI2lmZGVmIENPTkZJR19aU1dBUFxuK3ZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKTtcbit1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpO1xuK3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90Yik7XG4raW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4rXHRcdFx0ICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZik7XG4rdm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuK1x0XHRcdCAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKTtcbit2b2lkIHpzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSk7XG4rI2Vsc2VcbitzdGF0aWMgaW5saW5lIHZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuK3tcbitcdHJldHVybiBOVUxMO1xuK31cbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHpzd2FwX3N3cF90Yl9nZXRfZmxhZ3ModW5zaWduZWQgbG9uZyBzd3BfdGIpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK3N0YXRpYyBpbmxpbmUgaW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4rXHRcdFx0XHRcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuK1x0XHRcdFx0XHQgdW5zaWduZWQgaW50IGNpX29mZilcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rc3RhdGljIGlubGluZSB2b2lkIHpzd2FwX3N3cF90Yl9wdXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4rXHRcdFx0XHRcdCAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbitcdFx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgY2lfb2ZmKSB7fVxuK3N0YXRpYyBpbmxpbmUgdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpIHt9XG4rI2VuZGlmXG4rXG4gLypcbiAgKiBCZWxvdyBhcmUgdGhlIGNvcmUgcm91dGluZXMgZm9yIGRvaW5nIHN3YXAgZm9yIGEgZm9saW8uXG4gICogQWxsIGhlbHBlcnMgcmVxdWlyZXMgdGhlIGZvbGlvIHRvIGJlIGxvY2tlZCwgYW5kIGEgbG9ja2VkIGZvbGlvXG5AQCAtMjQxLDcgKzI3Niw3IEBAIGV4dGVybiB2b2lkIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gLyogbGludXgvbW0vcGFnZV9pby5jICovXG4gaW50IHNpb19wb29sX2luaXQodm9pZCk7XG4gc3RydWN0IHN3YXBfaW9jYjtcbi12b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgc3dhcF9pb2NiICoqcGx1Zyk7XG4rdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsIHZvaWQgKnplbnRyeSk7XG4gdm9pZCBfX3N3YXBfcmVhZF91bnBsdWcoc3RydWN0IHN3YXBfaW9jYiAqcGx1Zyk7XG4gc3RhdGljIGlubGluZSB2b2lkIHN3YXBfcmVhZF91bnBsdWcoc3RydWN0IHN3YXBfaW9jYiAqcGx1ZylcbiB7XG5AQCAtMzAzLDEzICszMzgsMTYgQEAgc3RhdGljIGlubGluZSBib29sIGZvbGlvX21hdGNoZXNfc3dhcF9lbnRyeShjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIGJvb2wgc3dhcF9jYWNoZV9oYXNfZm9saW8oc3dwX2VudHJ5X3QgZW50cnkpO1xuIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9nZXRfZm9saW8oc3dwX2VudHJ5X3QgZW50cnkpO1xuIHZvaWQgKnN3YXBfY2FjaGVfZ2V0X3NoYWRvdyhzd3BfZW50cnlfdCBlbnRyeSk7XG4rYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbyk7XG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdldF9lbnRyeSwgZ2ZwX3QgZ2ZwX21hc2ssXG4gXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgb3JkZXJzLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZixcbi1cdFx0XHRcdCAgICAgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpO1xuK1x0XHRcdFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseCxcbitcdFx0XHRcdCAgICAgdm9pZCAqKnplbnRyeSk7XG4gLyogQmVsb3cgaGVscGVycyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gbG9jayBhbmQgcGFzcyBpbiB0aGUgc3dhcCBjbHVzdGVyLiAqL1xuIHZvaWQgX19zd2FwX2NhY2hlX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuLVx0XHRcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSk7XG4rXHRcdFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LFxuK1x0XHRcdCAgICB2b2lkICoqemVudHJ5KTtcbiB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XG4gdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuQEAgLTM4MSw3ICs0MTksOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBzd2FwX2lvY2IgKipwbHVnKVxuK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsXG4rXHRcdFx0XHQgICB2b2lkICp6ZW50cnkpXG4ge1xuIH1cbiBcbkBAIC00NTMsNiArNDkyLDExIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3dhcF9jYWNoZV9nZXRfc2hhZG93KHN3cF9lbnRyeV90IGVudHJ5KVxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4re1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiBzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4gfVxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNmZkNmUzNDE1YjcxOGIuLjYwZDkzN2M2YjM5MjI0IDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0xNzUsMTYgKzE3NSwyOSBAQCBzdGF0aWMgaW50IF9fc3dhcF9jYWNoZV9hZGRfY2hlY2soc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4gXHRpZiAoc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikpXG4gXHRcdHJldHVybiAtRUVYSVNUO1xuLVx0aWYgKCFfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcbitcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XG4rXHRcdGlmICghenN3YXBfc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0fSBlbHNlIGlmICghX19zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpIHtcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4gXHRpZiAoc2hhZG93cCBcdTAwMjZcdTAwMjYgc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpKVxuIFx0XHQqc2hhZG93cCA9IHN3cF90Yl90b19zaGFkb3cob2xkX3RiKTtcbitcdGVsc2UgaWYgKHNoYWRvd3AgXHUwMDI2XHUwMDI2IHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXG4rXHRcdCpzaGFkb3dwID0genN3YXBfc3dwX3RiX2dldF9zaGFkb3cob2xkX3RiKTtcbiBcdGlmIChtZW1jZ19pZClcbiBcdFx0Km1lbWNnX2lkID0gX19zd2FwX2Nncm91cF9nZXQoY2ksIGNpX29mZik7XG4gXG4gXHRpZiAobnIgPT0gMSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4rXHQvKlxuK1x0ICogRm9yIG11bHRpLXNsb3QgcmFuZ2VzLCBQb2ludGVyIGVudHJpZXMgYXJlIG5vdCBleHBlY3RlZCBzaW5jZVxuK1x0ICogenN3YXAgZG9lcyBub3Qgc3VwcG9ydCBsYXJnZSBmb2xpb3MuIFJldHVybiAtRUJVU1kgZm9yIHNhZmV0eS5cbitcdCAqL1xuK1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4gXHRpc196ZXJvID0gX19zd2FwX3RhYmxlX3Rlc3RfemVybyhjaSwgY2lfb2ZmKTtcbiBcdGNpX29mZiA9IHJvdW5kX2Rvd24oY2lfb2ZmLCBucik7XG4gXHRjaV9lbmQgPSBjaV9vZmYgKyBucjtcbkBAIC0yMDEsNyArMjE0LDggQEAgc3RhdGljIGludCBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gfVxuIFxuIHN0YXRpYyB2b2lkIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi1cdFx0XHRcdCAgICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5KVxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksXG4rXHRcdFx0XHQgICAgICB2b2lkICoqemVudHJ5KVxuIHtcbiBcdHVuc2lnbmVkIGludCBjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQoZW50cnkpLCBjaV9lbmQ7XG4gXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuQEAgLTIxNiw3ICsyMzAsMzQgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0ZG8ge1xuIFx0XHRvbGRfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuIFx0XHRWTV9XQVJOX09OX09OQ0Uoc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikpO1xuLVx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIHBmbl90b19zd3BfdGIocGZuLCBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpO1xuK1x0XHQvKlxuK1x0XHQgKiBJZiB0aGUgb2xkIGVudHJ5IGlzIGEgUG9pbnRlciAoenN3YXAgY29tcHJlc3NlZCBkYXRhKSxcbitcdFx0ICogZXh0cmFjdCB0aGUgenN3YXBfZW50cnkgZm9yIHRoZSBjYWxsZXIgYW5kIHByZXNlcnZlXG4rXHRcdCAqIGl0cyBmbGFncy4gVGhlIFBvaW50ZXIgZW50cnkgaGFzIG5vIGlubGluZSBmbGFncy5cbitcdFx0ICovXG4rXHRcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihvbGRfdGIpKSB7XG4rXHRcdFx0dW5zaWduZWQgY2hhciBwZmxhZ3MgPSB6c3dhcF9zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90Yik7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBJZiBzd3BfdGJfdmFsIGNhcnJpZXMgU1dQX1RCX0NPVU5UX01BWCwgdGhlXG4rXHRcdFx0ICogcmVhbCBvdmVyZmxvdyBjb3VudCBsaXZlcyBpbiBjaS1cdTAwM2VleHRlbmRfdGFibGUuXG4rXHRcdFx0ICogUHVsbCBpdCBzbyB0aGUgbmV3IFBGTiBjYXJyaWVzIHRoZSBjb3JyZWN0IGNvdW50XG4rXHRcdFx0ICogYW5kIHdvbid0IGxhdGVyIGNyYXNoIG9uIGEgbWlzc2luZyBleHRlbmRfdGFibGUuXG4rXHRcdFx0ICovXG4rXHRcdFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XG4rXHRcdFx0XHR1bnNpZ25lZCBjaGFyIHJlYWwgPSBTV1BfVEJfQ09VTlRfTUFYIC0gMTtcbitcdFx0XHRcdGlmIChjaS1cdTAwM2VleHRlbmRfdGFibGUgXHUwMDI2XHUwMDI2IGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdKVxuK1x0XHRcdFx0XHRyZWFsID0gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XG4rXHRcdFx0XHRwZmxhZ3MgPSAocmVhbCBcdTAwM2NcdTAwM2MgKFNXUF9UQl9GTEFHU19CSVRTIC0gU1dQX1RCX0NPVU5UX0JJVFMpKSB8XG4rXHRcdFx0XHRcdCAocGZsYWdzIFx1MDAyNiAoKDEgXHUwMDNjXHUwMDNjIChTV1BfVEJfRkxBR1NfQklUUyAtIFNXUF9UQl9DT1VOVF9CSVRTKSkgLSAxKSk7XG4rXHRcdFx0fVxuK1x0XHRcdGlmICh6ZW50cnkgXHUwMDI2XHUwMDI2ICEqemVudHJ5KVxuK1x0XHRcdFx0KnplbnRyeSA9IHN3cF90Yl90b19wb2ludGVyKG9sZF90Yik7XG4rXHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxuK1x0XHRcdFx0cGZuX3RvX3N3cF90YihwZm4sIHBmbGFncykpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZixcbitcdFx0XHRcdHBmbl90b19zd3BfdGIocGZuLCBfX3N3cF90Yl9nZXRfZmxhZ3Mob2xkX3RiKSkpO1xuK1x0XHR9XG4gXHR9IHdoaWxlICgrK2NpX29mZiBcdTAwM2MgY2lfZW5kKTtcbiBcbiBcdGZvbGlvX3JlZl9hZGQoZm9saW8sIG5yX3BhZ2VzKTtcbkBAIC0yMzksMTEgKzI4MCwxMiBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gICogdGhhdCBob2xkcyB0aGUgZW50cmllcy5cbiAgKi9cbiB2b2lkIF9fc3dhcF9jYWNoZV9hZGRfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnkpXG4rXHRcdFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LFxuK1x0XHRcdCAgICB2b2lkICoqemVudHJ5KVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4gXG4tXHRfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnkpO1xuK1x0X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhjaSwgZm9saW8sIGVudHJ5LCB6ZW50cnkpO1xuIFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9QQUdFUywgbnJfcGFnZXMpO1xuIFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TV0FQQ0FDSEUsIG5yX3BhZ2VzKTtcbiB9XG5AQCAtMjY5LDE1ICszMTEsMjggQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0Y2lfb2ZmID0gY2lfc3RhcnQ7XG4gXHRkbyB7XG4gXHRcdG9sZF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4tXHRcdFdBUk5fT05fT05DRSghc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikgfHxcbi1cdFx0XHQgICAgIHN3cF90Yl90b19mb2xpbyhvbGRfdGIpICE9IGZvbGlvKTtcbi1cdFx0aWYgKF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpKVxuLVx0XHRcdGZvbGlvX3N3YXBwZWQgPSB0cnVlO1xuLVx0XHRlbHNlXG4tXHRcdFx0bmVlZF9mcmVlID0gdHJ1ZTtcbi1cdFx0LyogSWYgc2hhZG93IGlzIE5VTEwsIHdlIHNldCBhbiBlbXB0eSBzaGFkb3cuICovXG4tXHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIGNpX29mZiwgc2hhZG93X3RvX3N3cF90YihzaGFkb3csXG4tXHRcdFx0XHQgX19zd3BfdGJfZ2V0X2ZsYWdzKG9sZF90YikpKTtcbitcdFx0LypcbitcdFx0ICogSWYgenN3YXAgYWxyZWFkeSBzdG9yZWQgZGF0YSBmb3IgdGhpcyBzbG90XG4rXHRcdCAqICh6c3dhcF9zdG9yZSB3cm90ZSBhIFBvaW50ZXIgZW50cnkpLCBsZWF2ZSBpdFxuK1x0XHQgKiBpbiBwbGFjZS4gVGhlIGNvdW50IGFuZCBmbGFncyBhcmUgc3RvcmVkIGluIHRoZVxuK1x0XHQgKiB6c3dhcF9lbnRyeSBzdHJ1Y3QuXG4rXHRcdCAqL1xuK1x0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSkge1xuK1x0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KG9sZF90YikpXG4rXHRcdFx0XHRmb2xpb19zd2FwcGVkID0gdHJ1ZTtcbitcdFx0XHRlbHNlXG4rXHRcdFx0XHRuZWVkX2ZyZWUgPSB0cnVlO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdFdBUk5fT05fT05DRSghc3dwX3RiX2lzX2ZvbGlvKG9sZF90YikgfHxcbitcdFx0XHRcdCAgICAgc3dwX3RiX3RvX2ZvbGlvKG9sZF90YikgIT0gZm9saW8pO1xuK1x0XHRcdGlmIChfX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSlcbitcdFx0XHRcdGZvbGlvX3N3YXBwZWQgPSB0cnVlO1xuK1x0XHRcdGVsc2VcbitcdFx0XHRcdG5lZWRfZnJlZSA9IHRydWU7XG4rXHRcdFx0LyogSWYgc2hhZG93IGlzIE5VTEwsIHdlIHNldCBhbiBlbXB0eSBzaGFkb3cuICovXG4rXHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBzaGFkb3dfdG9fc3dwX3RiKHNoYWRvdyxcbitcdFx0XHRcdFx0IF9fc3dwX3RiX2dldF9mbGFncyhvbGRfdGIpKSk7XG4rXHRcdH1cbiBcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFxuIFx0Zm9saW8tXHUwMDNlc3dhcC52YWwgPSAwO1xuQEAgLTI4OCw3ICszNDMsMTQgQEAgc3RhdGljIHZvaWQgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0fSBlbHNlIGlmIChuZWVkX2ZyZWUpIHtcbiBcdFx0Y2lfb2ZmID0gY2lfc3RhcnQ7XG4gXHRcdGRvIHtcbi1cdFx0XHRpZiAoIV9fc3dwX3RiX2dldF9jb3VudChfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSlcbitcdFx0XHR1bnNpZ25lZCBsb25nIHRiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbitcdFx0XHR1bnNpZ25lZCBjaGFyIGNudDtcbitcbitcdFx0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIodGIpKVxuK1x0XHRcdFx0Y250ID0genN3YXBfc3dwX3RiX2dldF9jb3VudCh0Yik7XG4rXHRcdFx0ZWxzZVxuK1x0XHRcdFx0Y250ID0gX19zd3BfdGJfZ2V0X2NvdW50KHRiKTtcbitcdFx0XHRpZiAoIWNudClcbiBcdFx0XHRcdF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzaSwgY2ksIGNpX29mZiwgMSk7XG4gXHRcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuQEAgLTQwMyw3ICs0NjUsOCBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXHRcdFx0XHRcdHN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCxcbiBcdFx0XHRcdFx0dW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZixcbi1cdFx0XHRcdFx0c3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgpXG4rXHRcdFx0XHRcdHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wsIHBnb2ZmX3QgaWx4LFxuK1x0XHRcdFx0XHR2b2lkICoqemVudHJ5KVxuIHtcbiBcdGludCBlcnI7XG4gXHRzd3BfZW50cnlfdCBlbnRyeTtcbkBAIC00NTAsNyArNTEzLDcgQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXG4gXHRfX2ZvbGlvX3NldF9sb2NrZWQoZm9saW8pO1xuIFx0X19mb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7XG4tXHRfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvKGNpLCBmb2xpbywgZW50cnkpO1xuK1x0X19zd2FwX2NhY2hlX2RvX2FkZF9mb2xpbyhjaSwgZm9saW8sIGVudHJ5LCB6ZW50cnkpO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXG4gXHRpZiAobWVtX2Nncm91cF9zd2FwaW5fY2hhcmdlX2ZvbGlvKGZvbGlvLCBtZW1jZ19pZCxcbkBAIC01MDcsNyArNTcwLDggQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqX19zd2FwX2NhY2hlX2FsbG9jKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gICovXG4gc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cF9lbnRyeV90IHRhcmdfZW50cnksIGdmcF90IGdmcCxcbiBcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBvcmRlcnMsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseClcbitcdFx0XHRcdCAgICAgc3RydWN0IG1lbXBvbGljeSAqbXBvbCwgcGdvZmZfdCBpbHgsXG4rXHRcdFx0XHQgICAgIHZvaWQgKip6ZW50cnkpXG4ge1xuIFx0aW50IG9yZGVyLCBlcnI7XG4gXHRzdHJ1Y3QgZm9saW8gKnJldDtcbkBAIC01MjAsOSArNTg0LDEyIEBAIHN0cnVjdCBmb2xpbyAqc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BfZW50cnlfdCB0YXJnX2VudHJ5LCBnZnBfdCBnZnAsXG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFvcmRlcnMgfHwgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpIFx1MDAzZSBTV0FQRklMRV9DTFVTVEVSKSlcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4rXHRpZiAoemVudHJ5KVxuK1x0XHQqemVudHJ5ID0gTlVMTDtcbitcbiBcdGRvIHtcbiBcdFx0cmV0ID0gX19zd2FwX2NhY2hlX2FsbG9jKGNpLCB0YXJnX2VudHJ5LCBnZnAsIG9yZGVyLFxuLVx0XHRcdFx0XHQgdm1mLCBtcG9sLCBpbHgpO1xuK1x0XHRcdFx0XHQgdm1mLCBtcG9sLCBpbHgsIHplbnRyeSk7XG4gXHRcdGlmICghSVNfRVJSKHJldCkpXG4gXHRcdFx0YnJlYWs7XG4gXHRcdGVyciA9IFBUUl9FUlIocmV0KTtcbkBAIC02MzgsMTggKzcwNSwyMCBAQCBzdGF0aWMgc3RydWN0IGZvbGlvICpzd2FwX2NhY2hlX3JlYWRfZm9saW8oc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCxcbiBcdFx0XHRcdFx0ICAgc3RydWN0IHN3YXBfaW9jYiAqKnBsdWcsIGJvb2wgcmVhZGFoZWFkKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXHR2b2lkICp6ZW50cnk7XG4gXG4gXHRkbyB7XG4gXHRcdGZvbGlvID0gc3dhcF9jYWNoZV9nZXRfZm9saW8oZW50cnkpO1xuIFx0XHRpZiAoZm9saW8pXG4gXHRcdFx0cmV0dXJuIGZvbGlvO1xuLVx0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgQklUKDApLCBOVUxMLCBtcG9sLCBpbHgpO1xuK1x0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgQklUKDApLCBOVUxMLCBtcG9sLCBpbHgsXG4rXHRcdFx0XHRcdCAgICAgICBcdTAwMjZ6ZW50cnkpO1xuIFx0fSB3aGlsZSAoUFRSX0VSUihmb2xpbykgPT0gLUVFWElTVCk7XG4gXG4gXHRpZiAoSVNfRVJSX09SX05VTEwoZm9saW8pKVxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbi1cdHN3YXBfcmVhZF9mb2xpbyhmb2xpbywgcGx1Zyk7XG4rXHRzd2FwX3JlYWRfZm9saW8oZm9saW8sIHBsdWcsIHplbnRyeSk7XG4gXHRpZiAocmVhZGFoZWFkKSB7XG4gXHRcdGZvbGlvX3NldF9yZWFkYWhlYWQoZm9saW8pO1xuIFx0XHRjb3VudF92bV9ldmVudChTV0FQX1JBKTtcbkBAIC02NzgsMTggKzc0NywyMCBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBpbl9zeW5jKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnAsIHVuc2lnbmVkIGxvbmcgb3JkZXJzLFxuIFx0XHRcdCAgIHN0cnVjdCB2bV9mYXVsdCAqdm1mLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sLCBwZ29mZl90IGlseClcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0dm9pZCAqemVudHJ5O1xuIFxuIFx0ZG8ge1xuIFx0XHRmb2xpbyA9IHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKGVudHJ5KTtcbiBcdFx0aWYgKGZvbGlvKVxuIFx0XHRcdHJldHVybiBmb2xpbztcbi1cdFx0Zm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKGVudHJ5LCBnZnAsIG9yZGVycywgdm1mLCBtcG9sLCBpbHgpO1xuK1x0XHRmb2xpbyA9IHN3YXBfY2FjaGVfYWxsb2NfZm9saW8oZW50cnksIGdmcCwgb3JkZXJzLCB2bWYsIG1wb2wsIGlseCxcbitcdFx0XHRcdFx0ICAgICAgIFx1MDAyNnplbnRyeSk7XG4gXHR9IHdoaWxlIChQVFJfRVJSKGZvbGlvKSA9PSAtRUVYSVNUKTtcbiBcbiBcdGlmIChJU19FUlIoZm9saW8pKVxuIFx0XHRyZXR1cm4gZm9saW87XG4gXG4tXHRzd2FwX3JlYWRfZm9saW8oZm9saW8sIE5VTEwpO1xuK1x0c3dhcF9yZWFkX2ZvbGlvKGZvbGlvLCBOVUxMLCB6ZW50cnkpO1xuIFx0cmV0dXJuIGZvbGlvO1xuIH1cbiBcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3RhYmxlLmggYi9tbS9zd2FwX3RhYmxlLmhcbmluZGV4IGU2NjEzZTYyZjhkMGY2Li42MzE4YmY4YWE3NmIwYyAxMDA2NDRcbi0tLSBhL21tL3N3YXBfdGFibGUuaFxuKysrIGIvbW0vc3dhcF90YWJsZS5oXG5AQCAtMjgsNyArMjgsNyBAQCBzdHJ1Y3Qgc3dhcF9tZW1jZ190YWJsZSB7XG4gICogTlVMTDogICAgIHwtLS0tLS0tLS0tLS0tLS0tIDAgLS0tLS0tLS0tLS0tLS0tfCAtIEZyZWUgc2xvdFxuICAqIFNoYWRvdzogICB8U1dBUF9DT1VOVHxafC0tLS0gU0hBRE9XX1ZBTCAtLS18MXwgLSBTd2FwcGVkIG91dCBzbG90XG4gICogUEZOOiAgICAgIHxTV0FQX0NPVU5UfFp8LS0tLS0tIFBGTiAtLS0tLS0tfDEwfCAtIENhY2hlZCBzbG90XG4tICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIChVbnVzZWQpXG4rICogUG9pbnRlcjogIHwtLS0tLS0tLS0tLSBQb2ludGVyIC0tLS0tLS0tLS18MTAwfCAtIFpzd2FwIGNvbXByZXNzZWQgZW50cnlcbiAgKiBCYWQ6ICAgICAgfC0tLS0tLS0tLS0tLS0gMSAtLS0tLS0tLS0tLS0tfDEwMDB8IC0gQmFkIHNsb3RcbiAgKlxuICAqIENPVU5UIGlzIGBTV1BfVEJfQ09VTlRfQklUU2AgbG9uZywgWiBpcyB0aGUgYFNXUF9UQl9aRVJPX0ZMQUdgIGJpdCxcbkBAIC00OSw5ICs0OSwxMSBAQCBzdHJ1Y3Qgc3dhcF9tZW1jZ190YWJsZSB7XG4gICogLSBQRk46IFN3YXAgc2xvdCBpcyBpbiB1c2UsIGFuZCBjYWNoZWQuIE1lbWNnIGluZm8gaXMgcmVjb3JkZWQgb24gdGhlIHBhZ2VcbiAgKiAgIHN0cnVjdC5cbiAgKlxuLSAqIC0gUG9pbnRlcjogVW51c2VkIHlldC4gYDBiMTAwYCBpcyByZXNlcnZlZCBmb3IgcG90ZW50aWFsIHBvaW50ZXIgdXNhZ2Vcbi0gKiAgIGJlY2F1c2Ugb25seSB0aGUgbG93ZXIgdGhyZWUgYml0cyBjYW4gYmUgdXNlZCBhcyBhIG1hcmtlciBmb3IgOCBieXRlc1xuLSAqICAgYWxpZ25lZCBwb2ludGVycy5cbisgKiAtIFBvaW50ZXI6IFN0b3JlcyBhIGRpcmVjdCBwb2ludGVyIHRvIGEgenN3YXBfZW50cnkgd2hlbiB0aGUgc3dhcCBzbG90J3NcbisgKiAgIGNvbXByZXNzZWQgZGF0YSByZXNpZGVzIGluIHpzd2FwLiBUaGUgc3dhcCBjb3VudCAoaWYgYW55KSBpcyBzdG9yZWQgaW5cbisgKiAgIHRoZSB6c3dhcF9lbnRyeSBzdHJ1Y3QgcmF0aGVyIHRoYW4gaW5saW5lLCBzaW5jZSB0aGUgcG9pbnRlciBvY2N1cGllc1xuKyAqICAgYWxsIHVwcGVyIGJpdHMuIGAwYjEwMGAgaXMgdXNlZCBhcyB0aGUgbWFya2VyIGJlY2F1c2UgenN3YXBfZW50cnlcbisgKiAgIHBvaW50ZXJzIGFyZSBhdCBsZWFzdCA4LWJ5dGUgYWxpZ25lZCwgbGVhdmluZyB0aGUgbG93ZXIgdGhyZWUgYml0cyBmcmVlLlxuICAqXG4gICogLSBCYWQ6IFN3YXAgc2xvdCBpcyByZXNlcnZlZCwgcHJvdGVjdHMgc3dhcCBoZWFkZXIgb3IgaG9sZXMgb24gc3dhcCBkZXZpY2VzLlxuICAqL1xuQEAgLTc4LDYgKzgwLDkgQEAgc3RydWN0IHN3YXBfbWVtY2dfdGFibGUge1xuIC8qIFRoZSBmaXJzdCBmbGFnIGlzIHplcm8gYml0IChTV0FQX1RBQkxFX0hBU19aRVJPRkxBRykgKi9cbiAjZGVmaW5lIFNXUF9UQl9aRVJPX0ZMQUdcdEJJVChCSVRTX1BFUl9MT05HIC0gU1dQX1RCX0ZMQUdTX0JJVFMpXG4gXG4rLyogUG9pbnRlcjogenN3YXBfZW50cnkgcG9pbnRlciBzdG9yZWQgZGlyZWN0bHksIGVuZHMgd2l0aCAwYjEwMCAqL1xuKyNkZWZpbmUgU1dQX1RCX1BPSU5URVJfTUFSS1x0MGIxMDBVTFxuK1xuIC8qIEJhZCBzbG90OiBlbmRzIHdpdGggMGIxMDAwIGFuZCByZXN0cyBvZiBiaXRzIGFyZSBhbGwgMSAqL1xuICNkZWZpbmUgU1dQX1RCX0JBRFx0XHQoKH4wVUwpIFx1MDAzY1x1MDAzYyAzKVxuIFxuQEAgLTE2Niw2ICsxNzEsMTEgQEAgc3RhdGljIGlubGluZSBib29sIHN3cF90Yl9pc19iYWQodW5zaWduZWQgbG9uZyBzd3BfdGIpXG4gXHRyZXR1cm4gc3dwX3RiID09IFNXUF9UQl9CQUQ7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBzd3BfdGJfaXNfcG9pbnRlcih1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRyZXR1cm4gKHN3cF90YiBcdTAwMjYgKEJJVCgzKSAtIDEpKSA9PSBTV1BfVEJfUE9JTlRFUl9NQVJLO1xuK31cbitcbiBzdGF0aWMgaW5saW5lIGJvb2wgc3dwX3RiX2lzX2NvdW50YWJsZSh1bnNpZ25lZCBsb25nIHN3cF90YilcbiB7XG4gXHRyZXR1cm4gKHN3cF90Yl9pc19zaGFkb3coc3dwX3RiKSB8fCBzd3BfdGJfaXNfZm9saW8oc3dwX3RiKSB8fFxuQEAgLTE4OCw2ICsxOTgsMjMgQEAgc3RhdGljIGlubGluZSB2b2lkICpzd3BfdGJfdG9fc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuIFx0cmV0dXJuICh2b2lkICopKHN3cF90YiBcdTAwMjYgflNXUF9UQl9GTEFHU19NQVNLKTtcbiB9XG4gXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvaW50ZXJfdG9fc3dwX3RiKHZvaWQgKnB0cilcbit7XG4rXHR1bnNpZ25lZCBsb25nIHZhbCA9ICh1bnNpZ25lZCBsb25nKXB0cjtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2YodW5zaWduZWQgbG9uZykgIT0gc2l6ZW9mKHZvaWQgKikpO1xuK1x0LyogUG9pbnRlcnMgYXJlIDgtYnl0ZSBhbGlnbmVkLCBsb3cgMyBiaXRzIG11c3QgYmUgY2xlYXIgKi9cbitcdFZNX1dBUk5fT05fT05DRSh2YWwgXHUwMDI2IChCSVQoMykgLSAxKSk7XG4rXHRyZXR1cm4gdmFsIHwgU1dQX1RCX1BPSU5URVJfTUFSSztcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkICpzd3BfdGJfdG9fcG9pbnRlcih1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRWTV9XQVJOX09OKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKTtcbitcdC8qIENsZWFyIHRoZSBsb3cgMy1iaXQgbWFya2VyIHRvIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi9cbitcdHJldHVybiAodm9pZCAqKShzd3BfdGIgXHUwMDI2IH4oKHVuc2lnbmVkIGxvbmcpKEJJVCgzKSAtIDEpKSk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3N3cF90Yl9nZXRfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIpXG4ge1xuIFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX2NvdW50YWJsZShzd3BfdGIpKTtcbmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuY1xuaW5kZXggYTYwMmU1ODIwNTEzYTguLjE4OTI1ZTQ2MjU3MWIxIDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuKysrIGIvbW0vc3dhcGZpbGUuY1xuQEAgLTkzNSw3ICs5MzUsOCBAQCBzdGF0aWMgYm9vbCBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0bnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiBcdFx0c3dhcF9jbHVzdGVyX2Fzc2VydF9lbXB0eShjaSwgY2lfb2ZmLCBucl9wYWdlcywgZmFsc2UpO1xuIFx0XHRfX3N3YXBfY2FjaGVfYWRkX2ZvbGlvKGNpLCBmb2xpbywgc3dwX2VudHJ5KHNpLVx1MDAzZXR5cGUsXG4tXHRcdFx0XHRcdFx0XHQgICAgY2lfb2ZmICsgY2x1c3Rlcl9vZmZzZXQoc2ksIGNpKSkpO1xuK1x0XHRcdFx0XHRcdFx0ICAgIGNpX29mZiArIGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSkpLFxuK1x0XHRcdFx0ICAgICAgIE5VTEwpO1xuIFx0fSBlbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19ISUJFUk5BVElPTikpIHtcbiBcdFx0b3JkZXIgPSAwO1xuIFx0XHRucl9wYWdlcyA9IDE7XG5AQCAtMTUzNiwyNSArMTUzNyw1MSBAQCBzdGF0aWMgdm9pZCBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcbiBcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpO1xuK1xuK1x0LyogUG9pbnRlciBlbnRyaWVzIHN0b3JlIGNvdW50IGluIHRoZSB6c3dhcF9lbnRyeSBzdHJ1Y3QgKi9cbitcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4rXHRcdHpzd2FwX3N3cF90Yl9wdXRfY291bnQoc3dwX3RiLCBjaSwgY2lfb2ZmKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0Y291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcbiBcbiBcdFZNX1dBUk5fT05fT05DRShjb3VudCBcdTAwM2M9IDApO1xuIFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFx1MDAzZSBTV1BfVEJfQ09VTlRfTUFYKTtcbi1cbi1cdGlmIChjb3VudCA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XG4tXHRcdGNvdW50ID0gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XG4tXHRcdC8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi9cbi1cdFx0Vk1fV0FSTl9PTl9PTkNFKGNvdW50IFx1MDAzYyBTV1BfVEJfQ09VTlRfTUFYKTtcbi1cdFx0Y291bnQtLTtcbi1cdFx0aWYgKGNvdW50ID09IChTV1BfVEJfQ09VTlRfTUFYIC0gMSkpIHtcbi1cdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IDA7XG4tXHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLCBfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7XG4rXHRcdGlmIChjb3VudCA9PSBTV1BfVEJfQ09VTlRfTUFYKSB7XG4rXHRcdFx0aWYgKCFjaS1cdTAwM2VleHRlbmRfdGFibGUpIHtcbitcdFx0XHRcdC8qXG4rXHRcdFx0XHQgKiBNQVggd2l0aG91dCBleHRlbmRfdGFibGU6IE1BWCBpcyB0aGUgcmVhbFxuK1x0XHRcdFx0ICogY291bnQuICBEZWNyZW1lbnQgYW5kIHdyaXRlIGJhY2sgaW5saW5lLlxuK1x0XHRcdFx0ICovXG4rXHRcdFx0XHRjb3VudC0tO1xuK1x0XHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxuK1x0XHRcdFx0XHRfX3N3cF90Yl9ta19jb3VudChzd3BfdGIsIGNvdW50KSk7XG4rXHRcdFx0fSBlbHNlIHtcbitcdFx0XHRcdC8qXG4rXHRcdFx0XHQgKiBNQVggd2l0aCBleHRlbmRfdGFibGU6IHJlYWwgY291bnQgbGl2ZXMgaW5cbitcdFx0XHRcdCAqIGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdLiAgUHVsbCwgZGVjcmVtZW50XG4rXHRcdFx0XHQgKiBpdCwgYW5kIGVpdGhlciBtb3ZlIGl0IGJhY2sgaW5saW5lIChpZiBub3dcbitcdFx0XHRcdCAqIGZpdHMpIG9yIHdyaXRlIGl0IGJhY2sgdG8gdGhlIGV4dGVuZCB0YWJsZS5cbitcdFx0XHRcdCAqL1xuK1x0XHRcdFx0Y291bnQgPSBjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcbitcdFx0XHRcdC8qIE92ZXJmbG93IHN0YXJ0cyB3aXRoIFNXUF9UQl9DT1VOVF9NQVggKi9cbitcdFx0XHRcdFZNX1dBUk5fT05fT05DRShjb3VudCBcdTAwM2MgU1dQX1RCX0NPVU5UX01BWCk7XG4rXHRcdFx0XHRjb3VudC0tO1xuK1x0XHRcdFx0aWYgKGNvdW50ID09IChTV1BfVEJfQ09VTlRfTUFYIC0gMSkpIHtcbitcdFx0XHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSAwO1xuK1x0XHRcdFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsXG4rXHRcdFx0XHRcdFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuK1x0XHRcdFx0fSBlbHNlIHtcbitcdFx0XHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcbitcdFx0XHRcdH1cbitcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0Y2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl0gPSBjb3VudDtcbitcdFx0XHQvKiBjb3VudCBcdTAwM2MgTUFYOiBzaW1wbGUgaW5saW5lIGRlY3JlbWVudCAqL1xuK1x0XHRcdGNvdW50LS07XG4rXHRcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgY2lfb2ZmLFxuK1x0XHRcdFx0X19zd3BfdGJfbWtfY291bnQoc3dwX3RiLCBjb3VudCkpO1xuIFx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIF9fc3dwX3RiX21rX2NvdW50KHN3cF90YiwgLS1jb3VudCkpO1xuLVx0fVxuIFxuIFx0LypcbiBcdCAqIGBTV1BfVEJfQ09VTlRfTUFYIC0gMWAgdHJpZ2dlcnMgZXh0ZW5kIHRhYmxlIGFsbG9jYXRpb24uIElmIHRoZVxuQEAgLTE1OTYsNyArMTYyMywxOCBAQCBzdGF0aWMgdm9pZCBzd2FwX3B1dF9lbnRyaWVzX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0Y2lfZW5kID0gY2lfb2ZmICsgbnI7XG4gXHRkbyB7XG4gXHRcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4tXHRcdGlmIChzd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgPT0gMSkge1xuK1x0XHQvKlxuK1x0XHQgKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5O1xuK1x0XHQgKiBoYW5kbGUgdGhlbSBiZWZvcmUgc3dwX3RiX2dldF9jb3VudCAod2hpY2ggcmV0dXJuc1xuK1x0XHQgKiAtRUlOVkFMIGZvciBub24tY291bnRhYmxlIHR5cGVzKS5cbitcdFx0ICovXG4rXHRcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4rXHRcdFx0aWYgKHpzd2FwX3N3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XG4rXHRcdFx0XHRpZiAoY2lfYmF0Y2ggPT0gLTEpXG4rXHRcdFx0XHRcdGNpX2JhdGNoID0gY2lfb2ZmO1xuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0fVxuK1x0XHR9IGVsc2UgaWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSA9PSAxKSB7XG4gXHRcdFx0LyogY291bnQgPT0gMSBhbmQgbm9uLWNhY2hlZCBzbG90cyB3aWxsIGJlIGJhdGNoIGZyZWVkLiAqL1xuIFx0XHRcdGlmICghc3dwX3RiX2lzX2ZvbGlvKHN3cF90YikpIHtcbiBcdFx0XHRcdGlmIChjaV9iYXRjaCA9PSAtMSlcbkBAIC0xNjQ3LDYgKzE2ODUsMTEgQEAgc3RhdGljIGludCBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdC8qIEJhZCBvciBzcGVjaWFsIHNsb3RzIGNhbid0IGJlIGhhbmRsZWQgKi9cbiBcdGlmIChXQVJOX09OX09OQ0Uoc3dwX3RiX2lzX2JhZChzd3BfdGIpKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHQvKiBQb2ludGVyIGVudHJpZXMgc3RvcmUgY291bnQgaW4gdGhlIHpzd2FwX2VudHJ5IHN0cnVjdCAqL1xuK1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpXG4rXHRcdHJldHVybiB6c3dhcF9zd3BfdGJfZHVwX2NvdW50KHN3cF90YiwgY2ksIGNpX29mZik7XG4rXG4gXHRjb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChzd3BfdGIpO1xuIFx0LyogTXVzdCBiZSBlaXRoZXIgY2FjaGVkIG9yIGhhdmUgYSBjb3VudCBhbHJlYWR5ICovXG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFjb3VudCBcdTAwMjZcdTAwMjYgIXN3cF90Yl9pc19mb2xpbyhzd3BfdGIpKSlcbkBAIC0xOTIzLDEzICsxOTY2LDI2IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0b2xkX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKTtcbiBcdFx0LypcbiBcdFx0ICogRnJlZWluZyBpcyBkb25lIGFmdGVyIHJlbGVhc2Ugb2YgdGhlIGxhc3Qgc3dhcCBjb3VudFxuLVx0XHQgKiByZWYsIG9yIGFmdGVyIHN3YXAgY2FjaGUgaXMgZHJvcHBlZFxuK1x0XHQgKiByZWYsIG9yIGFmdGVyIHN3YXAgY2FjaGUgaXMgZHJvcHBlZC4gQSBQb2ludGVyIGVudHJ5XG4rXHRcdCAqIG1lYW5zIHpzd2FwIGhhcyBhIGNvbXByZXNzZWQgY29weTsgdGhlIHhhcnJheSBzdGlsbFxuK1x0XHQgKiBob2xkcyB0aGUgZW50cnkgYW5kIHpzd2FwX2ludmFsaWRhdGUgd2lsbCBmcmVlIGl0LlxuIFx0XHQgKi9cbi1cdFx0Vk1fV0FSTl9PTighc3dwX3RiX2lzX3NoYWRvdyhvbGRfdGIpIHx8IF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpIFx1MDAzZSAxKTtcbitcdFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKG9sZF90YikpIHtcbitcdFx0XHRWTV9XQVJOX09OKHpzd2FwX3N3cF90Yl9nZXRfY291bnQob2xkX3RiKSBcdTAwM2UgMSk7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBGcmVlIHRoZSB6c3dhcCBlbnRyeSBub3cgdW5kZXIgY2ktXHUwMDNlbG9jayB3aGlsZVxuK1x0XHRcdCAqIHRoZSBQb2ludGVyIGlzIHN0aWxsIGluIHRoZSBzd2FwIHRhYmxlLiAgT25jZVxuK1x0XHRcdCAqIHdlIG51bGwgdGhlIHNsb3QsIHRoZSBlbnRyeSB3b3VsZCBiZSBsZWFrZWQuXG4rXHRcdFx0ICovXG4rXHRcdFx0enN3YXBfZW50cnlfZnJlZShzd3BfdGJfdG9fcG9pbnRlcihvbGRfdGIpKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRWTV9XQVJOX09OKCFzd3BfdGJfaXNfc2hhZG93KG9sZF90YikgfHxcbitcdFx0XHRcdCAgIF9fc3dwX3RiX2dldF9jb3VudChvbGRfdGIpIFx1MDAzZSAxKTtcbitcdFx0fVxuIFxuIFx0XHQvKiBSZXNldHRpbmcgdGhlIHNsb3QgdG8gTlVMTCBhbHNvIGNsZWFycyB0aGUgaW5saW5lIGZsYWdzLiAqL1xuIFx0XHRfX3N3YXBfdGFibGVfc2V0KGNpLCBjaV9vZmYsIG51bGxfdG9fc3dwX3RiKCkpO1xuLVx0XHRpZiAoIVNXQVBfVEFCTEVfSEFTX1pFUk9GTEFHKVxuK1x0XHRpZiAoIVNXQVBfVEFCTEVfSEFTX1pFUk9GTEFHIFx1MDAyNlx1MDAyNiAhc3dwX3RiX2lzX3BvaW50ZXIob2xkX3RiKSlcbiBcdFx0XHRfX3N3YXBfdGFibGVfY2xlYXJfemVybyhjaSwgY2lfb2ZmKTtcbiBcbiBcdFx0LypcbkBAIC0xOTYxLDggKzIwMTcsMTEgQEAgaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gX19zd2FwX2VudHJ5X3RvX2NsdXN0ZXIoZW50cnkpO1xuIFx0dW5zaWduZWQgaW50IGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChlbnRyeSk7XG4rXHR1bnNpZ25lZCBsb25nIHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZik7XG4gXG4tXHRyZXR1cm4gc3dwX3RiX2dldF9jb3VudChfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKTtcbitcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxuK1x0XHRyZXR1cm4genN3YXBfc3dwX3RiX2dldF9jb3VudChzd3BfdGIpO1xuK1x0cmV0dXJuIHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKTtcbiB9XG4gXG4gLyoqXG5AQCAtMTk4MCw2ICsyMDM5LDggQEAgYm9vbCBzd2FwX2VudHJ5X3N3YXBwZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzd3BfZW50cnlfdCBlbnRyeSlcbiBcdHN3cF90YiA9IHN3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuIFxuK1x0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpXG4rXHRcdHJldHVybiB6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXHUwMDNlIDA7XG4gXHRyZXR1cm4gc3dwX3RiX2dldF9jb3VudChzd3BfdGIpIFx1MDAzZSAwO1xuIH1cbiBcbkBAIC0yMDIwLDcgKzIwODEsNyBAQCBpbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbiAgKlxuICAqIENvbnRleHQ6IENhbGxlciBtdXN0IGVuc3VyZSB0aGUgZm9saW8gaXMgbG9ja2VkIGFuZCBpbiB0aGUgc3dhcCBjYWNoZS5cbiAgKi9cbi1zdGF0aWMgYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4rYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0c3dwX2VudHJ5X3QgZW50cnkgPSBmb2xpby1cdTAwM2Vzd2FwO1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbkBAIC0yNTU2LDggKzI2MTcsMTIgQEAgc3RhdGljIGludCB1bnVzZV9wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG4gXHRcdGlmICghZm9saW8pIHtcbiBcdFx0XHRzd3BfdGIgPSBzd2FwX3RhYmxlX2dldChfX3N3YXBfZW50cnlfdG9fY2x1c3RlcihlbnRyeSksXG4gXHRcdFx0XHRcdFx0c3dwX2NsdXN0ZXJfb2Zmc2V0KGVudHJ5KSk7XG4tXHRcdFx0aWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcdTAwM2M9IDApXG4rXHRcdFx0aWYgKHN3cF90Yl9pc19wb2ludGVyKHN3cF90YikpIHtcbitcdFx0XHRcdGlmICh6c3dhcF9zd3BfdGJfZ2V0X2NvdW50KHN3cF90YikgXHUwMDNjPSAwKVxuK1x0XHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9IGVsc2UgaWYgKHN3cF90Yl9nZXRfY291bnQoc3dwX3RiKSBcdTAwM2M9IDApIHtcbiBcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdFx0fVxuIFxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCA3NjFjZDY5OWUwYTNlNi4uZjk3NjJkMGE1OTZhYjQgMTAwNjQ0XG4tLS0gYS9tbS96c3dhcC5jXG4rKysgYi9tbS96c3dhcC5jXG5AQCAtMzgsNiArMzgsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3pzbWFsbG9jLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcInN3YXAuaFwiXG4rI2luY2x1ZGUgXCJzd2FwX3RhYmxlLmhcIlxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gXG4gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQEAgLTE4Miw2ICsxODMsMTAgQEAgc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqenN3YXBfc2hyaW5rZXI7XG4gICogICAgICAgICAgICAgIHdyaXRlYmFjayBsb2dpYy4gVGhlIGVudHJ5IGlzIG9ubHkgcmVjbGFpbWVkIGJ5IHRoZSB3cml0ZWJhY2tcbiAgKiAgICAgICAgICAgICAgbG9naWMgaWYgcmVmZXJlbmNlZCBpcyB1bnNldC4gU2VlIGNvbW1lbnRzIGluIHRoZSBzaHJpbmtlclxuICAqICAgICAgICAgICAgICBzZWN0aW9uIGZvciBjb250ZXh0LlxuKyAqIHN3cF90Yl92YWwgLSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZSBzYXZlZCB3aGVuIHRoaXMgenN3YXBfZW50cnlcbisgKiAgICAgICAgICAgICAgcmVwbGFjZWQgYSBTaGFkb3cgb3IgUEZOIGVudHJ5LiBJdCBwcmVzZXJ2ZXMgdGhlIHN3YXAgY291bnQsXG4rICogICAgICAgICAgICAgIHplcm8gZmxhZywgYW5kIHdvcmtpbmcgc2V0IHNoYWRvdyBpbmZvcm1hdGlvbiAoU0hBRE9XX1ZBTClcbisgKiAgICAgICAgICAgICAgdGhhdCB0aGUgU2hhZG93IGVudHJ5IGNhcnJpZWQuXG4gICogcG9vbCAtIHRoZSB6c3dhcF9wb29sIHRoZSBlbnRyeSdzIGRhdGEgaXMgaW5cbiAgKiBoYW5kbGUgLSB6c21hbGxvYyBhbGxvY2F0aW9uIGhhbmRsZSB0aGF0IHN0b3JlcyB0aGUgY29tcHJlc3NlZCBwYWdlIGRhdGFcbiAgKiBvYmpjZyAtIHRoZSBvYmpfY2dyb3VwIHRoYXQgdGhlIGNvbXByZXNzZWQgbWVtb3J5IGlzIGNoYXJnZWQgdG9cbkBAIC0xOTEsMTUgKzE5NiwxMyBAQCBzdHJ1Y3QgenN3YXBfZW50cnkge1xuIFx0c3dwX2VudHJ5X3Qgc3dwZW50cnk7XG4gXHR1bnNpZ25lZCBpbnQgbGVuZ3RoO1xuIFx0Ym9vbCByZWZlcmVuY2VkO1xuK1x0dW5zaWduZWQgbG9uZyBzd3BfdGJfdmFsO1xuIFx0c3RydWN0IHpzd2FwX3Bvb2wgKnBvb2w7XG4gXHR1bnNpZ25lZCBsb25nIGhhbmRsZTtcbiBcdHN0cnVjdCBvYmpfY2dyb3VwICpvYmpjZztcbiBcdHN0cnVjdCBsaXN0X2hlYWQgbHJ1O1xuIH07XG4gXG4tc3RhdGljIHN0cnVjdCB4YXJyYXkgKnpzd2FwX3RyZWVzW01BWF9TV0FQRklMRVNdO1xuLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfenN3YXBfdHJlZXNbTUFYX1NXQVBGSUxFU107XG4tXG4gLyogUkNVLXByb3RlY3RlZCBpdGVyYXRpb24gKi9cbiBzdGF0aWMgTElTVF9IRUFEKHpzd2FwX3Bvb2xzKTtcbiAvKiBwcm90ZWN0cyB6c3dhcF9wb29scyBsaXN0IG1vZGlmaWNhdGlvbiAqL1xuQEAgLTIyNSwxNSArMjI4LDYgQEAgc3RhdGljIGJvb2wgenN3YXBfaGFzX3Bvb2w7XG4gKiBoZWxwZXJzIGFuZCBmd2QgZGVjbGFyYXRpb25zXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiBcbi0vKiBPbmUgc3dhcCBhZGRyZXNzIHNwYWNlIGZvciBlYWNoIDY0TSBzd2FwIHNwYWNlICovXG4tI2RlZmluZSBaU1dBUF9BRERSRVNTX1NQQUNFX1NISUZUIDE0XG4tI2RlZmluZSBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTICgxIFx1MDAzY1x1MDAzYyBaU1dBUF9BRERSRVNTX1NQQUNFX1NISUZUKVxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHhhcnJheSAqc3dhcF96c3dhcF90cmVlKHN3cF9lbnRyeV90IHN3cClcbi17XG4tXHRyZXR1cm4gXHUwMDI2enN3YXBfdHJlZXNbc3dwX3R5cGUoc3dwKV1bc3dwX29mZnNldChzd3ApXG4tXHRcdFx1MDAzZVx1MDAzZSBaU1dBUF9BRERSRVNTX1NQQUNFX1NISUZUXTtcbi19XG4tXG4gI2RlZmluZSB6c3dhcF9wb29sX2RlYnVnKG1zZywgcClcdFx0XHRcXFxuIFx0cHJfZGVidWcoXCIlcyBwb29sICVzXFxuXCIsIG1zZywgKHApLVx1MDAzZXRmbV9uYW1lKVxuIFxuQEAgLTc2Miw3ICs3NTYsNyBAQCBzdGF0aWMgdm9pZCB6c3dhcF9lbnRyeV9jYWNoZV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXG4gICogQ2FycmllcyBvdXQgdGhlIGNvbW1vbiBwYXR0ZXJuIG9mIGZyZWVpbmcgYW4gZW50cnkncyB6c21hbGxvYyBhbGxvY2F0aW9uLFxuICAqIGZyZWVpbmcgdGhlIGVudHJ5IGl0c2VsZiwgYW5kIGRlY3JlbWVudGluZyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBwYWdlcy5cbiAgKi9cbi1zdGF0aWMgdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXG4rdm9pZCB6c3dhcF9lbnRyeV9mcmVlKHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkpXG4ge1xuIFx0enN3YXBfbHJ1X2RlbChcdTAwMjZ6c3dhcF9saXN0X2xydSwgZW50cnkpO1xuIFx0enNfZnJlZShlbnRyeS1cdTAwM2Vwb29sLVx1MDAzZXpzX3Bvb2wsIGVudHJ5LVx1MDAzZWhhbmRsZSk7XG5AQCAtOTg3LDExICs5ODEsMTIgQEAgc3RhdGljIGJvb2wgenN3YXBfZGVjb21wcmVzcyhzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHRcdFx0XHQgc3dwX2VudHJ5X3Qgc3dwZW50cnkpXG4ge1xuLVx0c3RydWN0IHhhcnJheSAqdHJlZTtcbiBcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3BlbnRyeSk7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuIFx0c3RydWN0IG1lbXBvbGljeSAqbXBvbDtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbitcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4rXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcbiBcdGludCByZXQgPSAwO1xuIFxuIFx0LyogdHJ5IHRvIGFsbG9jYXRlIHN3YXAgY2FjaGUgZm9saW8gKi9cbkBAIC05OTksOSArOTk0LDI1IEBAIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHRpZiAoIXNpKVxuIFx0XHRyZXR1cm4gLUVFWElTVDtcbiBcbitcdC8qXG4rXHQgKiBWZXJpZnkgdGhlIHN3YXAgdGFibGUgUG9pbnRlciBlbnRyeSBzdGlsbCByZWZlcmVuY2VzIHRoaXNcbitcdCAqIHpzd2FwX2VudHJ5LiBJZiB0aGUgZW50cnkgd2FzIGludmFsaWRhdGVkIG9yIHJlcGxhY2VkIGJ5IGFcbitcdCAqIGNvbmN1cnJlbnQgc3RvcmUsIHRoZSBQb2ludGVyIHdpbGwgYmUgZ29uZSBvciBwb2ludCBlbHNld2hlcmUuXG4rXHQgKi9cbitcdGNpID0gX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBvZmZzZXQpO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1x0c3dwX3RiID0gX19zd2FwX3RhYmxlX2dldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUik7XG4rXHRpZiAoIXN3cF90Yl9pc19wb2ludGVyKHN3cF90YikgfHxcbitcdCAgICBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpICE9IGVudHJ5KSB7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1x0XHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdH1cbitcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1xuIFx0bXBvbCA9IGdldF90YXNrX3BvbGljeShjdXJyZW50KTtcbiBcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLFxuLVx0XHRcdFx0ICAgICAgIE5PX0lOVEVSTEVBVkVfSU5ERVgpO1xuK1x0XHRcdFx0ICAgICAgIE5PX0lOVEVSTEVBVkVfSU5ERVgsIE5VTEwpO1xuIFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcbiBcbiBcdC8qXG5AQCAtMTAxNSwyNyArMTAyNiwxNSBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LFxuIFx0XHRyZXR1cm4gUFRSX0VSUihmb2xpbyk7XG4gXG4gXHQvKlxuLVx0ICogZm9saW8gaXMgbG9ja2VkLCBhbmQgdGhlIHN3YXBjYWNoZSBpcyBub3cgc2VjdXJlZCBhZ2FpbnN0XG4tXHQgKiBjb25jdXJyZW50IHN3YXBwaW5nIHRvIGFuZCBmcm9tIHRoZSBzbG90LCBhbmQgY29uY3VycmVudFxuLVx0ICogc3dhcG9mZiBzbyB3ZSBjYW4gc2FmZWx5IGRlcmVmZXJlbmNlIHRoZSB6c3dhcCB0cmVlIGhlcmUuXG4tXHQgKiBWZXJpZnkgdGhhdCB0aGUgc3dhcCBlbnRyeSBoYXNuJ3QgYmVlbiBpbnZhbGlkYXRlZCBhbmQgcmVjeWNsZWRcbi1cdCAqIGJlaGluZCBvdXIgYmFja3MsIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGEgbmV3IHN3YXAgZm9saW8gd2l0aFxuLVx0ICogb2xkIGNvbXByZXNzZWQgZGF0YS4gT25seSB3aGVuIHRoaXMgaXMgc3VjY2Vzc2Z1bCBjYW4gdGhlIGVudHJ5XG4tXHQgKiBiZSBkZXJlZmVyZW5jZWQuXG4rXHQgKiBUaGUgZm9saW8gaXMgbm93IGxvY2tlZCBhbmQgaW4gc3dhcCBjYWNoZSwgc28gY29uY3VycmVudFxuK1x0ICogc3RvcmVzIGFyZSBibG9ja2VkLiBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvIGFscmVhZHlcbitcdCAqIG92ZXJ3cm90ZSB0aGUgUG9pbnRlciBlbnRyeSB3aXRoIGEgUEZOLlxuIFx0ICovXG4tXHR0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cGVudHJ5KTtcbi1cdGlmIChlbnRyeSAhPSB4YV9sb2FkKHRyZWUsIG9mZnNldCkpIHtcbi1cdFx0cmV0ID0gLUVOT01FTTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4gXHRpZiAoIXpzd2FwX2RlY29tcHJlc3MoZW50cnksIGZvbGlvKSkge1xuIFx0XHRyZXQgPSAtRUlPO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4tXG4gXHRjb3VudF92bV9ldmVudChaU1dQV0IpO1xuIFx0aWYgKGVudHJ5LVx1MDAzZW9iamNnKVxuIFx0XHRjb3VudF9vYmpjZ19ldmVudHMoZW50cnktXHUwMDNlb2JqY2csIFpTV1BXQiwgMSk7XG5AQCAtMTEwNSwzNiArMTEwNCwyMiBAQCBzdGF0aWMgZW51bSBscnVfc3RhdHVzIHNocmlua19tZW1jZ19jYihzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCBzdHJ1Y3QgbGlzdF9scnVfb1xuIFx0fVxuIFxuIFx0Lypcbi1cdCAqIEFzIHNvb24gYXMgd2UgZHJvcCB0aGUgTFJVIGxvY2ssIHRoZSBlbnRyeSBjYW4gYmUgZnJlZWQgYnlcbi1cdCAqIGEgY29uY3VycmVudCBpbnZhbGlkYXRpb24uIFRoaXMgbWVhbnMgdGhlIGZvbGxvd2luZzpcbi1cdCAqXG4tXHQgKiAxLiBXZSBleHRyYWN0IHRoZSBzd3BfZW50cnlfdCB0byB0aGUgc3RhY2ssIGFsbG93aW5nXG4tXHQgKiAgICB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSB0byBwaW4gdGhlIHN3YXAgZW50cnkgYW5kXG4tXHQgKiAgICB0aGVuIHZhbGlkYXRlIHRoZSB6c3dhcCBlbnRyeSBhZ2FpbnN0IHRoYXQgc3dhcCBlbnRyeSdzXG4tXHQgKiAgICB0cmVlIHVzaW5nIHBvaW50ZXIgdmFsdWUgY29tcGFyaXNvbi4gT25seSB3aGVuIHRoYXRcbi1cdCAqICAgIGlzIHN1Y2Nlc3NmdWwgY2FuIHRoZSBlbnRyeSBiZSBkZXJlZmVyZW5jZWQuXG4tXHQgKlxuLVx0ICogMi4gVXN1YWxseSwgb2JqZWN0cyBhcmUgdGFrZW4gb2ZmIHRoZSBMUlUgZm9yIHJlY2xhaW0uIEluXG4tXHQgKiAgICB0aGlzIGNhc2UgdGhpcyBpc24ndCBwb3NzaWJsZSwgYmVjYXVzZSBpZiByZWNsYWltIGZhaWxzXG4tXHQgKiAgICBmb3Igd2hhdGV2ZXIgcmVhc29uLCB3ZSBoYXZlIG5vIG1lYW5zIG9mIGtub3dpbmcgaWYgdGhlXG4tXHQgKiAgICBlbnRyeSBpcyBhbGl2ZSB0byBwdXQgaXQgYmFjayBvbiB0aGUgTFJVLlxuK1x0ICogQWZ0ZXIgd2UgZHJvcCB0aGUgTFJVIGxvY2ssIHRoZSBlbnRyeSBtYXkgYmUgZnJlZWQgYnkgYVxuK1x0ICogY29uY3VycmVudCBzd2FwIHNsb3QgZnJlZS4gIFRoaXMgaXMgc2FmZSBiZWNhdXNlXG4rXHQgKiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKSByZWNoZWNrcyB0aGUgc3dhcCB0YWJsZSB1bmRlclxuK1x0ICogY2ktXHUwMDNlbG9jayBiZWZvcmUgZGVyZWZlcmVuY2luZyBlbnRyeTsgaWYgdGhlIFBvaW50ZXIgaXNcbitcdCAqIGdvbmUgaXQgYmFpbHMgb3V0LlxuIFx0ICpcbi1cdCAqICAgIFNvIHJvdGF0ZSBpdCBiZWZvcmUgZHJvcHBpbmcgdGhlIGxvY2suIElmIHRoZSBlbnRyeSBpc1xuLVx0ICogICAgd3JpdHRlbiBiYWNrIG9yIGludmFsaWRhdGVkLCB0aGUgZnJlZSBwYXRoIHdpbGwgdW5saW5rXG4tXHQgKiAgICBpdC4gRm9yIGZhaWx1cmVzLCByb3RhdGlvbiBpcyB0aGUgcmlnaHQgdGhpbmcgYXMgd2VsbC5cbi1cdCAqXG4tXHQgKiAgICBUZW1wb3JhcnkgZmFpbHVyZXMsIHdoZXJlIHRoZSBzYW1lIGVudHJ5IHNob3VsZCBiZSB0cmllZFxuLVx0ICogICAgYWdhaW4gaW1tZWRpYXRlbHksIGFsbW9zdCBuZXZlciBoYXBwZW4gZm9yIHRoaXMgc2hyaW5rZXIuXG4tXHQgKiAgICBXZSBkb24ndCBkbyBhbnkgdHJ5bG9ja2luZzsgLUVOT01FTSBjb21lcyBjbG9zZXN0LFxuLVx0ICogICAgYnV0IHRoYXQncyBleHRyZW1lbHkgcmFyZSBhbmQgZG9lc24ndCBoYXBwZW4gc3B1cmlvdXNseVxuLVx0ICogICAgZWl0aGVyLiBEb24ndCBib3RoZXIgZGlzdGluZ3Vpc2hpbmcgdGhpcyBjYXNlLlxuK1x0ICogUm90YXRlIHRoZSBlbnRyeSBiZWZvcmUgZHJvcHBpbmcgdGhlIGxvY2s6IGlmIGl0IGdldHNcbitcdCAqIHdyaXR0ZW4gYmFjayBvciBpbnZhbGlkYXRlZCB0aGUgZnJlZSBwYXRoIHdpbGwgdW5saW5rXG4rXHQgKiBpdCBmcm9tIHRoZSBMUlUuICBGb3IgZmFpbHVyZXMgcm90YXRpb24gaXMgZmluZS5cbiBcdCAqL1xuIFx0bGlzdF9tb3ZlX3RhaWwoaXRlbSwgXHUwMDI2bC1cdTAwM2VsaXN0KTtcbiBcbiBcdC8qXG4tXHQgKiBPbmNlIHRoZSBscnUgbG9jayBpcyBkcm9wcGVkLCB0aGUgZW50cnkgbWlnaHQgZ2V0IGZyZWVkLiBUaGVcbi1cdCAqIHN3cGVudHJ5IGlzIGNvcGllZCB0byB0aGUgc3RhY2ssIGFuZCBlbnRyeSBpc24ndCBkZXJlZidkIGFnYWluXG4tXHQgKiB1bnRpbCB0aGUgZW50cnkgaXMgdmVyaWZpZWQgdG8gc3RpbGwgYmUgYWxpdmUgaW4gdGhlIHRyZWUuXG4rXHQgKiBUaGUgc3dwZW50cnkgaXMgY29waWVkIHRvIHRoZSBzdGFjayBzbyB3ZSBjYW4gcGluIHRoZSBzd2FwXG4rXHQgKiBkZXZpY2UgYW5kIHZhbGlkYXRlIHRoZSBlbnRyeSdzIHN3YXAgdGFibGUgUG9pbnRlciB1bmRlclxuK1x0ICogY2ktXHUwMDNlbG9jayBpbiB6c3dhcF93cml0ZWJhY2tfZW50cnkoKS5cbiBcdCAqL1xuIFx0c3dwZW50cnkgPSBlbnRyeS1cdTAwM2Vzd3BlbnRyeTtcbiBcbkBAIC0xMzk4LDcgKzEzODMsMTEgQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdFx0XHQgICAgIHN0cnVjdCB6c3dhcF9wb29sICpwb29sKVxuIHtcbiBcdHN3cF9lbnRyeV90IHBhZ2Vfc3dwZW50cnkgPSBwYWdlX3N3YXBfZW50cnkocGFnZSk7XG4tXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCAqb2xkO1xuK1x0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgKm9sZCA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuK1x0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHBhZ2Vfc3dwZW50cnkpO1xuK1x0dW5zaWduZWQgbG9uZyBzd3BfdGI7XG4gXG4gXHQvKiBhbGxvY2F0ZSBlbnRyeSAqL1xuIFx0ZW50cnkgPSB6c3dhcF9lbnRyeV9jYWNoZV9hbGxvYyhHRlBfS0VSTkVMLCBwYWdlX3RvX25pZChwYWdlKSk7XG5AQCAtMTQxMCwzMSArMTM5OSw0OSBAQCBzdGF0aWMgYm9vbCB6c3dhcF9zdG9yZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLFxuIFx0aWYgKCF6c3dhcF9jb21wcmVzcyhwYWdlLCBlbnRyeSwgcG9vbCkpXG4gXHRcdGdvdG8gY29tcHJlc3NfZmFpbGVkO1xuIFxuLVx0b2xkID0geGFfc3RvcmUoc3dhcF96c3dhcF90cmVlKHBhZ2Vfc3dwZW50cnkpLFxuLVx0XHQgICAgICAgc3dwX29mZnNldChwYWdlX3N3cGVudHJ5KSxcbi1cdFx0ICAgICAgIGVudHJ5LCBHRlBfS0VSTkVMKTtcbi1cdGlmICh4YV9pc19lcnIob2xkKSkge1xuLVx0XHRpbnQgZXJyID0geGFfZXJyKG9sZCk7XG4tXG4tXHRcdFdBUk5fT05DRShlcnIgIT0gLUVOT01FTSwgXCJ1bmV4cGVjdGVkIHhhcnJheSBlcnJvcjogJWRcXG5cIiwgZXJyKTtcbi1cdFx0enN3YXBfcmVqZWN0X2FsbG9jX2ZhaWwrKztcbi1cdFx0Z290byBzdG9yZV9mYWlsZWQ7XG4rXHQvKlxuK1x0ICogU3RvcmUgdGhlIHpzd2FwX2VudHJ5IHBvaW50ZXIgaW4gdGhlIHN3YXAgdGFibGUgYXMgYVxuK1x0ICogUG9pbnRlci10eXBlIGVudHJ5LCByZXBsYWNpbmcgdGhlIFBGTiBvciBTaGFkb3cgZW50cnkuXG4rXHQgKiBUaGUgZnVsbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlIChpbmNsdWRpbmcgd29ya2luZyBzZXRcbitcdCAqIHNoYWRvdykgaXMgcHJlc2VydmVkIGluIGVudHJ5LVx1MDAzZXN3cF90Yl92YWwuXG4rXHQgKiBGb2xpbyBsb2NrIHNlcmlhbGl6ZXMgY29uY3VycmVudCBzdG9yZXMuXG4rXHQgKi9cbitcdHNpID0gX19zd2FwX2VudHJ5X3RvX2luZm8ocGFnZV9zd3BlbnRyeSk7XG4rXHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgb2Zmc2V0KTtcbitcdHNwaW5fbG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbitcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuK1x0aWYgKHN3cF90Yl9pc19jb3VudGFibGUoc3dwX3RiKSkge1xuK1x0XHQvKlxuK1x0XHQgKiBTYXZlIHRoZSBjb21wbGV0ZSBvcmlnaW5hbCBzd2FwIHRhYmxlIGVudHJ5IHZhbHVlXG4rXHRcdCAqIChTaGFkb3cgb3IgUEZOKSwgcHJlc2VydmluZyBzd2FwIGNvdW50LCB6ZXJvIGZsYWcsXG4rXHRcdCAqIGFuZCB3b3JraW5nIHNldCBzaGFkb3cgaW5mb3JtYXRpb24uXG4rXHRcdCAqL1xuK1x0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gc3dwX3RiO1xuK1x0fSBlbHNlIGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFJlcGxhY2luZyBhbiBleGlzdGluZyBQb2ludGVyIGVudHJ5IChlLmcuIGZyb20gYVxuK1x0XHQgKiByZWRpcnRpZWQgZm9saW8pLiBJbmhlcml0IHRoZSBzYXZlZCBzd2FwIHRhYmxlIHZhbHVlLlxuK1x0XHQgKi9cbitcdFx0b2xkID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcdFx0ZW50cnktXHUwMDNlc3dwX3RiX3ZhbCA9IG9sZC1cdTAwM2Vzd3BfdGJfdmFsO1xuIFx0fVxuLVxuK1x0X19zd2FwX3RhYmxlX3NldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUixcbitcdFx0XHQgcG9pbnRlcl90b19zd3BfdGIoZW50cnkpKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuIFx0Lypcbi1cdCAqIFdlIG1heSBoYXZlIGhhZCBhbiBleGlzdGluZyBlbnRyeSB0aGF0IGJlY2FtZSBzdGFsZSB3aGVuXG4tXHQgKiB0aGUgZm9saW8gd2FzIHJlZGlydGllZCBhbmQgbm93IHRoZSBuZXcgdmVyc2lvbiBpcyBiZWluZ1xuLVx0ICogc3dhcHBlZCBvdXQuIEdldCByaWQgb2YgdGhlIG9sZC5cbitcdCAqIElmIHdlIGhhZCBhbiBleGlzdGluZyB6c3dhcCBlbnRyeSBmcm9tIHRoZSBzd2FwIHRhYmxlXG4rXHQgKiAoZS5nLiBmcm9tIGEgcHJldmlvdXMgcmVkaXJ0aWVkIGZvbGlvKSwgZ2V0IHJpZCBvZiBpdFxuK1x0ICogb3V0c2lkZSB0aGUgbG9jay5cbiBcdCAqL1xuIFx0aWYgKG9sZClcbiBcdFx0enN3YXBfZW50cnlfZnJlZShvbGQpO1xuIFxuIFx0Lypcbi1cdCAqIFRoZSBlbnRyeSBpcyBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIHRoZSB0cmVlLCB0aGVyZSBpc1xuLVx0ICogbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2wgYW5kIG9iamNnLFxuLVx0ICogY2hhcmdlIHpzd2FwIG1lbW9yeSwgYW5kIGluY3JlbWVudCB6c3dhcF9zdG9yZWRfcGFnZXMuXG4rXHQgKiBUaGUgZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IGNvbXByZXNzZWQgYW5kIHN0b3JlZCBpbiB0aGUgc3dhcCB0YWJsZSxcbitcdCAqIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcG9zc2liaWxpdHkgb2YgZmFpbHVyZS4gR3JhYiByZWZzIHRvIHRoZSBwb29sXG4rXHQgKiBhbmQgb2JqY2csIGNoYXJnZSB6c3dhcCBtZW1vcnksIGFuZCBpbmNyZW1lbnQgenN3YXBfc3RvcmVkX3BhZ2VzLlxuIFx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXG4tXHQgKiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUuXG4rXHQgKiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHN3YXAgdGFibGUuXG4gXHQgKi9cbiBcdHpzd2FwX3Bvb2xfZ2V0KHBvb2wpO1xuIFx0aWYgKG9iamNnKSB7XG5AQCAtMTQ0Niw4ICsxNDUzLDggQEAgc3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSxcbiBcdFx0YXRvbWljX2xvbmdfaW5jKFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XG4gXG4gXHQvKlxuLVx0ICogV2UgZmluaXNoIGluaXRpYWxpemluZyB0aGUgZW50cnkgd2hpbGUgaXQncyBhbHJlYWR5IGluIHhhcnJheS5cbi1cdCAqIFRoaXMgaXMgc2FmZSBiZWNhdXNlOlxuK1x0ICogV2UgZmluaXNoIGluaXRpYWxpemluZyB0aGUgZW50cnkgd2hpbGUgaXQncyBhbHJlYWR5IGluIHRoZVxuK1x0ICogc3dhcCB0YWJsZS4gVGhpcyBpcyBzYWZlIGJlY2F1c2U6XG4gXHQgKlxuIFx0ICogMS4gQ29uY3VycmVudCBzdG9yZXMgYW5kIGludmFsaWRhdGlvbnMgYXJlIGV4Y2x1ZGVkIGJ5IGZvbGlvIGxvY2suXG4gXHQgKlxuQEAgLTE0NjYsOCArMTQ3Myw2IEBAIHN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsXG4gXG4gXHRyZXR1cm4gdHJ1ZTtcbiBcbi1zdG9yZV9mYWlsZWQ6XG4tXHR6c19mcmVlKHBvb2wtXHUwMDNlenNfcG9vbCwgZW50cnktXHUwMDNlaGFuZGxlKTtcbiBjb21wcmVzc19mYWlsZWQ6XG4gXHR6c3dhcF9lbnRyeV9jYWNoZV9mcmVlKGVudHJ5KTtcbiBcdHJldHVybiBmYWxzZTtcbkBAIC0xNTQ2LDExICsxNTUxLDMxIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0dW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7XG4gXHRcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xuIFx0XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuLVx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xuK1x0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuK1x0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzO1xuK1x0XHR1bnNpZ25lZCBsb25nIHN3cF90YjtcbiBcbitcdFx0c2lzID0gX19zd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcbiBcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgKytpbmRleCkge1xuLVx0XHRcdHRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XG4tXHRcdFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgKyBpbmRleCk7XG4rXHRcdFx0Y2kgPSBfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2lzLCBvZmZzZXQgKyBpbmRleCk7XG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1x0XHRcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIChvZmZzZXQgKyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSKTtcbitcdFx0XHRpZiAoc3dwX3RiX2lzX3BvaW50ZXIoc3dwX3RiKSkge1xuK1x0XHRcdFx0ZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuK1x0XHRcdFx0LypcbitcdFx0XHRcdCAqIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHN3YXAgdGFibGUgZW50cnlcbitcdFx0XHRcdCAqIChTaGFkb3cgb3IgUEZOKSB0aGF0IHdhcyBzYXZlZCB3aGVuIHRoZVxuK1x0XHRcdFx0ICogUG9pbnRlciBlbnRyeSB3YXMgY3JlYXRlZCwgcmF0aGVyIHRoYW5cbitcdFx0XHRcdCAqIHplcm9pbmcgdGhlIHNsb3QuICBUaGlzIHByZXNlcnZlcyB0aGUgc3dhcFxuK1x0XHRcdFx0ICogY291bnQgYW5kIGZsYWdzIHNvIHRoZSBzd2FwIGNhY2hlIGZvbGlvXG4rXHRcdFx0XHQgKiBjYW4gYmUgY29ycmVjdGx5IGNsZWFuZWQgdXAgbGF0ZXIuXG4rXHRcdFx0XHQgKi9cbitcdFx0XHRcdF9fc3dhcF90YWJsZV9zZXQoY2ksIChvZmZzZXQgKyBpbmRleCkgJSBTV0FQRklMRV9DTFVTVEVSLFxuK1x0XHRcdFx0XHRcdCBlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbitcdFx0XHR9IGVsc2Uge1xuK1x0XHRcdFx0ZW50cnkgPSBOVUxMO1xuK1x0XHRcdH1cbitcdFx0XHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiBcdFx0XHRpZiAoZW50cnkpXG4gXHRcdFx0XHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcbiBcdFx0fVxuQEAgLTE1NjIsNiArMTU4NywxMSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gLyoqXG4gICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbiAgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbisgKiBAemVudHJ5OiB6c3dhcF9lbnRyeSBwb2ludGVyIGV4dHJhY3RlZCBmcm9tIHN3YXAgdGFibGUsIG9yIE5VTExcbisgKlxuKyAqIFRoZSB6c3dhcF9lbnRyeSB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIHN3YXAgdGFibGUgUG9pbnRlciBlbnRyeSBieVxuKyAqIF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW8gYmVmb3JlIGl0IG92ZXJ3cm90ZSB0aGUgZW50cnkgd2l0aCBhIFBGTi5cbisgKiBJZiBAemVudHJ5IGlzIE5VTEwsIHRoZSBzbG90IHdhcyBub3QgYmFja2VkIGJ5IHpzd2FwLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXG4gICogb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczpcbkBAIC0xNTc5LDEyICsxNjA5LDkgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuICAqICAtRU5PRU5UOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgbm90IGluIHpzd2FwLiBUaGUgZm9saW8gcmVtYWluc1xuICAqICBsb2NrZWQgb24gcmV0dXJuLlxuICAqL1xuLWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4raW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqemVudHJ5KVxuIHtcbi1cdHN3cF9lbnRyeV90IHN3cCA9IGZvbGlvLVx1MDAzZXN3YXA7XG4tXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcbi1cdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4rXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gemVudHJ5O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xuIFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xuQEAgLTE2MDIsNyArMTYyOSw2IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuIFxuLVx0ZW50cnkgPSB4YV9sb2FkKHRyZWUsIG9mZnNldCk7XG4gXHRpZiAoIWVudHJ5KVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbkBAIC0xNjI1LDcgKzE2NTEsNiBAQCBpbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0ICogY29tcHJlc3Npb24gd29yay5cbiBcdCAqL1xuIFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHR4YV9lcmFzZSh0cmVlLCBvZmZzZXQpO1xuIFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XG4gXG4gXHRmb2xpb191bmxvY2soZm9saW8pO1xuQEAgLTE2MzUsNTIgKzE2NjAsMTU5IEBAIGludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gdm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcbiB7XG4gXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcbitcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4rXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4rXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcbiBcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4gXG4tXHRpZiAoeGFfZW1wdHkodHJlZSkpXG4rXHRzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoc3dwKSk7XG4rXHRjaSA9IF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgb2Zmc2V0KTtcbitcdC8qXG4rXHQgKiBEbyBhIGxvY2tsZXNzIHBlZWsgZmlyc3QuICBJZiBjaS1cdTAwM2Vsb2NrIGlzIGFscmVhZHkgaGVsZCBieVxuK1x0ICogdGhlIGNhbGxlciAoZS5nLiBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMpLCBhbmQgdGhlXG4rXHQgKiBQb2ludGVyIGhhcyBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgd2UgY2FuIGJhaWwgb3V0IHdpdGhvdXRcbitcdCAqIHNlbGYtZGVhZGxvY2tpbmcuXG4rXHQgKi9cbitcdHN3cF90YiA9IF9fc3dhcF90YWJsZV9nZXQoY2ksIG9mZnNldCAlIFNXQVBGSUxFX0NMVVNURVIpO1xuK1x0aWYgKCFzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4rXHRzcGluX2xvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4rXHRzd3BfdGIgPSBfX3N3YXBfdGFibGVfZ2V0KGNpLCBvZmZzZXQgJSBTV0FQRklMRV9DTFVTVEVSKTtcbitcdGlmIChzd3BfdGJfaXNfcG9pbnRlcihzd3BfdGIpKSB7XG4rXHRcdGVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcdFx0LypcbitcdFx0ICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSAoU2hhZG93IG9yIFBGTilcbitcdFx0ICogdGhhdCB3YXMgc2F2ZWQgaW4gc3dwX3RiX3ZhbCB3aGVuIHRoZSBQb2ludGVyIGVudHJ5XG4rXHRcdCAqIHdhcyBjcmVhdGVkLiAgVGhpcyBwcmVzZXJ2ZXMgc3dhcCBjb3VudCBhbmQgZmxhZ3NcbitcdFx0ICogZm9yIHRoZSBzdWJzZXF1ZW50IHNsb3QtZnJlZSBwYXRoLlxuK1x0XHQgKi9cbitcdFx0X19zd2FwX3RhYmxlX3NldChjaSwgb2Zmc2V0ICUgU1dBUEZJTEVfQ0xVU1RFUixcbitcdFx0XHRcdCBlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbitcdH0gZWxzZSB7XG4rXHRcdGVudHJ5ID0gTlVMTDtcbitcdH1cbitcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1xuIFx0aWYgKGVudHJ5KVxuIFx0XHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcbiB9XG4gXG4taW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbisvKlxuKyAqIEV4dHJhY3QgdGhlIHdvcmtpbmcgc2V0IHNoYWRvdyBmcm9tIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXG4rICogVGhlIHNoYWRvdyBpcyByZWNvdmVyZWQgZnJvbSB6c3dhcF9lbnRyeS1cdTAwM2Vzd3BfdGJfdmFsIHdoaWNoIHByZXNlcnZlc1xuKyAqIHRoZSBvcmlnaW5hbCBTaGFkb3cgZW50cnkgdmFsdWUuIFRoZSBzaGFkb3cgY2FuIHRoZW4gYmUgdXNlZCBieVxuKyAqIHdvcmtpbmdzZXRfcmVmYXVsdCgpIGZvciByZWZhdWx0IGRpc3RhbmNlIGNhbGN1bGF0aW9uLlxuKyAqL1xuK3ZvaWQgKnpzd2FwX3N3cF90Yl9nZXRfc2hhZG93KHVuc2lnbmVkIGxvbmcgc3dwX3RiKVxuIHtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWVzLCAqdHJlZTtcbi1cdHVuc2lnbmVkIGludCBuciwgaTtcbitcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuK1x0dW5zaWduZWQgbG9uZyBzYXZlZCA9IGVudHJ5LVx1MDAzZXN3cF90Yl92YWw7XG4gXG4tXHRuciA9IERJVl9ST1VORF9VUChucl9wYWdlcywgWlNXQVBfQUREUkVTU19TUEFDRV9QQUdFUyk7XG4tXHR0cmVlcyA9IGt2emFsbG9jX29ianMoKnRyZWUsIG5yKTtcbi1cdGlmICghdHJlZXMpIHtcbi1cdFx0cHJfZXJyKFwiYWxsb2MgZmFpbGVkLCB6c3dhcCBkaXNhYmxlZCBmb3Igc3dhcCB0eXBlICVkXFxuXCIsIHR5cGUpO1xuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdH1cbitcdC8qXG4rXHQgKiBzd3BfdGJfdmFsIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeS4gIE9ubHlcbitcdCAqIFNoYWRvdyBlbnRyaWVzIGNhcnJ5IHdvcmtpbmdzZXQgaW5mb3JtYXRpb247IFBGTiBhbmQgTlVMTFxuK1x0ICogZW50cmllcyBoYXZlIG5vIHNoYWRvdyB0byBleHRyYWN0LlxuK1x0ICovXG4rXHRpZiAoIXN3cF90Yl9pc19zaGFkb3coc2F2ZWQpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdHJldHVybiAodm9pZCAqKShzYXZlZCBcdTAwMjYgflNXUF9UQl9GTEFHU19NQVNLKTtcbit9XG4rXG4rLypcbisgKiBSZWFkIHRoZSBzd2FwIGNvdW50IGZyb20gYSBQb2ludGVyLXR5cGUgc3dhcCB0YWJsZSBlbnRyeS4gVGhlIGNvdW50XG4rICogYW5kIGZsYWdzIGFyZSBzdG9yZWQgaW4genN3YXBfZW50cnktXHUwMDNlc3dwX3RiX3ZhbCB3aGljaCBwcmVzZXJ2ZXMgdGhlXG4rICogb3JpZ2luYWwgc3dhcCB0YWJsZSBlbnRyeSB2YWx1ZSAoU2hhZG93IG9yIFBGTiBmb3JtYXQpLlxuKyAqL1xuK3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9jb3VudCh1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcbitcdHJldHVybiBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCk7XG4rfVxuK1xuKy8qXG4rICogUmVhZCB0aGUgZmxhZ3MgZnJvbSBhIFBvaW50ZXItdHlwZSBzd2FwIHRhYmxlIGVudHJ5LlxuKyAqL1xuK3Vuc2lnbmVkIGNoYXIgenN3YXBfc3dwX3RiX2dldF9mbGFncyh1bnNpZ25lZCBsb25nIHN3cF90Yilcbit7XG4rXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcbitcdHJldHVybiBfX3N3cF90Yl9nZXRfZmxhZ3MoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCk7XG4rfVxuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKylcbi1cdFx0eGFfaW5pdCh0cmVlcyArIGkpO1xuKy8qXG4rICogSW5jcmVtZW50IHRoZSBzd2FwIGNvdW50IG9mIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXG4rICogVGhlIGNvdW50IGlzIHN0b3JlZCBpbiB6c3dhcF9lbnRyeS1cdTAwM2Vzd3BfdGJfdmFsIGZvciBjb3VudHMgYmVsb3dcbisgKiBTV1BfVEJfQ09VTlRfTUFYLCBhbmQgb3ZlcmZsb3dzIGludG8gdGhlIGNsdXN0ZXIncyBleHRlbmRfdGFibGVcbisgKiBqdXN0IGxpa2Ugbm9ybWFsIFNoYWRvdy9QRk4gZW50cmllcyBkby4gIFJldHVybnMgMCBvbiBzdWNjZXNzLFxuKyAqIC1FTk9NRU0gaWYgY291bnQgd291bGQgb3ZlcmZsb3cgYW5kIG5vIGV4dGVuZF90YWJsZSBpcyBhdmFpbGFibGUuXG4rICovXG4raW50IHpzd2FwX3N3cF90Yl9kdXBfY291bnQodW5zaWduZWQgbG9uZyBzd3BfdGIsXG4rXHRcdFx0ICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgdW5zaWduZWQgaW50IGNpX29mZilcbit7XG4rXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5ID0gc3dwX3RiX3RvX3BvaW50ZXIoc3dwX3RiKTtcbitcdHVuc2lnbmVkIGNoYXIgY291bnQgPSBfX3N3cF90Yl9nZXRfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCk7XG4gXG4tXHRucl96c3dhcF90cmVlc1t0eXBlXSA9IG5yO1xuLVx0enN3YXBfdHJlZXNbdHlwZV0gPSB0cmVlcztcbitcdGlmIChjb3VudCBcdTAwM2MgU1dQX1RCX0NPVU5UX01BWCkge1xuK1x0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCxcbitcdFx0XHRcdFx0XHQgICAgICBjb3VudCArIDEpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcdC8qIGNvdW50ID09IE1BWCwgb3ZlcmZsb3cgaW50byBleHRlbmRfdGFibGUgKi9cbitcdGlmICghY2ktXHUwMDNlZXh0ZW5kX3RhYmxlKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdGNvdW50ID0gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlW2NpX29mZl07XG4rXHRpZiAoY291bnQgPT0gMClcbitcdFx0Y291bnQgPSBTV1BfVEJfQ09VTlRfTUFYO1xuK1x0Y291bnQrKztcbitcdGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gY291bnQ7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tdm9pZCB6c3dhcF9zd2Fwb2ZmKGludCB0eXBlKVxuKy8qXG4rICogRGVjcmVtZW50IHRoZSBzd2FwIGNvdW50IG9mIGEgUG9pbnRlci10eXBlIHN3YXAgdGFibGUgZW50cnkuXG4rICogSGFuZGxlcyBib3RoIGlubGluZSBjb3VudCAoaW4gc3dwX3RiX3ZhbCkgYW5kIG92ZXJmbG93ZWQgY291bnRcbisgKiAoaW4gY2ktXHUwMDNlZXh0ZW5kX3RhYmxlKSwgbWF0Y2hpbmcgdGhlIGxvZ2ljIHVzZWQgYnkgbm9ybWFsIGVudHJpZXMuXG4rICovXG4rdm9pZCB6c3dhcF9zd3BfdGJfcHV0X2NvdW50KHVuc2lnbmVkIGxvbmcgc3dwX3RiLFxuK1x0XHRcdCAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCB1bnNpZ25lZCBpbnQgY2lfb2ZmKVxuIHtcbi1cdHN0cnVjdCB4YXJyYXkgKnRyZWVzID0genN3YXBfdHJlZXNbdHlwZV07XG4tXHR1bnNpZ25lZCBpbnQgaTtcbitcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnkgPSBzd3BfdGJfdG9fcG9pbnRlcihzd3BfdGIpO1xuK1x0dW5zaWduZWQgY2hhciBjb3VudCA9IF9fc3dwX3RiX2dldF9jb3VudChlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsKTtcbitcbitcdFZNX1dBUk5fT05fT05DRShjb3VudCA9PSAwKTtcbiBcbi1cdGlmICghdHJlZXMpXG4rXHRpZiAoY291bnQgPT0gU1dQX1RCX0NPVU5UX01BWCkge1xuK1x0XHRpZiAoIWNpLVx1MDAzZWV4dGVuZF90YWJsZSkge1xuK1x0XHRcdGNvdW50LS07XG4rXHRcdFx0ZW50cnktXHUwMDNlc3dwX3RiX3ZhbCA9IF9fc3dwX3RiX21rX2NvdW50KGVudHJ5LVx1MDAzZXN3cF90Yl92YWwsIGNvdW50KTtcbitcdFx0XHRyZXR1cm47XG4rXHRcdH1cbitcdFx0Y291bnQgPSBjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXTtcbitcdFx0LyogT3ZlcmZsb3cgc3RhcnRzIHdpdGggU1dQX1RCX0NPVU5UX01BWCAqL1xuK1x0XHRWTV9XQVJOX09OX09OQ0UoY291bnQgXHUwMDNjIFNXUF9UQl9DT1VOVF9NQVgpO1xuK1x0XHRjb3VudC0tO1xuK1x0XHRpZiAoY291bnQgPT0gKFNXUF9UQl9DT1VOVF9NQVggLSAxKSkge1xuK1x0XHRcdGNpLVx1MDAzZWV4dGVuZF90YWJsZVtjaV9vZmZdID0gMDtcbitcdFx0XHRlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsID0gX19zd3BfdGJfbWtfY291bnQoZW50cnktXHUwMDNlc3dwX3RiX3ZhbCxcbitcdFx0XHRcdFx0XHRcdCAgICAgIGNvdW50KTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRjaS1cdTAwM2VleHRlbmRfdGFibGVbY2lfb2ZmXSA9IGNvdW50O1xuK1x0XHR9XG4gXHRcdHJldHVybjtcbitcdH1cbitcdGVudHJ5LVx1MDAzZXN3cF90Yl92YWwgPSBfX3N3cF90Yl9ta19jb3VudChlbnRyeS1cdTAwM2Vzd3BfdGJfdmFsLCBjb3VudCAtIDEpO1xuK31cbiBcbi1cdC8qIHRyeV90b191bnVzZSgpIGludmFsaWRhdGVkIGFsbCB0aGUgZW50cmllcyBhbHJlYWR5ICovXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl96c3dhcF90cmVlc1t0eXBlXTsgaSsrKVxuLVx0XHRXQVJOX09OX09OQ0UoIXhhX2VtcHR5KHRyZWVzICsgaSkpO1xuK2ludCB6c3dhcF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuIFxuLVx0a3ZmcmVlKHRyZWVzKTtcbi1cdG5yX3pzd2FwX3RyZWVzW3R5cGVdID0gMDtcbi1cdHpzd2FwX3RyZWVzW3R5cGVdID0gTlVMTDtcbit2b2lkIHpzd2FwX3N3YXBvZmYoaW50IHR5cGUpXG4re1xuIH1cbiBcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QxNToxMToyMi4zODQ1MTUwN1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyMjM4OTU2NDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgWnN3YXAgRW50cnkgU3RvcmFnZSBQYXRjaCoqXG5cbk9rYXksIHNvIHdlJ3ZlIGdvdCBhIHBhdGNoIGhlcmUgdGhhdCdzIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IGB6c3dhcGAgbWFuYWdlcyBpdHMgZW50cmllcy4gSW5zdGVhZCBvZiB1c2luZyB0aGF0IHNlcGFyYXRlIGB4YXJyYXlgIHdlJ3JlIHVzZWQgdG8gKGB6c3dhcF90cmVlc2ApLCBpdCdzIG5vdyBkaXJlY3RseSBsaW5raW5nIGEgcG9pbnRlciB0byB0aGUgYHpzd2FwX2VudHJ5YCBzdHJ1Y3R1cmUgd2l0aGluIHRoZSBzd2FwIHRhYmxlcyB0aGVtc2VsdmVzIChgc3dhcF9tYXBgIG9yIGBzd2FwX2NsdXN0ZXJfaW5mb2ApLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgYXJjaGl0ZWN0dXJhbCBzaGlmdC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyByb2J1c3QuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0byB2ZXJpZnkgaXRzIGZ1bmN0aW9uYWxpdHkuIFRoaXMgaXMgYSBjb21wbGV0ZSBwYXJhZGlnbSBzaGlmdCBpbiB6c3dhcCdzIGVudHJ5IHRyYWNraW5nLiBJcyB6c3dhcCBldmVuIHJlYWNoYWJsZSBpZiB0aGlzIGZhaWxzPyBZZXMsIGl0J3MgYSBjb3JlIGZlYXR1cmUsIHNvIHRoYXQncyBhIGNoZWNrLiBJcyB0aGlzIGNoYW5nZSB3b3J0aHkgb2YgZnV6emluZz8gQWJzb2x1dGVseTsgaXQncyBhIHJhZGljYWwgbW9kaWZpY2F0aW9uIHRvIGhvdyBzd2FwIGFuZCB6c3dhcCBpbnRlcmFjdC4gVGhhdCBuZWNlc3NpdGF0ZXMgZnV6emluZyB0byByb290IG91dCBhbnkgc3VidGxlIGJ1Z3MuXG5cbk5vdywgSSBuZWVkIHRvIHBpbnBvaW50IHRoZSBjcml0aWNhbCBmdW5jdGlvbnMgdGhpcyBwYXRjaCB0b3VjaGVzLiBMb29rcyBsaWtlIHRoZSBjb3JlIGBtbS96c3dhcC5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AgYXJlIHdoZXJlIHRoZSBidWxrIG9mIHRoZSBjaGFuZ2VzIHJlc2lkZS4gRnJvbSBhIHF1aWNrIHNjYW4sIGl0IGxvb2tzIGxpa2UgdGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQ6IGB6c3dhcF9zdG9yZWAsIGB6c3dhcF9sb2FkYCwgYHpzd2FwX2ludmFsaWRhdGVgLCBgenN3YXBfd3JpdGViYWNrX2VudHJ5YCwgYHpzd2FwX3N0b3JlX3BhZ2VgLCBgX19zd2FwX2NhY2hlX2FkZF9mb2xpb2AsIGBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvYCwgYF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9gLCBgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5YCwgYF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllc2AsIGBzd2FwX3B1dF9lbnRyaWVzX2NsdXN0ZXJgLCBhbmQgYF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeWAuIEkgbmVlZCB0byBkaWcgaW50byB0aG9zZSBmdW5jdGlvbnMuIExldCBtZSByZXZpZXcgYG1tL3pzd2FwLmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYC4gTG9va3MgbGlrZSBpdCdzIGEgZmV3IG1vcmUgdGhhbiB0aGUgbGlzdCBJIGluaXRpYWxseSBjb25zdHJ1Y3RlZDogYHpzd2FwX3N0b3JlYCwgYHpzd2FwX2xvYWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGB6c3dhcF93cml0ZWJhY2tfZW50cnlgLCBgenN3YXBfc3dwX3RiX2R1cF9jb3VudGAsIGB6c3dhcF9zd3BfdGJfcHV0X2NvdW50YCwgYHpzd2FwX3N3cF90Yl9nZXRfc2hhZG93YCwgYHpzd2FwX3N3cF90Yl9nZXRfY291bnRgLCBgenN3YXBfc3dwX3RiX2dldF9mbGFnc2AuIGBfX3N3YXBfY2FjaGVfYWRkX2NoZWNrYCwgYF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9gLCBgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpb2AsIGBfX3N3YXBfY2FjaGVfYWxsb2NgLCBgc3dhcF9jYWNoZV9hbGxvY19mb2xpb2AsIGBzd2FwX2NhY2hlX3JlYWRfZm9saW9gLCBgc3dhcGluX3N5bmNgLiBgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllc2AsIGBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlgLCBgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyYCwgYF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeWAsIGBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXNgLCBgX19zd2FwX2NvdW50YCwgYHN3YXBfZW50cnlfc3dhcHBlZGAsIGB1bnVzZV9wdGVfcmFuZ2VgLlxuXG5OZXh0LCBJIG5lZWQgdG8gaWRlbnRpZnkgYW55IHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gYENPTkZJR19aU1dBUGAgaXMgb2J2aW91c2x5IGVzc2VudGlhbC4gSSBzaG91bGQgY2hlY2sgYG1tL0tjb25maWdgIG9yIGV2ZW4gYG1tL3pzd2FwLmNgIGl0c2VsZiB0byBjb25maXJtIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgb3IgaW1wbGljYXRpb25zLiBgQ09ORklHX1NXQVBgIGlzIGltcGxpY2l0bHkgZW5hYmxlZCB3aGVuIGBDT05GSUdfWlNXQVBgIGlzLCBzbyBJJ2xsIGtlZXAgYW4gZXllIG91dCBmb3IgYW55IG90aGVycyB0aGF0IG1pZ2h0IGJlIHJlcXVpcmVkIG9yIGFmZmVjdGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzg4NCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY2MywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDE1OjExOjM0LjYyMzQ3NDY4WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM3NDA0MDY2NjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFpTV0FQXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTEyPW1lbnVjb25maWcgU1dBUFxcbi0tXFxubW0vS2NvbmZpZy0yMS1cXG5tbS9LY29uZmlnOjIyOmNvbmZpZyBaU1dBUFxcbm1tL0tjb25maWctMjMtXFx0Ym9vbCBcXFwiQ29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1xcXCJcXG4tLVxcbm1tL0tjb25maWctMzQtXFxubW0vS2NvbmZpZzozNTpjb25maWcgWlNXQVBfREVGQVVMVF9PTlxcbm1tL0tjb25maWctMzYtXFx0Ym9vbCBcXFwiRW5hYmxlIHRoZSBjb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzIGJ5IGRlZmF1bHRcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTQ0LVxcbm1tL0tjb25maWc6NDU6Y29uZmlnIFpTV0FQX1NIUklOS0VSX0RFRkFVTFRfT05cXG5tbS9LY29uZmlnLTQ2LVxcdGJvb2wgXFxcIlNocmluayB0aGUgenN3YXAgcG9vbCBvbiBtZW1vcnkgcHJlc3N1cmVcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTU5PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy03Ni1cXG5tbS9LY29uZmlnOjc3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfREVGTEFURVxcbm1tL0tjb25maWctNzgtXFx0Ym9vbCBcXFwiRGVmbGF0ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODItXFxubW0vS2NvbmZpZzo4Mzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaT1xcbm1tL0tjb25maWctODQtXFx0Ym9vbCBcXFwiTFpPXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04OC1cXG5tbS9LY29uZmlnOjg5OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfODQyXFxubW0vS2NvbmZpZy05MC1cXHRib29sIFxcXCI4NDJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0LVxcbm1tL0tjb25maWc6OTU6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRcXG5tbS9LY29uZmlnLTk2LVxcdGJvb2wgXFxcIkxaNFxcXCJcXG4tLVxcbm1tL0tjb25maWctMTAwLVxcbm1tL0tjb25maWc6MTAxOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0SENcXG5tbS9LY29uZmlnLTEwMi1cXHRib29sIFxcXCJMWjRIQ1xcXCJcXG4tLVxcbm1tL0tjb25maWctMTA2LVxcbm1tL0tjb25maWc6MTA3OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfWlNURFxcbm1tL0tjb25maWctMTA4LVxcdGJvb2wgXFxcInpzdGRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTExMj1lbmRjaG9pY2VcXG5tbS9LY29uZmlnLTExMy1cXG5tbS9LY29uZmlnOjExNDpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXFxubW0vS2NvbmZpZy0xMTUtICAgICAgIHN0cmluZ1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QxNToxMTozOC4zNjM4ODc4MDdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNTgxNDU0NTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSB3ZXJlIG15IG93bjpcblxuKipFbmFibGluZyBaU1dBUDogQSBTdHJlYW1saW5lZCBQYXRoIHRvIFBlcmZvcm1hbmNlKipcblxuUmlnaHQsIHNvIEknbSB0aGlua2luZywgZ2l2ZW4gdGhlIGNvbnRleHQsIGVuYWJsaW5nIGBaU1dBUGAgYW5kIHNldHRpbmcgYFpTV0FQX0RFRkFVTFRfT05gIHNlZW1zIGxpa2UgdGhlIHNlbnNpYmxlIG5leHQgc3RlcC4gIFdlJ3JlIGxvb2tpbmcgZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cywgYW5kIHRoaXMgaXMgYSBjbGFzc2ljIGFwcHJvYWNoLlxuXG5CZWZvcmUgSSBqdW1wIHRvIGFueSBjb25jbHVzaW9ucywgSSdkIGJldHRlciBkb3VibGUtY2hlY2sgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBTbywgbGV0J3MgaGVhZCBvdmVyIHRvIGBtbS9LY29uZmlnYCBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvYnZpb3VzIGNvbmZsaWN0cyBvciBwcmVyZXF1aXNpdGVzIEkndmUgbWlzc2VkLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiB0aGF0IGFyZWEgLSBlbnN1cmUgdGhlcmUgaXMgbm90aGluZyBwcmV2ZW50aW5nIG9yIHJlcXVpcmluZyBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gR290dGEgbWFrZSBzdXJlIHRoZXJlIGFyZW4ndCBhbnkgZ290Y2hhcyBpbiB0aGUgc2V0dXAsIG9yIGRlcGVuZGVuY2llcyBJIG5lZWQgdG8gYmUgYXdhcmUgb2YuIEJldHRlciBzYWZlIHRoYW4gc29ycnkgd2hlbiBtYWtpbmcgdGhlc2Uga2luZHMgb2YgY2hhbmdlcy4gIFRoZW4sIHdlIGNhbiBldmFsdWF0ZSB0aGUgYnJvYWRlciBpbXBsaWNhdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5ODM3LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMTU6MTE6NDEuOTQ1MzQ2NDE0WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQwNzM4MDk2MzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFpTV0FQX0RFRkFVTFRfT05cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9MjI9Y29uZmlnIFpTV0FQXFxuLS1cXG5tbS9LY29uZmlnLTM0LVxcbm1tL0tjb25maWc6MzU6Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cXG5tbS9LY29uZmlnLTM2LVxcdGJvb2wgXFxcIkVuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QxNToxMTo0Ni4wMTkxNjE3NjlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjQ4NzgzMzA0NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBac3dhcCBDaGFuZ2VzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgenN3YXAgcGF0Y2gsIGFuZCBoZXJlJ3MgbXkgdHJhaW4gb2YgdGhvdWdodC4gRmlyc3QsIEkgbmVlZCB0byBwaW5wb2ludCB0aGUga2V5IGZ1bmN0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaGF2ZSBiZWVuIHRvdWNoZWQuIEkgc3RhcnRlZCBieSBpZGVudGlmeWluZyBhIGxpc3Qgb2Ygc3ltYm9scyBJIHNlZSBhcyBwb3RlbnRpYWxseSBpbXBvcnRhbnQuIExldCdzIHNlZS4uLiBJJ3ZlIGdvdCBgenN3YXBfc3RvcmVgLCBgenN3YXBfbG9hZGAsIGB6c3dhcF9pbnZhbGlkYXRlYCwgYHpzd2FwX3dyaXRlYmFja19lbnRyeWAsIGBfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvYCwgYF9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9gLCBgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5YCwgYF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllc2AsIGBzd2FwX3B1dF9lbnRyaWVzX2NsdXN0ZXJgLCBhbmQgYF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeWAuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIG9mIHRoZXNlIGFyZSBhY3R1YWxseSAqc2lnbmlmaWNhbnQqIGluIHRlcm1zIG9mIGNoYW5nZXMuXG5cbk5leHQsIEknbSBjaGVja2luZyB0aGVpciBzY29wZS4gSXMgaXQgc3RhdGljIG9yIGV4cG9ydGVkPyBJJ3ZlIGZpbHRlcmVkIHRoZSBsaXN0IGRvd24sIGZvY3VzaW5nIG9uIGZ1bmN0aW9ucyBhbmQgZ2xvYmFscyB0aGF0IGFyZSBleHBvc2VkIG9yIGhhdmUgc3Vic3RhbnRpYWwgbG9naWMgaW52b2x2ZWQuIE15IHJldmlzZWQga2V5IGxpc3Qgbm93IGxvb2tzIGxpa2U6IGB6c3dhcF9zdG9yZWAsIGB6c3dhcF9sb2FkYCwgYHpzd2FwX2ludmFsaWRhdGVgLCBgenN3YXBfd3JpdGViYWNrX2VudHJ5YCwgYF9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9gLCBgX19zd2FwX2NhY2hlX2RvX2RlbF9mb2xpb2AsIGBfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlgLCBgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzYCwgYW5kIGBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlgLiBJIHRoZW4gaWRlbnRpZmllZCB0aGF0IGB6c3dhcF9zd3BfdGJfZHVwX2NvdW50YCBhbmQgYHpzd2FwX3N3cF90Yl9wdXRfY291bnRgIGFyZSBhbHNvIGdsb2JhbCwgbWVhbmluZyB0aGV5IG5lZWQgdG8gYmUgd2F0Y2hlZC5cblxuTm93IEkgdW5kZXJzdGFuZCB0aGUgY29yZSBvZiB0aGUgY2hhbmdlOiB0aGUgcGF0Y2ggaXMgZnVuZGFtZW50YWxseSBhbHRlcmluZyBob3cgenN3YXAgbWFuYWdlcyBjb21wcmVzc2VkIHBhZ2VzLiBJdCdzIGVtYmVkZGluZyB0aGUgYHpzd2FwX2VudHJ5YCBwb2ludGVycyBkaXJlY3RseSBpbnRvIHRoZSBgc3dhcF9jbHVzdGVyX2luZm9gIHN0cnVjdHVyZXMuIFRoaXMgaXMgYSBiaWcgZGVhbCBiZWNhdXNlIGl0IG1lYW5zIHRoZSBjb3JlIHN3YXAgYWxsb2NhdGlvbiwgZnJlZWluZywgYW5kIGxvb2t1cCBwYXRocyBhcmUgYmVpbmcgcmVzaGFwZWQuIFRoaXMgaXMgd2hlcmUgSSBzdGFydCB0aGlua2luZyBhYm91dCB0aGUgcG90ZW50aWFsIHBpdGZhbGxzIGFuZCB0aGUgYXJlYXMgSSBuZWVkIHRvIGZvY3VzIG9uLlxuXG5UaGlzIGFwcHJvYWNoIHdpbGwgaW50cm9kdWNlIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnNpZGVyYXRpb25zLCBhbmQgSSBuZWVkIHRvIGVuc3VyZSB0aGF0IGNvbmN1cnJlbnQgc3dhcCBvcGVyYXRpb25zIGRvbid0IGxlYWQgdG8gbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZXMsIG9yIGVycm9ycyBpbiBzd2FwIGFjY291bnRpbmcuIEknbSBhbHJlYWR5IG1lbnRhbGx5IGZsYWdnaW5nIHRoaXMgZm9yIHRob3JvdWdoIGZ1enppbmcgYW5kIHJpZ29yb3VzIHRlc3RpbmcuXG5cbkZpbmFsbHksIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzZXQuIEkgbmVlZCBgWlNXQVBgIGVuYWJsZWQsIGFuZCwgZm9yIGRlZmF1bHQgdXNhZ2UsIGBaU1dBUF9ERUZBVUxUX09OYCBhcyB3ZWxsLiBXaXRoIHRoaXMgZG9uZSwgSSdtIHJlYWR5IHRvIGNhbGwgdGhlIG5leHQgc3RlcC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAxNzksIk91dHB1dFRva2VucyI6MjQ1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDE1OjExOjU4LjUwNjk5OTc3NVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc1NTkyNjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiWlNXQVBfREVGQVVMVF9PTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9sb2FkXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCIsXG4gICAgXCJ6c3dhcF93cml0ZWJhY2tfZW50cnlcIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19hZGRfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jYWNoZV9kb19kZWxfZm9saW9cIixcbiAgICBcIl9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeVwiLFxuICAgIFwiX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzXCIsXG4gICAgXCJfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnlcIixcbiAgICBcInpzd2FwX3N3cF90Yl9kdXBfY291bnRcIixcbiAgICBcInpzd2FwX3N3cF90Yl9wdXRfY291bnRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGNoYW5nZXMgaG93IHpzd2FwIHRyYWNrcyBjb21wcmVzc2VkIHBhZ2VzIGJ5IGVtYmVkZGluZyBgenN3YXBfZW50cnlgIHBvaW50ZXJzIGRpcmVjdGx5IGludG8gdGhlIGNvcmUgc3dhcCB0YWJsZSAoYHN3YXBfY2x1c3Rlcl9pbmZvYCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSB4YXJyYXkgKGB6c3dhcF90cmVlc2ApLiBUaGlzIGFmZmVjdHMgY29yZSBzd2FwIGFsbG9jYXRpb24sIGZyZWVpbmcsIGFuZCBsb29rdXAgcGF0aHMsIHJlcXVpcmluZyBmdXp6aW5nIHRvIGVuc3VyZSBubyBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlcywgb3Igc3dhcCBhY2NvdW50aW5nIGVycm9ycyBvY2N1ciBkdXJpbmcgY29uY3VycmVudCBzd2FwIG9wZXJhdGlvbnMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiWlNXQVBcIixcbiAgICBcIlpTV0FQX0RFRkFVTFRfT05cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6c3dhcF9zdG9yZVwiLFxuICAgIFwienN3YXBfbG9hZFwiLFxuICAgIFwienN3YXBfaW52YWxpZGF0ZVwiLFxuICAgIFwienN3YXBfd3JpdGViYWNrX2VudHJ5XCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfZG9fYWRkX2ZvbGlvXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfZG9fZGVsX2ZvbGlvXCIsXG4gICAgXCJfX3N3YXBfY2x1c3Rlcl9wdXRfZW50cnlcIixcbiAgICBcIl9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllc1wiLFxuICAgIFwiX19zd2FwX2NsdXN0ZXJfZHVwX2VudHJ5XCIsXG4gICAgXCJ6c3dhcF9zd3BfdGJfZHVwX2NvdW50XCIsXG4gICAgXCJ6c3dhcF9zd3BfdGJfcHV0X2NvdW50XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZnVuZGFtZW50YWxseSBjaGFuZ2VzIGhvdyB6c3dhcCB0cmFja3MgY29tcHJlc3NlZCBwYWdlcyBieSBlbWJlZGRpbmcgYHpzd2FwX2VudHJ5YCBwb2ludGVycyBkaXJlY3RseSBpbnRvIHRoZSBjb3JlIHN3YXAgdGFibGUgKGBzd2FwX2NsdXN0ZXJfaW5mb2ApIHJhdGhlciB0aGFuIHVzaW5nIGEgc2VwYXJhdGUgeGFycmF5IChgenN3YXBfdHJlZXNgKS4gVGhpcyBhZmZlY3RzIGNvcmUgc3dhcCBhbGxvY2F0aW9uLCBmcmVlaW5nLCBhbmQgbG9va3VwIHBhdGhzLCByZXF1aXJpbmcgZnV6emluZyB0byBlbnN1cmUgbm8gbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZXMsIG9yIHN3YXAgYWNjb3VudGluZyBlcnJvcnMgb2NjdXIgZHVyaW5nIGNvbmN1cnJlbnQgc3dhcCBvcGVyYXRpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflow2hc96[1] Phase: Succeeded StartedAt: 2026-07-07 15:13:00 +0000 UTC FinishedAt: 2026-07-07 15:13:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-07 15:13:00 +0000 UTC FinishedAt: 2026-07-07 15:13:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2] Phase: Succeeded StartedAt: 2026-07-07 15:13:00 +0000 UTC FinishedAt: 2026-07-07 19:43:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:13:00 +0000 UTC FinishedAt: 2026-07-07 19:43:03 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:13:00 +0000 UTC FinishedAt: 2026-07-07 15:13:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:13:00 +0000 UTC FinishedAt: 2026-07-07 15:13:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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-workflow2hc96/series-workflow2hc96-convert-artifact-2846784653/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:13:22 +0000 UTC FinishedAt: 2026-07-07 15:39:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:13:22 +0000 UTC FinishedAt: 2026-07-07 15:39:06 +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:*0be5c455-b6b7-4512-a6a1-e47e3c931392,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-workflow2hc96/series-workflow2hc96-convert-artifact-2846784653/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": "5d693989-ae37-4121-9d80-48360bb9073c", "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-workflow2hc96/series-workflow2hc96-build-action-2590365699/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:13:22 +0000 UTC FinishedAt: 2026-07-07 15:38:55 +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:*0be5c455-b6b7-4512-a6a1-e47e3c931392,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-workflow2hc96/series-workflow2hc96-convert-artifact-2846784653/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": "5d693989-ae37-4121-9d80-48360bb9073c", "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-workflow2hc96/series-workflow2hc96-build-action-2590365699/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:39:06 +0000 UTC FinishedAt: 2026-07-07 15:39:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:39:06 +0000 UTC FinishedAt: 2026-07-07 15:39:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:39:06 +0000 UTC FinishedAt: 2026-07-07 15:39:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:39:06 +0000 UTC FinishedAt: 2026-07-07 15:39:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-workflow2hc96/series-workflow2hc96-convert-artifact-415069672/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:39:16 +0000 UTC FinishedAt: 2026-07-07 15:41:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:39:16 +0000 UTC FinishedAt: 2026-07-07 15:41:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*5d693989-ae37-4121-9d80-48360bb9073c,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-workflow2hc96/series-workflow2hc96-build-action-2590365699/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-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:41:18 +0000 UTC FinishedAt: 2026-07-07 15:41:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:41:18 +0000 UTC FinishedAt: 2026-07-07 15:41:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:41:18 +0000 UTC FinishedAt: 2026-07-07 16:32:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:41:18 +0000 UTC FinishedAt: 2026-07-07 16:32:50 +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:*0be5c455-b6b7-4512-a6a1-e47e3c931392,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-workflow2hc96/series-workflow2hc96-convert-artifact-415069672/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": "65f10583-d539-4b33-8ba9-494d42eb9593", "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-workflow2hc96/series-workflow2hc96-build-action-1084894612/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 15:41:18 +0000 UTC FinishedAt: 2026-07-07 16:21:53 +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:*0be5c455-b6b7-4512-a6a1-e47e3c931392,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-workflow2hc96/series-workflow2hc96-convert-artifact-415069672/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": "65f10583-d539-4b33-8ba9-494d42eb9593", "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-workflow2hc96/series-workflow2hc96-build-action-1084894612/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:32:50 +0000 UTC FinishedAt: 2026-07-07 16:32:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:32:50 +0000 UTC FinishedAt: 2026-07-07 16:32:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:32:50 +0000 UTC FinishedAt: 2026-07-07 16:35:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:32:50 +0000 UTC FinishedAt: 2026-07-07 16:35:14 +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:*65f10583-d539-4b33-8ba9-494d42eb9593,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-workflow2hc96/series-workflow2hc96-build-action-1084894612/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-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:35:24 +0000 UTC FinishedAt: 2026-07-07 19:43:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:35:24 +0000 UTC FinishedAt: 2026-07-07 19:43:03 +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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"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:*5d693989-ae37-4121-9d80-48360bb9073c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*65f10583-d539-4b33-8ba9-494d42eb9593,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-workflow2hc96/series-workflow2hc96-build-action-2590365699/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-workflow2hc96/series-workflow2hc96-build-action-1084894612/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:35:24 +0000 UTC FinishedAt: 2026-07-07 16:36:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:35:24 +0000 UTC FinishedAt: 2026-07-07 16:36:25 +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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"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-workflow2hc96/series-workflow2hc96-convert-artifact-3664268833/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:35:24 +0000 UTC FinishedAt: 2026-07-07 16:35:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:35:24 +0000 UTC FinishedAt: 2026-07-07 16:35:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:35:24 +0000 UTC FinishedAt: 2026-07-07 16:35:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:36:52 +0000 UTC FinishedAt: 2026-07-07 19:43:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2hc96[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"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":["zswap_store","zswap_load","zswap_invalidate","zswap_writeback_entry","__swap_cache_do_add_folio","__swap_cache_do_del_folio","__swap_cluster_put_entry","__swap_cluster_free_entries","__swap_cluster_dup_entry","zswap_swp_tb_dup_count","zswap_swp_tb_put_count"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"01bc0932614c2d3c35e732f54d249b5897d94307","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","ZSWAP_DEFAULT_ON"],"series_id":"1a9cfadb-ed85-48c1-b1b3-a3c12ea99471","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-07-07 16:36:52 +0000 UTC FinishedAt: 2026-07-07 19:42:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*5d693989-ae37-4121-9d80-48360bb9073c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*65f10583-d539-4b33-8ba9-494d42eb9593,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-workflow2hc96/series-workflow2hc96-build-action-2590365699/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-workflow2hc96/series-workflow2hc96-build-action-1084894612/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-workflow2hc96/series-workflow2hc96-convert-artifact-3664268833/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,}