Name: series-workflow4dljg Phase: Succeeded StartedAt: 2026-08-05 08:35:51 +0000 UTC FinishedAt: 2026-08-05 12:59:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[0] Phase: Succeeded StartedAt: 2026-08-05 08:35:51 +0000 UTC FinishedAt: 2026-08-05 09:16:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[0].run-triage Phase: Succeeded StartedAt: 2026-08-05 08:35:51 +0000 UTC FinishedAt: 2026-08-05 09:16:26 +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": "938e833173e6cc7c1b6671f3463d36511d6dbb51", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "XSWAP", "DEBUG_FS" ], "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": "938e833173e6cc7c1b6671f3463d36511d6dbb51", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "XSWAP", "DEBUG_FS" ], "series_id": "4a7e1458-86e3-4b65-908c-6e1cb2a84b9a" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "xswap_max_clusters_write", "xswap_max_clusters_read", "xswap_shrink_work_fn", "xswap_check_mapped", "xswap_collect_page", "xswap_map_clusters", "xswap_unmap_clusters" ], "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+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1hTV0FQJiMzNDssCiAgICAmIzM0O0RFQlVHX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7eHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlJiMzNDssCiAgICAmIzM0O3hzd2FwX21heF9jbHVzdGVyc19yZWFkJiMzNDssCiAgICAmIzM0O3hzd2FwX3Nocmlua193b3JrX2ZuJiMzNDssCiAgICAmIzM0O3hzd2FwX2NoZWNrX21hcHBlZCYjMzQ7LAogICAgJiMzNDt4c3dhcF9jb2xsZWN0X3BhZ2UmIzM0OywKICAgICYjMzQ7eHN3YXBfbWFwX2NsdXN0ZXJzJiMzNDssCiAgICAmIzM0O3hzd2FwX3VubWFwX2NsdXN0ZXJzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlICh4c3dhcCkgdGhhdCBkZWNvdXBsZXMgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gSXQgdXNlcyBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgZm9yIGNsdXN0ZXIgaW5mbyB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzIGR5bmFtaWNhbGx5LiBUaGlzIGFkZHMgbmV3IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyBmb3Igc3dhcCBtYW5hZ2VtZW50LCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHdvcmtxdWV1ZSBmb3Igc2hyaW5raW5nLiBJdCBpcyBmdW5jdGlvbmFsIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMjNiODY1ZjNjNDk2N2QyMjdlNjllMzkyMGZjNDI1NzQ1OWZiZmM0MlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDUgMDk6MTQ6MzYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuaW5kZXggNDVmMzAxZDczZTJhZS4uYTViMzIzMzc0NzY5YyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTIwNyw2ICYjNDM7MjA3LDcgQEAgZW51bSB7XG4gXHRTV1BfU1RBQkxFX1dSSVRFUyA9ICgxIFx1MDAzY1x1MDAzYyAxMSksXHQvKiBubyBvdmVyd3JpdGUgUEdfd3JpdGViYWNrIHBhZ2VzICovXG4gXHRTV1BfU1lOQ0hST05PVVNfSU8gPSAoMSBcdTAwM2NcdTAwM2MgMTIpLFx0Lyogc3luY2hyb25vdXMgSU8gaXMgZWZmaWNpZW50ICovXG4gXHRTV1BfSElCRVJOQVRJT04gPSAoMSBcdTAwM2NcdTAwM2MgMTMpLFx0LyogcGlubmVkIGZvciBoaWJlcm5hdGlvbiAqL1xuJiM0MztcdFNXUF9YU1dBUFx0PSAoMSBcdTAwM2NcdTAwM2MgMTQpLFx0LyogZXh0ZW5kYWJsZSBzd2FwIGRldmljZSAqL1xuIFx0XHRcdFx0XHQvKiBhZGQgb3RoZXJzIGhlcmUgYmVmb3JlLi4uICovXG4gfTtcbiBcbkBAIC0yNDcsNiAmIzQzOzI0OCwxNiBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7XG4gXHRzaWduZWQgY2hhclx0dHlwZTtcdFx0Lyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqL1xuIFx0dW5zaWduZWQgaW50XHRtYXg7XHRcdC8qIHNpemUgb2YgdGhpcyBzd2FwIGRldmljZSAqL1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87IC8qIGNsdXN0ZXIgaW5mby4gT25seSBmb3IgU1NEICovXG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHRzdHJ1Y3Qgdm1fc3RydWN0XHQqY2x1c3Rlcl92bTtcdC8qIFZNX1NQQVJTRSBhcmVhIGZvciB4c3dhcCBkeW5hbWljIGNsdXN0ZXJfaW5mbyAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdFx0bnJfY2x1c3RlcnNfbWF4Oy8qIHVwcGVyIGxpbWl0IGZyb20gc3dhcCBoZWFkZXIgKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nXHRcdG5yX2NsdXN0ZXJzO1x0LyogY3VycmVudCBncm93dGggY2VpbGluZyAo4omkIG5yX2NsdXN0ZXJzX21heCkgKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nXHRcdG5yX2NsdXN0ZXJzX21hcHBlZDsgLyogY3VycmVudGx5IG1hcHBlZCBjbHVzdGVyIGNvdW50ICovXG4mIzQzO1x0dW5zaWduZWQgbG9uZ1x0XHRucl9mcmVlX3RhaWw7XHQvKiBjb250aWd1b3VzIGZyZWUgY2x1c3RlcnMgYXQgdGFpbCAqL1xuJiM0MztcdHN0cnVjdCBkZW50cnlcdFx0KmRlYnVnZnNfZW50cnk7XHQvKiBkZWJ1Z2ZzOiB0eXBlXHUwMDNjTlx1MDAzZV9tYXhfY2x1c3RlcnMgKi9cbiYjNDM7XHRzdHJ1Y3Qgd29ya19zdHJ1Y3RcdHhzd2FwX3Nocmlua193b3JrOyAvKiBkZWZlcnJlZCBzaHJpbmsgdHJpZ2dlciAqL1xuJiM0MztcdHN0cnVjdCBtdXRleFx0XHR4c3dhcF9sb2NrO1x0Lyogc2VyaWFsaXplIG1hcC91bm1hcCBvcGVyYXRpb25zICovXG4mIzQzOyNlbmRpZlxuIFx0c3RydWN0IGxpc3RfaGVhZCBmcmVlX2NsdXN0ZXJzOyAvKiBmcmVlIGNsdXN0ZXJzIGxpc3QgKi9cbiBcdHN0cnVjdCBsaXN0X2hlYWQgZnVsbF9jbHVzdGVyczsgLyogZnVsbCBjbHVzdGVycyBsaXN0ICovXG4gXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vbmZ1bGxfY2x1c3RlcnNbU1dBUF9OUl9PUkRFUlNdO1xuQEAgLTM1MCw2ICYjNDM7MzYxLDcgQEAgdm9pZCBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHZvaWQgZnJlZV9wYWdlc19hbmRfc3dhcF9jYWNoZShzdHJ1Y3QgZW5jb2RlZF9wYWdlICoqLCBpbnQpO1xuIC8qIGxpbnV4L21tL3N3YXBmaWxlLmMgKi9cbiBleHRlcm4gYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xuJiM0MztleHRlcm4gYXRvbWljX3QgbnJfcmVhbF9zd2FwZmlsZXM7XG4gZXh0ZXJuIGxvbmcgdG90YWxfc3dhcF9wYWdlcztcbiBleHRlcm4gYXRvbWljX3QgbnJfcm90YXRlX3N3YXA7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWdcbmluZGV4IDA2MDE5MGUxMmJjZWQuLjgyZjYyZjRjNWIyM2UgMTAwNjQ0XG4tLS0gYS9tbS9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9LY29uZmlnXG5AQCAtMTIyLDYgJiM0MzsxMjIsMTUgQEAgY29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVFxuICAgICAgICBkZWZhdWx0IFwmIzM0O3pzdGRcJiMzNDsgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX1pTVERcbiAgICAgICAgZGVmYXVsdCBcJiMzNDtcJiMzNDtcbiBcbiYjNDM7Y29uZmlnIFhTV0FQXG4mIzQzO1x0Ym9vbCBcJiMzNDtFeHRlbmRhYmxlICh2aXJ0dWFsKSBzd2FwIGRldmljZVwmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gU1dBUCBcdTAwMjZcdTAwMjYgNjRCSVRcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBBZGRzIHN1cHBvcnQgZm9yIGV4dGVuZGFibGUgc3dhcCBkZXZpY2VzICh4c3dhcCkgdGhhdCBkZWNvdXBsZVxuJiM0MztcdCAgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gVGhlIGNsdXN0ZXJfaW5mb1xuJiM0MztcdCAgYXJyYXkgaXMgYmFja2VkIGJ5IGEgc3BhcnNlIHZtYWxsb2MgYXJlYSB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzXG4mIzQzO1x0ICBvbiBkZW1hbmQsIGF2b2lkaW5nIHN0YXRpYyBwcmUtYWxsb2NhdGlvbiBvdmVyaGVhZC5cbiYjNDM7XG4gY29uZmlnIFpTTUFMTE9DXG4gXHR0cmlzdGF0ZVxuIFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfaW8uYyBiL21tL3BhZ2VfaW8uY1xuaW5kZXggZTRmYTdmZmZmZThiYi4uMWYzZmE1MjEzMWFiMyAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfaW8uY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9pby5jXG5AQCAtMjQ3LDYgJiM0MzsyNDcsMTcgQEAgaW50IHN3YXBfd3JpdGVvdXQoc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHR9XG4gXHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGN0eC1cdTAwM2VzaXMgaXMgc2V0IGJ5IHN3YXBfYWRkX2ZvbGlvKCkgd2hpY2ggaXMgY2FsbGVkIGZyb21cbiYjNDM7XHQgKiBfX3N3YXBfd3JpdGVwYWdlKCkgYmVsb3cuICBTaW5jZSB3ZSBtdXN0IGF2b2lkIHRoZSB3cml0ZXBhZ2VcbiYjNDM7XHQgKiBwYXRoIGZvciB4c3dhcCBkZXZpY2VzLCB1c2UgdGhlIHN3YXBfaW5mbyBmcm9tIHRoZSBmb2xpbyYjMzk7c1xuJiM0MztcdCAqIHN3YXAgZW50cnkgZGlyZWN0bHkgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIGN0eC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodW5saWtlbHkoX19zd2FwX2VudHJ5X3RvX2luZm8oZm9saW8tXHUwMDNlc3dhcCktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpIHtcbiYjNDM7XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuJiM0MztcdFx0cmV0dXJuIEFPUF9XUklURVBBR0VfQUNUSVZBVEU7XG4mIzQzO1x0fVxuJiM0MztcbiBcdF9fc3dhcF93cml0ZXBhZ2UoY3R4LCBmb2xpbyk7XG4gXHRyZXR1cm4gMDtcbiBvdXRfdW5sb2NrOlxuQEAgLTQ3OSw2ICYjNDM7NDkwLDExIEBAIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0aWYgKHpzd2FwX2xvYWQoZm9saW8pICE9IC1FTk9FTlQpXG4gXHRcdGdvdG8gZmluaXNoO1xuIFxuJiM0MztcdGlmICh1bmxpa2VseShzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpIHtcbiYjNDM7XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4mIzQzO1x0XHRnb3RvIGZpbmlzaDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0LyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovXG4gXHR6c3dhcF9mb2xpb19zd2FwaW4oZm9saW8pO1xuIFx0c3dhcF9hZGRfZm9saW8oY3R4LCBmb2xpbywgUkVBRCk7XG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCA1YmU4MjU5MTFlNjQ1Li5lYmIyZDJhYzM1NmZlIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC04MjksNiAmIzQzOzgyOSwxMyBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBfY2x1c3Rlcl9yZWFkYWhlYWQoc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcF9tYXNrLFxuIFx0c3RydWN0IGJsa19wbHVnIHBsdWc7XG4gXHRzd3BfZW50cnlfdCByYV9lbnRyeTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBlbnRyeSBtYXkgaGF2ZSBiZWVuIGZyZWVkIGJ5IGFub3RoZXIgdGFzay4gQXZvaWQgc3dhcF9pbmZvX2dldCgpXG4mIzQzO1x0ICogd2hpY2ggd2lsbCBwcmludCBlcnJvciBtZXNzYWdlIGlmIHRoZSByYWNlIGhhcHBlbnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApXG4mIzQzO1x0XHRnb3RvIHNraXA7XG4mIzQzO1xuIFx0bWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTtcbiBcdGlmICghbWFzaylcbiBcdFx0Z290byBza2lwO1xuZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jXG5pbmRleCA0ZDRlM2UzMDU5ZjZiLi5jYTQwNjU1NjYyNmU3IDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuY1xuQEAgLTQ4LDYgJiM0Mzs0OCwxMTggQEBcbiAjaW5jbHVkZSBcJiMzNDtzd2FwX3RhYmxlLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7c3dhcC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2RlYnVnZnMuaFx1MDAzZVxuJiM0MztcbiYjNDM7c3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spO1xuJiM0MztcbiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUFxuJiM0MzsvKlxuJiM0MzsgKiB4c3dhcDogZHluYW1pY2FsbHkgZ3JvdyBhbmQgc2hyaW5rIHRoZSBjbHVzdGVyX2luZm8gYXJyYXkgdmlhIGFcbiYjNDM7ICogVk1fU1BBUlNFIGFyZWEuXG4mIzQzOyAqXG4mIzQzOyAqIFhTV0FQX0dST1dfQ0xVU1RFUlMgaXMgdGhlIG51bWJlciBvZiBjbHVzdGVycyB0byBtYXAvdW5tYXAgaW4gb25lXG4mIzQzOyAqIGdyb3cvc2hyaW5rIG9wZXJhdGlvbi4gIEl0IGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJfaW5mb1xuJiM0MzsgKiBzdHJ1Y3RzIHRoYXQgZml0IGluIGEgc2luZ2xlIHBhZ2UgKGF0IGxlYXN0IDE2KSwgc28gdGhhdCB0aGUgdm1hbGxvY1xuJiM0MzsgKiBwYWdlIHRhYmxlXG4mIzQzOyAqIG92ZXJoZWFkIGlzIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIG1hcHBlZC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgWFNXQVBfR1JPV19DTFVTVEVSUyBcXFxuJiM0MztcdG1heF90KHVuc2lnbmVkIGxvbmcsIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pLCAxNilcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp4c3dhcF9kZWJ1Z2ZzX3Jvb3Q7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHhzd2FwX21hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4mIzQzO1x0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKTtcbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdW5tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucik7XG4mIzQzO3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSk7XG4mIzQzO3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpO1xuJiM0MztzdGF0aWMgdm9pZCB4c3dhcF91cGRhdGVfZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBmcmVlZF9pZHgpO1xuJiM0MztzdGF0aWMgdm9pZCB4c3dhcF90cnlfc2hyaW5rKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBkZWJ1Z2ZzIHJlYWQvd3JpdGUgZm9yIHBlci1kZXZpY2UgbWF4IGNsdXN0ZXIgY291bnQuXG4mIzQzOyAqIFNob3dzL3NldHMgc2ktXHUwMDNlbnJfY2x1c3RlcnMgKGN1cnJlbnQgZ3Jvd3RoIGNlaWxpbmcpLCBjbGFtcGVkIHRvXG4mIzQzOyAqIFswLCBzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXhdLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHNzaXplX3QgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4mIzQzO1x0Y2hhciB0bXBbMzJdO1xuJiM0MztcdGludCBsZW47XG4mIzQzO1xuJiM0MztcdGxlbiA9IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksIFwmIzM0OyVsdVxcblwmIzM0OywgUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzKSk7XG4mIzQzO1x0cmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcCwgbGVuKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHNzaXplX3QgeHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLFxuJiM0MztcdFx0XHRcdFx0Y29uc3QgY2hhciBfX3VzZXIgKmJ1ZixcbiYjNDM7XHRcdFx0XHRcdHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB2YWwsIG5ld19wYWdlcztcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBrc3RydG91bF9mcm9tX3VzZXIoYnVmLCBjb3VudCwgMCwgXHUwMDI2dmFsKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKHZhbCBcdTAwM2Ugc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4KVxuJiM0MztcdFx0dmFsID0gc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4O1xuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4mIzQzO1x0c2ktXHUwMDNlbnJfY2x1c3RlcnMgPSB2YWw7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAgdGhlIHZpc2libGUgc3dhcCBzaXplIGluIHN5bmMgd2l0aCB0aGUgbmV3IGNlaWxpbmcuICovXG4mIzQzO1x0bmV3X3BhZ2VzID0gbWluX3QodW5zaWduZWQgbG9uZywgdmFsICogU1dBUEZJTEVfQ0xVU1RFUiwgc2ktXHUwMDNlbWF4KTtcbiYjNDM7XHRpZiAobmV3X3BhZ2VzKVxuJiM0MztcdFx0bmV3X3BhZ2VzLS07XG4mIzQzO1x0aWYgKG5ld19wYWdlcyAhPSBzaS1cdTAwM2VwYWdlcykge1xuJiM0MztcdFx0bG9uZyBkZWx0YSA9IChsb25nKW5ld19wYWdlcyAtIChsb25nKXNpLVx1MDAzZXBhZ2VzO1xuJiM0MztcbiYjNDM7XHRcdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdFx0c2ktXHUwMDNlcGFnZXMgPSBuZXdfcGFnZXM7XG4mIzQzO1x0XHRhdG9taWNfbG9uZ19hZGQoZGVsdGEsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuJiM0MztcdFx0dG90YWxfc3dhcF9wYWdlcyAmIzQzOz0gZGVsdGE7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogU2hyaW5rIHRyaWdnZXI6IGxvd2VyaW5nIHRoZSBjZWlsaW5nIG1heSBmcmVlIHRhaWwgY2x1c3RlcnMuICovXG4mIzQzO1x0c2NoZWR1bGVfd29yayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9zaHJpbmtfd29yayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBjb3VudDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xuJiM0MztcdC5yZWFkID0geHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQsXG4mIzQzO1x0LndyaXRlID0geHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlLFxuJiM0MztcdC5vcGVuID0gc2ltcGxlX29wZW4sXG4mIzQzO1x0Lmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfZGVidWdmc19hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBuYW1lWzMyXTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF4c3dhcF9kZWJ1Z2ZzX3Jvb3QpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCYjMzQ7dHlwZSVkX2NsdXN0ZXJfbGltaXRcJiMzNDssIHNpLVx1MDAzZXR5cGUpO1xuJiM0MztcdHNpLVx1MDAzZWRlYnVnZnNfZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA2NDQsIHhzd2FwX2RlYnVnZnNfcm9vdCxcbiYjNDM7XHRcdFx0XHRcdFx0c2ksIFx1MDAyNnhzd2FwX2RlYnVnZnNfZm9wcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHhzd2FwX2RlYnVnZnNfZGVsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7e1xuJiM0MztcdGRlYnVnZnNfcmVtb3ZlKHNpLVx1MDAzZWRlYnVnZnNfZW50cnkpO1xuJiM0MztcdHNpLVx1MDAzZWRlYnVnZnNfZW50cnkgPSBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztcbiYjNDM7I2VuZGlmXG4gXG4gc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7XG5AQCAtNjMsOSAmIzQzOzE3NSw5IEBAIHN0YXRpYyB2b2lkIG1vdmVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gICpcbiAgKiBBbHNvIHByb3RlY3RzIHN3YXBfYWN0aXZlX2hlYWQgdG90YWxfc3dhcF9wYWdlcywgYW5kIHRoZSBTV1BfV1JJVEVPSyBmbGFnLlxuICAqL1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9sb2NrKTtcbiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlcztcbiBhdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XG4mIzQzO2F0b21pY190IG5yX3JlYWxfc3dhcGZpbGVzO1xuIC8qXG4gICogU29tZSBtb2R1bGVzIHVzZSBzd2FwcGFibGUgb2JqZWN0cyBhbmQgbWF5IHRyeSB0byBzd2FwIHRoZW0gb3V0IHVuZGVyXG4gICogbWVtb3J5IHByZXNzdXJlICh2aWEgdGhlIHNocmlua2VyKS4gQmVmb3JlIGRvaW5nIHNvLCB0aGV5IG1heSB3aXNoIHRvXG5AQCAtNjA5LDYgJiM0Mzs3MjEsMTAgQEAgc3RhdGljIHZvaWQgX19mcmVlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm9cbiBcdHN3YXBfY2x1c3Rlcl9mcmVlX3RhYmxlKGNpKTtcbiBcdG1vdmVfY2x1c3RlcihzaSwgY2ksIFx1MDAyNnNpLVx1MDAzZWZyZWVfY2x1c3RlcnMsIENMVVNURVJfRkxBR19GUkVFKTtcbiBcdGNpLVx1MDAzZW9yZGVyID0gMDtcbiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUFxuJiM0MztcdHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWwoc2ksIGNpIC0gc2ktXHUwMDNlY2x1c3Rlcl9pbmZvKTtcbiYjNDM7XHRzY2hlZHVsZV93b3JrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcbiYjNDM7I2VuZGlmXG4gfVxuIFxuIC8qXG5AQCAtOTU1LDYgJiM0MzsxMDcxLDkgQEAgc3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpXG4gXHRcdGNpLVx1MDAzZW9yZGVyID0gb3JkZXI7XG4gXHRjaS1cdTAwM2Vjb3VudCAmIzQzOz0gbnJfcGFnZXM7XG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHR4c3dhcF90cmltX2ZyZWVfdGFpbChzaSwgY2x1c3Rlcl9pbmRleChzaSwgY2kpKTtcbiYjNDM7I2VuZGlmXG4gXHRzd2FwX3JhbmdlX2FsbG9jKHNpLCBucl9wYWdlcyk7XG4gXG4gXHRyZXR1cm4gdHJ1ZTtcbkBAIC0xMTg1LDYgJiM0MzsxMzA0LDUwIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdGlmIChmb3VuZClcbiBcdFx0XHRnb3RvIGRvbmU7XG4gXHR9XG4mIzQzO1xuJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGb3IgeHN3YXA6IGlmIG5vIGZyZWUgY2x1c3RlciB3YXMgZm91bmQgYW5kIG1vcmUgY2x1c3RlcnNcbiYjNDM7XHQgKiBjYW4gYmUgbWFwcGVkLCBncm93IHRoZSBjbHVzdGVyX2luZm8gYXJyYXkgYW5kIHJldHJ5LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghZm91bmQgXHUwMDI2XHUwMDI2IChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCkgXHUwMDNjIFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVycykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGxpc3RfZW1wdHkoXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycykpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnJfbmV3ID0gbWluKFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVycykgLVxuJiM0MztcdFx0XHRcdFx0ICBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKSxcbiYjNDM7XHRcdFx0XHRcdCAgWFNXQVBfR1JPV19DTFVTVEVSUyk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCF4c3dhcF9tYXBfY2x1c3RlcnMoc2ksIHN0YXJ0LCBucl9uZXcpKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGxvbmcgYWRkZWQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHRmb3IgKGkgPSBzdGFydDsgaSBcdTAwM2Mgc3RhcnQgJiM0MzsgbnJfbmV3OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBcdTAwMjZzaS1cdTAwM2VjbHVzdGVyX2luZm9baV07XG4mIzQzO1x0XHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHRcdC8qXG4mIzQzO1x0XHRcdFx0ICogQSBjb25jdXJyZW50IGdyb3dlciBtYXkgaGF2ZSBhbHJlYWR5IGFkZGVkXG4mIzQzO1x0XHRcdFx0ICogdGhlc2UgY2x1c3RlcnMgdG8gdGhlIGZyZWUgbGlzdC4gIE9ubHkgYWRkXG4mIzQzO1x0XHRcdFx0ICogY2x1c3RlcnMgdGhhdCBhcmUgc3RpbGwgb2ZmLWxpc3QgKE5PTkUpLlxuJiM0MztcdFx0XHRcdCAqL1xuJiM0MztcdFx0XHRcdGlmIChjaS1cdTAwM2VmbGFncyA9PSBDTFVTVEVSX0ZMQUdfTk9ORSkge1xuJiM0MztcdFx0XHRcdFx0Y2ktXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfRlJFRTtcbiYjNDM7XHRcdFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Y2ktXHUwMDNlbGlzdCwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyk7XG4mIzQzO1x0XHRcdFx0XHRhZGRlZCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdFx0fVxuJiM0MztcdFx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCxcbiYjNDM7XHRcdFx0XHQgICBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsKSAmIzQzOyBucl9uZXcpO1xuJiM0MztcbiYjNDM7XHRcdFx0LyogUmV0cnkgYWxsb2NhdGlvbiBmcm9tIHRoZSBmcmVlIGxpc3QgKi9cbiYjNDM7XHRcdFx0Zm91bmQgPSBhbGxvY19zd2FwX3NjYW5fbGlzdChzaSwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIGZvbGlvLCBmYWxzZSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiBkb25lOlxuIFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXJfbG9jayk7XG5AQCAtMTIyMyw2ICYjNDM7MTM4Niw4IEBAIHN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpXG4gXHRcdFx0Z290byBza2lwO1xuIFx0fVxuIFxuJiM0MztcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuJiM0MztcdFx0YXRvbWljX3N1YigxLCBcdTAwMjZucl9yZWFsX3N3YXBmaWxlcyk7XG4gXHRwbGlzdF9kZWwoXHUwMDI2c2ktXHUwMDNlYXZhaWxfbGlzdCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcbiBcbiBza2lwOlxuQEAgLTEyNjUsNiAmIzQzOzE0MzAsOCBAQCBzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxuIFx0fVxuIFxuIFx0cGxpc3RfYWRkKFx1MDAyNnNpLVx1MDAzZWF2YWlsX2xpc3QsIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XG4mIzQzO1x0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpXG4mIzQzO1x0XHRhdG9taWNfYWRkKDEsIFx1MDAyNm5yX3JlYWxfc3dhcGZpbGVzKTtcbiBcbiBza2lwOlxuIFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbkBAIC0yOTUyLDYgJiM0MzszMTE5LDE5IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy1cdTAwM2Vob3N0O1xuIFx0aW50IHJldDtcbiBcbiYjNDM7XHRpZiAoc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbiYjNDM7XHRcdCpzcGFuID0gMDtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiB4c3dhcCBkZXZpY2VzIGhhdmUgbm8gYmFja2luZyBibG9jayBkZXZpY2UgYW5kXG4mIzQzO1x0XHQgKiBwaHlzaWNhbCB3cml0ZW91dCBpcyBza2lwcGVkIGluIHN3YXBfd3JpdGVvdXQoKSxcbiYjNDM7XHRcdCAqIGJ1dCBzaXMtXHUwMDNlb3BzIG11c3Qgc3RpbGwgYmUgc2V0IHNvIHRoYXQgY2FsbGVyc1xuJiM0MztcdFx0ICogbGlrZSBzaHJpbmtfZm9saW9fbGlzdCgpIGNhbiBzYWZlbHkgZGVyZWZlcmVuY2VcbiYjNDM7XHRcdCAqIG9wcy1cdTAwM2VmbGFncy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0c2lzLVx1MDAzZW9wcyA9IFx1MDAyNnN3YXBfYmRldl9vcHM7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0cmV0ID0gc2lvX3Bvb2xfaW5pdCgpO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbkBAIC0zMDIzLDIwICYjNDM7MzIwMyw1MCBAQCBzdGF0aWMgdm9pZCB3YWl0X2Zvcl9hbGxvY2F0aW9uKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcbiBcdEJVR19PTihzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spO1xuIFxuJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQXG4mIzQzO1x0LypcbiYjNDM7XHQgKiB4c3dhcCBjbHVzdGVycyBiZXlvbmQgbnJfY2x1c3RlcnNfbWFwcGVkIGhhdmUgYmVlbiB1bm1hcHBlZFxuJiM0MztcdCAqIGJ5IHRoZSBzaHJpbmtlciBhbmQgdGhlaXIgdm1hbGxvYyBwYWdlcyBhcmUgbm8gbG9uZ2VyXG4mIzQzO1x0ICogYWNjZXNzaWJsZS4gIE9ubHkgaXRlcmF0ZSBvdmVyIGN1cnJlbnRseSBtYXBwZWQgY2x1c3RlcnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApXG4mIzQzO1x0XHRlbmQgPSBtaW4oZW5kLCBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKSAqXG4mIzQzO1x0XHRcdCAgU1dBUEZJTEVfQ0xVU1RFUik7XG4mIzQzOyNlbmRpZlxuJiM0MztcbiBcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IFx1MDAzYyBlbmQ7IG9mZnNldCAmIzQzOz0gU1dBUEZJTEVfQ0xVU1RFUikge1xuIFx0XHRjaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpO1xuIFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbiBcdH1cbiB9XG4gXG4tc3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcbi1cdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbWF4cGFnZXMpXG4mIzQzO3N0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIHtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyA9IHNpLVx1MDAzZWNsdXN0ZXJfaW5mbztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzID0gc2ktXHUwMDNlbWF4O1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbi1cdGludCBpLCBucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7XG4mIzQzO1x0aW50IGksIG5yX2NsdXN0ZXJzO1xuIFxuIFx0aWYgKCFjbHVzdGVyX2luZm8pXG4gXHRcdHJldHVybjtcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkge1xuJiM0MztcdFx0eHN3YXBfZGVidWdmc19kZWwoc2kpO1xuJiM0MztcdFx0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZzaS1cdTAwM2V4c3dhcF9zaHJpbmtfd29yayk7XG4mIzQzO1x0XHQvKiBVbm1hcCBhbGwgbWFwcGVkIGNsdXN0ZXJzIGFuZCBmcmVlIHRoZSBWTV9TUEFSU0UgYXJlYSAqL1xuJiM0MztcdFx0aWYgKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCBcdTAwM2UgMClcbiYjNDM7XHRcdFx0eHN3YXBfdW5tYXBfY2x1c3RlcnMoc2ksIDAsIHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4mIzQzO1x0XHRmcmVlX3ZtX2FyZWEoc2ktXHUwMDNlY2x1c3Rlcl92bSk7XG4mIzQzO1x0XHRzaS1cdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcbiYjNDM7XHRcdHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21heCA9IDA7XG4mIzQzO1x0XHRzaS1cdTAwM2Vucl9jbHVzdGVycyA9IDA7XG4mIzQzO1x0XHRzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQgPSAwO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7I2VuZGlmXG4mIzQzO1xuJiM0MztcdG5yX2NsdXN0ZXJzID0gRElWX1JPVU5EX1VQKG1heHBhZ2VzLCBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX2NsdXN0ZXJzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRjaSA9IGNsdXN0ZXJfaW5mbyAmIzQzOyBpO1xuIFx0XHQvKiBDbHVzdGVyIHdpdGggYmFkIG1hcmtzIGNvdW50IHdpbGwgaGF2ZSBhIHJlbWFpbmluZyB0YWJsZSAqL1xuQEAgLTMwNzUsMTEgJiM0MzszMjg1LDkgQEAgc3RhdGljIHZvaWQgZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4gU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwID0gTlVMTDtcbi1cdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvO1xuIFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZSwgKnZpY3RpbTtcbiBcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nO1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbi1cdHVuc2lnbmVkIGludCBtYXhwYWdlcztcbiBcdGludCBlcnIsIGZvdW5kID0gMDtcbiBcbiBcdGlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSlcbkBAIC0zMTYwLDcgJiM0MzszMzY4LDggQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFxuIFx0ZGVzdHJveV9zd2FwX2V4dGVudHMocCwgcC1cdTAwM2Vzd2FwX2ZpbGUpO1xuIFxuLVx0aWYgKCEocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxuJiM0MztcdGlmICghKHAtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICEocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxuIFx0XHRhdG9taWNfZGVjKFx1MDAyNm5yX3JvdGF0ZV9zd2FwKTtcbiBcbiBcdG11dGV4X2xvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbkBAIC0zMTcwLDEwICYjNDM7MzM3OSw2IEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcbiBcbiBcdHN3YXBfZmlsZSA9IHAtXHUwMDNlc3dhcF9maWxlO1xuIFx0cC1cdTAwM2Vzd2FwX2ZpbGUgPSBOVUxMO1xuLVx0bWF4cGFnZXMgPSBwLVx1MDAzZW1heDtcbi1cdGNsdXN0ZXJfaW5mbyA9IHAtXHUwMDNlY2x1c3Rlcl9pbmZvO1xuLVx0cC1cdTAwM2VtYXggPSAwO1xuLVx0cC1cdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2cC1cdTAwM2Vsb2NrKTtcbiBcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4gXHRhcmNoX3N3YXBfaW52YWxpZGF0ZV9hcmVhKHAtXHUwMDNldHlwZSk7XG5AQCAtMzE4MSw3ICYjNDM7MzM4Niw5IEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcbiBcdG11dGV4X3VubG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuIFx0a2ZyZWUocC1cdTAwM2VnbG9iYWxfY2x1c3Rlcik7XG4gXHRwLVx1MDAzZWdsb2JhbF9jbHVzdGVyID0gTlVMTDtcbi1cdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oY2x1c3Rlcl9pbmZvLCBtYXhwYWdlcyk7XG4mIzQzO1x0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhwKTtcbiYjNDM7XHRwLVx1MDAzZW1heCA9IDA7XG4mIzQzO1x0cC1cdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xuIFxuIFx0aW5vZGUgPSBtYXBwaW5nLVx1MDAzZWhvc3Q7XG4gXG5AQCAtMzI3MCw2ICYjNDM7MzQ3NywxOSBAQCBzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqc3dhcF90eXBlX3N0cihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNpLVx1MDAzZXN3YXBfZmlsZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7eHN3YXBcXHRcJiMzNDs7XG4mIzQzO1xuJiM0MztcdGlmIChTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9tb2RlKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDtwYXJ0aXRpb25cJiMzNDs7XG4mIzQzO1xuJiM0MztcdHJldHVybiBcJiMzNDtmaWxlXFx0XCYjMzQ7O1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgc3dhcF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdilcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSB2O1xuQEAgLTMyODksOCAmIzQzOzM1MDksNyBAQCBzdGF0aWMgaW50IHN3YXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXG4gXHRsZW4gPSBzZXFfZmlsZV9wYXRoKHN3YXAsIGZpbGUsIFwmIzM0OyBcXHRcXG5cXFxcXCYjMzQ7KTtcbiBcdHNlcV9wcmludGYoc3dhcCwgXCYjMzQ7JSpzJXNcXHQlbHVcXHQlcyVsdVxcdCVzJWRcXG5cJiMzNDssXG4gXHRcdFx0bGVuIFx1MDAzYyA0MCA/IDQwIC0gbGVuIDogMSwgXCYjMzQ7IFwmIzM0Oyxcbi1cdFx0XHRTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9tb2RlKSA/XG4tXHRcdFx0XHRcJiMzNDtwYXJ0aXRpb25cJiMzNDsgOiBcJiMzNDtmaWxlXFx0XCYjMzQ7LFxuJiM0MztcdFx0XHRzd2FwX3R5cGVfc3RyKHNpKSxcbiBcdFx0XHRieXRlcywgYnl0ZXMgXHUwMDNjIDEwMDAwMDAwID8gXCYjMzQ7XFx0XCYjMzQ7IDogXCYjMzQ7XCYjMzQ7LFxuIFx0XHRcdGludXNlLCBpbnVzZSBcdTAwM2MgMTAwMDAwMDAgPyBcJiMzNDtcXHRcJiMzNDsgOiBcJiMzNDtcJiMzNDssXG4gXHRcdFx0c2ktXHUwMDNlcHJpbyk7XG5AQCAtMzQ2OCw2ICYjNDM7MzY4Nyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0dW5zaWduZWQgbG9uZyBtYXhwYWdlcztcbiBcdHVuc2lnbmVkIGxvbmcgc3dhcGZpbGVwYWdlcztcbiBcdHVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlO1xuJiM0MztcdGxvZmZfdCBzaXplO1xuIFxuIFx0aWYgKG1lbWNtcChcJiMzNDtTV0FQU1BBQ0UyXCYjMzQ7LCBzd2FwX2hlYWRlci1cdTAwM2VtYWdpYy5tYWdpYywgMTApKSB7XG4gXHRcdHByX2VycihcJiMzNDtVbmFibGUgdG8gZmluZCBzd2FwLXNwYWNlIHNpZ25hdHVyZVxcblwmIzM0Oyk7XG5AQCAtMzUxMCw3ICYjNDM7MzczMCwxNiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcbiBcdGlmICghbWF4cGFnZXMpXG4gXHRcdHJldHVybiAwO1xuLVx0c3dhcGZpbGVwYWdlcyA9IGlfc2l6ZV9yZWFkKGlub2RlKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0c2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTtcbiYjNDM7XHRpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpIHtcbiYjNDM7XHRcdC8qIHhzd2FwOiBhIHN3YXAgZGV2aWNlIHdpdGggbm8gYmFja2luZyBzdG9yYWdlICovXG4mIzQzO1x0XHRzaS1cdTAwM2ViZGV2ID0gTlVMTDtcbiYjNDM7XHRcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9YU1dBUCB8IFNXUF9TT0xJRFNUQVRFO1xuJiM0MztcdFx0cmV0dXJuIG1heHBhZ2VzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c3dhcGZpbGVwYWdlcyA9IHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRpZiAoc3dhcGZpbGVwYWdlcyBcdTAwMjZcdTAwMjYgbWF4cGFnZXMgXHUwMDNlIHN3YXBmaWxlcGFnZXMpIHtcbiBcdFx0cHJfd2FybihcJiMzNDtTd2FwIGFyZWEgc2hvcnRlciB0aGFuIHNpZ25hdHVyZSBpbmRpY2F0ZXNcXG5cJiMzNDspO1xuIFx0XHRyZXR1cm4gMDtcbkBAIC0zNTIzLDYgJiM0MzszNzUyLDM2NSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdHJldHVybiBtYXhwYWdlcztcbiB9XG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7c3RhdGljIGludCB4c3dhcF9tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuJiM0MztcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLVx1MDAzZWNsdXN0ZXJfaW5mbyAmIzQzO1xuJiM0MztcdFx0XHRcdCAgIChzaXplX3Qpc3RhcnRfaWR4ICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmRfYWRkciA9IHN0YXJ0X2FkZHIgJiM0MzsgKHNpemVfdCluciAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogdm1fYXJlYV9tYXBfcGFnZXMoKSByZXF1aXJlcyB0aGF0IHN0YXJ0IGFuZCBlbmQgYmUgcGFnZS1hbGlnbmVkLlxuJiM0MztcdCAqIElmIHN0YXJ0X2FkZHIgZmFsbHMgd2l0aGluIGEgcGFnZSB0aGF0IHdhcyBhbHJlYWR5IG1hcHBlZCBieSBhXG4mIzQzO1x0ICogcHJldmlvdXMgYmF0Y2ggKGdyb3cgcGF0aCksIHJvdW5kIGl0IHVwIHRvIHNraXAgdGhlIGFscmVhZHktbWFwcGVkXG4mIzQzO1x0ICogcGFydGlhbCBwYWdlLiAgQWx3YXlzIHJvdW5kIGVuZF9hZGRyIHVwIHNvIHRoZSB2bWFwIHBhZ2UgdGFibGUgd2Fsa1xuJiM0MztcdCAqIHRlcm1pbmF0ZXMgY29ycmVjdGx5ICh0aGUgd2FsayBsb29wIGV4aXRzIHdoZW4gYWRkciA9PSBlbmQsIGFuZCBhZGRyXG4mIzQzO1x0ICogYWR2YW5jZXMgYnkgUEFHRV9TSVpFIGVhY2ggaXRlcmF0aW9uKS5cbiYjNDM7XHQgKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtX3N0YXJ0ID0gUEFHRV9BTElHTihzdGFydF9hZGRyKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtX2VuZCA9IFBBR0VfQUxJR04oZW5kX2FkZHIpO1xuJiM0MztcdHVuc2lnbmVkIGludCBub3JlY2xhaW1fZmxhZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBucGFnZXM7XG4mIzQzO1x0c3RydWN0IHBhZ2UgKipwYWdlcztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmICh2bV9zdGFydCBcdTAwM2U9IHZtX2VuZCkge1xuJiM0MztcdFx0LyogQWxsIHJlcXVlc3RlZCBjbHVzdGVycyBmYWxsIHdpdGhpbiBhbHJlYWR5LW1hcHBlZCBwYWdlcy4gKi9cbiYjNDM7XHRcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcdTAwM2Mgc3RhcnRfaWR4ICYjNDM7IG5yOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2ktXHUwMDNlY2x1c3Rlcl9pbmZvW2ldLmxvY2spO1xuJiM0MztcdFx0V1JJVEVfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCAmIzQzOyBucik7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5wYWdlcyA9ICh2bV9lbmQgLSB2bV9zdGFydCkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUHJldmVudCByZWN1cnNpdmUgcmVjbGFpbTogdm1fYXJlYV9tYXBfcGFnZXMoKSBpbnRlcm5hbGx5XG4mIzQzO1x0ICogYWxsb2NhdGVzIHBhZ2UgdGFibGVzIHdpdGggR0ZQX1BHVEFCTEVfS0VSTkVMLCB3aGljaCBsYWNrc1xuJiM0MztcdCAqIF9fR0ZQX05PTUVNQUxMT0MuICBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpIGVuc3VyZXMgdGhvc2VcbiYjNDM7XHQgKiBhbGxvY2F0aW9ucyBjYW5ub3QgcmVjdXJzZSBpbnRvIHN3YXAgYnkgZGlzYWJsaW5nIF9fR0ZQX0ZTL0lPLlxuJiM0MztcdCAqL1xuJiM0MztcdG5vcmVjbGFpbV9mbGFncyA9IG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCk7XG4mIzQzO1xuJiM0MztcdHBhZ2VzID0ga21hbGxvY19hcnJheShucGFnZXMsIHNpemVvZigqcGFnZXMpLFxuJiM0MztcdFx0XHQgICAgICBfX0dGUF9ISUdIIHwgX19HRlBfTk9NRU1BTExPQyB8IEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghcGFnZXMpIHtcbiYjNDM7XHRcdG1lbWFsbG9jX25vcmVjbGFpbV9yZXN0b3JlKG5vcmVjbGFpbV9mbGFncyk7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBfX0dGUF9aRVJPIGlzIGNyaXRpY2FsOiBjbHVzdGVyX2luZm8gc3RydWN0cyBjb250YWluIHBvaW50ZXJcbiYjNDM7XHRcdCAqIGZpZWxkcyAoZXh0ZW5kX3RhYmxlLCB6ZXJvX2JpdG1hcCwgbWVtY2dfdGFibGUsIHRhYmxlKSB0aGF0XG4mIzQzO1x0XHQgKiBtdXN0IHN0YXJ0IGFzIE5VTEwuICBXaXRob3V0IHplcm9pbmcsIHN0YWxlIGRhdGEgZnJvbSBhXG4mIzQzO1x0XHQgKiBwcmV2aW91cyB1c2VyIG9mIHRoZSBwYWdlIHdvdWxkIGxvb2sgbGlrZSB2YWxpZCBwb2ludGVycy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0cGFnZXNbaV0gPSBhbGxvY19wYWdlKF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHxcbiYjNDM7XHRcdFx0XHQgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XG4mIzQzO1x0XHRpZiAoIXBhZ2VzW2ldKVxuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENoZWNrIGlmIHRoZSB0YXJnZXQgcGFnZXMgYXJlIGFscmVhZHkgbWFwcGVkIGJ5IGEgY29uY3VycmVudFxuJiM0MztcdCAqIGdyb3dlci4gIFdlIG11c3QgZG8gdGhpcyBhZnRlciBwYWdlIGFsbG9jYXRpb24gYmVjYXVzZVxuJiM0MztcdCAqIGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCkgY2FuIHNsZWVwLCBvcGVuaW5nIGEgcmFjZSB3aW5kb3cuXG4mIzQzO1x0ICogSWYgc29tZW9uZSBhbHJlYWR5IG1hcHBlZCB0aGVzZSBwYWdlcywgZnJlZSBvdXJzIGFuZCBjb250aW51ZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZShcdTAwMjZpbml0X21tLCB2bV9zdGFydCxcbiYjNDM7XHRcdFx0XHRcdCB2bV9lbmQgLSB2bV9zdGFydCxcbiYjNDM7XHRcdFx0XHRcdCB4c3dhcF9jaGVja19tYXBwZWQsIE5VTEwpKSB7XG4mIzQzO1x0XHRpID0gbnBhZ2VzO1xuJiM0MztcdFx0Z290byBmYWlsX25vdW5tYXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpbnQgZXJyID0gdm1fYXJlYV9tYXBfcGFnZXMoc2ktXHUwMDNlY2x1c3Rlcl92bSwgdm1fc3RhcnQsIHZtX2VuZCwgcGFnZXMpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiAtRUJVU1kgbWVhbnMgdGhlIFBURXMgYXJlIGFscmVhZHkgcHJlc2VudDpcbiYjNDM7XHRcdCAqIGFub3RoZXIgdGhyZWFkIHJhY2VkIHdpdGggdXMgYW5kIG1hcHBlZCB0aGVcbiYjNDM7XHRcdCAqIHNhbWUgcGFnZXMgYmV0d2VlbiBvdXIgY2hlY2sgYWJvdmUgYW5kIHRoaXNcbiYjNDM7XHRcdCAqIGNhbGwuICBUcmVhdCBhcyBzdWNjZXNzIOKAlCBmcmVlIG91ciB1bnVzZWRcbiYjNDM7XHRcdCAqIHBhZ2VzIGFuZCBjb250aW51ZS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKGVyciA9PSAtRUJVU1kpIHtcbiYjNDM7XHRcdFx0aSA9IG5wYWdlcztcbiYjNDM7XHRcdFx0Z290byBmYWlsX25vdW5tYXA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpID0gbnBhZ2VzOyAvKiBmcmVlIGFsbCBwYWdlcyBvbiBmYWlsdXJlICovXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRrZnJlZShwYWdlcyk7XG4mIzQzO1x0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcbiYjNDM7XG4mIzQzO1x0LyogSW5pdGlhbGl6ZSBzcGlubG9ja3MgZm9yIG5ld2x5IG1hcHBlZCBjbHVzdGVycyAqL1xuJiM0MztcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcdTAwM2Mgc3RhcnRfaWR4ICYjNDM7IG5yOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1tpXS5sb2NrKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxuJiM0MztcdCAqL1xuJiM0MztcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggJiM0MzsgbnIpO1xuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2ZhaWxfbm91bm1hcDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFBhZ2VzIGFscmVhZHkgbWFwcGVkIGJ5IGEgY29uY3VycmVudCBncm93ZXIuICBGcmVlIG91ciB1bnVzZWRcbiYjNDM7XHQgKiBwYWdlcywgdGhlbiBmYWxsIHRocm91Z2ggdG8gaW5pdGlhbGl6ZSBzcGlubG9ja3MuICBUaGUgdm1hbGxvY1xuJiM0MztcdCAqIFBURXMgbm93IHBvaW50IHRvIHRoZSBjb25jdXJyZW50IGdyb3dlciYjMzk7cyBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHR3aGlsZSAoaSBcdTAwM2UgMCkge1xuJiM0MztcdFx0aS0tO1xuJiM0MztcdFx0aWYgKHBhZ2VzW2ldKVxuJiM0MztcdFx0XHRfX2ZyZWVfcGFnZShwYWdlc1tpXSk7XG4mIzQzO1x0fVxuJiM0MztcdGtmcmVlKHBhZ2VzKTtcbiYjNDM7XHRtZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHQvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBmb3IgbmV3bHkgbWFwcGVkIGNsdXN0ZXJzICovXG4mIzQzO1x0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFx1MDAzYyBzdGFydF9pZHggJiM0MzsgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2ktXHUwMDNlY2x1c3Rlcl9pbmZvW2ldLmxvY2spO1xuJiM0MztcbiYjNDM7XHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCwgc3RhcnRfaWR4ICYjNDM7IG5yKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztmYWlsOlxuJiM0MztcdHdoaWxlIChpIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRpLS07XG4mIzQzO1x0XHRpZiAocGFnZXNbaV0pXG4mIzQzO1x0XHRcdF9fZnJlZV9wYWdlKHBhZ2VzW2ldKTtcbiYjNDM7XHR9XG4mIzQzO1x0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcbiYjNDM7XHRrZnJlZShwYWdlcyk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuJiM0MztcdHJldHVybiAtRU5PTUVNO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3QgeHN3YXBfcGFnZV9kYXRhIHtcbiYjNDM7XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xuJiM0MztcdGludCBucjtcbiYjNDM7XHRpbnQgbWF4O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCB4c3dhcF9jb2xsZWN0X3BhZ2UocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHhzd2FwX3BhZ2VfZGF0YSAqeHBkID0gZGF0YTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwdGVfcHJlc2VudCgqcHRlKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGlmICh4cGQtXHUwMDNlbnIgXHUwMDNjIHhwZC1cdTAwM2VtYXgpXG4mIzQzO1x0XHR4cGQtXHUwMDNlcGFnZXNbeHBkLVx1MDAzZW5yJiM0MzsmIzQzO10gPSBwdGVfcGFnZSgqcHRlKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdW5tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLVx1MDAzZWNsdXN0ZXJfaW5mbyAmIzQzO1xuJiM0MztcdFx0XHRcdCAgIChzaXplX3Qpc3RhcnRfaWR4ICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmRfYWRkciA9IHN0YXJ0X2FkZHIgJiM0MzsgKHNpemVfdCluciAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUm91bmQgdG8gcGFnZSBib3VuZGFyaWVzOiBzdGFydCB1cCAoc2tpcCBwYXJ0aWFsIHBhZ2UgdGhhdCBtYXlcbiYjNDM7XHQgKiBjb250YWluIGNsdXN0ZXJzIHN0aWxsIGluIHVzZSBiZWZvcmUgc3RhcnRfaWR4KSwgZW5kIHVwIHNvIHRoZVxuJiM0MztcdCAqIGVudGlyZSByYW5nZSBpcyBjb3ZlcmVkLiAgdm1fYXJlYV91bm1hcF9wYWdlcygpIGFuZFxuJiM0MztcdCAqIGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoKSBvcGVyYXRlIG9uIHdob2xlIHBhZ2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdm1fc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0X2FkZHIpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdm1fZW5kID0gUEFHRV9BTElHTihlbmRfYWRkcik7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnBhZ2VzO1xuJiM0MztcdHN0cnVjdCB4c3dhcF9wYWdlX2RhdGEgeHBkO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAodm1fc3RhcnQgXHUwMDNlPSB2bV9lbmQpIHtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2l6ZSA9IHZtX2VuZCAtIHZtX3N0YXJ0O1xuJiM0MztcdG5wYWdlcyA9IHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2FsayB0aGUgcGFnZSB0YWJsZSB0byBjb2xsZWN0IHBoeXNpY2FsIHBhZ2VzIGJlZm9yZSB1bm1hcHBpbmcuXG4mIzQzO1x0ICogdm1fYXJlYV91bm1hcF9wYWdlcygpIG9ubHkgY2xlYXJzIFBURXMgYW5kIGZyZWVzIGludGVybWVkaWF0ZVxuJiM0MztcdCAqIHBhZ2UgdGFibGUgcGFnZXMg4oCUIGl0IGRvZXMgbm90IGZyZWUgYmFja2luZyBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHR4cGQucGFnZXMgPSBrbWFsbG9jX2FycmF5KG5wYWdlcywgc2l6ZW9mKCp4cGQucGFnZXMpLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoeHBkLnBhZ2VzKSB7XG4mIzQzO1x0XHR4cGQubnIgPSAwO1xuJiM0MztcdFx0eHBkLm1heCA9IG5wYWdlcztcbiYjNDM7XHRcdGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoXHUwMDI2aW5pdF9tbSwgdm1fc3RhcnQsIHNpemUsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHhzd2FwX2NvbGxlY3RfcGFnZSwgXHUwMDI2eHBkKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHZtX2FyZWFfdW5tYXBfcGFnZXMoc2ktXHUwMDNlY2x1c3Rlcl92bSwgdm1fc3RhcnQsIHZtX2VuZCk7XG4mIzQzO1xuJiM0MztcdC8qIEZyZWUgdGhlIGNvbGxlY3RlZCBiYWNraW5nIHBhZ2VzICovXG4mIzQzO1x0aWYgKHhwZC5wYWdlcykge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgeHBkLm5yOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0X19mcmVlX3BhZ2UoeHBkLnBhZ2VzW2ldKTtcbiYjNDM7XHRcdGtmcmVlKHhwZC5wYWdlcyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxuJiM0MztcdCAqL1xuJiM0MztcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBDYWxsYmFjayBmb3IgYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZSgpOiByZXR1cm4gMSB0byBzdG9wIGF0IHRoZVxuJiM0MzsgKiBmaXJzdCBwcmVzZW50IFBURSwgc2lnbmFsbGluZyB0aGF0IHRoZSByYW5nZSBpcyBhbHJlYWR5IG1hcHBlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBNYWludGFpbiBzaS1cdTAwM2Vucl9mcmVlX3RhaWwsIHRoZSBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0XG4mIzQzOyAqIHRoZSB0YWlsIG9mIHRoZSBtYXBwZWQgcmFuZ2UuICBDYWxsZWQgd2hlbiBhIGNsdXN0ZXIgYXQgQGZyZWVkX2lkeCBpc1xuJiM0MzsgKiBmcmVlZC4gIFByb3ZpZGVzIE8oMSkgc2hyaW5rIGRldGVjdGlvbjogaWYgbnJfZnJlZV90YWlsIGlzIG5vbi16ZXJvLFxuJiM0MzsgKiB0aGUgdGFpbCBjYW4gYmUgdW5tYXBwZWQgd2l0aG91dCBzY2FubmluZyBjbHVzdGVyX2luZm9bXS5cbiYjNDM7ICpcbiYjNDM7ICogT25seSBpbmNyZW1lbnRzIHdoZW4gQGZyZWVkX2lkeCBpcyB0aGUgY2x1c3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlXG4mIzQzOyAqIGV4aXN0aW5nIHRhaWwgcmVnaW9uLiAgVGhlbiBzY2FucyBiYWNrd2FyZHMgZm9yIGFscmVhZHktZnJlZSBjbHVzdGVyc1xuJiM0MzsgKiBub3cgY29ubmVjdGVkIHRvIHRoZSB0YWlsLCBib3VuZGVkIGJ5IFhTV0FQX0dST1dfQ0xVU1RFUlMgYXQgYSB0aW1lLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdXBkYXRlX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBmcmVlZF9pZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGlkLCBpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4mIzQzO1xuJiM0MztcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbiYjNDM7XHRucl90YWlsID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCk7XG4mIzQzO1xuJiM0MztcdC8qIFByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHNocmluayB0aGF0IHJhY2VzIHBhc3QgdXMgKi9cbiYjNDM7XHRpZiAobnJfdGFpbCBcdTAwM2U9IG5yX21hcHBlZClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0dGlkID0gbnJfbWFwcGVkIC0gbnJfdGFpbCAtIDE7XG4mIzQzO1xuJiM0MztcdC8qIE9ubHkgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0YWlsIHJlZ2lvbiBjb3VudHMgKi9cbiYjNDM7XHRpZiAoZnJlZWRfaWR4ICE9IHRpZClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0bnJfdGFpbCYjNDM7JiM0Mzs7XG4mIzQzO1x0V1JJVEVfT05DRShzaS1cdTAwM2Vucl9mcmVlX3RhaWwsIG5yX3RhaWwpO1xuJiM0MztcbiYjNDM7XHQvKiBFeHRlbmQ6IGluY2x1ZGUgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwgKi9cbiYjNDM7XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBYU1dBUF9HUk9XX0NMVVNURVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0bnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4mIzQzO1x0XHRucl90YWlsID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCk7XG4mIzQzO1x0XHRpZiAobnJfdGFpbCBcdTAwM2U9IG5yX21hcHBlZCAtIDEpXG4mIzQzO1x0XHRcdGJyZWFrOyAvKiByZWFjaGVkIGNsdXN0ZXIgMCAqL1xuJiM0MztcdFx0dGlkID0gbnJfbWFwcGVkIC0gbnJfdGFpbCAtIDE7XG4mIzQzO1x0XHRjaSA9IFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1t0aWRdO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSRUFEX09OQ0UoY2ktXHUwMDNlY291bnQpIHx8XG4mIzQzO1x0XHQgICAgUkVBRF9PTkNFKGNpLVx1MDAzZWZsYWdzKSAhPSBDTFVTVEVSX0ZMQUdfRlJFRSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRucl90YWlsJiM0MzsmIzQzOztcbiYjNDM7XHRcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsLCBucl90YWlsKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRyaW0gc2ktXHUwMDNlbnJfZnJlZV90YWlsIHdoZW4gYSBjbHVzdGVyIGluIHRoZSB0YWlsIHJlZ2lvbiBpcyBhbGxvY2F0ZWQuXG4mIzQzOyAqIEBpZHg6IGluZGV4IG9mIHRoZSBjbHVzdGVyIGJlaW5nIGFsbG9jYXRlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGFpbF9zdGFydDtcbiYjNDM7XG4mIzQzO1x0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogbnJfY2x1c3RlcnNfbWFwcGVkIGFuZCBucl9mcmVlX3RhaWwgYXJlIHJlYWQgbG9ja2xlc3NseTtcbiYjNDM7XHQgKiBjb25jdXJyZW50IHVwZGF0ZXMgbWF5IGNhdXNlIG5yX2ZyZWVfdGFpbCB0byBiZSB0cmltbWVkXG4mIzQzO1x0ICogc2xpZ2h0bHkgbGVzcyB0aGFuIGlkZWFsbHksIHdoaWNoIGlzIGhhcm1sZXNzLlxuJiM0MztcdCAqL1xuJiM0MztcdG5yX21hcHBlZCA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQpO1xuJiM0MztcdG5yX3RhaWwgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsKTtcbiYjNDM7XHR0YWlsX3N0YXJ0ID0gbnJfbWFwcGVkIC0gbnJfdGFpbDtcbiYjNDM7XHRpZiAoaWR4IFx1MDAzZT0gdGFpbF9zdGFydClcbiYjNDM7XHRcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsLCBucl9tYXBwZWQgLSBpZHggLSAxKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfc2hyaW5rX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gY29udGFpbmVyX29mKHdvcmssXG4mIzQzO1x0XHRcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0LCB4c3dhcF9zaHJpbmtfd29yayk7XG4mIzQzO1x0eHN3YXBfdHJ5X3NocmluayhzaSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRyeSB0byBzaHJpbmsgdGhlIGNsdXN0ZXJfaW5mbyB0YWlsLiAgVXNlcyBzaS1cdTAwM2Vucl9mcmVlX3RhaWwgd2hpY2hcbiYjNDM7ICogaXMgbWFpbnRhaW5lZCBpbmNyZW1lbnRhbGx5IGR1cmluZyBhbGxvYy9mcmVlIOKAlCBubyBzY2FubmluZyBuZWVkZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB4c3dhcF90cnlfc2hyaW5rKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnJfbWFwcGVkLCBucl9jZWlsaW5nLCBucl90YWlsLCBucl91bm1hcDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgaTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuJiM0MztcbiYjNDM7XHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0bnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4mIzQzO1x0bnJfY2VpbGluZyA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVycyk7XG4mIzQzO1x0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9mcmVlX3RhaWwpO1xuJiM0MztcbiYjNDM7XHRpZiAobnJfbWFwcGVkIFx1MDAzYz0gbnJfY2VpbGluZylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRpZiAobnJfdGFpbCBcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0bnJfdW5tYXAgPSBtaW4ocm91bmRfZG93bihucl90YWlsLCBYU1dBUF9HUk9XX0NMVVNURVJTKSxcbiYjNDM7XHRcdCAgICAgICBucl9tYXBwZWQgLSBucl9jZWlsaW5nKTtcbiYjNDM7XHRpZiAobnJfdW5tYXAgXHUwMDNjIFhTV0FQX0dST1dfQ0xVU1RFUlMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c3RhcnRfaWR4ID0gbnJfbWFwcGVkIC0gbnJfdW5tYXA7XG4mIzQzO1xuJiM0MztcdC8qIFZlcmlmeSB0aGUgdGFpbCBjbHVzdGVycyBhcmUgc3RpbGwgZnJlZSBiZWZvcmUgdW5tYXBwaW5nICovXG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuJiM0MztcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcdTAwM2MgbnJfbWFwcGVkOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y2kgPSBcdTAwMjZzaS1cdTAwM2VjbHVzdGVyX2luZm9baV07XG4mIzQzO1x0XHRpZiAoY2ktXHUwMDNlZmxhZ3MgIT0gQ0xVU1RFUl9GTEFHX0ZSRUUpIHtcbiYjNDM7XHRcdFx0bnJfdW5tYXAgPSBpIC0gc3RhcnRfaWR4O1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGxpc3RfZGVsKFx1MDAyNmNpLVx1MDAzZWxpc3QpO1xuJiM0MztcdFx0Y2ktXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORTtcbiYjNDM7XHR9XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmIChucl91bm1hcCBcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0eHN3YXBfdW5tYXBfY2x1c3RlcnMoc2ksIHN0YXJ0X2lkeCwgbnJfdW5tYXApO1xuJiM0MztcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsLCBucl90YWlsIC0gbnJfdW5tYXApO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfWFNXQVAgKi9cbiYjNDM7XG4gc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0XHRcdFx0ICAgIHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbiBcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIG1heHBhZ2VzKVxuQEAgLTM1MzIsNiAmIzQzOzQxMjAsNzAgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aW50IGVyciA9IC1FTk9NRU07XG4gXHR1bnNpZ25lZCBsb25nIGk7XG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBzaXplID0gUEFHRV9BTElHTihucl9jbHVzdGVycyAqIHNpemVvZigqY2x1c3Rlcl9pbmZvKSk7XG4mIzQzO1x0XHRzdHJ1Y3Qgdm1fc3RydWN0ICp2bTtcbiYjNDM7XG4mIzQzO1x0XHR2bSA9IGdldF92bV9hcmVhKHNpemUsIFZNX1NQQVJTRSk7XG4mIzQzO1x0XHRpZiAoIXZtKVxuJiM0MztcdFx0XHRnb3RvIGVycjtcbiYjNDM7XG4mIzQzO1x0XHRjbHVzdGVyX2luZm8gPSB2bS1cdTAwM2VhZGRyO1xuJiM0MztcdFx0c2ktXHUwMDNlY2x1c3Rlcl92bSA9IHZtO1xuJiM0MztcdFx0c2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4ID0gbnJfY2x1c3RlcnM7XG4mIzQzO1x0XHRzaS1cdTAwM2Vucl9jbHVzdGVycyA9IG5yX2NsdXN0ZXJzO1xuJiM0MztcdFx0c2ktXHUwMDNlY2x1c3Rlcl9pbmZvID0gY2x1c3Rlcl9pbmZvO1xuJiM0MztcbiYjNDM7XHRcdC8qIE1hcCB0aGUgaW5pdGlhbCBjaHVuayAoYXQgbGVhc3QgY2x1c3RlciAwKSAqL1xuJiM0MztcdFx0aWYgKHhzd2FwX21hcF9jbHVzdGVycyhzaSwgMCwgbWluX3QodW5zaWduZWQgbG9uZyxcbiYjNDM7XHRcdFx0XHRcdFhTV0FQX0dST1dfQ0xVU1RFUlMsIG5yX2NsdXN0ZXJzKSkpXG4mIzQzO1x0XHRcdGdvdG8gZXJyX2ZyZWVfdm07XG4mIzQzO1xuJiM0MztcdFx0LyogeHN3YXA6IG9ubHkgY2x1c3RlciAwIHNsb3QgMCBpcyBiYWQgKi9cbiYjNDM7XHRcdGVyciA9IHN3YXBfY2x1c3Rlcl9zZXR1cF9iYWRfc2xvdChzaSwgY2x1c3Rlcl9pbmZvLCAwLCBmYWxzZSk7XG4mIzQzO1x0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRnb3RvIGVycl91bm1hcDtcbiYjNDM7XG4mIzQzO1x0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZzaS1cdTAwM2VmcmVlX2NsdXN0ZXJzKTtcbiYjNDM7XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZWZ1bGxfY2x1c3RlcnMpO1xuJiM0MztcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2c2ktXHUwMDNlZGlzY2FyZF9jbHVzdGVycyk7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBTV0FQX05SX09SREVSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2c2ktXHUwMDNlbm9uZnVsbF9jbHVzdGVyc1tpXSk7XG4mIzQzO1x0XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZWZyYWdfY2x1c3RlcnNbaV0pO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIE1hcmsgbWFwcGVkIGNsdXN0ZXJzOiBjbHVzdGVyIDAgaGFzIDEgYmFkIHNsb3QsIHJlc3QgZnJlZSAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gXHUwMDI2Y2x1c3Rlcl9pbmZvW2ldO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKGkgPT0gMCkge1xuJiM0MztcdFx0XHRcdGNpLVx1MDAzZWZsYWdzID0gQ0xVU1RFUl9GTEFHX05PTkZVTEw7XG4mIzQzO1x0XHRcdFx0bGlzdF9hZGRfdGFpbChcdTAwMjZjaS1cdTAwM2VsaXN0LCBcdTAwMjZzaS1cdTAwM2Vub25mdWxsX2NsdXN0ZXJzWzBdKTtcbiYjNDM7XHRcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0XHRjaS1cdTAwM2VmbGFncyA9IENMVVNURVJfRkxBR19GUkVFO1xuJiM0MztcdFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Y2ktXHUwMDNlbGlzdCwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKiBBbGwgbWFwcGVkIGNsdXN0ZXJzIGV4Y2VwdCBjbHVzdGVyIDAgYXJlIGZyZWUgYXQgdGhlIHRhaWwgKi9cbiYjNDM7XHRcdHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCA9IHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCAtIDE7XG4mIzQzO1xuJiM0MztcdFx0bXV0ZXhfaW5pdChcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbiYjNDM7XHRcdElOSVRfV09SSyhcdTAwMjZzaS1cdTAwM2V4c3dhcF9zaHJpbmtfd29yaywgeHN3YXBfc2hyaW5rX3dvcmtfZm4pO1xuJiM0MztcdFx0eHN3YXBfZGVidWdmc19hZGQoc2kpO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJfdW5tYXA6XG4mIzQzO1x0XHR4c3dhcF91bm1hcF9jbHVzdGVycyhzaSwgMCwgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbiYjNDM7ZXJyX2ZyZWVfdm06XG4mIzQzO1x0XHRmcmVlX3ZtX2FyZWEoc2ktXHUwMDNlY2x1c3Rlcl92bSk7XG4mIzQzO1x0XHRzaS1cdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcbiYjNDM7XHRcdHNpLVx1MDAzZWNsdXN0ZXJfaW5mbyA9IE5VTEw7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7I2VuZGlmIC8qIENPTkZJR19YU1dBUCAqL1xuJiM0MztcbiBcdGNsdXN0ZXJfaW5mbyA9IGt2emFsbG9jX29ianMoKmNsdXN0ZXJfaW5mbywgbnJfY2x1c3RlcnMpO1xuIFx0aWYgKCFjbHVzdGVyX2luZm8pXG4gXHRcdGdvdG8gZXJyO1xuQEAgLTM1OTksNyAmIzQzOzQyNTEsNyBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRzaS1cdTAwM2VjbHVzdGVyX2luZm8gPSBjbHVzdGVyX2luZm87XG4gXHRyZXR1cm4gMDtcbiBlcnI6XG4tXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xuJiM0MztcdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtMzgxOCw3ICYjNDM7NDQ3MCw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHRzaS1cdTAwM2VnbG9iYWxfY2x1c3RlciA9IE5VTEw7XG4gXHRpbm9kZSA9IE5VTEw7XG4gXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhzaSwgc3dhcF9maWxlKTtcbi1cdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2ktXHUwMDNlY2x1c3Rlcl9pbmZvLCBzaS1cdTAwM2VtYXgpO1xuJiM0MztcdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpO1xuIFx0c2ktXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbiBcdC8qXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xuQEAgLTM5MzAsNyAmIzQzOzQ1ODIsNiBAQCB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKVxuIHN0YXRpYyBpbnQgX19pbml0IHN3YXBmaWxlX2luaXQodm9pZClcbiB7XG4gXHRzd2FwZmlsZV9tYXhpbXVtX3NpemUgPSBhcmNoX21heF9zd2FwZmlsZV9zaXplKCk7XG4tXG4gXHQvKlxuIFx0ICogT25jZSBhIGNsdXN0ZXIgaXMgZnJlZWQsIGl0JiMzOTtzIHN3YXAgdGFibGUgY29udGVudCBpcyByZWFkXG4gXHQgKiBvbmx5LCBhbmQgYWxsIHN3YXAgY2FjaGUgcmVhZGVycyAoc3dhcF9jYWNoZV8qKSB2ZXJpZmllc1xuQEAgLTM5NDAsMTIgJiM0Mzs0NTkxLDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHN3YXBmaWxlX2luaXQodm9pZClcbiBcdFx0c3dhcF90YWJsZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShcJiMzNDtzd2FwX3RhYmxlXCYjMzQ7LFxuIFx0XHRcdFx0ICAgIHNpemVvZihzdHJ1Y3Qgc3dhcF90YWJsZSksXG4gXHRcdFx0XHQgICAgMCwgU0xBQl9QQU5JQyB8IFNMQUJfVFlQRVNBRkVfQllfUkNVLCBOVUxMKTtcbi1cbiAjaWZkZWYgQ09ORklHX01JR1JBVElPTlxuIFx0aWYgKHN3YXBmaWxlX21heGltdW1fc2l6ZSBcdTAwM2U9ICgxVUwgXHUwMDNjXHUwMDNjIFNXUF9NSUdfVE9UQUxfQklUUykpXG4gXHRcdHN3YXBfbWlncmF0aW9uX2FkX3N1cHBvcnRlZCA9IHRydWU7XG4gI2VuZGlmXHQvKiBDT05GSUdfTUlHUkFUSU9OICovXG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHR4c3dhcF9kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoXCYjMzQ7eHN3YXBcJiMzNDssIE5VTEwpO1xuJiM0MzsjZW5kaWZcbiYjNDM7XG4gXHRyZXR1cm4gMDtcbiB9XG4gc3Vic3lzX2luaXRjYWxsKHN3YXBmaWxlX2luaXQpO1xuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCBmN2M5Yzg5ZjY0NDljLi42MTc4NDY1ZDA1ODM3IDEwMDY0NFxuLS0tIGEvbW0venN3YXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0venN3YXAuY1xuQEAgLTk5OCw3ICYjNDM7OTk4LDEyIEBAIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHQvKiB0cnkgdG8gYWxsb2NhdGUgc3dhcCBjYWNoZSBmb2xpbyAqL1xuIFx0c2kgPSBnZXRfc3dhcF9kZXZpY2Uoc3dwZW50cnkpO1xuIFx0aWYgKCFzaSlcbi1cdFx0cmV0dXJuIC1FRVhJU1Q7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbiYjNDM7XHRcdHB1dF9zd2FwX2RldmljZShzaSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4gXG4gXHRtcG9sID0gZ2V0X3Rhc2tfcG9saWN5KGN1cnJlbnQpO1xuIFx0Zm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cGVudHJ5LCBHRlBfS0VSTkVMLCBCSVQoMCksIE5VTEwsIG1wb2wsXG5AQCAtMTUzNSw3ICYjNDM7MTU0MCw3IEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdHpzd2FwX3Bvb2xfcHV0KHBvb2wpO1xuIHB1dF9vYmpjZzpcbiBcdG9ial9jZ3JvdXBfcHV0KG9iamNnKTtcbi1cdGlmICghcmV0IFx1MDAyNlx1MDAyNiB6c3dhcF9wb29sX3JlYWNoZWRfZnVsbClcbiYjNDM7XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgenN3YXBfcG9vbF9yZWFjaGVkX2Z1bGwgXHUwMDI2XHUwMDI2IGF0b21pY19yZWFkKFx1MDAyNm5yX3JlYWxfc3dhcGZpbGVzKSlcbiBcdFx0cXVldWVfd29yayhzaHJpbmtfd3EsIFx1MDAyNnpzd2FwX3Nocmlua193b3JrKTtcbiBjaGVja19vbGQ6XG4gXHQvKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtYU1dBUCYjMzQ7LAogICAgJiMzNDtERUJVR19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3hzd2FwX21heF9jbHVzdGVyc193cml0ZSYjMzQ7LAogICAgJiMzNDt4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZCYjMzQ7LAogICAgJiMzNDt4c3dhcF9zaHJpbmtfd29ya19mbiYjMzQ7LAogICAgJiMzNDt4c3dhcF9jaGVja19tYXBwZWQmIzM0OywKICAgICYjMzQ7eHN3YXBfY29sbGVjdF9wYWdlJiMzNDssCiAgICAmIzM0O3hzd2FwX21hcF9jbHVzdGVycyYjMzQ7LAogICAgJiMzNDt4c3dhcF91bm1hcF9jbHVzdGVycyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dGVuZGFibGUgdmlydHVhbCBzd2FwIGRldmljZSAoeHN3YXApIHRoYXQgZGVjb3VwbGVzIFBURSBzd2FwIGVudHJpZXMgZnJvbSBwaHlzaWNhbCBiYWNraW5nIHN0b3JhZ2UuIEl0IHVzZXMgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIGZvciBjbHVzdGVyIGluZm8gdGhhdCBncm93cyBhbmQgc2hyaW5rcyBkeW5hbWljYWxseS4gVGhpcyBhZGRzIG5ldyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgZm9yIHN3YXAgbWFuYWdlbWVudCwgaW5jbHVkaW5nIGRlYnVnZnMgaW50ZXJmYWNlcyBhbmQgYSB3b3JrcXVldWUgZm9yIHNocmlua2luZy4gSXQgaXMgZnVuY3Rpb25hbCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDIzYjg2NWYzYzQ5NjdkMjI3ZTY5ZTM5MjBmYzQyNTc0NTlmYmZjNDIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEF1ZyA1IDA5OjE0OjM2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCA0NWYzMDFkNzNlMmFlLi5hNWIzMjMzNzQ3NjljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMjA3LDYgJiM0MzsyMDcsNyBAQCBlbnVtIHsKIAlTV1BfU1RBQkxFX1dSSVRFUyA9ICgxICZsdDsmbHQ7IDExKSwJLyogbm8gb3ZlcndyaXRlIFBHX3dyaXRlYmFjayBwYWdlcyAqLwogCVNXUF9TWU5DSFJPTk9VU19JTyA9ICgxICZsdDsmbHQ7IDEyKSwJLyogc3luY2hyb25vdXMgSU8gaXMgZWZmaWNpZW50ICovCiAJU1dQX0hJQkVSTkFUSU9OID0gKDEgJmx0OyZsdDsgMTMpLAkvKiBwaW5uZWQgZm9yIGhpYmVybmF0aW9uICovCiYjNDM7CVNXUF9YU1dBUAk9ICgxICZsdDsmbHQ7IDE0KSwJLyogZXh0ZW5kYWJsZSBzd2FwIGRldmljZSAqLwogCQkJCQkvKiBhZGQgb3RoZXJzIGhlcmUgYmVmb3JlLi4uICovCiB9OwogCkBAIC0yNDcsNiAmIzQzOzI0OCwxNiBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7CiAJc2lnbmVkIGNoYXIJdHlwZTsJCS8qIHN0cmFuZ2UgbmFtZSBmb3IgYW4gaW5kZXggKi8KIAl1bnNpZ25lZCBpbnQJbWF4OwkJLyogc2l6ZSBvZiB0aGlzIHN3YXAgZGV2aWNlICovCiAJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87IC8qIGNsdXN0ZXIgaW5mby4gT25seSBmb3IgU1NEICovCiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUAomIzQzOwlzdHJ1Y3Qgdm1fc3RydWN0CSpjbHVzdGVyX3ZtOwkvKiBWTV9TUEFSU0UgYXJlYSBmb3IgeHN3YXAgZHluYW1pYyBjbHVzdGVyX2luZm8gKi8KJiM0MzsJdW5zaWduZWQgbG9uZwkJbnJfY2x1c3RlcnNfbWF4Oy8qIHVwcGVyIGxpbWl0IGZyb20gc3dhcCBoZWFkZXIgKi8KJiM0MzsJdW5zaWduZWQgbG9uZwkJbnJfY2x1c3RlcnM7CS8qIGN1cnJlbnQgZ3Jvd3RoIGNlaWxpbmcgKOKJpCBucl9jbHVzdGVyc19tYXgpICovCiYjNDM7CXVuc2lnbmVkIGxvbmcJCW5yX2NsdXN0ZXJzX21hcHBlZDsgLyogY3VycmVudGx5IG1hcHBlZCBjbHVzdGVyIGNvdW50ICovCiYjNDM7CXVuc2lnbmVkIGxvbmcJCW5yX2ZyZWVfdGFpbDsJLyogY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0IHRhaWwgKi8KJiM0MzsJc3RydWN0IGRlbnRyeQkJKmRlYnVnZnNfZW50cnk7CS8qIGRlYnVnZnM6IHR5cGUmbHQ7TiZndDtfbWF4X2NsdXN0ZXJzICovCiYjNDM7CXN0cnVjdCB3b3JrX3N0cnVjdAl4c3dhcF9zaHJpbmtfd29yazsgLyogZGVmZXJyZWQgc2hyaW5rIHRyaWdnZXIgKi8KJiM0MzsJc3RydWN0IG11dGV4CQl4c3dhcF9sb2NrOwkvKiBzZXJpYWxpemUgbWFwL3VubWFwIG9wZXJhdGlvbnMgKi8KJiM0MzsjZW5kaWYKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfY2x1c3RlcnM7IC8qIGZyZWUgY2x1c3RlcnMgbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZnVsbF9jbHVzdGVyczsgLyogZnVsbCBjbHVzdGVycyBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBub25mdWxsX2NsdXN0ZXJzW1NXQVBfTlJfT1JERVJTXTsKQEAgLTM1MCw2ICYjNDM7MzYxLDcgQEAgdm9pZCBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBmb2xpbyAqZm9saW8pOwogdm9pZCBmcmVlX3BhZ2VzX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBlbmNvZGVkX3BhZ2UgKiosIGludCk7CiAvKiBsaW51eC9tbS9zd2FwZmlsZS5jICovCiBleHRlcm4gYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzOwomIzQzO2V4dGVybiBhdG9taWNfdCBucl9yZWFsX3N3YXBmaWxlczsKIGV4dGVybiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7CiBleHRlcm4gYXRvbWljX3QgbnJfcm90YXRlX3N3YXA7CiAKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IDA2MDE5MGUxMmJjZWQuLjgyZjYyZjRjNWIyM2UgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvbW0vS2NvbmZpZwpAQCAtMTIyLDYgJiM0MzsxMjIsMTUgQEAgY29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVAogICAgICAgIGRlZmF1bHQgJiMzNDt6c3RkJiMzNDsgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX1pTVEQKICAgICAgICBkZWZhdWx0ICYjMzQ7JiMzNDsKIAomIzQzO2NvbmZpZyBYU1dBUAomIzQzOwlib29sICYjMzQ7RXh0ZW5kYWJsZSAodmlydHVhbCkgc3dhcCBkZXZpY2UmIzM0OwomIzQzOwlkZXBlbmRzIG9uIFNXQVAgJmFtcDsmYW1wOyA2NEJJVAomIzQzOwloZWxwCiYjNDM7CSAgQWRkcyBzdXBwb3J0IGZvciBleHRlbmRhYmxlIHN3YXAgZGV2aWNlcyAoeHN3YXApIHRoYXQgZGVjb3VwbGUKJiM0MzsJICBQVEUgc3dhcCBlbnRyaWVzIGZyb20gcGh5c2ljYWwgYmFja2luZyBzdG9yYWdlLiBUaGUgY2x1c3Rlcl9pbmZvCiYjNDM7CSAgYXJyYXkgaXMgYmFja2VkIGJ5IGEgc3BhcnNlIHZtYWxsb2MgYXJlYSB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzCiYjNDM7CSAgb24gZGVtYW5kLCBhdm9pZGluZyBzdGF0aWMgcHJlLWFsbG9jYXRpb24gb3ZlcmhlYWQuCiYjNDM7CiBjb25maWcgWlNNQUxMT0MKIAl0cmlzdGF0ZQogCmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmMKaW5kZXggZTRmYTdmZmZmZThiYi4uMWYzZmE1MjEzMWFiMyAxMDA2NDQKLS0tIGEvbW0vcGFnZV9pby5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3BhZ2VfaW8uYwpAQCAtMjQ3LDYgJiM0MzsyNDcsMTcgQEAgaW50IHN3YXBfd3JpdGVvdXQoc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCiYjNDM7CS8qCiYjNDM7CSAqIGN0eC0mZ3Q7c2lzIGlzIHNldCBieSBzd2FwX2FkZF9mb2xpbygpIHdoaWNoIGlzIGNhbGxlZCBmcm9tCiYjNDM7CSAqIF9fc3dhcF93cml0ZXBhZ2UoKSBiZWxvdy4gIFNpbmNlIHdlIG11c3QgYXZvaWQgdGhlIHdyaXRlcGFnZQomIzQzOwkgKiBwYXRoIGZvciB4c3dhcCBkZXZpY2VzLCB1c2UgdGhlIHN3YXBfaW5mbyBmcm9tIHRoZSBmb2xpbyYjMzk7cwomIzQzOwkgKiBzd2FwIGVudHJ5IGRpcmVjdGx5IGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCBjdHguCiYjNDM7CSAqLwomIzQzOwlpZiAodW5saWtlbHkoX19zd2FwX2VudHJ5X3RvX2luZm8oZm9saW8tJmd0O3N3YXApLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApKSB7CiYjNDM7CQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKJiM0MzsJCXJldHVybiBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOwomIzQzOwl9CiYjNDM7CiAJX19zd2FwX3dyaXRlcGFnZShjdHgsIGZvbGlvKTsKIAlyZXR1cm4gMDsKIG91dF91bmxvY2s6CkBAIC00NzksNiAmIzQzOzQ5MCwxMSBAQCB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbykKIAlpZiAoenN3YXBfbG9hZChmb2xpbykgIT0gLUVOT0VOVCkKIAkJZ290byBmaW5pc2g7CiAKJiM0MzsJaWYgKHVubGlrZWx5KHNpcy0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1hTV0FQKSkgewomIzQzOwkJZm9saW9fdW5sb2NrKGZvbGlvKTsKJiM0MzsJCWdvdG8gZmluaXNoOwomIzQzOwl9CiYjNDM7CiAJLyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovCiAJenN3YXBfZm9saW9fc3dhcGluKGZvbGlvKTsKIAlzd2FwX2FkZF9mb2xpbyhjdHgsIGZvbGlvLCBSRUFEKTsKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCA1YmU4MjU5MTFlNjQ1Li5lYmIyZDJhYzM1NmZlIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC04MjksNiAmIzQzOzgyOSwxMyBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBfY2x1c3Rlcl9yZWFkYWhlYWQoc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcF9tYXNrLAogCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCXN3cF9lbnRyeV90IHJhX2VudHJ5OwogCiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBlbnRyeSBtYXkgaGF2ZSBiZWVuIGZyZWVkIGJ5IGFub3RoZXIgdGFzay4gQXZvaWQgc3dhcF9pbmZvX2dldCgpCiYjNDM7CSAqIHdoaWNoIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBpZiB0aGUgcmFjZSBoYXBwZW5zLgomIzQzOwkgKi8KJiM0MzsJaWYgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApCiYjNDM7CQlnb3RvIHNraXA7CiYjNDM7CiAJbWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTsKIAlpZiAoIW1hc2spCiAJCWdvdG8gc2tpcDsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IDRkNGUzZTMwNTlmNmIuLmNhNDA2NTU2NjI2ZTcgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuYwpAQCAtNDgsNiAmIzQzOzQ4LDExOCBAQAogI2luY2x1ZGUgJiMzNDtzd2FwX3RhYmxlLmgmIzM0OwogI2luY2x1ZGUgJiMzNDtpbnRlcm5hbC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7c3dhcC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZGVidWdmcy5oJmd0OwomIzQzOwomIzQzO3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9sb2NrKTsKJiM0MzsKJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQCiYjNDM7LyoKJiM0MzsgKiB4c3dhcDogZHluYW1pY2FsbHkgZ3JvdyBhbmQgc2hyaW5rIHRoZSBjbHVzdGVyX2luZm8gYXJyYXkgdmlhIGEKJiM0MzsgKiBWTV9TUEFSU0UgYXJlYS4KJiM0MzsgKgomIzQzOyAqIFhTV0FQX0dST1dfQ0xVU1RFUlMgaXMgdGhlIG51bWJlciBvZiBjbHVzdGVycyB0byBtYXAvdW5tYXAgaW4gb25lCiYjNDM7ICogZ3Jvdy9zaHJpbmsgb3BlcmF0aW9uLiAgSXQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgY2x1c3Rlcl9pbmZvCiYjNDM7ICogc3RydWN0cyB0aGF0IGZpdCBpbiBhIHNpbmdsZSBwYWdlIChhdCBsZWFzdCAxNiksIHNvIHRoYXQgdGhlIHZtYWxsb2MKJiM0MzsgKiBwYWdlIHRhYmxlCiYjNDM7ICogb3ZlcmhlYWQgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgbWFwcGVkLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgWFNXQVBfR1JPV19DTFVTVEVSUyBcCiYjNDM7CW1heF90KHVuc2lnbmVkIGxvbmcsIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pLCAxNikKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGRlbnRyeSAqeHN3YXBfZGVidWdmc19yb290OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgeHN3YXBfbWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucik7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdW5tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAomIzQzOwkJCQkgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIHVuc2lnbmVkIGxvbmcgbnIpOwomIzQzO3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSk7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdHJpbV9mcmVlX3RhaWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIGlkeCk7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdXBkYXRlX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGZyZWVkX2lkeCk7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdHJ5X3NocmluayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpOwomIzQzOwomIzQzOy8qCiYjNDM7ICogZGVidWdmcyByZWFkL3dyaXRlIGZvciBwZXItZGV2aWNlIG1heCBjbHVzdGVyIGNvdW50LgomIzQzOyAqIFNob3dzL3NldHMgc2ktJmd0O25yX2NsdXN0ZXJzIChjdXJyZW50IGdyb3d0aCBjZWlsaW5nKSwgY2xhbXBlZCB0bwomIzQzOyAqIFswLCBzaS0mZ3Q7bnJfY2x1c3RlcnNfbWF4XS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKJiM0MzsJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQomIzQzO3sKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gZmlsZS0mZ3Q7cHJpdmF0ZV9kYXRhOwomIzQzOwljaGFyIHRtcFszMl07CiYjNDM7CWludCBsZW47CiYjNDM7CiYjNDM7CWxlbiA9IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICYjMzQ7JWx1XG4mIzM0OywgUkVBRF9PTkNFKHNpLSZndDtucl9jbHVzdGVycykpOwomIzQzOwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgdG1wLCBsZW4pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCiYjNDM7CQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLAomIzQzOwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdmFsLCBuZXdfcGFnZXM7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IGtzdHJ0b3VsX2Zyb21fdXNlcihidWYsIGNvdW50LCAwLCAmYW1wO3ZhbCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwomIzQzOwlpZiAodmFsICZndDsgc2ktJmd0O25yX2NsdXN0ZXJzX21heCkKJiM0MzsJCXZhbCA9IHNpLSZndDtucl9jbHVzdGVyc19tYXg7CiYjNDM7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NpLSZndDtsb2NrKTsKJiM0MzsJc2ktJmd0O25yX2NsdXN0ZXJzID0gdmFsOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3NpLSZndDtsb2NrKTsKJiM0MzsKJiM0MzsJLyogS2VlcCB0aGUgdmlzaWJsZSBzd2FwIHNpemUgaW4gc3luYyB3aXRoIHRoZSBuZXcgY2VpbGluZy4gKi8KJiM0MzsJbmV3X3BhZ2VzID0gbWluX3QodW5zaWduZWQgbG9uZywgdmFsICogU1dBUEZJTEVfQ0xVU1RFUiwgc2ktJmd0O21heCk7CiYjNDM7CWlmIChuZXdfcGFnZXMpCiYjNDM7CQluZXdfcGFnZXMtLTsKJiM0MzsJaWYgKG5ld19wYWdlcyAhPSBzaS0mZ3Q7cGFnZXMpIHsKJiM0MzsJCWxvbmcgZGVsdGEgPSAobG9uZyluZXdfcGFnZXMgLSAobG9uZylzaS0mZ3Q7cGFnZXM7CiYjNDM7CiYjNDM7CQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwkJc2ktJmd0O3BhZ2VzID0gbmV3X3BhZ2VzOwomIzQzOwkJYXRvbWljX2xvbmdfYWRkKGRlbHRhLCAmYW1wO25yX3N3YXBfcGFnZXMpOwomIzQzOwkJdG90YWxfc3dhcF9wYWdlcyAmIzQzOz0gZGVsdGE7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2hyaW5rIHRyaWdnZXI6IGxvd2VyaW5nIHRoZSBjZWlsaW5nIG1heSBmcmVlIHRhaWwgY2x1c3RlcnMuICovCiYjNDM7CXNjaGVkdWxlX3dvcmsoJmFtcDtzaS0mZ3Q7eHN3YXBfc2hyaW5rX3dvcmspOwomIzQzOwomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhzd2FwX2RlYnVnZnNfZm9wcyA9IHsKJiM0MzsJLnJlYWQgPSB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZCwKJiM0MzsJLndyaXRlID0geHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlLAomIzQzOwkub3BlbiA9IHNpbXBsZV9vcGVuLAomIzQzOwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB4c3dhcF9kZWJ1Z2ZzX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwljaGFyIG5hbWVbMzJdOwomIzQzOwomIzQzOwlpZiAoIXhzd2FwX2RlYnVnZnNfcm9vdCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAmIzM0O3R5cGUlZF9jbHVzdGVyX2xpbWl0JiMzNDssIHNpLSZndDt0eXBlKTsKJiM0MzsJc2ktJmd0O2RlYnVnZnNfZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA2NDQsIHhzd2FwX2RlYnVnZnNfcm9vdCwKJiM0MzsJCQkJCQlzaSwgJmFtcDt4c3dhcF9kZWJ1Z2ZzX2ZvcHMpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB4c3dhcF9kZWJ1Z2ZzX2RlbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwlkZWJ1Z2ZzX3JlbW92ZShzaS0mZ3Q7ZGVidWdmc19lbnRyeSk7CiYjNDM7CXNpLSZndDtkZWJ1Z2ZzX2VudHJ5ID0gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7CiYjNDM7I2VuZGlmCiAKIHN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQkJICAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7CkBAIC02Myw5ICYjNDM7MTc1LDkgQEAgc3RhdGljIHZvaWQgbW92ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKICAqCiAgKiBBbHNvIHByb3RlY3RzIHN3YXBfYWN0aXZlX2hlYWQgdG90YWxfc3dhcF9wYWdlcywgYW5kIHRoZSBTV1BfV1JJVEVPSyBmbGFnLgogICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlczsKIGF0b21pY19sb25nX3QgbnJfc3dhcF9wYWdlczsKJiM0MzthdG9taWNfdCBucl9yZWFsX3N3YXBmaWxlczsKIC8qCiAgKiBTb21lIG1vZHVsZXMgdXNlIHN3YXBwYWJsZSBvYmplY3RzIGFuZCBtYXkgdHJ5IHRvIHN3YXAgdGhlbSBvdXQgdW5kZXIKICAqIG1lbW9yeSBwcmVzc3VyZSAodmlhIHRoZSBzaHJpbmtlcikuIEJlZm9yZSBkb2luZyBzbywgdGhleSBtYXkgd2lzaCB0bwpAQCAtNjA5LDYgJiM0Mzs3MjEsMTAgQEAgc3RhdGljIHZvaWQgX19mcmVlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8KIAlzd2FwX2NsdXN0ZXJfZnJlZV90YWJsZShjaSk7CiAJbW92ZV9jbHVzdGVyKHNpLCBjaSwgJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycywgQ0xVU1RFUl9GTEFHX0ZSRUUpOwogCWNpLSZndDtvcmRlciA9IDA7CiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUAomIzQzOwl4c3dhcF91cGRhdGVfZnJlZV90YWlsKHNpLCBjaSAtIHNpLSZndDtjbHVzdGVyX2luZm8pOwomIzQzOwlzY2hlZHVsZV93b3JrKCZhbXA7c2ktJmd0O3hzd2FwX3Nocmlua193b3JrKTsKJiM0MzsjZW5kaWYKIH0KIAogLyoKQEAgLTk1NSw2ICYjNDM7MTA3MSw5IEBAIHN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCWlmIChjbHVzdGVyX2lzX2VtcHR5KGNpKSkKIAkJY2ktJmd0O29yZGVyID0gb3JkZXI7CiAJY2ktJmd0O2NvdW50ICYjNDM7PSBucl9wYWdlczsKJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQCiYjNDM7CXhzd2FwX3RyaW1fZnJlZV90YWlsKHNpLCBjbHVzdGVyX2luZGV4KHNpLCBjaSkpOwomIzQzOyNlbmRpZgogCXN3YXBfcmFuZ2VfYWxsb2Moc2ksIG5yX3BhZ2VzKTsKIAogCXJldHVybiB0cnVlOwpAQCAtMTE4NSw2ICYjNDM7MTMwNCw1MCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlpZiAoZm91bmQpCiAJCQlnb3RvIGRvbmU7CiAJfQomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfWFNXQVAKJiM0MzsJLyoKJiM0MzsJICogRm9yIHhzd2FwOiBpZiBubyBmcmVlIGNsdXN0ZXIgd2FzIGZvdW5kIGFuZCBtb3JlIGNsdXN0ZXJzCiYjNDM7CSAqIGNhbiBiZSBtYXBwZWQsIGdyb3cgdGhlIGNsdXN0ZXJfaW5mbyBhcnJheSBhbmQgcmV0cnkuCiYjNDM7CSAqLwomIzQzOwlpZiAoIWZvdW5kICZhbXA7JmFtcDsgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApICZhbXA7JmFtcDsKJiM0MzsJICAgIFJFQURfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkKSAmbHQ7IFJFQURfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnMpICZhbXA7JmFtcDsKJiM0MzsJICAgIGxpc3RfZW1wdHkoJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycykpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnJfbmV3ID0gbWluKFJFQURfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnMpIC0KJiM0MzsJCQkJCSAgUkVBRF9PTkNFKHNpLSZndDtucl9jbHVzdGVyc19tYXBwZWQpLAomIzQzOwkJCQkJICBYU1dBUF9HUk9XX0NMVVNURVJTKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CiYjNDM7CQlpZiAoIXhzd2FwX21hcF9jbHVzdGVycyhzaSwgc3RhcnQsIG5yX25ldykpIHsKJiM0MzsJCQl1bnNpZ25lZCBsb25nIGFkZGVkID0gMDsKJiM0MzsKJiM0MzsJCQlzcGluX2xvY2soJmFtcDtzaS0mZ3Q7bG9jayk7CiYjNDM7CQkJZm9yIChpID0gc3RhcnQ7IGkgJmx0OyBzdGFydCAmIzQzOyBucl9uZXc7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSAmYW1wO3NpLSZndDtjbHVzdGVyX2luZm9baV07CiYjNDM7CQkJCXNwaW5fbG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogQSBjb25jdXJyZW50IGdyb3dlciBtYXkgaGF2ZSBhbHJlYWR5IGFkZGVkCiYjNDM7CQkJCSAqIHRoZXNlIGNsdXN0ZXJzIHRvIHRoZSBmcmVlIGxpc3QuICBPbmx5IGFkZAomIzQzOwkJCQkgKiBjbHVzdGVycyB0aGF0IGFyZSBzdGlsbCBvZmYtbGlzdCAoTk9ORSkuCiYjNDM7CQkJCSAqLwomIzQzOwkJCQlpZiAoY2ktJmd0O2ZsYWdzID09IENMVVNURVJfRkxBR19OT05FKSB7CiYjNDM7CQkJCQljaS0mZ3Q7ZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfRlJFRTsKJiM0MzsJCQkJCWxpc3RfYWRkX3RhaWwoJmFtcDtjaS0mZ3Q7bGlzdCwgJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycyk7CiYjNDM7CQkJCQlhZGRlZCYjNDM7JiM0Mzs7CiYjNDM7CQkJCX0KJiM0MzsJCQkJc3Bpbl91bmxvY2soJmFtcDtjaS0mZ3Q7bG9jayk7CiYjNDM7CQkJfQomIzQzOwkJCXNwaW5fdW5sb2NrKCZhbXA7c2ktJmd0O2xvY2spOwomIzQzOwkJCVdSSVRFX09OQ0Uoc2ktJmd0O25yX2ZyZWVfdGFpbCwKJiM0MzsJCQkJICAgUkVBRF9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwpICYjNDM7IG5yX25ldyk7CiYjNDM7CiYjNDM7CQkJLyogUmV0cnkgYWxsb2NhdGlvbiBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KJiM0MzsJCQlmb3VuZCA9IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHNpLCAmYW1wO3NpLSZndDtmcmVlX2NsdXN0ZXJzLAomIzQzOwkJCQkJCSAgICBmb2xpbywgZmFsc2UpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7I2VuZGlmCiBkb25lOgogCWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfU09MSURTVEFURSkpCiAJCXNwaW5fdW5sb2NrKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyX2xvY2spOwpAQCAtMTIyMyw2ICYjNDM7MTM4Niw4IEBAIHN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpCiAJCQlnb3RvIHNraXA7CiAJfQogCiYjNDM7CWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApKQomIzQzOwkJYXRvbWljX3N1YigxLCAmYW1wO25yX3JlYWxfc3dhcGZpbGVzKTsKIAlwbGlzdF9kZWwoJmFtcDtzaS0mZ3Q7YXZhaWxfbGlzdCwgJmFtcDtzd2FwX2F2YWlsX2hlYWQpOwogCiBza2lwOgpAQCAtMTI2NSw2ICYjNDM7MTQzMCw4IEBAIHN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pCiAJfQogCiAJcGxpc3RfYWRkKCZhbXA7c2ktJmd0O2F2YWlsX2xpc3QsICZhbXA7c3dhcF9hdmFpbF9oZWFkKTsKJiM0MzsJaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9YU1dBUCkpCiYjNDM7CQlhdG9taWNfYWRkKDEsICZhbXA7bnJfcmVhbF9zd2FwZmlsZXMpOwogCiBza2lwOgogCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKQEAgLTI5NTIsNiAmIzQzOzMxMTksMTkgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2V4dGVudHMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcywKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0mZ3Q7aG9zdDsKIAlpbnQgcmV0OwogCiYjNDM7CWlmIChzaXMtJmd0O2ZsYWdzICZhbXA7IFNXUF9YU1dBUCkgewomIzQzOwkJKnNwYW4gPSAwOwomIzQzOwkJLyoKJiM0MzsJCSAqIHhzd2FwIGRldmljZXMgaGF2ZSBubyBiYWNraW5nIGJsb2NrIGRldmljZSBhbmQKJiM0MzsJCSAqIHBoeXNpY2FsIHdyaXRlb3V0IGlzIHNraXBwZWQgaW4gc3dhcF93cml0ZW91dCgpLAomIzQzOwkJICogYnV0IHNpcy0mZ3Q7b3BzIG11c3Qgc3RpbGwgYmUgc2V0IHNvIHRoYXQgY2FsbGVycwomIzQzOwkJICogbGlrZSBzaHJpbmtfZm9saW9fbGlzdCgpIGNhbiBzYWZlbHkgZGVyZWZlcmVuY2UKJiM0MzsJCSAqIG9wcy0mZ3Q7ZmxhZ3MuCiYjNDM7CQkgKi8KJiM0MzsJCXNpcy0mZ3Q7b3BzID0gJmFtcDtzd2FwX2JkZXZfb3BzOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAlyZXQgPSBzaW9fcG9vbF9pbml0KCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTMwMjMsMjAgJiM0MzszMjAzLDUwIEBAIHN0YXRpYyB2b2lkIHdhaXRfZm9yX2FsbG9jYXRpb24oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCiAJQlVHX09OKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfV1JJVEVPSyk7CiAKJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQCiYjNDM7CS8qCiYjNDM7CSAqIHhzd2FwIGNsdXN0ZXJzIGJleW9uZCBucl9jbHVzdGVyc19tYXBwZWQgaGF2ZSBiZWVuIHVubWFwcGVkCiYjNDM7CSAqIGJ5IHRoZSBzaHJpbmtlciBhbmQgdGhlaXIgdm1hbGxvYyBwYWdlcyBhcmUgbm8gbG9uZ2VyCiYjNDM7CSAqIGFjY2Vzc2libGUuICBPbmx5IGl0ZXJhdGUgb3ZlciBjdXJyZW50bHkgbWFwcGVkIGNsdXN0ZXJzLgomIzQzOwkgKi8KJiM0MzsJaWYgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApCiYjNDM7CQllbmQgPSBtaW4oZW5kLCBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCkgKgomIzQzOwkJCSAgU1dBUEZJTEVfQ0xVU1RFUik7CiYjNDM7I2VuZGlmCiYjNDM7CiAJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgJmx0OyBlbmQ7IG9mZnNldCAmIzQzOz0gU1dBUEZJTEVfQ0xVU1RFUikgewogCQljaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpOwogCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sCi0JCQkJICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcykKJiM0MztzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIHsKJiM0MzsJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8gPSBzaS0mZ3Q7Y2x1c3Rlcl9pbmZvOwomIzQzOwl1bnNpZ25lZCBsb25nIG1heHBhZ2VzID0gc2ktJmd0O21heDsKIAlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwotCWludCBpLCBucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7CiYjNDM7CWludCBpLCBucl9jbHVzdGVyczsKIAogCWlmICghY2x1c3Rlcl9pbmZvKQogCQlyZXR1cm47CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUAomIzQzOwlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9YU1dBUCkgewomIzQzOwkJeHN3YXBfZGVidWdmc19kZWwoc2kpOwomIzQzOwkJY2FuY2VsX3dvcmtfc3luYygmYW1wO3NpLSZndDt4c3dhcF9zaHJpbmtfd29yayk7CiYjNDM7CQkvKiBVbm1hcCBhbGwgbWFwcGVkIGNsdXN0ZXJzIGFuZCBmcmVlIHRoZSBWTV9TUEFSU0UgYXJlYSAqLwomIzQzOwkJaWYgKHNpLSZndDtucl9jbHVzdGVyc19tYXBwZWQgJmd0OyAwKQomIzQzOwkJCXhzd2FwX3VubWFwX2NsdXN0ZXJzKHNpLCAwLCBzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkKTsKJiM0MzsJCWZyZWVfdm1fYXJlYShzaS0mZ3Q7Y2x1c3Rlcl92bSk7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl92bSA9IE5VTEw7CiYjNDM7CQlzaS0mZ3Q7bnJfY2x1c3RlcnNfbWF4ID0gMDsKJiM0MzsJCXNpLSZndDtucl9jbHVzdGVycyA9IDA7CiYjNDM7CQlzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkID0gMDsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOyNlbmRpZgomIzQzOwomIzQzOwlucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7CiAJZm9yIChpID0gMDsgaSAmbHQ7IG5yX2NsdXN0ZXJzOyBpJiM0MzsmIzQzOykgewogCQljaSA9IGNsdXN0ZXJfaW5mbyAmIzQzOyBpOwogCQkvKiBDbHVzdGVyIHdpdGggYmFkIG1hcmtzIGNvdW50IHdpbGwgaGF2ZSBhIHJlbWFpbmluZyB0YWJsZSAqLwpAQCAtMzA3NSwxMSAmIzQzOzMyODUsOSBAQCBzdGF0aWMgdm9pZCBmbHVzaF9wZXJjcHVfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSkKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcCA9IE5VTEw7Ci0Jc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87CiAJc3RydWN0IGZpbGUgKnN3YXBfZmlsZSwgKnZpY3RpbTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXVuc2lnbmVkIGludCBtYXhwYWdlczsKIAlpbnQgZXJyLCBmb3VuZCA9IDA7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCkBAIC0zMTYwLDcgJiM0MzszMzY4LDggQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKQogCiAJZGVzdHJveV9zd2FwX2V4dGVudHMocCwgcC0mZ3Q7c3dhcF9maWxlKTsKIAotCWlmICghKHAtJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSkKJiM0MzsJaWYgKCEocC0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1hTV0FQKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhKHAtJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSkKIAkJYXRvbWljX2RlYygmYW1wO25yX3JvdGF0ZV9zd2FwKTsKIAogCW11dGV4X2xvY2soJmFtcDtzd2Fwb25fbXV0ZXgpOwpAQCAtMzE3MCwxMCAmIzQzOzMzNzksNiBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiAKIAlzd2FwX2ZpbGUgPSBwLSZndDtzd2FwX2ZpbGU7CiAJcC0mZ3Q7c3dhcF9maWxlID0gTlVMTDsKLQltYXhwYWdlcyA9IHAtJmd0O21heDsKLQljbHVzdGVyX2luZm8gPSBwLSZndDtjbHVzdGVyX2luZm87Ci0JcC0mZ3Q7bWF4ID0gMDsKLQlwLSZndDtjbHVzdGVyX2luZm8gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZhbXA7cC0mZ3Q7bG9jayk7CiAJc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwogCWFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC0mZ3Q7dHlwZSk7CkBAIC0zMTgxLDcgJiM0MzszMzg2LDkgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKQogCW11dGV4X3VubG9jaygmYW1wO3N3YXBvbl9tdXRleCk7CiAJa2ZyZWUocC0mZ3Q7Z2xvYmFsX2NsdXN0ZXIpOwogCXAtJmd0O2dsb2JhbF9jbHVzdGVyID0gTlVMTDsKLQlmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpOwomIzQzOwlmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHApOwomIzQzOwlwLSZndDttYXggPSAwOwomIzQzOwlwLSZndDtjbHVzdGVyX2luZm8gPSBOVUxMOwogCiAJaW5vZGUgPSBtYXBwaW5nLSZndDtob3N0OwogCkBAIC0zMjcwLDYgJiM0MzszNDc3LDE5IEBAIHN0YXRpYyB2b2lkIHN3YXBfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpCiAJbXV0ZXhfdW5sb2NrKCZhbXA7c3dhcG9uX211dGV4KTsKIH0KIAomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpzd2FwX3R5cGVfc3RyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBmaWxlICpmaWxlID0gc2ktJmd0O3N3YXBfZmlsZTsKJiM0MzsKJiM0MzsJaWYgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApCiYjNDM7CQlyZXR1cm4gJiMzNDt4c3dhcFx0JiMzNDs7CiYjNDM7CiYjNDM7CWlmIChTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfbW9kZSkpCiYjNDM7CQlyZXR1cm4gJiMzNDtwYXJ0aXRpb24mIzM0OzsKJiM0MzsKJiM0MzsJcmV0dXJuICYjMzQ7ZmlsZVx0JiMzNDs7CiYjNDM7fQomIzQzOwogc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KQogewogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IHY7CkBAIC0zMjg5LDggJiM0MzszNTA5LDcgQEAgc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KQogCWxlbiA9IHNlcV9maWxlX3BhdGgoc3dhcCwgZmlsZSwgJiMzNDsgXHRcblxcJiMzNDspOwogCXNlcV9wcmludGYoc3dhcCwgJiMzNDslKnMlc1x0JWx1XHQlcyVsdVx0JXMlZFxuJiMzNDssCiAJCQlsZW4gJmx0OyA0MCA/IDQwIC0gbGVuIDogMSwgJiMzNDsgJiMzNDssCi0JCQlTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfbW9kZSkgPwotCQkJCSYjMzQ7cGFydGl0aW9uJiMzNDsgOiAmIzM0O2ZpbGVcdCYjMzQ7LAomIzQzOwkJCXN3YXBfdHlwZV9zdHIoc2kpLAogCQkJYnl0ZXMsIGJ5dGVzICZsdDsgMTAwMDAwMDAgPyAmIzM0O1x0JiMzNDsgOiAmIzM0OyYjMzQ7LAogCQkJaW51c2UsIGludXNlICZsdDsgMTAwMDAwMDAgPyAmIzM0O1x0JiMzNDsgOiAmIzM0OyYjMzQ7LAogCQkJc2ktJmd0O3ByaW8pOwpAQCAtMzQ2OCw2ICYjNDM7MzY4Nyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCXVuc2lnbmVkIGxvbmcgbWF4cGFnZXM7CiAJdW5zaWduZWQgbG9uZyBzd2FwZmlsZXBhZ2VzOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlOwomIzQzOwlsb2ZmX3Qgc2l6ZTsKIAogCWlmIChtZW1jbXAoJiMzNDtTV0FQU1BBQ0UyJiMzNDssIHN3YXBfaGVhZGVyLSZndDttYWdpYy5tYWdpYywgMTApKSB7CiAJCXByX2VycigmIzM0O1VuYWJsZSB0byBmaW5kIHN3YXAtc3BhY2Ugc2lnbmF0dXJlXG4mIzM0Oyk7CkBAIC0zNTEwLDcgJiM0MzszNzMwLDE2IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCiAJaWYgKCFtYXhwYWdlcykKIAkJcmV0dXJuIDA7Ci0Jc3dhcGZpbGVwYWdlcyA9IGlfc2l6ZV9yZWFkKGlub2RlKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwomIzQzOwlpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpIHsKJiM0MzsJCS8qIHhzd2FwOiBhIHN3YXAgZGV2aWNlIHdpdGggbm8gYmFja2luZyBzdG9yYWdlICovCiYjNDM7CQlzaS0mZ3Q7YmRldiA9IE5VTEw7CiYjNDM7CQlzaS0mZ3Q7ZmxhZ3MgfD0gU1dQX1hTV0FQIHwgU1dQX1NPTElEU1RBVEU7CiYjNDM7CQlyZXR1cm4gbWF4cGFnZXM7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3dhcGZpbGVwYWdlcyA9IHNpemUgJmd0OyZndDsgUEFHRV9TSElGVDsKIAlpZiAoc3dhcGZpbGVwYWdlcyAmYW1wOyZhbXA7IG1heHBhZ2VzICZndDsgc3dhcGZpbGVwYWdlcykgewogCQlwcl93YXJuKCYjMzQ7U3dhcCBhcmVhIHNob3J0ZXIgdGhhbiBzaWduYXR1cmUgaW5kaWNhdGVzXG4mIzM0Oyk7CiAJCXJldHVybiAwOwpAQCAtMzUyMyw2ICYjNDM7Mzc1MiwzNjUgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiAJcmV0dXJuIG1heHBhZ2VzOwogfQogCiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUAomIzQzO3N0YXRpYyBpbnQgeHN3YXBfbWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLSZndDtjbHVzdGVyX2luZm8gJiM0MzsKJiM0MzsJCQkJICAgKHNpemVfdClzdGFydF9pZHggKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBlbmRfYWRkciA9IHN0YXJ0X2FkZHIgJiM0MzsgKHNpemVfdCluciAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pOwomIzQzOwkvKgomIzQzOwkgKiB2bV9hcmVhX21hcF9wYWdlcygpIHJlcXVpcmVzIHRoYXQgc3RhcnQgYW5kIGVuZCBiZSBwYWdlLWFsaWduZWQuCiYjNDM7CSAqIElmIHN0YXJ0X2FkZHIgZmFsbHMgd2l0aGluIGEgcGFnZSB0aGF0IHdhcyBhbHJlYWR5IG1hcHBlZCBieSBhCiYjNDM7CSAqIHByZXZpb3VzIGJhdGNoIChncm93IHBhdGgpLCByb3VuZCBpdCB1cCB0byBza2lwIHRoZSBhbHJlYWR5LW1hcHBlZAomIzQzOwkgKiBwYXJ0aWFsIHBhZ2UuICBBbHdheXMgcm91bmQgZW5kX2FkZHIgdXAgc28gdGhlIHZtYXAgcGFnZSB0YWJsZSB3YWxrCiYjNDM7CSAqIHRlcm1pbmF0ZXMgY29ycmVjdGx5ICh0aGUgd2FsayBsb29wIGV4aXRzIHdoZW4gYWRkciA9PSBlbmQsIGFuZCBhZGRyCiYjNDM7CSAqIGFkdmFuY2VzIGJ5IFBBR0VfU0laRSBlYWNoIGl0ZXJhdGlvbikuCiYjNDM7CSAqLwomIzQzOwl1bnNpZ25lZCBsb25nIHZtX3N0YXJ0ID0gUEFHRV9BTElHTihzdGFydF9hZGRyKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB2bV9lbmQgPSBQQUdFX0FMSUdOKGVuZF9hZGRyKTsKJiM0MzsJdW5zaWduZWQgaW50IG5vcmVjbGFpbV9mbGFnczsKJiM0MzsJdW5zaWduZWQgbG9uZyBucGFnZXM7CiYjNDM7CXN0cnVjdCBwYWdlICoqcGFnZXM7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO3NpLSZndDt4c3dhcF9sb2NrKTsKJiM0MzsKJiM0MzsJaWYgKHZtX3N0YXJ0ICZndDs9IHZtX2VuZCkgewomIzQzOwkJLyogQWxsIHJlcXVlc3RlZCBjbHVzdGVycyBmYWxsIHdpdGhpbiBhbHJlYWR5LW1hcHBlZCBwYWdlcy4gKi8KJiM0MzsJCWZvciAoaSA9IHN0YXJ0X2lkeDsgaSAmbHQ7IHN0YXJ0X2lkeCAmIzQzOyBucjsgaSYjNDM7JiM0MzspCiYjNDM7CQkJc3Bpbl9sb2NrX2luaXQoJmFtcDtzaS0mZ3Q7Y2x1c3Rlcl9pbmZvW2ldLmxvY2spOwomIzQzOwkJV1JJVEVfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggJiM0MzsgbnIpOwomIzQzOwkJbXV0ZXhfdW5sb2NrKCZhbXA7c2ktJmd0O3hzd2FwX2xvY2spOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbnBhZ2VzID0gKHZtX2VuZCAtIHZtX3N0YXJ0KSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBQcmV2ZW50IHJlY3Vyc2l2ZSByZWNsYWltOiB2bV9hcmVhX21hcF9wYWdlcygpIGludGVybmFsbHkKJiM0MzsJICogYWxsb2NhdGVzIHBhZ2UgdGFibGVzIHdpdGggR0ZQX1BHVEFCTEVfS0VSTkVMLCB3aGljaCBsYWNrcwomIzQzOwkgKiBfX0dGUF9OT01FTUFMTE9DLiAgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSBlbnN1cmVzIHRob3NlCiYjNDM7CSAqIGFsbG9jYXRpb25zIGNhbm5vdCByZWN1cnNlIGludG8gc3dhcCBieSBkaXNhYmxpbmcgX19HRlBfRlMvSU8uCiYjNDM7CSAqLwomIzQzOwlub3JlY2xhaW1fZmxhZ3MgPSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpOwomIzQzOwomIzQzOwlwYWdlcyA9IGttYWxsb2NfYXJyYXkobnBhZ2VzLCBzaXplb2YoKnBhZ2VzKSwKJiM0MzsJCQkgICAgICBfX0dGUF9ISUdIIHwgX19HRlBfTk9NRU1BTExPQyB8IEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIXBhZ2VzKSB7CiYjNDM7CQltZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZ3MpOwomIzQzOwkJbXV0ZXhfdW5sb2NrKCZhbXA7c2ktJmd0O3hzd2FwX2xvY2spOwomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBfX0dGUF9aRVJPIGlzIGNyaXRpY2FsOiBjbHVzdGVyX2luZm8gc3RydWN0cyBjb250YWluIHBvaW50ZXIKJiM0MzsJCSAqIGZpZWxkcyAoZXh0ZW5kX3RhYmxlLCB6ZXJvX2JpdG1hcCwgbWVtY2dfdGFibGUsIHRhYmxlKSB0aGF0CiYjNDM7CQkgKiBtdXN0IHN0YXJ0IGFzIE5VTEwuICBXaXRob3V0IHplcm9pbmcsIHN0YWxlIGRhdGEgZnJvbSBhCiYjNDM7CQkgKiBwcmV2aW91cyB1c2VyIG9mIHRoZSBwYWdlIHdvdWxkIGxvb2sgbGlrZSB2YWxpZCBwb2ludGVycy4KJiM0MzsJCSAqLwomIzQzOwkJcGFnZXNbaV0gPSBhbGxvY19wYWdlKF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHwKJiM0MzsJCQkJICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOwomIzQzOwkJaWYgKCFwYWdlc1tpXSkKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgaWYgdGhlIHRhcmdldCBwYWdlcyBhcmUgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50CiYjNDM7CSAqIGdyb3dlci4gIFdlIG11c3QgZG8gdGhpcyBhZnRlciBwYWdlIGFsbG9jYXRpb24gYmVjYXVzZQomIzQzOwkgKiBhbGxvY19wYWdlKEdGUF9LRVJORUwpIGNhbiBzbGVlcCwgb3BlbmluZyBhIHJhY2Ugd2luZG93LgomIzQzOwkgKiBJZiBzb21lb25lIGFscmVhZHkgbWFwcGVkIHRoZXNlIHBhZ2VzLCBmcmVlIG91cnMgYW5kIGNvbnRpbnVlLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoJmFtcDtpbml0X21tLCB2bV9zdGFydCwKJiM0MzsJCQkJCSB2bV9lbmQgLSB2bV9zdGFydCwKJiM0MzsJCQkJCSB4c3dhcF9jaGVja19tYXBwZWQsIE5VTEwpKSB7CiYjNDM7CQlpID0gbnBhZ2VzOwomIzQzOwkJZ290byBmYWlsX25vdW5tYXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaW50IGVyciA9IHZtX2FyZWFfbWFwX3BhZ2VzKHNpLSZndDtjbHVzdGVyX3ZtLCB2bV9zdGFydCwgdm1fZW5kLCBwYWdlcyk7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiAtRUJVU1kgbWVhbnMgdGhlIFBURXMgYXJlIGFscmVhZHkgcHJlc2VudDoKJiM0MzsJCSAqIGFub3RoZXIgdGhyZWFkIHJhY2VkIHdpdGggdXMgYW5kIG1hcHBlZCB0aGUKJiM0MzsJCSAqIHNhbWUgcGFnZXMgYmV0d2VlbiBvdXIgY2hlY2sgYWJvdmUgYW5kIHRoaXMKJiM0MzsJCSAqIGNhbGwuICBUcmVhdCBhcyBzdWNjZXNzIOKAlCBmcmVlIG91ciB1bnVzZWQKJiM0MzsJCSAqIHBhZ2VzIGFuZCBjb250aW51ZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGVyciA9PSAtRUJVU1kpIHsKJiM0MzsJCQlpID0gbnBhZ2VzOwomIzQzOwkJCWdvdG8gZmFpbF9ub3VubWFwOwomIzQzOwkJfQomIzQzOwkJaSA9IG5wYWdlczsgLyogZnJlZSBhbGwgcGFnZXMgb24gZmFpbHVyZSAqLwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtmcmVlKHBhZ2VzKTsKJiM0MzsJbWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTsKJiM0MzsKJiM0MzsJLyogSW5pdGlhbGl6ZSBzcGlubG9ja3MgZm9yIG5ld2x5IG1hcHBlZCBjbHVzdGVycyAqLwomIzQzOwlmb3IgKGkgPSBzdGFydF9pZHg7IGkgJmx0OyBzdGFydF9pZHggJiM0MzsgbnI7IGkmIzQzOyYjNDM7KQomIzQzOwkJc3Bpbl9sb2NrX2luaXQoJmFtcDtzaS0mZ3Q7Y2x1c3Rlcl9pbmZvW2ldLmxvY2spOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLgomIzQzOwkgKi8KJiM0MzsJV1JJVEVfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggJiM0MzsgbnIpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2ZhaWxfbm91bm1hcDoKJiM0MzsJLyoKJiM0MzsJICogUGFnZXMgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50IGdyb3dlci4gIEZyZWUgb3VyIHVudXNlZAomIzQzOwkgKiBwYWdlcywgdGhlbiBmYWxsIHRocm91Z2ggdG8gaW5pdGlhbGl6ZSBzcGlubG9ja3MuICBUaGUgdm1hbGxvYwomIzQzOwkgKiBQVEVzIG5vdyBwb2ludCB0byB0aGUgY29uY3VycmVudCBncm93ZXImIzM5O3MgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwl3aGlsZSAoaSAmZ3Q7IDApIHsKJiM0MzsJCWktLTsKJiM0MzsJCWlmIChwYWdlc1tpXSkKJiM0MzsJCQlfX2ZyZWVfcGFnZShwYWdlc1tpXSk7CiYjNDM7CX0KJiM0MzsJa2ZyZWUocGFnZXMpOwomIzQzOwltZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZ3MpOwomIzQzOwomIzQzOwkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBmb3IgbmV3bHkgbWFwcGVkIGNsdXN0ZXJzICovCiYjNDM7CWZvciAoaSA9IHN0YXJ0X2lkeDsgaSAmbHQ7IHN0YXJ0X2lkeCAmIzQzOyBucjsgaSYjNDM7JiM0MzspCiYjNDM7CQlzcGluX2xvY2tfaW5pdCgmYW1wO3NpLSZndDtjbHVzdGVyX2luZm9baV0ubG9jayk7CiYjNDM7CiYjNDM7CVdSSVRFX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCwgc3RhcnRfaWR4ICYjNDM7IG5yKTsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7c2ktJmd0O3hzd2FwX2xvY2spOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztmYWlsOgomIzQzOwl3aGlsZSAoaSAmZ3Q7IDApIHsKJiM0MzsJCWktLTsKJiM0MzsJCWlmIChwYWdlc1tpXSkKJiM0MzsJCQlfX2ZyZWVfcGFnZShwYWdlc1tpXSk7CiYjNDM7CX0KJiM0MzsJbWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTsKJiM0MzsJa2ZyZWUocGFnZXMpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CXJldHVybiAtRU5PTUVNOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgeHN3YXBfcGFnZV9kYXRhIHsKJiM0MzsJc3RydWN0IHBhZ2UgKipwYWdlczsKJiM0MzsJaW50IG5yOwomIzQzOwlpbnQgbWF4OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCB4c3dhcF9jb2xsZWN0X3BhZ2UocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJc3RydWN0IHhzd2FwX3BhZ2VfZGF0YSAqeHBkID0gZGF0YTsKJiM0MzsKJiM0MzsJaWYgKCFwdGVfcHJlc2VudCgqcHRlKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlpZiAoeHBkLSZndDtuciAmbHQ7IHhwZC0mZ3Q7bWF4KQomIzQzOwkJeHBkLSZndDtwYWdlc1t4cGQtJmd0O25yJiM0MzsmIzQzO10gPSBwdGVfcGFnZSgqcHRlKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHhzd2FwX3VubWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkJIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpc2ktJmd0O2NsdXN0ZXJfaW5mbyAmIzQzOwomIzQzOwkJCQkgICAoc2l6ZV90KXN0YXJ0X2lkeCAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pOwomIzQzOwl1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciAmIzQzOyAoc2l6ZV90KW5yICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7CiYjNDM7CS8qCiYjNDM7CSAqIFJvdW5kIHRvIHBhZ2UgYm91bmRhcmllczogc3RhcnQgdXAgKHNraXAgcGFydGlhbCBwYWdlIHRoYXQgbWF5CiYjNDM7CSAqIGNvbnRhaW4gY2x1c3RlcnMgc3RpbGwgaW4gdXNlIGJlZm9yZSBzdGFydF9pZHgpLCBlbmQgdXAgc28gdGhlCiYjNDM7CSAqIGVudGlyZSByYW5nZSBpcyBjb3ZlcmVkLiAgdm1fYXJlYV91bm1hcF9wYWdlcygpIGFuZAomIzQzOwkgKiBhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlKCkgb3BlcmF0ZSBvbiB3aG9sZSBwYWdlcy4KJiM0MzsJICovCiYjNDM7CXVuc2lnbmVkIGxvbmcgdm1fc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0X2FkZHIpOwomIzQzOwl1bnNpZ25lZCBsb25nIHZtX2VuZCA9IFBBR0VfQUxJR04oZW5kX2FkZHIpOwomIzQzOwl1bnNpZ25lZCBsb25nIHNpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnBhZ2VzOwomIzQzOwlzdHJ1Y3QgeHN3YXBfcGFnZV9kYXRhIHhwZDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CiYjNDM7CWlmICh2bV9zdGFydCAmZ3Q7PSB2bV9lbmQpIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO3NpLSZndDt4c3dhcF9sb2NrKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXNpemUgPSB2bV9lbmQgLSB2bV9zdGFydDsKJiM0MzsJbnBhZ2VzID0gc2l6ZSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBXYWxrIHRoZSBwYWdlIHRhYmxlIHRvIGNvbGxlY3QgcGh5c2ljYWwgcGFnZXMgYmVmb3JlIHVubWFwcGluZy4KJiM0MzsJICogdm1fYXJlYV91bm1hcF9wYWdlcygpIG9ubHkgY2xlYXJzIFBURXMgYW5kIGZyZWVzIGludGVybWVkaWF0ZQomIzQzOwkgKiBwYWdlIHRhYmxlIHBhZ2VzIOKAlCBpdCBkb2VzIG5vdCBmcmVlIGJhY2tpbmcgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwl4cGQucGFnZXMgPSBrbWFsbG9jX2FycmF5KG5wYWdlcywgc2l6ZW9mKCp4cGQucGFnZXMpLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKHhwZC5wYWdlcykgewomIzQzOwkJeHBkLm5yID0gMDsKJiM0MzsJCXhwZC5tYXggPSBucGFnZXM7CiYjNDM7CQlhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlKCZhbXA7aW5pdF9tbSwgdm1fc3RhcnQsIHNpemUsCiYjNDM7CQkJCQkgICAgIHhzd2FwX2NvbGxlY3RfcGFnZSwgJmFtcDt4cGQpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXZtX2FyZWFfdW5tYXBfcGFnZXMoc2ktJmd0O2NsdXN0ZXJfdm0sIHZtX3N0YXJ0LCB2bV9lbmQpOwomIzQzOwomIzQzOwkvKiBGcmVlIHRoZSBjb2xsZWN0ZWQgYmFja2luZyBwYWdlcyAqLwomIzQzOwlpZiAoeHBkLnBhZ2VzKSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgeHBkLm5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlfX2ZyZWVfcGFnZSh4cGQucGFnZXNbaV0pOwomIzQzOwkJa2ZyZWUoeHBkLnBhZ2VzKTsKJiM0MzsJfQomIzQzOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwkvKgomIzQzOwkgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLgomIzQzOwkgKi8KJiM0MzsJV1JJVEVfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHgpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIENhbGxiYWNrIGZvciBhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlKCk6IHJldHVybiAxIHRvIHN0b3AgYXQgdGhlCiYjNDM7ICogZmlyc3QgcHJlc2VudCBQVEUsIHNpZ25hbGxpbmcgdGhhdCB0aGUgcmFuZ2UgaXMgYWxyZWFkeSBtYXBwZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCB4c3dhcF9jaGVja19tYXBwZWQocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJcmV0dXJuIDE7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTWFpbnRhaW4gc2ktJmd0O25yX2ZyZWVfdGFpbCwgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgY2x1c3RlcnMgYXQKJiM0MzsgKiB0aGUgdGFpbCBvZiB0aGUgbWFwcGVkIHJhbmdlLiAgQ2FsbGVkIHdoZW4gYSBjbHVzdGVyIGF0IEBmcmVlZF9pZHggaXMKJiM0MzsgKiBmcmVlZC4gIFByb3ZpZGVzIE8oMSkgc2hyaW5rIGRldGVjdGlvbjogaWYgbnJfZnJlZV90YWlsIGlzIG5vbi16ZXJvLAomIzQzOyAqIHRoZSB0YWlsIGNhbiBiZSB1bm1hcHBlZCB3aXRob3V0IHNjYW5uaW5nIGNsdXN0ZXJfaW5mb1tdLgomIzQzOyAqCiYjNDM7ICogT25seSBpbmNyZW1lbnRzIHdoZW4gQGZyZWVkX2lkeCBpcyB0aGUgY2x1c3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlCiYjNDM7ICogZXhpc3RpbmcgdGFpbCByZWdpb24uICBUaGVuIHNjYW5zIGJhY2t3YXJkcyBmb3IgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzCiYjNDM7ICogbm93IGNvbm5lY3RlZCB0byB0aGUgdGFpbCwgYm91bmRlZCBieSBYU1dBUF9HUk9XX0NMVVNURVJTIGF0IGEgdGltZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB4c3dhcF91cGRhdGVfZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkJICAgdW5zaWduZWQgbG9uZyBmcmVlZF9pZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGlkLCBpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwomIzQzOwomIzQzOwlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1hTV0FQKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJbnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLSZndDtucl9jbHVzdGVyc19tYXBwZWQpOwomIzQzOwlucl90YWlsID0gUkVBRF9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwpOwomIzQzOwomIzQzOwkvKiBQcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBzaHJpbmsgdGhhdCByYWNlcyBwYXN0IHVzICovCiYjNDM7CWlmIChucl90YWlsICZndDs9IG5yX21hcHBlZCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJdGlkID0gbnJfbWFwcGVkIC0gbnJfdGFpbCAtIDE7CiYjNDM7CiYjNDM7CS8qIE9ubHkgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0YWlsIHJlZ2lvbiBjb3VudHMgKi8KJiM0MzsJaWYgKGZyZWVkX2lkeCAhPSB0aWQpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CW5yX3RhaWwmIzQzOyYjNDM7OwomIzQzOwlXUklURV9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwsIG5yX3RhaWwpOwomIzQzOwomIzQzOwkvKiBFeHRlbmQ6IGluY2x1ZGUgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwgKi8KJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7IFhTV0FQX0dST1dfQ0xVU1RFUlM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCk7CiYjNDM7CQlucl90YWlsID0gUkVBRF9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwpOwomIzQzOwkJaWYgKG5yX3RhaWwgJmd0Oz0gbnJfbWFwcGVkIC0gMSkKJiM0MzsJCQlicmVhazsgLyogcmVhY2hlZCBjbHVzdGVyIDAgKi8KJiM0MzsJCXRpZCA9IG5yX21hcHBlZCAtIG5yX3RhaWwgLSAxOwomIzQzOwkJY2kgPSAmYW1wO3NpLSZndDtjbHVzdGVyX2luZm9bdGlkXTsKJiM0MzsKJiM0MzsJCWlmIChSRUFEX09OQ0UoY2ktJmd0O2NvdW50KSB8fAomIzQzOwkJICAgIFJFQURfT05DRShjaS0mZ3Q7ZmxhZ3MpICE9IENMVVNURVJfRkxBR19GUkVFKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJbnJfdGFpbCYjNDM7JiM0Mzs7CiYjNDM7CQlXUklURV9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwsIG5yX3RhaWwpOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVHJpbSBzaS0mZ3Q7bnJfZnJlZV90YWlsIHdoZW4gYSBjbHVzdGVyIGluIHRoZSB0YWlsIHJlZ2lvbiBpcyBhbGxvY2F0ZWQuCiYjNDM7ICogQGlkeDogaW5kZXggb2YgdGhlIGNsdXN0ZXIgYmVpbmcgYWxsb2NhdGVkLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGFpbF9zdGFydDsKJiM0MzsKJiM0MzsJaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9YU1dBUCkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIG5yX2NsdXN0ZXJzX21hcHBlZCBhbmQgbnJfZnJlZV90YWlsIGFyZSByZWFkIGxvY2tsZXNzbHk7CiYjNDM7CSAqIGNvbmN1cnJlbnQgdXBkYXRlcyBtYXkgY2F1c2UgbnJfZnJlZV90YWlsIHRvIGJlIHRyaW1tZWQKJiM0MzsJICogc2xpZ2h0bHkgbGVzcyB0aGFuIGlkZWFsbHksIHdoaWNoIGlzIGhhcm1sZXNzLgomIzQzOwkgKi8KJiM0MzsJbnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLSZndDtucl9jbHVzdGVyc19tYXBwZWQpOwomIzQzOwlucl90YWlsID0gUkVBRF9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwpOwomIzQzOwl0YWlsX3N0YXJ0ID0gbnJfbWFwcGVkIC0gbnJfdGFpbDsKJiM0MzsJaWYgKGlkeCAmZ3Q7PSB0YWlsX3N0YXJ0KQomIzQzOwkJV1JJVEVfT05DRShzaS0mZ3Q7bnJfZnJlZV90YWlsLCBucl9tYXBwZWQgLSBpZHggLSAxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfc2hyaW5rX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQomIzQzO3sKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gY29udGFpbmVyX29mKHdvcmssCiYjNDM7CQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QsIHhzd2FwX3Nocmlua193b3JrKTsKJiM0MzsJeHN3YXBfdHJ5X3NocmluayhzaSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVHJ5IHRvIHNocmluayB0aGUgY2x1c3Rlcl9pbmZvIHRhaWwuICBVc2VzIHNpLSZndDtucl9mcmVlX3RhaWwgd2hpY2gKJiM0MzsgKiBpcyBtYWludGFpbmVkIGluY3JlbWVudGFsbHkgZHVyaW5nIGFsbG9jL2ZyZWUg4oCUIG5vIHNjYW5uaW5nIG5lZWRlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB4c3dhcF90cnlfc2hyaW5rKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfbWFwcGVkLCBucl9jZWlsaW5nLCBucl90YWlsLCBucl91bm1hcDsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIGk7CiYjNDM7CXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7CiYjNDM7CiYjNDM7CWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCk7CiYjNDM7CW5yX2NlaWxpbmcgPSBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzKTsKJiM0MzsJbnJfdGFpbCA9IFJFQURfT05DRShzaS0mZ3Q7bnJfZnJlZV90YWlsKTsKJiM0MzsKJiM0MzsJaWYgKG5yX21hcHBlZCAmbHQ7PSBucl9jZWlsaW5nKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAobnJfdGFpbCAmbHQ7IFhTV0FQX0dST1dfQ0xVU1RFUlMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CW5yX3VubWFwID0gbWluKHJvdW5kX2Rvd24obnJfdGFpbCwgWFNXQVBfR1JPV19DTFVTVEVSUyksCiYjNDM7CQkgICAgICAgbnJfbWFwcGVkIC0gbnJfY2VpbGluZyk7CiYjNDM7CWlmIChucl91bm1hcCAmbHQ7IFhTV0FQX0dST1dfQ0xVU1RFUlMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXN0YXJ0X2lkeCA9IG5yX21hcHBlZCAtIG5yX3VubWFwOwomIzQzOwomIzQzOwkvKiBWZXJpZnkgdGhlIHRhaWwgY2x1c3RlcnMgYXJlIHN0aWxsIGZyZWUgYmVmb3JlIHVubWFwcGluZyAqLwomIzQzOwlzcGluX2xvY2soJmFtcDtzaS0mZ3Q7bG9jayk7CiYjNDM7CWZvciAoaSA9IHN0YXJ0X2lkeDsgaSAmbHQ7IG5yX21hcHBlZDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNpID0gJmFtcDtzaS0mZ3Q7Y2x1c3Rlcl9pbmZvW2ldOwomIzQzOwkJaWYgKGNpLSZndDtmbGFncyAhPSBDTFVTVEVSX0ZMQUdfRlJFRSkgewomIzQzOwkJCW5yX3VubWFwID0gaSAtIHN0YXJ0X2lkeDsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWxpc3RfZGVsKCZhbXA7Y2ktJmd0O2xpc3QpOwomIzQzOwkJY2ktJmd0O2ZsYWdzID0gQ0xVU1RFUl9GTEFHX05PTkU7CiYjNDM7CX0KJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzaS0mZ3Q7bG9jayk7CiYjNDM7CiYjNDM7CWlmIChucl91bm1hcCAmbHQ7IFhTV0FQX0dST1dfQ0xVU1RFUlMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXhzd2FwX3VubWFwX2NsdXN0ZXJzKHNpLCBzdGFydF9pZHgsIG5yX3VubWFwKTsKJiM0MzsJV1JJVEVfT05DRShzaS0mZ3Q7bnJfZnJlZV90YWlsLCBucl90YWlsIC0gbnJfdW5tYXApOwomIzQzO30KJiM0MzsjZW5kaWYgLyogQ09ORklHX1hTV0FQICovCiYjNDM7CiBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiAJCQkJICAgIHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlciwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcykKQEAgLTM1MzIsNiAmIzQzOzQxMjAsNzAgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCWludCBlcnIgPSAtRU5PTUVNOwogCXVuc2lnbmVkIGxvbmcgaTsKIAomIzQzOyNpZmRlZiBDT05GSUdfWFNXQVAKJiM0MzsJaWYgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IFBBR0VfQUxJR04obnJfY2x1c3RlcnMgKiBzaXplb2YoKmNsdXN0ZXJfaW5mbykpOwomIzQzOwkJc3RydWN0IHZtX3N0cnVjdCAqdm07CiYjNDM7CiYjNDM7CQl2bSA9IGdldF92bV9hcmVhKHNpemUsIFZNX1NQQVJTRSk7CiYjNDM7CQlpZiAoIXZtKQomIzQzOwkJCWdvdG8gZXJyOwomIzQzOwomIzQzOwkJY2x1c3Rlcl9pbmZvID0gdm0tJmd0O2FkZHI7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl92bSA9IHZtOwomIzQzOwkJc2ktJmd0O25yX2NsdXN0ZXJzX21heCA9IG5yX2NsdXN0ZXJzOwomIzQzOwkJc2ktJmd0O25yX2NsdXN0ZXJzID0gbnJfY2x1c3RlcnM7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl9pbmZvID0gY2x1c3Rlcl9pbmZvOwomIzQzOwomIzQzOwkJLyogTWFwIHRoZSBpbml0aWFsIGNodW5rIChhdCBsZWFzdCBjbHVzdGVyIDApICovCiYjNDM7CQlpZiAoeHN3YXBfbWFwX2NsdXN0ZXJzKHNpLCAwLCBtaW5fdCh1bnNpZ25lZCBsb25nLAomIzQzOwkJCQkJWFNXQVBfR1JPV19DTFVTVEVSUywgbnJfY2x1c3RlcnMpKSkKJiM0MzsJCQlnb3RvIGVycl9mcmVlX3ZtOwomIzQzOwomIzQzOwkJLyogeHN3YXA6IG9ubHkgY2x1c3RlciAwIHNsb3QgMCBpcyBiYWQgKi8KJiM0MzsJCWVyciA9IHN3YXBfY2x1c3Rlcl9zZXR1cF9iYWRfc2xvdChzaSwgY2x1c3Rlcl9pbmZvLCAwLCBmYWxzZSk7CiYjNDM7CQlpZiAoZXJyKQomIzQzOwkJCWdvdG8gZXJyX3VubWFwOwomIzQzOwomIzQzOwkJSU5JVF9MSVNUX0hFQUQoJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycyk7CiYjNDM7CQlJTklUX0xJU1RfSEVBRCgmYW1wO3NpLSZndDtmdWxsX2NsdXN0ZXJzKTsKJiM0MzsJCUlOSVRfTElTVF9IRUFEKCZhbXA7c2ktJmd0O2Rpc2NhcmRfY2x1c3RlcnMpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IFNXQVBfTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCUlOSVRfTElTVF9IRUFEKCZhbXA7c2ktJmd0O25vbmZ1bGxfY2x1c3RlcnNbaV0pOwomIzQzOwkJCUlOSVRfTElTVF9IRUFEKCZhbXA7c2ktJmd0O2ZyYWdfY2x1c3RlcnNbaV0pOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyogTWFyayBtYXBwZWQgY2x1c3RlcnM6IGNsdXN0ZXIgMCBoYXMgMSBiYWQgc2xvdCwgcmVzdCBmcmVlICovCiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gJmFtcDtjbHVzdGVyX2luZm9baV07CiYjNDM7CiYjNDM7CQkJaWYgKGkgPT0gMCkgewomIzQzOwkJCQljaS0mZ3Q7ZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORlVMTDsKJiM0MzsJCQkJbGlzdF9hZGRfdGFpbCgmYW1wO2NpLSZndDtsaXN0LCAmYW1wO3NpLSZndDtub25mdWxsX2NsdXN0ZXJzWzBdKTsKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQljaS0mZ3Q7ZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfRlJFRTsKJiM0MzsJCQkJbGlzdF9hZGRfdGFpbCgmYW1wO2NpLSZndDtsaXN0LCAmYW1wO3NpLSZndDtmcmVlX2NsdXN0ZXJzKTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBBbGwgbWFwcGVkIGNsdXN0ZXJzIGV4Y2VwdCBjbHVzdGVyIDAgYXJlIGZyZWUgYXQgdGhlIHRhaWwgKi8KJiM0MzsJCXNpLSZndDtucl9mcmVlX3RhaWwgPSBzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkIC0gMTsKJiM0MzsKJiM0MzsJCW11dGV4X2luaXQoJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CQlJTklUX1dPUksoJmFtcDtzaS0mZ3Q7eHN3YXBfc2hyaW5rX3dvcmssIHhzd2FwX3Nocmlua193b3JrX2ZuKTsKJiM0MzsJCXhzd2FwX2RlYnVnZnNfYWRkKHNpKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzO2Vycl91bm1hcDoKJiM0MzsJCXhzd2FwX3VubWFwX2NsdXN0ZXJzKHNpLCAwLCBzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkKTsKJiM0MztlcnJfZnJlZV92bToKJiM0MzsJCWZyZWVfdm1fYXJlYShzaS0mZ3Q7Y2x1c3Rlcl92bSk7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl92bSA9IE5VTEw7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl9pbmZvID0gTlVMTDsKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CX0KJiM0MzsjZW5kaWYgLyogQ09ORklHX1hTV0FQICovCiYjNDM7CiAJY2x1c3Rlcl9pbmZvID0ga3Z6YWxsb2Nfb2JqcygqY2x1c3Rlcl9pbmZvLCBucl9jbHVzdGVycyk7CiAJaWYgKCFjbHVzdGVyX2luZm8pCiAJCWdvdG8gZXJyOwpAQCAtMzU5OSw3ICYjNDM7NDI1MSw3IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAlzaS0mZ3Q7Y2x1c3Rlcl9pbmZvID0gY2x1c3Rlcl9pbmZvOwogCXJldHVybiAwOwogZXJyOgotCWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oY2x1c3Rlcl9pbmZvLCBtYXhwYWdlcyk7CiYjNDM7CWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM4MTgsNyAmIzQzOzQ0NzAsNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKQogCXNpLSZndDtnbG9iYWxfY2x1c3RlciA9IE5VTEw7CiAJaW5vZGUgPSBOVUxMOwogCWRlc3Ryb3lfc3dhcF9leHRlbnRzKHNpLCBzd2FwX2ZpbGUpOwotCWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2ktJmd0O2NsdXN0ZXJfaW5mbywgc2ktJmd0O21heCk7CiYjNDM7CWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpOwogCXNpLSZndDtjbHVzdGVyX2luZm8gPSBOVUxMOwogCS8qCiAJICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28KQEAgLTM5MzAsNyAmIzQzOzQ1ODIsNiBAQCB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKQogc3RhdGljIGludCBfX2luaXQgc3dhcGZpbGVfaW5pdCh2b2lkKQogewogCXN3YXBmaWxlX21heGltdW1fc2l6ZSA9IGFyY2hfbWF4X3N3YXBmaWxlX3NpemUoKTsKLQogCS8qCiAJICogT25jZSBhIGNsdXN0ZXIgaXMgZnJlZWQsIGl0JiMzOTtzIHN3YXAgdGFibGUgY29udGVudCBpcyByZWFkCiAJICogb25seSwgYW5kIGFsbCBzd2FwIGNhY2hlIHJlYWRlcnMgKHN3YXBfY2FjaGVfKikgdmVyaWZpZXMKQEAgLTM5NDAsMTIgJiM0Mzs0NTkxLDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHN3YXBmaWxlX2luaXQodm9pZCkKIAkJc3dhcF90YWJsZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgmIzM0O3N3YXBfdGFibGUmIzM0OywKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzd2FwX3RhYmxlKSwKIAkJCQkgICAgMCwgU0xBQl9QQU5JQyB8IFNMQUJfVFlQRVNBRkVfQllfUkNVLCBOVUxMKTsKLQogI2lmZGVmIENPTkZJR19NSUdSQVRJT04KIAlpZiAoc3dhcGZpbGVfbWF4aW11bV9zaXplICZndDs9ICgxVUwgJmx0OyZsdDsgU1dQX01JR19UT1RBTF9CSVRTKSkKIAkJc3dhcF9taWdyYXRpb25fYWRfc3VwcG9ydGVkID0gdHJ1ZTsKICNlbmRpZgkvKiBDT05GSUdfTUlHUkFUSU9OICovCiAKJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQCiYjNDM7CXhzd2FwX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigmIzM0O3hzd2FwJiMzNDssIE5VTEwpOwomIzQzOyNlbmRpZgomIzQzOwogCXJldHVybiAwOwogfQogc3Vic3lzX2luaXRjYWxsKHN3YXBmaWxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvbW0venN3YXAuYyBiL21tL3pzd2FwLmMKaW5kZXggZjdjOWM4OWY2NDQ5Yy4uNjE3ODQ2NWQwNTgzNyAxMDA2NDQKLS0tIGEvbW0venN3YXAuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS96c3dhcC5jCkBAIC05OTgsNyAmIzQzOzk5OCwxMiBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LAogCS8qIHRyeSB0byBhbGxvY2F0ZSBzd2FwIGNhY2hlIGZvbGlvICovCiAJc2kgPSBnZXRfc3dhcF9kZXZpY2Uoc3dwZW50cnkpOwogCWlmICghc2kpCi0JCXJldHVybiAtRUVYSVNUOwomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1hTV0FQKSB7CiYjNDM7CQlwdXRfc3dhcF9kZXZpY2Uoc2kpOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KIAogCW1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7CiAJZm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cGVudHJ5LCBHRlBfS0VSTkVMLCBCSVQoMCksIE5VTEwsIG1wb2wsCkBAIC0xNTM1LDcgJiM0MzsxNTQwLDcgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCXpzd2FwX3Bvb2xfcHV0KHBvb2wpOwogcHV0X29iamNnOgogCW9ial9jZ3JvdXBfcHV0KG9iamNnKTsKLQlpZiAoIXJldCAmYW1wOyZhbXA7IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsKQomIzQzOwlpZiAoIXJldCAmYW1wOyZhbXA7IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsICZhbXA7JmFtcDsgYXRvbWljX3JlYWQoJmFtcDtucl9yZWFsX3N3YXBmaWxlcykpCiAJCXF1ZXVlX3dvcmsoc2hyaW5rX3dxLCAmYW1wO3pzd2FwX3Nocmlua193b3JrKTsKIGNoZWNrX29sZDoKIAkvKgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDA0OAoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDEwODgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqWHN3YXAgUGF0Y2ggRXZhbHVhdGlvbjogRnV6emluZyBGb2N1cyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSBoYXZlIGEgcGF0Y2ggc2VyaWVzIGludHJvZHVjaW5nICYjMzQ7eHN3YXAsJiMzNDsgYW4gJiMzNDtFeHRlbmRhYmxlIHN3YXAgZGV2aWNlLiYjMzQ7IE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdoZXRoZXIgdGhpcyBpbnRyb2R1Y2VzIG5ldyBrZXJuZWwgZnVuY3Rpb25hbGl0eSBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aGF0IG5lZWRzIGZ1enppbmcuCgpUaGUgcGF0Y2gmIzM5O3Mga2V5IGlzIHRoZSBgQ09ORklHX1hTV0FQYCBLY29uZmlnIG9wdGlvbi4gRGVwZW5kZW5jeSBvbiBgU1dBUGAgYW5kIGA2NEJJVGAgYXJlIHJlYXNvbmFibGUuIFRoZSByZWFsbHkgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGUgbW9kaWZpY2F0aW9uIHRvIGBtbS9zd2FwZmlsZS5jYCwgZXNwZWNpYWxseSB0aGUgaGFuZGxpbmcgb2YgdGhlIGBTV1BfWFNXQVBgIGZsYWcuIFNwZWNpZmljYWxseSwgdGhlIGBkZWJ1Z2ZzYCBpbnRlcmZhY2UgZXhwb3NpbmcgYHR5cGUmbHQ7TiZndDtfY2x1c3Rlcl9saW1pdGAgbG9va3MgbGlrZSBhIHByaW1lIHRhcmdldC4gVGhlIGNvcmUgb2YgdGhpcyBmdW5jdGlvbmFsaXR5IHNlZW1zIHRvIGJlIHRyaWdnZXJlZCBieSBjcmVhdGluZyBhIHN3YXAgZmlsZSB0aGF0JiMzOTtzIHByZWNpc2VseSBgUEFHRV9TSVpFYCBpbiBzaXplLiBBbmQgdGhlbiBydW5uaW5nIGBzd2Fwb25gLiBTbyB0aGlzIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZS4gQmluZ28hIFRoaXMgaXMgYSBnb29kIHNpZ24gZm9yIGZ1enppbmcuCgpOb3csIHdoaWNoIGZ1bmN0aW9ucyBhcmUgbW9zdCByZWxldmFudD8gVGhlIHBhdGNoIHRvdWNoZXMgYSBsb3Qgb2YgY29kZSwgbW9kaWZ5aW5nIHNldmVyYWwgZmlsZXMuIEkmIzM5O3ZlIHNjYW5uZWQgdGhlIGNoYW5nZXMsIG5vdGluZyBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBoYXZlIGJlZW4gYWRkZWQgb3IgbW9kaWZpZWQuIFRoZSBrZXkgb25lcyB0aGF0IGltbWVkaWF0ZWx5IGp1bXAgb3V0IGFyZTogYHhzd2FwX21hcF9jbHVzdGVyc2AsIGB4c3dhcF91bm1hcF9jbHVzdGVyc2AsIGB4c3dhcF9jaGVja19tYXBwZWRgLCBgeHN3YXBfdHJpbV9mcmVlX3RhaWxgLCBgeHN3YXBfdXBkYXRlX2ZyZWVfdGFpbGAsIGB4c3dhcF90cnlfc2hyaW5rYCwgYHhzd2FwX21heF9jbHVzdGVyc19yZWFkYCwgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAsIGB4c3dhcF9kZWJ1Z2ZzX2FkZGAsIGB4c3dhcF9kZWJ1Z2ZzX2RlbGAsIGBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm9gLCBgcmVhZF9zd2FwX2hlYWRlcmAsIGBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnlgLCBgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllc2AsIGBfX2ZyZWVfY2x1c3RlcmAsIGBzd2Fwb2ZmYCwgYHN3YXBvbmAuCgpSZW1lbWJlcmluZyB0aGUgZnV6emluZyBwcmluY2lwbGUsICYjMzQ7cHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zJiMzNDsuCgpgc3lzX3N3YXBvbmAgYW5kIGBzeXNfc3dhcG9mZmAgYXJlIHRoZSBlbnRyeSBwb2ludHMgc28gdGhlc2UgYXJlIG9idmlvdXMgdGFyZ2V0cy4gTGV0JiMzOTtzIGRpZyBkZWVwZXI6CgpXaGlsZSBgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5YCBpcyBtb2RpZmllZCwgaXQmIzM5O3Mgc3RhdGljLCBzbyBsZXNzIGludGVyZXN0aW5nIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCB1bmxlc3MgaXQmIzM5O3Mgbm90IGlubGluZWQuCgpUaGUgZm9jdXMgc2hvdWxkIGJlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGluIHRoZSBtb2RpZmllZCBmaWxlcy4gTGV0JiMzOTtzIHNlZS4uLiBsb29raW5nIGF0IGBtbS9zd2FwZmlsZS5jYCwgdGhlcmUmIzM5O3Mgbm90IGEgbG90IG9mIG5vbi1zdGF0aWMgc3R1ZmYgdGhhdCBJIGNhbiBzZWUgZGlyZWN0bHksIGBzZXR1cF9zd2FwX2V4dGVudHNgIGlzIHN0YXRpYy4KCkluIGBtbS9wYWdlX2lvLmNgLCBib3RoIGBzd2FwX3dyaXRlb3V0YCBhbmQgYHN3YXBfcmVhZF9mb2xpb2AgYXJlIG5vbi1zdGF0aWM7IGtlZXAgdGhlbSBpbiBtaW5kLiBgc3dhcF9jbHVzdGVyX3JlYWRhaGVhZGAgaW4gYG1tL3N3YXBfc3RhdGUuY2AgaXMgbm9uLXN0YXRpYyBhcyB3ZWxsLgoKSW4gYG1tL3pzd2FwLmNgLCBgenN3YXBfc3RvcmVgIGlzIG5vbi1zdGF0aWMuCgpBaCwgYnV0IHdhaXQuIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLiBUaGlzIGlzIHRyaWdnZXJlZCB2aWEgYSBkZWJ1Z2ZzIHdyaXRlLCB3aGljaCBpcyBhbm90aGVyIGVudHJ5cG9pbnQuIEkgdGhvdWdodCB0aGlzIHdhcyBzdGF0aWMsIGJ1dCBpdCBjYW5ub3QgYmUgaW5saW5lZCwgYmVjYXVzZSBpdCYjMzk7cyBwYXNzZWQgYXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIGBkZWJ1Z2ZzX2NyZWF0ZV9maWxlYC4gVGhpcyBpcyBhbiBpZGVhbCB0YXJnZXQhCgpMZXQmIzM5O3MgcXVpY2tseSBjb25maXJtIHdpdGggYSBgZGVmYXVsdF9hcGk6Z3JlcHBlcmAgdG8gYmUgMTAwJSBzdXJlLiBJIHdhbnQgdG8gbWFrZSBzdXJlIEkgZG9uJiMzOTt0IG1pc3Mgc29tZXRoaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3hzd2FwX21heF9jbHVzdGVyc193cml0ZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zd2FwZmlsZS5jPTg2PXN0YXRpYyBzc2l6ZV90IHhzd2FwX21heF9jbHVzdGVyc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLFxuLS1cbm1tL3N3YXBmaWxlLmMtOTYtXG5tbS9zd2FwZmlsZS5jOjk3OnN0YXRpYyBzc2l6ZV90IHhzd2FwX21heF9jbHVzdGVyc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSxcbm1tL3N3YXBmaWxlLmMtOTgtXHRcdFx0XHRcdGNvbnN0IGNoYXIgX191c2VyICpidWYsXG4tLVxubW0vc3dhcGZpbGUuYz0xMzY9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xubW0vc3dhcGZpbGUuYy0xMzctXHQucmVhZCA9IHhzd2FwX21heF9jbHVzdGVyc19yZWFkLFxubW0vc3dhcGZpbGUuYzoxMzg6XHQud3JpdGUgPSB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUsXG5tbS9zd2FwZmlsZS5jLTEzOS1cdC5vcGVuID0gc2ltcGxlX29wZW4sXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYwOTMKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiA5OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgU3dhcCBDbHVzdGVyIEZ1bmN0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2Ugc3dhcC1yZWxhdGVkIGZ1bmN0aW9ucywgYW5kIHllcCwgdGhleSYjMzk7cmUgZGVmaW5pdGVseSBwcmVzZW50LiBJIHNlZTogYHhzd2FwX21hcF9jbHVzdGVyc2AsIGB4c3dhcF91bm1hcF9jbHVzdGVyc2AsIGB4c3dhcF90cnlfc2hyaW5rYCwgYHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWxgLCBhbmQgYHhzd2FwX3RyaW1fZnJlZV90YWlsYC4gQSBxdWljayBjaGVjayBjb25maXJtcyB0aGVzZSBhcmUgZGVjbGFyZWQgc3RhdGljIOKAkyBnb29kLCB0aGF0JiMzOTtzIHdoYXQgSSBleHBlY3RlZC4gTm93LCBqdXN0IGJlY2F1c2UgdGhleSYjMzk7cmUgc3RhdGljIGRvZXNuJiMzOTt0IGF1dG9tYXRpY2FsbHkgbWVhbiB0aGV5JiMzOTtyZSBpbmxpbmVkLCBzbyB0aGF0JiMzOTtzIHNvbWV0aGluZyB0byBrZWVwIGluIG1pbmQuIEkgbmVlZCB0byBkaWcgYSBsaXR0bGUgZGVlcGVyLiBMZXQgbWUgZXhhbWluZSBgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvYCBuZXh0LiBUaGF0IHNob3VsZCBwcm92aWRlIHNvbWUgY29udGV4dC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcGZpbGUuYz00MDY5PXN0YXRpYyB2b2lkIHhzd2FwX3RyeV9zaHJpbmsoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuLS1cbm1tL3N3YXBmaWxlLmMtNDExMy1cbm1tL3N3YXBmaWxlLmM6NDExNDpzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTQxMTUtXHRcdFx0XHQgICAgdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxuLS1cbm1tL3N3YXBmaWxlLmM9NDI1OD1TWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuLS1cbm1tL3N3YXBmaWxlLmMtNDM2OS1cdC8qIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8gKi9cbm1tL3N3YXBmaWxlLmM6NDM3MDpcdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xubW0vc3dhcGZpbGUuYy00MzcxLVx0aWYgKGVycm9yKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NTk2CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMzE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBTd2FwIEVudHJ5IFBvaW50cyBhbmQgQ29yZSB4c3dhcCBGdW5jdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCBob3cgdG8gYmVzdCBjaGFyYWN0ZXJpemUgdGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCwgYW5kIG15IGluaXRpYWwgdGhvdWdodCBnb2VzIHN0cmFpZ2h0IHRvIHN5c3RlbSBjYWxsIGVudHJ5IHBvaW50cy4gYHN5c19zd2Fwb25gIGFuZCBgc3lzX3N3YXBvZmZgIGFyZSB0aGUgb2J2aW91cyBzdGFydGluZyBwb2ludHMuIEJ1dCwgd2FpdCwgSSBuZWVkIHRvIGJlIHByZWNpc2UuIEkgcmVtZW1iZXIgYHN5c19zd2Fwb25gIGlzIHByb2JhYmx5IGEgd3JhcHBlciBsaWtlIGBfX3g2NF9zeXNfc3dhcG9uYCB3aGljaCB0aGVuIGNhbGxzIHRoZSBhY3R1YWwgZnVuY3Rpb24sIGBfX2RvX3N5c19zd2Fwb25gIG9yIGBzeXNfc3dhcG9uYCBkaXJlY3RseS4gCgpOb3csIEkgc3RhcnQgbGlzdGluZyBzb21lIHJlbGF0ZWQgZnVuY3Rpb25zIHRoYXQgY29tZSB0byBtaW5kOiBgc3dhcF93cml0ZW91dGAsIGBzd2FwX3JlYWRfZm9saW9gLCBgc3dhcF9jbHVzdGVyX3JlYWRhaGVhZGAsIGFuZCBgenN3YXBfc3RvcmVgLiBCdXQgaG9sZCBvbiwgdGhlIHByb21wdCBzcGVjaWZpY2FsbHkgc2F5cyB0byBhdm9pZCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBrZWVwIHRoZSB0ZXN0IGRpc3RyaWJ1dGlvbnMgZnJvbSBiZWluZyBza2V3ZWQhIFNvLCBzY3JhdGNoIHRob3NlIOKAkyB0aGV5JiMzOTtyZSB0b28gY29tbW9uLgoKSW5zdGVhZCwgSSBuZWVkIHRvIGRyaWxsIGRvd24gaW50byB0aGUgc2V0dXAsIHRlYXJkb3duLCBhbmQgKnNwZWNpZmljKiB4c3dhcCBmdW5jdGlvbnMgdGhhdCByZWFsbHkgZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzLiBDYW4gSSBsaXN0IGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLCBgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRgLCBgeHN3YXBfc2hyaW5rX3dvcmtfZm5gLCBgeHN3YXBfbWFwX2NsdXN0ZXJzYCwgYHhzd2FwX3VubWFwX2NsdXN0ZXJzYCwgYW5kIGB4c3dhcF90cnlfc2hyaW5rYD8gRXZlbiBpZiBzb21lIGFyZSBkZWNsYXJlZCBgc3RhdGljYCwgdGhleSYjMzk7cmUgY2VudHJhbCB0byB0aGUgY2hhbmdlcy4KCkxldCBtZSBqdXN0IHF1aWNrbHkgdmVyaWZ5IGhvdyBgeHN3YXBfbWFwX2NsdXN0ZXJzYCBpcyB1c2VkLiBJcyBpdCBwYXNzZWQgYXMgYSBwb2ludGVyIG9yIGp1c3QgY2FsbGVkPyBPa2F5LCBpdCYjMzk7cyBqdXN0IGNhbGxlZCBkaXJlY3RseSwgYnV0IGl0IGxvb2tzIGxpa2UgYSBsYXJnZSBmdW5jdGlvbiBzbyBpdCYjMzk7cyBwcm9iYWJseSBub3QgaW5saW5lZC4KCkFuZCB3aGF0IGFib3V0IGB4c3dhcF9zaHJpbmtfd29ya19mbmA/IFllcywgaXQmIzM5O3MgcGFzc2VkIHRvIGBJTklUX1dPUktgLCBzbyBJIGtub3cgZm9yIHN1cmUgdGhhdCBpdCB3b24mIzM5O3QgYmUgaW5saW5lZC4gVGhpcyBzaG91bGQgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3hzd2FwX3Nocmlua193b3JrX2ZuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3N3YXBmaWxlLmM9NDAzOT1zdGF0aWMgdm9pZCB4c3dhcF90cmltX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGxvbmcgaWR4KVxuLS1cbm1tL3N3YXBmaWxlLmMtNDA1Ny1cbm1tL3N3YXBmaWxlLmM6NDA1ODpzdGF0aWMgdm9pZCB4c3dhcF9zaHJpbmtfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG5tbS9zd2FwZmlsZS5jLTQwNTkte1xuLS1cbm1tL3N3YXBmaWxlLmM9NDExND1zdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4tLVxubW0vc3dhcGZpbGUuYy00MTcyLVx0XHRtdXRleF9pbml0KFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xubW0vc3dhcGZpbGUuYzo0MTczOlx0XHRJTklUX1dPUksoXHUwMDI2c2ktXHUwMDNleHN3YXBfc2hyaW5rX3dvcmssIHhzd2FwX3Nocmlua193b3JrX2ZuKTtcbm1tL3N3YXBmaWxlLmMtNDE3NC1cdFx0eHN3YXBfZGVidWdmc19hZGQoc2kpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NTcyCgkJCQkJCQlvdXRwdXQ6IDE4CgkJCQkJCQl0aG91Z2h0czogMjQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFhTV0FQIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gcmV2aWV3aW5nIHRoaXMgY29kZSwgYW5kIGl0JiMzOTtzIGNsZWFyIHRoYXQgYHhzd2FwX3Nocmlua193b3JrX2ZuYCwgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAsIGFuZCBgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRgIGFyZSAqbm90KiBpbmxpbmVkLCB3aGljaCBpcyBnb29kIHRvIG5vdGUuIEFsc28sIGJvdGggYHhzd2FwX2NoZWNrX21hcHBlZGAgYW5kIGB4c3dhcF9jb2xsZWN0X3BhZ2VgIGFyZSBwYXNzZWQgYXMgZnVuY3Rpb24gcG9pbnRlcnMgdG8gYGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2VgLCBjb25maXJtaW5nIHRoZXkgd29uJiMzOTt0IGJlIGlubGluZWQgZWl0aGVyLgoKTm93LCByZWdhcmRpbmcgdGhlIG5lY2Vzc2FyeSBLY29uZmlnIG9wdGlvbnMsIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBgQ09ORklHX1hTV0FQYCwgYW5kIGl0IGV4cGxpY2l0bHkgZGVwZW5kcyBvbiBib3RoIGBTV0FQYCBhbmQgYDY0QklUYC4gU28sIGBYU1dBUGAgaXMgZGVmaW5pdGVseSB0aGUgbWFpbiBvbmUgdG8gZm9jdXMgb24gZm9yIGVuYWJsaW5nIHRoaXMgZmVhdHVyZS4gSSBuZWVkIHRvIG1ha2UgYSBub3RlIG9mIHRoaXMuCgpBcmUgdGhlcmUgYW55IG90aGVyIGRlcGVuZGVuY2llcz8gTGV0JiMzOTtzIHNlZS4uLiBgQ09ORklHX0RFQlVHX0ZTYCBpcyBhcHBhcmVudGx5IHJlcXVpcmVkIGJlY2F1c2Ugb2YgYGRlYnVnZnNfY3JlYXRlX2ZpbGVgLiBBbHRob3VnaCBgZGVidWdmc19jcmVhdGVfZmlsZWAgaGFzIGEgZHVtbXkgaW5saW5lIGlmIGBERUJVR19GU2AgaXMgZGlzYWJsZWQsIGFuZCB0aHVzIGlzbiYjMzk7dCAqc3RyaWN0bHkqIHJlcXVpcmVkIGZvciBjb21waWxhdGlvbiwgaXQmIzM5O3MgZGVmaW5pdGVseSBuZWVkZWQgZm9yIHRlc3RpbmcgdGhlIGRlYnVnZnMgaW50ZXJmYWNlLCBzbyBJIHNob3VsZCBwcm9iYWJseSBpbmNsdWRlIGl0IGZvciBmdWxsIGZ1bmN0aW9uYWxpdHkuIEkgbmVlZCB0byBjaGVjayBgbW0vS2NvbmZpZ2AgdG8gY29uZmlybSB3aGVyZSBgWFNXQVBgIGlzIGRlZmluZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBYU1dBUCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTExND1jb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXG4tLVxubW0vS2NvbmZpZy0xMjQtXG5tbS9LY29uZmlnOjEyNTpjb25maWcgWFNXQVBcbm1tL0tjb25maWctMTI2LVx0Ym9vbCBcJiMzNDtFeHRlbmRhYmxlICh2aXJ0dWFsKSBzd2FwIGRldmljZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODIxMgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipOYXZpZ2F0aW5nIHRoZSBLY29uZmlnIExhYnlyaW50aCoqCgpPa2F5LCB0aW1lIHRvIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gYWdhaW4uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc2V0dGluZ3MgcmVsYXRlZCB0byBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5LCBzb21ldGhpbmcgSSYjMzk7bSB0cm91Ymxlc2hvb3RpbmcuIExldCYjMzk7cyBzZWUuLi4gYSBnb29kIHN0YXJ0aW5nIHBvaW50IGlzIHVzdWFsbHkgdGhlIGBtbS9LY29uZmlnYCBmaWxlLiBJJiMzOTtsbCBuZWVkIHRvIGdvIHRvIHRoYXQgZmlsZSB0byBjaGVjayB3aGF0IHRoZSBLY29uZmlnIHNldHRpbmdzIGFyZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDEyNSwgdGhhdCYjMzk7cyB1c3VhbGx5IHdoZXJlIHRoZSByZWxldmFudCBvcHRpb25zIGFyZS4gSSYjMzk7bGwgZm9jdXMgbXkgaW52ZXN0aWdhdGlvbiB0aGVyZS4gSG9wZWZ1bGx5LCB0aGF0IHdpbGwgZ2l2ZSBtZSBzb21lIGNsYXJpdHkgb24gdGhlIGZlYXR1cmUgYW5kIGl0cyBjb25maWd1cmF0aW9uLiBJJiMzOTttIGhvcGluZyBJIGNhbiBmaW5kIHRoZSBhbnN3ZXIgcXVpY2tseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMDk6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMTU6XHQgICAgICAgc3RyaW5nXG4gMTE2Olx0ICAgICAgIGRlcGVuZHMgb24gWlNXQVBcbiAxMTc6XHQgICAgICAgZGVmYXVsdCBcJiMzNDtkZWZsYXRlXCYjMzQ7IGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9ERUZMQVRFXG4gMTE4Olx0ICAgICAgIGRlZmF1bHQgXCYjMzQ7bHpvXCYjMzQ7IGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWk9cbiAxMTk6XHQgICAgICAgZGVmYXVsdCBcJiMzNDs4NDJcJiMzNDsgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXzg0MlxuIDEyMDpcdCAgICAgICBkZWZhdWx0IFwmIzM0O2x6NFwmIzM0OyBpZiBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0XG4gMTIxOlx0ICAgICAgIGRlZmF1bHQgXCYjMzQ7bHo0aGNcJiMzNDsgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaNEhDXG4gMTIyOlx0ICAgICAgIGRlZmF1bHQgXCYjMzQ7enN0ZFwmIzM0OyBpZiBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfWlNURFxuIDEyMzpcdCAgICAgICBkZWZhdWx0IFwmIzM0O1wmIzM0O1xuIDEyNDpcdFxuIDEyNTpcdGNvbmZpZyBYU1dBUFxuIDEyNjpcdFx0Ym9vbCBcJiMzNDtFeHRlbmRhYmxlICh2aXJ0dWFsKSBzd2FwIGRldmljZVwmIzM0O1xuIDEyNzpcdFx0ZGVwZW5kcyBvbiBTV0FQIFx1MDAyNlx1MDAyNiA2NEJJVFxuIDEyODpcdFx0aGVscFxuIDEyOTpcdFx0ICBBZGRzIHN1cHBvcnQgZm9yIGV4dGVuZGFibGUgc3dhcCBkZXZpY2VzICh4c3dhcCkgdGhhdCBkZWNvdXBsZVxuIDEzMDpcdFx0ICBQVEUgc3dhcCBlbnRyaWVzIGZyb20gcGh5c2ljYWwgYmFja2luZyBzdG9yYWdlLiBUaGUgY2x1c3Rlcl9pbmZvXG4gMTMxOlx0XHQgIGFycmF5IGlzIGJhY2tlZCBieSBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgdGhhdCBncm93cyBhbmQgc2hyaW5rc1xuIDEzMjpcdFx0ICBvbiBkZW1hbmQsIGF2b2lkaW5nIHN0YXRpYyBwcmUtYWxsb2NhdGlvbiBvdmVyaGVhZC5cbiAxMzM6XHRcbiAxMzQ6XHRjb25maWcgWlNNQUxMT0NcbiAxMzU6XHRcdHRyaXN0YXRlXG4gMTM2Olx0XG4gMTM3Olx0bWVudSBcJiMzNDtac21hbGxvYyBhbGxvY2F0b3Igb3B0aW9uc1wmIzM0O1xuIDEzODpcdFx0ZGVwZW5kcyBvbiBaU01BTExPQ1xuIDEzOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODgyMwoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDI1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBDb25maWd1cmF0aW9uIENob2ljZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIHRoZSBmaXJzdCB0aGluZyBJIG5lZWQgdG8gZG8gaXMgY29uZmlndXJlIGl0LiBUaGUgY3JpdGljYWwgcGllY2UgaGVyZSBzZWVtcyB0byBiZSBgWFNXQVBgLCBzbyBJJiMzOTtsbCBiZSBzdXJlIHRvIGFkZCB0aGF0IHRvIHRoZSBgRW5hYmxlQ29uZmlnc2AuIEdpdmVuIHRoYXQgZGVidWdmcyBpcyBhIGNlbnRyYWwgcGFydCBvZiB0aGlzLCBJJiMzOTtsbCBhbHNvIGJyaW5nIGluIGBERUJVR19GU2AgdG8gZW5zdXJlIHdlIGNhbiBmdXp6IGl0IGVmZmVjdGl2ZWx5LiBUaGF0JiMzOTtsbCBiZSBpbXBvcnRhbnQgZm9yIHRob3JvdWdoIHRlc3RpbmcuCgpOb3csIG9uIHRvIHRoZSBBUEkgZXhwb3N1cmUuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9ucyBhcmUgdGhlIGtleSBlbnRyeSBwb2ludHMuIExldCBtZSBzZWUgaWYgYHhzd2FwX21hcF9jbHVzdGVyc2AgaXMgc3RhdGljIC0geWVwLCBpdCBpcy4gVGhlIHByb21wdCBkb2VzIHNheSB0byAmIzM0O1ByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyYjMzQ7LgoKQWxyaWdodCwgaGVyZeKAmXMgbXkgcGxhbiBmb3IgbGlzdGluZzogSSYjMzk7bGwgaW5jbHVkZToKKiAgIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgCiogICBgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRgCiogICBgeHN3YXBfc2hyaW5rX3dvcmtfZm5gCiogICBgeHN3YXBfY2hlY2tfbWFwcGVkYAoqICAgYHhzd2FwX2NvbGxlY3RfcGFnZWAKKiAgIGBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm9gIChldmVuIHRob3VnaCBpdCYjMzk7cyBzdGF0aWMsIGl0JiMzOTtzIGEgbWFqb3Igc2V0dXAgZnVuY3Rpb24gYW5kIHByZXR0eSBzaWduaWZpY2FudCkuCgpIYW5nIG9uLCBkaWQgSSBqdXN0IGxpc3QgYHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mb2A/IFRoYXQmIzM5O3MgcmlnaHQsIGl0ICppcyogc3RhdGljLiBMZXQgbWUgcXVpY2tseSByZWFzc2Vzcy4gSSBzaG91bGQgY29uc2lkZXIgYHN5c19zd2Fwb25gIGFuZCBgc3lzX3N3YXBvZmZgISBCZWluZyBzeXNjYWxscywgdGhlc2UgYXJlIGRlZmluaXRlbHkgZW50cnkgcG9pbnRzLiBJIHNob3VsZCBhbHNvIGNoZWNrIGBtbS9zd2FwZmlsZS5jYCB0byBiZSBjZXJ0YWluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtTWVNDQUxMX0RFRklORS4qc3dhcG9uJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3N3YXBmaWxlLmM9NDExND1zdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4tLVxubW0vc3dhcGZpbGUuYy00MjU3LVxubW0vc3dhcGZpbGUuYzo0MjU4OlNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG5tbS9zd2FwZmlsZS5jLTQyNTkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTU1NwoJCQkJCQkJb3V0cHV0OiAxODQKCQkJCQkJCXRob3VnaHRzOiA2MDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgWHN3YXAgRnV6emluZyBUYXJnZXQgU2VsZWN0aW9uKioKCk9rYXksIGxldCYjMzk7cyB0aGluayB0aGlzIHRocm91Z2guIFRoZSBwcm9tcHQgYXNrcyBmb3IgYSBsaXN0IG9mIGtlcm5lbCBmdW5jdGlvbnMgdG8gZm9jdXMgZnV6emluZyBlZmZvcnRzIG9uLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbmV3IHhzd2FwIGZ1bmN0aW9uYWxpdHkuIFN5emthbGxlciB1c3VhbGx5IHVzZXMgdGhlIGFjdHVhbCBzeW1ib2wgbmFtZXMsIHNvIEkgbmVlZCB0byBkZWNpZGUgd2hhdCYjMzk7cyBtb3N0IGFwcHJvcHJpYXRlIGhlcmUuIFNob3VsZCBJIGxpc3QgdGhlIHN5c2NhbGwgZW50cnkgcG9pbnQgKGBfX3g2NF9zeXNfc3dhcG9uYCBvciBgc3lzX3N3YXBvbmApIG9yIGRlbHZlIGRlZXBlciBpbnRvIHRoZSBpbnRlcm5hbHM/CgpUaGUgcHJlZmVyZW5jZSBpcyBmb3Igbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLiBUaGlua2luZyBhYm91dCB0aGF0LCB0aGUgb3JpZ2luYWwgdGhvdWdodCB3YXMgdG8gbGlzdCBmdW5jdGlvbnMgKmluc2lkZSogdGhlIHN5c2NhbGwsIGxpa2UgYHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mb2AuIEJ1dCB0aGVuIHRoZSBwcm9tcHQgY2xhcmlmaWVkIHRoZSBuZWVkIHRvIGF2b2lkIHN0YXRpYyBpbmxpbmVkIGhlbHBlciBmdW5jdGlvbnMuIFRoYXQgbWFrZXMgc2Vuc2UuCgpTbywgSSBuZWVkIHRvIGlkZW50aWZ5IGZ1bmN0aW9ucyB0aGF0IGFyZSAqbm90KiBpbmxpbmVkIGFuZCBoYXZlIGRpc3RpbmN0IGFkZHJlc3Nlcy4gSW1tZWRpYXRlbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQuIEZ1bmN0aW9ucyBsaWtlIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLCBgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRgLCBgeHN3YXBfc2hyaW5rX3dvcmtfZm5gLCBgeHN3YXBfY2hlY2tfbWFwcGVkYCwgYW5kIGB4c3dhcF9jb2xsZWN0X3BhZ2VgIGFyZSBwYXNzZWQgYXMgZnVuY3Rpb24gcG9pbnRlcnMuIFRoZXNlIGFyZSBoaWdobHkgdW5saWtlbHkgdG8gYmUgaW5saW5lZCBhbmQgYXJlIGdyZWF0IGNhbmRpZGF0ZXMuCgpXaGF0IGFib3V0IG90aGVyIGZ1bmN0aW9ucz8gYHN3YXBfdHlwZV9zdHJgIGlzIGEgcHJpbnQgaGVscGVyLCBzbyB0aGF0JiMzOTtzIG91dC4gVGhlbiBteSBtaW5kIGlzIG9uIGB4c3dhcF9tYXBfY2x1c3RlcnNgIGFuZCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLiBUaGV5ICptaWdodCogYmUgaW5saW5lZC4gQnV0IGB4c3dhcF9tYXBfY2x1c3RlcnNgIGlzIGEgc3Vic3RhbnRpYWwgZnVuY3Rpb27igJQxMzAgbGluZXMhIEl0JiMzOTtzIHByb2JhYmx5IGEgZ29vZCB0YXJnZXQgYmVjYXVzZSBpdCBpcyBsZXNzIGxpa2VseSB0byBiZSBpbmxpbmVkLgoKVGhlIHhzd2FwIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlLiBUaGUgaW1wbGVtZW50YXRpb24gZGVjb3VwbGVzIFBURSBzd2FwIGVudHJpZXMgZnJvbSBwaHlzaWNhbCBiYWNraW5nIHN0b3JhZ2UgYW5kIHVzZXMgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIGZvciBjbHVzdGVyIGluZm8uIFRoaXMgb3BlbnMgdXAgbmV3IGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgbmVlZHMgYXR0ZW50aW9uLCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHNocmlua2luZyB3b3JrcXVldWUuIFRoZSBuZXcgZmVhdHVyZSBpcyBmdW5jdGlvbmFsLCBzbyBpdCBzaG91bGQgYmUgZnV6emVkLgoKV2l0aCBhbGwgb2YgdGhpcyBpbiBtaW5kLCB0aGUgY29uZmlndXJhdGlvbnMgdG8gZW5hYmxlIGFyZSBgWFNXQVBgIGFuZCBgREVCVUdfRlNgLgoKSSYjMzk7bGwgcHJvY2VlZCB3aXRoIHRoZXNlIGtleSBzeW1ib2xzOgoqICAgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAKKiAgIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGAKKiAgIGB4c3dhcF9zaHJpbmtfd29ya19mbmAKKiAgIGB4c3dhcF9jaGVja19tYXBwZWRgCiogICBgeHN3YXBfY29sbGVjdF9wYWdlYAoqICAgYHhzd2FwX21hcF9jbHVzdGVyc2AKKiAgIGB4c3dhcF91bm1hcF9jbHVzdGVyc2AKClF1aWNrIHNhbml0eSBjaGVjazogQXJlIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMgKnN0YXRpYyo/IFllcywgYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW50cm9kdWNlZCBhcmUgc3RhdGljLiBUaGlzIG1lYW5zIHRoZXJlIGFyZSBubyBub24tc3RhdGljIGZ1bmN0aW9ucyBhZGRlZCwgaG93ZXZlciwgdGhlc2UgZnVuY3Rpb25zIGFyZSBjZW50cmFsIHRvIHRoZSBuZXcgZnVuY3Rpb25hbGl0eSwgd2l0aCBzb21lIGJlaW5nIGZ1bmN0aW9uIHBvaW50ZXJzLCB0aGV5IGFyZSBnb29kIGNhbmRpZGF0ZXMuCgpPa2F5LCBJJiMzOTttIGNvbmZpZGVudCBpbiB0aGVzZSBzZWxlY3Rpb25zLiBOb3csIGxldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtYU1dBUCYjMzQ7LAogICAgJiMzNDtERUJVR19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3hzd2FwX21heF9jbHVzdGVyc193cml0ZSYjMzQ7LAogICAgJiMzNDt4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZCYjMzQ7LAogICAgJiMzNDt4c3dhcF9zaHJpbmtfd29ya19mbiYjMzQ7LAogICAgJiMzNDt4c3dhcF9jaGVja19tYXBwZWQmIzM0OywKICAgICYjMzQ7eHN3YXBfY29sbGVjdF9wYWdlJiMzNDssCiAgICAmIzM0O3hzd2FwX21hcF9jbHVzdGVycyYjMzQ7LAogICAgJiMzNDt4c3dhcF91bm1hcF9jbHVzdGVycyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dGVuZGFibGUgdmlydHVhbCBzd2FwIGRldmljZSAoeHN3YXApIHRoYXQgZGVjb3VwbGVzIFBURSBzd2FwIGVudHJpZXMgZnJvbSBwaHlzaWNhbCBiYWNraW5nIHN0b3JhZ2UuIEl0IHVzZXMgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIGZvciBjbHVzdGVyIGluZm8gdGhhdCBncm93cyBhbmQgc2hyaW5rcyBkeW5hbWljYWxseS4gVGhpcyBhZGRzIG5ldyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgZm9yIHN3YXAgbWFuYWdlbWVudCwgaW5jbHVkaW5nIGRlYnVnZnMgaW50ZXJmYWNlcyBhbmQgYSB3b3JrcXVldWUgZm9yIHNocmlua2luZy4gSXQgaXMgZnVuY3Rpb25hbCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7WFNXQVAmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUmIzM0OywKICAgICYjMzQ7eHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQmIzM0OywKICAgICYjMzQ7eHN3YXBfc2hyaW5rX3dvcmtfZm4mIzM0OywKICAgICYjMzQ7eHN3YXBfY2hlY2tfbWFwcGVkJiMzNDssCiAgICAmIzM0O3hzd2FwX2NvbGxlY3RfcGFnZSYjMzQ7LAogICAgJiMzNDt4c3dhcF9tYXBfY2x1c3RlcnMmIzM0OywKICAgICYjMzQ7eHN3YXBfdW5tYXBfY2x1c3RlcnMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBleHRlbmRhYmxlIHZpcnR1YWwgc3dhcCBkZXZpY2UgKHhzd2FwKSB0aGF0IGRlY291cGxlcyBQVEUgc3dhcCBlbnRyaWVzIGZyb20gcGh5c2ljYWwgYmFja2luZyBzdG9yYWdlLiBJdCB1c2VzIGEgc3BhcnNlIHZtYWxsb2MgYXJlYSBmb3IgY2x1c3RlciBpbmZvIHRoYXQgZ3Jvd3MgYW5kIHNocmlua3MgZHluYW1pY2FsbHkuIFRoaXMgYWRkcyBuZXcgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIGZvciBzd2FwIG1hbmFnZW1lbnQsIGluY2x1ZGluZyBkZWJ1Z2ZzIGludGVyZmFjZXMgYW5kIGEgd29ya3F1ZXVlIGZvciBzaHJpbmtpbmcuIEl0IGlzIGZ1bmN0aW9uYWwgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNDozOC4yNTIwMzU4MjhaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MjMwNDM5Nzc4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJYU1dBUFwiLFxuICAgIFwiREVCVUdfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVcIixcbiAgICBcInhzd2FwX21heF9jbHVzdGVyc19yZWFkXCIsXG4gICAgXCJ4c3dhcF9zaHJpbmtfd29ya19mblwiLFxuICAgIFwieHN3YXBfY2hlY2tfbWFwcGVkXCIsXG4gICAgXCJ4c3dhcF9jb2xsZWN0X3BhZ2VcIixcbiAgICBcInhzd2FwX21hcF9jbHVzdGVyc1wiLFxuICAgIFwieHN3YXBfdW5tYXBfY2x1c3RlcnNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dGVuZGFibGUgdmlydHVhbCBzd2FwIGRldmljZSAoeHN3YXApIHRoYXQgZGVjb3VwbGVzIFBURSBzd2FwIGVudHJpZXMgZnJvbSBwaHlzaWNhbCBiYWNraW5nIHN0b3JhZ2UuIEl0IHVzZXMgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIGZvciBjbHVzdGVyIGluZm8gdGhhdCBncm93cyBhbmQgc2hyaW5rcyBkeW5hbWljYWxseS4gVGhpcyBhZGRzIG5ldyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgZm9yIHN3YXAgbWFuYWdlbWVudCwgaW5jbHVkaW5nIGRlYnVnZnMgaW50ZXJmYWNlcyBhbmQgYSB3b3JrcXVldWUgZm9yIHNocmlua2luZy4gSXQgaXMgZnVuY3Rpb25hbCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTQ6MzguMjUyMDQzNjU4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjI1NjQ3NjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMjNiODY1ZjNjNDk2N2QyMjdlNjllMzkyMGZjNDI1NzQ1OWZiZmM0MlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIEF1ZyA1IDA5OjE0OjM2IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcXG5pbmRleCA0NWYzMDFkNzNlMmFlLi5hNWIzMjMzNzQ3NjljIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcXG5AQCAtMjA3LDYgKzIwNyw3IEBAIGVudW0ge1xcbiBcXHRTV1BfU1RBQkxFX1dSSVRFUyA9ICgxIFxcdTAwM2NcXHUwMDNjIDExKSxcXHQvKiBubyBvdmVyd3JpdGUgUEdfd3JpdGViYWNrIHBhZ2VzICovXFxuIFxcdFNXUF9TWU5DSFJPTk9VU19JTyA9ICgxIFxcdTAwM2NcXHUwMDNjIDEyKSxcXHQvKiBzeW5jaHJvbm91cyBJTyBpcyBlZmZpY2llbnQgKi9cXG4gXFx0U1dQX0hJQkVSTkFUSU9OID0gKDEgXFx1MDAzY1xcdTAwM2MgMTMpLFxcdC8qIHBpbm5lZCBmb3IgaGliZXJuYXRpb24gKi9cXG4rXFx0U1dQX1hTV0FQXFx0PSAoMSBcXHUwMDNjXFx1MDAzYyAxNCksXFx0LyogZXh0ZW5kYWJsZSBzd2FwIGRldmljZSAqL1xcbiBcXHRcXHRcXHRcXHRcXHQvKiBhZGQgb3RoZXJzIGhlcmUgYmVmb3JlLi4uICovXFxuIH07XFxuIFxcbkBAIC0yNDcsNiArMjQ4LDE2IEBAIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHtcXG4gXFx0c2lnbmVkIGNoYXJcXHR0eXBlO1xcdFxcdC8qIHN0cmFuZ2UgbmFtZSBmb3IgYW4gaW5kZXggKi9cXG4gXFx0dW5zaWduZWQgaW50XFx0bWF4O1xcdFxcdC8qIHNpemUgb2YgdGhpcyBzd2FwIGRldmljZSAqL1xcbiBcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbzsgLyogY2x1c3RlciBpbmZvLiBPbmx5IGZvciBTU0QgKi9cXG4rI2lmZGVmIENPTkZJR19YU1dBUFxcbitcXHRzdHJ1Y3Qgdm1fc3RydWN0XFx0KmNsdXN0ZXJfdm07XFx0LyogVk1fU1BBUlNFIGFyZWEgZm9yIHhzd2FwIGR5bmFtaWMgY2x1c3Rlcl9pbmZvICovXFxuK1xcdHVuc2lnbmVkIGxvbmdcXHRcXHRucl9jbHVzdGVyc19tYXg7LyogdXBwZXIgbGltaXQgZnJvbSBzd2FwIGhlYWRlciAqL1xcbitcXHR1bnNpZ25lZCBsb25nXFx0XFx0bnJfY2x1c3RlcnM7XFx0LyogY3VycmVudCBncm93dGggY2VpbGluZyAo4omkIG5yX2NsdXN0ZXJzX21heCkgKi9cXG4rXFx0dW5zaWduZWQgbG9uZ1xcdFxcdG5yX2NsdXN0ZXJzX21hcHBlZDsgLyogY3VycmVudGx5IG1hcHBlZCBjbHVzdGVyIGNvdW50ICovXFxuK1xcdHVuc2lnbmVkIGxvbmdcXHRcXHRucl9mcmVlX3RhaWw7XFx0LyogY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0IHRhaWwgKi9cXG4rXFx0c3RydWN0IGRlbnRyeVxcdFxcdCpkZWJ1Z2ZzX2VudHJ5O1xcdC8qIGRlYnVnZnM6IHR5cGVcXHUwMDNjTlxcdTAwM2VfbWF4X2NsdXN0ZXJzICovXFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdFxcdHhzd2FwX3Nocmlua193b3JrOyAvKiBkZWZlcnJlZCBzaHJpbmsgdHJpZ2dlciAqL1xcbitcXHRzdHJ1Y3QgbXV0ZXhcXHRcXHR4c3dhcF9sb2NrO1xcdC8qIHNlcmlhbGl6ZSBtYXAvdW5tYXAgb3BlcmF0aW9ucyAqL1xcbisjZW5kaWZcXG4gXFx0c3RydWN0IGxpc3RfaGVhZCBmcmVlX2NsdXN0ZXJzOyAvKiBmcmVlIGNsdXN0ZXJzIGxpc3QgKi9cXG4gXFx0c3RydWN0IGxpc3RfaGVhZCBmdWxsX2NsdXN0ZXJzOyAvKiBmdWxsIGNsdXN0ZXJzIGxpc3QgKi9cXG4gXFx0c3RydWN0IGxpc3RfaGVhZCBub25mdWxsX2NsdXN0ZXJzW1NXQVBfTlJfT1JERVJTXTtcXG5AQCAtMzUwLDYgKzM2MSw3IEBAIHZvaWQgZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4gdm9pZCBmcmVlX3BhZ2VzX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBlbmNvZGVkX3BhZ2UgKiosIGludCk7XFxuIC8qIGxpbnV4L21tL3N3YXBmaWxlLmMgKi9cXG4gZXh0ZXJuIGF0b21pY19sb25nX3QgbnJfc3dhcF9wYWdlcztcXG4rZXh0ZXJuIGF0b21pY190IG5yX3JlYWxfc3dhcGZpbGVzO1xcbiBleHRlcm4gbG9uZyB0b3RhbF9zd2FwX3BhZ2VzO1xcbiBleHRlcm4gYXRvbWljX3QgbnJfcm90YXRlX3N3YXA7XFxuIFxcbmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZ1xcbmluZGV4IDA2MDE5MGUxMmJjZWQuLjgyZjYyZjRjNWIyM2UgMTAwNjQ0XFxuLS0tIGEvbW0vS2NvbmZpZ1xcbisrKyBiL21tL0tjb25maWdcXG5AQCAtMTIyLDYgKzEyMiwxNSBAQCBjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXFxuICAgICAgICBkZWZhdWx0IFxcXCJ6c3RkXFxcIiBpZiBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfWlNURFxcbiAgICAgICAgZGVmYXVsdCBcXFwiXFxcIlxcbiBcXG4rY29uZmlnIFhTV0FQXFxuK1xcdGJvb2wgXFxcIkV4dGVuZGFibGUgKHZpcnR1YWwpIHN3YXAgZGV2aWNlXFxcIlxcbitcXHRkZXBlbmRzIG9uIFNXQVAgXFx1MDAyNlxcdTAwMjYgNjRCSVRcXG4rXFx0aGVscFxcbitcXHQgIEFkZHMgc3VwcG9ydCBmb3IgZXh0ZW5kYWJsZSBzd2FwIGRldmljZXMgKHhzd2FwKSB0aGF0IGRlY291cGxlXFxuK1xcdCAgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gVGhlIGNsdXN0ZXJfaW5mb1xcbitcXHQgIGFycmF5IGlzIGJhY2tlZCBieSBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgdGhhdCBncm93cyBhbmQgc2hyaW5rc1xcbitcXHQgIG9uIGRlbWFuZCwgYXZvaWRpbmcgc3RhdGljIHByZS1hbGxvY2F0aW9uIG92ZXJoZWFkLlxcbitcXG4gY29uZmlnIFpTTUFMTE9DXFxuIFxcdHRyaXN0YXRlXFxuIFxcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmNcXG5pbmRleCBlNGZhN2ZmZmZlOGJiLi4xZjNmYTUyMTMxYWIzIDEwMDY0NFxcbi0tLSBhL21tL3BhZ2VfaW8uY1xcbisrKyBiL21tL3BhZ2VfaW8uY1xcbkBAIC0yNDcsNiArMjQ3LDE3IEBAIGludCBzd2FwX3dyaXRlb3V0KHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHR9XFxuIFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogY3R4LVxcdTAwM2VzaXMgaXMgc2V0IGJ5IHN3YXBfYWRkX2ZvbGlvKCkgd2hpY2ggaXMgY2FsbGVkIGZyb21cXG4rXFx0ICogX19zd2FwX3dyaXRlcGFnZSgpIGJlbG93LiAgU2luY2Ugd2UgbXVzdCBhdm9pZCB0aGUgd3JpdGVwYWdlXFxuK1xcdCAqIHBhdGggZm9yIHhzd2FwIGRldmljZXMsIHVzZSB0aGUgc3dhcF9pbmZvIGZyb20gdGhlIGZvbGlvJ3NcXG4rXFx0ICogc3dhcCBlbnRyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggY3R4LlxcbitcXHQgKi9cXG4rXFx0aWYgKHVubGlrZWx5KF9fc3dhcF9lbnRyeV90b19pbmZvKGZvbGlvLVxcdTAwM2Vzd2FwKS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfWFNXQVApKSB7XFxuK1xcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbitcXHRcXHRyZXR1cm4gQU9QX1dSSVRFUEFHRV9BQ1RJVkFURTtcXG4rXFx0fVxcbitcXG4gXFx0X19zd2FwX3dyaXRlcGFnZShjdHgsIGZvbGlvKTtcXG4gXFx0cmV0dXJuIDA7XFxuIG91dF91bmxvY2s6XFxuQEAgLTQ3OSw2ICs0OTAsMTEgQEAgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxcbiBcXHRcXHRnb3RvIGZpbmlzaDtcXG4gXFxuK1xcdGlmICh1bmxpa2VseShzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKSkge1xcbitcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbitcXHRcXHRnb3RvIGZpbmlzaDtcXG4rXFx0fVxcbitcXG4gXFx0LyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovXFxuIFxcdHpzd2FwX2ZvbGlvX3N3YXBpbihmb2xpbyk7XFxuIFxcdHN3YXBfYWRkX2ZvbGlvKGN0eCwgZm9saW8sIFJFQUQpO1xcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmNcXG5pbmRleCA1YmU4MjU5MTFlNjQ1Li5lYmIyZDJhYzM1NmZlIDEwMDY0NFxcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xcbisrKyBiL21tL3N3YXBfc3RhdGUuY1xcbkBAIC04MjksNiArODI5LDEzIEBAIHN0cnVjdCBmb2xpbyAqc3dhcF9jbHVzdGVyX3JlYWRhaGVhZChzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwX21hc2ssXFxuIFxcdHN0cnVjdCBibGtfcGx1ZyBwbHVnO1xcbiBcXHRzd3BfZW50cnlfdCByYV9lbnRyeTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBlbnRyeSBtYXkgaGF2ZSBiZWVuIGZyZWVkIGJ5IGFub3RoZXIgdGFzay4gQXZvaWQgc3dhcF9pbmZvX2dldCgpXFxuK1xcdCAqIHdoaWNoIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBpZiB0aGUgcmFjZSBoYXBwZW5zLlxcbitcXHQgKi9cXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUClcXG4rXFx0XFx0Z290byBza2lwO1xcbitcXG4gXFx0bWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTtcXG4gXFx0aWYgKCFtYXNrKVxcbiBcXHRcXHRnb3RvIHNraXA7XFxuZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jXFxuaW5kZXggNGQ0ZTNlMzA1OWY2Yi4uY2E0MDY1NTY2MjZlNyAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwZmlsZS5jXFxuKysrIGIvbW0vc3dhcGZpbGUuY1xcbkBAIC00OCw2ICs0OCwxMTggQEBcXG4gI2luY2x1ZGUgXFxcInN3YXBfdGFibGUuaFxcXCJcXG4gI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJzd2FwLmhcXFwiXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcXHUwMDNlXFxuK1xcbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7XFxuK1xcbisjaWZkZWYgQ09ORklHX1hTV0FQXFxuKy8qXFxuKyAqIHhzd2FwOiBkeW5hbWljYWxseSBncm93IGFuZCBzaHJpbmsgdGhlIGNsdXN0ZXJfaW5mbyBhcnJheSB2aWEgYVxcbisgKiBWTV9TUEFSU0UgYXJlYS5cXG4rICpcXG4rICogWFNXQVBfR1JPV19DTFVTVEVSUyBpcyB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIHRvIG1hcC91bm1hcCBpbiBvbmVcXG4rICogZ3Jvdy9zaHJpbmsgb3BlcmF0aW9uLiAgSXQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgY2x1c3Rlcl9pbmZvXFxuKyAqIHN0cnVjdHMgdGhhdCBmaXQgaW4gYSBzaW5nbGUgcGFnZSAoYXQgbGVhc3QgMTYpLCBzbyB0aGF0IHRoZSB2bWFsbG9jXFxuKyAqIHBhZ2UgdGFibGVcXG4rICogb3ZlcmhlYWQgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgbWFwcGVkLlxcbisgKi9cXG4rI2RlZmluZSBYU1dBUF9HUk9XX0NMVVNURVJTIFxcXFxcXG4rXFx0bWF4X3QodW5zaWduZWQgbG9uZywgUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyksIDE2KVxcbitcXG4rc3RhdGljIHN0cnVjdCBkZW50cnkgKnhzd2FwX2RlYnVnZnNfcm9vdDtcXG4rXFxuK3N0YXRpYyBpbnQgeHN3YXBfbWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIHVuc2lnbmVkIGxvbmcgbnIpO1xcbitzdGF0aWMgdm9pZCB4c3dhcF91bm1hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucik7XFxuK3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSk7XFxuK3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpO1xcbitzdGF0aWMgdm9pZCB4c3dhcF91cGRhdGVfZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgZnJlZWRfaWR4KTtcXG4rc3RhdGljIHZvaWQgeHN3YXBfdHJ5X3NocmluayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpO1xcbitcXG4rLypcXG4rICogZGVidWdmcyByZWFkL3dyaXRlIGZvciBwZXItZGV2aWNlIG1heCBjbHVzdGVyIGNvdW50LlxcbisgKiBTaG93cy9zZXRzIHNpLVxcdTAwM2Vucl9jbHVzdGVycyAoY3VycmVudCBncm93dGggY2VpbGluZyksIGNsYW1wZWQgdG9cXG4rICogWzAsIHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXhdLlxcbisgKi9cXG4rc3RhdGljIHNzaXplX3QgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuK1xcdGNoYXIgdG1wWzMyXTtcXG4rXFx0aW50IGxlbjtcXG4rXFxuK1xcdGxlbiA9IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksIFxcXCIlbHVcXFxcblxcXCIsIFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnMpKTtcXG4rXFx0cmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcCwgbGVuKTtcXG4rfVxcbitcXG4rc3RhdGljIHNzaXplX3QgeHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLFxcbitcXHRcXHRcXHRcXHRcXHRjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxcbitcXHRcXHRcXHRcXHRcXHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdmFsLCBuZXdfcGFnZXM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRlcnIgPSBrc3RydG91bF9mcm9tX3VzZXIoYnVmLCBjb3VudCwgMCwgXFx1MDAyNnZhbCk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHRpZiAodmFsIFxcdTAwM2Ugc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21heClcXG4rXFx0XFx0dmFsID0gc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21heDtcXG4rXFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbitcXHRzaS1cXHUwMDNlbnJfY2x1c3RlcnMgPSB2YWw7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuK1xcbitcXHQvKiBLZWVwIHRoZSB2aXNpYmxlIHN3YXAgc2l6ZSBpbiBzeW5jIHdpdGggdGhlIG5ldyBjZWlsaW5nLiAqL1xcbitcXHRuZXdfcGFnZXMgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB2YWwgKiBTV0FQRklMRV9DTFVTVEVSLCBzaS1cXHUwMDNlbWF4KTtcXG4rXFx0aWYgKG5ld19wYWdlcylcXG4rXFx0XFx0bmV3X3BhZ2VzLS07XFxuK1xcdGlmIChuZXdfcGFnZXMgIT0gc2ktXFx1MDAzZXBhZ2VzKSB7XFxuK1xcdFxcdGxvbmcgZGVsdGEgPSAobG9uZyluZXdfcGFnZXMgLSAobG9uZylzaS1cXHUwMDNlcGFnZXM7XFxuK1xcbitcXHRcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdFxcdHNpLVxcdTAwM2VwYWdlcyA9IG5ld19wYWdlcztcXG4rXFx0XFx0YXRvbWljX2xvbmdfYWRkKGRlbHRhLCBcXHUwMDI2bnJfc3dhcF9wYWdlcyk7XFxuK1xcdFxcdHRvdGFsX3N3YXBfcGFnZXMgKz0gZGVsdGE7XFxuK1xcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHR9XFxuK1xcbitcXHQvKiBTaHJpbmsgdHJpZ2dlcjogbG93ZXJpbmcgdGhlIGNlaWxpbmcgbWF5IGZyZWUgdGFpbCBjbHVzdGVycy4gKi9cXG4rXFx0c2NoZWR1bGVfd29yayhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcXG4rXFxuK1xcdHJldHVybiBjb3VudDtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xcbitcXHQucmVhZCA9IHhzd2FwX21heF9jbHVzdGVyc19yZWFkLFxcbitcXHQud3JpdGUgPSB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUsXFxuK1xcdC5vcGVuID0gc2ltcGxlX29wZW4sXFxuK1xcdC5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlayxcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkIHhzd2FwX2RlYnVnZnNfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4re1xcbitcXHRjaGFyIG5hbWVbMzJdO1xcbitcXG4rXFx0aWYgKCF4c3dhcF9kZWJ1Z2ZzX3Jvb3QpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXFxcInR5cGUlZF9jbHVzdGVyX2xpbWl0XFxcIiwgc2ktXFx1MDAzZXR5cGUpO1xcbitcXHRzaS1cXHUwMDNlZGVidWdmc19lbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDY0NCwgeHN3YXBfZGVidWdmc19yb290LFxcbitcXHRcXHRcXHRcXHRcXHRcXHRzaSwgXFx1MDAyNnhzd2FwX2RlYnVnZnNfZm9wcyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHhzd2FwX2RlYnVnZnNfZGVsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4re1xcbitcXHRkZWJ1Z2ZzX3JlbW92ZShzaS1cXHUwMDNlZGVidWdmc19lbnRyeSk7XFxuK1xcdHNpLVxcdTAwM2VkZWJ1Z2ZzX2VudHJ5ID0gTlVMTDtcXG4rfVxcbitcXG4rXFxuKyNlbmRpZlxcbiBcXG4gc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpO1xcbkBAIC02Myw5ICsxNzUsOSBAQCBzdGF0aWMgdm9pZCBtb3ZlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiAgKlxcbiAgKiBBbHNvIHByb3RlY3RzIHN3YXBfYWN0aXZlX2hlYWQgdG90YWxfc3dhcF9wYWdlcywgYW5kIHRoZSBTV1BfV1JJVEVPSyBmbGFnLlxcbiAgKi9cXG4tc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spO1xcbiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlcztcXG4gYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xcbithdG9taWNfdCBucl9yZWFsX3N3YXBmaWxlcztcXG4gLypcXG4gICogU29tZSBtb2R1bGVzIHVzZSBzd2FwcGFibGUgb2JqZWN0cyBhbmQgbWF5IHRyeSB0byBzd2FwIHRoZW0gb3V0IHVuZGVyXFxuICAqIG1lbW9yeSBwcmVzc3VyZSAodmlhIHRoZSBzaHJpbmtlcikuIEJlZm9yZSBkb2luZyBzbywgdGhleSBtYXkgd2lzaCB0b1xcbkBAIC02MDksNiArNzIxLDEwIEBAIHN0YXRpYyB2b2lkIF9fZnJlZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvXFxuIFxcdHN3YXBfY2x1c3Rlcl9mcmVlX3RhYmxlKGNpKTtcXG4gXFx0bW92ZV9jbHVzdGVyKHNpLCBjaSwgXFx1MDAyNnNpLVxcdTAwM2VmcmVlX2NsdXN0ZXJzLCBDTFVTVEVSX0ZMQUdfRlJFRSk7XFxuIFxcdGNpLVxcdTAwM2VvcmRlciA9IDA7XFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcXG4rXFx0eHN3YXBfdXBkYXRlX2ZyZWVfdGFpbChzaSwgY2kgLSBzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvKTtcXG4rXFx0c2NoZWR1bGVfd29yayhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcXG4rI2VuZGlmXFxuIH1cXG4gXFxuIC8qXFxuQEAgLTk1NSw2ICsxMDcxLDkgQEAgc3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIFxcdGlmIChjbHVzdGVyX2lzX2VtcHR5KGNpKSlcXG4gXFx0XFx0Y2ktXFx1MDAzZW9yZGVyID0gb3JkZXI7XFxuIFxcdGNpLVxcdTAwM2Vjb3VudCArPSBucl9wYWdlcztcXG4rI2lmZGVmIENPTkZJR19YU1dBUFxcbitcXHR4c3dhcF90cmltX2ZyZWVfdGFpbChzaSwgY2x1c3Rlcl9pbmRleChzaSwgY2kpKTtcXG4rI2VuZGlmXFxuIFxcdHN3YXBfcmFuZ2VfYWxsb2Moc2ksIG5yX3BhZ2VzKTtcXG4gXFxuIFxcdHJldHVybiB0cnVlO1xcbkBAIC0xMTg1LDYgKzEzMDQsNTAgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0XFx0aWYgKGZvdW5kKVxcbiBcXHRcXHRcXHRnb3RvIGRvbmU7XFxuIFxcdH1cXG4rXFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcXG4rXFx0LypcXG4rXFx0ICogRm9yIHhzd2FwOiBpZiBubyBmcmVlIGNsdXN0ZXIgd2FzIGZvdW5kIGFuZCBtb3JlIGNsdXN0ZXJzXFxuK1xcdCAqIGNhbiBiZSBtYXBwZWQsIGdyb3cgdGhlIGNsdXN0ZXJfaW5mbyBhcnJheSBhbmQgcmV0cnkuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWZvdW5kIFxcdTAwMjZcXHUwMDI2IChzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfWFNXQVApIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCkgXFx1MDAzYyBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgbGlzdF9lbXB0eShcXHUwMDI2c2ktXFx1MDAzZWZyZWVfY2x1c3RlcnMpKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnJfbmV3ID0gbWluKFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnMpIC1cXG4rXFx0XFx0XFx0XFx0XFx0ICBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCksXFxuK1xcdFxcdFxcdFxcdFxcdCAgWFNXQVBfR1JPV19DTFVTVEVSUyk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdFxcdGlmICgheHN3YXBfbWFwX2NsdXN0ZXJzKHNpLCBzdGFydCwgbnJfbmV3KSkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFkZGVkID0gMDtcXG4rXFxuK1xcdFxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbitcXHRcXHRcXHRmb3IgKGkgPSBzdGFydDsgaSBcXHUwMDNjIHN0YXJ0ICsgbnJfbmV3OyBpKyspIHtcXG4rXFx0XFx0XFx0XFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IFxcdTAwMjZzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvW2ldO1xcbitcXHRcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFx0XFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0XFx0ICogQSBjb25jdXJyZW50IGdyb3dlciBtYXkgaGF2ZSBhbHJlYWR5IGFkZGVkXFxuK1xcdFxcdFxcdFxcdCAqIHRoZXNlIGNsdXN0ZXJzIHRvIHRoZSBmcmVlIGxpc3QuICBPbmx5IGFkZFxcbitcXHRcXHRcXHRcXHQgKiBjbHVzdGVycyB0aGF0IGFyZSBzdGlsbCBvZmYtbGlzdCAoTk9ORSkuXFxuK1xcdFxcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRcXHRpZiAoY2ktXFx1MDAzZWZsYWdzID09IENMVVNURVJfRkxBR19OT05FKSB7XFxuK1xcdFxcdFxcdFxcdFxcdGNpLVxcdTAwM2VmbGFncyA9IENMVVNURVJfRkxBR19GUkVFO1xcbitcXHRcXHRcXHRcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZjaS1cXHUwMDNlbGlzdCwgXFx1MDAyNnNpLVxcdTAwM2VmcmVlX2NsdXN0ZXJzKTtcXG4rXFx0XFx0XFx0XFx0XFx0YWRkZWQrKztcXG4rXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2Y2ktXFx1MDAzZWxvY2spO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdFxcdFdSSVRFX09OQ0Uoc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCxcXG4rXFx0XFx0XFx0XFx0ICAgUkVBRF9PTkNFKHNpLVxcdTAwM2Vucl9mcmVlX3RhaWwpICsgbnJfbmV3KTtcXG4rXFxuK1xcdFxcdFxcdC8qIFJldHJ5IGFsbG9jYXRpb24gZnJvbSB0aGUgZnJlZSBsaXN0ICovXFxuK1xcdFxcdFxcdGZvdW5kID0gYWxsb2Nfc3dhcF9zY2FuX2xpc3Qoc2ksIFxcdTAwMjZzaS1cXHUwMDNlZnJlZV9jbHVzdGVycyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIGZvbGlvLCBmYWxzZSk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbisjZW5kaWZcXG4gZG9uZTpcXG4gXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxcbiBcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xcbkBAIC0xMjIzLDYgKzEzODYsOCBAQCBzdGF0aWMgdm9pZCBkZWxfZnJvbV9hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb2ZmKVxcbiBcXHRcXHRcXHRnb3RvIHNraXA7XFxuIFxcdH1cXG4gXFxuK1xcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkpXFxuK1xcdFxcdGF0b21pY19zdWIoMSwgXFx1MDAyNm5yX3JlYWxfc3dhcGZpbGVzKTtcXG4gXFx0cGxpc3RfZGVsKFxcdTAwMjZzaS1cXHUwMDNlYXZhaWxfbGlzdCwgXFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XFxuIFxcbiBza2lwOlxcbkBAIC0xMjY1LDYgKzE0MzAsOCBAQCBzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxcbiBcXHR9XFxuIFxcbiBcXHRwbGlzdF9hZGQoXFx1MDAyNnNpLVxcdTAwM2VhdmFpbF9saXN0LCBcXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcXG4rXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKSlcXG4rXFx0XFx0YXRvbWljX2FkZCgxLCBcXHUwMDI2bnJfcmVhbF9zd2FwZmlsZXMpO1xcbiBcXG4gc2tpcDpcXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XFxuQEAgLTI5NTIsNiArMzExOSwxOSBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfZXh0ZW50cyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLFxcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy1cXHUwMDNlaG9zdDtcXG4gXFx0aW50IHJldDtcXG4gXFxuK1xcdGlmIChzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKSB7XFxuK1xcdFxcdCpzcGFuID0gMDtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogeHN3YXAgZGV2aWNlcyBoYXZlIG5vIGJhY2tpbmcgYmxvY2sgZGV2aWNlIGFuZFxcbitcXHRcXHQgKiBwaHlzaWNhbCB3cml0ZW91dCBpcyBza2lwcGVkIGluIHN3YXBfd3JpdGVvdXQoKSxcXG4rXFx0XFx0ICogYnV0IHNpcy1cXHUwMDNlb3BzIG11c3Qgc3RpbGwgYmUgc2V0IHNvIHRoYXQgY2FsbGVyc1xcbitcXHRcXHQgKiBsaWtlIHNocmlua19mb2xpb19saXN0KCkgY2FuIHNhZmVseSBkZXJlZmVyZW5jZVxcbitcXHRcXHQgKiBvcHMtXFx1MDAzZWZsYWdzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0c2lzLVxcdTAwM2VvcHMgPSBcXHUwMDI2c3dhcF9iZGV2X29wcztcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuIFxcdHJldCA9IHNpb19wb29sX2luaXQoKTtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG5AQCAtMzAyMywyMCArMzIwMyw1MCBAQCBzdGF0aWMgdm9pZCB3YWl0X2Zvcl9hbGxvY2F0aW9uKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4gXFxuIFxcdEJVR19PTihzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfV1JJVEVPSyk7XFxuIFxcbisjaWZkZWYgQ09ORklHX1hTV0FQXFxuK1xcdC8qXFxuK1xcdCAqIHhzd2FwIGNsdXN0ZXJzIGJleW9uZCBucl9jbHVzdGVyc19tYXBwZWQgaGF2ZSBiZWVuIHVubWFwcGVkXFxuK1xcdCAqIGJ5IHRoZSBzaHJpbmtlciBhbmQgdGhlaXIgdm1hbGxvYyBwYWdlcyBhcmUgbm8gbG9uZ2VyXFxuK1xcdCAqIGFjY2Vzc2libGUuICBPbmx5IGl0ZXJhdGUgb3ZlciBjdXJyZW50bHkgbWFwcGVkIGNsdXN0ZXJzLlxcbitcXHQgKi9cXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUClcXG4rXFx0XFx0ZW5kID0gbWluKGVuZCwgUkVBRF9PTkNFKHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQpICpcXG4rXFx0XFx0XFx0ICBTV0FQRklMRV9DTFVTVEVSKTtcXG4rI2VuZGlmXFxuK1xcbiBcXHRmb3IgKG9mZnNldCA9IDA7IG9mZnNldCBcXHUwMDNjIGVuZDsgb2Zmc2V0ICs9IFNXQVBGSUxFX0NMVVNURVIpIHtcXG4gXFx0XFx0Y2kgPSBzd2FwX2NsdXN0ZXJfbG9jayhzaSwgb2Zmc2V0KTtcXG4gXFx0XFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XFxuIFxcdH1cXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcXG4tXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcXG4rc3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIHtcXG4rXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8gPSBzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvO1xcbitcXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzID0gc2ktXFx1MDAzZW1heDtcXG4gXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4tXFx0aW50IGksIG5yX2NsdXN0ZXJzID0gRElWX1JPVU5EX1VQKG1heHBhZ2VzLCBTV0FQRklMRV9DTFVTVEVSKTtcXG4rXFx0aW50IGksIG5yX2NsdXN0ZXJzO1xcbiBcXG4gXFx0aWYgKCFjbHVzdGVyX2luZm8pXFxuIFxcdFxcdHJldHVybjtcXG4rXFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkge1xcbitcXHRcXHR4c3dhcF9kZWJ1Z2ZzX2RlbChzaSk7XFxuK1xcdFxcdGNhbmNlbF93b3JrX3N5bmMoXFx1MDAyNnNpLVxcdTAwM2V4c3dhcF9zaHJpbmtfd29yayk7XFxuK1xcdFxcdC8qIFVubWFwIGFsbCBtYXBwZWQgY2x1c3RlcnMgYW5kIGZyZWUgdGhlIFZNX1NQQVJTRSBhcmVhICovXFxuK1xcdFxcdGlmIChzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkIFxcdTAwM2UgMClcXG4rXFx0XFx0XFx0eHN3YXBfdW5tYXBfY2x1c3RlcnMoc2ksIDAsIHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQpO1xcbitcXHRcXHRmcmVlX3ZtX2FyZWEoc2ktXFx1MDAzZWNsdXN0ZXJfdm0pO1xcbitcXHRcXHRzaS1cXHUwMDNlY2x1c3Rlcl92bSA9IE5VTEw7XFxuK1xcdFxcdHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXggPSAwO1xcbitcXHRcXHRzaS1cXHUwMDNlbnJfY2x1c3RlcnMgPSAwO1xcbitcXHRcXHRzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkID0gMDtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuKyNlbmRpZlxcbitcXG4rXFx0bnJfY2x1c3RlcnMgPSBESVZfUk9VTkRfVVAobWF4cGFnZXMsIFNXQVBGSUxFX0NMVVNURVIpO1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfY2x1c3RlcnM7IGkrKykge1xcbiBcXHRcXHRjaSA9IGNsdXN0ZXJfaW5mbyArIGk7XFxuIFxcdFxcdC8qIENsdXN0ZXIgd2l0aCBiYWQgbWFya3MgY291bnQgd2lsbCBoYXZlIGEgcmVtYWluaW5nIHRhYmxlICovXFxuQEAgLTMwNzUsMTEgKzMyODUsOSBAQCBzdGF0aWMgdm9pZCBmbHVzaF9wZXJjcHVfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4gU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxcbiB7XFxuIFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwID0gTlVMTDtcXG4tXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87XFxuIFxcdHN0cnVjdCBmaWxlICpzd2FwX2ZpbGUsICp2aWN0aW07XFxuIFxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nO1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbi1cXHR1bnNpZ25lZCBpbnQgbWF4cGFnZXM7XFxuIFxcdGludCBlcnIsIGZvdW5kID0gMDtcXG4gXFxuIFxcdGlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSlcXG5AQCAtMzE2MCw3ICszMzY4LDggQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxcbiBcXG4gXFx0ZGVzdHJveV9zd2FwX2V4dGVudHMocCwgcC1cXHUwMDNlc3dhcF9maWxlKTtcXG4gXFxuLVxcdGlmICghKHAtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxcbitcXHRpZiAoIShwLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICEocC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfU09MSURTVEFURSkpXFxuIFxcdFxcdGF0b21pY19kZWMoXFx1MDAyNm5yX3JvdGF0ZV9zd2FwKTtcXG4gXFxuIFxcdG11dGV4X2xvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuQEAgLTMxNzAsMTAgKzMzNzksNiBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXFxuIFxcbiBcXHRzd2FwX2ZpbGUgPSBwLVxcdTAwM2Vzd2FwX2ZpbGU7XFxuIFxcdHAtXFx1MDAzZXN3YXBfZmlsZSA9IE5VTEw7XFxuLVxcdG1heHBhZ2VzID0gcC1cXHUwMDNlbWF4O1xcbi1cXHRjbHVzdGVyX2luZm8gPSBwLVxcdTAwM2VjbHVzdGVyX2luZm87XFxuLVxcdHAtXFx1MDAzZW1heCA9IDA7XFxuLVxcdHAtXFx1MDAzZWNsdXN0ZXJfaW5mbyA9IE5VTEw7XFxuIFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwLVxcdTAwM2Vsb2NrKTtcXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuIFxcdGFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC1cXHUwMDNldHlwZSk7XFxuQEAgLTMxODEsNyArMzM4Niw5IEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcXG4gXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzd2Fwb25fbXV0ZXgpO1xcbiBcXHRrZnJlZShwLVxcdTAwM2VnbG9iYWxfY2x1c3Rlcik7XFxuIFxcdHAtXFx1MDAzZWdsb2JhbF9jbHVzdGVyID0gTlVMTDtcXG4tXFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhjbHVzdGVyX2luZm8sIG1heHBhZ2VzKTtcXG4rXFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhwKTtcXG4rXFx0cC1cXHUwMDNlbWF4ID0gMDtcXG4rXFx0cC1cXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcXG4gXFxuIFxcdGlub2RlID0gbWFwcGluZy1cXHUwMDNlaG9zdDtcXG4gXFxuQEAgLTMyNzAsNiArMzQ3NywxOSBAQCBzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxcbiBcXHRtdXRleF91bmxvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuIH1cXG4gXFxuK3N0YXRpYyBjb25zdCBjaGFyICpzd2FwX3R5cGVfc3RyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4re1xcbitcXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNpLVxcdTAwM2Vzd2FwX2ZpbGU7XFxuK1xcbitcXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKVxcbitcXHRcXHRyZXR1cm4gXFxcInhzd2FwXFxcXHRcXFwiO1xcbitcXG4rXFx0aWYgKFNfSVNCTEsoZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9tb2RlKSlcXG4rXFx0XFx0cmV0dXJuIFxcXCJwYXJ0aXRpb25cXFwiO1xcbitcXG4rXFx0cmV0dXJuIFxcXCJmaWxlXFxcXHRcXFwiO1xcbit9XFxuK1xcbiBzdGF0aWMgaW50IHN3YXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXFxuIHtcXG4gXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gdjtcXG5AQCAtMzI4OSw4ICszNTA5LDcgQEAgc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxcbiBcXHRsZW4gPSBzZXFfZmlsZV9wYXRoKHN3YXAsIGZpbGUsIFxcXCIgXFxcXHRcXFxcblxcXFxcXFxcXFxcIik7XFxuIFxcdHNlcV9wcmludGYoc3dhcCwgXFxcIiUqcyVzXFxcXHQlbHVcXFxcdCVzJWx1XFxcXHQlcyVkXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRsZW4gXFx1MDAzYyA0MCA/IDQwIC0gbGVuIDogMSwgXFxcIiBcXFwiLFxcbi1cXHRcXHRcXHRTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktXFx1MDAzZWlfbW9kZSkgP1xcbi1cXHRcXHRcXHRcXHRcXFwicGFydGl0aW9uXFxcIiA6IFxcXCJmaWxlXFxcXHRcXFwiLFxcbitcXHRcXHRcXHRzd2FwX3R5cGVfc3RyKHNpKSxcXG4gXFx0XFx0XFx0Ynl0ZXMsIGJ5dGVzIFxcdTAwM2MgMTAwMDAwMDAgPyBcXFwiXFxcXHRcXFwiIDogXFxcIlxcXCIsXFxuIFxcdFxcdFxcdGludXNlLCBpbnVzZSBcXHUwMDNjIDEwMDAwMDAwID8gXFxcIlxcXFx0XFxcIiA6IFxcXCJcXFwiLFxcbiBcXHRcXHRcXHRzaS1cXHUwMDNlcHJpbyk7XFxuQEAgLTM0NjgsNiArMzY4Nyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzO1xcbiBcXHR1bnNpZ25lZCBsb25nIHN3YXBmaWxlcGFnZXM7XFxuIFxcdHVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlO1xcbitcXHRsb2ZmX3Qgc2l6ZTtcXG4gXFxuIFxcdGlmIChtZW1jbXAoXFxcIlNXQVBTUEFDRTJcXFwiLCBzd2FwX2hlYWRlci1cXHUwMDNlbWFnaWMubWFnaWMsIDEwKSkge1xcbiBcXHRcXHRwcl9lcnIoXFxcIlVuYWJsZSB0byBmaW5kIHN3YXAtc3BhY2Ugc2lnbmF0dXJlXFxcXG5cXFwiKTtcXG5AQCAtMzUxMCw3ICszNzMwLDE2IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXG4gXFx0aWYgKCFtYXhwYWdlcylcXG4gXFx0XFx0cmV0dXJuIDA7XFxuLVxcdHN3YXBmaWxlcGFnZXMgPSBpX3NpemVfcmVhZChpbm9kZSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFxuK1xcdHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7XFxuK1xcdGlmIChzaXplID09IFBBR0VfU0laRSkge1xcbitcXHRcXHQvKiB4c3dhcDogYSBzd2FwIGRldmljZSB3aXRoIG5vIGJhY2tpbmcgc3RvcmFnZSAqL1xcbitcXHRcXHRzaS1cXHUwMDNlYmRldiA9IE5VTEw7XFxuK1xcdFxcdHNpLVxcdTAwM2VmbGFncyB8PSBTV1BfWFNXQVAgfCBTV1BfU09MSURTVEFURTtcXG4rXFx0XFx0cmV0dXJuIG1heHBhZ2VzO1xcbitcXHR9XFxuK1xcbitcXHRzd2FwZmlsZXBhZ2VzID0gc2l6ZSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiBcXHRpZiAoc3dhcGZpbGVwYWdlcyBcXHUwMDI2XFx1MDAyNiBtYXhwYWdlcyBcXHUwMDNlIHN3YXBmaWxlcGFnZXMpIHtcXG4gXFx0XFx0cHJfd2FybihcXFwiU3dhcCBhcmVhIHNob3J0ZXIgdGhhbiBzaWduYXR1cmUgaW5kaWNhdGVzXFxcXG5cXFwiKTtcXG4gXFx0XFx0cmV0dXJuIDA7XFxuQEAgLTM1MjMsNiArMzc1MiwzNjUgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIFxcdHJldHVybiBtYXhwYWdlcztcXG4gfVxcbiBcXG4rI2lmZGVmIENPTkZJR19YU1dBUFxcbitzdGF0aWMgaW50IHhzd2FwX21hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuK1xcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLVxcdTAwM2VjbHVzdGVyX2luZm8gK1xcbitcXHRcXHRcXHRcXHQgICAoc2l6ZV90KXN0YXJ0X2lkeCAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pO1xcbitcXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciArIChzaXplX3QpbnIgKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTtcXG4rXFx0LypcXG4rXFx0ICogdm1fYXJlYV9tYXBfcGFnZXMoKSByZXF1aXJlcyB0aGF0IHN0YXJ0IGFuZCBlbmQgYmUgcGFnZS1hbGlnbmVkLlxcbitcXHQgKiBJZiBzdGFydF9hZGRyIGZhbGxzIHdpdGhpbiBhIHBhZ2UgdGhhdCB3YXMgYWxyZWFkeSBtYXBwZWQgYnkgYVxcbitcXHQgKiBwcmV2aW91cyBiYXRjaCAoZ3JvdyBwYXRoKSwgcm91bmQgaXQgdXAgdG8gc2tpcCB0aGUgYWxyZWFkeS1tYXBwZWRcXG4rXFx0ICogcGFydGlhbCBwYWdlLiAgQWx3YXlzIHJvdW5kIGVuZF9hZGRyIHVwIHNvIHRoZSB2bWFwIHBhZ2UgdGFibGUgd2Fsa1xcbitcXHQgKiB0ZXJtaW5hdGVzIGNvcnJlY3RseSAodGhlIHdhbGsgbG9vcCBleGl0cyB3aGVuIGFkZHIgPT0gZW5kLCBhbmQgYWRkclxcbitcXHQgKiBhZHZhbmNlcyBieSBQQUdFX1NJWkUgZWFjaCBpdGVyYXRpb24pLlxcbitcXHQgKi9cXG4rXFx0dW5zaWduZWQgbG9uZyB2bV9zdGFydCA9IFBBR0VfQUxJR04oc3RhcnRfYWRkcik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1fZW5kID0gUEFHRV9BTElHTihlbmRfYWRkcik7XFxuK1xcdHVuc2lnbmVkIGludCBub3JlY2xhaW1fZmxhZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnBhZ2VzO1xcbitcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcbitcXHRpZiAodm1fc3RhcnQgXFx1MDAzZT0gdm1fZW5kKSB7XFxuK1xcdFxcdC8qIEFsbCByZXF1ZXN0ZWQgY2x1c3RlcnMgZmFsbCB3aXRoaW4gYWxyZWFkeS1tYXBwZWQgcGFnZXMuICovXFxuK1xcdFxcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcXHUwMDNjIHN0YXJ0X2lkeCArIG5yOyBpKyspXFxuK1xcdFxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvW2ldLmxvY2spO1xcbitcXHRcXHRXUklURV9PTkNFKHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCArIG5yKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRucGFnZXMgPSAodm1fZW5kIC0gdm1fc3RhcnQpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBQcmV2ZW50IHJlY3Vyc2l2ZSByZWNsYWltOiB2bV9hcmVhX21hcF9wYWdlcygpIGludGVybmFsbHlcXG4rXFx0ICogYWxsb2NhdGVzIHBhZ2UgdGFibGVzIHdpdGggR0ZQX1BHVEFCTEVfS0VSTkVMLCB3aGljaCBsYWNrc1xcbitcXHQgKiBfX0dGUF9OT01FTUFMTE9DLiAgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSBlbnN1cmVzIHRob3NlXFxuK1xcdCAqIGFsbG9jYXRpb25zIGNhbm5vdCByZWN1cnNlIGludG8gc3dhcCBieSBkaXNhYmxpbmcgX19HRlBfRlMvSU8uXFxuK1xcdCAqL1xcbitcXHRub3JlY2xhaW1fZmxhZ3MgPSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpO1xcbitcXG4rXFx0cGFnZXMgPSBrbWFsbG9jX2FycmF5KG5wYWdlcywgc2l6ZW9mKCpwYWdlcyksXFxuK1xcdFxcdFxcdCAgICAgIF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHwgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghcGFnZXMpIHtcXG4rXFx0XFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnBhZ2VzOyBpKyspIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogX19HRlBfWkVSTyBpcyBjcml0aWNhbDogY2x1c3Rlcl9pbmZvIHN0cnVjdHMgY29udGFpbiBwb2ludGVyXFxuK1xcdFxcdCAqIGZpZWxkcyAoZXh0ZW5kX3RhYmxlLCB6ZXJvX2JpdG1hcCwgbWVtY2dfdGFibGUsIHRhYmxlKSB0aGF0XFxuK1xcdFxcdCAqIG11c3Qgc3RhcnQgYXMgTlVMTC4gIFdpdGhvdXQgemVyb2luZywgc3RhbGUgZGF0YSBmcm9tIGFcXG4rXFx0XFx0ICogcHJldmlvdXMgdXNlciBvZiB0aGUgcGFnZSB3b3VsZCBsb29rIGxpa2UgdmFsaWQgcG9pbnRlcnMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRwYWdlc1tpXSA9IGFsbG9jX3BhZ2UoX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfFxcbitcXHRcXHRcXHRcXHQgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XFxuK1xcdFxcdGlmICghcGFnZXNbaV0pXFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQ2hlY2sgaWYgdGhlIHRhcmdldCBwYWdlcyBhcmUgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50XFxuK1xcdCAqIGdyb3dlci4gIFdlIG11c3QgZG8gdGhpcyBhZnRlciBwYWdlIGFsbG9jYXRpb24gYmVjYXVzZVxcbitcXHQgKiBhbGxvY19wYWdlKEdGUF9LRVJORUwpIGNhbiBzbGVlcCwgb3BlbmluZyBhIHJhY2Ugd2luZG93LlxcbitcXHQgKiBJZiBzb21lb25lIGFscmVhZHkgbWFwcGVkIHRoZXNlIHBhZ2VzLCBmcmVlIG91cnMgYW5kIGNvbnRpbnVlLlxcbitcXHQgKi9cXG4rXFx0aWYgKGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoXFx1MDAyNmluaXRfbW0sIHZtX3N0YXJ0LFxcbitcXHRcXHRcXHRcXHRcXHQgdm1fZW5kIC0gdm1fc3RhcnQsXFxuK1xcdFxcdFxcdFxcdFxcdCB4c3dhcF9jaGVja19tYXBwZWQsIE5VTEwpKSB7XFxuK1xcdFxcdGkgPSBucGFnZXM7XFxuK1xcdFxcdGdvdG8gZmFpbF9ub3VubWFwO1xcbitcXHR9XFxuK1xcbitcXHRpbnQgZXJyID0gdm1fYXJlYV9tYXBfcGFnZXMoc2ktXFx1MDAzZWNsdXN0ZXJfdm0sIHZtX3N0YXJ0LCB2bV9lbmQsIHBhZ2VzKTtcXG4rXFx0aWYgKGVycikge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiAtRUJVU1kgbWVhbnMgdGhlIFBURXMgYXJlIGFscmVhZHkgcHJlc2VudDpcXG4rXFx0XFx0ICogYW5vdGhlciB0aHJlYWQgcmFjZWQgd2l0aCB1cyBhbmQgbWFwcGVkIHRoZVxcbitcXHRcXHQgKiBzYW1lIHBhZ2VzIGJldHdlZW4gb3VyIGNoZWNrIGFib3ZlIGFuZCB0aGlzXFxuK1xcdFxcdCAqIGNhbGwuICBUcmVhdCBhcyBzdWNjZXNzIOKAlCBmcmVlIG91ciB1bnVzZWRcXG4rXFx0XFx0ICogcGFnZXMgYW5kIGNvbnRpbnVlLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKGVyciA9PSAtRUJVU1kpIHtcXG4rXFx0XFx0XFx0aSA9IG5wYWdlcztcXG4rXFx0XFx0XFx0Z290byBmYWlsX25vdW5tYXA7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aSA9IG5wYWdlczsgLyogZnJlZSBhbGwgcGFnZXMgb24gZmFpbHVyZSAqL1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGtmcmVlKHBhZ2VzKTtcXG4rXFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcXG4rXFxuK1xcdC8qIEluaXRpYWxpemUgc3BpbmxvY2tzIGZvciBuZXdseSBtYXBwZWQgY2x1c3RlcnMgKi9cXG4rXFx0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFxcdTAwM2Mgc3RhcnRfaWR4ICsgbnI7IGkrKylcXG4rXFx0XFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNnNpLVxcdTAwM2VjbHVzdGVyX2luZm9baV0ubG9jayk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxcbitcXHQgKi9cXG4rXFx0V1JJVEVfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggKyBucik7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX2xvY2spO1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2ZhaWxfbm91bm1hcDpcXG4rXFx0LypcXG4rXFx0ICogUGFnZXMgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50IGdyb3dlci4gIEZyZWUgb3VyIHVudXNlZFxcbitcXHQgKiBwYWdlcywgdGhlbiBmYWxsIHRocm91Z2ggdG8gaW5pdGlhbGl6ZSBzcGlubG9ja3MuICBUaGUgdm1hbGxvY1xcbitcXHQgKiBQVEVzIG5vdyBwb2ludCB0byB0aGUgY29uY3VycmVudCBncm93ZXIncyBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdHdoaWxlIChpIFxcdTAwM2UgMCkge1xcbitcXHRcXHRpLS07XFxuK1xcdFxcdGlmIChwYWdlc1tpXSlcXG4rXFx0XFx0XFx0X19mcmVlX3BhZ2UocGFnZXNbaV0pO1xcbitcXHR9XFxuK1xcdGtmcmVlKHBhZ2VzKTtcXG4rXFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcXG4rXFxuK1xcdC8qIEluaXRpYWxpemUgc3BpbmxvY2tzIGZvciBuZXdseSBtYXBwZWQgY2x1c3RlcnMgKi9cXG4rXFx0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFxcdTAwM2Mgc3RhcnRfaWR4ICsgbnI7IGkrKylcXG4rXFx0XFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNnNpLVxcdTAwM2VjbHVzdGVyX2luZm9baV0ubG9jayk7XFxuK1xcbitcXHRXUklURV9PTkNFKHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCArIG5yKTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZmFpbDpcXG4rXFx0d2hpbGUgKGkgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGktLTtcXG4rXFx0XFx0aWYgKHBhZ2VzW2ldKVxcbitcXHRcXHRcXHRfX2ZyZWVfcGFnZShwYWdlc1tpXSk7XFxuK1xcdH1cXG4rXFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcXG4rXFx0a2ZyZWUocGFnZXMpO1xcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNnNpLVxcdTAwM2V4c3dhcF9sb2NrKTtcXG4rXFx0cmV0dXJuIC1FTk9NRU07XFxuK31cXG4rXFxuK3N0cnVjdCB4c3dhcF9wYWdlX2RhdGEge1xcbitcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xcbitcXHRpbnQgbnI7XFxuK1xcdGludCBtYXg7XFxuK307XFxuK1xcbitzdGF0aWMgaW50IHhzd2FwX2NvbGxlY3RfcGFnZShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRhdGEpXFxuK3tcXG4rXFx0c3RydWN0IHhzd2FwX3BhZ2VfZGF0YSAqeHBkID0gZGF0YTtcXG4rXFxuK1xcdGlmICghcHRlX3ByZXNlbnQoKnB0ZSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRpZiAoeHBkLVxcdTAwM2VuciBcXHUwMDNjIHhwZC1cXHUwMDNlbWF4KVxcbitcXHRcXHR4cGQtXFx1MDAzZXBhZ2VzW3hwZC1cXHUwMDNlbnIrK10gPSBwdGVfcGFnZSgqcHRlKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHhzd2FwX3VubWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLVxcdTAwM2VjbHVzdGVyX2luZm8gK1xcbitcXHRcXHRcXHRcXHQgICAoc2l6ZV90KXN0YXJ0X2lkeCAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pO1xcbitcXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciArIChzaXplX3QpbnIgKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTtcXG4rXFx0LypcXG4rXFx0ICogUm91bmQgdG8gcGFnZSBib3VuZGFyaWVzOiBzdGFydCB1cCAoc2tpcCBwYXJ0aWFsIHBhZ2UgdGhhdCBtYXlcXG4rXFx0ICogY29udGFpbiBjbHVzdGVycyBzdGlsbCBpbiB1c2UgYmVmb3JlIHN0YXJ0X2lkeCksIGVuZCB1cCBzbyB0aGVcXG4rXFx0ICogZW50aXJlIHJhbmdlIGlzIGNvdmVyZWQuICB2bV9hcmVhX3VubWFwX3BhZ2VzKCkgYW5kXFxuK1xcdCAqIGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoKSBvcGVyYXRlIG9uIHdob2xlIHBhZ2VzLlxcbitcXHQgKi9cXG4rXFx0dW5zaWduZWQgbG9uZyB2bV9zdGFydCA9IFBBR0VfQUxJR04oc3RhcnRfYWRkcik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1fZW5kID0gUEFHRV9BTElHTihlbmRfYWRkcik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2l6ZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBucGFnZXM7XFxuK1xcdHN0cnVjdCB4c3dhcF9wYWdlX2RhdGEgeHBkO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNnNpLVxcdTAwM2V4c3dhcF9sb2NrKTtcXG4rXFxuK1xcdGlmICh2bV9zdGFydCBcXHUwMDNlPSB2bV9lbmQpIHtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRzaXplID0gdm1fZW5kIC0gdm1fc3RhcnQ7XFxuK1xcdG5wYWdlcyA9IHNpemUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFdhbGsgdGhlIHBhZ2UgdGFibGUgdG8gY29sbGVjdCBwaHlzaWNhbCBwYWdlcyBiZWZvcmUgdW5tYXBwaW5nLlxcbitcXHQgKiB2bV9hcmVhX3VubWFwX3BhZ2VzKCkgb25seSBjbGVhcnMgUFRFcyBhbmQgZnJlZXMgaW50ZXJtZWRpYXRlXFxuK1xcdCAqIHBhZ2UgdGFibGUgcGFnZXMg4oCUIGl0IGRvZXMgbm90IGZyZWUgYmFja2luZyBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdHhwZC5wYWdlcyA9IGttYWxsb2NfYXJyYXkobnBhZ2VzLCBzaXplb2YoKnhwZC5wYWdlcyksIEdGUF9LRVJORUwpO1xcbitcXHRpZiAoeHBkLnBhZ2VzKSB7XFxuK1xcdFxcdHhwZC5uciA9IDA7XFxuK1xcdFxcdHhwZC5tYXggPSBucGFnZXM7XFxuK1xcdFxcdGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoXFx1MDAyNmluaXRfbW0sIHZtX3N0YXJ0LCBzaXplLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHhzd2FwX2NvbGxlY3RfcGFnZSwgXFx1MDAyNnhwZCk7XFxuK1xcdH1cXG4rXFxuK1xcdHZtX2FyZWFfdW5tYXBfcGFnZXMoc2ktXFx1MDAzZWNsdXN0ZXJfdm0sIHZtX3N0YXJ0LCB2bV9lbmQpO1xcbitcXG4rXFx0LyogRnJlZSB0aGUgY29sbGVjdGVkIGJhY2tpbmcgcGFnZXMgKi9cXG4rXFx0aWYgKHhwZC5wYWdlcykge1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgeHBkLm5yOyBpKyspXFxuK1xcdFxcdFxcdF9fZnJlZV9wYWdlKHhwZC5wYWdlc1tpXSk7XFxuK1xcdFxcdGtmcmVlKHhwZC5wYWdlcyk7XFxuK1xcdH1cXG4rXFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX2xvY2spO1xcbitcXG4rb3V0OlxcbitcXHQvKlxcbitcXHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxcbitcXHQgKi9cXG4rXFx0V1JJVEVfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHgpO1xcbit9XFxuK1xcbisvKlxcbisgKiBDYWxsYmFjayBmb3IgYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZSgpOiByZXR1cm4gMSB0byBzdG9wIGF0IHRoZVxcbisgKiBmaXJzdCBwcmVzZW50IFBURSwgc2lnbmFsbGluZyB0aGF0IHRoZSByYW5nZSBpcyBhbHJlYWR5IG1hcHBlZC5cXG4rICovXFxuK3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHRyZXR1cm4gMTtcXG4rfVxcbitcXG4rLypcXG4rICogTWFpbnRhaW4gc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCwgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgY2x1c3RlcnMgYXRcXG4rICogdGhlIHRhaWwgb2YgdGhlIG1hcHBlZCByYW5nZS4gIENhbGxlZCB3aGVuIGEgY2x1c3RlciBhdCBAZnJlZWRfaWR4IGlzXFxuKyAqIGZyZWVkLiAgUHJvdmlkZXMgTygxKSBzaHJpbmsgZGV0ZWN0aW9uOiBpZiBucl9mcmVlX3RhaWwgaXMgbm9uLXplcm8sXFxuKyAqIHRoZSB0YWlsIGNhbiBiZSB1bm1hcHBlZCB3aXRob3V0IHNjYW5uaW5nIGNsdXN0ZXJfaW5mb1tdLlxcbisgKlxcbisgKiBPbmx5IGluY3JlbWVudHMgd2hlbiBAZnJlZWRfaWR4IGlzIHRoZSBjbHVzdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGVcXG4rICogZXhpc3RpbmcgdGFpbCByZWdpb24uICBUaGVuIHNjYW5zIGJhY2t3YXJkcyBmb3IgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzXFxuKyAqIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwsIGJvdW5kZWQgYnkgWFNXQVBfR1JPV19DTFVTVEVSUyBhdCBhIHRpbWUuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB4c3dhcF91cGRhdGVfZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBmcmVlZF9pZHgpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9tYXBwZWQsIG5yX3RhaWwsIHRpZCwgaTtcXG4rXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4rXFxuK1xcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG5yX21hcHBlZCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcXG4rXFx0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfZnJlZV90YWlsKTtcXG4rXFxuK1xcdC8qIFByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHNocmluayB0aGF0IHJhY2VzIHBhc3QgdXMgKi9cXG4rXFx0aWYgKG5yX3RhaWwgXFx1MDAzZT0gbnJfbWFwcGVkKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHR0aWQgPSBucl9tYXBwZWQgLSBucl90YWlsIC0gMTtcXG4rXFxuK1xcdC8qIE9ubHkgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0YWlsIHJlZ2lvbiBjb3VudHMgKi9cXG4rXFx0aWYgKGZyZWVkX2lkeCAhPSB0aWQpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG5yX3RhaWwrKztcXG4rXFx0V1JJVEVfT05DRShzaS1cXHUwMDNlbnJfZnJlZV90YWlsLCBucl90YWlsKTtcXG4rXFxuK1xcdC8qIEV4dGVuZDogaW5jbHVkZSBhbHJlYWR5LWZyZWUgY2x1c3RlcnMgbm93IGNvbm5lY3RlZCB0byB0aGUgdGFpbCAqL1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUzsgaSsrKSB7XFxuK1xcdFxcdG5yX21hcHBlZCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcXG4rXFx0XFx0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfZnJlZV90YWlsKTtcXG4rXFx0XFx0aWYgKG5yX3RhaWwgXFx1MDAzZT0gbnJfbWFwcGVkIC0gMSlcXG4rXFx0XFx0XFx0YnJlYWs7IC8qIHJlYWNoZWQgY2x1c3RlciAwICovXFxuK1xcdFxcdHRpZCA9IG5yX21hcHBlZCAtIG5yX3RhaWwgLSAxO1xcbitcXHRcXHRjaSA9IFxcdTAwMjZzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvW3RpZF07XFxuK1xcbitcXHRcXHRpZiAoUkVBRF9PTkNFKGNpLVxcdTAwM2Vjb3VudCkgfHxcXG4rXFx0XFx0ICAgIFJFQURfT05DRShjaS1cXHUwMDNlZmxhZ3MpICE9IENMVVNURVJfRkxBR19GUkVFKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0bnJfdGFpbCsrO1xcbitcXHRcXHRXUklURV9PTkNFKHNpLVxcdTAwM2Vucl9mcmVlX3RhaWwsIG5yX3RhaWwpO1xcbitcXHR9XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRyaW0gc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCB3aGVuIGEgY2x1c3RlciBpbiB0aGUgdGFpbCByZWdpb24gaXMgYWxsb2NhdGVkLlxcbisgKiBAaWR4OiBpbmRleCBvZiB0aGUgY2x1c3RlciBiZWluZyBhbGxvY2F0ZWQuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB4c3dhcF90cmltX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGxvbmcgaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnJfbWFwcGVkLCBucl90YWlsLCB0YWlsX3N0YXJ0O1xcbitcXG4rXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LypcXG4rXFx0ICogbnJfY2x1c3RlcnNfbWFwcGVkIGFuZCBucl9mcmVlX3RhaWwgYXJlIHJlYWQgbG9ja2xlc3NseTtcXG4rXFx0ICogY29uY3VycmVudCB1cGRhdGVzIG1heSBjYXVzZSBucl9mcmVlX3RhaWwgdG8gYmUgdHJpbW1lZFxcbitcXHQgKiBzbGlnaHRseSBsZXNzIHRoYW4gaWRlYWxseSwgd2hpY2ggaXMgaGFybWxlc3MuXFxuK1xcdCAqL1xcbitcXHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XFxuK1xcdG5yX3RhaWwgPSBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCk7XFxuK1xcdHRhaWxfc3RhcnQgPSBucl9tYXBwZWQgLSBucl90YWlsO1xcbitcXHRpZiAoaWR4IFxcdTAwM2U9IHRhaWxfc3RhcnQpXFxuK1xcdFxcdFdSSVRFX09OQ0Uoc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfbWFwcGVkIC0gaWR4IC0gMSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHhzd2FwX3Nocmlua193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBjb250YWluZXJfb2Yod29yayxcXG4rXFx0XFx0XFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QsIHhzd2FwX3Nocmlua193b3JrKTtcXG4rXFx0eHN3YXBfdHJ5X3NocmluayhzaSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRyeSB0byBzaHJpbmsgdGhlIGNsdXN0ZXJfaW5mbyB0YWlsLiAgVXNlcyBzaS1cXHUwMDNlbnJfZnJlZV90YWlsIHdoaWNoXFxuKyAqIGlzIG1haW50YWluZWQgaW5jcmVtZW50YWxseSBkdXJpbmcgYWxsb2MvZnJlZSDigJQgbm8gc2Nhbm5pbmcgbmVlZGVkLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgeHN3YXBfdHJ5X3NocmluayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9tYXBwZWQsIG5yX2NlaWxpbmcsIG5yX3RhaWwsIG5yX3VubWFwO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgaTtcXG4rXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4rXFxuK1xcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG5yX21hcHBlZCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcXG4rXFx0bnJfY2VpbGluZyA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnMpO1xcbitcXHRucl90YWlsID0gUkVBRF9PTkNFKHNpLVxcdTAwM2Vucl9mcmVlX3RhaWwpO1xcbitcXG4rXFx0aWYgKG5yX21hcHBlZCBcXHUwMDNjPSBucl9jZWlsaW5nKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChucl90YWlsIFxcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0bnJfdW5tYXAgPSBtaW4ocm91bmRfZG93bihucl90YWlsLCBYU1dBUF9HUk9XX0NMVVNURVJTKSxcXG4rXFx0XFx0ICAgICAgIG5yX21hcHBlZCAtIG5yX2NlaWxpbmcpO1xcbitcXHRpZiAobnJfdW5tYXAgXFx1MDAzYyBYU1dBUF9HUk9XX0NMVVNURVJTKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHN0YXJ0X2lkeCA9IG5yX21hcHBlZCAtIG5yX3VubWFwO1xcbitcXG4rXFx0LyogVmVyaWZ5IHRoZSB0YWlsIGNsdXN0ZXJzIGFyZSBzdGlsbCBmcmVlIGJlZm9yZSB1bm1hcHBpbmcgKi9cXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuK1xcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcXHUwMDNjIG5yX21hcHBlZDsgaSsrKSB7XFxuK1xcdFxcdGNpID0gXFx1MDAyNnNpLVxcdTAwM2VjbHVzdGVyX2luZm9baV07XFxuK1xcdFxcdGlmIChjaS1cXHUwMDNlZmxhZ3MgIT0gQ0xVU1RFUl9GTEFHX0ZSRUUpIHtcXG4rXFx0XFx0XFx0bnJfdW5tYXAgPSBpIC0gc3RhcnRfaWR4O1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRsaXN0X2RlbChcXHUwMDI2Y2ktXFx1MDAzZWxpc3QpO1xcbitcXHRcXHRjaS1cXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORTtcXG4rXFx0fVxcbitcXHRzcGluX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbitcXG4rXFx0aWYgKG5yX3VubWFwIFxcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0eHN3YXBfdW5tYXBfY2x1c3RlcnMoc2ksIHN0YXJ0X2lkeCwgbnJfdW5tYXApO1xcbitcXHRXUklURV9PTkNFKHNpLVxcdTAwM2Vucl9mcmVlX3RhaWwsIG5yX3RhaWwgLSBucl91bm1hcCk7XFxuK31cXG4rI2VuZGlmIC8qIENPTkZJR19YU1dBUCAqL1xcbitcXG4gc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRcXHRcXHQgICAgdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxcbiBcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcXG5AQCAtMzUzMiw2ICs0MTIwLDcwIEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0aW50IGVyciA9IC1FTk9NRU07XFxuIFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4gXFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHNpemUgPSBQQUdFX0FMSUdOKG5yX2NsdXN0ZXJzICogc2l6ZW9mKCpjbHVzdGVyX2luZm8pKTtcXG4rXFx0XFx0c3RydWN0IHZtX3N0cnVjdCAqdm07XFxuK1xcbitcXHRcXHR2bSA9IGdldF92bV9hcmVhKHNpemUsIFZNX1NQQVJTRSk7XFxuK1xcdFxcdGlmICghdm0pXFxuK1xcdFxcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0XFx0Y2x1c3Rlcl9pbmZvID0gdm0tXFx1MDAzZWFkZHI7XFxuK1xcdFxcdHNpLVxcdTAwM2VjbHVzdGVyX3ZtID0gdm07XFxuK1xcdFxcdHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXggPSBucl9jbHVzdGVycztcXG4rXFx0XFx0c2ktXFx1MDAzZW5yX2NsdXN0ZXJzID0gbnJfY2x1c3RlcnM7XFxuK1xcdFxcdHNpLVxcdTAwM2VjbHVzdGVyX2luZm8gPSBjbHVzdGVyX2luZm87XFxuK1xcbitcXHRcXHQvKiBNYXAgdGhlIGluaXRpYWwgY2h1bmsgKGF0IGxlYXN0IGNsdXN0ZXIgMCkgKi9cXG4rXFx0XFx0aWYgKHhzd2FwX21hcF9jbHVzdGVycyhzaSwgMCwgbWluX3QodW5zaWduZWQgbG9uZyxcXG4rXFx0XFx0XFx0XFx0XFx0WFNXQVBfR1JPV19DTFVTVEVSUywgbnJfY2x1c3RlcnMpKSlcXG4rXFx0XFx0XFx0Z290byBlcnJfZnJlZV92bTtcXG4rXFxuK1xcdFxcdC8qIHhzd2FwOiBvbmx5IGNsdXN0ZXIgMCBzbG90IDAgaXMgYmFkICovXFxuK1xcdFxcdGVyciA9IHN3YXBfY2x1c3Rlcl9zZXR1cF9iYWRfc2xvdChzaSwgY2x1c3Rlcl9pbmZvLCAwLCBmYWxzZSk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdGdvdG8gZXJyX3VubWFwO1xcbitcXG4rXFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2VmcmVlX2NsdXN0ZXJzKTtcXG4rXFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2VmdWxsX2NsdXN0ZXJzKTtcXG4rXFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2VkaXNjYXJkX2NsdXN0ZXJzKTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFNXQVBfTlJfT1JERVJTOyBpKyspIHtcXG4rXFx0XFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2Vub25mdWxsX2NsdXN0ZXJzW2ldKTtcXG4rXFx0XFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2VmcmFnX2NsdXN0ZXJzW2ldKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogTWFyayBtYXBwZWQgY2x1c3RlcnM6IGNsdXN0ZXIgMCBoYXMgMSBiYWQgc2xvdCwgcmVzdCBmcmVlICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkOyBpKyspIHtcXG4rXFx0XFx0XFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IFxcdTAwMjZjbHVzdGVyX2luZm9baV07XFxuK1xcbitcXHRcXHRcXHRpZiAoaSA9PSAwKSB7XFxuK1xcdFxcdFxcdFxcdGNpLVxcdTAwM2VmbGFncyA9IENMVVNURVJfRkxBR19OT05GVUxMO1xcbitcXHRcXHRcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZjaS1cXHUwMDNlbGlzdCwgXFx1MDAyNnNpLVxcdTAwM2Vub25mdWxsX2NsdXN0ZXJzWzBdKTtcXG4rXFx0XFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0XFx0Y2ktXFx1MDAzZWZsYWdzID0gQ0xVU1RFUl9GTEFHX0ZSRUU7XFxuK1xcdFxcdFxcdFxcdGxpc3RfYWRkX3RhaWwoXFx1MDAyNmNpLVxcdTAwM2VsaXN0LCBcXHUwMDI2c2ktXFx1MDAzZWZyZWVfY2x1c3RlcnMpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIEFsbCBtYXBwZWQgY2x1c3RlcnMgZXhjZXB0IGNsdXN0ZXIgMCBhcmUgZnJlZSBhdCB0aGUgdGFpbCAqL1xcbitcXHRcXHRzaS1cXHUwMDNlbnJfZnJlZV90YWlsID0gc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCAtIDE7XFxuK1xcbitcXHRcXHRtdXRleF9pbml0KFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdFxcdElOSVRfV09SSyhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX3Nocmlua193b3JrLCB4c3dhcF9zaHJpbmtfd29ya19mbik7XFxuK1xcdFxcdHhzd2FwX2RlYnVnZnNfYWRkKHNpKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitlcnJfdW5tYXA6XFxuK1xcdFxcdHhzd2FwX3VubWFwX2NsdXN0ZXJzKHNpLCAwLCBzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcXG4rZXJyX2ZyZWVfdm06XFxuK1xcdFxcdGZyZWVfdm1fYXJlYShzaS1cXHUwMDNlY2x1c3Rlcl92bSk7XFxuK1xcdFxcdHNpLVxcdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcXG4rXFx0XFx0c2ktXFx1MDAzZWNsdXN0ZXJfaW5mbyA9IE5VTEw7XFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rI2VuZGlmIC8qIENPTkZJR19YU1dBUCAqL1xcbitcXG4gXFx0Y2x1c3Rlcl9pbmZvID0ga3Z6YWxsb2Nfb2JqcygqY2x1c3Rlcl9pbmZvLCBucl9jbHVzdGVycyk7XFxuIFxcdGlmICghY2x1c3Rlcl9pbmZvKVxcbiBcXHRcXHRnb3RvIGVycjtcXG5AQCAtMzU5OSw3ICs0MjUxLDcgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvID0gY2x1c3Rlcl9pbmZvO1xcbiBcXHRyZXR1cm4gMDtcXG4gZXJyOlxcbi1cXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xcbitcXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHNpKTtcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG5AQCAtMzgxOCw3ICs0NDcwLDcgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gXFx0c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyID0gTlVMTDtcXG4gXFx0aW5vZGUgPSBOVUxMO1xcbiBcXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhzaSwgc3dhcF9maWxlKTtcXG4tXFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvLCBzaS1cXHUwMDNlbWF4KTtcXG4rXFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzaSk7XFxuIFxcdHNpLVxcdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xcbiBcXHQvKlxcbiBcXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xcbkBAIC0zOTMwLDcgKzQ1ODIsNiBAQCB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKVxcbiBzdGF0aWMgaW50IF9faW5pdCBzd2FwZmlsZV9pbml0KHZvaWQpXFxuIHtcXG4gXFx0c3dhcGZpbGVfbWF4aW11bV9zaXplID0gYXJjaF9tYXhfc3dhcGZpbGVfc2l6ZSgpO1xcbi1cXG4gXFx0LypcXG4gXFx0ICogT25jZSBhIGNsdXN0ZXIgaXMgZnJlZWQsIGl0J3Mgc3dhcCB0YWJsZSBjb250ZW50IGlzIHJlYWRcXG4gXFx0ICogb25seSwgYW5kIGFsbCBzd2FwIGNhY2hlIHJlYWRlcnMgKHN3YXBfY2FjaGVfKikgdmVyaWZpZXNcXG5AQCAtMzk0MCwxMiArNDU5MSwxNSBAQCBzdGF0aWMgaW50IF9faW5pdCBzd2FwZmlsZV9pbml0KHZvaWQpXFxuIFxcdFxcdHN3YXBfdGFibGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoXFxcInN3YXBfdGFibGVcXFwiLFxcbiBcXHRcXHRcXHRcXHQgICAgc2l6ZW9mKHN0cnVjdCBzd2FwX3RhYmxlKSxcXG4gXFx0XFx0XFx0XFx0ICAgIDAsIFNMQUJfUEFOSUMgfCBTTEFCX1RZUEVTQUZFX0JZX1JDVSwgTlVMTCk7XFxuLVxcbiAjaWZkZWYgQ09ORklHX01JR1JBVElPTlxcbiBcXHRpZiAoc3dhcGZpbGVfbWF4aW11bV9zaXplIFxcdTAwM2U9ICgxVUwgXFx1MDAzY1xcdTAwM2MgU1dQX01JR19UT1RBTF9CSVRTKSlcXG4gXFx0XFx0c3dhcF9taWdyYXRpb25fYWRfc3VwcG9ydGVkID0gdHJ1ZTtcXG4gI2VuZGlmXFx0LyogQ09ORklHX01JR1JBVElPTiAqL1xcbiBcXG4rI2lmZGVmIENPTkZJR19YU1dBUFxcbitcXHR4c3dhcF9kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoXFxcInhzd2FwXFxcIiwgTlVMTCk7XFxuKyNlbmRpZlxcbitcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gc3Vic3lzX2luaXRjYWxsKHN3YXBmaWxlX2luaXQpO1xcbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xcbmluZGV4IGY3YzljODlmNjQ0OWMuLjYxNzg0NjVkMDU4MzcgMTAwNjQ0XFxuLS0tIGEvbW0venN3YXAuY1xcbisrKyBiL21tL3pzd2FwLmNcXG5AQCAtOTk4LDcgKzk5OCwxMiBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LFxcbiBcXHQvKiB0cnkgdG8gYWxsb2NhdGUgc3dhcCBjYWNoZSBmb2xpbyAqL1xcbiBcXHRzaSA9IGdldF9zd2FwX2RldmljZShzd3BlbnRyeSk7XFxuIFxcdGlmICghc2kpXFxuLVxcdFxcdHJldHVybiAtRUVYSVNUO1xcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFxuK1xcdGlmIChzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfWFNXQVApIHtcXG4rXFx0XFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4gXFxuIFxcdG1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7XFxuIFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLFxcbkBAIC0xNTM1LDcgKzE1NDAsNyBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdHpzd2FwX3Bvb2xfcHV0KHBvb2wpO1xcbiBwdXRfb2JqY2c6XFxuIFxcdG9ial9jZ3JvdXBfcHV0KG9iamNnKTtcXG4tXFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgenN3YXBfcG9vbF9yZWFjaGVkX2Z1bGwpXFxuK1xcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsIFxcdTAwMjZcXHUwMDI2IGF0b21pY19yZWFkKFxcdTAwMjZucl9yZWFsX3N3YXBmaWxlcykpXFxuIFxcdFxcdHF1ZXVlX3dvcmsoc2hyaW5rX3dxLCBcXHUwMDI2enN3YXBfc2hyaW5rX3dvcmspO1xcbiBjaGVja19vbGQ6XFxuIFxcdC8qXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE0OjM5LjQ3ODY0NDM2MloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjYxMDc3NzgxMzYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlhTV0FQXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInhzd2FwX21heF9jbHVzdGVyc193cml0ZVwiLFxuICAgIFwieHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRcIixcbiAgICBcInhzd2FwX3Nocmlua193b3JrX2ZuXCIsXG4gICAgXCJ4c3dhcF9jaGVja19tYXBwZWRcIixcbiAgICBcInhzd2FwX2NvbGxlY3RfcGFnZVwiLFxuICAgIFwieHN3YXBfbWFwX2NsdXN0ZXJzXCIsXG4gICAgXCJ4c3dhcF91bm1hcF9jbHVzdGVyc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlICh4c3dhcCkgdGhhdCBkZWNvdXBsZXMgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gSXQgdXNlcyBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgZm9yIGNsdXN0ZXIgaW5mbyB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzIGR5bmFtaWNhbGx5LiBUaGlzIGFkZHMgbmV3IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyBmb3Igc3dhcCBtYW5hZ2VtZW50LCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHdvcmtxdWV1ZSBmb3Igc2hyaW5raW5nLiBJdCBpcyBmdW5jdGlvbmFsIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAyM2I4NjVmM2M0OTY3ZDIyN2U2OWUzOTIwZmM0MjU3NDU5ZmJmYzQyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBBdWcgNSAwOToxNDozNiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcbmluZGV4IDQ1ZjMwMWQ3M2UyYWUuLmE1YjMyMzM3NDc2OWMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcbkBAIC0yMDcsNiArMjA3LDcgQEAgZW51bSB7XG4gXHRTV1BfU1RBQkxFX1dSSVRFUyA9ICgxIFx1MDAzY1x1MDAzYyAxMSksXHQvKiBubyBvdmVyd3JpdGUgUEdfd3JpdGViYWNrIHBhZ2VzICovXG4gXHRTV1BfU1lOQ0hST05PVVNfSU8gPSAoMSBcdTAwM2NcdTAwM2MgMTIpLFx0Lyogc3luY2hyb25vdXMgSU8gaXMgZWZmaWNpZW50ICovXG4gXHRTV1BfSElCRVJOQVRJT04gPSAoMSBcdTAwM2NcdTAwM2MgMTMpLFx0LyogcGlubmVkIGZvciBoaWJlcm5hdGlvbiAqL1xuK1x0U1dQX1hTV0FQXHQ9ICgxIFx1MDAzY1x1MDAzYyAxNCksXHQvKiBleHRlbmRhYmxlIHN3YXAgZGV2aWNlICovXG4gXHRcdFx0XHRcdC8qIGFkZCBvdGhlcnMgaGVyZSBiZWZvcmUuLi4gKi9cbiB9O1xuIFxuQEAgLTI0Nyw2ICsyNDgsMTYgQEAgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3Qge1xuIFx0c2lnbmVkIGNoYXJcdHR5cGU7XHRcdC8qIHN0cmFuZ2UgbmFtZSBmb3IgYW4gaW5kZXggKi9cbiBcdHVuc2lnbmVkIGludFx0bWF4O1x0XHQvKiBzaXplIG9mIHRoaXMgc3dhcCBkZXZpY2UgKi9cbiBcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvOyAvKiBjbHVzdGVyIGluZm8uIE9ubHkgZm9yIFNTRCAqL1xuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitcdHN0cnVjdCB2bV9zdHJ1Y3RcdCpjbHVzdGVyX3ZtO1x0LyogVk1fU1BBUlNFIGFyZWEgZm9yIHhzd2FwIGR5bmFtaWMgY2x1c3Rlcl9pbmZvICovXG4rXHR1bnNpZ25lZCBsb25nXHRcdG5yX2NsdXN0ZXJzX21heDsvKiB1cHBlciBsaW1pdCBmcm9tIHN3YXAgaGVhZGVyICovXG4rXHR1bnNpZ25lZCBsb25nXHRcdG5yX2NsdXN0ZXJzO1x0LyogY3VycmVudCBncm93dGggY2VpbGluZyAo4omkIG5yX2NsdXN0ZXJzX21heCkgKi9cbitcdHVuc2lnbmVkIGxvbmdcdFx0bnJfY2x1c3RlcnNfbWFwcGVkOyAvKiBjdXJyZW50bHkgbWFwcGVkIGNsdXN0ZXIgY291bnQgKi9cbitcdHVuc2lnbmVkIGxvbmdcdFx0bnJfZnJlZV90YWlsO1x0LyogY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0IHRhaWwgKi9cbitcdHN0cnVjdCBkZW50cnlcdFx0KmRlYnVnZnNfZW50cnk7XHQvKiBkZWJ1Z2ZzOiB0eXBlXHUwMDNjTlx1MDAzZV9tYXhfY2x1c3RlcnMgKi9cbitcdHN0cnVjdCB3b3JrX3N0cnVjdFx0eHN3YXBfc2hyaW5rX3dvcms7IC8qIGRlZmVycmVkIHNocmluayB0cmlnZ2VyICovXG4rXHRzdHJ1Y3QgbXV0ZXhcdFx0eHN3YXBfbG9jaztcdC8qIHNlcmlhbGl6ZSBtYXAvdW5tYXAgb3BlcmF0aW9ucyAqL1xuKyNlbmRpZlxuIFx0c3RydWN0IGxpc3RfaGVhZCBmcmVlX2NsdXN0ZXJzOyAvKiBmcmVlIGNsdXN0ZXJzIGxpc3QgKi9cbiBcdHN0cnVjdCBsaXN0X2hlYWQgZnVsbF9jbHVzdGVyczsgLyogZnVsbCBjbHVzdGVycyBsaXN0ICovXG4gXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vbmZ1bGxfY2x1c3RlcnNbU1dBUF9OUl9PUkRFUlNdO1xuQEAgLTM1MCw2ICszNjEsNyBAQCB2b2lkIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4gdm9pZCBmcmVlX3BhZ2VzX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBlbmNvZGVkX3BhZ2UgKiosIGludCk7XG4gLyogbGludXgvbW0vc3dhcGZpbGUuYyAqL1xuIGV4dGVybiBhdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XG4rZXh0ZXJuIGF0b21pY190IG5yX3JlYWxfc3dhcGZpbGVzO1xuIGV4dGVybiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7XG4gZXh0ZXJuIGF0b21pY190IG5yX3JvdGF0ZV9zd2FwO1xuIFxuZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnXG5pbmRleCAwNjAxOTBlMTJiY2VkLi44MmY2MmY0YzViMjNlIDEwMDY0NFxuLS0tIGEvbW0vS2NvbmZpZ1xuKysrIGIvbW0vS2NvbmZpZ1xuQEAgLTEyMiw2ICsxMjIsMTUgQEAgY29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVFxuICAgICAgICBkZWZhdWx0IFwienN0ZFwiIGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9aU1REXG4gICAgICAgIGRlZmF1bHQgXCJcIlxuIFxuK2NvbmZpZyBYU1dBUFxuK1x0Ym9vbCBcIkV4dGVuZGFibGUgKHZpcnR1YWwpIHN3YXAgZGV2aWNlXCJcbitcdGRlcGVuZHMgb24gU1dBUCBcdTAwMjZcdTAwMjYgNjRCSVRcbitcdGhlbHBcbitcdCAgQWRkcyBzdXBwb3J0IGZvciBleHRlbmRhYmxlIHN3YXAgZGV2aWNlcyAoeHN3YXApIHRoYXQgZGVjb3VwbGVcbitcdCAgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gVGhlIGNsdXN0ZXJfaW5mb1xuK1x0ICBhcnJheSBpcyBiYWNrZWQgYnkgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIHRoYXQgZ3Jvd3MgYW5kIHNocmlua3NcbitcdCAgb24gZGVtYW5kLCBhdm9pZGluZyBzdGF0aWMgcHJlLWFsbG9jYXRpb24gb3ZlcmhlYWQuXG4rXG4gY29uZmlnIFpTTUFMTE9DXG4gXHR0cmlzdGF0ZVxuIFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfaW8uYyBiL21tL3BhZ2VfaW8uY1xuaW5kZXggZTRmYTdmZmZmZThiYi4uMWYzZmE1MjEzMWFiMyAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfaW8uY1xuKysrIGIvbW0vcGFnZV9pby5jXG5AQCAtMjQ3LDYgKzI0NywxNyBAQCBpbnQgc3dhcF93cml0ZW91dChzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdH1cbiBcdHJjdV9yZWFkX3VubG9jaygpO1xuIFxuK1x0LypcbitcdCAqIGN0eC1cdTAwM2VzaXMgaXMgc2V0IGJ5IHN3YXBfYWRkX2ZvbGlvKCkgd2hpY2ggaXMgY2FsbGVkIGZyb21cbitcdCAqIF9fc3dhcF93cml0ZXBhZ2UoKSBiZWxvdy4gIFNpbmNlIHdlIG11c3QgYXZvaWQgdGhlIHdyaXRlcGFnZVxuK1x0ICogcGF0aCBmb3IgeHN3YXAgZGV2aWNlcywgdXNlIHRoZSBzd2FwX2luZm8gZnJvbSB0aGUgZm9saW8nc1xuK1x0ICogc3dhcCBlbnRyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggY3R4LlxuK1x0ICovXG4rXHRpZiAodW5saWtlbHkoX19zd2FwX2VudHJ5X3RvX2luZm8oZm9saW8tXHUwMDNlc3dhcCktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpIHtcbitcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4rXHRcdHJldHVybiBBT1BfV1JJVEVQQUdFX0FDVElWQVRFO1xuK1x0fVxuK1xuIFx0X19zd2FwX3dyaXRlcGFnZShjdHgsIGZvbGlvKTtcbiBcdHJldHVybiAwO1xuIG91dF91bmxvY2s6XG5AQCAtNDc5LDYgKzQ5MCwxMSBAQCB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxuIFx0XHRnb3RvIGZpbmlzaDtcbiBcbitcdGlmICh1bmxpa2VseShzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpIHtcbitcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbitcdFx0Z290byBmaW5pc2g7XG4rXHR9XG4rXG4gXHQvKiBXZSBoYXZlIHRvIHJlYWQgZnJvbSBzbG93ZXIgZGV2aWNlcy4gSW5jcmVhc2UgenN3YXAgcHJvdGVjdGlvbi4gKi9cbiBcdHpzd2FwX2ZvbGlvX3N3YXBpbihmb2xpbyk7XG4gXHRzd2FwX2FkZF9mb2xpbyhjdHgsIGZvbGlvLCBSRUFEKTtcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmNcbmluZGV4IDViZTgyNTkxMWU2NDUuLmViYjJkMmFjMzU2ZmUgMTAwNjQ0XG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcbisrKyBiL21tL3N3YXBfc3RhdGUuY1xuQEAgLTgyOSw2ICs4MjksMTMgQEAgc3RydWN0IGZvbGlvICpzd2FwX2NsdXN0ZXJfcmVhZGFoZWFkKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnBfbWFzayxcbiBcdHN0cnVjdCBibGtfcGx1ZyBwbHVnO1xuIFx0c3dwX2VudHJ5X3QgcmFfZW50cnk7XG4gXG4rXHQvKlxuK1x0ICogVGhlIGVudHJ5IG1heSBoYXZlIGJlZW4gZnJlZWQgYnkgYW5vdGhlciB0YXNrLiBBdm9pZCBzd2FwX2luZm9fZ2V0KClcbitcdCAqIHdoaWNoIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBpZiB0aGUgcmFjZSBoYXBwZW5zLlxuK1x0ICovXG4rXHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUClcbitcdFx0Z290byBza2lwO1xuK1xuIFx0bWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTtcbiBcdGlmICghbWFzaylcbiBcdFx0Z290byBza2lwO1xuZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jXG5pbmRleCA0ZDRlM2UzMDU5ZjZiLi5jYTQwNjU1NjYyNmU3IDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuKysrIGIvbW0vc3dhcGZpbGUuY1xuQEAgLTQ4LDYgKzQ4LDExOCBAQFxuICNpbmNsdWRlIFwic3dhcF90YWJsZS5oXCJcbiAjaW5jbHVkZSBcImludGVybmFsLmhcIlxuICNpbmNsdWRlIFwic3dhcC5oXCJcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcdTAwM2VcbitcbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7XG4rXG4rI2lmZGVmIENPTkZJR19YU1dBUFxuKy8qXG4rICogeHN3YXA6IGR5bmFtaWNhbGx5IGdyb3cgYW5kIHNocmluayB0aGUgY2x1c3Rlcl9pbmZvIGFycmF5IHZpYSBhXG4rICogVk1fU1BBUlNFIGFyZWEuXG4rICpcbisgKiBYU1dBUF9HUk9XX0NMVVNURVJTIGlzIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgdG8gbWFwL3VubWFwIGluIG9uZVxuKyAqIGdyb3cvc2hyaW5rIG9wZXJhdGlvbi4gIEl0IGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJfaW5mb1xuKyAqIHN0cnVjdHMgdGhhdCBmaXQgaW4gYSBzaW5nbGUgcGFnZSAoYXQgbGVhc3QgMTYpLCBzbyB0aGF0IHRoZSB2bWFsbG9jXG4rICogcGFnZSB0YWJsZVxuKyAqIG92ZXJoZWFkIGlzIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIG1hcHBlZC5cbisgKi9cbisjZGVmaW5lIFhTV0FQX0dST1dfQ0xVU1RFUlMgXFxcbitcdG1heF90KHVuc2lnbmVkIGxvbmcsIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pLCAxNilcbitcbitzdGF0aWMgc3RydWN0IGRlbnRyeSAqeHN3YXBfZGVidWdmc19yb290O1xuK1xuK3N0YXRpYyBpbnQgeHN3YXBfbWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucik7XG4rc3RhdGljIHZvaWQgeHN3YXBfdW5tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKTtcbitzdGF0aWMgaW50IHhzd2FwX2NoZWNrX21hcHBlZChwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRhdGEpO1xuK3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpO1xuK3N0YXRpYyB2b2lkIHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZnJlZWRfaWR4KTtcbitzdGF0aWMgdm9pZCB4c3dhcF90cnlfc2hyaW5rKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSk7XG4rXG4rLypcbisgKiBkZWJ1Z2ZzIHJlYWQvd3JpdGUgZm9yIHBlci1kZXZpY2UgbWF4IGNsdXN0ZXIgY291bnQuXG4rICogU2hvd3Mvc2V0cyBzaS1cdTAwM2Vucl9jbHVzdGVycyAoY3VycmVudCBncm93dGggY2VpbGluZyksIGNsYW1wZWQgdG9cbisgKiBbMCwgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4XS5cbisgKi9cbitzdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZixcbitcdFx0XHRcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbit7XG4rXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbitcdGNoYXIgdG1wWzMyXTtcbitcdGludCBsZW47XG4rXG4rXHRsZW4gPSBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCBcIiVsdVxcblwiLCBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnMpKTtcbitcdHJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCB0bXAsIGxlbik7XG4rfVxuK1xuK3N0YXRpYyBzc2l6ZV90IHhzd2FwX21heF9jbHVzdGVyc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSxcbitcdFx0XHRcdFx0Y29uc3QgY2hhciBfX3VzZXIgKmJ1ZixcbitcdFx0XHRcdFx0c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpXG4re1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4rXHR1bnNpZ25lZCBsb25nIHZhbCwgbmV3X3BhZ2VzO1xuK1x0aW50IGVycjtcbitcbitcdGVyciA9IGtzdHJ0b3VsX2Zyb21fdXNlcihidWYsIGNvdW50LCAwLCBcdTAwMjZ2YWwpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdGlmICh2YWwgXHUwMDNlIHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21heClcbitcdFx0dmFsID0gc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4O1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuK1x0c2ktXHUwMDNlbnJfY2x1c3RlcnMgPSB2YWw7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbitcbitcdC8qIEtlZXAgdGhlIHZpc2libGUgc3dhcCBzaXplIGluIHN5bmMgd2l0aCB0aGUgbmV3IGNlaWxpbmcuICovXG4rXHRuZXdfcGFnZXMgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB2YWwgKiBTV0FQRklMRV9DTFVTVEVSLCBzaS1cdTAwM2VtYXgpO1xuK1x0aWYgKG5ld19wYWdlcylcbitcdFx0bmV3X3BhZ2VzLS07XG4rXHRpZiAobmV3X3BhZ2VzICE9IHNpLVx1MDAzZXBhZ2VzKSB7XG4rXHRcdGxvbmcgZGVsdGEgPSAobG9uZyluZXdfcGFnZXMgLSAobG9uZylzaS1cdTAwM2VwYWdlcztcbitcbitcdFx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRcdHNpLVx1MDAzZXBhZ2VzID0gbmV3X3BhZ2VzO1xuK1x0XHRhdG9taWNfbG9uZ19hZGQoZGVsdGEsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuK1x0XHR0b3RhbF9zd2FwX3BhZ2VzICs9IGRlbHRhO1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0fVxuK1xuK1x0LyogU2hyaW5rIHRyaWdnZXI6IGxvd2VyaW5nIHRoZSBjZWlsaW5nIG1heSBmcmVlIHRhaWwgY2x1c3RlcnMuICovXG4rXHRzY2hlZHVsZV93b3JrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcbitcbitcdHJldHVybiBjb3VudDtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xuK1x0LnJlYWQgPSB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZCxcbitcdC53cml0ZSA9IHhzd2FwX21heF9jbHVzdGVyc193cml0ZSxcbitcdC5vcGVuID0gc2ltcGxlX29wZW4sXG4rXHQubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssXG4rfTtcbitcbitzdGF0aWMgdm9pZCB4c3dhcF9kZWJ1Z2ZzX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4re1xuK1x0Y2hhciBuYW1lWzMyXTtcbitcbitcdGlmICgheHN3YXBfZGVidWdmc19yb290KVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFwidHlwZSVkX2NsdXN0ZXJfbGltaXRcIiwgc2ktXHUwMDNldHlwZSk7XG4rXHRzaS1cdTAwM2VkZWJ1Z2ZzX2VudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAwNjQ0LCB4c3dhcF9kZWJ1Z2ZzX3Jvb3QsXG4rXHRcdFx0XHRcdFx0c2ksIFx1MDAyNnhzd2FwX2RlYnVnZnNfZm9wcyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHhzd2FwX2RlYnVnZnNfZGVsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbit7XG4rXHRkZWJ1Z2ZzX3JlbW92ZShzaS1cdTAwM2VkZWJ1Z2ZzX2VudHJ5KTtcbitcdHNpLVx1MDAzZWRlYnVnZnNfZW50cnkgPSBOVUxMO1xuK31cbitcbitcbisjZW5kaWZcbiBcbiBzdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2FsbG9jKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHQgICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKTtcbkBAIC02Myw5ICsxNzUsOSBAQCBzdGF0aWMgdm9pZCBtb3ZlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuICAqXG4gICogQWxzbyBwcm90ZWN0cyBzd2FwX2FjdGl2ZV9oZWFkIHRvdGFsX3N3YXBfcGFnZXMsIGFuZCB0aGUgU1dQX1dSSVRFT0sgZmxhZy5cbiAgKi9cbi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7XG4gc3RhdGljIHVuc2lnbmVkIGludCBucl9zd2FwZmlsZXM7XG4gYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xuK2F0b21pY190IG5yX3JlYWxfc3dhcGZpbGVzO1xuIC8qXG4gICogU29tZSBtb2R1bGVzIHVzZSBzd2FwcGFibGUgb2JqZWN0cyBhbmQgbWF5IHRyeSB0byBzd2FwIHRoZW0gb3V0IHVuZGVyXG4gICogbWVtb3J5IHByZXNzdXJlICh2aWEgdGhlIHNocmlua2VyKS4gQmVmb3JlIGRvaW5nIHNvLCB0aGV5IG1heSB3aXNoIHRvXG5AQCAtNjA5LDYgKzcyMSwxMCBAQCBzdGF0aWMgdm9pZCBfX2ZyZWVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mb1xuIFx0c3dhcF9jbHVzdGVyX2ZyZWVfdGFibGUoY2kpO1xuIFx0bW92ZV9jbHVzdGVyKHNpLCBjaSwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycywgQ0xVU1RFUl9GTEFHX0ZSRUUpO1xuIFx0Y2ktXHUwMDNlb3JkZXIgPSAwO1xuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitcdHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWwoc2ksIGNpIC0gc2ktXHUwMDNlY2x1c3Rlcl9pbmZvKTtcbitcdHNjaGVkdWxlX3dvcmsoXHUwMDI2c2ktXHUwMDNleHN3YXBfc2hyaW5rX3dvcmspO1xuKyNlbmRpZlxuIH1cbiBcbiAvKlxuQEAgLTk1NSw2ICsxMDcxLDkgQEAgc3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpXG4gXHRcdGNpLVx1MDAzZW9yZGVyID0gb3JkZXI7XG4gXHRjaS1cdTAwM2Vjb3VudCArPSBucl9wYWdlcztcbisjaWZkZWYgQ09ORklHX1hTV0FQXG4rXHR4c3dhcF90cmltX2ZyZWVfdGFpbChzaSwgY2x1c3Rlcl9pbmRleChzaSwgY2kpKTtcbisjZW5kaWZcbiBcdHN3YXBfcmFuZ2VfYWxsb2Moc2ksIG5yX3BhZ2VzKTtcbiBcbiBcdHJldHVybiB0cnVlO1xuQEAgLTExODUsNiArMTMwNCw1MCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0XHRpZiAoZm91bmQpXG4gXHRcdFx0Z290byBkb25lO1xuIFx0fVxuK1xuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitcdC8qXG4rXHQgKiBGb3IgeHN3YXA6IGlmIG5vIGZyZWUgY2x1c3RlciB3YXMgZm91bmQgYW5kIG1vcmUgY2x1c3RlcnNcbitcdCAqIGNhbiBiZSBtYXBwZWQsIGdyb3cgdGhlIGNsdXN0ZXJfaW5mbyBhcnJheSBhbmQgcmV0cnkuXG4rXHQgKi9cbitcdGlmICghZm91bmQgXHUwMDI2XHUwMDI2IChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKSBcdTAwMjZcdTAwMjZcbitcdCAgICBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKSBcdTAwM2MgUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzKSBcdTAwMjZcdTAwMjZcbitcdCAgICBsaXN0X2VtcHR5KFx1MDAyNnNpLVx1MDAzZWZyZWVfY2x1c3RlcnMpKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbnJfbmV3ID0gbWluKFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVycykgLVxuK1x0XHRcdFx0XHQgIFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQpLFxuK1x0XHRcdFx0XHQgIFhTV0FQX0dST1dfQ0xVU1RFUlMpO1xuK1x0XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdFx0aWYgKCF4c3dhcF9tYXBfY2x1c3RlcnMoc2ksIHN0YXJ0LCBucl9uZXcpKSB7XG4rXHRcdFx0dW5zaWduZWQgbG9uZyBhZGRlZCA9IDA7XG4rXG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuK1x0XHRcdGZvciAoaSA9IHN0YXJ0OyBpIFx1MDAzYyBzdGFydCArIG5yX25ldzsgaSsrKSB7XG4rXHRcdFx0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gXHUwMDI2c2ktXHUwMDNlY2x1c3Rlcl9pbmZvW2ldO1xuK1x0XHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1x0XHRcdFx0LypcbitcdFx0XHRcdCAqIEEgY29uY3VycmVudCBncm93ZXIgbWF5IGhhdmUgYWxyZWFkeSBhZGRlZFxuK1x0XHRcdFx0ICogdGhlc2UgY2x1c3RlcnMgdG8gdGhlIGZyZWUgbGlzdC4gIE9ubHkgYWRkXG4rXHRcdFx0XHQgKiBjbHVzdGVycyB0aGF0IGFyZSBzdGlsbCBvZmYtbGlzdCAoTk9ORSkuXG4rXHRcdFx0XHQgKi9cbitcdFx0XHRcdGlmIChjaS1cdTAwM2VmbGFncyA9PSBDTFVTVEVSX0ZMQUdfTk9ORSkge1xuK1x0XHRcdFx0XHRjaS1cdTAwM2VmbGFncyA9IENMVVNURVJfRkxBR19GUkVFO1xuK1x0XHRcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmNpLVx1MDAzZWxpc3QsIFx1MDAyNnNpLVx1MDAzZWZyZWVfY2x1c3RlcnMpO1xuK1x0XHRcdFx0XHRhZGRlZCsrO1xuK1x0XHRcdFx0fVxuK1x0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4rXHRcdFx0fVxuK1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuK1x0XHRcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsLFxuK1x0XHRcdFx0ICAgUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCkgKyBucl9uZXcpO1xuK1xuK1x0XHRcdC8qIFJldHJ5IGFsbG9jYXRpb24gZnJvbSB0aGUgZnJlZSBsaXN0ICovXG4rXHRcdFx0Zm91bmQgPSBhbGxvY19zd2FwX3NjYW5fbGlzdChzaSwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyxcbitcdFx0XHRcdFx0XHQgICAgZm9saW8sIGZhbHNlKTtcbitcdFx0fVxuK1x0fVxuKyNlbmRpZlxuIGRvbmU6XG4gXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbkBAIC0xMjIzLDYgKzEzODYsOCBAQCBzdGF0aWMgdm9pZCBkZWxfZnJvbV9hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb2ZmKVxuIFx0XHRcdGdvdG8gc2tpcDtcbiBcdH1cbiBcbitcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuK1x0XHRhdG9taWNfc3ViKDEsIFx1MDAyNm5yX3JlYWxfc3dhcGZpbGVzKTtcbiBcdHBsaXN0X2RlbChcdTAwMjZzaS1cdTAwM2VhdmFpbF9saXN0LCBcdTAwMjZzd2FwX2F2YWlsX2hlYWQpO1xuIFxuIHNraXA6XG5AQCAtMTI2NSw2ICsxNDMwLDggQEAgc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbilcbiBcdH1cbiBcbiBcdHBsaXN0X2FkZChcdTAwMjZzaS1cdTAwM2VhdmFpbF9saXN0LCBcdTAwMjZzd2FwX2F2YWlsX2hlYWQpO1xuK1x0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpXG4rXHRcdGF0b21pY19hZGQoMSwgXHUwMDI2bnJfcmVhbF9zd2FwZmlsZXMpO1xuIFxuIHNraXA6XG4gXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuQEAgLTI5NTIsNiArMzExOSwxOSBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfZXh0ZW50cyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLFxuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctXHUwMDNlaG9zdDtcbiBcdGludCByZXQ7XG4gXG4rXHRpZiAoc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbitcdFx0KnNwYW4gPSAwO1xuK1x0XHQvKlxuK1x0XHQgKiB4c3dhcCBkZXZpY2VzIGhhdmUgbm8gYmFja2luZyBibG9jayBkZXZpY2UgYW5kXG4rXHRcdCAqIHBoeXNpY2FsIHdyaXRlb3V0IGlzIHNraXBwZWQgaW4gc3dhcF93cml0ZW91dCgpLFxuK1x0XHQgKiBidXQgc2lzLVx1MDAzZW9wcyBtdXN0IHN0aWxsIGJlIHNldCBzbyB0aGF0IGNhbGxlcnNcbitcdFx0ICogbGlrZSBzaHJpbmtfZm9saW9fbGlzdCgpIGNhbiBzYWZlbHkgZGVyZWZlcmVuY2VcbitcdFx0ICogb3BzLVx1MDAzZWZsYWdzLlxuK1x0XHQgKi9cbitcdFx0c2lzLVx1MDAzZW9wcyA9IFx1MDAyNnN3YXBfYmRldl9vcHM7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuIFx0cmV0ID0gc2lvX3Bvb2xfaW5pdCgpO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbkBAIC0zMDIzLDIwICszMjAzLDUwIEBAIHN0YXRpYyB2b2lkIHdhaXRfZm9yX2FsbG9jYXRpb24oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIFxuIFx0QlVHX09OKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfV1JJVEVPSyk7XG4gXG4rI2lmZGVmIENPTkZJR19YU1dBUFxuK1x0LypcbitcdCAqIHhzd2FwIGNsdXN0ZXJzIGJleW9uZCBucl9jbHVzdGVyc19tYXBwZWQgaGF2ZSBiZWVuIHVubWFwcGVkXG4rXHQgKiBieSB0aGUgc2hyaW5rZXIgYW5kIHRoZWlyIHZtYWxsb2MgcGFnZXMgYXJlIG5vIGxvbmdlclxuK1x0ICogYWNjZXNzaWJsZS4gIE9ubHkgaXRlcmF0ZSBvdmVyIGN1cnJlbnRseSBtYXBwZWQgY2x1c3RlcnMuXG4rXHQgKi9cbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKVxuK1x0XHRlbmQgPSBtaW4oZW5kLCBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKSAqXG4rXHRcdFx0ICBTV0FQRklMRV9DTFVTVEVSKTtcbisjZW5kaWZcbitcbiBcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IFx1MDAzYyBlbmQ7IG9mZnNldCArPSBTV0FQRklMRV9DTFVTVEVSKSB7XG4gXHRcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XG4gXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuIFx0fVxuIH1cbiBcbi1zdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLFxuLVx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcbitzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiB7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyA9IHNpLVx1MDAzZWNsdXN0ZXJfaW5mbztcbitcdHVuc2lnbmVkIGxvbmcgbWF4cGFnZXMgPSBzaS1cdTAwM2VtYXg7XG4gXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuLVx0aW50IGksIG5yX2NsdXN0ZXJzID0gRElWX1JPVU5EX1VQKG1heHBhZ2VzLCBTV0FQRklMRV9DTFVTVEVSKTtcbitcdGludCBpLCBucl9jbHVzdGVycztcbiBcbiBcdGlmICghY2x1c3Rlcl9pbmZvKVxuIFx0XHRyZXR1cm47XG4rXG4rI2lmZGVmIENPTkZJR19YU1dBUFxuK1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbitcdFx0eHN3YXBfZGVidWdmc19kZWwoc2kpO1xuK1x0XHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNnNpLVx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcbitcdFx0LyogVW5tYXAgYWxsIG1hcHBlZCBjbHVzdGVycyBhbmQgZnJlZSB0aGUgVk1fU1BBUlNFIGFyZWEgKi9cbitcdFx0aWYgKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCBcdTAwM2UgMClcbitcdFx0XHR4c3dhcF91bm1hcF9jbHVzdGVycyhzaSwgMCwgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitcdFx0ZnJlZV92bV9hcmVhKHNpLVx1MDAzZWNsdXN0ZXJfdm0pO1xuK1x0XHRzaS1cdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcbitcdFx0c2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4ID0gMDtcbitcdFx0c2ktXHUwMDNlbnJfY2x1c3RlcnMgPSAwO1xuK1x0XHRzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQgPSAwO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rI2VuZGlmXG4rXG4rXHRucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jbHVzdGVyczsgaSsrKSB7XG4gXHRcdGNpID0gY2x1c3Rlcl9pbmZvICsgaTtcbiBcdFx0LyogQ2x1c3RlciB3aXRoIGJhZCBtYXJrcyBjb3VudCB3aWxsIGhhdmUgYSByZW1haW5pbmcgdGFibGUgKi9cbkBAIC0zMDc1LDExICszMjg1LDkgQEAgc3RhdGljIHZvaWQgZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4gU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwID0gTlVMTDtcbi1cdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvO1xuIFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZSwgKnZpY3RpbTtcbiBcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nO1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbi1cdHVuc2lnbmVkIGludCBtYXhwYWdlcztcbiBcdGludCBlcnIsIGZvdW5kID0gMDtcbiBcbiBcdGlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSlcbkBAIC0zMTYwLDcgKzMzNjgsOCBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXG4gXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhwLCBwLVx1MDAzZXN3YXBfZmlsZSk7XG4gXG4tXHRpZiAoIShwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4rXHRpZiAoIShwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIFx1MDAyNlx1MDAyNlxuK1x0ICAgICEocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxuIFx0XHRhdG9taWNfZGVjKFx1MDAyNm5yX3JvdGF0ZV9zd2FwKTtcbiBcbiBcdG11dGV4X2xvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbkBAIC0zMTcwLDEwICszMzc5LDYgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFxuIFx0c3dhcF9maWxlID0gcC1cdTAwM2Vzd2FwX2ZpbGU7XG4gXHRwLVx1MDAzZXN3YXBfZmlsZSA9IE5VTEw7XG4tXHRtYXhwYWdlcyA9IHAtXHUwMDNlbWF4O1xuLVx0Y2x1c3Rlcl9pbmZvID0gcC1cdTAwM2VjbHVzdGVyX2luZm87XG4tXHRwLVx1MDAzZW1heCA9IDA7XG4tXHRwLVx1MDAzZWNsdXN0ZXJfaW5mbyA9IE5VTEw7XG4gXHRzcGluX3VubG9jayhcdTAwMjZwLVx1MDAzZWxvY2spO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiBcdGFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC1cdTAwM2V0eXBlKTtcbkBAIC0zMTgxLDcgKzMzODYsOSBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXHRtdXRleF91bmxvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbiBcdGtmcmVlKHAtXHUwMDNlZ2xvYmFsX2NsdXN0ZXIpO1xuIFx0cC1cdTAwM2VnbG9iYWxfY2x1c3RlciA9IE5VTEw7XG4tXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xuK1x0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhwKTtcbitcdHAtXHUwMDNlbWF4ID0gMDtcbitcdHAtXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbiBcbiBcdGlub2RlID0gbWFwcGluZy1cdTAwM2Vob3N0O1xuIFxuQEAgLTMyNzAsNiArMzQ3NywxOSBAQCBzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4gfVxuIFxuK3N0YXRpYyBjb25zdCBjaGFyICpzd2FwX3R5cGVfc3RyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbit7XG4rXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNpLVx1MDAzZXN3YXBfZmlsZTtcbitcbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKVxuK1x0XHRyZXR1cm4gXCJ4c3dhcFxcdFwiO1xuK1xuK1x0aWYgKFNfSVNCTEsoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX21vZGUpKVxuK1x0XHRyZXR1cm4gXCJwYXJ0aXRpb25cIjtcbitcbitcdHJldHVybiBcImZpbGVcXHRcIjtcbit9XG4rXG4gc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IHY7XG5AQCAtMzI4OSw4ICszNTA5LDcgQEAgc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuIFx0bGVuID0gc2VxX2ZpbGVfcGF0aChzd2FwLCBmaWxlLCBcIiBcXHRcXG5cXFxcXCIpO1xuIFx0c2VxX3ByaW50Zihzd2FwLCBcIiUqcyVzXFx0JWx1XFx0JXMlbHVcXHQlcyVkXFxuXCIsXG4gXHRcdFx0bGVuIFx1MDAzYyA0MCA/IDQwIC0gbGVuIDogMSwgXCIgXCIsXG4tXHRcdFx0U19JU0JMSyhmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfbW9kZSkgP1xuLVx0XHRcdFx0XCJwYXJ0aXRpb25cIiA6IFwiZmlsZVxcdFwiLFxuK1x0XHRcdHN3YXBfdHlwZV9zdHIoc2kpLFxuIFx0XHRcdGJ5dGVzLCBieXRlcyBcdTAwM2MgMTAwMDAwMDAgPyBcIlxcdFwiIDogXCJcIixcbiBcdFx0XHRpbnVzZSwgaW51c2UgXHUwMDNjIDEwMDAwMDAwID8gXCJcXHRcIiA6IFwiXCIsXG4gXHRcdFx0c2ktXHUwMDNlcHJpbyk7XG5AQCAtMzQ2OCw2ICszNjg3LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzO1xuIFx0dW5zaWduZWQgbG9uZyBzd2FwZmlsZXBhZ2VzO1xuIFx0dW5zaWduZWQgbG9uZyBsYXN0X3BhZ2U7XG4rXHRsb2ZmX3Qgc2l6ZTtcbiBcbiBcdGlmIChtZW1jbXAoXCJTV0FQU1BBQ0UyXCIsIHN3YXBfaGVhZGVyLVx1MDAzZW1hZ2ljLm1hZ2ljLCAxMCkpIHtcbiBcdFx0cHJfZXJyKFwiVW5hYmxlIHRvIGZpbmQgc3dhcC1zcGFjZSBzaWduYXR1cmVcXG5cIik7XG5AQCAtMzUxMCw3ICszNzMwLDE2IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFxuIFx0aWYgKCFtYXhwYWdlcylcbiBcdFx0cmV0dXJuIDA7XG4tXHRzd2FwZmlsZXBhZ2VzID0gaV9zaXplX3JlYWQoaW5vZGUpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1xuK1x0c2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTtcbitcdGlmIChzaXplID09IFBBR0VfU0laRSkge1xuK1x0XHQvKiB4c3dhcDogYSBzd2FwIGRldmljZSB3aXRoIG5vIGJhY2tpbmcgc3RvcmFnZSAqL1xuK1x0XHRzaS1cdTAwM2ViZGV2ID0gTlVMTDtcbitcdFx0c2ktXHUwMDNlZmxhZ3MgfD0gU1dQX1hTV0FQIHwgU1dQX1NPTElEU1RBVEU7XG4rXHRcdHJldHVybiBtYXhwYWdlcztcbitcdH1cbitcbitcdHN3YXBmaWxlcGFnZXMgPSBzaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0aWYgKHN3YXBmaWxlcGFnZXMgXHUwMDI2XHUwMDI2IG1heHBhZ2VzIFx1MDAzZSBzd2FwZmlsZXBhZ2VzKSB7XG4gXHRcdHByX3dhcm4oXCJTd2FwIGFyZWEgc2hvcnRlciB0aGFuIHNpZ25hdHVyZSBpbmRpY2F0ZXNcXG5cIik7XG4gXHRcdHJldHVybiAwO1xuQEAgLTM1MjMsNiArMzc1MiwzNjUgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRyZXR1cm4gbWF4cGFnZXM7XG4gfVxuIFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitzdGF0aWMgaW50IHhzd2FwX21hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIHVuc2lnbmVkIGxvbmcgbnIpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpc2ktXHUwMDNlY2x1c3Rlcl9pbmZvICtcbitcdFx0XHRcdCAgIChzaXplX3Qpc3RhcnRfaWR4ICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciArIChzaXplX3QpbnIgKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTtcbitcdC8qXG4rXHQgKiB2bV9hcmVhX21hcF9wYWdlcygpIHJlcXVpcmVzIHRoYXQgc3RhcnQgYW5kIGVuZCBiZSBwYWdlLWFsaWduZWQuXG4rXHQgKiBJZiBzdGFydF9hZGRyIGZhbGxzIHdpdGhpbiBhIHBhZ2UgdGhhdCB3YXMgYWxyZWFkeSBtYXBwZWQgYnkgYVxuK1x0ICogcHJldmlvdXMgYmF0Y2ggKGdyb3cgcGF0aCksIHJvdW5kIGl0IHVwIHRvIHNraXAgdGhlIGFscmVhZHktbWFwcGVkXG4rXHQgKiBwYXJ0aWFsIHBhZ2UuICBBbHdheXMgcm91bmQgZW5kX2FkZHIgdXAgc28gdGhlIHZtYXAgcGFnZSB0YWJsZSB3YWxrXG4rXHQgKiB0ZXJtaW5hdGVzIGNvcnJlY3RseSAodGhlIHdhbGsgbG9vcCBleGl0cyB3aGVuIGFkZHIgPT0gZW5kLCBhbmQgYWRkclxuK1x0ICogYWR2YW5jZXMgYnkgUEFHRV9TSVpFIGVhY2ggaXRlcmF0aW9uKS5cbitcdCAqL1xuK1x0dW5zaWduZWQgbG9uZyB2bV9zdGFydCA9IFBBR0VfQUxJR04oc3RhcnRfYWRkcik7XG4rXHR1bnNpZ25lZCBsb25nIHZtX2VuZCA9IFBBR0VfQUxJR04oZW5kX2FkZHIpO1xuK1x0dW5zaWduZWQgaW50IG5vcmVjbGFpbV9mbGFncztcbitcdHVuc2lnbmVkIGxvbmcgbnBhZ2VzO1xuK1x0c3RydWN0IHBhZ2UgKipwYWdlcztcbitcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4rXG4rXHRpZiAodm1fc3RhcnQgXHUwMDNlPSB2bV9lbmQpIHtcbitcdFx0LyogQWxsIHJlcXVlc3RlZCBjbHVzdGVycyBmYWxsIHdpdGhpbiBhbHJlYWR5LW1hcHBlZCBwYWdlcy4gKi9cbitcdFx0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFx1MDAzYyBzdGFydF9pZHggKyBucjsgaSsrKVxuK1x0XHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1tpXS5sb2NrKTtcbitcdFx0V1JJVEVfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCArIG5yKTtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdG5wYWdlcyA9ICh2bV9lbmQgLSB2bV9zdGFydCkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXG4rXHQvKlxuK1x0ICogUHJldmVudCByZWN1cnNpdmUgcmVjbGFpbTogdm1fYXJlYV9tYXBfcGFnZXMoKSBpbnRlcm5hbGx5XG4rXHQgKiBhbGxvY2F0ZXMgcGFnZSB0YWJsZXMgd2l0aCBHRlBfUEdUQUJMRV9LRVJORUwsIHdoaWNoIGxhY2tzXG4rXHQgKiBfX0dGUF9OT01FTUFMTE9DLiAgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSBlbnN1cmVzIHRob3NlXG4rXHQgKiBhbGxvY2F0aW9ucyBjYW5ub3QgcmVjdXJzZSBpbnRvIHN3YXAgYnkgZGlzYWJsaW5nIF9fR0ZQX0ZTL0lPLlxuK1x0ICovXG4rXHRub3JlY2xhaW1fZmxhZ3MgPSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpO1xuK1xuK1x0cGFnZXMgPSBrbWFsbG9jX2FycmF5KG5wYWdlcywgc2l6ZW9mKCpwYWdlcyksXG4rXHRcdFx0ICAgICAgX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfCBHRlBfS0VSTkVMKTtcbitcdGlmICghcGFnZXMpIHtcbitcdFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5wYWdlczsgaSsrKSB7XG4rXHRcdC8qXG4rXHRcdCAqIF9fR0ZQX1pFUk8gaXMgY3JpdGljYWw6IGNsdXN0ZXJfaW5mbyBzdHJ1Y3RzIGNvbnRhaW4gcG9pbnRlclxuK1x0XHQgKiBmaWVsZHMgKGV4dGVuZF90YWJsZSwgemVyb19iaXRtYXAsIG1lbWNnX3RhYmxlLCB0YWJsZSkgdGhhdFxuK1x0XHQgKiBtdXN0IHN0YXJ0IGFzIE5VTEwuICBXaXRob3V0IHplcm9pbmcsIHN0YWxlIGRhdGEgZnJvbSBhXG4rXHRcdCAqIHByZXZpb3VzIHVzZXIgb2YgdGhlIHBhZ2Ugd291bGQgbG9vayBsaWtlIHZhbGlkIHBvaW50ZXJzLlxuK1x0XHQgKi9cbitcdFx0cGFnZXNbaV0gPSBhbGxvY19wYWdlKF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHxcbitcdFx0XHRcdCAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTtcbitcdFx0aWYgKCFwYWdlc1tpXSlcbitcdFx0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogQ2hlY2sgaWYgdGhlIHRhcmdldCBwYWdlcyBhcmUgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50XG4rXHQgKiBncm93ZXIuICBXZSBtdXN0IGRvIHRoaXMgYWZ0ZXIgcGFnZSBhbGxvY2F0aW9uIGJlY2F1c2VcbitcdCAqIGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCkgY2FuIHNsZWVwLCBvcGVuaW5nIGEgcmFjZSB3aW5kb3cuXG4rXHQgKiBJZiBzb21lb25lIGFscmVhZHkgbWFwcGVkIHRoZXNlIHBhZ2VzLCBmcmVlIG91cnMgYW5kIGNvbnRpbnVlLlxuK1x0ICovXG4rXHRpZiAoYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZShcdTAwMjZpbml0X21tLCB2bV9zdGFydCxcbitcdFx0XHRcdFx0IHZtX2VuZCAtIHZtX3N0YXJ0LFxuK1x0XHRcdFx0XHQgeHN3YXBfY2hlY2tfbWFwcGVkLCBOVUxMKSkge1xuK1x0XHRpID0gbnBhZ2VzO1xuK1x0XHRnb3RvIGZhaWxfbm91bm1hcDtcbitcdH1cbitcbitcdGludCBlcnIgPSB2bV9hcmVhX21hcF9wYWdlcyhzaS1cdTAwM2VjbHVzdGVyX3ZtLCB2bV9zdGFydCwgdm1fZW5kLCBwYWdlcyk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdC8qXG4rXHRcdCAqIC1FQlVTWSBtZWFucyB0aGUgUFRFcyBhcmUgYWxyZWFkeSBwcmVzZW50OlxuK1x0XHQgKiBhbm90aGVyIHRocmVhZCByYWNlZCB3aXRoIHVzIGFuZCBtYXBwZWQgdGhlXG4rXHRcdCAqIHNhbWUgcGFnZXMgYmV0d2VlbiBvdXIgY2hlY2sgYWJvdmUgYW5kIHRoaXNcbitcdFx0ICogY2FsbC4gIFRyZWF0IGFzIHN1Y2Nlc3Mg4oCUIGZyZWUgb3VyIHVudXNlZFxuK1x0XHQgKiBwYWdlcyBhbmQgY29udGludWUuXG4rXHRcdCAqL1xuK1x0XHRpZiAoZXJyID09IC1FQlVTWSkge1xuK1x0XHRcdGkgPSBucGFnZXM7XG4rXHRcdFx0Z290byBmYWlsX25vdW5tYXA7XG4rXHRcdH1cbitcdFx0aSA9IG5wYWdlczsgLyogZnJlZSBhbGwgcGFnZXMgb24gZmFpbHVyZSAqL1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRrZnJlZShwYWdlcyk7XG4rXHRtZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZ3MpO1xuK1xuK1x0LyogSW5pdGlhbGl6ZSBzcGlubG9ja3MgZm9yIG5ld2x5IG1hcHBlZCBjbHVzdGVycyAqL1xuK1x0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFx1MDAzYyBzdGFydF9pZHggKyBucjsgaSsrKVxuK1x0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZzaS1cdTAwM2VjbHVzdGVyX2luZm9baV0ubG9jayk7XG4rXG4rXHQvKlxuK1x0ICogUGFpcnMgd2l0aCBSRUFEX09OQ0UoKSBpbiBzaHJpbmsvZ3JvdyBwYXRocy5cbitcdCAqL1xuK1x0V1JJVEVfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCArIG5yKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbitcdHJldHVybiAwO1xuK1xuK2ZhaWxfbm91bm1hcDpcbitcdC8qXG4rXHQgKiBQYWdlcyBhbHJlYWR5IG1hcHBlZCBieSBhIGNvbmN1cnJlbnQgZ3Jvd2VyLiAgRnJlZSBvdXIgdW51c2VkXG4rXHQgKiBwYWdlcywgdGhlbiBmYWxsIHRocm91Z2ggdG8gaW5pdGlhbGl6ZSBzcGlubG9ja3MuICBUaGUgdm1hbGxvY1xuK1x0ICogUFRFcyBub3cgcG9pbnQgdG8gdGhlIGNvbmN1cnJlbnQgZ3Jvd2VyJ3MgcGFnZXMuXG4rXHQgKi9cbitcdHdoaWxlIChpIFx1MDAzZSAwKSB7XG4rXHRcdGktLTtcbitcdFx0aWYgKHBhZ2VzW2ldKVxuK1x0XHRcdF9fZnJlZV9wYWdlKHBhZ2VzW2ldKTtcbitcdH1cbitcdGtmcmVlKHBhZ2VzKTtcbitcdG1lbWFsbG9jX25vcmVjbGFpbV9yZXN0b3JlKG5vcmVjbGFpbV9mbGFncyk7XG4rXG4rXHQvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBmb3IgbmV3bHkgbWFwcGVkIGNsdXN0ZXJzICovXG4rXHRmb3IgKGkgPSBzdGFydF9pZHg7IGkgXHUwMDNjIHN0YXJ0X2lkeCArIG5yOyBpKyspXG4rXHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1tpXS5sb2NrKTtcbitcbitcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggKyBucik7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4rXHRyZXR1cm4gMDtcbitcbitmYWlsOlxuK1x0d2hpbGUgKGkgXHUwMDNlIDApIHtcbitcdFx0aS0tO1xuK1x0XHRpZiAocGFnZXNbaV0pXG4rXHRcdFx0X19mcmVlX3BhZ2UocGFnZXNbaV0pO1xuK1x0fVxuK1x0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcbitcdGtmcmVlKHBhZ2VzKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbitcdHJldHVybiAtRU5PTUVNO1xuK31cbitcbitzdHJ1Y3QgeHN3YXBfcGFnZV9kYXRhIHtcbitcdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4rXHRpbnQgbnI7XG4rXHRpbnQgbWF4O1xuK307XG4rXG4rc3RhdGljIGludCB4c3dhcF9jb2xsZWN0X3BhZ2UocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKVxuK3tcbitcdHN0cnVjdCB4c3dhcF9wYWdlX2RhdGEgKnhwZCA9IGRhdGE7XG4rXG4rXHRpZiAoIXB0ZV9wcmVzZW50KCpwdGUpKVxuK1x0XHRyZXR1cm4gMDtcbitcdGlmICh4cGQtXHUwMDNlbnIgXHUwMDNjIHhwZC1cdTAwM2VtYXgpXG4rXHRcdHhwZC1cdTAwM2VwYWdlc1t4cGQtXHUwMDNlbnIrK10gPSBwdGVfcGFnZSgqcHRlKTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCB4c3dhcF91bm1hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0XHQgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIHVuc2lnbmVkIGxvbmcgbnIpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpc2ktXHUwMDNlY2x1c3Rlcl9pbmZvICtcbitcdFx0XHRcdCAgIChzaXplX3Qpc3RhcnRfaWR4ICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciArIChzaXplX3QpbnIgKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTtcbitcdC8qXG4rXHQgKiBSb3VuZCB0byBwYWdlIGJvdW5kYXJpZXM6IHN0YXJ0IHVwIChza2lwIHBhcnRpYWwgcGFnZSB0aGF0IG1heVxuK1x0ICogY29udGFpbiBjbHVzdGVycyBzdGlsbCBpbiB1c2UgYmVmb3JlIHN0YXJ0X2lkeCksIGVuZCB1cCBzbyB0aGVcbitcdCAqIGVudGlyZSByYW5nZSBpcyBjb3ZlcmVkLiAgdm1fYXJlYV91bm1hcF9wYWdlcygpIGFuZFxuK1x0ICogYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZSgpIG9wZXJhdGUgb24gd2hvbGUgcGFnZXMuXG4rXHQgKi9cbitcdHVuc2lnbmVkIGxvbmcgdm1fc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0X2FkZHIpO1xuK1x0dW5zaWduZWQgbG9uZyB2bV9lbmQgPSBQQUdFX0FMSUdOKGVuZF9hZGRyKTtcbitcdHVuc2lnbmVkIGxvbmcgc2l6ZTtcbitcdHVuc2lnbmVkIGxvbmcgbnBhZ2VzO1xuK1x0c3RydWN0IHhzd2FwX3BhZ2VfZGF0YSB4cGQ7XG4rXHRpbnQgaTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4rXG4rXHRpZiAodm1fc3RhcnQgXHUwMDNlPSB2bV9lbmQpIHtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdHNpemUgPSB2bV9lbmQgLSB2bV9zdGFydDtcbitcdG5wYWdlcyA9IHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXG4rXHQvKlxuK1x0ICogV2FsayB0aGUgcGFnZSB0YWJsZSB0byBjb2xsZWN0IHBoeXNpY2FsIHBhZ2VzIGJlZm9yZSB1bm1hcHBpbmcuXG4rXHQgKiB2bV9hcmVhX3VubWFwX3BhZ2VzKCkgb25seSBjbGVhcnMgUFRFcyBhbmQgZnJlZXMgaW50ZXJtZWRpYXRlXG4rXHQgKiBwYWdlIHRhYmxlIHBhZ2VzIOKAlCBpdCBkb2VzIG5vdCBmcmVlIGJhY2tpbmcgcGFnZXMuXG4rXHQgKi9cbitcdHhwZC5wYWdlcyA9IGttYWxsb2NfYXJyYXkobnBhZ2VzLCBzaXplb2YoKnhwZC5wYWdlcyksIEdGUF9LRVJORUwpO1xuK1x0aWYgKHhwZC5wYWdlcykge1xuK1x0XHR4cGQubnIgPSAwO1xuK1x0XHR4cGQubWF4ID0gbnBhZ2VzO1xuK1x0XHRhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlKFx1MDAyNmluaXRfbW0sIHZtX3N0YXJ0LCBzaXplLFxuK1x0XHRcdFx0XHQgICAgIHhzd2FwX2NvbGxlY3RfcGFnZSwgXHUwMDI2eHBkKTtcbitcdH1cbitcbitcdHZtX2FyZWFfdW5tYXBfcGFnZXMoc2ktXHUwMDNlY2x1c3Rlcl92bSwgdm1fc3RhcnQsIHZtX2VuZCk7XG4rXG4rXHQvKiBGcmVlIHRoZSBjb2xsZWN0ZWQgYmFja2luZyBwYWdlcyAqL1xuK1x0aWYgKHhwZC5wYWdlcykge1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB4cGQubnI7IGkrKylcbitcdFx0XHRfX2ZyZWVfcGFnZSh4cGQucGFnZXNbaV0pO1xuK1x0XHRrZnJlZSh4cGQucGFnZXMpO1xuK1x0fVxuK1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuK1xuK291dDpcbitcdC8qXG4rXHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxuK1x0ICovXG4rXHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCwgc3RhcnRfaWR4KTtcbit9XG4rXG4rLypcbisgKiBDYWxsYmFjayBmb3IgYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZSgpOiByZXR1cm4gMSB0byBzdG9wIGF0IHRoZVxuKyAqIGZpcnN0IHByZXNlbnQgUFRFLCBzaWduYWxsaW5nIHRoYXQgdGhlIHJhbmdlIGlzIGFscmVhZHkgbWFwcGVkLlxuKyAqL1xuK3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSlcbit7XG4rXHRyZXR1cm4gMTtcbit9XG4rXG4rLypcbisgKiBNYWludGFpbiBzaS1cdTAwM2Vucl9mcmVlX3RhaWwsIHRoZSBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0XG4rICogdGhlIHRhaWwgb2YgdGhlIG1hcHBlZCByYW5nZS4gIENhbGxlZCB3aGVuIGEgY2x1c3RlciBhdCBAZnJlZWRfaWR4IGlzXG4rICogZnJlZWQuICBQcm92aWRlcyBPKDEpIHNocmluayBkZXRlY3Rpb246IGlmIG5yX2ZyZWVfdGFpbCBpcyBub24temVybyxcbisgKiB0aGUgdGFpbCBjYW4gYmUgdW5tYXBwZWQgd2l0aG91dCBzY2FubmluZyBjbHVzdGVyX2luZm9bXS5cbisgKlxuKyAqIE9ubHkgaW5jcmVtZW50cyB3aGVuIEBmcmVlZF9pZHggaXMgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZVxuKyAqIGV4aXN0aW5nIHRhaWwgcmVnaW9uLiAgVGhlbiBzY2FucyBiYWNrd2FyZHMgZm9yIGFscmVhZHktZnJlZSBjbHVzdGVyc1xuKyAqIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwsIGJvdW5kZWQgYnkgWFNXQVBfR1JPV19DTFVTVEVSUyBhdCBhIHRpbWUuXG4rICovXG4rc3RhdGljIHZvaWQgeHN3YXBfdXBkYXRlX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGZyZWVkX2lkeClcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGlkLCBpO1xuK1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbitcbitcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitcdG5yX3RhaWwgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsKTtcbitcbitcdC8qIFByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHNocmluayB0aGF0IHJhY2VzIHBhc3QgdXMgKi9cbitcdGlmIChucl90YWlsIFx1MDAzZT0gbnJfbWFwcGVkKVxuK1x0XHRyZXR1cm47XG4rXG4rXHR0aWQgPSBucl9tYXBwZWQgLSBucl90YWlsIC0gMTtcbitcbitcdC8qIE9ubHkgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0YWlsIHJlZ2lvbiBjb3VudHMgKi9cbitcdGlmIChmcmVlZF9pZHggIT0gdGlkKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucl90YWlsKys7XG4rXHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfdGFpbCk7XG4rXG4rXHQvKiBFeHRlbmQ6IGluY2x1ZGUgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwgKi9cbitcdGZvciAoaSA9IDE7IGkgXHUwMDNjIFhTV0FQX0dST1dfQ0xVU1RFUlM7IGkrKykge1xuK1x0XHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitcdFx0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9mcmVlX3RhaWwpO1xuK1x0XHRpZiAobnJfdGFpbCBcdTAwM2U9IG5yX21hcHBlZCAtIDEpXG4rXHRcdFx0YnJlYWs7IC8qIHJlYWNoZWQgY2x1c3RlciAwICovXG4rXHRcdHRpZCA9IG5yX21hcHBlZCAtIG5yX3RhaWwgLSAxO1xuK1x0XHRjaSA9IFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1t0aWRdO1xuK1xuK1x0XHRpZiAoUkVBRF9PTkNFKGNpLVx1MDAzZWNvdW50KSB8fFxuK1x0XHQgICAgUkVBRF9PTkNFKGNpLVx1MDAzZWZsYWdzKSAhPSBDTFVTVEVSX0ZMQUdfRlJFRSlcbitcdFx0XHRicmVhaztcbitcdFx0bnJfdGFpbCsrO1xuK1x0XHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfdGFpbCk7XG4rXHR9XG4rfVxuK1xuKy8qXG4rICogVHJpbSBzaS1cdTAwM2Vucl9mcmVlX3RhaWwgd2hlbiBhIGNsdXN0ZXIgaW4gdGhlIHRhaWwgcmVnaW9uIGlzIGFsbG9jYXRlZC5cbisgKiBAaWR4OiBpbmRleCBvZiB0aGUgY2x1c3RlciBiZWluZyBhbGxvY2F0ZWQuXG4rICovXG4rc3RhdGljIHZvaWQgeHN3YXBfdHJpbV9mcmVlX3RhaWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIGlkeClcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGFpbF9zdGFydDtcbitcbitcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKlxuK1x0ICogbnJfY2x1c3RlcnNfbWFwcGVkIGFuZCBucl9mcmVlX3RhaWwgYXJlIHJlYWQgbG9ja2xlc3NseTtcbitcdCAqIGNvbmN1cnJlbnQgdXBkYXRlcyBtYXkgY2F1c2UgbnJfZnJlZV90YWlsIHRvIGJlIHRyaW1tZWRcbitcdCAqIHNsaWdodGx5IGxlc3MgdGhhbiBpZGVhbGx5LCB3aGljaCBpcyBoYXJtbGVzcy5cbitcdCAqL1xuK1x0bnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4rXHRucl90YWlsID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCk7XG4rXHR0YWlsX3N0YXJ0ID0gbnJfbWFwcGVkIC0gbnJfdGFpbDtcbitcdGlmIChpZHggXHUwMDNlPSB0YWlsX3N0YXJ0KVxuK1x0XHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfbWFwcGVkIC0gaWR4IC0gMSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHhzd2FwX3Nocmlua193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBjb250YWluZXJfb2Yod29yayxcbitcdFx0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCwgeHN3YXBfc2hyaW5rX3dvcmspO1xuK1x0eHN3YXBfdHJ5X3NocmluayhzaSk7XG4rfVxuK1xuKy8qXG4rICogVHJ5IHRvIHNocmluayB0aGUgY2x1c3Rlcl9pbmZvIHRhaWwuICBVc2VzIHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCB3aGljaFxuKyAqIGlzIG1haW50YWluZWQgaW5jcmVtZW50YWxseSBkdXJpbmcgYWxsb2MvZnJlZSDigJQgbm8gc2Nhbm5pbmcgbmVlZGVkLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHhzd2FwX3RyeV9zaHJpbmsoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfbWFwcGVkLCBucl9jZWlsaW5nLCBucl90YWlsLCBucl91bm1hcDtcbitcdHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCBpO1xuK1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbitcbitcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitcdG5yX2NlaWxpbmcgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnMpO1xuK1x0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9mcmVlX3RhaWwpO1xuK1xuK1x0aWYgKG5yX21hcHBlZCBcdTAwM2M9IG5yX2NlaWxpbmcpXG4rXHRcdHJldHVybjtcbitcdGlmIChucl90YWlsIFx1MDAzYyBYU1dBUF9HUk9XX0NMVVNURVJTKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucl91bm1hcCA9IG1pbihyb3VuZF9kb3duKG5yX3RhaWwsIFhTV0FQX0dST1dfQ0xVU1RFUlMpLFxuK1x0XHQgICAgICAgbnJfbWFwcGVkIC0gbnJfY2VpbGluZyk7XG4rXHRpZiAobnJfdW5tYXAgXHUwMDNjIFhTV0FQX0dST1dfQ0xVU1RFUlMpXG4rXHRcdHJldHVybjtcbitcdHN0YXJ0X2lkeCA9IG5yX21hcHBlZCAtIG5yX3VubWFwO1xuK1xuK1x0LyogVmVyaWZ5IHRoZSB0YWlsIGNsdXN0ZXJzIGFyZSBzdGlsbCBmcmVlIGJlZm9yZSB1bm1hcHBpbmcgKi9cbitcdHNwaW5fbG9jayhcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbitcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcdTAwM2MgbnJfbWFwcGVkOyBpKyspIHtcbitcdFx0Y2kgPSBcdTAwMjZzaS1cdTAwM2VjbHVzdGVyX2luZm9baV07XG4rXHRcdGlmIChjaS1cdTAwM2VmbGFncyAhPSBDTFVTVEVSX0ZMQUdfRlJFRSkge1xuK1x0XHRcdG5yX3VubWFwID0gaSAtIHN0YXJ0X2lkeDtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRsaXN0X2RlbChcdTAwMjZjaS1cdTAwM2VsaXN0KTtcbitcdFx0Y2ktXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORTtcbitcdH1cbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuK1xuK1x0aWYgKG5yX3VubWFwIFx1MDAzYyBYU1dBUF9HUk9XX0NMVVNURVJTKVxuK1x0XHRyZXR1cm47XG4rXG4rXHR4c3dhcF91bm1hcF9jbHVzdGVycyhzaSwgc3RhcnRfaWR4LCBucl91bm1hcCk7XG4rXHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfdGFpbCAtIG5yX3VubWFwKTtcbit9XG4rI2VuZGlmIC8qIENPTkZJR19YU1dBUCAqL1xuK1xuIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHRcdCAgICB1bmlvbiBzd2FwX2hlYWRlciAqc3dhcF9oZWFkZXIsXG4gXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcbkBAIC0zNTMyLDYgKzQxMjAsNzAgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aW50IGVyciA9IC1FTk9NRU07XG4gXHR1bnNpZ25lZCBsb25nIGk7XG4gXG4rI2lmZGVmIENPTkZJR19YU1dBUFxuK1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbitcdFx0dW5zaWduZWQgbG9uZyBzaXplID0gUEFHRV9BTElHTihucl9jbHVzdGVycyAqIHNpemVvZigqY2x1c3Rlcl9pbmZvKSk7XG4rXHRcdHN0cnVjdCB2bV9zdHJ1Y3QgKnZtO1xuK1xuK1x0XHR2bSA9IGdldF92bV9hcmVhKHNpemUsIFZNX1NQQVJTRSk7XG4rXHRcdGlmICghdm0pXG4rXHRcdFx0Z290byBlcnI7XG4rXG4rXHRcdGNsdXN0ZXJfaW5mbyA9IHZtLVx1MDAzZWFkZHI7XG4rXHRcdHNpLVx1MDAzZWNsdXN0ZXJfdm0gPSB2bTtcbitcdFx0c2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4ID0gbnJfY2x1c3RlcnM7XG4rXHRcdHNpLVx1MDAzZW5yX2NsdXN0ZXJzID0gbnJfY2x1c3RlcnM7XG4rXHRcdHNpLVx1MDAzZWNsdXN0ZXJfaW5mbyA9IGNsdXN0ZXJfaW5mbztcbitcbitcdFx0LyogTWFwIHRoZSBpbml0aWFsIGNodW5rIChhdCBsZWFzdCBjbHVzdGVyIDApICovXG4rXHRcdGlmICh4c3dhcF9tYXBfY2x1c3RlcnMoc2ksIDAsIG1pbl90KHVuc2lnbmVkIGxvbmcsXG4rXHRcdFx0XHRcdFhTV0FQX0dST1dfQ0xVU1RFUlMsIG5yX2NsdXN0ZXJzKSkpXG4rXHRcdFx0Z290byBlcnJfZnJlZV92bTtcbitcbitcdFx0LyogeHN3YXA6IG9ubHkgY2x1c3RlciAwIHNsb3QgMCBpcyBiYWQgKi9cbitcdFx0ZXJyID0gc3dhcF9jbHVzdGVyX3NldHVwX2JhZF9zbG90KHNpLCBjbHVzdGVyX2luZm8sIDAsIGZhbHNlKTtcbitcdFx0aWYgKGVycilcbitcdFx0XHRnb3RvIGVycl91bm1hcDtcbitcbitcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyk7XG4rXHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZWZ1bGxfY2x1c3RlcnMpO1xuK1x0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZzaS1cdTAwM2VkaXNjYXJkX2NsdXN0ZXJzKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU1dBUF9OUl9PUkRFUlM7IGkrKykge1xuK1x0XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZW5vbmZ1bGxfY2x1c3RlcnNbaV0pO1xuK1x0XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZWZyYWdfY2x1c3RlcnNbaV0pO1xuK1x0XHR9XG4rXG4rXHRcdC8qIE1hcmsgbWFwcGVkIGNsdXN0ZXJzOiBjbHVzdGVyIDAgaGFzIDEgYmFkIHNsb3QsIHJlc3QgZnJlZSAqL1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQ7IGkrKykge1xuK1x0XHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBcdTAwMjZjbHVzdGVyX2luZm9baV07XG4rXG4rXHRcdFx0aWYgKGkgPT0gMCkge1xuK1x0XHRcdFx0Y2ktXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORlVMTDtcbitcdFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Y2ktXHUwMDNlbGlzdCwgXHUwMDI2c2ktXHUwMDNlbm9uZnVsbF9jbHVzdGVyc1swXSk7XG4rXHRcdFx0fSBlbHNlIHtcbitcdFx0XHRcdGNpLVx1MDAzZWZsYWdzID0gQ0xVU1RFUl9GTEFHX0ZSRUU7XG4rXHRcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmNpLVx1MDAzZWxpc3QsIFx1MDAyNnNpLVx1MDAzZWZyZWVfY2x1c3RlcnMpO1xuK1x0XHRcdH1cbitcdFx0fVxuK1xuK1x0XHQvKiBBbGwgbWFwcGVkIGNsdXN0ZXJzIGV4Y2VwdCBjbHVzdGVyIDAgYXJlIGZyZWUgYXQgdGhlIHRhaWwgKi9cbitcdFx0c2ktXHUwMDNlbnJfZnJlZV90YWlsID0gc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkIC0gMTtcbitcbitcdFx0bXV0ZXhfaW5pdChcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbitcdFx0SU5JVF9XT1JLKFx1MDAyNnNpLVx1MDAzZXhzd2FwX3Nocmlua193b3JrLCB4c3dhcF9zaHJpbmtfd29ya19mbik7XG4rXHRcdHhzd2FwX2RlYnVnZnNfYWRkKHNpKTtcbitcdFx0cmV0dXJuIDA7XG4rXG4rZXJyX3VubWFwOlxuK1x0XHR4c3dhcF91bm1hcF9jbHVzdGVycyhzaSwgMCwgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitlcnJfZnJlZV92bTpcbitcdFx0ZnJlZV92bV9hcmVhKHNpLVx1MDAzZWNsdXN0ZXJfdm0pO1xuK1x0XHRzaS1cdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcbitcdFx0c2ktXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbisjZW5kaWYgLyogQ09ORklHX1hTV0FQICovXG4rXG4gXHRjbHVzdGVyX2luZm8gPSBrdnphbGxvY19vYmpzKCpjbHVzdGVyX2luZm8sIG5yX2NsdXN0ZXJzKTtcbiBcdGlmICghY2x1c3Rlcl9pbmZvKVxuIFx0XHRnb3RvIGVycjtcbkBAIC0zNTk5LDcgKzQyNTEsNyBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRzaS1cdTAwM2VjbHVzdGVyX2luZm8gPSBjbHVzdGVyX2luZm87XG4gXHRyZXR1cm4gMDtcbiBlcnI6XG4tXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xuK1x0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzaSk7XG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbkBAIC0zODE4LDcgKzQ0NzAsNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFx0c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXIgPSBOVUxMO1xuIFx0aW5vZGUgPSBOVUxMO1xuIFx0ZGVzdHJveV9zd2FwX2V4dGVudHMoc2ksIHN3YXBfZmlsZSk7XG4tXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHNpLVx1MDAzZWNsdXN0ZXJfaW5mbywgc2ktXHUwMDNlbWF4KTtcbitcdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpO1xuIFx0c2ktXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbiBcdC8qXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xuQEAgLTM5MzAsNyArNDU4Miw2IEBAIHZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXG4gc3RhdGljIGludCBfX2luaXQgc3dhcGZpbGVfaW5pdCh2b2lkKVxuIHtcbiBcdHN3YXBmaWxlX21heGltdW1fc2l6ZSA9IGFyY2hfbWF4X3N3YXBmaWxlX3NpemUoKTtcbi1cbiBcdC8qXG4gXHQgKiBPbmNlIGEgY2x1c3RlciBpcyBmcmVlZCwgaXQncyBzd2FwIHRhYmxlIGNvbnRlbnQgaXMgcmVhZFxuIFx0ICogb25seSwgYW5kIGFsbCBzd2FwIGNhY2hlIHJlYWRlcnMgKHN3YXBfY2FjaGVfKikgdmVyaWZpZXNcbkBAIC0zOTQwLDEyICs0NTkxLDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHN3YXBmaWxlX2luaXQodm9pZClcbiBcdFx0c3dhcF90YWJsZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShcInN3YXBfdGFibGVcIixcbiBcdFx0XHRcdCAgICBzaXplb2Yoc3RydWN0IHN3YXBfdGFibGUpLFxuIFx0XHRcdFx0ICAgIDAsIFNMQUJfUEFOSUMgfCBTTEFCX1RZUEVTQUZFX0JZX1JDVSwgTlVMTCk7XG4tXG4gI2lmZGVmIENPTkZJR19NSUdSQVRJT05cbiBcdGlmIChzd2FwZmlsZV9tYXhpbXVtX3NpemUgXHUwMDNlPSAoMVVMIFx1MDAzY1x1MDAzYyBTV1BfTUlHX1RPVEFMX0JJVFMpKVxuIFx0XHRzd2FwX21pZ3JhdGlvbl9hZF9zdXBwb3J0ZWQgPSB0cnVlO1xuICNlbmRpZlx0LyogQ09ORklHX01JR1JBVElPTiAqL1xuIFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitcdHhzd2FwX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihcInhzd2FwXCIsIE5VTEwpO1xuKyNlbmRpZlxuK1xuIFx0cmV0dXJuIDA7XG4gfVxuIHN1YnN5c19pbml0Y2FsbChzd2FwZmlsZV9pbml0KTtcbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xuaW5kZXggZjdjOWM4OWY2NDQ5Yy4uNjE3ODQ2NWQwNTgzNyAxMDA2NDRcbi0tLSBhL21tL3pzd2FwLmNcbisrKyBiL21tL3pzd2FwLmNcbkBAIC05OTgsNyArOTk4LDEyIEBAIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHQvKiB0cnkgdG8gYWxsb2NhdGUgc3dhcCBjYWNoZSBmb2xpbyAqL1xuIFx0c2kgPSBnZXRfc3dhcF9kZXZpY2Uoc3dwZW50cnkpO1xuIFx0aWYgKCFzaSlcbi1cdFx0cmV0dXJuIC1FRVhJU1Q7XG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbitcdFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4gXG4gXHRtcG9sID0gZ2V0X3Rhc2tfcG9saWN5KGN1cnJlbnQpO1xuIFx0Zm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cGVudHJ5LCBHRlBfS0VSTkVMLCBCSVQoMCksIE5VTEwsIG1wb2wsXG5AQCAtMTUzNSw3ICsxNTQwLDcgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0enN3YXBfcG9vbF9wdXQocG9vbCk7XG4gcHV0X29iamNnOlxuIFx0b2JqX2Nncm91cF9wdXQob2JqY2cpO1xuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsKVxuK1x0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsIFx1MDAyNlx1MDAyNiBhdG9taWNfcmVhZChcdTAwMjZucl9yZWFsX3N3YXBmaWxlcykpXG4gXHRcdHF1ZXVlX3dvcmsoc2hyaW5rX3dxLCBcdTAwMjZ6c3dhcF9zaHJpbmtfd29yayk7XG4gY2hlY2tfb2xkOlxuIFx0LypcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE0OjM5LjQ3ODY0NjA0MloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE0MTIzMzE5ODE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlhzd2FwIFBhdGNoIEV2YWx1YXRpb246IEZ1enppbmcgRm9jdXMqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlIGhhdmUgYSBwYXRjaCBzZXJpZXMgaW50cm9kdWNpbmcgXCJ4c3dhcCxcIiBhbiBcIkV4dGVuZGFibGUgc3dhcCBkZXZpY2UuXCIgTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgd2hldGhlciB0aGlzIGludHJvZHVjZXMgbmV3IGtlcm5lbCBmdW5jdGlvbmFsaXR5IGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgbmVlZHMgZnV6emluZy5cblxuVGhlIHBhdGNoJ3Mga2V5IGlzIHRoZSBgQ09ORklHX1hTV0FQYCBLY29uZmlnIG9wdGlvbi4gRGVwZW5kZW5jeSBvbiBgU1dBUGAgYW5kIGA2NEJJVGAgYXJlIHJlYXNvbmFibGUuIFRoZSByZWFsbHkgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGUgbW9kaWZpY2F0aW9uIHRvIGBtbS9zd2FwZmlsZS5jYCwgZXNwZWNpYWxseSB0aGUgaGFuZGxpbmcgb2YgdGhlIGBTV1BfWFNXQVBgIGZsYWcuIFNwZWNpZmljYWxseSwgdGhlIGBkZWJ1Z2ZzYCBpbnRlcmZhY2UgZXhwb3NpbmcgYHR5cGVcdTAwM2NOXHUwMDNlX2NsdXN0ZXJfbGltaXRgIGxvb2tzIGxpa2UgYSBwcmltZSB0YXJnZXQuIFRoZSBjb3JlIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBzZWVtcyB0byBiZSB0cmlnZ2VyZWQgYnkgY3JlYXRpbmcgYSBzd2FwIGZpbGUgdGhhdCdzIHByZWNpc2VseSBgUEFHRV9TSVpFYCBpbiBzaXplLiBBbmQgdGhlbiBydW5uaW5nIGBzd2Fwb25gLiBTbyB0aGlzIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZS4gQmluZ28hIFRoaXMgaXMgYSBnb29kIHNpZ24gZm9yIGZ1enppbmcuXG5cbk5vdywgd2hpY2ggZnVuY3Rpb25zIGFyZSBtb3N0IHJlbGV2YW50PyBUaGUgcGF0Y2ggdG91Y2hlcyBhIGxvdCBvZiBjb2RlLCBtb2RpZnlpbmcgc2V2ZXJhbCBmaWxlcy4gSSd2ZSBzY2FubmVkIHRoZSBjaGFuZ2VzLCBub3RpbmcgYSBidW5jaCBvZiBmdW5jdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIG9yIG1vZGlmaWVkLiBUaGUga2V5IG9uZXMgdGhhdCBpbW1lZGlhdGVseSBqdW1wIG91dCBhcmU6IGB4c3dhcF9tYXBfY2x1c3RlcnNgLCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLCBgeHN3YXBfY2hlY2tfbWFwcGVkYCwgYHhzd2FwX3RyaW1fZnJlZV90YWlsYCwgYHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWxgLCBgeHN3YXBfdHJ5X3Nocmlua2AsIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGAsIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLCBgeHN3YXBfZGVidWdmc19hZGRgLCBgeHN3YXBfZGVidWdmc19kZWxgLCBgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvYCwgYHJlYWRfc3dhcF9oZWFkZXJgLCBgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5YCwgYF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXNgLCBgX19mcmVlX2NsdXN0ZXJgLCBgc3dhcG9mZmAsIGBzd2Fwb25gLlxuXG5SZW1lbWJlcmluZyB0aGUgZnV6emluZyBwcmluY2lwbGUsIFwicHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXCIuXG5cbmBzeXNfc3dhcG9uYCBhbmQgYHN5c19zd2Fwb2ZmYCBhcmUgdGhlIGVudHJ5IHBvaW50cyBzbyB0aGVzZSBhcmUgb2J2aW91cyB0YXJnZXRzLiBMZXQncyBkaWcgZGVlcGVyOlxuXG5XaGlsZSBgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5YCBpcyBtb2RpZmllZCwgaXQncyBzdGF0aWMsIHNvIGxlc3MgaW50ZXJlc3RpbmcgZnJvbSBhIGZ1enppbmcgcGVyc3BlY3RpdmUsIHVubGVzcyBpdCdzIG5vdCBpbmxpbmVkLlxuXG5UaGUgZm9jdXMgc2hvdWxkIGJlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGluIHRoZSBtb2RpZmllZCBmaWxlcy4gTGV0J3Mgc2VlLi4uIGxvb2tpbmcgYXQgYG1tL3N3YXBmaWxlLmNgLCB0aGVyZSdzIG5vdCBhIGxvdCBvZiBub24tc3RhdGljIHN0dWZmIHRoYXQgSSBjYW4gc2VlIGRpcmVjdGx5LCBgc2V0dXBfc3dhcF9leHRlbnRzYCBpcyBzdGF0aWMuXG5cbkluIGBtbS9wYWdlX2lvLmNgLCBib3RoIGBzd2FwX3dyaXRlb3V0YCBhbmQgYHN3YXBfcmVhZF9mb2xpb2AgYXJlIG5vbi1zdGF0aWM7IGtlZXAgdGhlbSBpbiBtaW5kLiBgc3dhcF9jbHVzdGVyX3JlYWRhaGVhZGAgaW4gYG1tL3N3YXBfc3RhdGUuY2AgaXMgbm9uLXN0YXRpYyBhcyB3ZWxsLlxuXG5JbiBgbW0venN3YXAuY2AsIGB6c3dhcF9zdG9yZWAgaXMgbm9uLXN0YXRpYy5cblxuQWgsIGJ1dCB3YWl0LiBgeHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlYC4gVGhpcyBpcyB0cmlnZ2VyZWQgdmlhIGEgZGVidWdmcyB3cml0ZSwgd2hpY2ggaXMgYW5vdGhlciBlbnRyeXBvaW50LiBJIHRob3VnaHQgdGhpcyB3YXMgc3RhdGljLCBidXQgaXQgY2Fubm90IGJlIGlubGluZWQsIGJlY2F1c2UgaXQncyBwYXNzZWQgYXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIGBkZWJ1Z2ZzX2NyZWF0ZV9maWxlYC4gVGhpcyBpcyBhbiBpZGVhbCB0YXJnZXQhXG5cbkxldCdzIHF1aWNrbHkgY29uZmlybSB3aXRoIGEgYGRlZmF1bHRfYXBpOmdyZXBwZXJgIHRvIGJlIDEwMCUgc3VyZS4gSSB3YW50IHRvIG1ha2Ugc3VyZSBJIGRvbid0IG1pc3Mgc29tZXRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDA0OCwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwODgsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNDo1My42MDE5Njc4NjhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU3MDY0OTI0MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcGZpbGUuYz04Nj1zdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZixcXG4tLVxcbm1tL3N3YXBmaWxlLmMtOTYtXFxubW0vc3dhcGZpbGUuYzo5NzpzdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsXFxubW0vc3dhcGZpbGUuYy05OC1cXHRcXHRcXHRcXHRcXHRjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxcbi0tXFxubW0vc3dhcGZpbGUuYz0xMzY9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xcbm1tL3N3YXBmaWxlLmMtMTM3LVxcdC5yZWFkID0geHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQsXFxubW0vc3dhcGZpbGUuYzoxMzg6XFx0LndyaXRlID0geHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlLFxcbm1tL3N3YXBmaWxlLmMtMTM5LVxcdC5vcGVuID0gc2ltcGxlX29wZW4sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE0OjU1LjE3MjYyMjA5OVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQwNjA2OTI2MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFN3YXAgQ2x1c3RlciBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBzd2FwLXJlbGF0ZWQgZnVuY3Rpb25zLCBhbmQgeWVwLCB0aGV5J3JlIGRlZmluaXRlbHkgcHJlc2VudC4gSSBzZWU6IGB4c3dhcF9tYXBfY2x1c3RlcnNgLCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLCBgeHN3YXBfdHJ5X3Nocmlua2AsIGB4c3dhcF91cGRhdGVfZnJlZV90YWlsYCwgYW5kIGB4c3dhcF90cmltX2ZyZWVfdGFpbGAuIEEgcXVpY2sgY2hlY2sgY29uZmlybXMgdGhlc2UgYXJlIGRlY2xhcmVkIHN0YXRpYyDigJMgZ29vZCwgdGhhdCdzIHdoYXQgSSBleHBlY3RlZC4gTm93LCBqdXN0IGJlY2F1c2UgdGhleSdyZSBzdGF0aWMgZG9lc24ndCBhdXRvbWF0aWNhbGx5IG1lYW4gdGhleSdyZSBpbmxpbmVkLCBzbyB0aGF0J3Mgc29tZXRoaW5nIHRvIGtlZXAgaW4gbWluZC4gSSBuZWVkIHRvIGRpZyBhIGxpdHRsZSBkZWVwZXIuIExldCBtZSBleGFtaW5lIGBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm9gIG5leHQuIFRoYXQgc2hvdWxkIHByb3ZpZGUgc29tZSBjb250ZXh0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjA5MywiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE0OjU5LjIzMzMxNjU1NloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjgwNjkxMTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNldHVwX3N3YXBfY2x1c3RlcnNfaW5mb1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwZmlsZS5jPTQwNjk9c3RhdGljIHZvaWQgeHN3YXBfdHJ5X3NocmluayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQxMTMtXFxubW0vc3dhcGZpbGUuYzo0MTE0OnN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTQxMTUtXFx0XFx0XFx0XFx0ICAgIHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcXG4tLVxcbm1tL3N3YXBmaWxlLmM9NDI1OD1TWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbi0tXFxubW0vc3dhcGZpbGUuYy00MzY5LVxcdC8qIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8gKi9cXG5tbS9zd2FwZmlsZS5jOjQzNzA6XFx0ZXJyb3IgPSBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc2ksIHN3YXBfaGVhZGVyLCBtYXhwYWdlcyk7XFxubW0vc3dhcGZpbGUuYy00MzcxLVxcdGlmIChlcnJvcilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MDAuOTE0MDE0MzU5WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Njg1NTMzMjgzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgU3dhcCBFbnRyeSBQb2ludHMgYW5kIENvcmUgeHN3YXAgRnVuY3Rpb25zKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIGFib3V0IGhvdyB0byBiZXN0IGNoYXJhY3Rlcml6ZSB0aGUgY2hhbmdlcyBpbiB0aGlzIHBhdGNoLCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGdvZXMgc3RyYWlnaHQgdG8gc3lzdGVtIGNhbGwgZW50cnkgcG9pbnRzLiBgc3lzX3N3YXBvbmAgYW5kIGBzeXNfc3dhcG9mZmAgYXJlIHRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50cy4gQnV0LCB3YWl0LCBJIG5lZWQgdG8gYmUgcHJlY2lzZS4gSSByZW1lbWJlciBgc3lzX3N3YXBvbmAgaXMgcHJvYmFibHkgYSB3cmFwcGVyIGxpa2UgYF9feDY0X3N5c19zd2Fwb25gIHdoaWNoIHRoZW4gY2FsbHMgdGhlIGFjdHVhbCBmdW5jdGlvbiwgYF9fZG9fc3lzX3N3YXBvbmAgb3IgYHN5c19zd2Fwb25gIGRpcmVjdGx5LiBcblxuTm93LCBJIHN0YXJ0IGxpc3Rpbmcgc29tZSByZWxhdGVkIGZ1bmN0aW9ucyB0aGF0IGNvbWUgdG8gbWluZDogYHN3YXBfd3JpdGVvdXRgLCBgc3dhcF9yZWFkX2ZvbGlvYCwgYHN3YXBfY2x1c3Rlcl9yZWFkYWhlYWRgLCBhbmQgYHpzd2FwX3N0b3JlYC4gQnV0IGhvbGQgb24sIHRoZSBwcm9tcHQgc3BlY2lmaWNhbGx5IHNheXMgdG8gYXZvaWQgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8ga2VlcCB0aGUgdGVzdCBkaXN0cmlidXRpb25zIGZyb20gYmVpbmcgc2tld2VkISBTbywgc2NyYXRjaCB0aG9zZSDigJMgdGhleSdyZSB0b28gY29tbW9uLlxuXG5JbnN0ZWFkLCBJIG5lZWQgdG8gZHJpbGwgZG93biBpbnRvIHRoZSBzZXR1cCwgdGVhcmRvd24sIGFuZCAqc3BlY2lmaWMqIHhzd2FwIGZ1bmN0aW9ucyB0aGF0IHJlYWxseSBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoaXMuIENhbiBJIGxpc3QgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAsIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGAsIGB4c3dhcF9zaHJpbmtfd29ya19mbmAsIGB4c3dhcF9tYXBfY2x1c3RlcnNgLCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLCBhbmQgYHhzd2FwX3RyeV9zaHJpbmtgPyBFdmVuIGlmIHNvbWUgYXJlIGRlY2xhcmVkIGBzdGF0aWNgLCB0aGV5J3JlIGNlbnRyYWwgdG8gdGhlIGNoYW5nZXMuXG5cbkxldCBtZSBqdXN0IHF1aWNrbHkgdmVyaWZ5IGhvdyBgeHN3YXBfbWFwX2NsdXN0ZXJzYCBpcyB1c2VkLiBJcyBpdCBwYXNzZWQgYXMgYSBwb2ludGVyIG9yIGp1c3QgY2FsbGVkPyBPa2F5LCBpdCdzIGp1c3QgY2FsbGVkIGRpcmVjdGx5LCBidXQgaXQgbG9va3MgbGlrZSBhIGxhcmdlIGZ1bmN0aW9uIHNvIGl0J3MgcHJvYmFibHkgbm90IGlubGluZWQuXG5cbkFuZCB3aGF0IGFib3V0IGB4c3dhcF9zaHJpbmtfd29ya19mbmA/IFllcywgaXQncyBwYXNzZWQgdG8gYElOSVRfV09SS2AsIHNvIEkga25vdyBmb3Igc3VyZSB0aGF0IGl0IHdvbid0IGJlIGlubGluZWQuIFRoaXMgc2hvdWxkIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY1OTYsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MDcuNzY5MzQ5OTAxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NjEzMDI5OTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwieHN3YXBfc2hyaW5rX3dvcmtfZm5cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcGZpbGUuYz00MDM5PXN0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwNTctXFxubW0vc3dhcGZpbGUuYzo0MDU4OnN0YXRpYyB2b2lkIHhzd2FwX3Nocmlua193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG5tbS9zd2FwZmlsZS5jLTQwNTkte1xcbi0tXFxubW0vc3dhcGZpbGUuYz00MTE0PXN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmMtNDE3Mi1cXHRcXHRtdXRleF9pbml0KFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxubW0vc3dhcGZpbGUuYzo0MTczOlxcdFxcdElOSVRfV09SSyhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX3Nocmlua193b3JrLCB4c3dhcF9zaHJpbmtfd29ya19mbik7XFxubW0vc3dhcGZpbGUuYy00MTc0LVxcdFxcdHhzd2FwX2RlYnVnZnNfYWRkKHNpKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MDkuMjMwNjYyOTA5WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTc1NTMyMTcwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBYU1dBUCBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIEkndmUgYmVlbiByZXZpZXdpbmcgdGhpcyBjb2RlLCBhbmQgaXQncyBjbGVhciB0aGF0IGB4c3dhcF9zaHJpbmtfd29ya19mbmAsIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLCBhbmQgYHhzd2FwX21heF9jbHVzdGVyc19yZWFkYCBhcmUgKm5vdCogaW5saW5lZCwgd2hpY2ggaXMgZ29vZCB0byBub3RlLiBBbHNvLCBib3RoIGB4c3dhcF9jaGVja19tYXBwZWRgIGFuZCBgeHN3YXBfY29sbGVjdF9wYWdlYCBhcmUgcGFzc2VkIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGBhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlYCwgY29uZmlybWluZyB0aGV5IHdvbid0IGJlIGlubGluZWQgZWl0aGVyLlxuXG5Ob3csIHJlZ2FyZGluZyB0aGUgbmVjZXNzYXJ5IEtjb25maWcgb3B0aW9ucywgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGBDT05GSUdfWFNXQVBgLCBhbmQgaXQgZXhwbGljaXRseSBkZXBlbmRzIG9uIGJvdGggYFNXQVBgIGFuZCBgNjRCSVRgLiBTbywgYFhTV0FQYCBpcyBkZWZpbml0ZWx5IHRoZSBtYWluIG9uZSB0byBmb2N1cyBvbiBmb3IgZW5hYmxpbmcgdGhpcyBmZWF0dXJlLiBJIG5lZWQgdG8gbWFrZSBhIG5vdGUgb2YgdGhpcy5cblxuQXJlIHRoZXJlIGFueSBvdGhlciBkZXBlbmRlbmNpZXM/IExldCdzIHNlZS4uLiBgQ09ORklHX0RFQlVHX0ZTYCBpcyBhcHBhcmVudGx5IHJlcXVpcmVkIGJlY2F1c2Ugb2YgYGRlYnVnZnNfY3JlYXRlX2ZpbGVgLiBBbHRob3VnaCBgZGVidWdmc19jcmVhdGVfZmlsZWAgaGFzIGEgZHVtbXkgaW5saW5lIGlmIGBERUJVR19GU2AgaXMgZGlzYWJsZWQsIGFuZCB0aHVzIGlzbid0ICpzdHJpY3RseSogcmVxdWlyZWQgZm9yIGNvbXBpbGF0aW9uLCBpdCdzIGRlZmluaXRlbHkgbmVlZGVkIGZvciB0ZXN0aW5nIHRoZSBkZWJ1Z2ZzIGludGVyZmFjZSwgc28gSSBzaG91bGQgcHJvYmFibHkgaW5jbHVkZSBpdCBmb3IgZnVsbCBmdW5jdGlvbmFsaXR5LiBJIG5lZWQgdG8gY2hlY2sgYG1tL0tjb25maWdgIHRvIGNvbmZpcm0gd2hlcmUgYFhTV0FQYCBpcyBkZWZpbmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzU3MiwiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNToxNC45ODU5ODczMThaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzczNDIzMjMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFhTV0FQXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9MTE0PWNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRcXG4tLVxcbm1tL0tjb25maWctMTI0LVxcbm1tL0tjb25maWc6MTI1OmNvbmZpZyBYU1dBUFxcbm1tL0tjb25maWctMTI2LVxcdGJvb2wgXFxcIkV4dGVuZGFibGUgKHZpcnR1YWwpIHN3YXAgZGV2aWNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNToxNi41MjMzMzgwNDFaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUzNzYyMTM0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKk5hdmlnYXRpbmcgdGhlIEtjb25maWcgTGFieXJpbnRoKipcblxuT2theSwgdGltZSB0byBkaXZlIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGFnYWluLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIHNldHRpbmdzIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSwgc29tZXRoaW5nIEknbSB0cm91Ymxlc2hvb3RpbmcuIExldCdzIHNlZS4uLiBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgaXMgdXN1YWxseSB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEknbGwgbmVlZCB0byBnbyB0byB0aGF0IGZpbGUgdG8gY2hlY2sgd2hhdCB0aGUgS2NvbmZpZyBzZXR0aW5ncyBhcmUsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAxMjUsIHRoYXQncyB1c3VhbGx5IHdoZXJlIHRoZSByZWxldmFudCBvcHRpb25zIGFyZS4gSSdsbCBmb2N1cyBteSBpbnZlc3RpZ2F0aW9uIHRoZXJlLiBIb3BlZnVsbHksIHRoYXQgd2lsbCBnaXZlIG1lIHNvbWUgY2xhcml0eSBvbiB0aGUgZmVhdHVyZSBhbmQgaXRzIGNvbmZpZ3VyYXRpb24uIEknbSBob3BpbmcgSSBjYW4gZmluZCB0aGUgYW5zd2VyIHF1aWNrbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MjEyLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MjAuMDYwOTYxNTg0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk2NjcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMTE1LFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTE1OlxcdCAgICAgICBzdHJpbmdcXG4gMTE2OlxcdCAgICAgICBkZXBlbmRzIG9uIFpTV0FQXFxuIDExNzpcXHQgICAgICAgZGVmYXVsdCBcXFwiZGVmbGF0ZVxcXCIgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0RFRkxBVEVcXG4gMTE4OlxcdCAgICAgICBkZWZhdWx0IFxcXCJsem9cXFwiIGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWk9cXG4gMTE5OlxcdCAgICAgICBkZWZhdWx0IFxcXCI4NDJcXFwiIGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF84NDJcXG4gMTIwOlxcdCAgICAgICBkZWZhdWx0IFxcXCJsejRcXFwiIGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRcXG4gMTIxOlxcdCAgICAgICBkZWZhdWx0IFxcXCJsejRoY1xcXCIgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaNEhDXFxuIDEyMjpcXHQgICAgICAgZGVmYXVsdCBcXFwienN0ZFxcXCIgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX1pTVERcXG4gMTIzOlxcdCAgICAgICBkZWZhdWx0IFxcXCJcXFwiXFxuIDEyNDpcXHRcXG4gMTI1OlxcdGNvbmZpZyBYU1dBUFxcbiAxMjY6XFx0XFx0Ym9vbCBcXFwiRXh0ZW5kYWJsZSAodmlydHVhbCkgc3dhcCBkZXZpY2VcXFwiXFxuIDEyNzpcXHRcXHRkZXBlbmRzIG9uIFNXQVAgXFx1MDAyNlxcdTAwMjYgNjRCSVRcXG4gMTI4OlxcdFxcdGhlbHBcXG4gMTI5OlxcdFxcdCAgQWRkcyBzdXBwb3J0IGZvciBleHRlbmRhYmxlIHN3YXAgZGV2aWNlcyAoeHN3YXApIHRoYXQgZGVjb3VwbGVcXG4gMTMwOlxcdFxcdCAgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gVGhlIGNsdXN0ZXJfaW5mb1xcbiAxMzE6XFx0XFx0ICBhcnJheSBpcyBiYWNrZWQgYnkgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIHRoYXQgZ3Jvd3MgYW5kIHNocmlua3NcXG4gMTMyOlxcdFxcdCAgb24gZGVtYW5kLCBhdm9pZGluZyBzdGF0aWMgcHJlLWFsbG9jYXRpb24gb3ZlcmhlYWQuXFxuIDEzMzpcXHRcXG4gMTM0OlxcdGNvbmZpZyBaU01BTExPQ1xcbiAxMzU6XFx0XFx0dHJpc3RhdGVcXG4gMTM2OlxcdFxcbiAxMzc6XFx0bWVudSBcXFwiWnNtYWxsb2MgYWxsb2NhdG9yIG9wdGlvbnNcXFwiXFxuIDEzODpcXHRcXHRkZXBlbmRzIG9uIFpTTUFMTE9DXFxuIDEzOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MjAuMDYxMDU5NDU0WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcwNjEzNTM0NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQ29uZmlndXJhdGlvbiBDaG9pY2VzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgdGhlIGZpcnN0IHRoaW5nIEkgbmVlZCB0byBkbyBpcyBjb25maWd1cmUgaXQuIFRoZSBjcml0aWNhbCBwaWVjZSBoZXJlIHNlZW1zIHRvIGJlIGBYU1dBUGAsIHNvIEknbGwgYmUgc3VyZSB0byBhZGQgdGhhdCB0byB0aGUgYEVuYWJsZUNvbmZpZ3NgLiBHaXZlbiB0aGF0IGRlYnVnZnMgaXMgYSBjZW50cmFsIHBhcnQgb2YgdGhpcywgSSdsbCBhbHNvIGJyaW5nIGluIGBERUJVR19GU2AgdG8gZW5zdXJlIHdlIGNhbiBmdXp6IGl0IGVmZmVjdGl2ZWx5LiBUaGF0J2xsIGJlIGltcG9ydGFudCBmb3IgdGhvcm91Z2ggdGVzdGluZy5cblxuTm93LCBvbiB0byB0aGUgQVBJIGV4cG9zdXJlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBmdW5jdGlvbnMgYXJlIHRoZSBrZXkgZW50cnkgcG9pbnRzLiBMZXQgbWUgc2VlIGlmIGB4c3dhcF9tYXBfY2x1c3RlcnNgIGlzIHN0YXRpYyAtIHllcCwgaXQgaXMuIFRoZSBwcm9tcHQgZG9lcyBzYXkgdG8gXCJQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcIi5cblxuQWxyaWdodCwgaGVyZeKAmXMgbXkgcGxhbiBmb3IgbGlzdGluZzogSSdsbCBpbmNsdWRlOlxuKiAgIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgXG4qICAgYHhzd2FwX21heF9jbHVzdGVyc19yZWFkYFxuKiAgIGB4c3dhcF9zaHJpbmtfd29ya19mbmBcbiogICBgeHN3YXBfY2hlY2tfbWFwcGVkYFxuKiAgIGB4c3dhcF9jb2xsZWN0X3BhZ2VgXG4qICAgYHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mb2AgKGV2ZW4gdGhvdWdoIGl0J3Mgc3RhdGljLCBpdCdzIGEgbWFqb3Igc2V0dXAgZnVuY3Rpb24gYW5kIHByZXR0eSBzaWduaWZpY2FudCkuXG5cbkhhbmcgb24sIGRpZCBJIGp1c3QgbGlzdCBgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvYD8gVGhhdCdzIHJpZ2h0LCBpdCAqaXMqIHN0YXRpYy4gTGV0IG1lIHF1aWNrbHkgcmVhc3Nlc3MuIEkgc2hvdWxkIGNvbnNpZGVyIGBzeXNfc3dhcG9uYCBhbmQgYHN5c19zd2Fwb2ZmYCEgQmVpbmcgc3lzY2FsbHMsIHRoZXNlIGFyZSBkZWZpbml0ZWx5IGVudHJ5IHBvaW50cy4gSSBzaG91bGQgYWxzbyBjaGVjayBgbW0vc3dhcGZpbGUuY2AgdG8gYmUgY2VydGFpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg4MjMsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNToyNy4xMjI0MTU4NjJaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwODAwMDk0ODUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiU1lTQ0FMTF9ERUZJTkUuKnN3YXBvblwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwZmlsZS5jPTQxMTQ9c3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbi0tXFxubW0vc3dhcGZpbGUuYy00MjU3LVxcbm1tL3N3YXBmaWxlLmM6NDI1ODpTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbm1tL3N3YXBmaWxlLmMtNDI1OS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE1OjI5LjIwMjQyOTc2N1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTI3ODk3NzA5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBYc3dhcCBGdXp6aW5nIFRhcmdldCBTZWxlY3Rpb24qKlxuXG5Pa2F5LCBsZXQncyB0aGluayB0aGlzIHRocm91Z2guIFRoZSBwcm9tcHQgYXNrcyBmb3IgYSBsaXN0IG9mIGtlcm5lbCBmdW5jdGlvbnMgdG8gZm9jdXMgZnV6emluZyBlZmZvcnRzIG9uLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbmV3IHhzd2FwIGZ1bmN0aW9uYWxpdHkuIFN5emthbGxlciB1c3VhbGx5IHVzZXMgdGhlIGFjdHVhbCBzeW1ib2wgbmFtZXMsIHNvIEkgbmVlZCB0byBkZWNpZGUgd2hhdCdzIG1vc3QgYXBwcm9wcmlhdGUgaGVyZS4gU2hvdWxkIEkgbGlzdCB0aGUgc3lzY2FsbCBlbnRyeSBwb2ludCAoYF9feDY0X3N5c19zd2Fwb25gIG9yIGBzeXNfc3dhcG9uYCkgb3IgZGVsdmUgZGVlcGVyIGludG8gdGhlIGludGVybmFscz9cblxuVGhlIHByZWZlcmVuY2UgaXMgZm9yIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cy4gVGhpbmtpbmcgYWJvdXQgdGhhdCwgdGhlIG9yaWdpbmFsIHRob3VnaHQgd2FzIHRvIGxpc3QgZnVuY3Rpb25zICppbnNpZGUqIHRoZSBzeXNjYWxsLCBsaWtlIGBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm9gLiBCdXQgdGhlbiB0aGUgcHJvbXB0IGNsYXJpZmllZCB0aGUgbmVlZCB0byBhdm9pZCBzdGF0aWMgaW5saW5lZCBoZWxwZXIgZnVuY3Rpb25zLiBUaGF0IG1ha2VzIHNlbnNlLlxuXG5TbywgSSBuZWVkIHRvIGlkZW50aWZ5IGZ1bmN0aW9ucyB0aGF0IGFyZSAqbm90KiBpbmxpbmVkIGFuZCBoYXZlIGRpc3RpbmN0IGFkZHJlc3Nlcy4gSW1tZWRpYXRlbHksIEknbSB0aGlua2luZyBhYm91dCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgdXNlZC4gRnVuY3Rpb25zIGxpa2UgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAsIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGAsIGB4c3dhcF9zaHJpbmtfd29ya19mbmAsIGB4c3dhcF9jaGVja19tYXBwZWRgLCBhbmQgYHhzd2FwX2NvbGxlY3RfcGFnZWAgYXJlIHBhc3NlZCBhcyBmdW5jdGlvbiBwb2ludGVycy4gVGhlc2UgYXJlIGhpZ2hseSB1bmxpa2VseSB0byBiZSBpbmxpbmVkIGFuZCBhcmUgZ3JlYXQgY2FuZGlkYXRlcy5cblxuV2hhdCBhYm91dCBvdGhlciBmdW5jdGlvbnM/IGBzd2FwX3R5cGVfc3RyYCBpcyBhIHByaW50IGhlbHBlciwgc28gdGhhdCdzIG91dC4gVGhlbiBteSBtaW5kIGlzIG9uIGB4c3dhcF9tYXBfY2x1c3RlcnNgIGFuZCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLiBUaGV5ICptaWdodCogYmUgaW5saW5lZC4gQnV0IGB4c3dhcF9tYXBfY2x1c3RlcnNgIGlzIGEgc3Vic3RhbnRpYWwgZnVuY3Rpb27igJQxMzAgbGluZXMhIEl0J3MgcHJvYmFibHkgYSBnb29kIHRhcmdldCBiZWNhdXNlIGl0IGlzIGxlc3MgbGlrZWx5IHRvIGJlIGlubGluZWQuXG5cblRoZSB4c3dhcCBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dGVuZGFibGUgdmlydHVhbCBzd2FwIGRldmljZS4gVGhlIGltcGxlbWVudGF0aW9uIGRlY291cGxlcyBQVEUgc3dhcCBlbnRyaWVzIGZyb20gcGh5c2ljYWwgYmFja2luZyBzdG9yYWdlIGFuZCB1c2VzIGEgc3BhcnNlIHZtYWxsb2MgYXJlYSBmb3IgY2x1c3RlciBpbmZvLiBUaGlzIG9wZW5zIHVwIG5ldyBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0IG5lZWRzIGF0dGVudGlvbiwgaW5jbHVkaW5nIGRlYnVnZnMgaW50ZXJmYWNlcyBhbmQgYSBzaHJpbmtpbmcgd29ya3F1ZXVlLiBUaGUgbmV3IGZlYXR1cmUgaXMgZnVuY3Rpb25hbCwgc28gaXQgc2hvdWxkIGJlIGZ1enplZC5cblxuV2l0aCBhbGwgb2YgdGhpcyBpbiBtaW5kLCB0aGUgY29uZmlndXJhdGlvbnMgdG8gZW5hYmxlIGFyZSBgWFNXQVBgIGFuZCBgREVCVUdfRlNgLlxuXG5JJ2xsIHByb2NlZWQgd2l0aCB0aGVzZSBrZXkgc3ltYm9sczpcbiogICBgeHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlYFxuKiAgIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGBcbiogICBgeHN3YXBfc2hyaW5rX3dvcmtfZm5gXG4qICAgYHhzd2FwX2NoZWNrX21hcHBlZGBcbiogICBgeHN3YXBfY29sbGVjdF9wYWdlYFxuKiAgIGB4c3dhcF9tYXBfY2x1c3RlcnNgXG4qICAgYHhzd2FwX3VubWFwX2NsdXN0ZXJzYFxuXG5RdWljayBzYW5pdHkgY2hlY2s6IEFyZSBhbnkgb2YgdGhlc2UgZnVuY3Rpb25zICpzdGF0aWMqPyBZZXMsIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGludHJvZHVjZWQgYXJlIHN0YXRpYy4gVGhpcyBtZWFucyB0aGVyZSBhcmUgbm8gbm9uLXN0YXRpYyBmdW5jdGlvbnMgYWRkZWQsIGhvd2V2ZXIsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2VudHJhbCB0byB0aGUgbmV3IGZ1bmN0aW9uYWxpdHksIHdpdGggc29tZSBiZWluZyBmdW5jdGlvbiBwb2ludGVycywgdGhleSBhcmUgZ29vZCBjYW5kaWRhdGVzLlxuXG5Pa2F5LCBJJ20gY29uZmlkZW50IGluIHRoZXNlIHNlbGVjdGlvbnMuIE5vdywgbGV0J3MgY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTU1NywiT3V0cHV0VG9rZW5zIjoxODQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MDEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6NDAuNDgxNDA5NDQxWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzUwMTQyMDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlhTV0FQXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInhzd2FwX21heF9jbHVzdGVyc193cml0ZVwiLFxuICAgIFwieHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRcIixcbiAgICBcInhzd2FwX3Nocmlua193b3JrX2ZuXCIsXG4gICAgXCJ4c3dhcF9jaGVja19tYXBwZWRcIixcbiAgICBcInhzd2FwX2NvbGxlY3RfcGFnZVwiLFxuICAgIFwieHN3YXBfbWFwX2NsdXN0ZXJzXCIsXG4gICAgXCJ4c3dhcF91bm1hcF9jbHVzdGVyc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlICh4c3dhcCkgdGhhdCBkZWNvdXBsZXMgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gSXQgdXNlcyBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgZm9yIGNsdXN0ZXIgaW5mbyB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzIGR5bmFtaWNhbGx5LiBUaGlzIGFkZHMgbmV3IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyBmb3Igc3dhcCBtYW5hZ2VtZW50LCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHdvcmtxdWV1ZSBmb3Igc2hyaW5raW5nLiBJdCBpcyBmdW5jdGlvbmFsIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlhTV0FQXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInhzd2FwX21heF9jbHVzdGVyc193cml0ZVwiLFxuICAgIFwieHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRcIixcbiAgICBcInhzd2FwX3Nocmlua193b3JrX2ZuXCIsXG4gICAgXCJ4c3dhcF9jaGVja19tYXBwZWRcIixcbiAgICBcInhzd2FwX2NvbGxlY3RfcGFnZVwiLFxuICAgIFwieHN3YXBfbWFwX2NsdXN0ZXJzXCIsXG4gICAgXCJ4c3dhcF91bm1hcF9jbHVzdGVyc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlICh4c3dhcCkgdGhhdCBkZWNvdXBsZXMgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gSXQgdXNlcyBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgZm9yIGNsdXN0ZXIgaW5mbyB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzIGR5bmFtaWNhbGx5LiBUaGlzIGFkZHMgbmV3IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyBmb3Igc3dhcCBtYW5hZ2VtZW50LCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHdvcmtxdWV1ZSBmb3Igc2hyaW5raW5nLiBJdCBpcyBmdW5jdGlvbmFsIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflow4dljg[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-05 08:35:51 +0000 UTC FinishedAt: 2026-08-05 09:15:42 +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": "938e833173e6cc7c1b6671f3463d36511d6dbb51", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "XSWAP", "DEBUG_FS" ], "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": "938e833173e6cc7c1b6671f3463d36511d6dbb51", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "XSWAP", "DEBUG_FS" ], "series_id": "4a7e1458-86e3-4b65-908c-6e1cb2a84b9a" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "xswap_max_clusters_write", "xswap_max_clusters_read", "xswap_shrink_work_fn", "xswap_check_mapped", "xswap_collect_page", "xswap_map_clusters", "xswap_unmap_clusters" ], "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+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1hTV0FQJiMzNDssCiAgICAmIzM0O0RFQlVHX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7eHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlJiMzNDssCiAgICAmIzM0O3hzd2FwX21heF9jbHVzdGVyc19yZWFkJiMzNDssCiAgICAmIzM0O3hzd2FwX3Nocmlua193b3JrX2ZuJiMzNDssCiAgICAmIzM0O3hzd2FwX2NoZWNrX21hcHBlZCYjMzQ7LAogICAgJiMzNDt4c3dhcF9jb2xsZWN0X3BhZ2UmIzM0OywKICAgICYjMzQ7eHN3YXBfbWFwX2NsdXN0ZXJzJiMzNDssCiAgICAmIzM0O3hzd2FwX3VubWFwX2NsdXN0ZXJzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlICh4c3dhcCkgdGhhdCBkZWNvdXBsZXMgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gSXQgdXNlcyBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgZm9yIGNsdXN0ZXIgaW5mbyB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzIGR5bmFtaWNhbGx5LiBUaGlzIGFkZHMgbmV3IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyBmb3Igc3dhcCBtYW5hZ2VtZW50LCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHdvcmtxdWV1ZSBmb3Igc2hyaW5raW5nLiBJdCBpcyBmdW5jdGlvbmFsIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMjNiODY1ZjNjNDk2N2QyMjdlNjllMzkyMGZjNDI1NzQ1OWZiZmM0MlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDUgMDk6MTQ6MzYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuaW5kZXggNDVmMzAxZDczZTJhZS4uYTViMzIzMzc0NzY5YyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTIwNyw2ICYjNDM7MjA3LDcgQEAgZW51bSB7XG4gXHRTV1BfU1RBQkxFX1dSSVRFUyA9ICgxIFx1MDAzY1x1MDAzYyAxMSksXHQvKiBubyBvdmVyd3JpdGUgUEdfd3JpdGViYWNrIHBhZ2VzICovXG4gXHRTV1BfU1lOQ0hST05PVVNfSU8gPSAoMSBcdTAwM2NcdTAwM2MgMTIpLFx0Lyogc3luY2hyb25vdXMgSU8gaXMgZWZmaWNpZW50ICovXG4gXHRTV1BfSElCRVJOQVRJT04gPSAoMSBcdTAwM2NcdTAwM2MgMTMpLFx0LyogcGlubmVkIGZvciBoaWJlcm5hdGlvbiAqL1xuJiM0MztcdFNXUF9YU1dBUFx0PSAoMSBcdTAwM2NcdTAwM2MgMTQpLFx0LyogZXh0ZW5kYWJsZSBzd2FwIGRldmljZSAqL1xuIFx0XHRcdFx0XHQvKiBhZGQgb3RoZXJzIGhlcmUgYmVmb3JlLi4uICovXG4gfTtcbiBcbkBAIC0yNDcsNiAmIzQzOzI0OCwxNiBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7XG4gXHRzaWduZWQgY2hhclx0dHlwZTtcdFx0Lyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqL1xuIFx0dW5zaWduZWQgaW50XHRtYXg7XHRcdC8qIHNpemUgb2YgdGhpcyBzd2FwIGRldmljZSAqL1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87IC8qIGNsdXN0ZXIgaW5mby4gT25seSBmb3IgU1NEICovXG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHRzdHJ1Y3Qgdm1fc3RydWN0XHQqY2x1c3Rlcl92bTtcdC8qIFZNX1NQQVJTRSBhcmVhIGZvciB4c3dhcCBkeW5hbWljIGNsdXN0ZXJfaW5mbyAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmdcdFx0bnJfY2x1c3RlcnNfbWF4Oy8qIHVwcGVyIGxpbWl0IGZyb20gc3dhcCBoZWFkZXIgKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nXHRcdG5yX2NsdXN0ZXJzO1x0LyogY3VycmVudCBncm93dGggY2VpbGluZyAo4omkIG5yX2NsdXN0ZXJzX21heCkgKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nXHRcdG5yX2NsdXN0ZXJzX21hcHBlZDsgLyogY3VycmVudGx5IG1hcHBlZCBjbHVzdGVyIGNvdW50ICovXG4mIzQzO1x0dW5zaWduZWQgbG9uZ1x0XHRucl9mcmVlX3RhaWw7XHQvKiBjb250aWd1b3VzIGZyZWUgY2x1c3RlcnMgYXQgdGFpbCAqL1xuJiM0MztcdHN0cnVjdCBkZW50cnlcdFx0KmRlYnVnZnNfZW50cnk7XHQvKiBkZWJ1Z2ZzOiB0eXBlXHUwMDNjTlx1MDAzZV9tYXhfY2x1c3RlcnMgKi9cbiYjNDM7XHRzdHJ1Y3Qgd29ya19zdHJ1Y3RcdHhzd2FwX3Nocmlua193b3JrOyAvKiBkZWZlcnJlZCBzaHJpbmsgdHJpZ2dlciAqL1xuJiM0MztcdHN0cnVjdCBtdXRleFx0XHR4c3dhcF9sb2NrO1x0Lyogc2VyaWFsaXplIG1hcC91bm1hcCBvcGVyYXRpb25zICovXG4mIzQzOyNlbmRpZlxuIFx0c3RydWN0IGxpc3RfaGVhZCBmcmVlX2NsdXN0ZXJzOyAvKiBmcmVlIGNsdXN0ZXJzIGxpc3QgKi9cbiBcdHN0cnVjdCBsaXN0X2hlYWQgZnVsbF9jbHVzdGVyczsgLyogZnVsbCBjbHVzdGVycyBsaXN0ICovXG4gXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vbmZ1bGxfY2x1c3RlcnNbU1dBUF9OUl9PUkRFUlNdO1xuQEAgLTM1MCw2ICYjNDM7MzYxLDcgQEAgdm9pZCBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHZvaWQgZnJlZV9wYWdlc19hbmRfc3dhcF9jYWNoZShzdHJ1Y3QgZW5jb2RlZF9wYWdlICoqLCBpbnQpO1xuIC8qIGxpbnV4L21tL3N3YXBmaWxlLmMgKi9cbiBleHRlcm4gYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xuJiM0MztleHRlcm4gYXRvbWljX3QgbnJfcmVhbF9zd2FwZmlsZXM7XG4gZXh0ZXJuIGxvbmcgdG90YWxfc3dhcF9wYWdlcztcbiBleHRlcm4gYXRvbWljX3QgbnJfcm90YXRlX3N3YXA7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWdcbmluZGV4IDA2MDE5MGUxMmJjZWQuLjgyZjYyZjRjNWIyM2UgMTAwNjQ0XG4tLS0gYS9tbS9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9LY29uZmlnXG5AQCAtMTIyLDYgJiM0MzsxMjIsMTUgQEAgY29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVFxuICAgICAgICBkZWZhdWx0IFwmIzM0O3pzdGRcJiMzNDsgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX1pTVERcbiAgICAgICAgZGVmYXVsdCBcJiMzNDtcJiMzNDtcbiBcbiYjNDM7Y29uZmlnIFhTV0FQXG4mIzQzO1x0Ym9vbCBcJiMzNDtFeHRlbmRhYmxlICh2aXJ0dWFsKSBzd2FwIGRldmljZVwmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gU1dBUCBcdTAwMjZcdTAwMjYgNjRCSVRcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBBZGRzIHN1cHBvcnQgZm9yIGV4dGVuZGFibGUgc3dhcCBkZXZpY2VzICh4c3dhcCkgdGhhdCBkZWNvdXBsZVxuJiM0MztcdCAgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gVGhlIGNsdXN0ZXJfaW5mb1xuJiM0MztcdCAgYXJyYXkgaXMgYmFja2VkIGJ5IGEgc3BhcnNlIHZtYWxsb2MgYXJlYSB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzXG4mIzQzO1x0ICBvbiBkZW1hbmQsIGF2b2lkaW5nIHN0YXRpYyBwcmUtYWxsb2NhdGlvbiBvdmVyaGVhZC5cbiYjNDM7XG4gY29uZmlnIFpTTUFMTE9DXG4gXHR0cmlzdGF0ZVxuIFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfaW8uYyBiL21tL3BhZ2VfaW8uY1xuaW5kZXggZTRmYTdmZmZmZThiYi4uMWYzZmE1MjEzMWFiMyAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfaW8uY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9pby5jXG5AQCAtMjQ3LDYgJiM0MzsyNDcsMTcgQEAgaW50IHN3YXBfd3JpdGVvdXQoc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHR9XG4gXHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGN0eC1cdTAwM2VzaXMgaXMgc2V0IGJ5IHN3YXBfYWRkX2ZvbGlvKCkgd2hpY2ggaXMgY2FsbGVkIGZyb21cbiYjNDM7XHQgKiBfX3N3YXBfd3JpdGVwYWdlKCkgYmVsb3cuICBTaW5jZSB3ZSBtdXN0IGF2b2lkIHRoZSB3cml0ZXBhZ2VcbiYjNDM7XHQgKiBwYXRoIGZvciB4c3dhcCBkZXZpY2VzLCB1c2UgdGhlIHN3YXBfaW5mbyBmcm9tIHRoZSBmb2xpbyYjMzk7c1xuJiM0MztcdCAqIHN3YXAgZW50cnkgZGlyZWN0bHkgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIGN0eC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodW5saWtlbHkoX19zd2FwX2VudHJ5X3RvX2luZm8oZm9saW8tXHUwMDNlc3dhcCktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpIHtcbiYjNDM7XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuJiM0MztcdFx0cmV0dXJuIEFPUF9XUklURVBBR0VfQUNUSVZBVEU7XG4mIzQzO1x0fVxuJiM0MztcbiBcdF9fc3dhcF93cml0ZXBhZ2UoY3R4LCBmb2xpbyk7XG4gXHRyZXR1cm4gMDtcbiBvdXRfdW5sb2NrOlxuQEAgLTQ3OSw2ICYjNDM7NDkwLDExIEBAIHZvaWQgc3dhcF9yZWFkX2ZvbGlvKHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0aWYgKHpzd2FwX2xvYWQoZm9saW8pICE9IC1FTk9FTlQpXG4gXHRcdGdvdG8gZmluaXNoO1xuIFxuJiM0MztcdGlmICh1bmxpa2VseShzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpIHtcbiYjNDM7XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4mIzQzO1x0XHRnb3RvIGZpbmlzaDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0LyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovXG4gXHR6c3dhcF9mb2xpb19zd2FwaW4oZm9saW8pO1xuIFx0c3dhcF9hZGRfZm9saW8oY3R4LCBmb2xpbywgUkVBRCk7XG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCA1YmU4MjU5MTFlNjQ1Li5lYmIyZDJhYzM1NmZlIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC04MjksNiAmIzQzOzgyOSwxMyBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBfY2x1c3Rlcl9yZWFkYWhlYWQoc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcF9tYXNrLFxuIFx0c3RydWN0IGJsa19wbHVnIHBsdWc7XG4gXHRzd3BfZW50cnlfdCByYV9lbnRyeTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBlbnRyeSBtYXkgaGF2ZSBiZWVuIGZyZWVkIGJ5IGFub3RoZXIgdGFzay4gQXZvaWQgc3dhcF9pbmZvX2dldCgpXG4mIzQzO1x0ICogd2hpY2ggd2lsbCBwcmludCBlcnJvciBtZXNzYWdlIGlmIHRoZSByYWNlIGhhcHBlbnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApXG4mIzQzO1x0XHRnb3RvIHNraXA7XG4mIzQzO1xuIFx0bWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTtcbiBcdGlmICghbWFzaylcbiBcdFx0Z290byBza2lwO1xuZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jXG5pbmRleCA0ZDRlM2UzMDU5ZjZiLi5jYTQwNjU1NjYyNmU3IDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuY1xuQEAgLTQ4LDYgJiM0Mzs0OCwxMTggQEBcbiAjaW5jbHVkZSBcJiMzNDtzd2FwX3RhYmxlLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7c3dhcC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2RlYnVnZnMuaFx1MDAzZVxuJiM0MztcbiYjNDM7c3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spO1xuJiM0MztcbiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUFxuJiM0MzsvKlxuJiM0MzsgKiB4c3dhcDogZHluYW1pY2FsbHkgZ3JvdyBhbmQgc2hyaW5rIHRoZSBjbHVzdGVyX2luZm8gYXJyYXkgdmlhIGFcbiYjNDM7ICogVk1fU1BBUlNFIGFyZWEuXG4mIzQzOyAqXG4mIzQzOyAqIFhTV0FQX0dST1dfQ0xVU1RFUlMgaXMgdGhlIG51bWJlciBvZiBjbHVzdGVycyB0byBtYXAvdW5tYXAgaW4gb25lXG4mIzQzOyAqIGdyb3cvc2hyaW5rIG9wZXJhdGlvbi4gIEl0IGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJfaW5mb1xuJiM0MzsgKiBzdHJ1Y3RzIHRoYXQgZml0IGluIGEgc2luZ2xlIHBhZ2UgKGF0IGxlYXN0IDE2KSwgc28gdGhhdCB0aGUgdm1hbGxvY1xuJiM0MzsgKiBwYWdlIHRhYmxlXG4mIzQzOyAqIG92ZXJoZWFkIGlzIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIG1hcHBlZC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgWFNXQVBfR1JPV19DTFVTVEVSUyBcXFxuJiM0MztcdG1heF90KHVuc2lnbmVkIGxvbmcsIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pLCAxNilcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp4c3dhcF9kZWJ1Z2ZzX3Jvb3Q7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHhzd2FwX21hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4mIzQzO1x0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKTtcbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdW5tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucik7XG4mIzQzO3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSk7XG4mIzQzO3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpO1xuJiM0MztzdGF0aWMgdm9pZCB4c3dhcF91cGRhdGVfZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBmcmVlZF9pZHgpO1xuJiM0MztzdGF0aWMgdm9pZCB4c3dhcF90cnlfc2hyaW5rKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBkZWJ1Z2ZzIHJlYWQvd3JpdGUgZm9yIHBlci1kZXZpY2UgbWF4IGNsdXN0ZXIgY291bnQuXG4mIzQzOyAqIFNob3dzL3NldHMgc2ktXHUwMDNlbnJfY2x1c3RlcnMgKGN1cnJlbnQgZ3Jvd3RoIGNlaWxpbmcpLCBjbGFtcGVkIHRvXG4mIzQzOyAqIFswLCBzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXhdLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHNzaXplX3QgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4mIzQzO1x0Y2hhciB0bXBbMzJdO1xuJiM0MztcdGludCBsZW47XG4mIzQzO1xuJiM0MztcdGxlbiA9IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksIFwmIzM0OyVsdVxcblwmIzM0OywgUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzKSk7XG4mIzQzO1x0cmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcCwgbGVuKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHNzaXplX3QgeHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLFxuJiM0MztcdFx0XHRcdFx0Y29uc3QgY2hhciBfX3VzZXIgKmJ1ZixcbiYjNDM7XHRcdFx0XHRcdHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB2YWwsIG5ld19wYWdlcztcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBrc3RydG91bF9mcm9tX3VzZXIoYnVmLCBjb3VudCwgMCwgXHUwMDI2dmFsKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKHZhbCBcdTAwM2Ugc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4KVxuJiM0MztcdFx0dmFsID0gc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4O1xuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4mIzQzO1x0c2ktXHUwMDNlbnJfY2x1c3RlcnMgPSB2YWw7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAgdGhlIHZpc2libGUgc3dhcCBzaXplIGluIHN5bmMgd2l0aCB0aGUgbmV3IGNlaWxpbmcuICovXG4mIzQzO1x0bmV3X3BhZ2VzID0gbWluX3QodW5zaWduZWQgbG9uZywgdmFsICogU1dBUEZJTEVfQ0xVU1RFUiwgc2ktXHUwMDNlbWF4KTtcbiYjNDM7XHRpZiAobmV3X3BhZ2VzKVxuJiM0MztcdFx0bmV3X3BhZ2VzLS07XG4mIzQzO1x0aWYgKG5ld19wYWdlcyAhPSBzaS1cdTAwM2VwYWdlcykge1xuJiM0MztcdFx0bG9uZyBkZWx0YSA9IChsb25nKW5ld19wYWdlcyAtIChsb25nKXNpLVx1MDAzZXBhZ2VzO1xuJiM0MztcbiYjNDM7XHRcdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdFx0c2ktXHUwMDNlcGFnZXMgPSBuZXdfcGFnZXM7XG4mIzQzO1x0XHRhdG9taWNfbG9uZ19hZGQoZGVsdGEsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuJiM0MztcdFx0dG90YWxfc3dhcF9wYWdlcyAmIzQzOz0gZGVsdGE7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogU2hyaW5rIHRyaWdnZXI6IGxvd2VyaW5nIHRoZSBjZWlsaW5nIG1heSBmcmVlIHRhaWwgY2x1c3RlcnMuICovXG4mIzQzO1x0c2NoZWR1bGVfd29yayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9zaHJpbmtfd29yayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBjb3VudDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xuJiM0MztcdC5yZWFkID0geHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQsXG4mIzQzO1x0LndyaXRlID0geHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlLFxuJiM0MztcdC5vcGVuID0gc2ltcGxlX29wZW4sXG4mIzQzO1x0Lmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfZGVidWdmc19hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBuYW1lWzMyXTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF4c3dhcF9kZWJ1Z2ZzX3Jvb3QpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCYjMzQ7dHlwZSVkX2NsdXN0ZXJfbGltaXRcJiMzNDssIHNpLVx1MDAzZXR5cGUpO1xuJiM0MztcdHNpLVx1MDAzZWRlYnVnZnNfZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA2NDQsIHhzd2FwX2RlYnVnZnNfcm9vdCxcbiYjNDM7XHRcdFx0XHRcdFx0c2ksIFx1MDAyNnhzd2FwX2RlYnVnZnNfZm9wcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHhzd2FwX2RlYnVnZnNfZGVsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7e1xuJiM0MztcdGRlYnVnZnNfcmVtb3ZlKHNpLVx1MDAzZWRlYnVnZnNfZW50cnkpO1xuJiM0MztcdHNpLVx1MDAzZWRlYnVnZnNfZW50cnkgPSBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztcbiYjNDM7I2VuZGlmXG4gXG4gc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7XG5AQCAtNjMsOSAmIzQzOzE3NSw5IEBAIHN0YXRpYyB2b2lkIG1vdmVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gICpcbiAgKiBBbHNvIHByb3RlY3RzIHN3YXBfYWN0aXZlX2hlYWQgdG90YWxfc3dhcF9wYWdlcywgYW5kIHRoZSBTV1BfV1JJVEVPSyBmbGFnLlxuICAqL1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9sb2NrKTtcbiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlcztcbiBhdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XG4mIzQzO2F0b21pY190IG5yX3JlYWxfc3dhcGZpbGVzO1xuIC8qXG4gICogU29tZSBtb2R1bGVzIHVzZSBzd2FwcGFibGUgb2JqZWN0cyBhbmQgbWF5IHRyeSB0byBzd2FwIHRoZW0gb3V0IHVuZGVyXG4gICogbWVtb3J5IHByZXNzdXJlICh2aWEgdGhlIHNocmlua2VyKS4gQmVmb3JlIGRvaW5nIHNvLCB0aGV5IG1heSB3aXNoIHRvXG5AQCAtNjA5LDYgJiM0Mzs3MjEsMTAgQEAgc3RhdGljIHZvaWQgX19mcmVlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm9cbiBcdHN3YXBfY2x1c3Rlcl9mcmVlX3RhYmxlKGNpKTtcbiBcdG1vdmVfY2x1c3RlcihzaSwgY2ksIFx1MDAyNnNpLVx1MDAzZWZyZWVfY2x1c3RlcnMsIENMVVNURVJfRkxBR19GUkVFKTtcbiBcdGNpLVx1MDAzZW9yZGVyID0gMDtcbiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUFxuJiM0MztcdHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWwoc2ksIGNpIC0gc2ktXHUwMDNlY2x1c3Rlcl9pbmZvKTtcbiYjNDM7XHRzY2hlZHVsZV93b3JrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcbiYjNDM7I2VuZGlmXG4gfVxuIFxuIC8qXG5AQCAtOTU1LDYgJiM0MzsxMDcxLDkgQEAgc3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpXG4gXHRcdGNpLVx1MDAzZW9yZGVyID0gb3JkZXI7XG4gXHRjaS1cdTAwM2Vjb3VudCAmIzQzOz0gbnJfcGFnZXM7XG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHR4c3dhcF90cmltX2ZyZWVfdGFpbChzaSwgY2x1c3Rlcl9pbmRleChzaSwgY2kpKTtcbiYjNDM7I2VuZGlmXG4gXHRzd2FwX3JhbmdlX2FsbG9jKHNpLCBucl9wYWdlcyk7XG4gXG4gXHRyZXR1cm4gdHJ1ZTtcbkBAIC0xMTg1LDYgJiM0MzsxMzA0LDUwIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdGlmIChmb3VuZClcbiBcdFx0XHRnb3RvIGRvbmU7XG4gXHR9XG4mIzQzO1xuJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGb3IgeHN3YXA6IGlmIG5vIGZyZWUgY2x1c3RlciB3YXMgZm91bmQgYW5kIG1vcmUgY2x1c3RlcnNcbiYjNDM7XHQgKiBjYW4gYmUgbWFwcGVkLCBncm93IHRoZSBjbHVzdGVyX2luZm8gYXJyYXkgYW5kIHJldHJ5LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghZm91bmQgXHUwMDI2XHUwMDI2IChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCkgXHUwMDNjIFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVycykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGxpc3RfZW1wdHkoXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycykpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnJfbmV3ID0gbWluKFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVycykgLVxuJiM0MztcdFx0XHRcdFx0ICBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKSxcbiYjNDM7XHRcdFx0XHRcdCAgWFNXQVBfR1JPV19DTFVTVEVSUyk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCF4c3dhcF9tYXBfY2x1c3RlcnMoc2ksIHN0YXJ0LCBucl9uZXcpKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGxvbmcgYWRkZWQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHRmb3IgKGkgPSBzdGFydDsgaSBcdTAwM2Mgc3RhcnQgJiM0MzsgbnJfbmV3OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBcdTAwMjZzaS1cdTAwM2VjbHVzdGVyX2luZm9baV07XG4mIzQzO1x0XHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHRcdC8qXG4mIzQzO1x0XHRcdFx0ICogQSBjb25jdXJyZW50IGdyb3dlciBtYXkgaGF2ZSBhbHJlYWR5IGFkZGVkXG4mIzQzO1x0XHRcdFx0ICogdGhlc2UgY2x1c3RlcnMgdG8gdGhlIGZyZWUgbGlzdC4gIE9ubHkgYWRkXG4mIzQzO1x0XHRcdFx0ICogY2x1c3RlcnMgdGhhdCBhcmUgc3RpbGwgb2ZmLWxpc3QgKE5PTkUpLlxuJiM0MztcdFx0XHRcdCAqL1xuJiM0MztcdFx0XHRcdGlmIChjaS1cdTAwM2VmbGFncyA9PSBDTFVTVEVSX0ZMQUdfTk9ORSkge1xuJiM0MztcdFx0XHRcdFx0Y2ktXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfRlJFRTtcbiYjNDM7XHRcdFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Y2ktXHUwMDNlbGlzdCwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyk7XG4mIzQzO1x0XHRcdFx0XHRhZGRlZCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdFx0fVxuJiM0MztcdFx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCxcbiYjNDM7XHRcdFx0XHQgICBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsKSAmIzQzOyBucl9uZXcpO1xuJiM0MztcbiYjNDM7XHRcdFx0LyogUmV0cnkgYWxsb2NhdGlvbiBmcm9tIHRoZSBmcmVlIGxpc3QgKi9cbiYjNDM7XHRcdFx0Zm91bmQgPSBhbGxvY19zd2FwX3NjYW5fbGlzdChzaSwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIGZvbGlvLCBmYWxzZSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiBkb25lOlxuIFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXJfbG9jayk7XG5AQCAtMTIyMyw2ICYjNDM7MTM4Niw4IEBAIHN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpXG4gXHRcdFx0Z290byBza2lwO1xuIFx0fVxuIFxuJiM0MztcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuJiM0MztcdFx0YXRvbWljX3N1YigxLCBcdTAwMjZucl9yZWFsX3N3YXBmaWxlcyk7XG4gXHRwbGlzdF9kZWwoXHUwMDI2c2ktXHUwMDNlYXZhaWxfbGlzdCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcbiBcbiBza2lwOlxuQEAgLTEyNjUsNiAmIzQzOzE0MzAsOCBAQCBzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxuIFx0fVxuIFxuIFx0cGxpc3RfYWRkKFx1MDAyNnNpLVx1MDAzZWF2YWlsX2xpc3QsIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XG4mIzQzO1x0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpXG4mIzQzO1x0XHRhdG9taWNfYWRkKDEsIFx1MDAyNm5yX3JlYWxfc3dhcGZpbGVzKTtcbiBcbiBza2lwOlxuIFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbkBAIC0yOTUyLDYgJiM0MzszMTE5LDE5IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy1cdTAwM2Vob3N0O1xuIFx0aW50IHJldDtcbiBcbiYjNDM7XHRpZiAoc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbiYjNDM7XHRcdCpzcGFuID0gMDtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiB4c3dhcCBkZXZpY2VzIGhhdmUgbm8gYmFja2luZyBibG9jayBkZXZpY2UgYW5kXG4mIzQzO1x0XHQgKiBwaHlzaWNhbCB3cml0ZW91dCBpcyBza2lwcGVkIGluIHN3YXBfd3JpdGVvdXQoKSxcbiYjNDM7XHRcdCAqIGJ1dCBzaXMtXHUwMDNlb3BzIG11c3Qgc3RpbGwgYmUgc2V0IHNvIHRoYXQgY2FsbGVyc1xuJiM0MztcdFx0ICogbGlrZSBzaHJpbmtfZm9saW9fbGlzdCgpIGNhbiBzYWZlbHkgZGVyZWZlcmVuY2VcbiYjNDM7XHRcdCAqIG9wcy1cdTAwM2VmbGFncy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0c2lzLVx1MDAzZW9wcyA9IFx1MDAyNnN3YXBfYmRldl9vcHM7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0cmV0ID0gc2lvX3Bvb2xfaW5pdCgpO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbkBAIC0zMDIzLDIwICYjNDM7MzIwMyw1MCBAQCBzdGF0aWMgdm9pZCB3YWl0X2Zvcl9hbGxvY2F0aW9uKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcbiBcdEJVR19PTihzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spO1xuIFxuJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQXG4mIzQzO1x0LypcbiYjNDM7XHQgKiB4c3dhcCBjbHVzdGVycyBiZXlvbmQgbnJfY2x1c3RlcnNfbWFwcGVkIGhhdmUgYmVlbiB1bm1hcHBlZFxuJiM0MztcdCAqIGJ5IHRoZSBzaHJpbmtlciBhbmQgdGhlaXIgdm1hbGxvYyBwYWdlcyBhcmUgbm8gbG9uZ2VyXG4mIzQzO1x0ICogYWNjZXNzaWJsZS4gIE9ubHkgaXRlcmF0ZSBvdmVyIGN1cnJlbnRseSBtYXBwZWQgY2x1c3RlcnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApXG4mIzQzO1x0XHRlbmQgPSBtaW4oZW5kLCBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKSAqXG4mIzQzO1x0XHRcdCAgU1dBUEZJTEVfQ0xVU1RFUik7XG4mIzQzOyNlbmRpZlxuJiM0MztcbiBcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IFx1MDAzYyBlbmQ7IG9mZnNldCAmIzQzOz0gU1dBUEZJTEVfQ0xVU1RFUikge1xuIFx0XHRjaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpO1xuIFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbiBcdH1cbiB9XG4gXG4tc3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcbi1cdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbWF4cGFnZXMpXG4mIzQzO3N0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIHtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyA9IHNpLVx1MDAzZWNsdXN0ZXJfaW5mbztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzID0gc2ktXHUwMDNlbWF4O1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbi1cdGludCBpLCBucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7XG4mIzQzO1x0aW50IGksIG5yX2NsdXN0ZXJzO1xuIFxuIFx0aWYgKCFjbHVzdGVyX2luZm8pXG4gXHRcdHJldHVybjtcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkge1xuJiM0MztcdFx0eHN3YXBfZGVidWdmc19kZWwoc2kpO1xuJiM0MztcdFx0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZzaS1cdTAwM2V4c3dhcF9zaHJpbmtfd29yayk7XG4mIzQzO1x0XHQvKiBVbm1hcCBhbGwgbWFwcGVkIGNsdXN0ZXJzIGFuZCBmcmVlIHRoZSBWTV9TUEFSU0UgYXJlYSAqL1xuJiM0MztcdFx0aWYgKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCBcdTAwM2UgMClcbiYjNDM7XHRcdFx0eHN3YXBfdW5tYXBfY2x1c3RlcnMoc2ksIDAsIHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4mIzQzO1x0XHRmcmVlX3ZtX2FyZWEoc2ktXHUwMDNlY2x1c3Rlcl92bSk7XG4mIzQzO1x0XHRzaS1cdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcbiYjNDM7XHRcdHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21heCA9IDA7XG4mIzQzO1x0XHRzaS1cdTAwM2Vucl9jbHVzdGVycyA9IDA7XG4mIzQzO1x0XHRzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQgPSAwO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7I2VuZGlmXG4mIzQzO1xuJiM0MztcdG5yX2NsdXN0ZXJzID0gRElWX1JPVU5EX1VQKG1heHBhZ2VzLCBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX2NsdXN0ZXJzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRjaSA9IGNsdXN0ZXJfaW5mbyAmIzQzOyBpO1xuIFx0XHQvKiBDbHVzdGVyIHdpdGggYmFkIG1hcmtzIGNvdW50IHdpbGwgaGF2ZSBhIHJlbWFpbmluZyB0YWJsZSAqL1xuQEAgLTMwNzUsMTEgJiM0MzszMjg1LDkgQEAgc3RhdGljIHZvaWQgZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4gU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwID0gTlVMTDtcbi1cdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvO1xuIFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZSwgKnZpY3RpbTtcbiBcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nO1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbi1cdHVuc2lnbmVkIGludCBtYXhwYWdlcztcbiBcdGludCBlcnIsIGZvdW5kID0gMDtcbiBcbiBcdGlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSlcbkBAIC0zMTYwLDcgJiM0MzszMzY4LDggQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFxuIFx0ZGVzdHJveV9zd2FwX2V4dGVudHMocCwgcC1cdTAwM2Vzd2FwX2ZpbGUpO1xuIFxuLVx0aWYgKCEocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxuJiM0MztcdGlmICghKHAtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICEocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxuIFx0XHRhdG9taWNfZGVjKFx1MDAyNm5yX3JvdGF0ZV9zd2FwKTtcbiBcbiBcdG11dGV4X2xvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbkBAIC0zMTcwLDEwICYjNDM7MzM3OSw2IEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcbiBcbiBcdHN3YXBfZmlsZSA9IHAtXHUwMDNlc3dhcF9maWxlO1xuIFx0cC1cdTAwM2Vzd2FwX2ZpbGUgPSBOVUxMO1xuLVx0bWF4cGFnZXMgPSBwLVx1MDAzZW1heDtcbi1cdGNsdXN0ZXJfaW5mbyA9IHAtXHUwMDNlY2x1c3Rlcl9pbmZvO1xuLVx0cC1cdTAwM2VtYXggPSAwO1xuLVx0cC1cdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2cC1cdTAwM2Vsb2NrKTtcbiBcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4gXHRhcmNoX3N3YXBfaW52YWxpZGF0ZV9hcmVhKHAtXHUwMDNldHlwZSk7XG5AQCAtMzE4MSw3ICYjNDM7MzM4Niw5IEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcbiBcdG11dGV4X3VubG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuIFx0a2ZyZWUocC1cdTAwM2VnbG9iYWxfY2x1c3Rlcik7XG4gXHRwLVx1MDAzZWdsb2JhbF9jbHVzdGVyID0gTlVMTDtcbi1cdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oY2x1c3Rlcl9pbmZvLCBtYXhwYWdlcyk7XG4mIzQzO1x0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhwKTtcbiYjNDM7XHRwLVx1MDAzZW1heCA9IDA7XG4mIzQzO1x0cC1cdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xuIFxuIFx0aW5vZGUgPSBtYXBwaW5nLVx1MDAzZWhvc3Q7XG4gXG5AQCAtMzI3MCw2ICYjNDM7MzQ3NywxOSBAQCBzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqc3dhcF90eXBlX3N0cihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNpLVx1MDAzZXN3YXBfZmlsZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7eHN3YXBcXHRcJiMzNDs7XG4mIzQzO1xuJiM0MztcdGlmIChTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9tb2RlKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDtwYXJ0aXRpb25cJiMzNDs7XG4mIzQzO1xuJiM0MztcdHJldHVybiBcJiMzNDtmaWxlXFx0XCYjMzQ7O1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgc3dhcF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdilcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSB2O1xuQEAgLTMyODksOCAmIzQzOzM1MDksNyBAQCBzdGF0aWMgaW50IHN3YXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXG4gXHRsZW4gPSBzZXFfZmlsZV9wYXRoKHN3YXAsIGZpbGUsIFwmIzM0OyBcXHRcXG5cXFxcXCYjMzQ7KTtcbiBcdHNlcV9wcmludGYoc3dhcCwgXCYjMzQ7JSpzJXNcXHQlbHVcXHQlcyVsdVxcdCVzJWRcXG5cJiMzNDssXG4gXHRcdFx0bGVuIFx1MDAzYyA0MCA/IDQwIC0gbGVuIDogMSwgXCYjMzQ7IFwmIzM0Oyxcbi1cdFx0XHRTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9tb2RlKSA/XG4tXHRcdFx0XHRcJiMzNDtwYXJ0aXRpb25cJiMzNDsgOiBcJiMzNDtmaWxlXFx0XCYjMzQ7LFxuJiM0MztcdFx0XHRzd2FwX3R5cGVfc3RyKHNpKSxcbiBcdFx0XHRieXRlcywgYnl0ZXMgXHUwMDNjIDEwMDAwMDAwID8gXCYjMzQ7XFx0XCYjMzQ7IDogXCYjMzQ7XCYjMzQ7LFxuIFx0XHRcdGludXNlLCBpbnVzZSBcdTAwM2MgMTAwMDAwMDAgPyBcJiMzNDtcXHRcJiMzNDsgOiBcJiMzNDtcJiMzNDssXG4gXHRcdFx0c2ktXHUwMDNlcHJpbyk7XG5AQCAtMzQ2OCw2ICYjNDM7MzY4Nyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0dW5zaWduZWQgbG9uZyBtYXhwYWdlcztcbiBcdHVuc2lnbmVkIGxvbmcgc3dhcGZpbGVwYWdlcztcbiBcdHVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlO1xuJiM0MztcdGxvZmZfdCBzaXplO1xuIFxuIFx0aWYgKG1lbWNtcChcJiMzNDtTV0FQU1BBQ0UyXCYjMzQ7LCBzd2FwX2hlYWRlci1cdTAwM2VtYWdpYy5tYWdpYywgMTApKSB7XG4gXHRcdHByX2VycihcJiMzNDtVbmFibGUgdG8gZmluZCBzd2FwLXNwYWNlIHNpZ25hdHVyZVxcblwmIzM0Oyk7XG5AQCAtMzUxMCw3ICYjNDM7MzczMCwxNiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcbiBcdGlmICghbWF4cGFnZXMpXG4gXHRcdHJldHVybiAwO1xuLVx0c3dhcGZpbGVwYWdlcyA9IGlfc2l6ZV9yZWFkKGlub2RlKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0c2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTtcbiYjNDM7XHRpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpIHtcbiYjNDM7XHRcdC8qIHhzd2FwOiBhIHN3YXAgZGV2aWNlIHdpdGggbm8gYmFja2luZyBzdG9yYWdlICovXG4mIzQzO1x0XHRzaS1cdTAwM2ViZGV2ID0gTlVMTDtcbiYjNDM7XHRcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9YU1dBUCB8IFNXUF9TT0xJRFNUQVRFO1xuJiM0MztcdFx0cmV0dXJuIG1heHBhZ2VzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c3dhcGZpbGVwYWdlcyA9IHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRpZiAoc3dhcGZpbGVwYWdlcyBcdTAwMjZcdTAwMjYgbWF4cGFnZXMgXHUwMDNlIHN3YXBmaWxlcGFnZXMpIHtcbiBcdFx0cHJfd2FybihcJiMzNDtTd2FwIGFyZWEgc2hvcnRlciB0aGFuIHNpZ25hdHVyZSBpbmRpY2F0ZXNcXG5cJiMzNDspO1xuIFx0XHRyZXR1cm4gMDtcbkBAIC0zNTIzLDYgJiM0MzszNzUyLDM2NSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdHJldHVybiBtYXhwYWdlcztcbiB9XG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7c3RhdGljIGludCB4c3dhcF9tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuJiM0MztcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLVx1MDAzZWNsdXN0ZXJfaW5mbyAmIzQzO1xuJiM0MztcdFx0XHRcdCAgIChzaXplX3Qpc3RhcnRfaWR4ICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmRfYWRkciA9IHN0YXJ0X2FkZHIgJiM0MzsgKHNpemVfdCluciAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogdm1fYXJlYV9tYXBfcGFnZXMoKSByZXF1aXJlcyB0aGF0IHN0YXJ0IGFuZCBlbmQgYmUgcGFnZS1hbGlnbmVkLlxuJiM0MztcdCAqIElmIHN0YXJ0X2FkZHIgZmFsbHMgd2l0aGluIGEgcGFnZSB0aGF0IHdhcyBhbHJlYWR5IG1hcHBlZCBieSBhXG4mIzQzO1x0ICogcHJldmlvdXMgYmF0Y2ggKGdyb3cgcGF0aCksIHJvdW5kIGl0IHVwIHRvIHNraXAgdGhlIGFscmVhZHktbWFwcGVkXG4mIzQzO1x0ICogcGFydGlhbCBwYWdlLiAgQWx3YXlzIHJvdW5kIGVuZF9hZGRyIHVwIHNvIHRoZSB2bWFwIHBhZ2UgdGFibGUgd2Fsa1xuJiM0MztcdCAqIHRlcm1pbmF0ZXMgY29ycmVjdGx5ICh0aGUgd2FsayBsb29wIGV4aXRzIHdoZW4gYWRkciA9PSBlbmQsIGFuZCBhZGRyXG4mIzQzO1x0ICogYWR2YW5jZXMgYnkgUEFHRV9TSVpFIGVhY2ggaXRlcmF0aW9uKS5cbiYjNDM7XHQgKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtX3N0YXJ0ID0gUEFHRV9BTElHTihzdGFydF9hZGRyKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHZtX2VuZCA9IFBBR0VfQUxJR04oZW5kX2FkZHIpO1xuJiM0MztcdHVuc2lnbmVkIGludCBub3JlY2xhaW1fZmxhZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBucGFnZXM7XG4mIzQzO1x0c3RydWN0IHBhZ2UgKipwYWdlcztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmICh2bV9zdGFydCBcdTAwM2U9IHZtX2VuZCkge1xuJiM0MztcdFx0LyogQWxsIHJlcXVlc3RlZCBjbHVzdGVycyBmYWxsIHdpdGhpbiBhbHJlYWR5LW1hcHBlZCBwYWdlcy4gKi9cbiYjNDM7XHRcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcdTAwM2Mgc3RhcnRfaWR4ICYjNDM7IG5yOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2ktXHUwMDNlY2x1c3Rlcl9pbmZvW2ldLmxvY2spO1xuJiM0MztcdFx0V1JJVEVfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCAmIzQzOyBucik7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5wYWdlcyA9ICh2bV9lbmQgLSB2bV9zdGFydCkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUHJldmVudCByZWN1cnNpdmUgcmVjbGFpbTogdm1fYXJlYV9tYXBfcGFnZXMoKSBpbnRlcm5hbGx5XG4mIzQzO1x0ICogYWxsb2NhdGVzIHBhZ2UgdGFibGVzIHdpdGggR0ZQX1BHVEFCTEVfS0VSTkVMLCB3aGljaCBsYWNrc1xuJiM0MztcdCAqIF9fR0ZQX05PTUVNQUxMT0MuICBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpIGVuc3VyZXMgdGhvc2VcbiYjNDM7XHQgKiBhbGxvY2F0aW9ucyBjYW5ub3QgcmVjdXJzZSBpbnRvIHN3YXAgYnkgZGlzYWJsaW5nIF9fR0ZQX0ZTL0lPLlxuJiM0MztcdCAqL1xuJiM0MztcdG5vcmVjbGFpbV9mbGFncyA9IG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCk7XG4mIzQzO1xuJiM0MztcdHBhZ2VzID0ga21hbGxvY19hcnJheShucGFnZXMsIHNpemVvZigqcGFnZXMpLFxuJiM0MztcdFx0XHQgICAgICBfX0dGUF9ISUdIIHwgX19HRlBfTk9NRU1BTExPQyB8IEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghcGFnZXMpIHtcbiYjNDM7XHRcdG1lbWFsbG9jX25vcmVjbGFpbV9yZXN0b3JlKG5vcmVjbGFpbV9mbGFncyk7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBfX0dGUF9aRVJPIGlzIGNyaXRpY2FsOiBjbHVzdGVyX2luZm8gc3RydWN0cyBjb250YWluIHBvaW50ZXJcbiYjNDM7XHRcdCAqIGZpZWxkcyAoZXh0ZW5kX3RhYmxlLCB6ZXJvX2JpdG1hcCwgbWVtY2dfdGFibGUsIHRhYmxlKSB0aGF0XG4mIzQzO1x0XHQgKiBtdXN0IHN0YXJ0IGFzIE5VTEwuICBXaXRob3V0IHplcm9pbmcsIHN0YWxlIGRhdGEgZnJvbSBhXG4mIzQzO1x0XHQgKiBwcmV2aW91cyB1c2VyIG9mIHRoZSBwYWdlIHdvdWxkIGxvb2sgbGlrZSB2YWxpZCBwb2ludGVycy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0cGFnZXNbaV0gPSBhbGxvY19wYWdlKF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHxcbiYjNDM7XHRcdFx0XHQgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XG4mIzQzO1x0XHRpZiAoIXBhZ2VzW2ldKVxuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENoZWNrIGlmIHRoZSB0YXJnZXQgcGFnZXMgYXJlIGFscmVhZHkgbWFwcGVkIGJ5IGEgY29uY3VycmVudFxuJiM0MztcdCAqIGdyb3dlci4gIFdlIG11c3QgZG8gdGhpcyBhZnRlciBwYWdlIGFsbG9jYXRpb24gYmVjYXVzZVxuJiM0MztcdCAqIGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCkgY2FuIHNsZWVwLCBvcGVuaW5nIGEgcmFjZSB3aW5kb3cuXG4mIzQzO1x0ICogSWYgc29tZW9uZSBhbHJlYWR5IG1hcHBlZCB0aGVzZSBwYWdlcywgZnJlZSBvdXJzIGFuZCBjb250aW51ZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZShcdTAwMjZpbml0X21tLCB2bV9zdGFydCxcbiYjNDM7XHRcdFx0XHRcdCB2bV9lbmQgLSB2bV9zdGFydCxcbiYjNDM7XHRcdFx0XHRcdCB4c3dhcF9jaGVja19tYXBwZWQsIE5VTEwpKSB7XG4mIzQzO1x0XHRpID0gbnBhZ2VzO1xuJiM0MztcdFx0Z290byBmYWlsX25vdW5tYXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpbnQgZXJyID0gdm1fYXJlYV9tYXBfcGFnZXMoc2ktXHUwMDNlY2x1c3Rlcl92bSwgdm1fc3RhcnQsIHZtX2VuZCwgcGFnZXMpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiAtRUJVU1kgbWVhbnMgdGhlIFBURXMgYXJlIGFscmVhZHkgcHJlc2VudDpcbiYjNDM7XHRcdCAqIGFub3RoZXIgdGhyZWFkIHJhY2VkIHdpdGggdXMgYW5kIG1hcHBlZCB0aGVcbiYjNDM7XHRcdCAqIHNhbWUgcGFnZXMgYmV0d2VlbiBvdXIgY2hlY2sgYWJvdmUgYW5kIHRoaXNcbiYjNDM7XHRcdCAqIGNhbGwuICBUcmVhdCBhcyBzdWNjZXNzIOKAlCBmcmVlIG91ciB1bnVzZWRcbiYjNDM7XHRcdCAqIHBhZ2VzIGFuZCBjb250aW51ZS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKGVyciA9PSAtRUJVU1kpIHtcbiYjNDM7XHRcdFx0aSA9IG5wYWdlcztcbiYjNDM7XHRcdFx0Z290byBmYWlsX25vdW5tYXA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpID0gbnBhZ2VzOyAvKiBmcmVlIGFsbCBwYWdlcyBvbiBmYWlsdXJlICovXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRrZnJlZShwYWdlcyk7XG4mIzQzO1x0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcbiYjNDM7XG4mIzQzO1x0LyogSW5pdGlhbGl6ZSBzcGlubG9ja3MgZm9yIG5ld2x5IG1hcHBlZCBjbHVzdGVycyAqL1xuJiM0MztcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcdTAwM2Mgc3RhcnRfaWR4ICYjNDM7IG5yOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1tpXS5sb2NrKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxuJiM0MztcdCAqL1xuJiM0MztcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggJiM0MzsgbnIpO1xuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2ZhaWxfbm91bm1hcDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFBhZ2VzIGFscmVhZHkgbWFwcGVkIGJ5IGEgY29uY3VycmVudCBncm93ZXIuICBGcmVlIG91ciB1bnVzZWRcbiYjNDM7XHQgKiBwYWdlcywgdGhlbiBmYWxsIHRocm91Z2ggdG8gaW5pdGlhbGl6ZSBzcGlubG9ja3MuICBUaGUgdm1hbGxvY1xuJiM0MztcdCAqIFBURXMgbm93IHBvaW50IHRvIHRoZSBjb25jdXJyZW50IGdyb3dlciYjMzk7cyBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHR3aGlsZSAoaSBcdTAwM2UgMCkge1xuJiM0MztcdFx0aS0tO1xuJiM0MztcdFx0aWYgKHBhZ2VzW2ldKVxuJiM0MztcdFx0XHRfX2ZyZWVfcGFnZShwYWdlc1tpXSk7XG4mIzQzO1x0fVxuJiM0MztcdGtmcmVlKHBhZ2VzKTtcbiYjNDM7XHRtZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZ3MpO1xuJiM0MztcbiYjNDM7XHQvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBmb3IgbmV3bHkgbWFwcGVkIGNsdXN0ZXJzICovXG4mIzQzO1x0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFx1MDAzYyBzdGFydF9pZHggJiM0MzsgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2ktXHUwMDNlY2x1c3Rlcl9pbmZvW2ldLmxvY2spO1xuJiM0MztcbiYjNDM7XHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCwgc3RhcnRfaWR4ICYjNDM7IG5yKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztmYWlsOlxuJiM0MztcdHdoaWxlIChpIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRpLS07XG4mIzQzO1x0XHRpZiAocGFnZXNbaV0pXG4mIzQzO1x0XHRcdF9fZnJlZV9wYWdlKHBhZ2VzW2ldKTtcbiYjNDM7XHR9XG4mIzQzO1x0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcbiYjNDM7XHRrZnJlZShwYWdlcyk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuJiM0MztcdHJldHVybiAtRU5PTUVNO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3QgeHN3YXBfcGFnZV9kYXRhIHtcbiYjNDM7XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xuJiM0MztcdGludCBucjtcbiYjNDM7XHRpbnQgbWF4O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCB4c3dhcF9jb2xsZWN0X3BhZ2UocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHhzd2FwX3BhZ2VfZGF0YSAqeHBkID0gZGF0YTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwdGVfcHJlc2VudCgqcHRlKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGlmICh4cGQtXHUwMDNlbnIgXHUwMDNjIHhwZC1cdTAwM2VtYXgpXG4mIzQzO1x0XHR4cGQtXHUwMDNlcGFnZXNbeHBkLVx1MDAzZW5yJiM0MzsmIzQzO10gPSBwdGVfcGFnZSgqcHRlKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdW5tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLVx1MDAzZWNsdXN0ZXJfaW5mbyAmIzQzO1xuJiM0MztcdFx0XHRcdCAgIChzaXplX3Qpc3RhcnRfaWR4ICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmRfYWRkciA9IHN0YXJ0X2FkZHIgJiM0MzsgKHNpemVfdCluciAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUm91bmQgdG8gcGFnZSBib3VuZGFyaWVzOiBzdGFydCB1cCAoc2tpcCBwYXJ0aWFsIHBhZ2UgdGhhdCBtYXlcbiYjNDM7XHQgKiBjb250YWluIGNsdXN0ZXJzIHN0aWxsIGluIHVzZSBiZWZvcmUgc3RhcnRfaWR4KSwgZW5kIHVwIHNvIHRoZVxuJiM0MztcdCAqIGVudGlyZSByYW5nZSBpcyBjb3ZlcmVkLiAgdm1fYXJlYV91bm1hcF9wYWdlcygpIGFuZFxuJiM0MztcdCAqIGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoKSBvcGVyYXRlIG9uIHdob2xlIHBhZ2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdm1fc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0X2FkZHIpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdm1fZW5kID0gUEFHRV9BTElHTihlbmRfYWRkcik7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnBhZ2VzO1xuJiM0MztcdHN0cnVjdCB4c3dhcF9wYWdlX2RhdGEgeHBkO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAodm1fc3RhcnQgXHUwMDNlPSB2bV9lbmQpIHtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2l6ZSA9IHZtX2VuZCAtIHZtX3N0YXJ0O1xuJiM0MztcdG5wYWdlcyA9IHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2FsayB0aGUgcGFnZSB0YWJsZSB0byBjb2xsZWN0IHBoeXNpY2FsIHBhZ2VzIGJlZm9yZSB1bm1hcHBpbmcuXG4mIzQzO1x0ICogdm1fYXJlYV91bm1hcF9wYWdlcygpIG9ubHkgY2xlYXJzIFBURXMgYW5kIGZyZWVzIGludGVybWVkaWF0ZVxuJiM0MztcdCAqIHBhZ2UgdGFibGUgcGFnZXMg4oCUIGl0IGRvZXMgbm90IGZyZWUgYmFja2luZyBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHR4cGQucGFnZXMgPSBrbWFsbG9jX2FycmF5KG5wYWdlcywgc2l6ZW9mKCp4cGQucGFnZXMpLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoeHBkLnBhZ2VzKSB7XG4mIzQzO1x0XHR4cGQubnIgPSAwO1xuJiM0MztcdFx0eHBkLm1heCA9IG5wYWdlcztcbiYjNDM7XHRcdGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoXHUwMDI2aW5pdF9tbSwgdm1fc3RhcnQsIHNpemUsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHhzd2FwX2NvbGxlY3RfcGFnZSwgXHUwMDI2eHBkKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHZtX2FyZWFfdW5tYXBfcGFnZXMoc2ktXHUwMDNlY2x1c3Rlcl92bSwgdm1fc3RhcnQsIHZtX2VuZCk7XG4mIzQzO1xuJiM0MztcdC8qIEZyZWUgdGhlIGNvbGxlY3RlZCBiYWNraW5nIHBhZ2VzICovXG4mIzQzO1x0aWYgKHhwZC5wYWdlcykge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgeHBkLm5yOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0X19mcmVlX3BhZ2UoeHBkLnBhZ2VzW2ldKTtcbiYjNDM7XHRcdGtmcmVlKHhwZC5wYWdlcyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxuJiM0MztcdCAqL1xuJiM0MztcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBDYWxsYmFjayBmb3IgYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZSgpOiByZXR1cm4gMSB0byBzdG9wIGF0IHRoZVxuJiM0MzsgKiBmaXJzdCBwcmVzZW50IFBURSwgc2lnbmFsbGluZyB0aGF0IHRoZSByYW5nZSBpcyBhbHJlYWR5IG1hcHBlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBNYWludGFpbiBzaS1cdTAwM2Vucl9mcmVlX3RhaWwsIHRoZSBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0XG4mIzQzOyAqIHRoZSB0YWlsIG9mIHRoZSBtYXBwZWQgcmFuZ2UuICBDYWxsZWQgd2hlbiBhIGNsdXN0ZXIgYXQgQGZyZWVkX2lkeCBpc1xuJiM0MzsgKiBmcmVlZC4gIFByb3ZpZGVzIE8oMSkgc2hyaW5rIGRldGVjdGlvbjogaWYgbnJfZnJlZV90YWlsIGlzIG5vbi16ZXJvLFxuJiM0MzsgKiB0aGUgdGFpbCBjYW4gYmUgdW5tYXBwZWQgd2l0aG91dCBzY2FubmluZyBjbHVzdGVyX2luZm9bXS5cbiYjNDM7ICpcbiYjNDM7ICogT25seSBpbmNyZW1lbnRzIHdoZW4gQGZyZWVkX2lkeCBpcyB0aGUgY2x1c3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlXG4mIzQzOyAqIGV4aXN0aW5nIHRhaWwgcmVnaW9uLiAgVGhlbiBzY2FucyBiYWNrd2FyZHMgZm9yIGFscmVhZHktZnJlZSBjbHVzdGVyc1xuJiM0MzsgKiBub3cgY29ubmVjdGVkIHRvIHRoZSB0YWlsLCBib3VuZGVkIGJ5IFhTV0FQX0dST1dfQ0xVU1RFUlMgYXQgYSB0aW1lLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdXBkYXRlX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBmcmVlZF9pZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGlkLCBpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4mIzQzO1xuJiM0MztcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbiYjNDM7XHRucl90YWlsID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCk7XG4mIzQzO1xuJiM0MztcdC8qIFByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHNocmluayB0aGF0IHJhY2VzIHBhc3QgdXMgKi9cbiYjNDM7XHRpZiAobnJfdGFpbCBcdTAwM2U9IG5yX21hcHBlZClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0dGlkID0gbnJfbWFwcGVkIC0gbnJfdGFpbCAtIDE7XG4mIzQzO1xuJiM0MztcdC8qIE9ubHkgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0YWlsIHJlZ2lvbiBjb3VudHMgKi9cbiYjNDM7XHRpZiAoZnJlZWRfaWR4ICE9IHRpZClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0bnJfdGFpbCYjNDM7JiM0Mzs7XG4mIzQzO1x0V1JJVEVfT05DRShzaS1cdTAwM2Vucl9mcmVlX3RhaWwsIG5yX3RhaWwpO1xuJiM0MztcbiYjNDM7XHQvKiBFeHRlbmQ6IGluY2x1ZGUgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwgKi9cbiYjNDM7XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBYU1dBUF9HUk9XX0NMVVNURVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0bnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4mIzQzO1x0XHRucl90YWlsID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCk7XG4mIzQzO1x0XHRpZiAobnJfdGFpbCBcdTAwM2U9IG5yX21hcHBlZCAtIDEpXG4mIzQzO1x0XHRcdGJyZWFrOyAvKiByZWFjaGVkIGNsdXN0ZXIgMCAqL1xuJiM0MztcdFx0dGlkID0gbnJfbWFwcGVkIC0gbnJfdGFpbCAtIDE7XG4mIzQzO1x0XHRjaSA9IFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1t0aWRdO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSRUFEX09OQ0UoY2ktXHUwMDNlY291bnQpIHx8XG4mIzQzO1x0XHQgICAgUkVBRF9PTkNFKGNpLVx1MDAzZWZsYWdzKSAhPSBDTFVTVEVSX0ZMQUdfRlJFRSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRucl90YWlsJiM0MzsmIzQzOztcbiYjNDM7XHRcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsLCBucl90YWlsKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRyaW0gc2ktXHUwMDNlbnJfZnJlZV90YWlsIHdoZW4gYSBjbHVzdGVyIGluIHRoZSB0YWlsIHJlZ2lvbiBpcyBhbGxvY2F0ZWQuXG4mIzQzOyAqIEBpZHg6IGluZGV4IG9mIHRoZSBjbHVzdGVyIGJlaW5nIGFsbG9jYXRlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGFpbF9zdGFydDtcbiYjNDM7XG4mIzQzO1x0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogbnJfY2x1c3RlcnNfbWFwcGVkIGFuZCBucl9mcmVlX3RhaWwgYXJlIHJlYWQgbG9ja2xlc3NseTtcbiYjNDM7XHQgKiBjb25jdXJyZW50IHVwZGF0ZXMgbWF5IGNhdXNlIG5yX2ZyZWVfdGFpbCB0byBiZSB0cmltbWVkXG4mIzQzO1x0ICogc2xpZ2h0bHkgbGVzcyB0aGFuIGlkZWFsbHksIHdoaWNoIGlzIGhhcm1sZXNzLlxuJiM0MztcdCAqL1xuJiM0MztcdG5yX21hcHBlZCA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQpO1xuJiM0MztcdG5yX3RhaWwgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsKTtcbiYjNDM7XHR0YWlsX3N0YXJ0ID0gbnJfbWFwcGVkIC0gbnJfdGFpbDtcbiYjNDM7XHRpZiAoaWR4IFx1MDAzZT0gdGFpbF9zdGFydClcbiYjNDM7XHRcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsLCBucl9tYXBwZWQgLSBpZHggLSAxKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfc2hyaW5rX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gY29udGFpbmVyX29mKHdvcmssXG4mIzQzO1x0XHRcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0LCB4c3dhcF9zaHJpbmtfd29yayk7XG4mIzQzO1x0eHN3YXBfdHJ5X3NocmluayhzaSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRyeSB0byBzaHJpbmsgdGhlIGNsdXN0ZXJfaW5mbyB0YWlsLiAgVXNlcyBzaS1cdTAwM2Vucl9mcmVlX3RhaWwgd2hpY2hcbiYjNDM7ICogaXMgbWFpbnRhaW5lZCBpbmNyZW1lbnRhbGx5IGR1cmluZyBhbGxvYy9mcmVlIOKAlCBubyBzY2FubmluZyBuZWVkZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB4c3dhcF90cnlfc2hyaW5rKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnJfbWFwcGVkLCBucl9jZWlsaW5nLCBucl90YWlsLCBucl91bm1hcDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgaTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuJiM0MztcbiYjNDM7XHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0bnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4mIzQzO1x0bnJfY2VpbGluZyA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVycyk7XG4mIzQzO1x0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9mcmVlX3RhaWwpO1xuJiM0MztcbiYjNDM7XHRpZiAobnJfbWFwcGVkIFx1MDAzYz0gbnJfY2VpbGluZylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRpZiAobnJfdGFpbCBcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0bnJfdW5tYXAgPSBtaW4ocm91bmRfZG93bihucl90YWlsLCBYU1dBUF9HUk9XX0NMVVNURVJTKSxcbiYjNDM7XHRcdCAgICAgICBucl9tYXBwZWQgLSBucl9jZWlsaW5nKTtcbiYjNDM7XHRpZiAobnJfdW5tYXAgXHUwMDNjIFhTV0FQX0dST1dfQ0xVU1RFUlMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c3RhcnRfaWR4ID0gbnJfbWFwcGVkIC0gbnJfdW5tYXA7XG4mIzQzO1xuJiM0MztcdC8qIFZlcmlmeSB0aGUgdGFpbCBjbHVzdGVycyBhcmUgc3RpbGwgZnJlZSBiZWZvcmUgdW5tYXBwaW5nICovXG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuJiM0MztcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcdTAwM2MgbnJfbWFwcGVkOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y2kgPSBcdTAwMjZzaS1cdTAwM2VjbHVzdGVyX2luZm9baV07XG4mIzQzO1x0XHRpZiAoY2ktXHUwMDNlZmxhZ3MgIT0gQ0xVU1RFUl9GTEFHX0ZSRUUpIHtcbiYjNDM7XHRcdFx0bnJfdW5tYXAgPSBpIC0gc3RhcnRfaWR4O1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGxpc3RfZGVsKFx1MDAyNmNpLVx1MDAzZWxpc3QpO1xuJiM0MztcdFx0Y2ktXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORTtcbiYjNDM7XHR9XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmIChucl91bm1hcCBcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0eHN3YXBfdW5tYXBfY2x1c3RlcnMoc2ksIHN0YXJ0X2lkeCwgbnJfdW5tYXApO1xuJiM0MztcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsLCBucl90YWlsIC0gbnJfdW5tYXApO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfWFNXQVAgKi9cbiYjNDM7XG4gc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0XHRcdFx0ICAgIHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbiBcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIG1heHBhZ2VzKVxuQEAgLTM1MzIsNiAmIzQzOzQxMjAsNzAgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aW50IGVyciA9IC1FTk9NRU07XG4gXHR1bnNpZ25lZCBsb25nIGk7XG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBzaXplID0gUEFHRV9BTElHTihucl9jbHVzdGVycyAqIHNpemVvZigqY2x1c3Rlcl9pbmZvKSk7XG4mIzQzO1x0XHRzdHJ1Y3Qgdm1fc3RydWN0ICp2bTtcbiYjNDM7XG4mIzQzO1x0XHR2bSA9IGdldF92bV9hcmVhKHNpemUsIFZNX1NQQVJTRSk7XG4mIzQzO1x0XHRpZiAoIXZtKVxuJiM0MztcdFx0XHRnb3RvIGVycjtcbiYjNDM7XG4mIzQzO1x0XHRjbHVzdGVyX2luZm8gPSB2bS1cdTAwM2VhZGRyO1xuJiM0MztcdFx0c2ktXHUwMDNlY2x1c3Rlcl92bSA9IHZtO1xuJiM0MztcdFx0c2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4ID0gbnJfY2x1c3RlcnM7XG4mIzQzO1x0XHRzaS1cdTAwM2Vucl9jbHVzdGVycyA9IG5yX2NsdXN0ZXJzO1xuJiM0MztcdFx0c2ktXHUwMDNlY2x1c3Rlcl9pbmZvID0gY2x1c3Rlcl9pbmZvO1xuJiM0MztcbiYjNDM7XHRcdC8qIE1hcCB0aGUgaW5pdGlhbCBjaHVuayAoYXQgbGVhc3QgY2x1c3RlciAwKSAqL1xuJiM0MztcdFx0aWYgKHhzd2FwX21hcF9jbHVzdGVycyhzaSwgMCwgbWluX3QodW5zaWduZWQgbG9uZyxcbiYjNDM7XHRcdFx0XHRcdFhTV0FQX0dST1dfQ0xVU1RFUlMsIG5yX2NsdXN0ZXJzKSkpXG4mIzQzO1x0XHRcdGdvdG8gZXJyX2ZyZWVfdm07XG4mIzQzO1xuJiM0MztcdFx0LyogeHN3YXA6IG9ubHkgY2x1c3RlciAwIHNsb3QgMCBpcyBiYWQgKi9cbiYjNDM7XHRcdGVyciA9IHN3YXBfY2x1c3Rlcl9zZXR1cF9iYWRfc2xvdChzaSwgY2x1c3Rlcl9pbmZvLCAwLCBmYWxzZSk7XG4mIzQzO1x0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRnb3RvIGVycl91bm1hcDtcbiYjNDM7XG4mIzQzO1x0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZzaS1cdTAwM2VmcmVlX2NsdXN0ZXJzKTtcbiYjNDM7XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZWZ1bGxfY2x1c3RlcnMpO1xuJiM0MztcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2c2ktXHUwMDNlZGlzY2FyZF9jbHVzdGVycyk7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBTV0FQX05SX09SREVSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2c2ktXHUwMDNlbm9uZnVsbF9jbHVzdGVyc1tpXSk7XG4mIzQzO1x0XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZWZyYWdfY2x1c3RlcnNbaV0pO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIE1hcmsgbWFwcGVkIGNsdXN0ZXJzOiBjbHVzdGVyIDAgaGFzIDEgYmFkIHNsb3QsIHJlc3QgZnJlZSAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gXHUwMDI2Y2x1c3Rlcl9pbmZvW2ldO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKGkgPT0gMCkge1xuJiM0MztcdFx0XHRcdGNpLVx1MDAzZWZsYWdzID0gQ0xVU1RFUl9GTEFHX05PTkZVTEw7XG4mIzQzO1x0XHRcdFx0bGlzdF9hZGRfdGFpbChcdTAwMjZjaS1cdTAwM2VsaXN0LCBcdTAwMjZzaS1cdTAwM2Vub25mdWxsX2NsdXN0ZXJzWzBdKTtcbiYjNDM7XHRcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0XHRjaS1cdTAwM2VmbGFncyA9IENMVVNURVJfRkxBR19GUkVFO1xuJiM0MztcdFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Y2ktXHUwMDNlbGlzdCwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKiBBbGwgbWFwcGVkIGNsdXN0ZXJzIGV4Y2VwdCBjbHVzdGVyIDAgYXJlIGZyZWUgYXQgdGhlIHRhaWwgKi9cbiYjNDM7XHRcdHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCA9IHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCAtIDE7XG4mIzQzO1xuJiM0MztcdFx0bXV0ZXhfaW5pdChcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbiYjNDM7XHRcdElOSVRfV09SSyhcdTAwMjZzaS1cdTAwM2V4c3dhcF9zaHJpbmtfd29yaywgeHN3YXBfc2hyaW5rX3dvcmtfZm4pO1xuJiM0MztcdFx0eHN3YXBfZGVidWdmc19hZGQoc2kpO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJfdW5tYXA6XG4mIzQzO1x0XHR4c3dhcF91bm1hcF9jbHVzdGVycyhzaSwgMCwgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbiYjNDM7ZXJyX2ZyZWVfdm06XG4mIzQzO1x0XHRmcmVlX3ZtX2FyZWEoc2ktXHUwMDNlY2x1c3Rlcl92bSk7XG4mIzQzO1x0XHRzaS1cdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcbiYjNDM7XHRcdHNpLVx1MDAzZWNsdXN0ZXJfaW5mbyA9IE5VTEw7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7I2VuZGlmIC8qIENPTkZJR19YU1dBUCAqL1xuJiM0MztcbiBcdGNsdXN0ZXJfaW5mbyA9IGt2emFsbG9jX29ianMoKmNsdXN0ZXJfaW5mbywgbnJfY2x1c3RlcnMpO1xuIFx0aWYgKCFjbHVzdGVyX2luZm8pXG4gXHRcdGdvdG8gZXJyO1xuQEAgLTM1OTksNyAmIzQzOzQyNTEsNyBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRzaS1cdTAwM2VjbHVzdGVyX2luZm8gPSBjbHVzdGVyX2luZm87XG4gXHRyZXR1cm4gMDtcbiBlcnI6XG4tXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xuJiM0MztcdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtMzgxOCw3ICYjNDM7NDQ3MCw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHRzaS1cdTAwM2VnbG9iYWxfY2x1c3RlciA9IE5VTEw7XG4gXHRpbm9kZSA9IE5VTEw7XG4gXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhzaSwgc3dhcF9maWxlKTtcbi1cdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2ktXHUwMDNlY2x1c3Rlcl9pbmZvLCBzaS1cdTAwM2VtYXgpO1xuJiM0MztcdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpO1xuIFx0c2ktXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbiBcdC8qXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xuQEAgLTM5MzAsNyAmIzQzOzQ1ODIsNiBAQCB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKVxuIHN0YXRpYyBpbnQgX19pbml0IHN3YXBmaWxlX2luaXQodm9pZClcbiB7XG4gXHRzd2FwZmlsZV9tYXhpbXVtX3NpemUgPSBhcmNoX21heF9zd2FwZmlsZV9zaXplKCk7XG4tXG4gXHQvKlxuIFx0ICogT25jZSBhIGNsdXN0ZXIgaXMgZnJlZWQsIGl0JiMzOTtzIHN3YXAgdGFibGUgY29udGVudCBpcyByZWFkXG4gXHQgKiBvbmx5LCBhbmQgYWxsIHN3YXAgY2FjaGUgcmVhZGVycyAoc3dhcF9jYWNoZV8qKSB2ZXJpZmllc1xuQEAgLTM5NDAsMTIgJiM0Mzs0NTkxLDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHN3YXBmaWxlX2luaXQodm9pZClcbiBcdFx0c3dhcF90YWJsZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShcJiMzNDtzd2FwX3RhYmxlXCYjMzQ7LFxuIFx0XHRcdFx0ICAgIHNpemVvZihzdHJ1Y3Qgc3dhcF90YWJsZSksXG4gXHRcdFx0XHQgICAgMCwgU0xBQl9QQU5JQyB8IFNMQUJfVFlQRVNBRkVfQllfUkNVLCBOVUxMKTtcbi1cbiAjaWZkZWYgQ09ORklHX01JR1JBVElPTlxuIFx0aWYgKHN3YXBmaWxlX21heGltdW1fc2l6ZSBcdTAwM2U9ICgxVUwgXHUwMDNjXHUwMDNjIFNXUF9NSUdfVE9UQUxfQklUUykpXG4gXHRcdHN3YXBfbWlncmF0aW9uX2FkX3N1cHBvcnRlZCA9IHRydWU7XG4gI2VuZGlmXHQvKiBDT05GSUdfTUlHUkFUSU9OICovXG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfWFNXQVBcbiYjNDM7XHR4c3dhcF9kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoXCYjMzQ7eHN3YXBcJiMzNDssIE5VTEwpO1xuJiM0MzsjZW5kaWZcbiYjNDM7XG4gXHRyZXR1cm4gMDtcbiB9XG4gc3Vic3lzX2luaXRjYWxsKHN3YXBmaWxlX2luaXQpO1xuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCBmN2M5Yzg5ZjY0NDljLi42MTc4NDY1ZDA1ODM3IDEwMDY0NFxuLS0tIGEvbW0venN3YXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0venN3YXAuY1xuQEAgLTk5OCw3ICYjNDM7OTk4LDEyIEBAIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHQvKiB0cnkgdG8gYWxsb2NhdGUgc3dhcCBjYWNoZSBmb2xpbyAqL1xuIFx0c2kgPSBnZXRfc3dhcF9kZXZpY2Uoc3dwZW50cnkpO1xuIFx0aWYgKCFzaSlcbi1cdFx0cmV0dXJuIC1FRVhJU1Q7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbiYjNDM7XHRcdHB1dF9zd2FwX2RldmljZShzaSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4gXG4gXHRtcG9sID0gZ2V0X3Rhc2tfcG9saWN5KGN1cnJlbnQpO1xuIFx0Zm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cGVudHJ5LCBHRlBfS0VSTkVMLCBCSVQoMCksIE5VTEwsIG1wb2wsXG5AQCAtMTUzNSw3ICYjNDM7MTU0MCw3IEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdHpzd2FwX3Bvb2xfcHV0KHBvb2wpO1xuIHB1dF9vYmpjZzpcbiBcdG9ial9jZ3JvdXBfcHV0KG9iamNnKTtcbi1cdGlmICghcmV0IFx1MDAyNlx1MDAyNiB6c3dhcF9wb29sX3JlYWNoZWRfZnVsbClcbiYjNDM7XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgenN3YXBfcG9vbF9yZWFjaGVkX2Z1bGwgXHUwMDI2XHUwMDI2IGF0b21pY19yZWFkKFx1MDAyNm5yX3JlYWxfc3dhcGZpbGVzKSlcbiBcdFx0cXVldWVfd29yayhzaHJpbmtfd3EsIFx1MDAyNnpzd2FwX3Nocmlua193b3JrKTtcbiBjaGVja19vbGQ6XG4gXHQvKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtYU1dBUCYjMzQ7LAogICAgJiMzNDtERUJVR19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3hzd2FwX21heF9jbHVzdGVyc193cml0ZSYjMzQ7LAogICAgJiMzNDt4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZCYjMzQ7LAogICAgJiMzNDt4c3dhcF9zaHJpbmtfd29ya19mbiYjMzQ7LAogICAgJiMzNDt4c3dhcF9jaGVja19tYXBwZWQmIzM0OywKICAgICYjMzQ7eHN3YXBfY29sbGVjdF9wYWdlJiMzNDssCiAgICAmIzM0O3hzd2FwX21hcF9jbHVzdGVycyYjMzQ7LAogICAgJiMzNDt4c3dhcF91bm1hcF9jbHVzdGVycyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dGVuZGFibGUgdmlydHVhbCBzd2FwIGRldmljZSAoeHN3YXApIHRoYXQgZGVjb3VwbGVzIFBURSBzd2FwIGVudHJpZXMgZnJvbSBwaHlzaWNhbCBiYWNraW5nIHN0b3JhZ2UuIEl0IHVzZXMgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIGZvciBjbHVzdGVyIGluZm8gdGhhdCBncm93cyBhbmQgc2hyaW5rcyBkeW5hbWljYWxseS4gVGhpcyBhZGRzIG5ldyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgZm9yIHN3YXAgbWFuYWdlbWVudCwgaW5jbHVkaW5nIGRlYnVnZnMgaW50ZXJmYWNlcyBhbmQgYSB3b3JrcXVldWUgZm9yIHNocmlua2luZy4gSXQgaXMgZnVuY3Rpb25hbCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDIzYjg2NWYzYzQ5NjdkMjI3ZTY5ZTM5MjBmYzQyNTc0NTlmYmZjNDIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEF1ZyA1IDA5OjE0OjM2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCA0NWYzMDFkNzNlMmFlLi5hNWIzMjMzNzQ3NjljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMjA3LDYgJiM0MzsyMDcsNyBAQCBlbnVtIHsKIAlTV1BfU1RBQkxFX1dSSVRFUyA9ICgxICZsdDsmbHQ7IDExKSwJLyogbm8gb3ZlcndyaXRlIFBHX3dyaXRlYmFjayBwYWdlcyAqLwogCVNXUF9TWU5DSFJPTk9VU19JTyA9ICgxICZsdDsmbHQ7IDEyKSwJLyogc3luY2hyb25vdXMgSU8gaXMgZWZmaWNpZW50ICovCiAJU1dQX0hJQkVSTkFUSU9OID0gKDEgJmx0OyZsdDsgMTMpLAkvKiBwaW5uZWQgZm9yIGhpYmVybmF0aW9uICovCiYjNDM7CVNXUF9YU1dBUAk9ICgxICZsdDsmbHQ7IDE0KSwJLyogZXh0ZW5kYWJsZSBzd2FwIGRldmljZSAqLwogCQkJCQkvKiBhZGQgb3RoZXJzIGhlcmUgYmVmb3JlLi4uICovCiB9OwogCkBAIC0yNDcsNiAmIzQzOzI0OCwxNiBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7CiAJc2lnbmVkIGNoYXIJdHlwZTsJCS8qIHN0cmFuZ2UgbmFtZSBmb3IgYW4gaW5kZXggKi8KIAl1bnNpZ25lZCBpbnQJbWF4OwkJLyogc2l6ZSBvZiB0aGlzIHN3YXAgZGV2aWNlICovCiAJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87IC8qIGNsdXN0ZXIgaW5mby4gT25seSBmb3IgU1NEICovCiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUAomIzQzOwlzdHJ1Y3Qgdm1fc3RydWN0CSpjbHVzdGVyX3ZtOwkvKiBWTV9TUEFSU0UgYXJlYSBmb3IgeHN3YXAgZHluYW1pYyBjbHVzdGVyX2luZm8gKi8KJiM0MzsJdW5zaWduZWQgbG9uZwkJbnJfY2x1c3RlcnNfbWF4Oy8qIHVwcGVyIGxpbWl0IGZyb20gc3dhcCBoZWFkZXIgKi8KJiM0MzsJdW5zaWduZWQgbG9uZwkJbnJfY2x1c3RlcnM7CS8qIGN1cnJlbnQgZ3Jvd3RoIGNlaWxpbmcgKOKJpCBucl9jbHVzdGVyc19tYXgpICovCiYjNDM7CXVuc2lnbmVkIGxvbmcJCW5yX2NsdXN0ZXJzX21hcHBlZDsgLyogY3VycmVudGx5IG1hcHBlZCBjbHVzdGVyIGNvdW50ICovCiYjNDM7CXVuc2lnbmVkIGxvbmcJCW5yX2ZyZWVfdGFpbDsJLyogY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0IHRhaWwgKi8KJiM0MzsJc3RydWN0IGRlbnRyeQkJKmRlYnVnZnNfZW50cnk7CS8qIGRlYnVnZnM6IHR5cGUmbHQ7TiZndDtfbWF4X2NsdXN0ZXJzICovCiYjNDM7CXN0cnVjdCB3b3JrX3N0cnVjdAl4c3dhcF9zaHJpbmtfd29yazsgLyogZGVmZXJyZWQgc2hyaW5rIHRyaWdnZXIgKi8KJiM0MzsJc3RydWN0IG11dGV4CQl4c3dhcF9sb2NrOwkvKiBzZXJpYWxpemUgbWFwL3VubWFwIG9wZXJhdGlvbnMgKi8KJiM0MzsjZW5kaWYKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfY2x1c3RlcnM7IC8qIGZyZWUgY2x1c3RlcnMgbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZnVsbF9jbHVzdGVyczsgLyogZnVsbCBjbHVzdGVycyBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBub25mdWxsX2NsdXN0ZXJzW1NXQVBfTlJfT1JERVJTXTsKQEAgLTM1MCw2ICYjNDM7MzYxLDcgQEAgdm9pZCBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBmb2xpbyAqZm9saW8pOwogdm9pZCBmcmVlX3BhZ2VzX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBlbmNvZGVkX3BhZ2UgKiosIGludCk7CiAvKiBsaW51eC9tbS9zd2FwZmlsZS5jICovCiBleHRlcm4gYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzOwomIzQzO2V4dGVybiBhdG9taWNfdCBucl9yZWFsX3N3YXBmaWxlczsKIGV4dGVybiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7CiBleHRlcm4gYXRvbWljX3QgbnJfcm90YXRlX3N3YXA7CiAKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IDA2MDE5MGUxMmJjZWQuLjgyZjYyZjRjNWIyM2UgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvbW0vS2NvbmZpZwpAQCAtMTIyLDYgJiM0MzsxMjIsMTUgQEAgY29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVAogICAgICAgIGRlZmF1bHQgJiMzNDt6c3RkJiMzNDsgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX1pTVEQKICAgICAgICBkZWZhdWx0ICYjMzQ7JiMzNDsKIAomIzQzO2NvbmZpZyBYU1dBUAomIzQzOwlib29sICYjMzQ7RXh0ZW5kYWJsZSAodmlydHVhbCkgc3dhcCBkZXZpY2UmIzM0OwomIzQzOwlkZXBlbmRzIG9uIFNXQVAgJmFtcDsmYW1wOyA2NEJJVAomIzQzOwloZWxwCiYjNDM7CSAgQWRkcyBzdXBwb3J0IGZvciBleHRlbmRhYmxlIHN3YXAgZGV2aWNlcyAoeHN3YXApIHRoYXQgZGVjb3VwbGUKJiM0MzsJICBQVEUgc3dhcCBlbnRyaWVzIGZyb20gcGh5c2ljYWwgYmFja2luZyBzdG9yYWdlLiBUaGUgY2x1c3Rlcl9pbmZvCiYjNDM7CSAgYXJyYXkgaXMgYmFja2VkIGJ5IGEgc3BhcnNlIHZtYWxsb2MgYXJlYSB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzCiYjNDM7CSAgb24gZGVtYW5kLCBhdm9pZGluZyBzdGF0aWMgcHJlLWFsbG9jYXRpb24gb3ZlcmhlYWQuCiYjNDM7CiBjb25maWcgWlNNQUxMT0MKIAl0cmlzdGF0ZQogCmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmMKaW5kZXggZTRmYTdmZmZmZThiYi4uMWYzZmE1MjEzMWFiMyAxMDA2NDQKLS0tIGEvbW0vcGFnZV9pby5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3BhZ2VfaW8uYwpAQCAtMjQ3LDYgJiM0MzsyNDcsMTcgQEAgaW50IHN3YXBfd3JpdGVvdXQoc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCiYjNDM7CS8qCiYjNDM7CSAqIGN0eC0mZ3Q7c2lzIGlzIHNldCBieSBzd2FwX2FkZF9mb2xpbygpIHdoaWNoIGlzIGNhbGxlZCBmcm9tCiYjNDM7CSAqIF9fc3dhcF93cml0ZXBhZ2UoKSBiZWxvdy4gIFNpbmNlIHdlIG11c3QgYXZvaWQgdGhlIHdyaXRlcGFnZQomIzQzOwkgKiBwYXRoIGZvciB4c3dhcCBkZXZpY2VzLCB1c2UgdGhlIHN3YXBfaW5mbyBmcm9tIHRoZSBmb2xpbyYjMzk7cwomIzQzOwkgKiBzd2FwIGVudHJ5IGRpcmVjdGx5IGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCBjdHguCiYjNDM7CSAqLwomIzQzOwlpZiAodW5saWtlbHkoX19zd2FwX2VudHJ5X3RvX2luZm8oZm9saW8tJmd0O3N3YXApLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApKSB7CiYjNDM7CQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKJiM0MzsJCXJldHVybiBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOwomIzQzOwl9CiYjNDM7CiAJX19zd2FwX3dyaXRlcGFnZShjdHgsIGZvbGlvKTsKIAlyZXR1cm4gMDsKIG91dF91bmxvY2s6CkBAIC00NzksNiAmIzQzOzQ5MCwxMSBAQCB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbykKIAlpZiAoenN3YXBfbG9hZChmb2xpbykgIT0gLUVOT0VOVCkKIAkJZ290byBmaW5pc2g7CiAKJiM0MzsJaWYgKHVubGlrZWx5KHNpcy0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1hTV0FQKSkgewomIzQzOwkJZm9saW9fdW5sb2NrKGZvbGlvKTsKJiM0MzsJCWdvdG8gZmluaXNoOwomIzQzOwl9CiYjNDM7CiAJLyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovCiAJenN3YXBfZm9saW9fc3dhcGluKGZvbGlvKTsKIAlzd2FwX2FkZF9mb2xpbyhjdHgsIGZvbGlvLCBSRUFEKTsKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCA1YmU4MjU5MTFlNjQ1Li5lYmIyZDJhYzM1NmZlIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC04MjksNiAmIzQzOzgyOSwxMyBAQCBzdHJ1Y3QgZm9saW8gKnN3YXBfY2x1c3Rlcl9yZWFkYWhlYWQoc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcF9tYXNrLAogCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCXN3cF9lbnRyeV90IHJhX2VudHJ5OwogCiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBlbnRyeSBtYXkgaGF2ZSBiZWVuIGZyZWVkIGJ5IGFub3RoZXIgdGFzay4gQXZvaWQgc3dhcF9pbmZvX2dldCgpCiYjNDM7CSAqIHdoaWNoIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBpZiB0aGUgcmFjZSBoYXBwZW5zLgomIzQzOwkgKi8KJiM0MzsJaWYgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApCiYjNDM7CQlnb3RvIHNraXA7CiYjNDM7CiAJbWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTsKIAlpZiAoIW1hc2spCiAJCWdvdG8gc2tpcDsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IDRkNGUzZTMwNTlmNmIuLmNhNDA2NTU2NjI2ZTcgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuYwpAQCAtNDgsNiAmIzQzOzQ4LDExOCBAQAogI2luY2x1ZGUgJiMzNDtzd2FwX3RhYmxlLmgmIzM0OwogI2luY2x1ZGUgJiMzNDtpbnRlcm5hbC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7c3dhcC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZGVidWdmcy5oJmd0OwomIzQzOwomIzQzO3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9sb2NrKTsKJiM0MzsKJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQCiYjNDM7LyoKJiM0MzsgKiB4c3dhcDogZHluYW1pY2FsbHkgZ3JvdyBhbmQgc2hyaW5rIHRoZSBjbHVzdGVyX2luZm8gYXJyYXkgdmlhIGEKJiM0MzsgKiBWTV9TUEFSU0UgYXJlYS4KJiM0MzsgKgomIzQzOyAqIFhTV0FQX0dST1dfQ0xVU1RFUlMgaXMgdGhlIG51bWJlciBvZiBjbHVzdGVycyB0byBtYXAvdW5tYXAgaW4gb25lCiYjNDM7ICogZ3Jvdy9zaHJpbmsgb3BlcmF0aW9uLiAgSXQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgY2x1c3Rlcl9pbmZvCiYjNDM7ICogc3RydWN0cyB0aGF0IGZpdCBpbiBhIHNpbmdsZSBwYWdlIChhdCBsZWFzdCAxNiksIHNvIHRoYXQgdGhlIHZtYWxsb2MKJiM0MzsgKiBwYWdlIHRhYmxlCiYjNDM7ICogb3ZlcmhlYWQgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgbWFwcGVkLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgWFNXQVBfR1JPV19DTFVTVEVSUyBcCiYjNDM7CW1heF90KHVuc2lnbmVkIGxvbmcsIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pLCAxNikKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGRlbnRyeSAqeHN3YXBfZGVidWdmc19yb290OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgeHN3YXBfbWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucik7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdW5tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAomIzQzOwkJCQkgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIHVuc2lnbmVkIGxvbmcgbnIpOwomIzQzO3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSk7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdHJpbV9mcmVlX3RhaWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIGlkeCk7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdXBkYXRlX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGZyZWVkX2lkeCk7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfdHJ5X3NocmluayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpOwomIzQzOwomIzQzOy8qCiYjNDM7ICogZGVidWdmcyByZWFkL3dyaXRlIGZvciBwZXItZGV2aWNlIG1heCBjbHVzdGVyIGNvdW50LgomIzQzOyAqIFNob3dzL3NldHMgc2ktJmd0O25yX2NsdXN0ZXJzIChjdXJyZW50IGdyb3d0aCBjZWlsaW5nKSwgY2xhbXBlZCB0bwomIzQzOyAqIFswLCBzaS0mZ3Q7bnJfY2x1c3RlcnNfbWF4XS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKJiM0MzsJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQomIzQzO3sKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gZmlsZS0mZ3Q7cHJpdmF0ZV9kYXRhOwomIzQzOwljaGFyIHRtcFszMl07CiYjNDM7CWludCBsZW47CiYjNDM7CiYjNDM7CWxlbiA9IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICYjMzQ7JWx1XG4mIzM0OywgUkVBRF9PTkNFKHNpLSZndDtucl9jbHVzdGVycykpOwomIzQzOwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgdG1wLCBsZW4pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCiYjNDM7CQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLAomIzQzOwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdmFsLCBuZXdfcGFnZXM7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IGtzdHJ0b3VsX2Zyb21fdXNlcihidWYsIGNvdW50LCAwLCAmYW1wO3ZhbCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwomIzQzOwlpZiAodmFsICZndDsgc2ktJmd0O25yX2NsdXN0ZXJzX21heCkKJiM0MzsJCXZhbCA9IHNpLSZndDtucl9jbHVzdGVyc19tYXg7CiYjNDM7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NpLSZndDtsb2NrKTsKJiM0MzsJc2ktJmd0O25yX2NsdXN0ZXJzID0gdmFsOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3NpLSZndDtsb2NrKTsKJiM0MzsKJiM0MzsJLyogS2VlcCB0aGUgdmlzaWJsZSBzd2FwIHNpemUgaW4gc3luYyB3aXRoIHRoZSBuZXcgY2VpbGluZy4gKi8KJiM0MzsJbmV3X3BhZ2VzID0gbWluX3QodW5zaWduZWQgbG9uZywgdmFsICogU1dBUEZJTEVfQ0xVU1RFUiwgc2ktJmd0O21heCk7CiYjNDM7CWlmIChuZXdfcGFnZXMpCiYjNDM7CQluZXdfcGFnZXMtLTsKJiM0MzsJaWYgKG5ld19wYWdlcyAhPSBzaS0mZ3Q7cGFnZXMpIHsKJiM0MzsJCWxvbmcgZGVsdGEgPSAobG9uZyluZXdfcGFnZXMgLSAobG9uZylzaS0mZ3Q7cGFnZXM7CiYjNDM7CiYjNDM7CQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwkJc2ktJmd0O3BhZ2VzID0gbmV3X3BhZ2VzOwomIzQzOwkJYXRvbWljX2xvbmdfYWRkKGRlbHRhLCAmYW1wO25yX3N3YXBfcGFnZXMpOwomIzQzOwkJdG90YWxfc3dhcF9wYWdlcyAmIzQzOz0gZGVsdGE7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2hyaW5rIHRyaWdnZXI6IGxvd2VyaW5nIHRoZSBjZWlsaW5nIG1heSBmcmVlIHRhaWwgY2x1c3RlcnMuICovCiYjNDM7CXNjaGVkdWxlX3dvcmsoJmFtcDtzaS0mZ3Q7eHN3YXBfc2hyaW5rX3dvcmspOwomIzQzOwomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhzd2FwX2RlYnVnZnNfZm9wcyA9IHsKJiM0MzsJLnJlYWQgPSB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZCwKJiM0MzsJLndyaXRlID0geHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlLAomIzQzOwkub3BlbiA9IHNpbXBsZV9vcGVuLAomIzQzOwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB4c3dhcF9kZWJ1Z2ZzX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwljaGFyIG5hbWVbMzJdOwomIzQzOwomIzQzOwlpZiAoIXhzd2FwX2RlYnVnZnNfcm9vdCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAmIzM0O3R5cGUlZF9jbHVzdGVyX2xpbWl0JiMzNDssIHNpLSZndDt0eXBlKTsKJiM0MzsJc2ktJmd0O2RlYnVnZnNfZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA2NDQsIHhzd2FwX2RlYnVnZnNfcm9vdCwKJiM0MzsJCQkJCQlzaSwgJmFtcDt4c3dhcF9kZWJ1Z2ZzX2ZvcHMpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB4c3dhcF9kZWJ1Z2ZzX2RlbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwlkZWJ1Z2ZzX3JlbW92ZShzaS0mZ3Q7ZGVidWdmc19lbnRyeSk7CiYjNDM7CXNpLSZndDtkZWJ1Z2ZzX2VudHJ5ID0gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7CiYjNDM7I2VuZGlmCiAKIHN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQkJICAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7CkBAIC02Myw5ICYjNDM7MTc1LDkgQEAgc3RhdGljIHZvaWQgbW92ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKICAqCiAgKiBBbHNvIHByb3RlY3RzIHN3YXBfYWN0aXZlX2hlYWQgdG90YWxfc3dhcF9wYWdlcywgYW5kIHRoZSBTV1BfV1JJVEVPSyBmbGFnLgogICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlczsKIGF0b21pY19sb25nX3QgbnJfc3dhcF9wYWdlczsKJiM0MzthdG9taWNfdCBucl9yZWFsX3N3YXBmaWxlczsKIC8qCiAgKiBTb21lIG1vZHVsZXMgdXNlIHN3YXBwYWJsZSBvYmplY3RzIGFuZCBtYXkgdHJ5IHRvIHN3YXAgdGhlbSBvdXQgdW5kZXIKICAqIG1lbW9yeSBwcmVzc3VyZSAodmlhIHRoZSBzaHJpbmtlcikuIEJlZm9yZSBkb2luZyBzbywgdGhleSBtYXkgd2lzaCB0bwpAQCAtNjA5LDYgJiM0Mzs3MjEsMTAgQEAgc3RhdGljIHZvaWQgX19mcmVlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8KIAlzd2FwX2NsdXN0ZXJfZnJlZV90YWJsZShjaSk7CiAJbW92ZV9jbHVzdGVyKHNpLCBjaSwgJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycywgQ0xVU1RFUl9GTEFHX0ZSRUUpOwogCWNpLSZndDtvcmRlciA9IDA7CiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUAomIzQzOwl4c3dhcF91cGRhdGVfZnJlZV90YWlsKHNpLCBjaSAtIHNpLSZndDtjbHVzdGVyX2luZm8pOwomIzQzOwlzY2hlZHVsZV93b3JrKCZhbXA7c2ktJmd0O3hzd2FwX3Nocmlua193b3JrKTsKJiM0MzsjZW5kaWYKIH0KIAogLyoKQEAgLTk1NSw2ICYjNDM7MTA3MSw5IEBAIHN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCWlmIChjbHVzdGVyX2lzX2VtcHR5KGNpKSkKIAkJY2ktJmd0O29yZGVyID0gb3JkZXI7CiAJY2ktJmd0O2NvdW50ICYjNDM7PSBucl9wYWdlczsKJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQCiYjNDM7CXhzd2FwX3RyaW1fZnJlZV90YWlsKHNpLCBjbHVzdGVyX2luZGV4KHNpLCBjaSkpOwomIzQzOyNlbmRpZgogCXN3YXBfcmFuZ2VfYWxsb2Moc2ksIG5yX3BhZ2VzKTsKIAogCXJldHVybiB0cnVlOwpAQCAtMTE4NSw2ICYjNDM7MTMwNCw1MCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlpZiAoZm91bmQpCiAJCQlnb3RvIGRvbmU7CiAJfQomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfWFNXQVAKJiM0MzsJLyoKJiM0MzsJICogRm9yIHhzd2FwOiBpZiBubyBmcmVlIGNsdXN0ZXIgd2FzIGZvdW5kIGFuZCBtb3JlIGNsdXN0ZXJzCiYjNDM7CSAqIGNhbiBiZSBtYXBwZWQsIGdyb3cgdGhlIGNsdXN0ZXJfaW5mbyBhcnJheSBhbmQgcmV0cnkuCiYjNDM7CSAqLwomIzQzOwlpZiAoIWZvdW5kICZhbXA7JmFtcDsgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApICZhbXA7JmFtcDsKJiM0MzsJICAgIFJFQURfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkKSAmbHQ7IFJFQURfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnMpICZhbXA7JmFtcDsKJiM0MzsJICAgIGxpc3RfZW1wdHkoJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycykpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnJfbmV3ID0gbWluKFJFQURfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnMpIC0KJiM0MzsJCQkJCSAgUkVBRF9PTkNFKHNpLSZndDtucl9jbHVzdGVyc19tYXBwZWQpLAomIzQzOwkJCQkJICBYU1dBUF9HUk9XX0NMVVNURVJTKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CiYjNDM7CQlpZiAoIXhzd2FwX21hcF9jbHVzdGVycyhzaSwgc3RhcnQsIG5yX25ldykpIHsKJiM0MzsJCQl1bnNpZ25lZCBsb25nIGFkZGVkID0gMDsKJiM0MzsKJiM0MzsJCQlzcGluX2xvY2soJmFtcDtzaS0mZ3Q7bG9jayk7CiYjNDM7CQkJZm9yIChpID0gc3RhcnQ7IGkgJmx0OyBzdGFydCAmIzQzOyBucl9uZXc7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSAmYW1wO3NpLSZndDtjbHVzdGVyX2luZm9baV07CiYjNDM7CQkJCXNwaW5fbG9jaygmYW1wO2NpLSZndDtsb2NrKTsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogQSBjb25jdXJyZW50IGdyb3dlciBtYXkgaGF2ZSBhbHJlYWR5IGFkZGVkCiYjNDM7CQkJCSAqIHRoZXNlIGNsdXN0ZXJzIHRvIHRoZSBmcmVlIGxpc3QuICBPbmx5IGFkZAomIzQzOwkJCQkgKiBjbHVzdGVycyB0aGF0IGFyZSBzdGlsbCBvZmYtbGlzdCAoTk9ORSkuCiYjNDM7CQkJCSAqLwomIzQzOwkJCQlpZiAoY2ktJmd0O2ZsYWdzID09IENMVVNURVJfRkxBR19OT05FKSB7CiYjNDM7CQkJCQljaS0mZ3Q7ZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfRlJFRTsKJiM0MzsJCQkJCWxpc3RfYWRkX3RhaWwoJmFtcDtjaS0mZ3Q7bGlzdCwgJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycyk7CiYjNDM7CQkJCQlhZGRlZCYjNDM7JiM0Mzs7CiYjNDM7CQkJCX0KJiM0MzsJCQkJc3Bpbl91bmxvY2soJmFtcDtjaS0mZ3Q7bG9jayk7CiYjNDM7CQkJfQomIzQzOwkJCXNwaW5fdW5sb2NrKCZhbXA7c2ktJmd0O2xvY2spOwomIzQzOwkJCVdSSVRFX09OQ0Uoc2ktJmd0O25yX2ZyZWVfdGFpbCwKJiM0MzsJCQkJICAgUkVBRF9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwpICYjNDM7IG5yX25ldyk7CiYjNDM7CiYjNDM7CQkJLyogUmV0cnkgYWxsb2NhdGlvbiBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KJiM0MzsJCQlmb3VuZCA9IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHNpLCAmYW1wO3NpLSZndDtmcmVlX2NsdXN0ZXJzLAomIzQzOwkJCQkJCSAgICBmb2xpbywgZmFsc2UpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7I2VuZGlmCiBkb25lOgogCWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfU09MSURTVEFURSkpCiAJCXNwaW5fdW5sb2NrKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyX2xvY2spOwpAQCAtMTIyMyw2ICYjNDM7MTM4Niw4IEBAIHN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpCiAJCQlnb3RvIHNraXA7CiAJfQogCiYjNDM7CWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApKQomIzQzOwkJYXRvbWljX3N1YigxLCAmYW1wO25yX3JlYWxfc3dhcGZpbGVzKTsKIAlwbGlzdF9kZWwoJmFtcDtzaS0mZ3Q7YXZhaWxfbGlzdCwgJmFtcDtzd2FwX2F2YWlsX2hlYWQpOwogCiBza2lwOgpAQCAtMTI2NSw2ICYjNDM7MTQzMCw4IEBAIHN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pCiAJfQogCiAJcGxpc3RfYWRkKCZhbXA7c2ktJmd0O2F2YWlsX2xpc3QsICZhbXA7c3dhcF9hdmFpbF9oZWFkKTsKJiM0MzsJaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9YU1dBUCkpCiYjNDM7CQlhdG9taWNfYWRkKDEsICZhbXA7bnJfcmVhbF9zd2FwZmlsZXMpOwogCiBza2lwOgogCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKQEAgLTI5NTIsNiAmIzQzOzMxMTksMTkgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2V4dGVudHMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcywKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0mZ3Q7aG9zdDsKIAlpbnQgcmV0OwogCiYjNDM7CWlmIChzaXMtJmd0O2ZsYWdzICZhbXA7IFNXUF9YU1dBUCkgewomIzQzOwkJKnNwYW4gPSAwOwomIzQzOwkJLyoKJiM0MzsJCSAqIHhzd2FwIGRldmljZXMgaGF2ZSBubyBiYWNraW5nIGJsb2NrIGRldmljZSBhbmQKJiM0MzsJCSAqIHBoeXNpY2FsIHdyaXRlb3V0IGlzIHNraXBwZWQgaW4gc3dhcF93cml0ZW91dCgpLAomIzQzOwkJICogYnV0IHNpcy0mZ3Q7b3BzIG11c3Qgc3RpbGwgYmUgc2V0IHNvIHRoYXQgY2FsbGVycwomIzQzOwkJICogbGlrZSBzaHJpbmtfZm9saW9fbGlzdCgpIGNhbiBzYWZlbHkgZGVyZWZlcmVuY2UKJiM0MzsJCSAqIG9wcy0mZ3Q7ZmxhZ3MuCiYjNDM7CQkgKi8KJiM0MzsJCXNpcy0mZ3Q7b3BzID0gJmFtcDtzd2FwX2JkZXZfb3BzOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAlyZXQgPSBzaW9fcG9vbF9pbml0KCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTMwMjMsMjAgJiM0MzszMjAzLDUwIEBAIHN0YXRpYyB2b2lkIHdhaXRfZm9yX2FsbG9jYXRpb24oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCiAJQlVHX09OKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfV1JJVEVPSyk7CiAKJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQCiYjNDM7CS8qCiYjNDM7CSAqIHhzd2FwIGNsdXN0ZXJzIGJleW9uZCBucl9jbHVzdGVyc19tYXBwZWQgaGF2ZSBiZWVuIHVubWFwcGVkCiYjNDM7CSAqIGJ5IHRoZSBzaHJpbmtlciBhbmQgdGhlaXIgdm1hbGxvYyBwYWdlcyBhcmUgbm8gbG9uZ2VyCiYjNDM7CSAqIGFjY2Vzc2libGUuICBPbmx5IGl0ZXJhdGUgb3ZlciBjdXJyZW50bHkgbWFwcGVkIGNsdXN0ZXJzLgomIzQzOwkgKi8KJiM0MzsJaWYgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApCiYjNDM7CQllbmQgPSBtaW4oZW5kLCBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCkgKgomIzQzOwkJCSAgU1dBUEZJTEVfQ0xVU1RFUik7CiYjNDM7I2VuZGlmCiYjNDM7CiAJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgJmx0OyBlbmQ7IG9mZnNldCAmIzQzOz0gU1dBUEZJTEVfQ0xVU1RFUikgewogCQljaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpOwogCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sCi0JCQkJICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcykKJiM0MztzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIHsKJiM0MzsJc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8gPSBzaS0mZ3Q7Y2x1c3Rlcl9pbmZvOwomIzQzOwl1bnNpZ25lZCBsb25nIG1heHBhZ2VzID0gc2ktJmd0O21heDsKIAlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwotCWludCBpLCBucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7CiYjNDM7CWludCBpLCBucl9jbHVzdGVyczsKIAogCWlmICghY2x1c3Rlcl9pbmZvKQogCQlyZXR1cm47CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUAomIzQzOwlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9YU1dBUCkgewomIzQzOwkJeHN3YXBfZGVidWdmc19kZWwoc2kpOwomIzQzOwkJY2FuY2VsX3dvcmtfc3luYygmYW1wO3NpLSZndDt4c3dhcF9zaHJpbmtfd29yayk7CiYjNDM7CQkvKiBVbm1hcCBhbGwgbWFwcGVkIGNsdXN0ZXJzIGFuZCBmcmVlIHRoZSBWTV9TUEFSU0UgYXJlYSAqLwomIzQzOwkJaWYgKHNpLSZndDtucl9jbHVzdGVyc19tYXBwZWQgJmd0OyAwKQomIzQzOwkJCXhzd2FwX3VubWFwX2NsdXN0ZXJzKHNpLCAwLCBzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkKTsKJiM0MzsJCWZyZWVfdm1fYXJlYShzaS0mZ3Q7Y2x1c3Rlcl92bSk7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl92bSA9IE5VTEw7CiYjNDM7CQlzaS0mZ3Q7bnJfY2x1c3RlcnNfbWF4ID0gMDsKJiM0MzsJCXNpLSZndDtucl9jbHVzdGVycyA9IDA7CiYjNDM7CQlzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkID0gMDsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOyNlbmRpZgomIzQzOwomIzQzOwlucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7CiAJZm9yIChpID0gMDsgaSAmbHQ7IG5yX2NsdXN0ZXJzOyBpJiM0MzsmIzQzOykgewogCQljaSA9IGNsdXN0ZXJfaW5mbyAmIzQzOyBpOwogCQkvKiBDbHVzdGVyIHdpdGggYmFkIG1hcmtzIGNvdW50IHdpbGwgaGF2ZSBhIHJlbWFpbmluZyB0YWJsZSAqLwpAQCAtMzA3NSwxMSAmIzQzOzMyODUsOSBAQCBzdGF0aWMgdm9pZCBmbHVzaF9wZXJjcHVfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSkKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcCA9IE5VTEw7Ci0Jc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87CiAJc3RydWN0IGZpbGUgKnN3YXBfZmlsZSwgKnZpY3RpbTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXVuc2lnbmVkIGludCBtYXhwYWdlczsKIAlpbnQgZXJyLCBmb3VuZCA9IDA7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCkBAIC0zMTYwLDcgJiM0MzszMzY4LDggQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKQogCiAJZGVzdHJveV9zd2FwX2V4dGVudHMocCwgcC0mZ3Q7c3dhcF9maWxlKTsKIAotCWlmICghKHAtJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSkKJiM0MzsJaWYgKCEocC0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1hTV0FQKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhKHAtJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSkKIAkJYXRvbWljX2RlYygmYW1wO25yX3JvdGF0ZV9zd2FwKTsKIAogCW11dGV4X2xvY2soJmFtcDtzd2Fwb25fbXV0ZXgpOwpAQCAtMzE3MCwxMCAmIzQzOzMzNzksNiBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiAKIAlzd2FwX2ZpbGUgPSBwLSZndDtzd2FwX2ZpbGU7CiAJcC0mZ3Q7c3dhcF9maWxlID0gTlVMTDsKLQltYXhwYWdlcyA9IHAtJmd0O21heDsKLQljbHVzdGVyX2luZm8gPSBwLSZndDtjbHVzdGVyX2luZm87Ci0JcC0mZ3Q7bWF4ID0gMDsKLQlwLSZndDtjbHVzdGVyX2luZm8gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZhbXA7cC0mZ3Q7bG9jayk7CiAJc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwogCWFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC0mZ3Q7dHlwZSk7CkBAIC0zMTgxLDcgJiM0MzszMzg2LDkgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKQogCW11dGV4X3VubG9jaygmYW1wO3N3YXBvbl9tdXRleCk7CiAJa2ZyZWUocC0mZ3Q7Z2xvYmFsX2NsdXN0ZXIpOwogCXAtJmd0O2dsb2JhbF9jbHVzdGVyID0gTlVMTDsKLQlmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpOwomIzQzOwlmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHApOwomIzQzOwlwLSZndDttYXggPSAwOwomIzQzOwlwLSZndDtjbHVzdGVyX2luZm8gPSBOVUxMOwogCiAJaW5vZGUgPSBtYXBwaW5nLSZndDtob3N0OwogCkBAIC0zMjcwLDYgJiM0MzszNDc3LDE5IEBAIHN0YXRpYyB2b2lkIHN3YXBfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpCiAJbXV0ZXhfdW5sb2NrKCZhbXA7c3dhcG9uX211dGV4KTsKIH0KIAomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpzd2FwX3R5cGVfc3RyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBmaWxlICpmaWxlID0gc2ktJmd0O3N3YXBfZmlsZTsKJiM0MzsKJiM0MzsJaWYgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApCiYjNDM7CQlyZXR1cm4gJiMzNDt4c3dhcFx0JiMzNDs7CiYjNDM7CiYjNDM7CWlmIChTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfbW9kZSkpCiYjNDM7CQlyZXR1cm4gJiMzNDtwYXJ0aXRpb24mIzM0OzsKJiM0MzsKJiM0MzsJcmV0dXJuICYjMzQ7ZmlsZVx0JiMzNDs7CiYjNDM7fQomIzQzOwogc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KQogewogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IHY7CkBAIC0zMjg5LDggJiM0MzszNTA5LDcgQEAgc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KQogCWxlbiA9IHNlcV9maWxlX3BhdGgoc3dhcCwgZmlsZSwgJiMzNDsgXHRcblxcJiMzNDspOwogCXNlcV9wcmludGYoc3dhcCwgJiMzNDslKnMlc1x0JWx1XHQlcyVsdVx0JXMlZFxuJiMzNDssCiAJCQlsZW4gJmx0OyA0MCA/IDQwIC0gbGVuIDogMSwgJiMzNDsgJiMzNDssCi0JCQlTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfbW9kZSkgPwotCQkJCSYjMzQ7cGFydGl0aW9uJiMzNDsgOiAmIzM0O2ZpbGVcdCYjMzQ7LAomIzQzOwkJCXN3YXBfdHlwZV9zdHIoc2kpLAogCQkJYnl0ZXMsIGJ5dGVzICZsdDsgMTAwMDAwMDAgPyAmIzM0O1x0JiMzNDsgOiAmIzM0OyYjMzQ7LAogCQkJaW51c2UsIGludXNlICZsdDsgMTAwMDAwMDAgPyAmIzM0O1x0JiMzNDsgOiAmIzM0OyYjMzQ7LAogCQkJc2ktJmd0O3ByaW8pOwpAQCAtMzQ2OCw2ICYjNDM7MzY4Nyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCXVuc2lnbmVkIGxvbmcgbWF4cGFnZXM7CiAJdW5zaWduZWQgbG9uZyBzd2FwZmlsZXBhZ2VzOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlOwomIzQzOwlsb2ZmX3Qgc2l6ZTsKIAogCWlmIChtZW1jbXAoJiMzNDtTV0FQU1BBQ0UyJiMzNDssIHN3YXBfaGVhZGVyLSZndDttYWdpYy5tYWdpYywgMTApKSB7CiAJCXByX2VycigmIzM0O1VuYWJsZSB0byBmaW5kIHN3YXAtc3BhY2Ugc2lnbmF0dXJlXG4mIzM0Oyk7CkBAIC0zNTEwLDcgJiM0MzszNzMwLDE2IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCiAJaWYgKCFtYXhwYWdlcykKIAkJcmV0dXJuIDA7Ci0Jc3dhcGZpbGVwYWdlcyA9IGlfc2l6ZV9yZWFkKGlub2RlKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwomIzQzOwlpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpIHsKJiM0MzsJCS8qIHhzd2FwOiBhIHN3YXAgZGV2aWNlIHdpdGggbm8gYmFja2luZyBzdG9yYWdlICovCiYjNDM7CQlzaS0mZ3Q7YmRldiA9IE5VTEw7CiYjNDM7CQlzaS0mZ3Q7ZmxhZ3MgfD0gU1dQX1hTV0FQIHwgU1dQX1NPTElEU1RBVEU7CiYjNDM7CQlyZXR1cm4gbWF4cGFnZXM7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3dhcGZpbGVwYWdlcyA9IHNpemUgJmd0OyZndDsgUEFHRV9TSElGVDsKIAlpZiAoc3dhcGZpbGVwYWdlcyAmYW1wOyZhbXA7IG1heHBhZ2VzICZndDsgc3dhcGZpbGVwYWdlcykgewogCQlwcl93YXJuKCYjMzQ7U3dhcCBhcmVhIHNob3J0ZXIgdGhhbiBzaWduYXR1cmUgaW5kaWNhdGVzXG4mIzM0Oyk7CiAJCXJldHVybiAwOwpAQCAtMzUyMyw2ICYjNDM7Mzc1MiwzNjUgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiAJcmV0dXJuIG1heHBhZ2VzOwogfQogCiYjNDM7I2lmZGVmIENPTkZJR19YU1dBUAomIzQzO3N0YXRpYyBpbnQgeHN3YXBfbWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLSZndDtjbHVzdGVyX2luZm8gJiM0MzsKJiM0MzsJCQkJICAgKHNpemVfdClzdGFydF9pZHggKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBlbmRfYWRkciA9IHN0YXJ0X2FkZHIgJiM0MzsgKHNpemVfdCluciAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pOwomIzQzOwkvKgomIzQzOwkgKiB2bV9hcmVhX21hcF9wYWdlcygpIHJlcXVpcmVzIHRoYXQgc3RhcnQgYW5kIGVuZCBiZSBwYWdlLWFsaWduZWQuCiYjNDM7CSAqIElmIHN0YXJ0X2FkZHIgZmFsbHMgd2l0aGluIGEgcGFnZSB0aGF0IHdhcyBhbHJlYWR5IG1hcHBlZCBieSBhCiYjNDM7CSAqIHByZXZpb3VzIGJhdGNoIChncm93IHBhdGgpLCByb3VuZCBpdCB1cCB0byBza2lwIHRoZSBhbHJlYWR5LW1hcHBlZAomIzQzOwkgKiBwYXJ0aWFsIHBhZ2UuICBBbHdheXMgcm91bmQgZW5kX2FkZHIgdXAgc28gdGhlIHZtYXAgcGFnZSB0YWJsZSB3YWxrCiYjNDM7CSAqIHRlcm1pbmF0ZXMgY29ycmVjdGx5ICh0aGUgd2FsayBsb29wIGV4aXRzIHdoZW4gYWRkciA9PSBlbmQsIGFuZCBhZGRyCiYjNDM7CSAqIGFkdmFuY2VzIGJ5IFBBR0VfU0laRSBlYWNoIGl0ZXJhdGlvbikuCiYjNDM7CSAqLwomIzQzOwl1bnNpZ25lZCBsb25nIHZtX3N0YXJ0ID0gUEFHRV9BTElHTihzdGFydF9hZGRyKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB2bV9lbmQgPSBQQUdFX0FMSUdOKGVuZF9hZGRyKTsKJiM0MzsJdW5zaWduZWQgaW50IG5vcmVjbGFpbV9mbGFnczsKJiM0MzsJdW5zaWduZWQgbG9uZyBucGFnZXM7CiYjNDM7CXN0cnVjdCBwYWdlICoqcGFnZXM7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO3NpLSZndDt4c3dhcF9sb2NrKTsKJiM0MzsKJiM0MzsJaWYgKHZtX3N0YXJ0ICZndDs9IHZtX2VuZCkgewomIzQzOwkJLyogQWxsIHJlcXVlc3RlZCBjbHVzdGVycyBmYWxsIHdpdGhpbiBhbHJlYWR5LW1hcHBlZCBwYWdlcy4gKi8KJiM0MzsJCWZvciAoaSA9IHN0YXJ0X2lkeDsgaSAmbHQ7IHN0YXJ0X2lkeCAmIzQzOyBucjsgaSYjNDM7JiM0MzspCiYjNDM7CQkJc3Bpbl9sb2NrX2luaXQoJmFtcDtzaS0mZ3Q7Y2x1c3Rlcl9pbmZvW2ldLmxvY2spOwomIzQzOwkJV1JJVEVfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggJiM0MzsgbnIpOwomIzQzOwkJbXV0ZXhfdW5sb2NrKCZhbXA7c2ktJmd0O3hzd2FwX2xvY2spOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbnBhZ2VzID0gKHZtX2VuZCAtIHZtX3N0YXJ0KSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBQcmV2ZW50IHJlY3Vyc2l2ZSByZWNsYWltOiB2bV9hcmVhX21hcF9wYWdlcygpIGludGVybmFsbHkKJiM0MzsJICogYWxsb2NhdGVzIHBhZ2UgdGFibGVzIHdpdGggR0ZQX1BHVEFCTEVfS0VSTkVMLCB3aGljaCBsYWNrcwomIzQzOwkgKiBfX0dGUF9OT01FTUFMTE9DLiAgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSBlbnN1cmVzIHRob3NlCiYjNDM7CSAqIGFsbG9jYXRpb25zIGNhbm5vdCByZWN1cnNlIGludG8gc3dhcCBieSBkaXNhYmxpbmcgX19HRlBfRlMvSU8uCiYjNDM7CSAqLwomIzQzOwlub3JlY2xhaW1fZmxhZ3MgPSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpOwomIzQzOwomIzQzOwlwYWdlcyA9IGttYWxsb2NfYXJyYXkobnBhZ2VzLCBzaXplb2YoKnBhZ2VzKSwKJiM0MzsJCQkgICAgICBfX0dGUF9ISUdIIHwgX19HRlBfTk9NRU1BTExPQyB8IEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIXBhZ2VzKSB7CiYjNDM7CQltZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZ3MpOwomIzQzOwkJbXV0ZXhfdW5sb2NrKCZhbXA7c2ktJmd0O3hzd2FwX2xvY2spOwomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBfX0dGUF9aRVJPIGlzIGNyaXRpY2FsOiBjbHVzdGVyX2luZm8gc3RydWN0cyBjb250YWluIHBvaW50ZXIKJiM0MzsJCSAqIGZpZWxkcyAoZXh0ZW5kX3RhYmxlLCB6ZXJvX2JpdG1hcCwgbWVtY2dfdGFibGUsIHRhYmxlKSB0aGF0CiYjNDM7CQkgKiBtdXN0IHN0YXJ0IGFzIE5VTEwuICBXaXRob3V0IHplcm9pbmcsIHN0YWxlIGRhdGEgZnJvbSBhCiYjNDM7CQkgKiBwcmV2aW91cyB1c2VyIG9mIHRoZSBwYWdlIHdvdWxkIGxvb2sgbGlrZSB2YWxpZCBwb2ludGVycy4KJiM0MzsJCSAqLwomIzQzOwkJcGFnZXNbaV0gPSBhbGxvY19wYWdlKF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHwKJiM0MzsJCQkJICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOwomIzQzOwkJaWYgKCFwYWdlc1tpXSkKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgaWYgdGhlIHRhcmdldCBwYWdlcyBhcmUgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50CiYjNDM7CSAqIGdyb3dlci4gIFdlIG11c3QgZG8gdGhpcyBhZnRlciBwYWdlIGFsbG9jYXRpb24gYmVjYXVzZQomIzQzOwkgKiBhbGxvY19wYWdlKEdGUF9LRVJORUwpIGNhbiBzbGVlcCwgb3BlbmluZyBhIHJhY2Ugd2luZG93LgomIzQzOwkgKiBJZiBzb21lb25lIGFscmVhZHkgbWFwcGVkIHRoZXNlIHBhZ2VzLCBmcmVlIG91cnMgYW5kIGNvbnRpbnVlLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoJmFtcDtpbml0X21tLCB2bV9zdGFydCwKJiM0MzsJCQkJCSB2bV9lbmQgLSB2bV9zdGFydCwKJiM0MzsJCQkJCSB4c3dhcF9jaGVja19tYXBwZWQsIE5VTEwpKSB7CiYjNDM7CQlpID0gbnBhZ2VzOwomIzQzOwkJZ290byBmYWlsX25vdW5tYXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaW50IGVyciA9IHZtX2FyZWFfbWFwX3BhZ2VzKHNpLSZndDtjbHVzdGVyX3ZtLCB2bV9zdGFydCwgdm1fZW5kLCBwYWdlcyk7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiAtRUJVU1kgbWVhbnMgdGhlIFBURXMgYXJlIGFscmVhZHkgcHJlc2VudDoKJiM0MzsJCSAqIGFub3RoZXIgdGhyZWFkIHJhY2VkIHdpdGggdXMgYW5kIG1hcHBlZCB0aGUKJiM0MzsJCSAqIHNhbWUgcGFnZXMgYmV0d2VlbiBvdXIgY2hlY2sgYWJvdmUgYW5kIHRoaXMKJiM0MzsJCSAqIGNhbGwuICBUcmVhdCBhcyBzdWNjZXNzIOKAlCBmcmVlIG91ciB1bnVzZWQKJiM0MzsJCSAqIHBhZ2VzIGFuZCBjb250aW51ZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKGVyciA9PSAtRUJVU1kpIHsKJiM0MzsJCQlpID0gbnBhZ2VzOwomIzQzOwkJCWdvdG8gZmFpbF9ub3VubWFwOwomIzQzOwkJfQomIzQzOwkJaSA9IG5wYWdlczsgLyogZnJlZSBhbGwgcGFnZXMgb24gZmFpbHVyZSAqLwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtmcmVlKHBhZ2VzKTsKJiM0MzsJbWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTsKJiM0MzsKJiM0MzsJLyogSW5pdGlhbGl6ZSBzcGlubG9ja3MgZm9yIG5ld2x5IG1hcHBlZCBjbHVzdGVycyAqLwomIzQzOwlmb3IgKGkgPSBzdGFydF9pZHg7IGkgJmx0OyBzdGFydF9pZHggJiM0MzsgbnI7IGkmIzQzOyYjNDM7KQomIzQzOwkJc3Bpbl9sb2NrX2luaXQoJmFtcDtzaS0mZ3Q7Y2x1c3Rlcl9pbmZvW2ldLmxvY2spOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLgomIzQzOwkgKi8KJiM0MzsJV1JJVEVfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggJiM0MzsgbnIpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2ZhaWxfbm91bm1hcDoKJiM0MzsJLyoKJiM0MzsJICogUGFnZXMgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50IGdyb3dlci4gIEZyZWUgb3VyIHVudXNlZAomIzQzOwkgKiBwYWdlcywgdGhlbiBmYWxsIHRocm91Z2ggdG8gaW5pdGlhbGl6ZSBzcGlubG9ja3MuICBUaGUgdm1hbGxvYwomIzQzOwkgKiBQVEVzIG5vdyBwb2ludCB0byB0aGUgY29uY3VycmVudCBncm93ZXImIzM5O3MgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwl3aGlsZSAoaSAmZ3Q7IDApIHsKJiM0MzsJCWktLTsKJiM0MzsJCWlmIChwYWdlc1tpXSkKJiM0MzsJCQlfX2ZyZWVfcGFnZShwYWdlc1tpXSk7CiYjNDM7CX0KJiM0MzsJa2ZyZWUocGFnZXMpOwomIzQzOwltZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZ3MpOwomIzQzOwomIzQzOwkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBmb3IgbmV3bHkgbWFwcGVkIGNsdXN0ZXJzICovCiYjNDM7CWZvciAoaSA9IHN0YXJ0X2lkeDsgaSAmbHQ7IHN0YXJ0X2lkeCAmIzQzOyBucjsgaSYjNDM7JiM0MzspCiYjNDM7CQlzcGluX2xvY2tfaW5pdCgmYW1wO3NpLSZndDtjbHVzdGVyX2luZm9baV0ubG9jayk7CiYjNDM7CiYjNDM7CVdSSVRFX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCwgc3RhcnRfaWR4ICYjNDM7IG5yKTsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7c2ktJmd0O3hzd2FwX2xvY2spOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztmYWlsOgomIzQzOwl3aGlsZSAoaSAmZ3Q7IDApIHsKJiM0MzsJCWktLTsKJiM0MzsJCWlmIChwYWdlc1tpXSkKJiM0MzsJCQlfX2ZyZWVfcGFnZShwYWdlc1tpXSk7CiYjNDM7CX0KJiM0MzsJbWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTsKJiM0MzsJa2ZyZWUocGFnZXMpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CXJldHVybiAtRU5PTUVNOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgeHN3YXBfcGFnZV9kYXRhIHsKJiM0MzsJc3RydWN0IHBhZ2UgKipwYWdlczsKJiM0MzsJaW50IG5yOwomIzQzOwlpbnQgbWF4OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCB4c3dhcF9jb2xsZWN0X3BhZ2UocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJc3RydWN0IHhzd2FwX3BhZ2VfZGF0YSAqeHBkID0gZGF0YTsKJiM0MzsKJiM0MzsJaWYgKCFwdGVfcHJlc2VudCgqcHRlKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlpZiAoeHBkLSZndDtuciAmbHQ7IHhwZC0mZ3Q7bWF4KQomIzQzOwkJeHBkLSZndDtwYWdlc1t4cGQtJmd0O25yJiM0MzsmIzQzO10gPSBwdGVfcGFnZSgqcHRlKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHhzd2FwX3VubWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkJIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpc2ktJmd0O2NsdXN0ZXJfaW5mbyAmIzQzOwomIzQzOwkJCQkgICAoc2l6ZV90KXN0YXJ0X2lkeCAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pOwomIzQzOwl1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciAmIzQzOyAoc2l6ZV90KW5yICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7CiYjNDM7CS8qCiYjNDM7CSAqIFJvdW5kIHRvIHBhZ2UgYm91bmRhcmllczogc3RhcnQgdXAgKHNraXAgcGFydGlhbCBwYWdlIHRoYXQgbWF5CiYjNDM7CSAqIGNvbnRhaW4gY2x1c3RlcnMgc3RpbGwgaW4gdXNlIGJlZm9yZSBzdGFydF9pZHgpLCBlbmQgdXAgc28gdGhlCiYjNDM7CSAqIGVudGlyZSByYW5nZSBpcyBjb3ZlcmVkLiAgdm1fYXJlYV91bm1hcF9wYWdlcygpIGFuZAomIzQzOwkgKiBhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlKCkgb3BlcmF0ZSBvbiB3aG9sZSBwYWdlcy4KJiM0MzsJICovCiYjNDM7CXVuc2lnbmVkIGxvbmcgdm1fc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0X2FkZHIpOwomIzQzOwl1bnNpZ25lZCBsb25nIHZtX2VuZCA9IFBBR0VfQUxJR04oZW5kX2FkZHIpOwomIzQzOwl1bnNpZ25lZCBsb25nIHNpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnBhZ2VzOwomIzQzOwlzdHJ1Y3QgeHN3YXBfcGFnZV9kYXRhIHhwZDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CiYjNDM7CWlmICh2bV9zdGFydCAmZ3Q7PSB2bV9lbmQpIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO3NpLSZndDt4c3dhcF9sb2NrKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXNpemUgPSB2bV9lbmQgLSB2bV9zdGFydDsKJiM0MzsJbnBhZ2VzID0gc2l6ZSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBXYWxrIHRoZSBwYWdlIHRhYmxlIHRvIGNvbGxlY3QgcGh5c2ljYWwgcGFnZXMgYmVmb3JlIHVubWFwcGluZy4KJiM0MzsJICogdm1fYXJlYV91bm1hcF9wYWdlcygpIG9ubHkgY2xlYXJzIFBURXMgYW5kIGZyZWVzIGludGVybWVkaWF0ZQomIzQzOwkgKiBwYWdlIHRhYmxlIHBhZ2VzIOKAlCBpdCBkb2VzIG5vdCBmcmVlIGJhY2tpbmcgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwl4cGQucGFnZXMgPSBrbWFsbG9jX2FycmF5KG5wYWdlcywgc2l6ZW9mKCp4cGQucGFnZXMpLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKHhwZC5wYWdlcykgewomIzQzOwkJeHBkLm5yID0gMDsKJiM0MzsJCXhwZC5tYXggPSBucGFnZXM7CiYjNDM7CQlhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlKCZhbXA7aW5pdF9tbSwgdm1fc3RhcnQsIHNpemUsCiYjNDM7CQkJCQkgICAgIHhzd2FwX2NvbGxlY3RfcGFnZSwgJmFtcDt4cGQpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXZtX2FyZWFfdW5tYXBfcGFnZXMoc2ktJmd0O2NsdXN0ZXJfdm0sIHZtX3N0YXJ0LCB2bV9lbmQpOwomIzQzOwomIzQzOwkvKiBGcmVlIHRoZSBjb2xsZWN0ZWQgYmFja2luZyBwYWdlcyAqLwomIzQzOwlpZiAoeHBkLnBhZ2VzKSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgeHBkLm5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlfX2ZyZWVfcGFnZSh4cGQucGFnZXNbaV0pOwomIzQzOwkJa2ZyZWUoeHBkLnBhZ2VzKTsKJiM0MzsJfQomIzQzOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwkvKgomIzQzOwkgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLgomIzQzOwkgKi8KJiM0MzsJV1JJVEVfT05DRShzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHgpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIENhbGxiYWNrIGZvciBhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlKCk6IHJldHVybiAxIHRvIHN0b3AgYXQgdGhlCiYjNDM7ICogZmlyc3QgcHJlc2VudCBQVEUsIHNpZ25hbGxpbmcgdGhhdCB0aGUgcmFuZ2UgaXMgYWxyZWFkeSBtYXBwZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCB4c3dhcF9jaGVja19tYXBwZWQocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJcmV0dXJuIDE7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTWFpbnRhaW4gc2ktJmd0O25yX2ZyZWVfdGFpbCwgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgY2x1c3RlcnMgYXQKJiM0MzsgKiB0aGUgdGFpbCBvZiB0aGUgbWFwcGVkIHJhbmdlLiAgQ2FsbGVkIHdoZW4gYSBjbHVzdGVyIGF0IEBmcmVlZF9pZHggaXMKJiM0MzsgKiBmcmVlZC4gIFByb3ZpZGVzIE8oMSkgc2hyaW5rIGRldGVjdGlvbjogaWYgbnJfZnJlZV90YWlsIGlzIG5vbi16ZXJvLAomIzQzOyAqIHRoZSB0YWlsIGNhbiBiZSB1bm1hcHBlZCB3aXRob3V0IHNjYW5uaW5nIGNsdXN0ZXJfaW5mb1tdLgomIzQzOyAqCiYjNDM7ICogT25seSBpbmNyZW1lbnRzIHdoZW4gQGZyZWVkX2lkeCBpcyB0aGUgY2x1c3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlCiYjNDM7ICogZXhpc3RpbmcgdGFpbCByZWdpb24uICBUaGVuIHNjYW5zIGJhY2t3YXJkcyBmb3IgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzCiYjNDM7ICogbm93IGNvbm5lY3RlZCB0byB0aGUgdGFpbCwgYm91bmRlZCBieSBYU1dBUF9HUk9XX0NMVVNURVJTIGF0IGEgdGltZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB4c3dhcF91cGRhdGVfZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkJICAgdW5zaWduZWQgbG9uZyBmcmVlZF9pZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGlkLCBpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwomIzQzOwomIzQzOwlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1hTV0FQKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJbnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLSZndDtucl9jbHVzdGVyc19tYXBwZWQpOwomIzQzOwlucl90YWlsID0gUkVBRF9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwpOwomIzQzOwomIzQzOwkvKiBQcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBzaHJpbmsgdGhhdCByYWNlcyBwYXN0IHVzICovCiYjNDM7CWlmIChucl90YWlsICZndDs9IG5yX21hcHBlZCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJdGlkID0gbnJfbWFwcGVkIC0gbnJfdGFpbCAtIDE7CiYjNDM7CiYjNDM7CS8qIE9ubHkgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0YWlsIHJlZ2lvbiBjb3VudHMgKi8KJiM0MzsJaWYgKGZyZWVkX2lkeCAhPSB0aWQpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CW5yX3RhaWwmIzQzOyYjNDM7OwomIzQzOwlXUklURV9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwsIG5yX3RhaWwpOwomIzQzOwomIzQzOwkvKiBFeHRlbmQ6IGluY2x1ZGUgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwgKi8KJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7IFhTV0FQX0dST1dfQ0xVU1RFUlM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCk7CiYjNDM7CQlucl90YWlsID0gUkVBRF9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwpOwomIzQzOwkJaWYgKG5yX3RhaWwgJmd0Oz0gbnJfbWFwcGVkIC0gMSkKJiM0MzsJCQlicmVhazsgLyogcmVhY2hlZCBjbHVzdGVyIDAgKi8KJiM0MzsJCXRpZCA9IG5yX21hcHBlZCAtIG5yX3RhaWwgLSAxOwomIzQzOwkJY2kgPSAmYW1wO3NpLSZndDtjbHVzdGVyX2luZm9bdGlkXTsKJiM0MzsKJiM0MzsJCWlmIChSRUFEX09OQ0UoY2ktJmd0O2NvdW50KSB8fAomIzQzOwkJICAgIFJFQURfT05DRShjaS0mZ3Q7ZmxhZ3MpICE9IENMVVNURVJfRkxBR19GUkVFKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJbnJfdGFpbCYjNDM7JiM0Mzs7CiYjNDM7CQlXUklURV9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwsIG5yX3RhaWwpOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVHJpbSBzaS0mZ3Q7bnJfZnJlZV90YWlsIHdoZW4gYSBjbHVzdGVyIGluIHRoZSB0YWlsIHJlZ2lvbiBpcyBhbGxvY2F0ZWQuCiYjNDM7ICogQGlkeDogaW5kZXggb2YgdGhlIGNsdXN0ZXIgYmVpbmcgYWxsb2NhdGVkLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGFpbF9zdGFydDsKJiM0MzsKJiM0MzsJaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9YU1dBUCkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIG5yX2NsdXN0ZXJzX21hcHBlZCBhbmQgbnJfZnJlZV90YWlsIGFyZSByZWFkIGxvY2tsZXNzbHk7CiYjNDM7CSAqIGNvbmN1cnJlbnQgdXBkYXRlcyBtYXkgY2F1c2UgbnJfZnJlZV90YWlsIHRvIGJlIHRyaW1tZWQKJiM0MzsJICogc2xpZ2h0bHkgbGVzcyB0aGFuIGlkZWFsbHksIHdoaWNoIGlzIGhhcm1sZXNzLgomIzQzOwkgKi8KJiM0MzsJbnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLSZndDtucl9jbHVzdGVyc19tYXBwZWQpOwomIzQzOwlucl90YWlsID0gUkVBRF9PTkNFKHNpLSZndDtucl9mcmVlX3RhaWwpOwomIzQzOwl0YWlsX3N0YXJ0ID0gbnJfbWFwcGVkIC0gbnJfdGFpbDsKJiM0MzsJaWYgKGlkeCAmZ3Q7PSB0YWlsX3N0YXJ0KQomIzQzOwkJV1JJVEVfT05DRShzaS0mZ3Q7bnJfZnJlZV90YWlsLCBucl9tYXBwZWQgLSBpZHggLSAxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgeHN3YXBfc2hyaW5rX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQomIzQzO3sKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gY29udGFpbmVyX29mKHdvcmssCiYjNDM7CQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QsIHhzd2FwX3Nocmlua193b3JrKTsKJiM0MzsJeHN3YXBfdHJ5X3NocmluayhzaSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVHJ5IHRvIHNocmluayB0aGUgY2x1c3Rlcl9pbmZvIHRhaWwuICBVc2VzIHNpLSZndDtucl9mcmVlX3RhaWwgd2hpY2gKJiM0MzsgKiBpcyBtYWludGFpbmVkIGluY3JlbWVudGFsbHkgZHVyaW5nIGFsbG9jL2ZyZWUg4oCUIG5vIHNjYW5uaW5nIG5lZWRlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB4c3dhcF90cnlfc2hyaW5rKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfbWFwcGVkLCBucl9jZWlsaW5nLCBucl90YWlsLCBucl91bm1hcDsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIGk7CiYjNDM7CXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7CiYjNDM7CiYjNDM7CWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZCk7CiYjNDM7CW5yX2NlaWxpbmcgPSBSRUFEX09OQ0Uoc2ktJmd0O25yX2NsdXN0ZXJzKTsKJiM0MzsJbnJfdGFpbCA9IFJFQURfT05DRShzaS0mZ3Q7bnJfZnJlZV90YWlsKTsKJiM0MzsKJiM0MzsJaWYgKG5yX21hcHBlZCAmbHQ7PSBucl9jZWlsaW5nKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAobnJfdGFpbCAmbHQ7IFhTV0FQX0dST1dfQ0xVU1RFUlMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CW5yX3VubWFwID0gbWluKHJvdW5kX2Rvd24obnJfdGFpbCwgWFNXQVBfR1JPV19DTFVTVEVSUyksCiYjNDM7CQkgICAgICAgbnJfbWFwcGVkIC0gbnJfY2VpbGluZyk7CiYjNDM7CWlmIChucl91bm1hcCAmbHQ7IFhTV0FQX0dST1dfQ0xVU1RFUlMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXN0YXJ0X2lkeCA9IG5yX21hcHBlZCAtIG5yX3VubWFwOwomIzQzOwomIzQzOwkvKiBWZXJpZnkgdGhlIHRhaWwgY2x1c3RlcnMgYXJlIHN0aWxsIGZyZWUgYmVmb3JlIHVubWFwcGluZyAqLwomIzQzOwlzcGluX2xvY2soJmFtcDtzaS0mZ3Q7bG9jayk7CiYjNDM7CWZvciAoaSA9IHN0YXJ0X2lkeDsgaSAmbHQ7IG5yX21hcHBlZDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNpID0gJmFtcDtzaS0mZ3Q7Y2x1c3Rlcl9pbmZvW2ldOwomIzQzOwkJaWYgKGNpLSZndDtmbGFncyAhPSBDTFVTVEVSX0ZMQUdfRlJFRSkgewomIzQzOwkJCW5yX3VubWFwID0gaSAtIHN0YXJ0X2lkeDsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWxpc3RfZGVsKCZhbXA7Y2ktJmd0O2xpc3QpOwomIzQzOwkJY2ktJmd0O2ZsYWdzID0gQ0xVU1RFUl9GTEFHX05PTkU7CiYjNDM7CX0KJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzaS0mZ3Q7bG9jayk7CiYjNDM7CiYjNDM7CWlmIChucl91bm1hcCAmbHQ7IFhTV0FQX0dST1dfQ0xVU1RFUlMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXhzd2FwX3VubWFwX2NsdXN0ZXJzKHNpLCBzdGFydF9pZHgsIG5yX3VubWFwKTsKJiM0MzsJV1JJVEVfT05DRShzaS0mZ3Q7bnJfZnJlZV90YWlsLCBucl90YWlsIC0gbnJfdW5tYXApOwomIzQzO30KJiM0MzsjZW5kaWYgLyogQ09ORklHX1hTV0FQICovCiYjNDM7CiBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiAJCQkJICAgIHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlciwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcykKQEAgLTM1MzIsNiAmIzQzOzQxMjAsNzAgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCWludCBlcnIgPSAtRU5PTUVNOwogCXVuc2lnbmVkIGxvbmcgaTsKIAomIzQzOyNpZmRlZiBDT05GSUdfWFNXQVAKJiM0MzsJaWYgKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfWFNXQVApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IFBBR0VfQUxJR04obnJfY2x1c3RlcnMgKiBzaXplb2YoKmNsdXN0ZXJfaW5mbykpOwomIzQzOwkJc3RydWN0IHZtX3N0cnVjdCAqdm07CiYjNDM7CiYjNDM7CQl2bSA9IGdldF92bV9hcmVhKHNpemUsIFZNX1NQQVJTRSk7CiYjNDM7CQlpZiAoIXZtKQomIzQzOwkJCWdvdG8gZXJyOwomIzQzOwomIzQzOwkJY2x1c3Rlcl9pbmZvID0gdm0tJmd0O2FkZHI7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl92bSA9IHZtOwomIzQzOwkJc2ktJmd0O25yX2NsdXN0ZXJzX21heCA9IG5yX2NsdXN0ZXJzOwomIzQzOwkJc2ktJmd0O25yX2NsdXN0ZXJzID0gbnJfY2x1c3RlcnM7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl9pbmZvID0gY2x1c3Rlcl9pbmZvOwomIzQzOwomIzQzOwkJLyogTWFwIHRoZSBpbml0aWFsIGNodW5rIChhdCBsZWFzdCBjbHVzdGVyIDApICovCiYjNDM7CQlpZiAoeHN3YXBfbWFwX2NsdXN0ZXJzKHNpLCAwLCBtaW5fdCh1bnNpZ25lZCBsb25nLAomIzQzOwkJCQkJWFNXQVBfR1JPV19DTFVTVEVSUywgbnJfY2x1c3RlcnMpKSkKJiM0MzsJCQlnb3RvIGVycl9mcmVlX3ZtOwomIzQzOwomIzQzOwkJLyogeHN3YXA6IG9ubHkgY2x1c3RlciAwIHNsb3QgMCBpcyBiYWQgKi8KJiM0MzsJCWVyciA9IHN3YXBfY2x1c3Rlcl9zZXR1cF9iYWRfc2xvdChzaSwgY2x1c3Rlcl9pbmZvLCAwLCBmYWxzZSk7CiYjNDM7CQlpZiAoZXJyKQomIzQzOwkJCWdvdG8gZXJyX3VubWFwOwomIzQzOwomIzQzOwkJSU5JVF9MSVNUX0hFQUQoJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycyk7CiYjNDM7CQlJTklUX0xJU1RfSEVBRCgmYW1wO3NpLSZndDtmdWxsX2NsdXN0ZXJzKTsKJiM0MzsJCUlOSVRfTElTVF9IRUFEKCZhbXA7c2ktJmd0O2Rpc2NhcmRfY2x1c3RlcnMpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IFNXQVBfTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCUlOSVRfTElTVF9IRUFEKCZhbXA7c2ktJmd0O25vbmZ1bGxfY2x1c3RlcnNbaV0pOwomIzQzOwkJCUlOSVRfTElTVF9IRUFEKCZhbXA7c2ktJmd0O2ZyYWdfY2x1c3RlcnNbaV0pOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyogTWFyayBtYXBwZWQgY2x1c3RlcnM6IGNsdXN0ZXIgMCBoYXMgMSBiYWQgc2xvdCwgcmVzdCBmcmVlICovCiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgc2ktJmd0O25yX2NsdXN0ZXJzX21hcHBlZDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gJmFtcDtjbHVzdGVyX2luZm9baV07CiYjNDM7CiYjNDM7CQkJaWYgKGkgPT0gMCkgewomIzQzOwkJCQljaS0mZ3Q7ZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORlVMTDsKJiM0MzsJCQkJbGlzdF9hZGRfdGFpbCgmYW1wO2NpLSZndDtsaXN0LCAmYW1wO3NpLSZndDtub25mdWxsX2NsdXN0ZXJzWzBdKTsKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQljaS0mZ3Q7ZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfRlJFRTsKJiM0MzsJCQkJbGlzdF9hZGRfdGFpbCgmYW1wO2NpLSZndDtsaXN0LCAmYW1wO3NpLSZndDtmcmVlX2NsdXN0ZXJzKTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBBbGwgbWFwcGVkIGNsdXN0ZXJzIGV4Y2VwdCBjbHVzdGVyIDAgYXJlIGZyZWUgYXQgdGhlIHRhaWwgKi8KJiM0MzsJCXNpLSZndDtucl9mcmVlX3RhaWwgPSBzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkIC0gMTsKJiM0MzsKJiM0MzsJCW11dGV4X2luaXQoJmFtcDtzaS0mZ3Q7eHN3YXBfbG9jayk7CiYjNDM7CQlJTklUX1dPUksoJmFtcDtzaS0mZ3Q7eHN3YXBfc2hyaW5rX3dvcmssIHhzd2FwX3Nocmlua193b3JrX2ZuKTsKJiM0MzsJCXhzd2FwX2RlYnVnZnNfYWRkKHNpKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzO2Vycl91bm1hcDoKJiM0MzsJCXhzd2FwX3VubWFwX2NsdXN0ZXJzKHNpLCAwLCBzaS0mZ3Q7bnJfY2x1c3RlcnNfbWFwcGVkKTsKJiM0MztlcnJfZnJlZV92bToKJiM0MzsJCWZyZWVfdm1fYXJlYShzaS0mZ3Q7Y2x1c3Rlcl92bSk7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl92bSA9IE5VTEw7CiYjNDM7CQlzaS0mZ3Q7Y2x1c3Rlcl9pbmZvID0gTlVMTDsKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CX0KJiM0MzsjZW5kaWYgLyogQ09ORklHX1hTV0FQICovCiYjNDM7CiAJY2x1c3Rlcl9pbmZvID0ga3Z6YWxsb2Nfb2JqcygqY2x1c3Rlcl9pbmZvLCBucl9jbHVzdGVycyk7CiAJaWYgKCFjbHVzdGVyX2luZm8pCiAJCWdvdG8gZXJyOwpAQCAtMzU5OSw3ICYjNDM7NDI1MSw3IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAlzaS0mZ3Q7Y2x1c3Rlcl9pbmZvID0gY2x1c3Rlcl9pbmZvOwogCXJldHVybiAwOwogZXJyOgotCWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oY2x1c3Rlcl9pbmZvLCBtYXhwYWdlcyk7CiYjNDM7CWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM4MTgsNyAmIzQzOzQ0NzAsNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKQogCXNpLSZndDtnbG9iYWxfY2x1c3RlciA9IE5VTEw7CiAJaW5vZGUgPSBOVUxMOwogCWRlc3Ryb3lfc3dhcF9leHRlbnRzKHNpLCBzd2FwX2ZpbGUpOwotCWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2ktJmd0O2NsdXN0ZXJfaW5mbywgc2ktJmd0O21heCk7CiYjNDM7CWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpOwogCXNpLSZndDtjbHVzdGVyX2luZm8gPSBOVUxMOwogCS8qCiAJICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28KQEAgLTM5MzAsNyAmIzQzOzQ1ODIsNiBAQCB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKQogc3RhdGljIGludCBfX2luaXQgc3dhcGZpbGVfaW5pdCh2b2lkKQogewogCXN3YXBmaWxlX21heGltdW1fc2l6ZSA9IGFyY2hfbWF4X3N3YXBmaWxlX3NpemUoKTsKLQogCS8qCiAJICogT25jZSBhIGNsdXN0ZXIgaXMgZnJlZWQsIGl0JiMzOTtzIHN3YXAgdGFibGUgY29udGVudCBpcyByZWFkCiAJICogb25seSwgYW5kIGFsbCBzd2FwIGNhY2hlIHJlYWRlcnMgKHN3YXBfY2FjaGVfKikgdmVyaWZpZXMKQEAgLTM5NDAsMTIgJiM0Mzs0NTkxLDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHN3YXBmaWxlX2luaXQodm9pZCkKIAkJc3dhcF90YWJsZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgmIzM0O3N3YXBfdGFibGUmIzM0OywKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzd2FwX3RhYmxlKSwKIAkJCQkgICAgMCwgU0xBQl9QQU5JQyB8IFNMQUJfVFlQRVNBRkVfQllfUkNVLCBOVUxMKTsKLQogI2lmZGVmIENPTkZJR19NSUdSQVRJT04KIAlpZiAoc3dhcGZpbGVfbWF4aW11bV9zaXplICZndDs9ICgxVUwgJmx0OyZsdDsgU1dQX01JR19UT1RBTF9CSVRTKSkKIAkJc3dhcF9taWdyYXRpb25fYWRfc3VwcG9ydGVkID0gdHJ1ZTsKICNlbmRpZgkvKiBDT05GSUdfTUlHUkFUSU9OICovCiAKJiM0MzsjaWZkZWYgQ09ORklHX1hTV0FQCiYjNDM7CXhzd2FwX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigmIzM0O3hzd2FwJiMzNDssIE5VTEwpOwomIzQzOyNlbmRpZgomIzQzOwogCXJldHVybiAwOwogfQogc3Vic3lzX2luaXRjYWxsKHN3YXBmaWxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvbW0venN3YXAuYyBiL21tL3pzd2FwLmMKaW5kZXggZjdjOWM4OWY2NDQ5Yy4uNjE3ODQ2NWQwNTgzNyAxMDA2NDQKLS0tIGEvbW0venN3YXAuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS96c3dhcC5jCkBAIC05OTgsNyAmIzQzOzk5OCwxMiBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LAogCS8qIHRyeSB0byBhbGxvY2F0ZSBzd2FwIGNhY2hlIGZvbGlvICovCiAJc2kgPSBnZXRfc3dhcF9kZXZpY2Uoc3dwZW50cnkpOwogCWlmICghc2kpCi0JCXJldHVybiAtRUVYSVNUOwomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1hTV0FQKSB7CiYjNDM7CQlwdXRfc3dhcF9kZXZpY2Uoc2kpOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KIAogCW1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7CiAJZm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cGVudHJ5LCBHRlBfS0VSTkVMLCBCSVQoMCksIE5VTEwsIG1wb2wsCkBAIC0xNTM1LDcgJiM0MzsxNTQwLDcgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCXpzd2FwX3Bvb2xfcHV0KHBvb2wpOwogcHV0X29iamNnOgogCW9ial9jZ3JvdXBfcHV0KG9iamNnKTsKLQlpZiAoIXJldCAmYW1wOyZhbXA7IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsKQomIzQzOwlpZiAoIXJldCAmYW1wOyZhbXA7IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsICZhbXA7JmFtcDsgYXRvbWljX3JlYWQoJmFtcDtucl9yZWFsX3N3YXBmaWxlcykpCiAJCXF1ZXVlX3dvcmsoc2hyaW5rX3dxLCAmYW1wO3pzd2FwX3Nocmlua193b3JrKTsKIGNoZWNrX29sZDoKIAkvKgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDA0OAoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDEwODgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqWHN3YXAgUGF0Y2ggRXZhbHVhdGlvbjogRnV6emluZyBGb2N1cyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSBoYXZlIGEgcGF0Y2ggc2VyaWVzIGludHJvZHVjaW5nICYjMzQ7eHN3YXAsJiMzNDsgYW4gJiMzNDtFeHRlbmRhYmxlIHN3YXAgZGV2aWNlLiYjMzQ7IE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdoZXRoZXIgdGhpcyBpbnRyb2R1Y2VzIG5ldyBrZXJuZWwgZnVuY3Rpb25hbGl0eSBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aGF0IG5lZWRzIGZ1enppbmcuCgpUaGUgcGF0Y2gmIzM5O3Mga2V5IGlzIHRoZSBgQ09ORklHX1hTV0FQYCBLY29uZmlnIG9wdGlvbi4gRGVwZW5kZW5jeSBvbiBgU1dBUGAgYW5kIGA2NEJJVGAgYXJlIHJlYXNvbmFibGUuIFRoZSByZWFsbHkgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGUgbW9kaWZpY2F0aW9uIHRvIGBtbS9zd2FwZmlsZS5jYCwgZXNwZWNpYWxseSB0aGUgaGFuZGxpbmcgb2YgdGhlIGBTV1BfWFNXQVBgIGZsYWcuIFNwZWNpZmljYWxseSwgdGhlIGBkZWJ1Z2ZzYCBpbnRlcmZhY2UgZXhwb3NpbmcgYHR5cGUmbHQ7TiZndDtfY2x1c3Rlcl9saW1pdGAgbG9va3MgbGlrZSBhIHByaW1lIHRhcmdldC4gVGhlIGNvcmUgb2YgdGhpcyBmdW5jdGlvbmFsaXR5IHNlZW1zIHRvIGJlIHRyaWdnZXJlZCBieSBjcmVhdGluZyBhIHN3YXAgZmlsZSB0aGF0JiMzOTtzIHByZWNpc2VseSBgUEFHRV9TSVpFYCBpbiBzaXplLiBBbmQgdGhlbiBydW5uaW5nIGBzd2Fwb25gLiBTbyB0aGlzIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZS4gQmluZ28hIFRoaXMgaXMgYSBnb29kIHNpZ24gZm9yIGZ1enppbmcuCgpOb3csIHdoaWNoIGZ1bmN0aW9ucyBhcmUgbW9zdCByZWxldmFudD8gVGhlIHBhdGNoIHRvdWNoZXMgYSBsb3Qgb2YgY29kZSwgbW9kaWZ5aW5nIHNldmVyYWwgZmlsZXMuIEkmIzM5O3ZlIHNjYW5uZWQgdGhlIGNoYW5nZXMsIG5vdGluZyBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBoYXZlIGJlZW4gYWRkZWQgb3IgbW9kaWZpZWQuIFRoZSBrZXkgb25lcyB0aGF0IGltbWVkaWF0ZWx5IGp1bXAgb3V0IGFyZTogYHhzd2FwX21hcF9jbHVzdGVyc2AsIGB4c3dhcF91bm1hcF9jbHVzdGVyc2AsIGB4c3dhcF9jaGVja19tYXBwZWRgLCBgeHN3YXBfdHJpbV9mcmVlX3RhaWxgLCBgeHN3YXBfdXBkYXRlX2ZyZWVfdGFpbGAsIGB4c3dhcF90cnlfc2hyaW5rYCwgYHhzd2FwX21heF9jbHVzdGVyc19yZWFkYCwgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAsIGB4c3dhcF9kZWJ1Z2ZzX2FkZGAsIGB4c3dhcF9kZWJ1Z2ZzX2RlbGAsIGBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm9gLCBgcmVhZF9zd2FwX2hlYWRlcmAsIGBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnlgLCBgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllc2AsIGBfX2ZyZWVfY2x1c3RlcmAsIGBzd2Fwb2ZmYCwgYHN3YXBvbmAuCgpSZW1lbWJlcmluZyB0aGUgZnV6emluZyBwcmluY2lwbGUsICYjMzQ7cHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zJiMzNDsuCgpgc3lzX3N3YXBvbmAgYW5kIGBzeXNfc3dhcG9mZmAgYXJlIHRoZSBlbnRyeSBwb2ludHMgc28gdGhlc2UgYXJlIG9idmlvdXMgdGFyZ2V0cy4gTGV0JiMzOTtzIGRpZyBkZWVwZXI6CgpXaGlsZSBgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5YCBpcyBtb2RpZmllZCwgaXQmIzM5O3Mgc3RhdGljLCBzbyBsZXNzIGludGVyZXN0aW5nIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCB1bmxlc3MgaXQmIzM5O3Mgbm90IGlubGluZWQuCgpUaGUgZm9jdXMgc2hvdWxkIGJlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGluIHRoZSBtb2RpZmllZCBmaWxlcy4gTGV0JiMzOTtzIHNlZS4uLiBsb29raW5nIGF0IGBtbS9zd2FwZmlsZS5jYCwgdGhlcmUmIzM5O3Mgbm90IGEgbG90IG9mIG5vbi1zdGF0aWMgc3R1ZmYgdGhhdCBJIGNhbiBzZWUgZGlyZWN0bHksIGBzZXR1cF9zd2FwX2V4dGVudHNgIGlzIHN0YXRpYy4KCkluIGBtbS9wYWdlX2lvLmNgLCBib3RoIGBzd2FwX3dyaXRlb3V0YCBhbmQgYHN3YXBfcmVhZF9mb2xpb2AgYXJlIG5vbi1zdGF0aWM7IGtlZXAgdGhlbSBpbiBtaW5kLiBgc3dhcF9jbHVzdGVyX3JlYWRhaGVhZGAgaW4gYG1tL3N3YXBfc3RhdGUuY2AgaXMgbm9uLXN0YXRpYyBhcyB3ZWxsLgoKSW4gYG1tL3pzd2FwLmNgLCBgenN3YXBfc3RvcmVgIGlzIG5vbi1zdGF0aWMuCgpBaCwgYnV0IHdhaXQuIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLiBUaGlzIGlzIHRyaWdnZXJlZCB2aWEgYSBkZWJ1Z2ZzIHdyaXRlLCB3aGljaCBpcyBhbm90aGVyIGVudHJ5cG9pbnQuIEkgdGhvdWdodCB0aGlzIHdhcyBzdGF0aWMsIGJ1dCBpdCBjYW5ub3QgYmUgaW5saW5lZCwgYmVjYXVzZSBpdCYjMzk7cyBwYXNzZWQgYXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIGBkZWJ1Z2ZzX2NyZWF0ZV9maWxlYC4gVGhpcyBpcyBhbiBpZGVhbCB0YXJnZXQhCgpMZXQmIzM5O3MgcXVpY2tseSBjb25maXJtIHdpdGggYSBgZGVmYXVsdF9hcGk6Z3JlcHBlcmAgdG8gYmUgMTAwJSBzdXJlLiBJIHdhbnQgdG8gbWFrZSBzdXJlIEkgZG9uJiMzOTt0IG1pc3Mgc29tZXRoaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3hzd2FwX21heF9jbHVzdGVyc193cml0ZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zd2FwZmlsZS5jPTg2PXN0YXRpYyBzc2l6ZV90IHhzd2FwX21heF9jbHVzdGVyc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLFxuLS1cbm1tL3N3YXBmaWxlLmMtOTYtXG5tbS9zd2FwZmlsZS5jOjk3OnN0YXRpYyBzc2l6ZV90IHhzd2FwX21heF9jbHVzdGVyc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSxcbm1tL3N3YXBmaWxlLmMtOTgtXHRcdFx0XHRcdGNvbnN0IGNoYXIgX191c2VyICpidWYsXG4tLVxubW0vc3dhcGZpbGUuYz0xMzY9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xubW0vc3dhcGZpbGUuYy0xMzctXHQucmVhZCA9IHhzd2FwX21heF9jbHVzdGVyc19yZWFkLFxubW0vc3dhcGZpbGUuYzoxMzg6XHQud3JpdGUgPSB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUsXG5tbS9zd2FwZmlsZS5jLTEzOS1cdC5vcGVuID0gc2ltcGxlX29wZW4sXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMDk6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYwOTMKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiA5OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgU3dhcCBDbHVzdGVyIEZ1bmN0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2Ugc3dhcC1yZWxhdGVkIGZ1bmN0aW9ucywgYW5kIHllcCwgdGhleSYjMzk7cmUgZGVmaW5pdGVseSBwcmVzZW50LiBJIHNlZTogYHhzd2FwX21hcF9jbHVzdGVyc2AsIGB4c3dhcF91bm1hcF9jbHVzdGVyc2AsIGB4c3dhcF90cnlfc2hyaW5rYCwgYHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWxgLCBhbmQgYHhzd2FwX3RyaW1fZnJlZV90YWlsYC4gQSBxdWljayBjaGVjayBjb25maXJtcyB0aGVzZSBhcmUgZGVjbGFyZWQgc3RhdGljIOKAkyBnb29kLCB0aGF0JiMzOTtzIHdoYXQgSSBleHBlY3RlZC4gTm93LCBqdXN0IGJlY2F1c2UgdGhleSYjMzk7cmUgc3RhdGljIGRvZXNuJiMzOTt0IGF1dG9tYXRpY2FsbHkgbWVhbiB0aGV5JiMzOTtyZSBpbmxpbmVkLCBzbyB0aGF0JiMzOTtzIHNvbWV0aGluZyB0byBrZWVwIGluIG1pbmQuIEkgbmVlZCB0byBkaWcgYSBsaXR0bGUgZGVlcGVyLiBMZXQgbWUgZXhhbWluZSBgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvYCBuZXh0LiBUaGF0IHNob3VsZCBwcm92aWRlIHNvbWUgY29udGV4dC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcGZpbGUuYz00MDY5PXN0YXRpYyB2b2lkIHhzd2FwX3RyeV9zaHJpbmsoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuLS1cbm1tL3N3YXBmaWxlLmMtNDExMy1cbm1tL3N3YXBmaWxlLmM6NDExNDpzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTQxMTUtXHRcdFx0XHQgICAgdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxuLS1cbm1tL3N3YXBmaWxlLmM9NDI1OD1TWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuLS1cbm1tL3N3YXBmaWxlLmMtNDM2OS1cdC8qIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8gKi9cbm1tL3N3YXBmaWxlLmM6NDM3MDpcdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xubW0vc3dhcGZpbGUuYy00MzcxLVx0aWYgKGVycm9yKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NTk2CgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMzE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBTd2FwIEVudHJ5IFBvaW50cyBhbmQgQ29yZSB4c3dhcCBGdW5jdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCBob3cgdG8gYmVzdCBjaGFyYWN0ZXJpemUgdGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCwgYW5kIG15IGluaXRpYWwgdGhvdWdodCBnb2VzIHN0cmFpZ2h0IHRvIHN5c3RlbSBjYWxsIGVudHJ5IHBvaW50cy4gYHN5c19zd2Fwb25gIGFuZCBgc3lzX3N3YXBvZmZgIGFyZSB0aGUgb2J2aW91cyBzdGFydGluZyBwb2ludHMuIEJ1dCwgd2FpdCwgSSBuZWVkIHRvIGJlIHByZWNpc2UuIEkgcmVtZW1iZXIgYHN5c19zd2Fwb25gIGlzIHByb2JhYmx5IGEgd3JhcHBlciBsaWtlIGBfX3g2NF9zeXNfc3dhcG9uYCB3aGljaCB0aGVuIGNhbGxzIHRoZSBhY3R1YWwgZnVuY3Rpb24sIGBfX2RvX3N5c19zd2Fwb25gIG9yIGBzeXNfc3dhcG9uYCBkaXJlY3RseS4gCgpOb3csIEkgc3RhcnQgbGlzdGluZyBzb21lIHJlbGF0ZWQgZnVuY3Rpb25zIHRoYXQgY29tZSB0byBtaW5kOiBgc3dhcF93cml0ZW91dGAsIGBzd2FwX3JlYWRfZm9saW9gLCBgc3dhcF9jbHVzdGVyX3JlYWRhaGVhZGAsIGFuZCBgenN3YXBfc3RvcmVgLiBCdXQgaG9sZCBvbiwgdGhlIHByb21wdCBzcGVjaWZpY2FsbHkgc2F5cyB0byBhdm9pZCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBrZWVwIHRoZSB0ZXN0IGRpc3RyaWJ1dGlvbnMgZnJvbSBiZWluZyBza2V3ZWQhIFNvLCBzY3JhdGNoIHRob3NlIOKAkyB0aGV5JiMzOTtyZSB0b28gY29tbW9uLgoKSW5zdGVhZCwgSSBuZWVkIHRvIGRyaWxsIGRvd24gaW50byB0aGUgc2V0dXAsIHRlYXJkb3duLCBhbmQgKnNwZWNpZmljKiB4c3dhcCBmdW5jdGlvbnMgdGhhdCByZWFsbHkgZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzLiBDYW4gSSBsaXN0IGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLCBgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRgLCBgeHN3YXBfc2hyaW5rX3dvcmtfZm5gLCBgeHN3YXBfbWFwX2NsdXN0ZXJzYCwgYHhzd2FwX3VubWFwX2NsdXN0ZXJzYCwgYW5kIGB4c3dhcF90cnlfc2hyaW5rYD8gRXZlbiBpZiBzb21lIGFyZSBkZWNsYXJlZCBgc3RhdGljYCwgdGhleSYjMzk7cmUgY2VudHJhbCB0byB0aGUgY2hhbmdlcy4KCkxldCBtZSBqdXN0IHF1aWNrbHkgdmVyaWZ5IGhvdyBgeHN3YXBfbWFwX2NsdXN0ZXJzYCBpcyB1c2VkLiBJcyBpdCBwYXNzZWQgYXMgYSBwb2ludGVyIG9yIGp1c3QgY2FsbGVkPyBPa2F5LCBpdCYjMzk7cyBqdXN0IGNhbGxlZCBkaXJlY3RseSwgYnV0IGl0IGxvb2tzIGxpa2UgYSBsYXJnZSBmdW5jdGlvbiBzbyBpdCYjMzk7cyBwcm9iYWJseSBub3QgaW5saW5lZC4KCkFuZCB3aGF0IGFib3V0IGB4c3dhcF9zaHJpbmtfd29ya19mbmA/IFllcywgaXQmIzM5O3MgcGFzc2VkIHRvIGBJTklUX1dPUktgLCBzbyBJIGtub3cgZm9yIHN1cmUgdGhhdCBpdCB3b24mIzM5O3QgYmUgaW5saW5lZC4gVGhpcyBzaG91bGQgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3hzd2FwX3Nocmlua193b3JrX2ZuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3N3YXBmaWxlLmM9NDAzOT1zdGF0aWMgdm9pZCB4c3dhcF90cmltX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGxvbmcgaWR4KVxuLS1cbm1tL3N3YXBmaWxlLmMtNDA1Ny1cbm1tL3N3YXBmaWxlLmM6NDA1ODpzdGF0aWMgdm9pZCB4c3dhcF9zaHJpbmtfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG5tbS9zd2FwZmlsZS5jLTQwNTkte1xuLS1cbm1tL3N3YXBmaWxlLmM9NDExND1zdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4tLVxubW0vc3dhcGZpbGUuYy00MTcyLVx0XHRtdXRleF9pbml0KFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xubW0vc3dhcGZpbGUuYzo0MTczOlx0XHRJTklUX1dPUksoXHUwMDI2c2ktXHUwMDNleHN3YXBfc2hyaW5rX3dvcmssIHhzd2FwX3Nocmlua193b3JrX2ZuKTtcbm1tL3N3YXBmaWxlLmMtNDE3NC1cdFx0eHN3YXBfZGVidWdmc19hZGQoc2kpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NTcyCgkJCQkJCQlvdXRwdXQ6IDE4CgkJCQkJCQl0aG91Z2h0czogMjQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFhTV0FQIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gcmV2aWV3aW5nIHRoaXMgY29kZSwgYW5kIGl0JiMzOTtzIGNsZWFyIHRoYXQgYHhzd2FwX3Nocmlua193b3JrX2ZuYCwgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAsIGFuZCBgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRgIGFyZSAqbm90KiBpbmxpbmVkLCB3aGljaCBpcyBnb29kIHRvIG5vdGUuIEFsc28sIGJvdGggYHhzd2FwX2NoZWNrX21hcHBlZGAgYW5kIGB4c3dhcF9jb2xsZWN0X3BhZ2VgIGFyZSBwYXNzZWQgYXMgZnVuY3Rpb24gcG9pbnRlcnMgdG8gYGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2VgLCBjb25maXJtaW5nIHRoZXkgd29uJiMzOTt0IGJlIGlubGluZWQgZWl0aGVyLgoKTm93LCByZWdhcmRpbmcgdGhlIG5lY2Vzc2FyeSBLY29uZmlnIG9wdGlvbnMsIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBgQ09ORklHX1hTV0FQYCwgYW5kIGl0IGV4cGxpY2l0bHkgZGVwZW5kcyBvbiBib3RoIGBTV0FQYCBhbmQgYDY0QklUYC4gU28sIGBYU1dBUGAgaXMgZGVmaW5pdGVseSB0aGUgbWFpbiBvbmUgdG8gZm9jdXMgb24gZm9yIGVuYWJsaW5nIHRoaXMgZmVhdHVyZS4gSSBuZWVkIHRvIG1ha2UgYSBub3RlIG9mIHRoaXMuCgpBcmUgdGhlcmUgYW55IG90aGVyIGRlcGVuZGVuY2llcz8gTGV0JiMzOTtzIHNlZS4uLiBgQ09ORklHX0RFQlVHX0ZTYCBpcyBhcHBhcmVudGx5IHJlcXVpcmVkIGJlY2F1c2Ugb2YgYGRlYnVnZnNfY3JlYXRlX2ZpbGVgLiBBbHRob3VnaCBgZGVidWdmc19jcmVhdGVfZmlsZWAgaGFzIGEgZHVtbXkgaW5saW5lIGlmIGBERUJVR19GU2AgaXMgZGlzYWJsZWQsIGFuZCB0aHVzIGlzbiYjMzk7dCAqc3RyaWN0bHkqIHJlcXVpcmVkIGZvciBjb21waWxhdGlvbiwgaXQmIzM5O3MgZGVmaW5pdGVseSBuZWVkZWQgZm9yIHRlc3RpbmcgdGhlIGRlYnVnZnMgaW50ZXJmYWNlLCBzbyBJIHNob3VsZCBwcm9iYWJseSBpbmNsdWRlIGl0IGZvciBmdWxsIGZ1bmN0aW9uYWxpdHkuIEkgbmVlZCB0byBjaGVjayBgbW0vS2NvbmZpZ2AgdG8gY29uZmlybSB3aGVyZSBgWFNXQVBgIGlzIGRlZmluZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBYU1dBUCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTExND1jb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXG4tLVxubW0vS2NvbmZpZy0xMjQtXG5tbS9LY29uZmlnOjEyNTpjb25maWcgWFNXQVBcbm1tL0tjb25maWctMTI2LVx0Ym9vbCBcJiMzNDtFeHRlbmRhYmxlICh2aXJ0dWFsKSBzd2FwIGRldmljZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODIxMgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipOYXZpZ2F0aW5nIHRoZSBLY29uZmlnIExhYnlyaW50aCoqCgpPa2F5LCB0aW1lIHRvIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gYWdhaW4uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc2V0dGluZ3MgcmVsYXRlZCB0byBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5LCBzb21ldGhpbmcgSSYjMzk7bSB0cm91Ymxlc2hvb3RpbmcuIExldCYjMzk7cyBzZWUuLi4gYSBnb29kIHN0YXJ0aW5nIHBvaW50IGlzIHVzdWFsbHkgdGhlIGBtbS9LY29uZmlnYCBmaWxlLiBJJiMzOTtsbCBuZWVkIHRvIGdvIHRvIHRoYXQgZmlsZSB0byBjaGVjayB3aGF0IHRoZSBLY29uZmlnIHNldHRpbmdzIGFyZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDEyNSwgdGhhdCYjMzk7cyB1c3VhbGx5IHdoZXJlIHRoZSByZWxldmFudCBvcHRpb25zIGFyZS4gSSYjMzk7bGwgZm9jdXMgbXkgaW52ZXN0aWdhdGlvbiB0aGVyZS4gSG9wZWZ1bGx5LCB0aGF0IHdpbGwgZ2l2ZSBtZSBzb21lIGNsYXJpdHkgb24gdGhlIGZlYXR1cmUgYW5kIGl0cyBjb25maWd1cmF0aW9uLiBJJiMzOTttIGhvcGluZyBJIGNhbiBmaW5kIHRoZSBhbnN3ZXIgcXVpY2tseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMDk6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDI1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMTU6XHQgICAgICAgc3RyaW5nXG4gMTE2Olx0ICAgICAgIGRlcGVuZHMgb24gWlNXQVBcbiAxMTc6XHQgICAgICAgZGVmYXVsdCBcJiMzNDtkZWZsYXRlXCYjMzQ7IGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9ERUZMQVRFXG4gMTE4Olx0ICAgICAgIGRlZmF1bHQgXCYjMzQ7bHpvXCYjMzQ7IGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWk9cbiAxMTk6XHQgICAgICAgZGVmYXVsdCBcJiMzNDs4NDJcJiMzNDsgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXzg0MlxuIDEyMDpcdCAgICAgICBkZWZhdWx0IFwmIzM0O2x6NFwmIzM0OyBpZiBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0XG4gMTIxOlx0ICAgICAgIGRlZmF1bHQgXCYjMzQ7bHo0aGNcJiMzNDsgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaNEhDXG4gMTIyOlx0ICAgICAgIGRlZmF1bHQgXCYjMzQ7enN0ZFwmIzM0OyBpZiBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfWlNURFxuIDEyMzpcdCAgICAgICBkZWZhdWx0IFwmIzM0O1wmIzM0O1xuIDEyNDpcdFxuIDEyNTpcdGNvbmZpZyBYU1dBUFxuIDEyNjpcdFx0Ym9vbCBcJiMzNDtFeHRlbmRhYmxlICh2aXJ0dWFsKSBzd2FwIGRldmljZVwmIzM0O1xuIDEyNzpcdFx0ZGVwZW5kcyBvbiBTV0FQIFx1MDAyNlx1MDAyNiA2NEJJVFxuIDEyODpcdFx0aGVscFxuIDEyOTpcdFx0ICBBZGRzIHN1cHBvcnQgZm9yIGV4dGVuZGFibGUgc3dhcCBkZXZpY2VzICh4c3dhcCkgdGhhdCBkZWNvdXBsZVxuIDEzMDpcdFx0ICBQVEUgc3dhcCBlbnRyaWVzIGZyb20gcGh5c2ljYWwgYmFja2luZyBzdG9yYWdlLiBUaGUgY2x1c3Rlcl9pbmZvXG4gMTMxOlx0XHQgIGFycmF5IGlzIGJhY2tlZCBieSBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgdGhhdCBncm93cyBhbmQgc2hyaW5rc1xuIDEzMjpcdFx0ICBvbiBkZW1hbmQsIGF2b2lkaW5nIHN0YXRpYyBwcmUtYWxsb2NhdGlvbiBvdmVyaGVhZC5cbiAxMzM6XHRcbiAxMzQ6XHRjb25maWcgWlNNQUxMT0NcbiAxMzU6XHRcdHRyaXN0YXRlXG4gMTM2Olx0XG4gMTM3Olx0bWVudSBcJiMzNDtac21hbGxvYyBhbGxvY2F0b3Igb3B0aW9uc1wmIzM0O1xuIDEzODpcdFx0ZGVwZW5kcyBvbiBaU01BTExPQ1xuIDEzOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODgyMwoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDI1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBDb25maWd1cmF0aW9uIENob2ljZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIHRoZSBmaXJzdCB0aGluZyBJIG5lZWQgdG8gZG8gaXMgY29uZmlndXJlIGl0LiBUaGUgY3JpdGljYWwgcGllY2UgaGVyZSBzZWVtcyB0byBiZSBgWFNXQVBgLCBzbyBJJiMzOTtsbCBiZSBzdXJlIHRvIGFkZCB0aGF0IHRvIHRoZSBgRW5hYmxlQ29uZmlnc2AuIEdpdmVuIHRoYXQgZGVidWdmcyBpcyBhIGNlbnRyYWwgcGFydCBvZiB0aGlzLCBJJiMzOTtsbCBhbHNvIGJyaW5nIGluIGBERUJVR19GU2AgdG8gZW5zdXJlIHdlIGNhbiBmdXp6IGl0IGVmZmVjdGl2ZWx5LiBUaGF0JiMzOTtsbCBiZSBpbXBvcnRhbnQgZm9yIHRob3JvdWdoIHRlc3RpbmcuCgpOb3csIG9uIHRvIHRoZSBBUEkgZXhwb3N1cmUuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9ucyBhcmUgdGhlIGtleSBlbnRyeSBwb2ludHMuIExldCBtZSBzZWUgaWYgYHhzd2FwX21hcF9jbHVzdGVyc2AgaXMgc3RhdGljIC0geWVwLCBpdCBpcy4gVGhlIHByb21wdCBkb2VzIHNheSB0byAmIzM0O1ByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyYjMzQ7LgoKQWxyaWdodCwgaGVyZeKAmXMgbXkgcGxhbiBmb3IgbGlzdGluZzogSSYjMzk7bGwgaW5jbHVkZToKKiAgIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgCiogICBgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRgCiogICBgeHN3YXBfc2hyaW5rX3dvcmtfZm5gCiogICBgeHN3YXBfY2hlY2tfbWFwcGVkYAoqICAgYHhzd2FwX2NvbGxlY3RfcGFnZWAKKiAgIGBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm9gIChldmVuIHRob3VnaCBpdCYjMzk7cyBzdGF0aWMsIGl0JiMzOTtzIGEgbWFqb3Igc2V0dXAgZnVuY3Rpb24gYW5kIHByZXR0eSBzaWduaWZpY2FudCkuCgpIYW5nIG9uLCBkaWQgSSBqdXN0IGxpc3QgYHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mb2A/IFRoYXQmIzM5O3MgcmlnaHQsIGl0ICppcyogc3RhdGljLiBMZXQgbWUgcXVpY2tseSByZWFzc2Vzcy4gSSBzaG91bGQgY29uc2lkZXIgYHN5c19zd2Fwb25gIGFuZCBgc3lzX3N3YXBvZmZgISBCZWluZyBzeXNjYWxscywgdGhlc2UgYXJlIGRlZmluaXRlbHkgZW50cnkgcG9pbnRzLiBJIHNob3VsZCBhbHNvIGNoZWNrIGBtbS9zd2FwZmlsZS5jYCB0byBiZSBjZXJ0YWluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtTWVNDQUxMX0RFRklORS4qc3dhcG9uJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3N3YXBmaWxlLmM9NDExND1zdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4tLVxubW0vc3dhcGZpbGUuYy00MjU3LVxubW0vc3dhcGZpbGUuYzo0MjU4OlNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG5tbS9zd2FwZmlsZS5jLTQyNTkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAwOToxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTU1NwoJCQkJCQkJb3V0cHV0OiAxODQKCQkJCQkJCXRob3VnaHRzOiA2MDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgWHN3YXAgRnV6emluZyBUYXJnZXQgU2VsZWN0aW9uKioKCk9rYXksIGxldCYjMzk7cyB0aGluayB0aGlzIHRocm91Z2guIFRoZSBwcm9tcHQgYXNrcyBmb3IgYSBsaXN0IG9mIGtlcm5lbCBmdW5jdGlvbnMgdG8gZm9jdXMgZnV6emluZyBlZmZvcnRzIG9uLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbmV3IHhzd2FwIGZ1bmN0aW9uYWxpdHkuIFN5emthbGxlciB1c3VhbGx5IHVzZXMgdGhlIGFjdHVhbCBzeW1ib2wgbmFtZXMsIHNvIEkgbmVlZCB0byBkZWNpZGUgd2hhdCYjMzk7cyBtb3N0IGFwcHJvcHJpYXRlIGhlcmUuIFNob3VsZCBJIGxpc3QgdGhlIHN5c2NhbGwgZW50cnkgcG9pbnQgKGBfX3g2NF9zeXNfc3dhcG9uYCBvciBgc3lzX3N3YXBvbmApIG9yIGRlbHZlIGRlZXBlciBpbnRvIHRoZSBpbnRlcm5hbHM/CgpUaGUgcHJlZmVyZW5jZSBpcyBmb3Igbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLiBUaGlua2luZyBhYm91dCB0aGF0LCB0aGUgb3JpZ2luYWwgdGhvdWdodCB3YXMgdG8gbGlzdCBmdW5jdGlvbnMgKmluc2lkZSogdGhlIHN5c2NhbGwsIGxpa2UgYHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mb2AuIEJ1dCB0aGVuIHRoZSBwcm9tcHQgY2xhcmlmaWVkIHRoZSBuZWVkIHRvIGF2b2lkIHN0YXRpYyBpbmxpbmVkIGhlbHBlciBmdW5jdGlvbnMuIFRoYXQgbWFrZXMgc2Vuc2UuCgpTbywgSSBuZWVkIHRvIGlkZW50aWZ5IGZ1bmN0aW9ucyB0aGF0IGFyZSAqbm90KiBpbmxpbmVkIGFuZCBoYXZlIGRpc3RpbmN0IGFkZHJlc3Nlcy4gSW1tZWRpYXRlbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQuIEZ1bmN0aW9ucyBsaWtlIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLCBgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRgLCBgeHN3YXBfc2hyaW5rX3dvcmtfZm5gLCBgeHN3YXBfY2hlY2tfbWFwcGVkYCwgYW5kIGB4c3dhcF9jb2xsZWN0X3BhZ2VgIGFyZSBwYXNzZWQgYXMgZnVuY3Rpb24gcG9pbnRlcnMuIFRoZXNlIGFyZSBoaWdobHkgdW5saWtlbHkgdG8gYmUgaW5saW5lZCBhbmQgYXJlIGdyZWF0IGNhbmRpZGF0ZXMuCgpXaGF0IGFib3V0IG90aGVyIGZ1bmN0aW9ucz8gYHN3YXBfdHlwZV9zdHJgIGlzIGEgcHJpbnQgaGVscGVyLCBzbyB0aGF0JiMzOTtzIG91dC4gVGhlbiBteSBtaW5kIGlzIG9uIGB4c3dhcF9tYXBfY2x1c3RlcnNgIGFuZCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLiBUaGV5ICptaWdodCogYmUgaW5saW5lZC4gQnV0IGB4c3dhcF9tYXBfY2x1c3RlcnNgIGlzIGEgc3Vic3RhbnRpYWwgZnVuY3Rpb27igJQxMzAgbGluZXMhIEl0JiMzOTtzIHByb2JhYmx5IGEgZ29vZCB0YXJnZXQgYmVjYXVzZSBpdCBpcyBsZXNzIGxpa2VseSB0byBiZSBpbmxpbmVkLgoKVGhlIHhzd2FwIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlLiBUaGUgaW1wbGVtZW50YXRpb24gZGVjb3VwbGVzIFBURSBzd2FwIGVudHJpZXMgZnJvbSBwaHlzaWNhbCBiYWNraW5nIHN0b3JhZ2UgYW5kIHVzZXMgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIGZvciBjbHVzdGVyIGluZm8uIFRoaXMgb3BlbnMgdXAgbmV3IGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgbmVlZHMgYXR0ZW50aW9uLCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHNocmlua2luZyB3b3JrcXVldWUuIFRoZSBuZXcgZmVhdHVyZSBpcyBmdW5jdGlvbmFsLCBzbyBpdCBzaG91bGQgYmUgZnV6emVkLgoKV2l0aCBhbGwgb2YgdGhpcyBpbiBtaW5kLCB0aGUgY29uZmlndXJhdGlvbnMgdG8gZW5hYmxlIGFyZSBgWFNXQVBgIGFuZCBgREVCVUdfRlNgLgoKSSYjMzk7bGwgcHJvY2VlZCB3aXRoIHRoZXNlIGtleSBzeW1ib2xzOgoqICAgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAKKiAgIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGAKKiAgIGB4c3dhcF9zaHJpbmtfd29ya19mbmAKKiAgIGB4c3dhcF9jaGVja19tYXBwZWRgCiogICBgeHN3YXBfY29sbGVjdF9wYWdlYAoqICAgYHhzd2FwX21hcF9jbHVzdGVyc2AKKiAgIGB4c3dhcF91bm1hcF9jbHVzdGVyc2AKClF1aWNrIHNhbml0eSBjaGVjazogQXJlIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMgKnN0YXRpYyo/IFllcywgYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW50cm9kdWNlZCBhcmUgc3RhdGljLiBUaGlzIG1lYW5zIHRoZXJlIGFyZSBubyBub24tc3RhdGljIGZ1bmN0aW9ucyBhZGRlZCwgaG93ZXZlciwgdGhlc2UgZnVuY3Rpb25zIGFyZSBjZW50cmFsIHRvIHRoZSBuZXcgZnVuY3Rpb25hbGl0eSwgd2l0aCBzb21lIGJlaW5nIGZ1bmN0aW9uIHBvaW50ZXJzLCB0aGV5IGFyZSBnb29kIGNhbmRpZGF0ZXMuCgpPa2F5LCBJJiMzOTttIGNvbmZpZGVudCBpbiB0aGVzZSBzZWxlY3Rpb25zLiBOb3csIGxldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDA5OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtYU1dBUCYjMzQ7LAogICAgJiMzNDtERUJVR19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3hzd2FwX21heF9jbHVzdGVyc193cml0ZSYjMzQ7LAogICAgJiMzNDt4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZCYjMzQ7LAogICAgJiMzNDt4c3dhcF9zaHJpbmtfd29ya19mbiYjMzQ7LAogICAgJiMzNDt4c3dhcF9jaGVja19tYXBwZWQmIzM0OywKICAgICYjMzQ7eHN3YXBfY29sbGVjdF9wYWdlJiMzNDssCiAgICAmIzM0O3hzd2FwX21hcF9jbHVzdGVycyYjMzQ7LAogICAgJiMzNDt4c3dhcF91bm1hcF9jbHVzdGVycyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dGVuZGFibGUgdmlydHVhbCBzd2FwIGRldmljZSAoeHN3YXApIHRoYXQgZGVjb3VwbGVzIFBURSBzd2FwIGVudHJpZXMgZnJvbSBwaHlzaWNhbCBiYWNraW5nIHN0b3JhZ2UuIEl0IHVzZXMgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIGZvciBjbHVzdGVyIGluZm8gdGhhdCBncm93cyBhbmQgc2hyaW5rcyBkeW5hbWljYWxseS4gVGhpcyBhZGRzIG5ldyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgZm9yIHN3YXAgbWFuYWdlbWVudCwgaW5jbHVkaW5nIGRlYnVnZnMgaW50ZXJmYWNlcyBhbmQgYSB3b3JrcXVldWUgZm9yIHNocmlua2luZy4gSXQgaXMgZnVuY3Rpb25hbCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7WFNXQVAmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUmIzM0OywKICAgICYjMzQ7eHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQmIzM0OywKICAgICYjMzQ7eHN3YXBfc2hyaW5rX3dvcmtfZm4mIzM0OywKICAgICYjMzQ7eHN3YXBfY2hlY2tfbWFwcGVkJiMzNDssCiAgICAmIzM0O3hzd2FwX2NvbGxlY3RfcGFnZSYjMzQ7LAogICAgJiMzNDt4c3dhcF9tYXBfY2x1c3RlcnMmIzM0OywKICAgICYjMzQ7eHN3YXBfdW5tYXBfY2x1c3RlcnMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBleHRlbmRhYmxlIHZpcnR1YWwgc3dhcCBkZXZpY2UgKHhzd2FwKSB0aGF0IGRlY291cGxlcyBQVEUgc3dhcCBlbnRyaWVzIGZyb20gcGh5c2ljYWwgYmFja2luZyBzdG9yYWdlLiBJdCB1c2VzIGEgc3BhcnNlIHZtYWxsb2MgYXJlYSBmb3IgY2x1c3RlciBpbmZvIHRoYXQgZ3Jvd3MgYW5kIHNocmlua3MgZHluYW1pY2FsbHkuIFRoaXMgYWRkcyBuZXcgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIGZvciBzd2FwIG1hbmFnZW1lbnQsIGluY2x1ZGluZyBkZWJ1Z2ZzIGludGVyZmFjZXMgYW5kIGEgd29ya3F1ZXVlIGZvciBzaHJpbmtpbmcuIEl0IGlzIGZ1bmN0aW9uYWwgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNDozOC4yNTIwMzU4MjhaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MjMwNDM5Nzc4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJYU1dBUFwiLFxuICAgIFwiREVCVUdfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVcIixcbiAgICBcInhzd2FwX21heF9jbHVzdGVyc19yZWFkXCIsXG4gICAgXCJ4c3dhcF9zaHJpbmtfd29ya19mblwiLFxuICAgIFwieHN3YXBfY2hlY2tfbWFwcGVkXCIsXG4gICAgXCJ4c3dhcF9jb2xsZWN0X3BhZ2VcIixcbiAgICBcInhzd2FwX21hcF9jbHVzdGVyc1wiLFxuICAgIFwieHN3YXBfdW5tYXBfY2x1c3RlcnNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dGVuZGFibGUgdmlydHVhbCBzd2FwIGRldmljZSAoeHN3YXApIHRoYXQgZGVjb3VwbGVzIFBURSBzd2FwIGVudHJpZXMgZnJvbSBwaHlzaWNhbCBiYWNraW5nIHN0b3JhZ2UuIEl0IHVzZXMgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIGZvciBjbHVzdGVyIGluZm8gdGhhdCBncm93cyBhbmQgc2hyaW5rcyBkeW5hbWljYWxseS4gVGhpcyBhZGRzIG5ldyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgZm9yIHN3YXAgbWFuYWdlbWVudCwgaW5jbHVkaW5nIGRlYnVnZnMgaW50ZXJmYWNlcyBhbmQgYSB3b3JrcXVldWUgZm9yIHNocmlua2luZy4gSXQgaXMgZnVuY3Rpb25hbCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTQ6MzguMjUyMDQzNjU4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjI1NjQ3NjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMjNiODY1ZjNjNDk2N2QyMjdlNjllMzkyMGZjNDI1NzQ1OWZiZmM0MlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIEF1ZyA1IDA5OjE0OjM2IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcXG5pbmRleCA0NWYzMDFkNzNlMmFlLi5hNWIzMjMzNzQ3NjljIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcXG5AQCAtMjA3LDYgKzIwNyw3IEBAIGVudW0ge1xcbiBcXHRTV1BfU1RBQkxFX1dSSVRFUyA9ICgxIFxcdTAwM2NcXHUwMDNjIDExKSxcXHQvKiBubyBvdmVyd3JpdGUgUEdfd3JpdGViYWNrIHBhZ2VzICovXFxuIFxcdFNXUF9TWU5DSFJPTk9VU19JTyA9ICgxIFxcdTAwM2NcXHUwMDNjIDEyKSxcXHQvKiBzeW5jaHJvbm91cyBJTyBpcyBlZmZpY2llbnQgKi9cXG4gXFx0U1dQX0hJQkVSTkFUSU9OID0gKDEgXFx1MDAzY1xcdTAwM2MgMTMpLFxcdC8qIHBpbm5lZCBmb3IgaGliZXJuYXRpb24gKi9cXG4rXFx0U1dQX1hTV0FQXFx0PSAoMSBcXHUwMDNjXFx1MDAzYyAxNCksXFx0LyogZXh0ZW5kYWJsZSBzd2FwIGRldmljZSAqL1xcbiBcXHRcXHRcXHRcXHRcXHQvKiBhZGQgb3RoZXJzIGhlcmUgYmVmb3JlLi4uICovXFxuIH07XFxuIFxcbkBAIC0yNDcsNiArMjQ4LDE2IEBAIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHtcXG4gXFx0c2lnbmVkIGNoYXJcXHR0eXBlO1xcdFxcdC8qIHN0cmFuZ2UgbmFtZSBmb3IgYW4gaW5kZXggKi9cXG4gXFx0dW5zaWduZWQgaW50XFx0bWF4O1xcdFxcdC8qIHNpemUgb2YgdGhpcyBzd2FwIGRldmljZSAqL1xcbiBcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbzsgLyogY2x1c3RlciBpbmZvLiBPbmx5IGZvciBTU0QgKi9cXG4rI2lmZGVmIENPTkZJR19YU1dBUFxcbitcXHRzdHJ1Y3Qgdm1fc3RydWN0XFx0KmNsdXN0ZXJfdm07XFx0LyogVk1fU1BBUlNFIGFyZWEgZm9yIHhzd2FwIGR5bmFtaWMgY2x1c3Rlcl9pbmZvICovXFxuK1xcdHVuc2lnbmVkIGxvbmdcXHRcXHRucl9jbHVzdGVyc19tYXg7LyogdXBwZXIgbGltaXQgZnJvbSBzd2FwIGhlYWRlciAqL1xcbitcXHR1bnNpZ25lZCBsb25nXFx0XFx0bnJfY2x1c3RlcnM7XFx0LyogY3VycmVudCBncm93dGggY2VpbGluZyAo4omkIG5yX2NsdXN0ZXJzX21heCkgKi9cXG4rXFx0dW5zaWduZWQgbG9uZ1xcdFxcdG5yX2NsdXN0ZXJzX21hcHBlZDsgLyogY3VycmVudGx5IG1hcHBlZCBjbHVzdGVyIGNvdW50ICovXFxuK1xcdHVuc2lnbmVkIGxvbmdcXHRcXHRucl9mcmVlX3RhaWw7XFx0LyogY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0IHRhaWwgKi9cXG4rXFx0c3RydWN0IGRlbnRyeVxcdFxcdCpkZWJ1Z2ZzX2VudHJ5O1xcdC8qIGRlYnVnZnM6IHR5cGVcXHUwMDNjTlxcdTAwM2VfbWF4X2NsdXN0ZXJzICovXFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdFxcdHhzd2FwX3Nocmlua193b3JrOyAvKiBkZWZlcnJlZCBzaHJpbmsgdHJpZ2dlciAqL1xcbitcXHRzdHJ1Y3QgbXV0ZXhcXHRcXHR4c3dhcF9sb2NrO1xcdC8qIHNlcmlhbGl6ZSBtYXAvdW5tYXAgb3BlcmF0aW9ucyAqL1xcbisjZW5kaWZcXG4gXFx0c3RydWN0IGxpc3RfaGVhZCBmcmVlX2NsdXN0ZXJzOyAvKiBmcmVlIGNsdXN0ZXJzIGxpc3QgKi9cXG4gXFx0c3RydWN0IGxpc3RfaGVhZCBmdWxsX2NsdXN0ZXJzOyAvKiBmdWxsIGNsdXN0ZXJzIGxpc3QgKi9cXG4gXFx0c3RydWN0IGxpc3RfaGVhZCBub25mdWxsX2NsdXN0ZXJzW1NXQVBfTlJfT1JERVJTXTtcXG5AQCAtMzUwLDYgKzM2MSw3IEBAIHZvaWQgZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4gdm9pZCBmcmVlX3BhZ2VzX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBlbmNvZGVkX3BhZ2UgKiosIGludCk7XFxuIC8qIGxpbnV4L21tL3N3YXBmaWxlLmMgKi9cXG4gZXh0ZXJuIGF0b21pY19sb25nX3QgbnJfc3dhcF9wYWdlcztcXG4rZXh0ZXJuIGF0b21pY190IG5yX3JlYWxfc3dhcGZpbGVzO1xcbiBleHRlcm4gbG9uZyB0b3RhbF9zd2FwX3BhZ2VzO1xcbiBleHRlcm4gYXRvbWljX3QgbnJfcm90YXRlX3N3YXA7XFxuIFxcbmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZ1xcbmluZGV4IDA2MDE5MGUxMmJjZWQuLjgyZjYyZjRjNWIyM2UgMTAwNjQ0XFxuLS0tIGEvbW0vS2NvbmZpZ1xcbisrKyBiL21tL0tjb25maWdcXG5AQCAtMTIyLDYgKzEyMiwxNSBAQCBjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXFxuICAgICAgICBkZWZhdWx0IFxcXCJ6c3RkXFxcIiBpZiBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfWlNURFxcbiAgICAgICAgZGVmYXVsdCBcXFwiXFxcIlxcbiBcXG4rY29uZmlnIFhTV0FQXFxuK1xcdGJvb2wgXFxcIkV4dGVuZGFibGUgKHZpcnR1YWwpIHN3YXAgZGV2aWNlXFxcIlxcbitcXHRkZXBlbmRzIG9uIFNXQVAgXFx1MDAyNlxcdTAwMjYgNjRCSVRcXG4rXFx0aGVscFxcbitcXHQgIEFkZHMgc3VwcG9ydCBmb3IgZXh0ZW5kYWJsZSBzd2FwIGRldmljZXMgKHhzd2FwKSB0aGF0IGRlY291cGxlXFxuK1xcdCAgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gVGhlIGNsdXN0ZXJfaW5mb1xcbitcXHQgIGFycmF5IGlzIGJhY2tlZCBieSBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgdGhhdCBncm93cyBhbmQgc2hyaW5rc1xcbitcXHQgIG9uIGRlbWFuZCwgYXZvaWRpbmcgc3RhdGljIHByZS1hbGxvY2F0aW9uIG92ZXJoZWFkLlxcbitcXG4gY29uZmlnIFpTTUFMTE9DXFxuIFxcdHRyaXN0YXRlXFxuIFxcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmNcXG5pbmRleCBlNGZhN2ZmZmZlOGJiLi4xZjNmYTUyMTMxYWIzIDEwMDY0NFxcbi0tLSBhL21tL3BhZ2VfaW8uY1xcbisrKyBiL21tL3BhZ2VfaW8uY1xcbkBAIC0yNDcsNiArMjQ3LDE3IEBAIGludCBzd2FwX3dyaXRlb3V0KHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHR9XFxuIFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogY3R4LVxcdTAwM2VzaXMgaXMgc2V0IGJ5IHN3YXBfYWRkX2ZvbGlvKCkgd2hpY2ggaXMgY2FsbGVkIGZyb21cXG4rXFx0ICogX19zd2FwX3dyaXRlcGFnZSgpIGJlbG93LiAgU2luY2Ugd2UgbXVzdCBhdm9pZCB0aGUgd3JpdGVwYWdlXFxuK1xcdCAqIHBhdGggZm9yIHhzd2FwIGRldmljZXMsIHVzZSB0aGUgc3dhcF9pbmZvIGZyb20gdGhlIGZvbGlvJ3NcXG4rXFx0ICogc3dhcCBlbnRyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggY3R4LlxcbitcXHQgKi9cXG4rXFx0aWYgKHVubGlrZWx5KF9fc3dhcF9lbnRyeV90b19pbmZvKGZvbGlvLVxcdTAwM2Vzd2FwKS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfWFNXQVApKSB7XFxuK1xcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbitcXHRcXHRyZXR1cm4gQU9QX1dSSVRFUEFHRV9BQ1RJVkFURTtcXG4rXFx0fVxcbitcXG4gXFx0X19zd2FwX3dyaXRlcGFnZShjdHgsIGZvbGlvKTtcXG4gXFx0cmV0dXJuIDA7XFxuIG91dF91bmxvY2s6XFxuQEAgLTQ3OSw2ICs0OTAsMTEgQEAgdm9pZCBzd2FwX3JlYWRfZm9saW8oc3RydWN0IHN3YXBfaW9fY3R4ICpjdHgsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxcbiBcXHRcXHRnb3RvIGZpbmlzaDtcXG4gXFxuK1xcdGlmICh1bmxpa2VseShzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKSkge1xcbitcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbitcXHRcXHRnb3RvIGZpbmlzaDtcXG4rXFx0fVxcbitcXG4gXFx0LyogV2UgaGF2ZSB0byByZWFkIGZyb20gc2xvd2VyIGRldmljZXMuIEluY3JlYXNlIHpzd2FwIHByb3RlY3Rpb24uICovXFxuIFxcdHpzd2FwX2ZvbGlvX3N3YXBpbihmb2xpbyk7XFxuIFxcdHN3YXBfYWRkX2ZvbGlvKGN0eCwgZm9saW8sIFJFQUQpO1xcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmNcXG5pbmRleCA1YmU4MjU5MTFlNjQ1Li5lYmIyZDJhYzM1NmZlIDEwMDY0NFxcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xcbisrKyBiL21tL3N3YXBfc3RhdGUuY1xcbkBAIC04MjksNiArODI5LDEzIEBAIHN0cnVjdCBmb2xpbyAqc3dhcF9jbHVzdGVyX3JlYWRhaGVhZChzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwX21hc2ssXFxuIFxcdHN0cnVjdCBibGtfcGx1ZyBwbHVnO1xcbiBcXHRzd3BfZW50cnlfdCByYV9lbnRyeTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBlbnRyeSBtYXkgaGF2ZSBiZWVuIGZyZWVkIGJ5IGFub3RoZXIgdGFzay4gQXZvaWQgc3dhcF9pbmZvX2dldCgpXFxuK1xcdCAqIHdoaWNoIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBpZiB0aGUgcmFjZSBoYXBwZW5zLlxcbitcXHQgKi9cXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUClcXG4rXFx0XFx0Z290byBza2lwO1xcbitcXG4gXFx0bWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTtcXG4gXFx0aWYgKCFtYXNrKVxcbiBcXHRcXHRnb3RvIHNraXA7XFxuZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jXFxuaW5kZXggNGQ0ZTNlMzA1OWY2Yi4uY2E0MDY1NTY2MjZlNyAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwZmlsZS5jXFxuKysrIGIvbW0vc3dhcGZpbGUuY1xcbkBAIC00OCw2ICs0OCwxMTggQEBcXG4gI2luY2x1ZGUgXFxcInN3YXBfdGFibGUuaFxcXCJcXG4gI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJzd2FwLmhcXFwiXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcXHUwMDNlXFxuK1xcbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7XFxuK1xcbisjaWZkZWYgQ09ORklHX1hTV0FQXFxuKy8qXFxuKyAqIHhzd2FwOiBkeW5hbWljYWxseSBncm93IGFuZCBzaHJpbmsgdGhlIGNsdXN0ZXJfaW5mbyBhcnJheSB2aWEgYVxcbisgKiBWTV9TUEFSU0UgYXJlYS5cXG4rICpcXG4rICogWFNXQVBfR1JPV19DTFVTVEVSUyBpcyB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIHRvIG1hcC91bm1hcCBpbiBvbmVcXG4rICogZ3Jvdy9zaHJpbmsgb3BlcmF0aW9uLiAgSXQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgY2x1c3Rlcl9pbmZvXFxuKyAqIHN0cnVjdHMgdGhhdCBmaXQgaW4gYSBzaW5nbGUgcGFnZSAoYXQgbGVhc3QgMTYpLCBzbyB0aGF0IHRoZSB2bWFsbG9jXFxuKyAqIHBhZ2UgdGFibGVcXG4rICogb3ZlcmhlYWQgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgbWFwcGVkLlxcbisgKi9cXG4rI2RlZmluZSBYU1dBUF9HUk9XX0NMVVNURVJTIFxcXFxcXG4rXFx0bWF4X3QodW5zaWduZWQgbG9uZywgUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyksIDE2KVxcbitcXG4rc3RhdGljIHN0cnVjdCBkZW50cnkgKnhzd2FwX2RlYnVnZnNfcm9vdDtcXG4rXFxuK3N0YXRpYyBpbnQgeHN3YXBfbWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIHVuc2lnbmVkIGxvbmcgbnIpO1xcbitzdGF0aWMgdm9pZCB4c3dhcF91bm1hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucik7XFxuK3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSk7XFxuK3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpO1xcbitzdGF0aWMgdm9pZCB4c3dhcF91cGRhdGVfZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgZnJlZWRfaWR4KTtcXG4rc3RhdGljIHZvaWQgeHN3YXBfdHJ5X3NocmluayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpO1xcbitcXG4rLypcXG4rICogZGVidWdmcyByZWFkL3dyaXRlIGZvciBwZXItZGV2aWNlIG1heCBjbHVzdGVyIGNvdW50LlxcbisgKiBTaG93cy9zZXRzIHNpLVxcdTAwM2Vucl9jbHVzdGVycyAoY3VycmVudCBncm93dGggY2VpbGluZyksIGNsYW1wZWQgdG9cXG4rICogWzAsIHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXhdLlxcbisgKi9cXG4rc3RhdGljIHNzaXplX3QgeHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuK1xcdGNoYXIgdG1wWzMyXTtcXG4rXFx0aW50IGxlbjtcXG4rXFxuK1xcdGxlbiA9IHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksIFxcXCIlbHVcXFxcblxcXCIsIFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnMpKTtcXG4rXFx0cmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcCwgbGVuKTtcXG4rfVxcbitcXG4rc3RhdGljIHNzaXplX3QgeHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLFxcbitcXHRcXHRcXHRcXHRcXHRjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxcbitcXHRcXHRcXHRcXHRcXHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdmFsLCBuZXdfcGFnZXM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRlcnIgPSBrc3RydG91bF9mcm9tX3VzZXIoYnVmLCBjb3VudCwgMCwgXFx1MDAyNnZhbCk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHRpZiAodmFsIFxcdTAwM2Ugc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21heClcXG4rXFx0XFx0dmFsID0gc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21heDtcXG4rXFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbitcXHRzaS1cXHUwMDNlbnJfY2x1c3RlcnMgPSB2YWw7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuK1xcbitcXHQvKiBLZWVwIHRoZSB2aXNpYmxlIHN3YXAgc2l6ZSBpbiBzeW5jIHdpdGggdGhlIG5ldyBjZWlsaW5nLiAqL1xcbitcXHRuZXdfcGFnZXMgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB2YWwgKiBTV0FQRklMRV9DTFVTVEVSLCBzaS1cXHUwMDNlbWF4KTtcXG4rXFx0aWYgKG5ld19wYWdlcylcXG4rXFx0XFx0bmV3X3BhZ2VzLS07XFxuK1xcdGlmIChuZXdfcGFnZXMgIT0gc2ktXFx1MDAzZXBhZ2VzKSB7XFxuK1xcdFxcdGxvbmcgZGVsdGEgPSAobG9uZyluZXdfcGFnZXMgLSAobG9uZylzaS1cXHUwMDNlcGFnZXM7XFxuK1xcbitcXHRcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdFxcdHNpLVxcdTAwM2VwYWdlcyA9IG5ld19wYWdlcztcXG4rXFx0XFx0YXRvbWljX2xvbmdfYWRkKGRlbHRhLCBcXHUwMDI2bnJfc3dhcF9wYWdlcyk7XFxuK1xcdFxcdHRvdGFsX3N3YXBfcGFnZXMgKz0gZGVsdGE7XFxuK1xcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHR9XFxuK1xcbitcXHQvKiBTaHJpbmsgdHJpZ2dlcjogbG93ZXJpbmcgdGhlIGNlaWxpbmcgbWF5IGZyZWUgdGFpbCBjbHVzdGVycy4gKi9cXG4rXFx0c2NoZWR1bGVfd29yayhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcXG4rXFxuK1xcdHJldHVybiBjb3VudDtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xcbitcXHQucmVhZCA9IHhzd2FwX21heF9jbHVzdGVyc19yZWFkLFxcbitcXHQud3JpdGUgPSB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUsXFxuK1xcdC5vcGVuID0gc2ltcGxlX29wZW4sXFxuK1xcdC5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlayxcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkIHhzd2FwX2RlYnVnZnNfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4re1xcbitcXHRjaGFyIG5hbWVbMzJdO1xcbitcXG4rXFx0aWYgKCF4c3dhcF9kZWJ1Z2ZzX3Jvb3QpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXFxcInR5cGUlZF9jbHVzdGVyX2xpbWl0XFxcIiwgc2ktXFx1MDAzZXR5cGUpO1xcbitcXHRzaS1cXHUwMDNlZGVidWdmc19lbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDY0NCwgeHN3YXBfZGVidWdmc19yb290LFxcbitcXHRcXHRcXHRcXHRcXHRcXHRzaSwgXFx1MDAyNnhzd2FwX2RlYnVnZnNfZm9wcyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHhzd2FwX2RlYnVnZnNfZGVsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4re1xcbitcXHRkZWJ1Z2ZzX3JlbW92ZShzaS1cXHUwMDNlZGVidWdmc19lbnRyeSk7XFxuK1xcdHNpLVxcdTAwM2VkZWJ1Z2ZzX2VudHJ5ID0gTlVMTDtcXG4rfVxcbitcXG4rXFxuKyNlbmRpZlxcbiBcXG4gc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpO1xcbkBAIC02Myw5ICsxNzUsOSBAQCBzdGF0aWMgdm9pZCBtb3ZlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiAgKlxcbiAgKiBBbHNvIHByb3RlY3RzIHN3YXBfYWN0aXZlX2hlYWQgdG90YWxfc3dhcF9wYWdlcywgYW5kIHRoZSBTV1BfV1JJVEVPSyBmbGFnLlxcbiAgKi9cXG4tc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spO1xcbiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlcztcXG4gYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xcbithdG9taWNfdCBucl9yZWFsX3N3YXBmaWxlcztcXG4gLypcXG4gICogU29tZSBtb2R1bGVzIHVzZSBzd2FwcGFibGUgb2JqZWN0cyBhbmQgbWF5IHRyeSB0byBzd2FwIHRoZW0gb3V0IHVuZGVyXFxuICAqIG1lbW9yeSBwcmVzc3VyZSAodmlhIHRoZSBzaHJpbmtlcikuIEJlZm9yZSBkb2luZyBzbywgdGhleSBtYXkgd2lzaCB0b1xcbkBAIC02MDksNiArNzIxLDEwIEBAIHN0YXRpYyB2b2lkIF9fZnJlZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvXFxuIFxcdHN3YXBfY2x1c3Rlcl9mcmVlX3RhYmxlKGNpKTtcXG4gXFx0bW92ZV9jbHVzdGVyKHNpLCBjaSwgXFx1MDAyNnNpLVxcdTAwM2VmcmVlX2NsdXN0ZXJzLCBDTFVTVEVSX0ZMQUdfRlJFRSk7XFxuIFxcdGNpLVxcdTAwM2VvcmRlciA9IDA7XFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcXG4rXFx0eHN3YXBfdXBkYXRlX2ZyZWVfdGFpbChzaSwgY2kgLSBzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvKTtcXG4rXFx0c2NoZWR1bGVfd29yayhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcXG4rI2VuZGlmXFxuIH1cXG4gXFxuIC8qXFxuQEAgLTk1NSw2ICsxMDcxLDkgQEAgc3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIFxcdGlmIChjbHVzdGVyX2lzX2VtcHR5KGNpKSlcXG4gXFx0XFx0Y2ktXFx1MDAzZW9yZGVyID0gb3JkZXI7XFxuIFxcdGNpLVxcdTAwM2Vjb3VudCArPSBucl9wYWdlcztcXG4rI2lmZGVmIENPTkZJR19YU1dBUFxcbitcXHR4c3dhcF90cmltX2ZyZWVfdGFpbChzaSwgY2x1c3Rlcl9pbmRleChzaSwgY2kpKTtcXG4rI2VuZGlmXFxuIFxcdHN3YXBfcmFuZ2VfYWxsb2Moc2ksIG5yX3BhZ2VzKTtcXG4gXFxuIFxcdHJldHVybiB0cnVlO1xcbkBAIC0xMTg1LDYgKzEzMDQsNTAgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0XFx0aWYgKGZvdW5kKVxcbiBcXHRcXHRcXHRnb3RvIGRvbmU7XFxuIFxcdH1cXG4rXFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcXG4rXFx0LypcXG4rXFx0ICogRm9yIHhzd2FwOiBpZiBubyBmcmVlIGNsdXN0ZXIgd2FzIGZvdW5kIGFuZCBtb3JlIGNsdXN0ZXJzXFxuK1xcdCAqIGNhbiBiZSBtYXBwZWQsIGdyb3cgdGhlIGNsdXN0ZXJfaW5mbyBhcnJheSBhbmQgcmV0cnkuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWZvdW5kIFxcdTAwMjZcXHUwMDI2IChzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfWFNXQVApIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCkgXFx1MDAzYyBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgbGlzdF9lbXB0eShcXHUwMDI2c2ktXFx1MDAzZWZyZWVfY2x1c3RlcnMpKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnJfbmV3ID0gbWluKFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnMpIC1cXG4rXFx0XFx0XFx0XFx0XFx0ICBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCksXFxuK1xcdFxcdFxcdFxcdFxcdCAgWFNXQVBfR1JPV19DTFVTVEVSUyk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdFxcdGlmICgheHN3YXBfbWFwX2NsdXN0ZXJzKHNpLCBzdGFydCwgbnJfbmV3KSkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFkZGVkID0gMDtcXG4rXFxuK1xcdFxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbitcXHRcXHRcXHRmb3IgKGkgPSBzdGFydDsgaSBcXHUwMDNjIHN0YXJ0ICsgbnJfbmV3OyBpKyspIHtcXG4rXFx0XFx0XFx0XFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IFxcdTAwMjZzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvW2ldO1xcbitcXHRcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4rXFx0XFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0XFx0ICogQSBjb25jdXJyZW50IGdyb3dlciBtYXkgaGF2ZSBhbHJlYWR5IGFkZGVkXFxuK1xcdFxcdFxcdFxcdCAqIHRoZXNlIGNsdXN0ZXJzIHRvIHRoZSBmcmVlIGxpc3QuICBPbmx5IGFkZFxcbitcXHRcXHRcXHRcXHQgKiBjbHVzdGVycyB0aGF0IGFyZSBzdGlsbCBvZmYtbGlzdCAoTk9ORSkuXFxuK1xcdFxcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRcXHRpZiAoY2ktXFx1MDAzZWZsYWdzID09IENMVVNURVJfRkxBR19OT05FKSB7XFxuK1xcdFxcdFxcdFxcdFxcdGNpLVxcdTAwM2VmbGFncyA9IENMVVNURVJfRkxBR19GUkVFO1xcbitcXHRcXHRcXHRcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZjaS1cXHUwMDNlbGlzdCwgXFx1MDAyNnNpLVxcdTAwM2VmcmVlX2NsdXN0ZXJzKTtcXG4rXFx0XFx0XFx0XFx0XFx0YWRkZWQrKztcXG4rXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2Y2ktXFx1MDAzZWxvY2spO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdFxcdFdSSVRFX09OQ0Uoc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCxcXG4rXFx0XFx0XFx0XFx0ICAgUkVBRF9PTkNFKHNpLVxcdTAwM2Vucl9mcmVlX3RhaWwpICsgbnJfbmV3KTtcXG4rXFxuK1xcdFxcdFxcdC8qIFJldHJ5IGFsbG9jYXRpb24gZnJvbSB0aGUgZnJlZSBsaXN0ICovXFxuK1xcdFxcdFxcdGZvdW5kID0gYWxsb2Nfc3dhcF9zY2FuX2xpc3Qoc2ksIFxcdTAwMjZzaS1cXHUwMDNlZnJlZV9jbHVzdGVycyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIGZvbGlvLCBmYWxzZSk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbisjZW5kaWZcXG4gZG9uZTpcXG4gXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxcbiBcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xcbkBAIC0xMjIzLDYgKzEzODYsOCBAQCBzdGF0aWMgdm9pZCBkZWxfZnJvbV9hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb2ZmKVxcbiBcXHRcXHRcXHRnb3RvIHNraXA7XFxuIFxcdH1cXG4gXFxuK1xcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkpXFxuK1xcdFxcdGF0b21pY19zdWIoMSwgXFx1MDAyNm5yX3JlYWxfc3dhcGZpbGVzKTtcXG4gXFx0cGxpc3RfZGVsKFxcdTAwMjZzaS1cXHUwMDNlYXZhaWxfbGlzdCwgXFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XFxuIFxcbiBza2lwOlxcbkBAIC0xMjY1LDYgKzE0MzAsOCBAQCBzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxcbiBcXHR9XFxuIFxcbiBcXHRwbGlzdF9hZGQoXFx1MDAyNnNpLVxcdTAwM2VhdmFpbF9saXN0LCBcXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcXG4rXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKSlcXG4rXFx0XFx0YXRvbWljX2FkZCgxLCBcXHUwMDI2bnJfcmVhbF9zd2FwZmlsZXMpO1xcbiBcXG4gc2tpcDpcXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XFxuQEAgLTI5NTIsNiArMzExOSwxOSBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfZXh0ZW50cyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLFxcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy1cXHUwMDNlaG9zdDtcXG4gXFx0aW50IHJldDtcXG4gXFxuK1xcdGlmIChzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKSB7XFxuK1xcdFxcdCpzcGFuID0gMDtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogeHN3YXAgZGV2aWNlcyBoYXZlIG5vIGJhY2tpbmcgYmxvY2sgZGV2aWNlIGFuZFxcbitcXHRcXHQgKiBwaHlzaWNhbCB3cml0ZW91dCBpcyBza2lwcGVkIGluIHN3YXBfd3JpdGVvdXQoKSxcXG4rXFx0XFx0ICogYnV0IHNpcy1cXHUwMDNlb3BzIG11c3Qgc3RpbGwgYmUgc2V0IHNvIHRoYXQgY2FsbGVyc1xcbitcXHRcXHQgKiBsaWtlIHNocmlua19mb2xpb19saXN0KCkgY2FuIHNhZmVseSBkZXJlZmVyZW5jZVxcbitcXHRcXHQgKiBvcHMtXFx1MDAzZWZsYWdzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0c2lzLVxcdTAwM2VvcHMgPSBcXHUwMDI2c3dhcF9iZGV2X29wcztcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuIFxcdHJldCA9IHNpb19wb29sX2luaXQoKTtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG5AQCAtMzAyMywyMCArMzIwMyw1MCBAQCBzdGF0aWMgdm9pZCB3YWl0X2Zvcl9hbGxvY2F0aW9uKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4gXFxuIFxcdEJVR19PTihzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfV1JJVEVPSyk7XFxuIFxcbisjaWZkZWYgQ09ORklHX1hTV0FQXFxuK1xcdC8qXFxuK1xcdCAqIHhzd2FwIGNsdXN0ZXJzIGJleW9uZCBucl9jbHVzdGVyc19tYXBwZWQgaGF2ZSBiZWVuIHVubWFwcGVkXFxuK1xcdCAqIGJ5IHRoZSBzaHJpbmtlciBhbmQgdGhlaXIgdm1hbGxvYyBwYWdlcyBhcmUgbm8gbG9uZ2VyXFxuK1xcdCAqIGFjY2Vzc2libGUuICBPbmx5IGl0ZXJhdGUgb3ZlciBjdXJyZW50bHkgbWFwcGVkIGNsdXN0ZXJzLlxcbitcXHQgKi9cXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUClcXG4rXFx0XFx0ZW5kID0gbWluKGVuZCwgUkVBRF9PTkNFKHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQpICpcXG4rXFx0XFx0XFx0ICBTV0FQRklMRV9DTFVTVEVSKTtcXG4rI2VuZGlmXFxuK1xcbiBcXHRmb3IgKG9mZnNldCA9IDA7IG9mZnNldCBcXHUwMDNjIGVuZDsgb2Zmc2V0ICs9IFNXQVBGSUxFX0NMVVNURVIpIHtcXG4gXFx0XFx0Y2kgPSBzd2FwX2NsdXN0ZXJfbG9jayhzaSwgb2Zmc2V0KTtcXG4gXFx0XFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XFxuIFxcdH1cXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcXG4tXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcXG4rc3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIHtcXG4rXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8gPSBzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvO1xcbitcXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzID0gc2ktXFx1MDAzZW1heDtcXG4gXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4tXFx0aW50IGksIG5yX2NsdXN0ZXJzID0gRElWX1JPVU5EX1VQKG1heHBhZ2VzLCBTV0FQRklMRV9DTFVTVEVSKTtcXG4rXFx0aW50IGksIG5yX2NsdXN0ZXJzO1xcbiBcXG4gXFx0aWYgKCFjbHVzdGVyX2luZm8pXFxuIFxcdFxcdHJldHVybjtcXG4rXFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkge1xcbitcXHRcXHR4c3dhcF9kZWJ1Z2ZzX2RlbChzaSk7XFxuK1xcdFxcdGNhbmNlbF93b3JrX3N5bmMoXFx1MDAyNnNpLVxcdTAwM2V4c3dhcF9zaHJpbmtfd29yayk7XFxuK1xcdFxcdC8qIFVubWFwIGFsbCBtYXBwZWQgY2x1c3RlcnMgYW5kIGZyZWUgdGhlIFZNX1NQQVJTRSBhcmVhICovXFxuK1xcdFxcdGlmIChzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkIFxcdTAwM2UgMClcXG4rXFx0XFx0XFx0eHN3YXBfdW5tYXBfY2x1c3RlcnMoc2ksIDAsIHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQpO1xcbitcXHRcXHRmcmVlX3ZtX2FyZWEoc2ktXFx1MDAzZWNsdXN0ZXJfdm0pO1xcbitcXHRcXHRzaS1cXHUwMDNlY2x1c3Rlcl92bSA9IE5VTEw7XFxuK1xcdFxcdHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXggPSAwO1xcbitcXHRcXHRzaS1cXHUwMDNlbnJfY2x1c3RlcnMgPSAwO1xcbitcXHRcXHRzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkID0gMDtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuKyNlbmRpZlxcbitcXG4rXFx0bnJfY2x1c3RlcnMgPSBESVZfUk9VTkRfVVAobWF4cGFnZXMsIFNXQVBGSUxFX0NMVVNURVIpO1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfY2x1c3RlcnM7IGkrKykge1xcbiBcXHRcXHRjaSA9IGNsdXN0ZXJfaW5mbyArIGk7XFxuIFxcdFxcdC8qIENsdXN0ZXIgd2l0aCBiYWQgbWFya3MgY291bnQgd2lsbCBoYXZlIGEgcmVtYWluaW5nIHRhYmxlICovXFxuQEAgLTMwNzUsMTEgKzMyODUsOSBAQCBzdGF0aWMgdm9pZCBmbHVzaF9wZXJjcHVfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4gU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxcbiB7XFxuIFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwID0gTlVMTDtcXG4tXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87XFxuIFxcdHN0cnVjdCBmaWxlICpzd2FwX2ZpbGUsICp2aWN0aW07XFxuIFxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nO1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbi1cXHR1bnNpZ25lZCBpbnQgbWF4cGFnZXM7XFxuIFxcdGludCBlcnIsIGZvdW5kID0gMDtcXG4gXFxuIFxcdGlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSlcXG5AQCAtMzE2MCw3ICszMzY4LDggQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxcbiBcXG4gXFx0ZGVzdHJveV9zd2FwX2V4dGVudHMocCwgcC1cXHUwMDNlc3dhcF9maWxlKTtcXG4gXFxuLVxcdGlmICghKHAtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxcbitcXHRpZiAoIShwLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICEocC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfU09MSURTVEFURSkpXFxuIFxcdFxcdGF0b21pY19kZWMoXFx1MDAyNm5yX3JvdGF0ZV9zd2FwKTtcXG4gXFxuIFxcdG11dGV4X2xvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuQEAgLTMxNzAsMTAgKzMzNzksNiBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXFxuIFxcbiBcXHRzd2FwX2ZpbGUgPSBwLVxcdTAwM2Vzd2FwX2ZpbGU7XFxuIFxcdHAtXFx1MDAzZXN3YXBfZmlsZSA9IE5VTEw7XFxuLVxcdG1heHBhZ2VzID0gcC1cXHUwMDNlbWF4O1xcbi1cXHRjbHVzdGVyX2luZm8gPSBwLVxcdTAwM2VjbHVzdGVyX2luZm87XFxuLVxcdHAtXFx1MDAzZW1heCA9IDA7XFxuLVxcdHAtXFx1MDAzZWNsdXN0ZXJfaW5mbyA9IE5VTEw7XFxuIFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwLVxcdTAwM2Vsb2NrKTtcXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuIFxcdGFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC1cXHUwMDNldHlwZSk7XFxuQEAgLTMxODEsNyArMzM4Niw5IEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcXG4gXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzd2Fwb25fbXV0ZXgpO1xcbiBcXHRrZnJlZShwLVxcdTAwM2VnbG9iYWxfY2x1c3Rlcik7XFxuIFxcdHAtXFx1MDAzZWdsb2JhbF9jbHVzdGVyID0gTlVMTDtcXG4tXFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhjbHVzdGVyX2luZm8sIG1heHBhZ2VzKTtcXG4rXFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhwKTtcXG4rXFx0cC1cXHUwMDNlbWF4ID0gMDtcXG4rXFx0cC1cXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcXG4gXFxuIFxcdGlub2RlID0gbWFwcGluZy1cXHUwMDNlaG9zdDtcXG4gXFxuQEAgLTMyNzAsNiArMzQ3NywxOSBAQCBzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxcbiBcXHRtdXRleF91bmxvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuIH1cXG4gXFxuK3N0YXRpYyBjb25zdCBjaGFyICpzd2FwX3R5cGVfc3RyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4re1xcbitcXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNpLVxcdTAwM2Vzd2FwX2ZpbGU7XFxuK1xcbitcXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKVxcbitcXHRcXHRyZXR1cm4gXFxcInhzd2FwXFxcXHRcXFwiO1xcbitcXG4rXFx0aWYgKFNfSVNCTEsoZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9tb2RlKSlcXG4rXFx0XFx0cmV0dXJuIFxcXCJwYXJ0aXRpb25cXFwiO1xcbitcXG4rXFx0cmV0dXJuIFxcXCJmaWxlXFxcXHRcXFwiO1xcbit9XFxuK1xcbiBzdGF0aWMgaW50IHN3YXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXFxuIHtcXG4gXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gdjtcXG5AQCAtMzI4OSw4ICszNTA5LDcgQEAgc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxcbiBcXHRsZW4gPSBzZXFfZmlsZV9wYXRoKHN3YXAsIGZpbGUsIFxcXCIgXFxcXHRcXFxcblxcXFxcXFxcXFxcIik7XFxuIFxcdHNlcV9wcmludGYoc3dhcCwgXFxcIiUqcyVzXFxcXHQlbHVcXFxcdCVzJWx1XFxcXHQlcyVkXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRsZW4gXFx1MDAzYyA0MCA/IDQwIC0gbGVuIDogMSwgXFxcIiBcXFwiLFxcbi1cXHRcXHRcXHRTX0lTQkxLKGZpbGVfaW5vZGUoZmlsZSktXFx1MDAzZWlfbW9kZSkgP1xcbi1cXHRcXHRcXHRcXHRcXFwicGFydGl0aW9uXFxcIiA6IFxcXCJmaWxlXFxcXHRcXFwiLFxcbitcXHRcXHRcXHRzd2FwX3R5cGVfc3RyKHNpKSxcXG4gXFx0XFx0XFx0Ynl0ZXMsIGJ5dGVzIFxcdTAwM2MgMTAwMDAwMDAgPyBcXFwiXFxcXHRcXFwiIDogXFxcIlxcXCIsXFxuIFxcdFxcdFxcdGludXNlLCBpbnVzZSBcXHUwMDNjIDEwMDAwMDAwID8gXFxcIlxcXFx0XFxcIiA6IFxcXCJcXFwiLFxcbiBcXHRcXHRcXHRzaS1cXHUwMDNlcHJpbyk7XFxuQEAgLTM0NjgsNiArMzY4Nyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzO1xcbiBcXHR1bnNpZ25lZCBsb25nIHN3YXBmaWxlcGFnZXM7XFxuIFxcdHVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlO1xcbitcXHRsb2ZmX3Qgc2l6ZTtcXG4gXFxuIFxcdGlmIChtZW1jbXAoXFxcIlNXQVBTUEFDRTJcXFwiLCBzd2FwX2hlYWRlci1cXHUwMDNlbWFnaWMubWFnaWMsIDEwKSkge1xcbiBcXHRcXHRwcl9lcnIoXFxcIlVuYWJsZSB0byBmaW5kIHN3YXAtc3BhY2Ugc2lnbmF0dXJlXFxcXG5cXFwiKTtcXG5AQCAtMzUxMCw3ICszNzMwLDE2IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXG4gXFx0aWYgKCFtYXhwYWdlcylcXG4gXFx0XFx0cmV0dXJuIDA7XFxuLVxcdHN3YXBmaWxlcGFnZXMgPSBpX3NpemVfcmVhZChpbm9kZSkgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFxuK1xcdHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7XFxuK1xcdGlmIChzaXplID09IFBBR0VfU0laRSkge1xcbitcXHRcXHQvKiB4c3dhcDogYSBzd2FwIGRldmljZSB3aXRoIG5vIGJhY2tpbmcgc3RvcmFnZSAqL1xcbitcXHRcXHRzaS1cXHUwMDNlYmRldiA9IE5VTEw7XFxuK1xcdFxcdHNpLVxcdTAwM2VmbGFncyB8PSBTV1BfWFNXQVAgfCBTV1BfU09MSURTVEFURTtcXG4rXFx0XFx0cmV0dXJuIG1heHBhZ2VzO1xcbitcXHR9XFxuK1xcbitcXHRzd2FwZmlsZXBhZ2VzID0gc2l6ZSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiBcXHRpZiAoc3dhcGZpbGVwYWdlcyBcXHUwMDI2XFx1MDAyNiBtYXhwYWdlcyBcXHUwMDNlIHN3YXBmaWxlcGFnZXMpIHtcXG4gXFx0XFx0cHJfd2FybihcXFwiU3dhcCBhcmVhIHNob3J0ZXIgdGhhbiBzaWduYXR1cmUgaW5kaWNhdGVzXFxcXG5cXFwiKTtcXG4gXFx0XFx0cmV0dXJuIDA7XFxuQEAgLTM1MjMsNiArMzc1MiwzNjUgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIFxcdHJldHVybiBtYXhwYWdlcztcXG4gfVxcbiBcXG4rI2lmZGVmIENPTkZJR19YU1dBUFxcbitzdGF0aWMgaW50IHhzd2FwX21hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuK1xcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLVxcdTAwM2VjbHVzdGVyX2luZm8gK1xcbitcXHRcXHRcXHRcXHQgICAoc2l6ZV90KXN0YXJ0X2lkeCAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pO1xcbitcXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciArIChzaXplX3QpbnIgKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTtcXG4rXFx0LypcXG4rXFx0ICogdm1fYXJlYV9tYXBfcGFnZXMoKSByZXF1aXJlcyB0aGF0IHN0YXJ0IGFuZCBlbmQgYmUgcGFnZS1hbGlnbmVkLlxcbitcXHQgKiBJZiBzdGFydF9hZGRyIGZhbGxzIHdpdGhpbiBhIHBhZ2UgdGhhdCB3YXMgYWxyZWFkeSBtYXBwZWQgYnkgYVxcbitcXHQgKiBwcmV2aW91cyBiYXRjaCAoZ3JvdyBwYXRoKSwgcm91bmQgaXQgdXAgdG8gc2tpcCB0aGUgYWxyZWFkeS1tYXBwZWRcXG4rXFx0ICogcGFydGlhbCBwYWdlLiAgQWx3YXlzIHJvdW5kIGVuZF9hZGRyIHVwIHNvIHRoZSB2bWFwIHBhZ2UgdGFibGUgd2Fsa1xcbitcXHQgKiB0ZXJtaW5hdGVzIGNvcnJlY3RseSAodGhlIHdhbGsgbG9vcCBleGl0cyB3aGVuIGFkZHIgPT0gZW5kLCBhbmQgYWRkclxcbitcXHQgKiBhZHZhbmNlcyBieSBQQUdFX1NJWkUgZWFjaCBpdGVyYXRpb24pLlxcbitcXHQgKi9cXG4rXFx0dW5zaWduZWQgbG9uZyB2bV9zdGFydCA9IFBBR0VfQUxJR04oc3RhcnRfYWRkcik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1fZW5kID0gUEFHRV9BTElHTihlbmRfYWRkcik7XFxuK1xcdHVuc2lnbmVkIGludCBub3JlY2xhaW1fZmxhZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnBhZ2VzO1xcbitcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcbitcXHRpZiAodm1fc3RhcnQgXFx1MDAzZT0gdm1fZW5kKSB7XFxuK1xcdFxcdC8qIEFsbCByZXF1ZXN0ZWQgY2x1c3RlcnMgZmFsbCB3aXRoaW4gYWxyZWFkeS1tYXBwZWQgcGFnZXMuICovXFxuK1xcdFxcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcXHUwMDNjIHN0YXJ0X2lkeCArIG5yOyBpKyspXFxuK1xcdFxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvW2ldLmxvY2spO1xcbitcXHRcXHRXUklURV9PTkNFKHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCArIG5yKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRucGFnZXMgPSAodm1fZW5kIC0gdm1fc3RhcnQpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBQcmV2ZW50IHJlY3Vyc2l2ZSByZWNsYWltOiB2bV9hcmVhX21hcF9wYWdlcygpIGludGVybmFsbHlcXG4rXFx0ICogYWxsb2NhdGVzIHBhZ2UgdGFibGVzIHdpdGggR0ZQX1BHVEFCTEVfS0VSTkVMLCB3aGljaCBsYWNrc1xcbitcXHQgKiBfX0dGUF9OT01FTUFMTE9DLiAgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSBlbnN1cmVzIHRob3NlXFxuK1xcdCAqIGFsbG9jYXRpb25zIGNhbm5vdCByZWN1cnNlIGludG8gc3dhcCBieSBkaXNhYmxpbmcgX19HRlBfRlMvSU8uXFxuK1xcdCAqL1xcbitcXHRub3JlY2xhaW1fZmxhZ3MgPSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpO1xcbitcXG4rXFx0cGFnZXMgPSBrbWFsbG9jX2FycmF5KG5wYWdlcywgc2l6ZW9mKCpwYWdlcyksXFxuK1xcdFxcdFxcdCAgICAgIF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHwgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghcGFnZXMpIHtcXG4rXFx0XFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnBhZ2VzOyBpKyspIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogX19HRlBfWkVSTyBpcyBjcml0aWNhbDogY2x1c3Rlcl9pbmZvIHN0cnVjdHMgY29udGFpbiBwb2ludGVyXFxuK1xcdFxcdCAqIGZpZWxkcyAoZXh0ZW5kX3RhYmxlLCB6ZXJvX2JpdG1hcCwgbWVtY2dfdGFibGUsIHRhYmxlKSB0aGF0XFxuK1xcdFxcdCAqIG11c3Qgc3RhcnQgYXMgTlVMTC4gIFdpdGhvdXQgemVyb2luZywgc3RhbGUgZGF0YSBmcm9tIGFcXG4rXFx0XFx0ICogcHJldmlvdXMgdXNlciBvZiB0aGUgcGFnZSB3b3VsZCBsb29rIGxpa2UgdmFsaWQgcG9pbnRlcnMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRwYWdlc1tpXSA9IGFsbG9jX3BhZ2UoX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfFxcbitcXHRcXHRcXHRcXHQgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XFxuK1xcdFxcdGlmICghcGFnZXNbaV0pXFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQ2hlY2sgaWYgdGhlIHRhcmdldCBwYWdlcyBhcmUgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50XFxuK1xcdCAqIGdyb3dlci4gIFdlIG11c3QgZG8gdGhpcyBhZnRlciBwYWdlIGFsbG9jYXRpb24gYmVjYXVzZVxcbitcXHQgKiBhbGxvY19wYWdlKEdGUF9LRVJORUwpIGNhbiBzbGVlcCwgb3BlbmluZyBhIHJhY2Ugd2luZG93LlxcbitcXHQgKiBJZiBzb21lb25lIGFscmVhZHkgbWFwcGVkIHRoZXNlIHBhZ2VzLCBmcmVlIG91cnMgYW5kIGNvbnRpbnVlLlxcbitcXHQgKi9cXG4rXFx0aWYgKGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoXFx1MDAyNmluaXRfbW0sIHZtX3N0YXJ0LFxcbitcXHRcXHRcXHRcXHRcXHQgdm1fZW5kIC0gdm1fc3RhcnQsXFxuK1xcdFxcdFxcdFxcdFxcdCB4c3dhcF9jaGVja19tYXBwZWQsIE5VTEwpKSB7XFxuK1xcdFxcdGkgPSBucGFnZXM7XFxuK1xcdFxcdGdvdG8gZmFpbF9ub3VubWFwO1xcbitcXHR9XFxuK1xcbitcXHRpbnQgZXJyID0gdm1fYXJlYV9tYXBfcGFnZXMoc2ktXFx1MDAzZWNsdXN0ZXJfdm0sIHZtX3N0YXJ0LCB2bV9lbmQsIHBhZ2VzKTtcXG4rXFx0aWYgKGVycikge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiAtRUJVU1kgbWVhbnMgdGhlIFBURXMgYXJlIGFscmVhZHkgcHJlc2VudDpcXG4rXFx0XFx0ICogYW5vdGhlciB0aHJlYWQgcmFjZWQgd2l0aCB1cyBhbmQgbWFwcGVkIHRoZVxcbitcXHRcXHQgKiBzYW1lIHBhZ2VzIGJldHdlZW4gb3VyIGNoZWNrIGFib3ZlIGFuZCB0aGlzXFxuK1xcdFxcdCAqIGNhbGwuICBUcmVhdCBhcyBzdWNjZXNzIOKAlCBmcmVlIG91ciB1bnVzZWRcXG4rXFx0XFx0ICogcGFnZXMgYW5kIGNvbnRpbnVlLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKGVyciA9PSAtRUJVU1kpIHtcXG4rXFx0XFx0XFx0aSA9IG5wYWdlcztcXG4rXFx0XFx0XFx0Z290byBmYWlsX25vdW5tYXA7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aSA9IG5wYWdlczsgLyogZnJlZSBhbGwgcGFnZXMgb24gZmFpbHVyZSAqL1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGtmcmVlKHBhZ2VzKTtcXG4rXFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcXG4rXFxuK1xcdC8qIEluaXRpYWxpemUgc3BpbmxvY2tzIGZvciBuZXdseSBtYXBwZWQgY2x1c3RlcnMgKi9cXG4rXFx0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFxcdTAwM2Mgc3RhcnRfaWR4ICsgbnI7IGkrKylcXG4rXFx0XFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNnNpLVxcdTAwM2VjbHVzdGVyX2luZm9baV0ubG9jayk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxcbitcXHQgKi9cXG4rXFx0V1JJVEVfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggKyBucik7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX2xvY2spO1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2ZhaWxfbm91bm1hcDpcXG4rXFx0LypcXG4rXFx0ICogUGFnZXMgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50IGdyb3dlci4gIEZyZWUgb3VyIHVudXNlZFxcbitcXHQgKiBwYWdlcywgdGhlbiBmYWxsIHRocm91Z2ggdG8gaW5pdGlhbGl6ZSBzcGlubG9ja3MuICBUaGUgdm1hbGxvY1xcbitcXHQgKiBQVEVzIG5vdyBwb2ludCB0byB0aGUgY29uY3VycmVudCBncm93ZXIncyBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdHdoaWxlIChpIFxcdTAwM2UgMCkge1xcbitcXHRcXHRpLS07XFxuK1xcdFxcdGlmIChwYWdlc1tpXSlcXG4rXFx0XFx0XFx0X19mcmVlX3BhZ2UocGFnZXNbaV0pO1xcbitcXHR9XFxuK1xcdGtmcmVlKHBhZ2VzKTtcXG4rXFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcXG4rXFxuK1xcdC8qIEluaXRpYWxpemUgc3BpbmxvY2tzIGZvciBuZXdseSBtYXBwZWQgY2x1c3RlcnMgKi9cXG4rXFx0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFxcdTAwM2Mgc3RhcnRfaWR4ICsgbnI7IGkrKylcXG4rXFx0XFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNnNpLVxcdTAwM2VjbHVzdGVyX2luZm9baV0ubG9jayk7XFxuK1xcbitcXHRXUklURV9PTkNFKHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCArIG5yKTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZmFpbDpcXG4rXFx0d2hpbGUgKGkgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGktLTtcXG4rXFx0XFx0aWYgKHBhZ2VzW2ldKVxcbitcXHRcXHRcXHRfX2ZyZWVfcGFnZShwYWdlc1tpXSk7XFxuK1xcdH1cXG4rXFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcXG4rXFx0a2ZyZWUocGFnZXMpO1xcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNnNpLVxcdTAwM2V4c3dhcF9sb2NrKTtcXG4rXFx0cmV0dXJuIC1FTk9NRU07XFxuK31cXG4rXFxuK3N0cnVjdCB4c3dhcF9wYWdlX2RhdGEge1xcbitcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xcbitcXHRpbnQgbnI7XFxuK1xcdGludCBtYXg7XFxuK307XFxuK1xcbitzdGF0aWMgaW50IHhzd2FwX2NvbGxlY3RfcGFnZShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRhdGEpXFxuK3tcXG4rXFx0c3RydWN0IHhzd2FwX3BhZ2VfZGF0YSAqeHBkID0gZGF0YTtcXG4rXFxuK1xcdGlmICghcHRlX3ByZXNlbnQoKnB0ZSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRpZiAoeHBkLVxcdTAwM2VuciBcXHUwMDNjIHhwZC1cXHUwMDNlbWF4KVxcbitcXHRcXHR4cGQtXFx1MDAzZXBhZ2VzW3hwZC1cXHUwMDNlbnIrK10gPSBwdGVfcGFnZSgqcHRlKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHhzd2FwX3VubWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNpLVxcdTAwM2VjbHVzdGVyX2luZm8gK1xcbitcXHRcXHRcXHRcXHQgICAoc2l6ZV90KXN0YXJ0X2lkeCAqIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pO1xcbitcXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciArIChzaXplX3QpbnIgKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTtcXG4rXFx0LypcXG4rXFx0ICogUm91bmQgdG8gcGFnZSBib3VuZGFyaWVzOiBzdGFydCB1cCAoc2tpcCBwYXJ0aWFsIHBhZ2UgdGhhdCBtYXlcXG4rXFx0ICogY29udGFpbiBjbHVzdGVycyBzdGlsbCBpbiB1c2UgYmVmb3JlIHN0YXJ0X2lkeCksIGVuZCB1cCBzbyB0aGVcXG4rXFx0ICogZW50aXJlIHJhbmdlIGlzIGNvdmVyZWQuICB2bV9hcmVhX3VubWFwX3BhZ2VzKCkgYW5kXFxuK1xcdCAqIGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoKSBvcGVyYXRlIG9uIHdob2xlIHBhZ2VzLlxcbitcXHQgKi9cXG4rXFx0dW5zaWduZWQgbG9uZyB2bV9zdGFydCA9IFBBR0VfQUxJR04oc3RhcnRfYWRkcik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdm1fZW5kID0gUEFHRV9BTElHTihlbmRfYWRkcik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2l6ZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBucGFnZXM7XFxuK1xcdHN0cnVjdCB4c3dhcF9wYWdlX2RhdGEgeHBkO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNnNpLVxcdTAwM2V4c3dhcF9sb2NrKTtcXG4rXFxuK1xcdGlmICh2bV9zdGFydCBcXHUwMDNlPSB2bV9lbmQpIHtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRzaXplID0gdm1fZW5kIC0gdm1fc3RhcnQ7XFxuK1xcdG5wYWdlcyA9IHNpemUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFdhbGsgdGhlIHBhZ2UgdGFibGUgdG8gY29sbGVjdCBwaHlzaWNhbCBwYWdlcyBiZWZvcmUgdW5tYXBwaW5nLlxcbitcXHQgKiB2bV9hcmVhX3VubWFwX3BhZ2VzKCkgb25seSBjbGVhcnMgUFRFcyBhbmQgZnJlZXMgaW50ZXJtZWRpYXRlXFxuK1xcdCAqIHBhZ2UgdGFibGUgcGFnZXMg4oCUIGl0IGRvZXMgbm90IGZyZWUgYmFja2luZyBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdHhwZC5wYWdlcyA9IGttYWxsb2NfYXJyYXkobnBhZ2VzLCBzaXplb2YoKnhwZC5wYWdlcyksIEdGUF9LRVJORUwpO1xcbitcXHRpZiAoeHBkLnBhZ2VzKSB7XFxuK1xcdFxcdHhwZC5uciA9IDA7XFxuK1xcdFxcdHhwZC5tYXggPSBucGFnZXM7XFxuK1xcdFxcdGFwcGx5X3RvX2V4aXN0aW5nX3BhZ2VfcmFuZ2UoXFx1MDAyNmluaXRfbW0sIHZtX3N0YXJ0LCBzaXplLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHhzd2FwX2NvbGxlY3RfcGFnZSwgXFx1MDAyNnhwZCk7XFxuK1xcdH1cXG4rXFxuK1xcdHZtX2FyZWFfdW5tYXBfcGFnZXMoc2ktXFx1MDAzZWNsdXN0ZXJfdm0sIHZtX3N0YXJ0LCB2bV9lbmQpO1xcbitcXG4rXFx0LyogRnJlZSB0aGUgY29sbGVjdGVkIGJhY2tpbmcgcGFnZXMgKi9cXG4rXFx0aWYgKHhwZC5wYWdlcykge1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgeHBkLm5yOyBpKyspXFxuK1xcdFxcdFxcdF9fZnJlZV9wYWdlKHhwZC5wYWdlc1tpXSk7XFxuK1xcdFxcdGtmcmVlKHhwZC5wYWdlcyk7XFxuK1xcdH1cXG4rXFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX2xvY2spO1xcbitcXG4rb3V0OlxcbitcXHQvKlxcbitcXHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxcbitcXHQgKi9cXG4rXFx0V1JJVEVfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHgpO1xcbit9XFxuK1xcbisvKlxcbisgKiBDYWxsYmFjayBmb3IgYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZSgpOiByZXR1cm4gMSB0byBzdG9wIGF0IHRoZVxcbisgKiBmaXJzdCBwcmVzZW50IFBURSwgc2lnbmFsbGluZyB0aGF0IHRoZSByYW5nZSBpcyBhbHJlYWR5IG1hcHBlZC5cXG4rICovXFxuK3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHRyZXR1cm4gMTtcXG4rfVxcbitcXG4rLypcXG4rICogTWFpbnRhaW4gc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCwgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgY2x1c3RlcnMgYXRcXG4rICogdGhlIHRhaWwgb2YgdGhlIG1hcHBlZCByYW5nZS4gIENhbGxlZCB3aGVuIGEgY2x1c3RlciBhdCBAZnJlZWRfaWR4IGlzXFxuKyAqIGZyZWVkLiAgUHJvdmlkZXMgTygxKSBzaHJpbmsgZGV0ZWN0aW9uOiBpZiBucl9mcmVlX3RhaWwgaXMgbm9uLXplcm8sXFxuKyAqIHRoZSB0YWlsIGNhbiBiZSB1bm1hcHBlZCB3aXRob3V0IHNjYW5uaW5nIGNsdXN0ZXJfaW5mb1tdLlxcbisgKlxcbisgKiBPbmx5IGluY3JlbWVudHMgd2hlbiBAZnJlZWRfaWR4IGlzIHRoZSBjbHVzdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGVcXG4rICogZXhpc3RpbmcgdGFpbCByZWdpb24uICBUaGVuIHNjYW5zIGJhY2t3YXJkcyBmb3IgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzXFxuKyAqIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwsIGJvdW5kZWQgYnkgWFNXQVBfR1JPV19DTFVTVEVSUyBhdCBhIHRpbWUuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB4c3dhcF91cGRhdGVfZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBmcmVlZF9pZHgpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9tYXBwZWQsIG5yX3RhaWwsIHRpZCwgaTtcXG4rXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4rXFxuK1xcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG5yX21hcHBlZCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcXG4rXFx0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfZnJlZV90YWlsKTtcXG4rXFxuK1xcdC8qIFByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHNocmluayB0aGF0IHJhY2VzIHBhc3QgdXMgKi9cXG4rXFx0aWYgKG5yX3RhaWwgXFx1MDAzZT0gbnJfbWFwcGVkKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHR0aWQgPSBucl9tYXBwZWQgLSBucl90YWlsIC0gMTtcXG4rXFxuK1xcdC8qIE9ubHkgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0YWlsIHJlZ2lvbiBjb3VudHMgKi9cXG4rXFx0aWYgKGZyZWVkX2lkeCAhPSB0aWQpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG5yX3RhaWwrKztcXG4rXFx0V1JJVEVfT05DRShzaS1cXHUwMDNlbnJfZnJlZV90YWlsLCBucl90YWlsKTtcXG4rXFxuK1xcdC8qIEV4dGVuZDogaW5jbHVkZSBhbHJlYWR5LWZyZWUgY2x1c3RlcnMgbm93IGNvbm5lY3RlZCB0byB0aGUgdGFpbCAqL1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUzsgaSsrKSB7XFxuK1xcdFxcdG5yX21hcHBlZCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcXG4rXFx0XFx0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfZnJlZV90YWlsKTtcXG4rXFx0XFx0aWYgKG5yX3RhaWwgXFx1MDAzZT0gbnJfbWFwcGVkIC0gMSlcXG4rXFx0XFx0XFx0YnJlYWs7IC8qIHJlYWNoZWQgY2x1c3RlciAwICovXFxuK1xcdFxcdHRpZCA9IG5yX21hcHBlZCAtIG5yX3RhaWwgLSAxO1xcbitcXHRcXHRjaSA9IFxcdTAwMjZzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvW3RpZF07XFxuK1xcbitcXHRcXHRpZiAoUkVBRF9PTkNFKGNpLVxcdTAwM2Vjb3VudCkgfHxcXG4rXFx0XFx0ICAgIFJFQURfT05DRShjaS1cXHUwMDNlZmxhZ3MpICE9IENMVVNURVJfRkxBR19GUkVFKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0bnJfdGFpbCsrO1xcbitcXHRcXHRXUklURV9PTkNFKHNpLVxcdTAwM2Vucl9mcmVlX3RhaWwsIG5yX3RhaWwpO1xcbitcXHR9XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRyaW0gc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCB3aGVuIGEgY2x1c3RlciBpbiB0aGUgdGFpbCByZWdpb24gaXMgYWxsb2NhdGVkLlxcbisgKiBAaWR4OiBpbmRleCBvZiB0aGUgY2x1c3RlciBiZWluZyBhbGxvY2F0ZWQuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB4c3dhcF90cmltX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGxvbmcgaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnJfbWFwcGVkLCBucl90YWlsLCB0YWlsX3N0YXJ0O1xcbitcXG4rXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1hTV0FQKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LypcXG4rXFx0ICogbnJfY2x1c3RlcnNfbWFwcGVkIGFuZCBucl9mcmVlX3RhaWwgYXJlIHJlYWQgbG9ja2xlc3NseTtcXG4rXFx0ICogY29uY3VycmVudCB1cGRhdGVzIG1heSBjYXVzZSBucl9mcmVlX3RhaWwgdG8gYmUgdHJpbW1lZFxcbitcXHQgKiBzbGlnaHRseSBsZXNzIHRoYW4gaWRlYWxseSwgd2hpY2ggaXMgaGFybWxlc3MuXFxuK1xcdCAqL1xcbitcXHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XFxuK1xcdG5yX3RhaWwgPSBSRUFEX09OQ0Uoc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCk7XFxuK1xcdHRhaWxfc3RhcnQgPSBucl9tYXBwZWQgLSBucl90YWlsO1xcbitcXHRpZiAoaWR4IFxcdTAwM2U9IHRhaWxfc3RhcnQpXFxuK1xcdFxcdFdSSVRFX09OQ0Uoc2ktXFx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfbWFwcGVkIC0gaWR4IC0gMSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHhzd2FwX3Nocmlua193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBjb250YWluZXJfb2Yod29yayxcXG4rXFx0XFx0XFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QsIHhzd2FwX3Nocmlua193b3JrKTtcXG4rXFx0eHN3YXBfdHJ5X3NocmluayhzaSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRyeSB0byBzaHJpbmsgdGhlIGNsdXN0ZXJfaW5mbyB0YWlsLiAgVXNlcyBzaS1cXHUwMDNlbnJfZnJlZV90YWlsIHdoaWNoXFxuKyAqIGlzIG1haW50YWluZWQgaW5jcmVtZW50YWxseSBkdXJpbmcgYWxsb2MvZnJlZSDigJQgbm8gc2Nhbm5pbmcgbmVlZGVkLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgeHN3YXBfdHJ5X3NocmluayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9tYXBwZWQsIG5yX2NlaWxpbmcsIG5yX3RhaWwsIG5yX3VubWFwO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgaTtcXG4rXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4rXFxuK1xcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG5yX21hcHBlZCA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcXG4rXFx0bnJfY2VpbGluZyA9IFJFQURfT05DRShzaS1cXHUwMDNlbnJfY2x1c3RlcnMpO1xcbitcXHRucl90YWlsID0gUkVBRF9PTkNFKHNpLVxcdTAwM2Vucl9mcmVlX3RhaWwpO1xcbitcXG4rXFx0aWYgKG5yX21hcHBlZCBcXHUwMDNjPSBucl9jZWlsaW5nKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChucl90YWlsIFxcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0bnJfdW5tYXAgPSBtaW4ocm91bmRfZG93bihucl90YWlsLCBYU1dBUF9HUk9XX0NMVVNURVJTKSxcXG4rXFx0XFx0ICAgICAgIG5yX21hcHBlZCAtIG5yX2NlaWxpbmcpO1xcbitcXHRpZiAobnJfdW5tYXAgXFx1MDAzYyBYU1dBUF9HUk9XX0NMVVNURVJTKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHN0YXJ0X2lkeCA9IG5yX21hcHBlZCAtIG5yX3VubWFwO1xcbitcXG4rXFx0LyogVmVyaWZ5IHRoZSB0YWlsIGNsdXN0ZXJzIGFyZSBzdGlsbCBmcmVlIGJlZm9yZSB1bm1hcHBpbmcgKi9cXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuK1xcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcXHUwMDNjIG5yX21hcHBlZDsgaSsrKSB7XFxuK1xcdFxcdGNpID0gXFx1MDAyNnNpLVxcdTAwM2VjbHVzdGVyX2luZm9baV07XFxuK1xcdFxcdGlmIChjaS1cXHUwMDNlZmxhZ3MgIT0gQ0xVU1RFUl9GTEFHX0ZSRUUpIHtcXG4rXFx0XFx0XFx0bnJfdW5tYXAgPSBpIC0gc3RhcnRfaWR4O1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRsaXN0X2RlbChcXHUwMDI2Y2ktXFx1MDAzZWxpc3QpO1xcbitcXHRcXHRjaS1cXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORTtcXG4rXFx0fVxcbitcXHRzcGluX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbitcXG4rXFx0aWYgKG5yX3VubWFwIFxcdTAwM2MgWFNXQVBfR1JPV19DTFVTVEVSUylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0eHN3YXBfdW5tYXBfY2x1c3RlcnMoc2ksIHN0YXJ0X2lkeCwgbnJfdW5tYXApO1xcbitcXHRXUklURV9PTkNFKHNpLVxcdTAwM2Vucl9mcmVlX3RhaWwsIG5yX3RhaWwgLSBucl91bm1hcCk7XFxuK31cXG4rI2VuZGlmIC8qIENPTkZJR19YU1dBUCAqL1xcbitcXG4gc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRcXHRcXHQgICAgdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxcbiBcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcXG5AQCAtMzUzMiw2ICs0MTIwLDcwIEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0aW50IGVyciA9IC1FTk9NRU07XFxuIFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4gXFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9YU1dBUCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHNpemUgPSBQQUdFX0FMSUdOKG5yX2NsdXN0ZXJzICogc2l6ZW9mKCpjbHVzdGVyX2luZm8pKTtcXG4rXFx0XFx0c3RydWN0IHZtX3N0cnVjdCAqdm07XFxuK1xcbitcXHRcXHR2bSA9IGdldF92bV9hcmVhKHNpemUsIFZNX1NQQVJTRSk7XFxuK1xcdFxcdGlmICghdm0pXFxuK1xcdFxcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0XFx0Y2x1c3Rlcl9pbmZvID0gdm0tXFx1MDAzZWFkZHI7XFxuK1xcdFxcdHNpLVxcdTAwM2VjbHVzdGVyX3ZtID0gdm07XFxuK1xcdFxcdHNpLVxcdTAwM2Vucl9jbHVzdGVyc19tYXggPSBucl9jbHVzdGVycztcXG4rXFx0XFx0c2ktXFx1MDAzZW5yX2NsdXN0ZXJzID0gbnJfY2x1c3RlcnM7XFxuK1xcdFxcdHNpLVxcdTAwM2VjbHVzdGVyX2luZm8gPSBjbHVzdGVyX2luZm87XFxuK1xcbitcXHRcXHQvKiBNYXAgdGhlIGluaXRpYWwgY2h1bmsgKGF0IGxlYXN0IGNsdXN0ZXIgMCkgKi9cXG4rXFx0XFx0aWYgKHhzd2FwX21hcF9jbHVzdGVycyhzaSwgMCwgbWluX3QodW5zaWduZWQgbG9uZyxcXG4rXFx0XFx0XFx0XFx0XFx0WFNXQVBfR1JPV19DTFVTVEVSUywgbnJfY2x1c3RlcnMpKSlcXG4rXFx0XFx0XFx0Z290byBlcnJfZnJlZV92bTtcXG4rXFxuK1xcdFxcdC8qIHhzd2FwOiBvbmx5IGNsdXN0ZXIgMCBzbG90IDAgaXMgYmFkICovXFxuK1xcdFxcdGVyciA9IHN3YXBfY2x1c3Rlcl9zZXR1cF9iYWRfc2xvdChzaSwgY2x1c3Rlcl9pbmZvLCAwLCBmYWxzZSk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdGdvdG8gZXJyX3VubWFwO1xcbitcXG4rXFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2VmcmVlX2NsdXN0ZXJzKTtcXG4rXFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2VmdWxsX2NsdXN0ZXJzKTtcXG4rXFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2VkaXNjYXJkX2NsdXN0ZXJzKTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFNXQVBfTlJfT1JERVJTOyBpKyspIHtcXG4rXFx0XFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2Vub25mdWxsX2NsdXN0ZXJzW2ldKTtcXG4rXFx0XFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnNpLVxcdTAwM2VmcmFnX2NsdXN0ZXJzW2ldKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogTWFyayBtYXBwZWQgY2x1c3RlcnM6IGNsdXN0ZXIgMCBoYXMgMSBiYWQgc2xvdCwgcmVzdCBmcmVlICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkOyBpKyspIHtcXG4rXFx0XFx0XFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IFxcdTAwMjZjbHVzdGVyX2luZm9baV07XFxuK1xcbitcXHRcXHRcXHRpZiAoaSA9PSAwKSB7XFxuK1xcdFxcdFxcdFxcdGNpLVxcdTAwM2VmbGFncyA9IENMVVNURVJfRkxBR19OT05GVUxMO1xcbitcXHRcXHRcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZjaS1cXHUwMDNlbGlzdCwgXFx1MDAyNnNpLVxcdTAwM2Vub25mdWxsX2NsdXN0ZXJzWzBdKTtcXG4rXFx0XFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0XFx0Y2ktXFx1MDAzZWZsYWdzID0gQ0xVU1RFUl9GTEFHX0ZSRUU7XFxuK1xcdFxcdFxcdFxcdGxpc3RfYWRkX3RhaWwoXFx1MDAyNmNpLVxcdTAwM2VsaXN0LCBcXHUwMDI2c2ktXFx1MDAzZWZyZWVfY2x1c3RlcnMpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIEFsbCBtYXBwZWQgY2x1c3RlcnMgZXhjZXB0IGNsdXN0ZXIgMCBhcmUgZnJlZSBhdCB0aGUgdGFpbCAqL1xcbitcXHRcXHRzaS1cXHUwMDNlbnJfZnJlZV90YWlsID0gc2ktXFx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCAtIDE7XFxuK1xcbitcXHRcXHRtdXRleF9pbml0KFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxuK1xcdFxcdElOSVRfV09SSyhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX3Nocmlua193b3JrLCB4c3dhcF9zaHJpbmtfd29ya19mbik7XFxuK1xcdFxcdHhzd2FwX2RlYnVnZnNfYWRkKHNpKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitlcnJfdW5tYXA6XFxuK1xcdFxcdHhzd2FwX3VubWFwX2NsdXN0ZXJzKHNpLCAwLCBzaS1cXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcXG4rZXJyX2ZyZWVfdm06XFxuK1xcdFxcdGZyZWVfdm1fYXJlYShzaS1cXHUwMDNlY2x1c3Rlcl92bSk7XFxuK1xcdFxcdHNpLVxcdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcXG4rXFx0XFx0c2ktXFx1MDAzZWNsdXN0ZXJfaW5mbyA9IE5VTEw7XFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rI2VuZGlmIC8qIENPTkZJR19YU1dBUCAqL1xcbitcXG4gXFx0Y2x1c3Rlcl9pbmZvID0ga3Z6YWxsb2Nfb2JqcygqY2x1c3Rlcl9pbmZvLCBucl9jbHVzdGVycyk7XFxuIFxcdGlmICghY2x1c3Rlcl9pbmZvKVxcbiBcXHRcXHRnb3RvIGVycjtcXG5AQCAtMzU5OSw3ICs0MjUxLDcgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvID0gY2x1c3Rlcl9pbmZvO1xcbiBcXHRyZXR1cm4gMDtcXG4gZXJyOlxcbi1cXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xcbitcXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHNpKTtcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG5AQCAtMzgxOCw3ICs0NDcwLDcgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gXFx0c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyID0gTlVMTDtcXG4gXFx0aW5vZGUgPSBOVUxMO1xcbiBcXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhzaSwgc3dhcF9maWxlKTtcXG4tXFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzaS1cXHUwMDNlY2x1c3Rlcl9pbmZvLCBzaS1cXHUwMDNlbWF4KTtcXG4rXFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzaSk7XFxuIFxcdHNpLVxcdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xcbiBcXHQvKlxcbiBcXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xcbkBAIC0zOTMwLDcgKzQ1ODIsNiBAQCB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKVxcbiBzdGF0aWMgaW50IF9faW5pdCBzd2FwZmlsZV9pbml0KHZvaWQpXFxuIHtcXG4gXFx0c3dhcGZpbGVfbWF4aW11bV9zaXplID0gYXJjaF9tYXhfc3dhcGZpbGVfc2l6ZSgpO1xcbi1cXG4gXFx0LypcXG4gXFx0ICogT25jZSBhIGNsdXN0ZXIgaXMgZnJlZWQsIGl0J3Mgc3dhcCB0YWJsZSBjb250ZW50IGlzIHJlYWRcXG4gXFx0ICogb25seSwgYW5kIGFsbCBzd2FwIGNhY2hlIHJlYWRlcnMgKHN3YXBfY2FjaGVfKikgdmVyaWZpZXNcXG5AQCAtMzk0MCwxMiArNDU5MSwxNSBAQCBzdGF0aWMgaW50IF9faW5pdCBzd2FwZmlsZV9pbml0KHZvaWQpXFxuIFxcdFxcdHN3YXBfdGFibGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoXFxcInN3YXBfdGFibGVcXFwiLFxcbiBcXHRcXHRcXHRcXHQgICAgc2l6ZW9mKHN0cnVjdCBzd2FwX3RhYmxlKSxcXG4gXFx0XFx0XFx0XFx0ICAgIDAsIFNMQUJfUEFOSUMgfCBTTEFCX1RZUEVTQUZFX0JZX1JDVSwgTlVMTCk7XFxuLVxcbiAjaWZkZWYgQ09ORklHX01JR1JBVElPTlxcbiBcXHRpZiAoc3dhcGZpbGVfbWF4aW11bV9zaXplIFxcdTAwM2U9ICgxVUwgXFx1MDAzY1xcdTAwM2MgU1dQX01JR19UT1RBTF9CSVRTKSlcXG4gXFx0XFx0c3dhcF9taWdyYXRpb25fYWRfc3VwcG9ydGVkID0gdHJ1ZTtcXG4gI2VuZGlmXFx0LyogQ09ORklHX01JR1JBVElPTiAqL1xcbiBcXG4rI2lmZGVmIENPTkZJR19YU1dBUFxcbitcXHR4c3dhcF9kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoXFxcInhzd2FwXFxcIiwgTlVMTCk7XFxuKyNlbmRpZlxcbitcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gc3Vic3lzX2luaXRjYWxsKHN3YXBmaWxlX2luaXQpO1xcbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xcbmluZGV4IGY3YzljODlmNjQ0OWMuLjYxNzg0NjVkMDU4MzcgMTAwNjQ0XFxuLS0tIGEvbW0venN3YXAuY1xcbisrKyBiL21tL3pzd2FwLmNcXG5AQCAtOTk4LDcgKzk5OCwxMiBAQCBzdGF0aWMgaW50IHpzd2FwX3dyaXRlYmFja19lbnRyeShzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LFxcbiBcXHQvKiB0cnkgdG8gYWxsb2NhdGUgc3dhcCBjYWNoZSBmb2xpbyAqL1xcbiBcXHRzaSA9IGdldF9zd2FwX2RldmljZShzd3BlbnRyeSk7XFxuIFxcdGlmICghc2kpXFxuLVxcdFxcdHJldHVybiAtRUVYSVNUO1xcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFxuK1xcdGlmIChzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfWFNXQVApIHtcXG4rXFx0XFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4gXFxuIFxcdG1wb2wgPSBnZXRfdGFza19wb2xpY3koY3VycmVudCk7XFxuIFxcdGZvbGlvID0gc3dhcF9jYWNoZV9hbGxvY19mb2xpbyhzd3BlbnRyeSwgR0ZQX0tFUk5FTCwgQklUKDApLCBOVUxMLCBtcG9sLFxcbkBAIC0xNTM1LDcgKzE1NDAsNyBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIFxcdHpzd2FwX3Bvb2xfcHV0KHBvb2wpO1xcbiBwdXRfb2JqY2c6XFxuIFxcdG9ial9jZ3JvdXBfcHV0KG9iamNnKTtcXG4tXFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgenN3YXBfcG9vbF9yZWFjaGVkX2Z1bGwpXFxuK1xcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsIFxcdTAwMjZcXHUwMDI2IGF0b21pY19yZWFkKFxcdTAwMjZucl9yZWFsX3N3YXBmaWxlcykpXFxuIFxcdFxcdHF1ZXVlX3dvcmsoc2hyaW5rX3dxLCBcXHUwMDI2enN3YXBfc2hyaW5rX3dvcmspO1xcbiBjaGVja19vbGQ6XFxuIFxcdC8qXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE0OjM5LjQ3ODY0NDM2MloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjYxMDc3NzgxMzYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlhTV0FQXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInhzd2FwX21heF9jbHVzdGVyc193cml0ZVwiLFxuICAgIFwieHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRcIixcbiAgICBcInhzd2FwX3Nocmlua193b3JrX2ZuXCIsXG4gICAgXCJ4c3dhcF9jaGVja19tYXBwZWRcIixcbiAgICBcInhzd2FwX2NvbGxlY3RfcGFnZVwiLFxuICAgIFwieHN3YXBfbWFwX2NsdXN0ZXJzXCIsXG4gICAgXCJ4c3dhcF91bm1hcF9jbHVzdGVyc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlICh4c3dhcCkgdGhhdCBkZWNvdXBsZXMgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gSXQgdXNlcyBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgZm9yIGNsdXN0ZXIgaW5mbyB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzIGR5bmFtaWNhbGx5LiBUaGlzIGFkZHMgbmV3IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyBmb3Igc3dhcCBtYW5hZ2VtZW50LCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHdvcmtxdWV1ZSBmb3Igc2hyaW5raW5nLiBJdCBpcyBmdW5jdGlvbmFsIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAyM2I4NjVmM2M0OTY3ZDIyN2U2OWUzOTIwZmM0MjU3NDU5ZmJmYzQyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBBdWcgNSAwOToxNDozNiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcbmluZGV4IDQ1ZjMwMWQ3M2UyYWUuLmE1YjMyMzM3NDc2OWMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcbkBAIC0yMDcsNiArMjA3LDcgQEAgZW51bSB7XG4gXHRTV1BfU1RBQkxFX1dSSVRFUyA9ICgxIFx1MDAzY1x1MDAzYyAxMSksXHQvKiBubyBvdmVyd3JpdGUgUEdfd3JpdGViYWNrIHBhZ2VzICovXG4gXHRTV1BfU1lOQ0hST05PVVNfSU8gPSAoMSBcdTAwM2NcdTAwM2MgMTIpLFx0Lyogc3luY2hyb25vdXMgSU8gaXMgZWZmaWNpZW50ICovXG4gXHRTV1BfSElCRVJOQVRJT04gPSAoMSBcdTAwM2NcdTAwM2MgMTMpLFx0LyogcGlubmVkIGZvciBoaWJlcm5hdGlvbiAqL1xuK1x0U1dQX1hTV0FQXHQ9ICgxIFx1MDAzY1x1MDAzYyAxNCksXHQvKiBleHRlbmRhYmxlIHN3YXAgZGV2aWNlICovXG4gXHRcdFx0XHRcdC8qIGFkZCBvdGhlcnMgaGVyZSBiZWZvcmUuLi4gKi9cbiB9O1xuIFxuQEAgLTI0Nyw2ICsyNDgsMTYgQEAgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3Qge1xuIFx0c2lnbmVkIGNoYXJcdHR5cGU7XHRcdC8qIHN0cmFuZ2UgbmFtZSBmb3IgYW4gaW5kZXggKi9cbiBcdHVuc2lnbmVkIGludFx0bWF4O1x0XHQvKiBzaXplIG9mIHRoaXMgc3dhcCBkZXZpY2UgKi9cbiBcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvOyAvKiBjbHVzdGVyIGluZm8uIE9ubHkgZm9yIFNTRCAqL1xuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitcdHN0cnVjdCB2bV9zdHJ1Y3RcdCpjbHVzdGVyX3ZtO1x0LyogVk1fU1BBUlNFIGFyZWEgZm9yIHhzd2FwIGR5bmFtaWMgY2x1c3Rlcl9pbmZvICovXG4rXHR1bnNpZ25lZCBsb25nXHRcdG5yX2NsdXN0ZXJzX21heDsvKiB1cHBlciBsaW1pdCBmcm9tIHN3YXAgaGVhZGVyICovXG4rXHR1bnNpZ25lZCBsb25nXHRcdG5yX2NsdXN0ZXJzO1x0LyogY3VycmVudCBncm93dGggY2VpbGluZyAo4omkIG5yX2NsdXN0ZXJzX21heCkgKi9cbitcdHVuc2lnbmVkIGxvbmdcdFx0bnJfY2x1c3RlcnNfbWFwcGVkOyAvKiBjdXJyZW50bHkgbWFwcGVkIGNsdXN0ZXIgY291bnQgKi9cbitcdHVuc2lnbmVkIGxvbmdcdFx0bnJfZnJlZV90YWlsO1x0LyogY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0IHRhaWwgKi9cbitcdHN0cnVjdCBkZW50cnlcdFx0KmRlYnVnZnNfZW50cnk7XHQvKiBkZWJ1Z2ZzOiB0eXBlXHUwMDNjTlx1MDAzZV9tYXhfY2x1c3RlcnMgKi9cbitcdHN0cnVjdCB3b3JrX3N0cnVjdFx0eHN3YXBfc2hyaW5rX3dvcms7IC8qIGRlZmVycmVkIHNocmluayB0cmlnZ2VyICovXG4rXHRzdHJ1Y3QgbXV0ZXhcdFx0eHN3YXBfbG9jaztcdC8qIHNlcmlhbGl6ZSBtYXAvdW5tYXAgb3BlcmF0aW9ucyAqL1xuKyNlbmRpZlxuIFx0c3RydWN0IGxpc3RfaGVhZCBmcmVlX2NsdXN0ZXJzOyAvKiBmcmVlIGNsdXN0ZXJzIGxpc3QgKi9cbiBcdHN0cnVjdCBsaXN0X2hlYWQgZnVsbF9jbHVzdGVyczsgLyogZnVsbCBjbHVzdGVycyBsaXN0ICovXG4gXHRzdHJ1Y3QgbGlzdF9oZWFkIG5vbmZ1bGxfY2x1c3RlcnNbU1dBUF9OUl9PUkRFUlNdO1xuQEAgLTM1MCw2ICszNjEsNyBAQCB2b2lkIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4gdm9pZCBmcmVlX3BhZ2VzX2FuZF9zd2FwX2NhY2hlKHN0cnVjdCBlbmNvZGVkX3BhZ2UgKiosIGludCk7XG4gLyogbGludXgvbW0vc3dhcGZpbGUuYyAqL1xuIGV4dGVybiBhdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XG4rZXh0ZXJuIGF0b21pY190IG5yX3JlYWxfc3dhcGZpbGVzO1xuIGV4dGVybiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7XG4gZXh0ZXJuIGF0b21pY190IG5yX3JvdGF0ZV9zd2FwO1xuIFxuZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnXG5pbmRleCAwNjAxOTBlMTJiY2VkLi44MmY2MmY0YzViMjNlIDEwMDY0NFxuLS0tIGEvbW0vS2NvbmZpZ1xuKysrIGIvbW0vS2NvbmZpZ1xuQEAgLTEyMiw2ICsxMjIsMTUgQEAgY29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVFxuICAgICAgICBkZWZhdWx0IFwienN0ZFwiIGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9aU1REXG4gICAgICAgIGRlZmF1bHQgXCJcIlxuIFxuK2NvbmZpZyBYU1dBUFxuK1x0Ym9vbCBcIkV4dGVuZGFibGUgKHZpcnR1YWwpIHN3YXAgZGV2aWNlXCJcbitcdGRlcGVuZHMgb24gU1dBUCBcdTAwMjZcdTAwMjYgNjRCSVRcbitcdGhlbHBcbitcdCAgQWRkcyBzdXBwb3J0IGZvciBleHRlbmRhYmxlIHN3YXAgZGV2aWNlcyAoeHN3YXApIHRoYXQgZGVjb3VwbGVcbitcdCAgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gVGhlIGNsdXN0ZXJfaW5mb1xuK1x0ICBhcnJheSBpcyBiYWNrZWQgYnkgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIHRoYXQgZ3Jvd3MgYW5kIHNocmlua3NcbitcdCAgb24gZGVtYW5kLCBhdm9pZGluZyBzdGF0aWMgcHJlLWFsbG9jYXRpb24gb3ZlcmhlYWQuXG4rXG4gY29uZmlnIFpTTUFMTE9DXG4gXHR0cmlzdGF0ZVxuIFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfaW8uYyBiL21tL3BhZ2VfaW8uY1xuaW5kZXggZTRmYTdmZmZmZThiYi4uMWYzZmE1MjEzMWFiMyAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfaW8uY1xuKysrIGIvbW0vcGFnZV9pby5jXG5AQCAtMjQ3LDYgKzI0NywxNyBAQCBpbnQgc3dhcF93cml0ZW91dChzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdH1cbiBcdHJjdV9yZWFkX3VubG9jaygpO1xuIFxuK1x0LypcbitcdCAqIGN0eC1cdTAwM2VzaXMgaXMgc2V0IGJ5IHN3YXBfYWRkX2ZvbGlvKCkgd2hpY2ggaXMgY2FsbGVkIGZyb21cbitcdCAqIF9fc3dhcF93cml0ZXBhZ2UoKSBiZWxvdy4gIFNpbmNlIHdlIG11c3QgYXZvaWQgdGhlIHdyaXRlcGFnZVxuK1x0ICogcGF0aCBmb3IgeHN3YXAgZGV2aWNlcywgdXNlIHRoZSBzd2FwX2luZm8gZnJvbSB0aGUgZm9saW8nc1xuK1x0ICogc3dhcCBlbnRyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggY3R4LlxuK1x0ICovXG4rXHRpZiAodW5saWtlbHkoX19zd2FwX2VudHJ5X3RvX2luZm8oZm9saW8tXHUwMDNlc3dhcCktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpIHtcbitcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4rXHRcdHJldHVybiBBT1BfV1JJVEVQQUdFX0FDVElWQVRFO1xuK1x0fVxuK1xuIFx0X19zd2FwX3dyaXRlcGFnZShjdHgsIGZvbGlvKTtcbiBcdHJldHVybiAwO1xuIG91dF91bmxvY2s6XG5AQCAtNDc5LDYgKzQ5MCwxMSBAQCB2b2lkIHN3YXBfcmVhZF9mb2xpbyhzdHJ1Y3Qgc3dhcF9pb19jdHggKmN0eCwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdGlmICh6c3dhcF9sb2FkKGZvbGlvKSAhPSAtRU5PRU5UKVxuIFx0XHRnb3RvIGZpbmlzaDtcbiBcbitcdGlmICh1bmxpa2VseShzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpIHtcbitcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbitcdFx0Z290byBmaW5pc2g7XG4rXHR9XG4rXG4gXHQvKiBXZSBoYXZlIHRvIHJlYWQgZnJvbSBzbG93ZXIgZGV2aWNlcy4gSW5jcmVhc2UgenN3YXAgcHJvdGVjdGlvbi4gKi9cbiBcdHpzd2FwX2ZvbGlvX3N3YXBpbihmb2xpbyk7XG4gXHRzd2FwX2FkZF9mb2xpbyhjdHgsIGZvbGlvLCBSRUFEKTtcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmNcbmluZGV4IDViZTgyNTkxMWU2NDUuLmViYjJkMmFjMzU2ZmUgMTAwNjQ0XG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcbisrKyBiL21tL3N3YXBfc3RhdGUuY1xuQEAgLTgyOSw2ICs4MjksMTMgQEAgc3RydWN0IGZvbGlvICpzd2FwX2NsdXN0ZXJfcmVhZGFoZWFkKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnBfbWFzayxcbiBcdHN0cnVjdCBibGtfcGx1ZyBwbHVnO1xuIFx0c3dwX2VudHJ5X3QgcmFfZW50cnk7XG4gXG4rXHQvKlxuK1x0ICogVGhlIGVudHJ5IG1heSBoYXZlIGJlZW4gZnJlZWQgYnkgYW5vdGhlciB0YXNrLiBBdm9pZCBzd2FwX2luZm9fZ2V0KClcbitcdCAqIHdoaWNoIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBpZiB0aGUgcmFjZSBoYXBwZW5zLlxuK1x0ICovXG4rXHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUClcbitcdFx0Z290byBza2lwO1xuK1xuIFx0bWFzayA9IHN3YXBpbl9ucl9wYWdlcyhvZmZzZXQpIC0gMTtcbiBcdGlmICghbWFzaylcbiBcdFx0Z290byBza2lwO1xuZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jXG5pbmRleCA0ZDRlM2UzMDU5ZjZiLi5jYTQwNjU1NjYyNmU3IDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuKysrIGIvbW0vc3dhcGZpbGUuY1xuQEAgLTQ4LDYgKzQ4LDExOCBAQFxuICNpbmNsdWRlIFwic3dhcF90YWJsZS5oXCJcbiAjaW5jbHVkZSBcImludGVybmFsLmhcIlxuICNpbmNsdWRlIFwic3dhcC5oXCJcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcdTAwM2VcbitcbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7XG4rXG4rI2lmZGVmIENPTkZJR19YU1dBUFxuKy8qXG4rICogeHN3YXA6IGR5bmFtaWNhbGx5IGdyb3cgYW5kIHNocmluayB0aGUgY2x1c3Rlcl9pbmZvIGFycmF5IHZpYSBhXG4rICogVk1fU1BBUlNFIGFyZWEuXG4rICpcbisgKiBYU1dBUF9HUk9XX0NMVVNURVJTIGlzIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgdG8gbWFwL3VubWFwIGluIG9uZVxuKyAqIGdyb3cvc2hyaW5rIG9wZXJhdGlvbi4gIEl0IGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJfaW5mb1xuKyAqIHN0cnVjdHMgdGhhdCBmaXQgaW4gYSBzaW5nbGUgcGFnZSAoYXQgbGVhc3QgMTYpLCBzbyB0aGF0IHRoZSB2bWFsbG9jXG4rICogcGFnZSB0YWJsZVxuKyAqIG92ZXJoZWFkIGlzIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIG1hcHBlZC5cbisgKi9cbisjZGVmaW5lIFhTV0FQX0dST1dfQ0xVU1RFUlMgXFxcbitcdG1heF90KHVuc2lnbmVkIGxvbmcsIFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8pLCAxNilcbitcbitzdGF0aWMgc3RydWN0IGRlbnRyeSAqeHN3YXBfZGVidWdmc19yb290O1xuK1xuK3N0YXRpYyBpbnQgeHN3YXBfbWFwX2NsdXN0ZXJzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeCwgdW5zaWduZWQgbG9uZyBucik7XG4rc3RhdGljIHZvaWQgeHN3YXBfdW5tYXBfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCB1bnNpZ25lZCBsb25nIG5yKTtcbitzdGF0aWMgaW50IHhzd2FwX2NoZWNrX21hcHBlZChwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRhdGEpO1xuK3N0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpO1xuK3N0YXRpYyB2b2lkIHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZnJlZWRfaWR4KTtcbitzdGF0aWMgdm9pZCB4c3dhcF90cnlfc2hyaW5rKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSk7XG4rXG4rLypcbisgKiBkZWJ1Z2ZzIHJlYWQvd3JpdGUgZm9yIHBlci1kZXZpY2UgbWF4IGNsdXN0ZXIgY291bnQuXG4rICogU2hvd3Mvc2V0cyBzaS1cdTAwM2Vucl9jbHVzdGVycyAoY3VycmVudCBncm93dGggY2VpbGluZyksIGNsYW1wZWQgdG9cbisgKiBbMCwgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4XS5cbisgKi9cbitzdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZixcbitcdFx0XHRcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbit7XG4rXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbitcdGNoYXIgdG1wWzMyXTtcbitcdGludCBsZW47XG4rXG4rXHRsZW4gPSBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCBcIiVsdVxcblwiLCBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnMpKTtcbitcdHJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCB0bXAsIGxlbik7XG4rfVxuK1xuK3N0YXRpYyBzc2l6ZV90IHhzd2FwX21heF9jbHVzdGVyc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSxcbitcdFx0XHRcdFx0Y29uc3QgY2hhciBfX3VzZXIgKmJ1ZixcbitcdFx0XHRcdFx0c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpXG4re1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4rXHR1bnNpZ25lZCBsb25nIHZhbCwgbmV3X3BhZ2VzO1xuK1x0aW50IGVycjtcbitcbitcdGVyciA9IGtzdHJ0b3VsX2Zyb21fdXNlcihidWYsIGNvdW50LCAwLCBcdTAwMjZ2YWwpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdGlmICh2YWwgXHUwMDNlIHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21heClcbitcdFx0dmFsID0gc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4O1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuK1x0c2ktXHUwMDNlbnJfY2x1c3RlcnMgPSB2YWw7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbitcbitcdC8qIEtlZXAgdGhlIHZpc2libGUgc3dhcCBzaXplIGluIHN5bmMgd2l0aCB0aGUgbmV3IGNlaWxpbmcuICovXG4rXHRuZXdfcGFnZXMgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB2YWwgKiBTV0FQRklMRV9DTFVTVEVSLCBzaS1cdTAwM2VtYXgpO1xuK1x0aWYgKG5ld19wYWdlcylcbitcdFx0bmV3X3BhZ2VzLS07XG4rXHRpZiAobmV3X3BhZ2VzICE9IHNpLVx1MDAzZXBhZ2VzKSB7XG4rXHRcdGxvbmcgZGVsdGEgPSAobG9uZyluZXdfcGFnZXMgLSAobG9uZylzaS1cdTAwM2VwYWdlcztcbitcbitcdFx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRcdHNpLVx1MDAzZXBhZ2VzID0gbmV3X3BhZ2VzO1xuK1x0XHRhdG9taWNfbG9uZ19hZGQoZGVsdGEsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuK1x0XHR0b3RhbF9zd2FwX3BhZ2VzICs9IGRlbHRhO1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0fVxuK1xuK1x0LyogU2hyaW5rIHRyaWdnZXI6IGxvd2VyaW5nIHRoZSBjZWlsaW5nIG1heSBmcmVlIHRhaWwgY2x1c3RlcnMuICovXG4rXHRzY2hlZHVsZV93b3JrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcbitcbitcdHJldHVybiBjb3VudDtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xuK1x0LnJlYWQgPSB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZCxcbitcdC53cml0ZSA9IHhzd2FwX21heF9jbHVzdGVyc193cml0ZSxcbitcdC5vcGVuID0gc2ltcGxlX29wZW4sXG4rXHQubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssXG4rfTtcbitcbitzdGF0aWMgdm9pZCB4c3dhcF9kZWJ1Z2ZzX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4re1xuK1x0Y2hhciBuYW1lWzMyXTtcbitcbitcdGlmICgheHN3YXBfZGVidWdmc19yb290KVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFwidHlwZSVkX2NsdXN0ZXJfbGltaXRcIiwgc2ktXHUwMDNldHlwZSk7XG4rXHRzaS1cdTAwM2VkZWJ1Z2ZzX2VudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAwNjQ0LCB4c3dhcF9kZWJ1Z2ZzX3Jvb3QsXG4rXHRcdFx0XHRcdFx0c2ksIFx1MDAyNnhzd2FwX2RlYnVnZnNfZm9wcyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHhzd2FwX2RlYnVnZnNfZGVsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbit7XG4rXHRkZWJ1Z2ZzX3JlbW92ZShzaS1cdTAwM2VkZWJ1Z2ZzX2VudHJ5KTtcbitcdHNpLVx1MDAzZWRlYnVnZnNfZW50cnkgPSBOVUxMO1xuK31cbitcbitcbisjZW5kaWZcbiBcbiBzdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2FsbG9jKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHQgICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKTtcbkBAIC02Myw5ICsxNzUsOSBAQCBzdGF0aWMgdm9pZCBtb3ZlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuICAqXG4gICogQWxzbyBwcm90ZWN0cyBzd2FwX2FjdGl2ZV9oZWFkIHRvdGFsX3N3YXBfcGFnZXMsIGFuZCB0aGUgU1dQX1dSSVRFT0sgZmxhZy5cbiAgKi9cbi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7XG4gc3RhdGljIHVuc2lnbmVkIGludCBucl9zd2FwZmlsZXM7XG4gYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xuK2F0b21pY190IG5yX3JlYWxfc3dhcGZpbGVzO1xuIC8qXG4gICogU29tZSBtb2R1bGVzIHVzZSBzd2FwcGFibGUgb2JqZWN0cyBhbmQgbWF5IHRyeSB0byBzd2FwIHRoZW0gb3V0IHVuZGVyXG4gICogbWVtb3J5IHByZXNzdXJlICh2aWEgdGhlIHNocmlua2VyKS4gQmVmb3JlIGRvaW5nIHNvLCB0aGV5IG1heSB3aXNoIHRvXG5AQCAtNjA5LDYgKzcyMSwxMCBAQCBzdGF0aWMgdm9pZCBfX2ZyZWVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mb1xuIFx0c3dhcF9jbHVzdGVyX2ZyZWVfdGFibGUoY2kpO1xuIFx0bW92ZV9jbHVzdGVyKHNpLCBjaSwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycywgQ0xVU1RFUl9GTEFHX0ZSRUUpO1xuIFx0Y2ktXHUwMDNlb3JkZXIgPSAwO1xuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitcdHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWwoc2ksIGNpIC0gc2ktXHUwMDNlY2x1c3Rlcl9pbmZvKTtcbitcdHNjaGVkdWxlX3dvcmsoXHUwMDI2c2ktXHUwMDNleHN3YXBfc2hyaW5rX3dvcmspO1xuKyNlbmRpZlxuIH1cbiBcbiAvKlxuQEAgLTk1NSw2ICsxMDcxLDkgQEAgc3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpXG4gXHRcdGNpLVx1MDAzZW9yZGVyID0gb3JkZXI7XG4gXHRjaS1cdTAwM2Vjb3VudCArPSBucl9wYWdlcztcbisjaWZkZWYgQ09ORklHX1hTV0FQXG4rXHR4c3dhcF90cmltX2ZyZWVfdGFpbChzaSwgY2x1c3Rlcl9pbmRleChzaSwgY2kpKTtcbisjZW5kaWZcbiBcdHN3YXBfcmFuZ2VfYWxsb2Moc2ksIG5yX3BhZ2VzKTtcbiBcbiBcdHJldHVybiB0cnVlO1xuQEAgLTExODUsNiArMTMwNCw1MCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0XHRpZiAoZm91bmQpXG4gXHRcdFx0Z290byBkb25lO1xuIFx0fVxuK1xuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitcdC8qXG4rXHQgKiBGb3IgeHN3YXA6IGlmIG5vIGZyZWUgY2x1c3RlciB3YXMgZm91bmQgYW5kIG1vcmUgY2x1c3RlcnNcbitcdCAqIGNhbiBiZSBtYXBwZWQsIGdyb3cgdGhlIGNsdXN0ZXJfaW5mbyBhcnJheSBhbmQgcmV0cnkuXG4rXHQgKi9cbitcdGlmICghZm91bmQgXHUwMDI2XHUwMDI2IChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKSBcdTAwMjZcdTAwMjZcbitcdCAgICBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKSBcdTAwM2MgUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzKSBcdTAwMjZcdTAwMjZcbitcdCAgICBsaXN0X2VtcHR5KFx1MDAyNnNpLVx1MDAzZWZyZWVfY2x1c3RlcnMpKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbnJfbmV3ID0gbWluKFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVycykgLVxuK1x0XHRcdFx0XHQgIFJFQURfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQpLFxuK1x0XHRcdFx0XHQgIFhTV0FQX0dST1dfQ0xVU1RFUlMpO1xuK1x0XHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdFx0aWYgKCF4c3dhcF9tYXBfY2x1c3RlcnMoc2ksIHN0YXJ0LCBucl9uZXcpKSB7XG4rXHRcdFx0dW5zaWduZWQgbG9uZyBhZGRlZCA9IDA7XG4rXG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuK1x0XHRcdGZvciAoaSA9IHN0YXJ0OyBpIFx1MDAzYyBzdGFydCArIG5yX25ldzsgaSsrKSB7XG4rXHRcdFx0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gXHUwMDI2c2ktXHUwMDNlY2x1c3Rlcl9pbmZvW2ldO1xuK1x0XHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuK1x0XHRcdFx0LypcbitcdFx0XHRcdCAqIEEgY29uY3VycmVudCBncm93ZXIgbWF5IGhhdmUgYWxyZWFkeSBhZGRlZFxuK1x0XHRcdFx0ICogdGhlc2UgY2x1c3RlcnMgdG8gdGhlIGZyZWUgbGlzdC4gIE9ubHkgYWRkXG4rXHRcdFx0XHQgKiBjbHVzdGVycyB0aGF0IGFyZSBzdGlsbCBvZmYtbGlzdCAoTk9ORSkuXG4rXHRcdFx0XHQgKi9cbitcdFx0XHRcdGlmIChjaS1cdTAwM2VmbGFncyA9PSBDTFVTVEVSX0ZMQUdfTk9ORSkge1xuK1x0XHRcdFx0XHRjaS1cdTAwM2VmbGFncyA9IENMVVNURVJfRkxBR19GUkVFO1xuK1x0XHRcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmNpLVx1MDAzZWxpc3QsIFx1MDAyNnNpLVx1MDAzZWZyZWVfY2x1c3RlcnMpO1xuK1x0XHRcdFx0XHRhZGRlZCsrO1xuK1x0XHRcdFx0fVxuK1x0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4rXHRcdFx0fVxuK1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuK1x0XHRcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsLFxuK1x0XHRcdFx0ICAgUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCkgKyBucl9uZXcpO1xuK1xuK1x0XHRcdC8qIFJldHJ5IGFsbG9jYXRpb24gZnJvbSB0aGUgZnJlZSBsaXN0ICovXG4rXHRcdFx0Zm91bmQgPSBhbGxvY19zd2FwX3NjYW5fbGlzdChzaSwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyxcbitcdFx0XHRcdFx0XHQgICAgZm9saW8sIGZhbHNlKTtcbitcdFx0fVxuK1x0fVxuKyNlbmRpZlxuIGRvbmU6XG4gXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbkBAIC0xMjIzLDYgKzEzODYsOCBAQCBzdGF0aWMgdm9pZCBkZWxfZnJvbV9hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb2ZmKVxuIFx0XHRcdGdvdG8gc2tpcDtcbiBcdH1cbiBcbitcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuK1x0XHRhdG9taWNfc3ViKDEsIFx1MDAyNm5yX3JlYWxfc3dhcGZpbGVzKTtcbiBcdHBsaXN0X2RlbChcdTAwMjZzaS1cdTAwM2VhdmFpbF9saXN0LCBcdTAwMjZzd2FwX2F2YWlsX2hlYWQpO1xuIFxuIHNraXA6XG5AQCAtMTI2NSw2ICsxNDMwLDggQEAgc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbilcbiBcdH1cbiBcbiBcdHBsaXN0X2FkZChcdTAwMjZzaS1cdTAwM2VhdmFpbF9saXN0LCBcdTAwMjZzd2FwX2F2YWlsX2hlYWQpO1xuK1x0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9YU1dBUCkpXG4rXHRcdGF0b21pY19hZGQoMSwgXHUwMDI2bnJfcmVhbF9zd2FwZmlsZXMpO1xuIFxuIHNraXA6XG4gXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuQEAgLTI5NTIsNiArMzExOSwxOSBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfZXh0ZW50cyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLFxuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctXHUwMDNlaG9zdDtcbiBcdGludCByZXQ7XG4gXG4rXHRpZiAoc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbitcdFx0KnNwYW4gPSAwO1xuK1x0XHQvKlxuK1x0XHQgKiB4c3dhcCBkZXZpY2VzIGhhdmUgbm8gYmFja2luZyBibG9jayBkZXZpY2UgYW5kXG4rXHRcdCAqIHBoeXNpY2FsIHdyaXRlb3V0IGlzIHNraXBwZWQgaW4gc3dhcF93cml0ZW91dCgpLFxuK1x0XHQgKiBidXQgc2lzLVx1MDAzZW9wcyBtdXN0IHN0aWxsIGJlIHNldCBzbyB0aGF0IGNhbGxlcnNcbitcdFx0ICogbGlrZSBzaHJpbmtfZm9saW9fbGlzdCgpIGNhbiBzYWZlbHkgZGVyZWZlcmVuY2VcbitcdFx0ICogb3BzLVx1MDAzZWZsYWdzLlxuK1x0XHQgKi9cbitcdFx0c2lzLVx1MDAzZW9wcyA9IFx1MDAyNnN3YXBfYmRldl9vcHM7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuIFx0cmV0ID0gc2lvX3Bvb2xfaW5pdCgpO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbkBAIC0zMDIzLDIwICszMjAzLDUwIEBAIHN0YXRpYyB2b2lkIHdhaXRfZm9yX2FsbG9jYXRpb24oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIFxuIFx0QlVHX09OKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfV1JJVEVPSyk7XG4gXG4rI2lmZGVmIENPTkZJR19YU1dBUFxuK1x0LypcbitcdCAqIHhzd2FwIGNsdXN0ZXJzIGJleW9uZCBucl9jbHVzdGVyc19tYXBwZWQgaGF2ZSBiZWVuIHVubWFwcGVkXG4rXHQgKiBieSB0aGUgc2hyaW5rZXIgYW5kIHRoZWlyIHZtYWxsb2MgcGFnZXMgYXJlIG5vIGxvbmdlclxuK1x0ICogYWNjZXNzaWJsZS4gIE9ubHkgaXRlcmF0ZSBvdmVyIGN1cnJlbnRseSBtYXBwZWQgY2x1c3RlcnMuXG4rXHQgKi9cbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKVxuK1x0XHRlbmQgPSBtaW4oZW5kLCBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKSAqXG4rXHRcdFx0ICBTV0FQRklMRV9DTFVTVEVSKTtcbisjZW5kaWZcbitcbiBcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IFx1MDAzYyBlbmQ7IG9mZnNldCArPSBTV0FQRklMRV9DTFVTVEVSKSB7XG4gXHRcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XG4gXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuIFx0fVxuIH1cbiBcbi1zdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLFxuLVx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcbitzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiB7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyA9IHNpLVx1MDAzZWNsdXN0ZXJfaW5mbztcbitcdHVuc2lnbmVkIGxvbmcgbWF4cGFnZXMgPSBzaS1cdTAwM2VtYXg7XG4gXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuLVx0aW50IGksIG5yX2NsdXN0ZXJzID0gRElWX1JPVU5EX1VQKG1heHBhZ2VzLCBTV0FQRklMRV9DTFVTVEVSKTtcbitcdGludCBpLCBucl9jbHVzdGVycztcbiBcbiBcdGlmICghY2x1c3Rlcl9pbmZvKVxuIFx0XHRyZXR1cm47XG4rXG4rI2lmZGVmIENPTkZJR19YU1dBUFxuK1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbitcdFx0eHN3YXBfZGVidWdmc19kZWwoc2kpO1xuK1x0XHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNnNpLVx1MDAzZXhzd2FwX3Nocmlua193b3JrKTtcbitcdFx0LyogVW5tYXAgYWxsIG1hcHBlZCBjbHVzdGVycyBhbmQgZnJlZSB0aGUgVk1fU1BBUlNFIGFyZWEgKi9cbitcdFx0aWYgKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCBcdTAwM2UgMClcbitcdFx0XHR4c3dhcF91bm1hcF9jbHVzdGVycyhzaSwgMCwgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitcdFx0ZnJlZV92bV9hcmVhKHNpLVx1MDAzZWNsdXN0ZXJfdm0pO1xuK1x0XHRzaS1cdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcbitcdFx0c2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4ID0gMDtcbitcdFx0c2ktXHUwMDNlbnJfY2x1c3RlcnMgPSAwO1xuK1x0XHRzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQgPSAwO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rI2VuZGlmXG4rXG4rXHRucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jbHVzdGVyczsgaSsrKSB7XG4gXHRcdGNpID0gY2x1c3Rlcl9pbmZvICsgaTtcbiBcdFx0LyogQ2x1c3RlciB3aXRoIGJhZCBtYXJrcyBjb3VudCB3aWxsIGhhdmUgYSByZW1haW5pbmcgdGFibGUgKi9cbkBAIC0zMDc1LDExICszMjg1LDkgQEAgc3RhdGljIHZvaWQgZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4gU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwID0gTlVMTDtcbi1cdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvO1xuIFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZSwgKnZpY3RpbTtcbiBcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nO1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbi1cdHVuc2lnbmVkIGludCBtYXhwYWdlcztcbiBcdGludCBlcnIsIGZvdW5kID0gMDtcbiBcbiBcdGlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSlcbkBAIC0zMTYwLDcgKzMzNjgsOCBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXG4gXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhwLCBwLVx1MDAzZXN3YXBfZmlsZSk7XG4gXG4tXHRpZiAoIShwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4rXHRpZiAoIShwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIFx1MDAyNlx1MDAyNlxuK1x0ICAgICEocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxuIFx0XHRhdG9taWNfZGVjKFx1MDAyNm5yX3JvdGF0ZV9zd2FwKTtcbiBcbiBcdG11dGV4X2xvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbkBAIC0zMTcwLDEwICszMzc5LDYgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFxuIFx0c3dhcF9maWxlID0gcC1cdTAwM2Vzd2FwX2ZpbGU7XG4gXHRwLVx1MDAzZXN3YXBfZmlsZSA9IE5VTEw7XG4tXHRtYXhwYWdlcyA9IHAtXHUwMDNlbWF4O1xuLVx0Y2x1c3Rlcl9pbmZvID0gcC1cdTAwM2VjbHVzdGVyX2luZm87XG4tXHRwLVx1MDAzZW1heCA9IDA7XG4tXHRwLVx1MDAzZWNsdXN0ZXJfaW5mbyA9IE5VTEw7XG4gXHRzcGluX3VubG9jayhcdTAwMjZwLVx1MDAzZWxvY2spO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiBcdGFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC1cdTAwM2V0eXBlKTtcbkBAIC0zMTgxLDcgKzMzODYsOSBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXHRtdXRleF91bmxvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbiBcdGtmcmVlKHAtXHUwMDNlZ2xvYmFsX2NsdXN0ZXIpO1xuIFx0cC1cdTAwM2VnbG9iYWxfY2x1c3RlciA9IE5VTEw7XG4tXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xuK1x0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhwKTtcbitcdHAtXHUwMDNlbWF4ID0gMDtcbitcdHAtXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbiBcbiBcdGlub2RlID0gbWFwcGluZy1cdTAwM2Vob3N0O1xuIFxuQEAgLTMyNzAsNiArMzQ3NywxOSBAQCBzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4gfVxuIFxuK3N0YXRpYyBjb25zdCBjaGFyICpzd2FwX3R5cGVfc3RyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbit7XG4rXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNpLVx1MDAzZXN3YXBfZmlsZTtcbitcbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1hTV0FQKVxuK1x0XHRyZXR1cm4gXCJ4c3dhcFxcdFwiO1xuK1xuK1x0aWYgKFNfSVNCTEsoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX21vZGUpKVxuK1x0XHRyZXR1cm4gXCJwYXJ0aXRpb25cIjtcbitcbitcdHJldHVybiBcImZpbGVcXHRcIjtcbit9XG4rXG4gc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IHY7XG5AQCAtMzI4OSw4ICszNTA5LDcgQEAgc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuIFx0bGVuID0gc2VxX2ZpbGVfcGF0aChzd2FwLCBmaWxlLCBcIiBcXHRcXG5cXFxcXCIpO1xuIFx0c2VxX3ByaW50Zihzd2FwLCBcIiUqcyVzXFx0JWx1XFx0JXMlbHVcXHQlcyVkXFxuXCIsXG4gXHRcdFx0bGVuIFx1MDAzYyA0MCA/IDQwIC0gbGVuIDogMSwgXCIgXCIsXG4tXHRcdFx0U19JU0JMSyhmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfbW9kZSkgP1xuLVx0XHRcdFx0XCJwYXJ0aXRpb25cIiA6IFwiZmlsZVxcdFwiLFxuK1x0XHRcdHN3YXBfdHlwZV9zdHIoc2kpLFxuIFx0XHRcdGJ5dGVzLCBieXRlcyBcdTAwM2MgMTAwMDAwMDAgPyBcIlxcdFwiIDogXCJcIixcbiBcdFx0XHRpbnVzZSwgaW51c2UgXHUwMDNjIDEwMDAwMDAwID8gXCJcXHRcIiA6IFwiXCIsXG4gXHRcdFx0c2ktXHUwMDNlcHJpbyk7XG5AQCAtMzQ2OCw2ICszNjg3LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzO1xuIFx0dW5zaWduZWQgbG9uZyBzd2FwZmlsZXBhZ2VzO1xuIFx0dW5zaWduZWQgbG9uZyBsYXN0X3BhZ2U7XG4rXHRsb2ZmX3Qgc2l6ZTtcbiBcbiBcdGlmIChtZW1jbXAoXCJTV0FQU1BBQ0UyXCIsIHN3YXBfaGVhZGVyLVx1MDAzZW1hZ2ljLm1hZ2ljLCAxMCkpIHtcbiBcdFx0cHJfZXJyKFwiVW5hYmxlIHRvIGZpbmQgc3dhcC1zcGFjZSBzaWduYXR1cmVcXG5cIik7XG5AQCAtMzUxMCw3ICszNzMwLDE2IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFxuIFx0aWYgKCFtYXhwYWdlcylcbiBcdFx0cmV0dXJuIDA7XG4tXHRzd2FwZmlsZXBhZ2VzID0gaV9zaXplX3JlYWQoaW5vZGUpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1xuK1x0c2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTtcbitcdGlmIChzaXplID09IFBBR0VfU0laRSkge1xuK1x0XHQvKiB4c3dhcDogYSBzd2FwIGRldmljZSB3aXRoIG5vIGJhY2tpbmcgc3RvcmFnZSAqL1xuK1x0XHRzaS1cdTAwM2ViZGV2ID0gTlVMTDtcbitcdFx0c2ktXHUwMDNlZmxhZ3MgfD0gU1dQX1hTV0FQIHwgU1dQX1NPTElEU1RBVEU7XG4rXHRcdHJldHVybiBtYXhwYWdlcztcbitcdH1cbitcbitcdHN3YXBmaWxlcGFnZXMgPSBzaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0aWYgKHN3YXBmaWxlcGFnZXMgXHUwMDI2XHUwMDI2IG1heHBhZ2VzIFx1MDAzZSBzd2FwZmlsZXBhZ2VzKSB7XG4gXHRcdHByX3dhcm4oXCJTd2FwIGFyZWEgc2hvcnRlciB0aGFuIHNpZ25hdHVyZSBpbmRpY2F0ZXNcXG5cIik7XG4gXHRcdHJldHVybiAwO1xuQEAgLTM1MjMsNiArMzc1MiwzNjUgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRyZXR1cm4gbWF4cGFnZXM7XG4gfVxuIFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitzdGF0aWMgaW50IHhzd2FwX21hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIHVuc2lnbmVkIGxvbmcgbnIpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpc2ktXHUwMDNlY2x1c3Rlcl9pbmZvICtcbitcdFx0XHRcdCAgIChzaXplX3Qpc3RhcnRfaWR4ICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciArIChzaXplX3QpbnIgKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTtcbitcdC8qXG4rXHQgKiB2bV9hcmVhX21hcF9wYWdlcygpIHJlcXVpcmVzIHRoYXQgc3RhcnQgYW5kIGVuZCBiZSBwYWdlLWFsaWduZWQuXG4rXHQgKiBJZiBzdGFydF9hZGRyIGZhbGxzIHdpdGhpbiBhIHBhZ2UgdGhhdCB3YXMgYWxyZWFkeSBtYXBwZWQgYnkgYVxuK1x0ICogcHJldmlvdXMgYmF0Y2ggKGdyb3cgcGF0aCksIHJvdW5kIGl0IHVwIHRvIHNraXAgdGhlIGFscmVhZHktbWFwcGVkXG4rXHQgKiBwYXJ0aWFsIHBhZ2UuICBBbHdheXMgcm91bmQgZW5kX2FkZHIgdXAgc28gdGhlIHZtYXAgcGFnZSB0YWJsZSB3YWxrXG4rXHQgKiB0ZXJtaW5hdGVzIGNvcnJlY3RseSAodGhlIHdhbGsgbG9vcCBleGl0cyB3aGVuIGFkZHIgPT0gZW5kLCBhbmQgYWRkclxuK1x0ICogYWR2YW5jZXMgYnkgUEFHRV9TSVpFIGVhY2ggaXRlcmF0aW9uKS5cbitcdCAqL1xuK1x0dW5zaWduZWQgbG9uZyB2bV9zdGFydCA9IFBBR0VfQUxJR04oc3RhcnRfYWRkcik7XG4rXHR1bnNpZ25lZCBsb25nIHZtX2VuZCA9IFBBR0VfQUxJR04oZW5kX2FkZHIpO1xuK1x0dW5zaWduZWQgaW50IG5vcmVjbGFpbV9mbGFncztcbitcdHVuc2lnbmVkIGxvbmcgbnBhZ2VzO1xuK1x0c3RydWN0IHBhZ2UgKipwYWdlcztcbitcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4rXG4rXHRpZiAodm1fc3RhcnQgXHUwMDNlPSB2bV9lbmQpIHtcbitcdFx0LyogQWxsIHJlcXVlc3RlZCBjbHVzdGVycyBmYWxsIHdpdGhpbiBhbHJlYWR5LW1hcHBlZCBwYWdlcy4gKi9cbitcdFx0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFx1MDAzYyBzdGFydF9pZHggKyBucjsgaSsrKVxuK1x0XHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1tpXS5sb2NrKTtcbitcdFx0V1JJVEVfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCArIG5yKTtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdG5wYWdlcyA9ICh2bV9lbmQgLSB2bV9zdGFydCkgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXG4rXHQvKlxuK1x0ICogUHJldmVudCByZWN1cnNpdmUgcmVjbGFpbTogdm1fYXJlYV9tYXBfcGFnZXMoKSBpbnRlcm5hbGx5XG4rXHQgKiBhbGxvY2F0ZXMgcGFnZSB0YWJsZXMgd2l0aCBHRlBfUEdUQUJMRV9LRVJORUwsIHdoaWNoIGxhY2tzXG4rXHQgKiBfX0dGUF9OT01FTUFMTE9DLiAgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSBlbnN1cmVzIHRob3NlXG4rXHQgKiBhbGxvY2F0aW9ucyBjYW5ub3QgcmVjdXJzZSBpbnRvIHN3YXAgYnkgZGlzYWJsaW5nIF9fR0ZQX0ZTL0lPLlxuK1x0ICovXG4rXHRub3JlY2xhaW1fZmxhZ3MgPSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpO1xuK1xuK1x0cGFnZXMgPSBrbWFsbG9jX2FycmF5KG5wYWdlcywgc2l6ZW9mKCpwYWdlcyksXG4rXHRcdFx0ICAgICAgX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfCBHRlBfS0VSTkVMKTtcbitcdGlmICghcGFnZXMpIHtcbitcdFx0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5wYWdlczsgaSsrKSB7XG4rXHRcdC8qXG4rXHRcdCAqIF9fR0ZQX1pFUk8gaXMgY3JpdGljYWw6IGNsdXN0ZXJfaW5mbyBzdHJ1Y3RzIGNvbnRhaW4gcG9pbnRlclxuK1x0XHQgKiBmaWVsZHMgKGV4dGVuZF90YWJsZSwgemVyb19iaXRtYXAsIG1lbWNnX3RhYmxlLCB0YWJsZSkgdGhhdFxuK1x0XHQgKiBtdXN0IHN0YXJ0IGFzIE5VTEwuICBXaXRob3V0IHplcm9pbmcsIHN0YWxlIGRhdGEgZnJvbSBhXG4rXHRcdCAqIHByZXZpb3VzIHVzZXIgb2YgdGhlIHBhZ2Ugd291bGQgbG9vayBsaWtlIHZhbGlkIHBvaW50ZXJzLlxuK1x0XHQgKi9cbitcdFx0cGFnZXNbaV0gPSBhbGxvY19wYWdlKF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHxcbitcdFx0XHRcdCAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTtcbitcdFx0aWYgKCFwYWdlc1tpXSlcbitcdFx0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogQ2hlY2sgaWYgdGhlIHRhcmdldCBwYWdlcyBhcmUgYWxyZWFkeSBtYXBwZWQgYnkgYSBjb25jdXJyZW50XG4rXHQgKiBncm93ZXIuICBXZSBtdXN0IGRvIHRoaXMgYWZ0ZXIgcGFnZSBhbGxvY2F0aW9uIGJlY2F1c2VcbitcdCAqIGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCkgY2FuIHNsZWVwLCBvcGVuaW5nIGEgcmFjZSB3aW5kb3cuXG4rXHQgKiBJZiBzb21lb25lIGFscmVhZHkgbWFwcGVkIHRoZXNlIHBhZ2VzLCBmcmVlIG91cnMgYW5kIGNvbnRpbnVlLlxuK1x0ICovXG4rXHRpZiAoYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZShcdTAwMjZpbml0X21tLCB2bV9zdGFydCxcbitcdFx0XHRcdFx0IHZtX2VuZCAtIHZtX3N0YXJ0LFxuK1x0XHRcdFx0XHQgeHN3YXBfY2hlY2tfbWFwcGVkLCBOVUxMKSkge1xuK1x0XHRpID0gbnBhZ2VzO1xuK1x0XHRnb3RvIGZhaWxfbm91bm1hcDtcbitcdH1cbitcbitcdGludCBlcnIgPSB2bV9hcmVhX21hcF9wYWdlcyhzaS1cdTAwM2VjbHVzdGVyX3ZtLCB2bV9zdGFydCwgdm1fZW5kLCBwYWdlcyk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdC8qXG4rXHRcdCAqIC1FQlVTWSBtZWFucyB0aGUgUFRFcyBhcmUgYWxyZWFkeSBwcmVzZW50OlxuK1x0XHQgKiBhbm90aGVyIHRocmVhZCByYWNlZCB3aXRoIHVzIGFuZCBtYXBwZWQgdGhlXG4rXHRcdCAqIHNhbWUgcGFnZXMgYmV0d2VlbiBvdXIgY2hlY2sgYWJvdmUgYW5kIHRoaXNcbitcdFx0ICogY2FsbC4gIFRyZWF0IGFzIHN1Y2Nlc3Mg4oCUIGZyZWUgb3VyIHVudXNlZFxuK1x0XHQgKiBwYWdlcyBhbmQgY29udGludWUuXG4rXHRcdCAqL1xuK1x0XHRpZiAoZXJyID09IC1FQlVTWSkge1xuK1x0XHRcdGkgPSBucGFnZXM7XG4rXHRcdFx0Z290byBmYWlsX25vdW5tYXA7XG4rXHRcdH1cbitcdFx0aSA9IG5wYWdlczsgLyogZnJlZSBhbGwgcGFnZXMgb24gZmFpbHVyZSAqL1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRrZnJlZShwYWdlcyk7XG4rXHRtZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZ3MpO1xuK1xuK1x0LyogSW5pdGlhbGl6ZSBzcGlubG9ja3MgZm9yIG5ld2x5IG1hcHBlZCBjbHVzdGVycyAqL1xuK1x0Zm9yIChpID0gc3RhcnRfaWR4OyBpIFx1MDAzYyBzdGFydF9pZHggKyBucjsgaSsrKVxuK1x0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZzaS1cdTAwM2VjbHVzdGVyX2luZm9baV0ubG9jayk7XG4rXG4rXHQvKlxuK1x0ICogUGFpcnMgd2l0aCBSRUFEX09OQ0UoKSBpbiBzaHJpbmsvZ3JvdyBwYXRocy5cbitcdCAqL1xuK1x0V1JJVEVfT05DRShzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQsIHN0YXJ0X2lkeCArIG5yKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbitcdHJldHVybiAwO1xuK1xuK2ZhaWxfbm91bm1hcDpcbitcdC8qXG4rXHQgKiBQYWdlcyBhbHJlYWR5IG1hcHBlZCBieSBhIGNvbmN1cnJlbnQgZ3Jvd2VyLiAgRnJlZSBvdXIgdW51c2VkXG4rXHQgKiBwYWdlcywgdGhlbiBmYWxsIHRocm91Z2ggdG8gaW5pdGlhbGl6ZSBzcGlubG9ja3MuICBUaGUgdm1hbGxvY1xuK1x0ICogUFRFcyBub3cgcG9pbnQgdG8gdGhlIGNvbmN1cnJlbnQgZ3Jvd2VyJ3MgcGFnZXMuXG4rXHQgKi9cbitcdHdoaWxlIChpIFx1MDAzZSAwKSB7XG4rXHRcdGktLTtcbitcdFx0aWYgKHBhZ2VzW2ldKVxuK1x0XHRcdF9fZnJlZV9wYWdlKHBhZ2VzW2ldKTtcbitcdH1cbitcdGtmcmVlKHBhZ2VzKTtcbitcdG1lbWFsbG9jX25vcmVjbGFpbV9yZXN0b3JlKG5vcmVjbGFpbV9mbGFncyk7XG4rXG4rXHQvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBmb3IgbmV3bHkgbWFwcGVkIGNsdXN0ZXJzICovXG4rXHRmb3IgKGkgPSBzdGFydF9pZHg7IGkgXHUwMDNjIHN0YXJ0X2lkeCArIG5yOyBpKyspXG4rXHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1tpXS5sb2NrKTtcbitcbitcdFdSSVRFX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkLCBzdGFydF9pZHggKyBucik7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4rXHRyZXR1cm4gMDtcbitcbitmYWlsOlxuK1x0d2hpbGUgKGkgXHUwMDNlIDApIHtcbitcdFx0aS0tO1xuK1x0XHRpZiAocGFnZXNbaV0pXG4rXHRcdFx0X19mcmVlX3BhZ2UocGFnZXNbaV0pO1xuK1x0fVxuK1x0bWVtYWxsb2Nfbm9yZWNsYWltX3Jlc3RvcmUobm9yZWNsYWltX2ZsYWdzKTtcbitcdGtmcmVlKHBhZ2VzKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbitcdHJldHVybiAtRU5PTUVNO1xuK31cbitcbitzdHJ1Y3QgeHN3YXBfcGFnZV9kYXRhIHtcbitcdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4rXHRpbnQgbnI7XG4rXHRpbnQgbWF4O1xuK307XG4rXG4rc3RhdGljIGludCB4c3dhcF9jb2xsZWN0X3BhZ2UocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKVxuK3tcbitcdHN0cnVjdCB4c3dhcF9wYWdlX2RhdGEgKnhwZCA9IGRhdGE7XG4rXG4rXHRpZiAoIXB0ZV9wcmVzZW50KCpwdGUpKVxuK1x0XHRyZXR1cm4gMDtcbitcdGlmICh4cGQtXHUwMDNlbnIgXHUwMDNjIHhwZC1cdTAwM2VtYXgpXG4rXHRcdHhwZC1cdTAwM2VwYWdlc1t4cGQtXHUwMDNlbnIrK10gPSBwdGVfcGFnZSgqcHRlKTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCB4c3dhcF91bm1hcF9jbHVzdGVycyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0XHQgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgsIHVuc2lnbmVkIGxvbmcgbnIpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpc2ktXHUwMDNlY2x1c3Rlcl9pbmZvICtcbitcdFx0XHRcdCAgIChzaXplX3Qpc3RhcnRfaWR4ICogc2l6ZW9mKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyk7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gc3RhcnRfYWRkciArIChzaXplX3QpbnIgKiBzaXplb2Yoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvKTtcbitcdC8qXG4rXHQgKiBSb3VuZCB0byBwYWdlIGJvdW5kYXJpZXM6IHN0YXJ0IHVwIChza2lwIHBhcnRpYWwgcGFnZSB0aGF0IG1heVxuK1x0ICogY29udGFpbiBjbHVzdGVycyBzdGlsbCBpbiB1c2UgYmVmb3JlIHN0YXJ0X2lkeCksIGVuZCB1cCBzbyB0aGVcbitcdCAqIGVudGlyZSByYW5nZSBpcyBjb3ZlcmVkLiAgdm1fYXJlYV91bm1hcF9wYWdlcygpIGFuZFxuK1x0ICogYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZSgpIG9wZXJhdGUgb24gd2hvbGUgcGFnZXMuXG4rXHQgKi9cbitcdHVuc2lnbmVkIGxvbmcgdm1fc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0X2FkZHIpO1xuK1x0dW5zaWduZWQgbG9uZyB2bV9lbmQgPSBQQUdFX0FMSUdOKGVuZF9hZGRyKTtcbitcdHVuc2lnbmVkIGxvbmcgc2l6ZTtcbitcdHVuc2lnbmVkIGxvbmcgbnBhZ2VzO1xuK1x0c3RydWN0IHhzd2FwX3BhZ2VfZGF0YSB4cGQ7XG4rXHRpbnQgaTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c2ktXHUwMDNleHN3YXBfbG9jayk7XG4rXG4rXHRpZiAodm1fc3RhcnQgXHUwMDNlPSB2bV9lbmQpIHtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdHNpemUgPSB2bV9lbmQgLSB2bV9zdGFydDtcbitcdG5wYWdlcyA9IHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXG4rXHQvKlxuK1x0ICogV2FsayB0aGUgcGFnZSB0YWJsZSB0byBjb2xsZWN0IHBoeXNpY2FsIHBhZ2VzIGJlZm9yZSB1bm1hcHBpbmcuXG4rXHQgKiB2bV9hcmVhX3VubWFwX3BhZ2VzKCkgb25seSBjbGVhcnMgUFRFcyBhbmQgZnJlZXMgaW50ZXJtZWRpYXRlXG4rXHQgKiBwYWdlIHRhYmxlIHBhZ2VzIOKAlCBpdCBkb2VzIG5vdCBmcmVlIGJhY2tpbmcgcGFnZXMuXG4rXHQgKi9cbitcdHhwZC5wYWdlcyA9IGttYWxsb2NfYXJyYXkobnBhZ2VzLCBzaXplb2YoKnhwZC5wYWdlcyksIEdGUF9LRVJORUwpO1xuK1x0aWYgKHhwZC5wYWdlcykge1xuK1x0XHR4cGQubnIgPSAwO1xuK1x0XHR4cGQubWF4ID0gbnBhZ2VzO1xuK1x0XHRhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlKFx1MDAyNmluaXRfbW0sIHZtX3N0YXJ0LCBzaXplLFxuK1x0XHRcdFx0XHQgICAgIHhzd2FwX2NvbGxlY3RfcGFnZSwgXHUwMDI2eHBkKTtcbitcdH1cbitcbitcdHZtX2FyZWFfdW5tYXBfcGFnZXMoc2ktXHUwMDNlY2x1c3Rlcl92bSwgdm1fc3RhcnQsIHZtX2VuZCk7XG4rXG4rXHQvKiBGcmVlIHRoZSBjb2xsZWN0ZWQgYmFja2luZyBwYWdlcyAqL1xuK1x0aWYgKHhwZC5wYWdlcykge1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB4cGQubnI7IGkrKylcbitcdFx0XHRfX2ZyZWVfcGFnZSh4cGQucGFnZXNbaV0pO1xuK1x0XHRrZnJlZSh4cGQucGFnZXMpO1xuK1x0fVxuK1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXhzd2FwX2xvY2spO1xuK1xuK291dDpcbitcdC8qXG4rXHQgKiBQYWlycyB3aXRoIFJFQURfT05DRSgpIGluIHNocmluay9ncm93IHBhdGhzLlxuK1x0ICovXG4rXHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCwgc3RhcnRfaWR4KTtcbit9XG4rXG4rLypcbisgKiBDYWxsYmFjayBmb3IgYXBwbHlfdG9fZXhpc3RpbmdfcGFnZV9yYW5nZSgpOiByZXR1cm4gMSB0byBzdG9wIGF0IHRoZVxuKyAqIGZpcnN0IHByZXNlbnQgUFRFLCBzaWduYWxsaW5nIHRoYXQgdGhlIHJhbmdlIGlzIGFscmVhZHkgbWFwcGVkLlxuKyAqL1xuK3N0YXRpYyBpbnQgeHN3YXBfY2hlY2tfbWFwcGVkKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSlcbit7XG4rXHRyZXR1cm4gMTtcbit9XG4rXG4rLypcbisgKiBNYWludGFpbiBzaS1cdTAwM2Vucl9mcmVlX3RhaWwsIHRoZSBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGNsdXN0ZXJzIGF0XG4rICogdGhlIHRhaWwgb2YgdGhlIG1hcHBlZCByYW5nZS4gIENhbGxlZCB3aGVuIGEgY2x1c3RlciBhdCBAZnJlZWRfaWR4IGlzXG4rICogZnJlZWQuICBQcm92aWRlcyBPKDEpIHNocmluayBkZXRlY3Rpb246IGlmIG5yX2ZyZWVfdGFpbCBpcyBub24temVybyxcbisgKiB0aGUgdGFpbCBjYW4gYmUgdW5tYXBwZWQgd2l0aG91dCBzY2FubmluZyBjbHVzdGVyX2luZm9bXS5cbisgKlxuKyAqIE9ubHkgaW5jcmVtZW50cyB3aGVuIEBmcmVlZF9pZHggaXMgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZVxuKyAqIGV4aXN0aW5nIHRhaWwgcmVnaW9uLiAgVGhlbiBzY2FucyBiYWNrd2FyZHMgZm9yIGFscmVhZHktZnJlZSBjbHVzdGVyc1xuKyAqIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwsIGJvdW5kZWQgYnkgWFNXQVBfR1JPV19DTFVTVEVSUyBhdCBhIHRpbWUuXG4rICovXG4rc3RhdGljIHZvaWQgeHN3YXBfdXBkYXRlX2ZyZWVfdGFpbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGZyZWVkX2lkeClcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGlkLCBpO1xuK1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbitcbitcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitcdG5yX3RhaWwgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfZnJlZV90YWlsKTtcbitcbitcdC8qIFByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHNocmluayB0aGF0IHJhY2VzIHBhc3QgdXMgKi9cbitcdGlmIChucl90YWlsIFx1MDAzZT0gbnJfbWFwcGVkKVxuK1x0XHRyZXR1cm47XG4rXG4rXHR0aWQgPSBucl9tYXBwZWQgLSBucl90YWlsIC0gMTtcbitcbitcdC8qIE9ubHkgdGhlIGNsdXN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0YWlsIHJlZ2lvbiBjb3VudHMgKi9cbitcdGlmIChmcmVlZF9pZHggIT0gdGlkKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucl90YWlsKys7XG4rXHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfdGFpbCk7XG4rXG4rXHQvKiBFeHRlbmQ6IGluY2x1ZGUgYWxyZWFkeS1mcmVlIGNsdXN0ZXJzIG5vdyBjb25uZWN0ZWQgdG8gdGhlIHRhaWwgKi9cbitcdGZvciAoaSA9IDE7IGkgXHUwMDNjIFhTV0FQX0dST1dfQ0xVU1RFUlM7IGkrKykge1xuK1x0XHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitcdFx0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9mcmVlX3RhaWwpO1xuK1x0XHRpZiAobnJfdGFpbCBcdTAwM2U9IG5yX21hcHBlZCAtIDEpXG4rXHRcdFx0YnJlYWs7IC8qIHJlYWNoZWQgY2x1c3RlciAwICovXG4rXHRcdHRpZCA9IG5yX21hcHBlZCAtIG5yX3RhaWwgLSAxO1xuK1x0XHRjaSA9IFx1MDAyNnNpLVx1MDAzZWNsdXN0ZXJfaW5mb1t0aWRdO1xuK1xuK1x0XHRpZiAoUkVBRF9PTkNFKGNpLVx1MDAzZWNvdW50KSB8fFxuK1x0XHQgICAgUkVBRF9PTkNFKGNpLVx1MDAzZWZsYWdzKSAhPSBDTFVTVEVSX0ZMQUdfRlJFRSlcbitcdFx0XHRicmVhaztcbitcdFx0bnJfdGFpbCsrO1xuK1x0XHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfdGFpbCk7XG4rXHR9XG4rfVxuK1xuKy8qXG4rICogVHJpbSBzaS1cdTAwM2Vucl9mcmVlX3RhaWwgd2hlbiBhIGNsdXN0ZXIgaW4gdGhlIHRhaWwgcmVnaW9uIGlzIGFsbG9jYXRlZC5cbisgKiBAaWR4OiBpbmRleCBvZiB0aGUgY2x1c3RlciBiZWluZyBhbGxvY2F0ZWQuXG4rICovXG4rc3RhdGljIHZvaWQgeHN3YXBfdHJpbV9mcmVlX3RhaWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIGlkeClcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX21hcHBlZCwgbnJfdGFpbCwgdGFpbF9zdGFydDtcbitcbitcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKlxuK1x0ICogbnJfY2x1c3RlcnNfbWFwcGVkIGFuZCBucl9mcmVlX3RhaWwgYXJlIHJlYWQgbG9ja2xlc3NseTtcbitcdCAqIGNvbmN1cnJlbnQgdXBkYXRlcyBtYXkgY2F1c2UgbnJfZnJlZV90YWlsIHRvIGJlIHRyaW1tZWRcbitcdCAqIHNsaWdodGx5IGxlc3MgdGhhbiBpZGVhbGx5LCB3aGljaCBpcyBoYXJtbGVzcy5cbitcdCAqL1xuK1x0bnJfbWFwcGVkID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2NsdXN0ZXJzX21hcHBlZCk7XG4rXHRucl90YWlsID0gUkVBRF9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCk7XG4rXHR0YWlsX3N0YXJ0ID0gbnJfbWFwcGVkIC0gbnJfdGFpbDtcbitcdGlmIChpZHggXHUwMDNlPSB0YWlsX3N0YXJ0KVxuK1x0XHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfbWFwcGVkIC0gaWR4IC0gMSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHhzd2FwX3Nocmlua193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBjb250YWluZXJfb2Yod29yayxcbitcdFx0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCwgeHN3YXBfc2hyaW5rX3dvcmspO1xuK1x0eHN3YXBfdHJ5X3NocmluayhzaSk7XG4rfVxuK1xuKy8qXG4rICogVHJ5IHRvIHNocmluayB0aGUgY2x1c3Rlcl9pbmZvIHRhaWwuICBVc2VzIHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCB3aGljaFxuKyAqIGlzIG1haW50YWluZWQgaW5jcmVtZW50YWxseSBkdXJpbmcgYWxsb2MvZnJlZSDigJQgbm8gc2Nhbm5pbmcgbmVlZGVkLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHhzd2FwX3RyeV9zaHJpbmsoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfbWFwcGVkLCBucl9jZWlsaW5nLCBucl90YWlsLCBucl91bm1hcDtcbitcdHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4LCBpO1xuK1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbitcbitcdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucl9tYXBwZWQgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitcdG5yX2NlaWxpbmcgPSBSRUFEX09OQ0Uoc2ktXHUwMDNlbnJfY2x1c3RlcnMpO1xuK1x0bnJfdGFpbCA9IFJFQURfT05DRShzaS1cdTAwM2Vucl9mcmVlX3RhaWwpO1xuK1xuK1x0aWYgKG5yX21hcHBlZCBcdTAwM2M9IG5yX2NlaWxpbmcpXG4rXHRcdHJldHVybjtcbitcdGlmIChucl90YWlsIFx1MDAzYyBYU1dBUF9HUk9XX0NMVVNURVJTKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucl91bm1hcCA9IG1pbihyb3VuZF9kb3duKG5yX3RhaWwsIFhTV0FQX0dST1dfQ0xVU1RFUlMpLFxuK1x0XHQgICAgICAgbnJfbWFwcGVkIC0gbnJfY2VpbGluZyk7XG4rXHRpZiAobnJfdW5tYXAgXHUwMDNjIFhTV0FQX0dST1dfQ0xVU1RFUlMpXG4rXHRcdHJldHVybjtcbitcdHN0YXJ0X2lkeCA9IG5yX21hcHBlZCAtIG5yX3VubWFwO1xuK1xuK1x0LyogVmVyaWZ5IHRoZSB0YWlsIGNsdXN0ZXJzIGFyZSBzdGlsbCBmcmVlIGJlZm9yZSB1bm1hcHBpbmcgKi9cbitcdHNwaW5fbG9jayhcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbitcdGZvciAoaSA9IHN0YXJ0X2lkeDsgaSBcdTAwM2MgbnJfbWFwcGVkOyBpKyspIHtcbitcdFx0Y2kgPSBcdTAwMjZzaS1cdTAwM2VjbHVzdGVyX2luZm9baV07XG4rXHRcdGlmIChjaS1cdTAwM2VmbGFncyAhPSBDTFVTVEVSX0ZMQUdfRlJFRSkge1xuK1x0XHRcdG5yX3VubWFwID0gaSAtIHN0YXJ0X2lkeDtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRsaXN0X2RlbChcdTAwMjZjaS1cdTAwM2VsaXN0KTtcbitcdFx0Y2ktXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORTtcbitcdH1cbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuK1xuK1x0aWYgKG5yX3VubWFwIFx1MDAzYyBYU1dBUF9HUk9XX0NMVVNURVJTKVxuK1x0XHRyZXR1cm47XG4rXG4rXHR4c3dhcF91bm1hcF9jbHVzdGVycyhzaSwgc3RhcnRfaWR4LCBucl91bm1hcCk7XG4rXHRXUklURV9PTkNFKHNpLVx1MDAzZW5yX2ZyZWVfdGFpbCwgbnJfdGFpbCAtIG5yX3VubWFwKTtcbit9XG4rI2VuZGlmIC8qIENPTkZJR19YU1dBUCAqL1xuK1xuIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHRcdCAgICB1bmlvbiBzd2FwX2hlYWRlciAqc3dhcF9oZWFkZXIsXG4gXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcbkBAIC0zNTMyLDYgKzQxMjAsNzAgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aW50IGVyciA9IC1FTk9NRU07XG4gXHR1bnNpZ25lZCBsb25nIGk7XG4gXG4rI2lmZGVmIENPTkZJR19YU1dBUFxuK1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbitcdFx0dW5zaWduZWQgbG9uZyBzaXplID0gUEFHRV9BTElHTihucl9jbHVzdGVycyAqIHNpemVvZigqY2x1c3Rlcl9pbmZvKSk7XG4rXHRcdHN0cnVjdCB2bV9zdHJ1Y3QgKnZtO1xuK1xuK1x0XHR2bSA9IGdldF92bV9hcmVhKHNpemUsIFZNX1NQQVJTRSk7XG4rXHRcdGlmICghdm0pXG4rXHRcdFx0Z290byBlcnI7XG4rXG4rXHRcdGNsdXN0ZXJfaW5mbyA9IHZtLVx1MDAzZWFkZHI7XG4rXHRcdHNpLVx1MDAzZWNsdXN0ZXJfdm0gPSB2bTtcbitcdFx0c2ktXHUwMDNlbnJfY2x1c3RlcnNfbWF4ID0gbnJfY2x1c3RlcnM7XG4rXHRcdHNpLVx1MDAzZW5yX2NsdXN0ZXJzID0gbnJfY2x1c3RlcnM7XG4rXHRcdHNpLVx1MDAzZWNsdXN0ZXJfaW5mbyA9IGNsdXN0ZXJfaW5mbztcbitcbitcdFx0LyogTWFwIHRoZSBpbml0aWFsIGNodW5rIChhdCBsZWFzdCBjbHVzdGVyIDApICovXG4rXHRcdGlmICh4c3dhcF9tYXBfY2x1c3RlcnMoc2ksIDAsIG1pbl90KHVuc2lnbmVkIGxvbmcsXG4rXHRcdFx0XHRcdFhTV0FQX0dST1dfQ0xVU1RFUlMsIG5yX2NsdXN0ZXJzKSkpXG4rXHRcdFx0Z290byBlcnJfZnJlZV92bTtcbitcbitcdFx0LyogeHN3YXA6IG9ubHkgY2x1c3RlciAwIHNsb3QgMCBpcyBiYWQgKi9cbitcdFx0ZXJyID0gc3dhcF9jbHVzdGVyX3NldHVwX2JhZF9zbG90KHNpLCBjbHVzdGVyX2luZm8sIDAsIGZhbHNlKTtcbitcdFx0aWYgKGVycilcbitcdFx0XHRnb3RvIGVycl91bm1hcDtcbitcbitcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycyk7XG4rXHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZWZ1bGxfY2x1c3RlcnMpO1xuK1x0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZzaS1cdTAwM2VkaXNjYXJkX2NsdXN0ZXJzKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU1dBUF9OUl9PUkRFUlM7IGkrKykge1xuK1x0XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZW5vbmZ1bGxfY2x1c3RlcnNbaV0pO1xuK1x0XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNnNpLVx1MDAzZWZyYWdfY2x1c3RlcnNbaV0pO1xuK1x0XHR9XG4rXG4rXHRcdC8qIE1hcmsgbWFwcGVkIGNsdXN0ZXJzOiBjbHVzdGVyIDAgaGFzIDEgYmFkIHNsb3QsIHJlc3QgZnJlZSAqL1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaS1cdTAwM2Vucl9jbHVzdGVyc19tYXBwZWQ7IGkrKykge1xuK1x0XHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBcdTAwMjZjbHVzdGVyX2luZm9baV07XG4rXG4rXHRcdFx0aWYgKGkgPT0gMCkge1xuK1x0XHRcdFx0Y2ktXHUwMDNlZmxhZ3MgPSBDTFVTVEVSX0ZMQUdfTk9ORlVMTDtcbitcdFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Y2ktXHUwMDNlbGlzdCwgXHUwMDI2c2ktXHUwMDNlbm9uZnVsbF9jbHVzdGVyc1swXSk7XG4rXHRcdFx0fSBlbHNlIHtcbitcdFx0XHRcdGNpLVx1MDAzZWZsYWdzID0gQ0xVU1RFUl9GTEFHX0ZSRUU7XG4rXHRcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmNpLVx1MDAzZWxpc3QsIFx1MDAyNnNpLVx1MDAzZWZyZWVfY2x1c3RlcnMpO1xuK1x0XHRcdH1cbitcdFx0fVxuK1xuK1x0XHQvKiBBbGwgbWFwcGVkIGNsdXN0ZXJzIGV4Y2VwdCBjbHVzdGVyIDAgYXJlIGZyZWUgYXQgdGhlIHRhaWwgKi9cbitcdFx0c2ktXHUwMDNlbnJfZnJlZV90YWlsID0gc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkIC0gMTtcbitcbitcdFx0bXV0ZXhfaW5pdChcdTAwMjZzaS1cdTAwM2V4c3dhcF9sb2NrKTtcbitcdFx0SU5JVF9XT1JLKFx1MDAyNnNpLVx1MDAzZXhzd2FwX3Nocmlua193b3JrLCB4c3dhcF9zaHJpbmtfd29ya19mbik7XG4rXHRcdHhzd2FwX2RlYnVnZnNfYWRkKHNpKTtcbitcdFx0cmV0dXJuIDA7XG4rXG4rZXJyX3VubWFwOlxuK1x0XHR4c3dhcF91bm1hcF9jbHVzdGVycyhzaSwgMCwgc2ktXHUwMDNlbnJfY2x1c3RlcnNfbWFwcGVkKTtcbitlcnJfZnJlZV92bTpcbitcdFx0ZnJlZV92bV9hcmVhKHNpLVx1MDAzZWNsdXN0ZXJfdm0pO1xuK1x0XHRzaS1cdTAwM2VjbHVzdGVyX3ZtID0gTlVMTDtcbitcdFx0c2ktXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbisjZW5kaWYgLyogQ09ORklHX1hTV0FQICovXG4rXG4gXHRjbHVzdGVyX2luZm8gPSBrdnphbGxvY19vYmpzKCpjbHVzdGVyX2luZm8sIG5yX2NsdXN0ZXJzKTtcbiBcdGlmICghY2x1c3Rlcl9pbmZvKVxuIFx0XHRnb3RvIGVycjtcbkBAIC0zNTk5LDcgKzQyNTEsNyBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRzaS1cdTAwM2VjbHVzdGVyX2luZm8gPSBjbHVzdGVyX2luZm87XG4gXHRyZXR1cm4gMDtcbiBlcnI6XG4tXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xuK1x0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzaSk7XG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbkBAIC0zODE4LDcgKzQ0NzAsNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFx0c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXIgPSBOVUxMO1xuIFx0aW5vZGUgPSBOVUxMO1xuIFx0ZGVzdHJveV9zd2FwX2V4dGVudHMoc2ksIHN3YXBfZmlsZSk7XG4tXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHNpLVx1MDAzZWNsdXN0ZXJfaW5mbywgc2ktXHUwMDNlbWF4KTtcbitcdGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc2kpO1xuIFx0c2ktXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbiBcdC8qXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xuQEAgLTM5MzAsNyArNDU4Miw2IEBAIHZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXG4gc3RhdGljIGludCBfX2luaXQgc3dhcGZpbGVfaW5pdCh2b2lkKVxuIHtcbiBcdHN3YXBmaWxlX21heGltdW1fc2l6ZSA9IGFyY2hfbWF4X3N3YXBmaWxlX3NpemUoKTtcbi1cbiBcdC8qXG4gXHQgKiBPbmNlIGEgY2x1c3RlciBpcyBmcmVlZCwgaXQncyBzd2FwIHRhYmxlIGNvbnRlbnQgaXMgcmVhZFxuIFx0ICogb25seSwgYW5kIGFsbCBzd2FwIGNhY2hlIHJlYWRlcnMgKHN3YXBfY2FjaGVfKikgdmVyaWZpZXNcbkBAIC0zOTQwLDEyICs0NTkxLDE1IEBAIHN0YXRpYyBpbnQgX19pbml0IHN3YXBmaWxlX2luaXQodm9pZClcbiBcdFx0c3dhcF90YWJsZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShcInN3YXBfdGFibGVcIixcbiBcdFx0XHRcdCAgICBzaXplb2Yoc3RydWN0IHN3YXBfdGFibGUpLFxuIFx0XHRcdFx0ICAgIDAsIFNMQUJfUEFOSUMgfCBTTEFCX1RZUEVTQUZFX0JZX1JDVSwgTlVMTCk7XG4tXG4gI2lmZGVmIENPTkZJR19NSUdSQVRJT05cbiBcdGlmIChzd2FwZmlsZV9tYXhpbXVtX3NpemUgXHUwMDNlPSAoMVVMIFx1MDAzY1x1MDAzYyBTV1BfTUlHX1RPVEFMX0JJVFMpKVxuIFx0XHRzd2FwX21pZ3JhdGlvbl9hZF9zdXBwb3J0ZWQgPSB0cnVlO1xuICNlbmRpZlx0LyogQ09ORklHX01JR1JBVElPTiAqL1xuIFxuKyNpZmRlZiBDT05GSUdfWFNXQVBcbitcdHhzd2FwX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihcInhzd2FwXCIsIE5VTEwpO1xuKyNlbmRpZlxuK1xuIFx0cmV0dXJuIDA7XG4gfVxuIHN1YnN5c19pbml0Y2FsbChzd2FwZmlsZV9pbml0KTtcbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xuaW5kZXggZjdjOWM4OWY2NDQ5Yy4uNjE3ODQ2NWQwNTgzNyAxMDA2NDRcbi0tLSBhL21tL3pzd2FwLmNcbisrKyBiL21tL3pzd2FwLmNcbkBAIC05OTgsNyArOTk4LDEyIEBAIHN0YXRpYyBpbnQgenN3YXBfd3JpdGViYWNrX2VudHJ5KHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnksXG4gXHQvKiB0cnkgdG8gYWxsb2NhdGUgc3dhcCBjYWNoZSBmb2xpbyAqL1xuIFx0c2kgPSBnZXRfc3dhcF9kZXZpY2Uoc3dwZW50cnkpO1xuIFx0aWYgKCFzaSlcbi1cdFx0cmV0dXJuIC1FRVhJU1Q7XG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfWFNXQVApIHtcbitcdFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4gXG4gXHRtcG9sID0gZ2V0X3Rhc2tfcG9saWN5KGN1cnJlbnQpO1xuIFx0Zm9saW8gPSBzd2FwX2NhY2hlX2FsbG9jX2ZvbGlvKHN3cGVudHJ5LCBHRlBfS0VSTkVMLCBCSVQoMCksIE5VTEwsIG1wb2wsXG5AQCAtMTUzNSw3ICsxNTQwLDcgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0enN3YXBfcG9vbF9wdXQocG9vbCk7XG4gcHV0X29iamNnOlxuIFx0b2JqX2Nncm91cF9wdXQob2JqY2cpO1xuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsKVxuK1x0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsIFx1MDAyNlx1MDAyNiBhdG9taWNfcmVhZChcdTAwMjZucl9yZWFsX3N3YXBmaWxlcykpXG4gXHRcdHF1ZXVlX3dvcmsoc2hyaW5rX3dxLCBcdTAwMjZ6c3dhcF9zaHJpbmtfd29yayk7XG4gY2hlY2tfb2xkOlxuIFx0LypcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE0OjM5LjQ3ODY0NjA0MloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE0MTIzMzE5ODE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlhzd2FwIFBhdGNoIEV2YWx1YXRpb246IEZ1enppbmcgRm9jdXMqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlIGhhdmUgYSBwYXRjaCBzZXJpZXMgaW50cm9kdWNpbmcgXCJ4c3dhcCxcIiBhbiBcIkV4dGVuZGFibGUgc3dhcCBkZXZpY2UuXCIgTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgd2hldGhlciB0aGlzIGludHJvZHVjZXMgbmV3IGtlcm5lbCBmdW5jdGlvbmFsaXR5IGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgbmVlZHMgZnV6emluZy5cblxuVGhlIHBhdGNoJ3Mga2V5IGlzIHRoZSBgQ09ORklHX1hTV0FQYCBLY29uZmlnIG9wdGlvbi4gRGVwZW5kZW5jeSBvbiBgU1dBUGAgYW5kIGA2NEJJVGAgYXJlIHJlYXNvbmFibGUuIFRoZSByZWFsbHkgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGUgbW9kaWZpY2F0aW9uIHRvIGBtbS9zd2FwZmlsZS5jYCwgZXNwZWNpYWxseSB0aGUgaGFuZGxpbmcgb2YgdGhlIGBTV1BfWFNXQVBgIGZsYWcuIFNwZWNpZmljYWxseSwgdGhlIGBkZWJ1Z2ZzYCBpbnRlcmZhY2UgZXhwb3NpbmcgYHR5cGVcdTAwM2NOXHUwMDNlX2NsdXN0ZXJfbGltaXRgIGxvb2tzIGxpa2UgYSBwcmltZSB0YXJnZXQuIFRoZSBjb3JlIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBzZWVtcyB0byBiZSB0cmlnZ2VyZWQgYnkgY3JlYXRpbmcgYSBzd2FwIGZpbGUgdGhhdCdzIHByZWNpc2VseSBgUEFHRV9TSVpFYCBpbiBzaXplLiBBbmQgdGhlbiBydW5uaW5nIGBzd2Fwb25gLiBTbyB0aGlzIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZS4gQmluZ28hIFRoaXMgaXMgYSBnb29kIHNpZ24gZm9yIGZ1enppbmcuXG5cbk5vdywgd2hpY2ggZnVuY3Rpb25zIGFyZSBtb3N0IHJlbGV2YW50PyBUaGUgcGF0Y2ggdG91Y2hlcyBhIGxvdCBvZiBjb2RlLCBtb2RpZnlpbmcgc2V2ZXJhbCBmaWxlcy4gSSd2ZSBzY2FubmVkIHRoZSBjaGFuZ2VzLCBub3RpbmcgYSBidW5jaCBvZiBmdW5jdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIG9yIG1vZGlmaWVkLiBUaGUga2V5IG9uZXMgdGhhdCBpbW1lZGlhdGVseSBqdW1wIG91dCBhcmU6IGB4c3dhcF9tYXBfY2x1c3RlcnNgLCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLCBgeHN3YXBfY2hlY2tfbWFwcGVkYCwgYHhzd2FwX3RyaW1fZnJlZV90YWlsYCwgYHhzd2FwX3VwZGF0ZV9mcmVlX3RhaWxgLCBgeHN3YXBfdHJ5X3Nocmlua2AsIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGAsIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLCBgeHN3YXBfZGVidWdmc19hZGRgLCBgeHN3YXBfZGVidWdmc19kZWxgLCBgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvYCwgYHJlYWRfc3dhcF9oZWFkZXJgLCBgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5YCwgYF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXNgLCBgX19mcmVlX2NsdXN0ZXJgLCBgc3dhcG9mZmAsIGBzd2Fwb25gLlxuXG5SZW1lbWJlcmluZyB0aGUgZnV6emluZyBwcmluY2lwbGUsIFwicHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXCIuXG5cbmBzeXNfc3dhcG9uYCBhbmQgYHN5c19zd2Fwb2ZmYCBhcmUgdGhlIGVudHJ5IHBvaW50cyBzbyB0aGVzZSBhcmUgb2J2aW91cyB0YXJnZXRzLiBMZXQncyBkaWcgZGVlcGVyOlxuXG5XaGlsZSBgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5YCBpcyBtb2RpZmllZCwgaXQncyBzdGF0aWMsIHNvIGxlc3MgaW50ZXJlc3RpbmcgZnJvbSBhIGZ1enppbmcgcGVyc3BlY3RpdmUsIHVubGVzcyBpdCdzIG5vdCBpbmxpbmVkLlxuXG5UaGUgZm9jdXMgc2hvdWxkIGJlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGluIHRoZSBtb2RpZmllZCBmaWxlcy4gTGV0J3Mgc2VlLi4uIGxvb2tpbmcgYXQgYG1tL3N3YXBmaWxlLmNgLCB0aGVyZSdzIG5vdCBhIGxvdCBvZiBub24tc3RhdGljIHN0dWZmIHRoYXQgSSBjYW4gc2VlIGRpcmVjdGx5LCBgc2V0dXBfc3dhcF9leHRlbnRzYCBpcyBzdGF0aWMuXG5cbkluIGBtbS9wYWdlX2lvLmNgLCBib3RoIGBzd2FwX3dyaXRlb3V0YCBhbmQgYHN3YXBfcmVhZF9mb2xpb2AgYXJlIG5vbi1zdGF0aWM7IGtlZXAgdGhlbSBpbiBtaW5kLiBgc3dhcF9jbHVzdGVyX3JlYWRhaGVhZGAgaW4gYG1tL3N3YXBfc3RhdGUuY2AgaXMgbm9uLXN0YXRpYyBhcyB3ZWxsLlxuXG5JbiBgbW0venN3YXAuY2AsIGB6c3dhcF9zdG9yZWAgaXMgbm9uLXN0YXRpYy5cblxuQWgsIGJ1dCB3YWl0LiBgeHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlYC4gVGhpcyBpcyB0cmlnZ2VyZWQgdmlhIGEgZGVidWdmcyB3cml0ZSwgd2hpY2ggaXMgYW5vdGhlciBlbnRyeXBvaW50LiBJIHRob3VnaHQgdGhpcyB3YXMgc3RhdGljLCBidXQgaXQgY2Fubm90IGJlIGlubGluZWQsIGJlY2F1c2UgaXQncyBwYXNzZWQgYXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIGBkZWJ1Z2ZzX2NyZWF0ZV9maWxlYC4gVGhpcyBpcyBhbiBpZGVhbCB0YXJnZXQhXG5cbkxldCdzIHF1aWNrbHkgY29uZmlybSB3aXRoIGEgYGRlZmF1bHRfYXBpOmdyZXBwZXJgIHRvIGJlIDEwMCUgc3VyZS4gSSB3YW50IHRvIG1ha2Ugc3VyZSBJIGRvbid0IG1pc3Mgc29tZXRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDA0OCwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwODgsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNDo1My42MDE5Njc4NjhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU3MDY0OTI0MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcGZpbGUuYz04Nj1zdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZixcXG4tLVxcbm1tL3N3YXBmaWxlLmMtOTYtXFxubW0vc3dhcGZpbGUuYzo5NzpzdGF0aWMgc3NpemVfdCB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsXFxubW0vc3dhcGZpbGUuYy05OC1cXHRcXHRcXHRcXHRcXHRjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxcbi0tXFxubW0vc3dhcGZpbGUuYz0xMzY9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHN3YXBfZGVidWdmc19mb3BzID0ge1xcbm1tL3N3YXBmaWxlLmMtMTM3LVxcdC5yZWFkID0geHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWQsXFxubW0vc3dhcGZpbGUuYzoxMzg6XFx0LndyaXRlID0geHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlLFxcbm1tL3N3YXBmaWxlLmMtMTM5LVxcdC5vcGVuID0gc2ltcGxlX29wZW4sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE0OjU1LjE3MjYyMjA5OVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQwNjA2OTI2MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFN3YXAgQ2x1c3RlciBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBzd2FwLXJlbGF0ZWQgZnVuY3Rpb25zLCBhbmQgeWVwLCB0aGV5J3JlIGRlZmluaXRlbHkgcHJlc2VudC4gSSBzZWU6IGB4c3dhcF9tYXBfY2x1c3RlcnNgLCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLCBgeHN3YXBfdHJ5X3Nocmlua2AsIGB4c3dhcF91cGRhdGVfZnJlZV90YWlsYCwgYW5kIGB4c3dhcF90cmltX2ZyZWVfdGFpbGAuIEEgcXVpY2sgY2hlY2sgY29uZmlybXMgdGhlc2UgYXJlIGRlY2xhcmVkIHN0YXRpYyDigJMgZ29vZCwgdGhhdCdzIHdoYXQgSSBleHBlY3RlZC4gTm93LCBqdXN0IGJlY2F1c2UgdGhleSdyZSBzdGF0aWMgZG9lc24ndCBhdXRvbWF0aWNhbGx5IG1lYW4gdGhleSdyZSBpbmxpbmVkLCBzbyB0aGF0J3Mgc29tZXRoaW5nIHRvIGtlZXAgaW4gbWluZC4gSSBuZWVkIHRvIGRpZyBhIGxpdHRsZSBkZWVwZXIuIExldCBtZSBleGFtaW5lIGBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm9gIG5leHQuIFRoYXQgc2hvdWxkIHByb3ZpZGUgc29tZSBjb250ZXh0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjA5MywiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE0OjU5LjIzMzMxNjU1NloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjgwNjkxMTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNldHVwX3N3YXBfY2x1c3RlcnNfaW5mb1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwZmlsZS5jPTQwNjk9c3RhdGljIHZvaWQgeHN3YXBfdHJ5X3NocmluayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQxMTMtXFxubW0vc3dhcGZpbGUuYzo0MTE0OnN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTQxMTUtXFx0XFx0XFx0XFx0ICAgIHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcXG4tLVxcbm1tL3N3YXBmaWxlLmM9NDI1OD1TWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbi0tXFxubW0vc3dhcGZpbGUuYy00MzY5LVxcdC8qIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8gKi9cXG5tbS9zd2FwZmlsZS5jOjQzNzA6XFx0ZXJyb3IgPSBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc2ksIHN3YXBfaGVhZGVyLCBtYXhwYWdlcyk7XFxubW0vc3dhcGZpbGUuYy00MzcxLVxcdGlmIChlcnJvcilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MDAuOTE0MDE0MzU5WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Njg1NTMzMjgzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgU3dhcCBFbnRyeSBQb2ludHMgYW5kIENvcmUgeHN3YXAgRnVuY3Rpb25zKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIGFib3V0IGhvdyB0byBiZXN0IGNoYXJhY3Rlcml6ZSB0aGUgY2hhbmdlcyBpbiB0aGlzIHBhdGNoLCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGdvZXMgc3RyYWlnaHQgdG8gc3lzdGVtIGNhbGwgZW50cnkgcG9pbnRzLiBgc3lzX3N3YXBvbmAgYW5kIGBzeXNfc3dhcG9mZmAgYXJlIHRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50cy4gQnV0LCB3YWl0LCBJIG5lZWQgdG8gYmUgcHJlY2lzZS4gSSByZW1lbWJlciBgc3lzX3N3YXBvbmAgaXMgcHJvYmFibHkgYSB3cmFwcGVyIGxpa2UgYF9feDY0X3N5c19zd2Fwb25gIHdoaWNoIHRoZW4gY2FsbHMgdGhlIGFjdHVhbCBmdW5jdGlvbiwgYF9fZG9fc3lzX3N3YXBvbmAgb3IgYHN5c19zd2Fwb25gIGRpcmVjdGx5LiBcblxuTm93LCBJIHN0YXJ0IGxpc3Rpbmcgc29tZSByZWxhdGVkIGZ1bmN0aW9ucyB0aGF0IGNvbWUgdG8gbWluZDogYHN3YXBfd3JpdGVvdXRgLCBgc3dhcF9yZWFkX2ZvbGlvYCwgYHN3YXBfY2x1c3Rlcl9yZWFkYWhlYWRgLCBhbmQgYHpzd2FwX3N0b3JlYC4gQnV0IGhvbGQgb24sIHRoZSBwcm9tcHQgc3BlY2lmaWNhbGx5IHNheXMgdG8gYXZvaWQgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8ga2VlcCB0aGUgdGVzdCBkaXN0cmlidXRpb25zIGZyb20gYmVpbmcgc2tld2VkISBTbywgc2NyYXRjaCB0aG9zZSDigJMgdGhleSdyZSB0b28gY29tbW9uLlxuXG5JbnN0ZWFkLCBJIG5lZWQgdG8gZHJpbGwgZG93biBpbnRvIHRoZSBzZXR1cCwgdGVhcmRvd24sIGFuZCAqc3BlY2lmaWMqIHhzd2FwIGZ1bmN0aW9ucyB0aGF0IHJlYWxseSBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoaXMuIENhbiBJIGxpc3QgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAsIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGAsIGB4c3dhcF9zaHJpbmtfd29ya19mbmAsIGB4c3dhcF9tYXBfY2x1c3RlcnNgLCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLCBhbmQgYHhzd2FwX3RyeV9zaHJpbmtgPyBFdmVuIGlmIHNvbWUgYXJlIGRlY2xhcmVkIGBzdGF0aWNgLCB0aGV5J3JlIGNlbnRyYWwgdG8gdGhlIGNoYW5nZXMuXG5cbkxldCBtZSBqdXN0IHF1aWNrbHkgdmVyaWZ5IGhvdyBgeHN3YXBfbWFwX2NsdXN0ZXJzYCBpcyB1c2VkLiBJcyBpdCBwYXNzZWQgYXMgYSBwb2ludGVyIG9yIGp1c3QgY2FsbGVkPyBPa2F5LCBpdCdzIGp1c3QgY2FsbGVkIGRpcmVjdGx5LCBidXQgaXQgbG9va3MgbGlrZSBhIGxhcmdlIGZ1bmN0aW9uIHNvIGl0J3MgcHJvYmFibHkgbm90IGlubGluZWQuXG5cbkFuZCB3aGF0IGFib3V0IGB4c3dhcF9zaHJpbmtfd29ya19mbmA/IFllcywgaXQncyBwYXNzZWQgdG8gYElOSVRfV09SS2AsIHNvIEkga25vdyBmb3Igc3VyZSB0aGF0IGl0IHdvbid0IGJlIGlubGluZWQuIFRoaXMgc2hvdWxkIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY1OTYsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MDcuNzY5MzQ5OTAxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NjEzMDI5OTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwieHN3YXBfc2hyaW5rX3dvcmtfZm5cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcGZpbGUuYz00MDM5PXN0YXRpYyB2b2lkIHhzd2FwX3RyaW1fZnJlZV90YWlsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBpZHgpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwNTctXFxubW0vc3dhcGZpbGUuYzo0MDU4OnN0YXRpYyB2b2lkIHhzd2FwX3Nocmlua193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG5tbS9zd2FwZmlsZS5jLTQwNTkte1xcbi0tXFxubW0vc3dhcGZpbGUuYz00MTE0PXN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmMtNDE3Mi1cXHRcXHRtdXRleF9pbml0KFxcdTAwMjZzaS1cXHUwMDNleHN3YXBfbG9jayk7XFxubW0vc3dhcGZpbGUuYzo0MTczOlxcdFxcdElOSVRfV09SSyhcXHUwMDI2c2ktXFx1MDAzZXhzd2FwX3Nocmlua193b3JrLCB4c3dhcF9zaHJpbmtfd29ya19mbik7XFxubW0vc3dhcGZpbGUuYy00MTc0LVxcdFxcdHhzd2FwX2RlYnVnZnNfYWRkKHNpKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MDkuMjMwNjYyOTA5WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTc1NTMyMTcwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBYU1dBUCBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIEkndmUgYmVlbiByZXZpZXdpbmcgdGhpcyBjb2RlLCBhbmQgaXQncyBjbGVhciB0aGF0IGB4c3dhcF9zaHJpbmtfd29ya19mbmAsIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgLCBhbmQgYHhzd2FwX21heF9jbHVzdGVyc19yZWFkYCBhcmUgKm5vdCogaW5saW5lZCwgd2hpY2ggaXMgZ29vZCB0byBub3RlLiBBbHNvLCBib3RoIGB4c3dhcF9jaGVja19tYXBwZWRgIGFuZCBgeHN3YXBfY29sbGVjdF9wYWdlYCBhcmUgcGFzc2VkIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGBhcHBseV90b19leGlzdGluZ19wYWdlX3JhbmdlYCwgY29uZmlybWluZyB0aGV5IHdvbid0IGJlIGlubGluZWQgZWl0aGVyLlxuXG5Ob3csIHJlZ2FyZGluZyB0aGUgbmVjZXNzYXJ5IEtjb25maWcgb3B0aW9ucywgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGBDT05GSUdfWFNXQVBgLCBhbmQgaXQgZXhwbGljaXRseSBkZXBlbmRzIG9uIGJvdGggYFNXQVBgIGFuZCBgNjRCSVRgLiBTbywgYFhTV0FQYCBpcyBkZWZpbml0ZWx5IHRoZSBtYWluIG9uZSB0byBmb2N1cyBvbiBmb3IgZW5hYmxpbmcgdGhpcyBmZWF0dXJlLiBJIG5lZWQgdG8gbWFrZSBhIG5vdGUgb2YgdGhpcy5cblxuQXJlIHRoZXJlIGFueSBvdGhlciBkZXBlbmRlbmNpZXM/IExldCdzIHNlZS4uLiBgQ09ORklHX0RFQlVHX0ZTYCBpcyBhcHBhcmVudGx5IHJlcXVpcmVkIGJlY2F1c2Ugb2YgYGRlYnVnZnNfY3JlYXRlX2ZpbGVgLiBBbHRob3VnaCBgZGVidWdmc19jcmVhdGVfZmlsZWAgaGFzIGEgZHVtbXkgaW5saW5lIGlmIGBERUJVR19GU2AgaXMgZGlzYWJsZWQsIGFuZCB0aHVzIGlzbid0ICpzdHJpY3RseSogcmVxdWlyZWQgZm9yIGNvbXBpbGF0aW9uLCBpdCdzIGRlZmluaXRlbHkgbmVlZGVkIGZvciB0ZXN0aW5nIHRoZSBkZWJ1Z2ZzIGludGVyZmFjZSwgc28gSSBzaG91bGQgcHJvYmFibHkgaW5jbHVkZSBpdCBmb3IgZnVsbCBmdW5jdGlvbmFsaXR5LiBJIG5lZWQgdG8gY2hlY2sgYG1tL0tjb25maWdgIHRvIGNvbmZpcm0gd2hlcmUgYFhTV0FQYCBpcyBkZWZpbmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzU3MiwiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNToxNC45ODU5ODczMThaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzczNDIzMjMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFhTV0FQXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9MTE0PWNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRcXG4tLVxcbm1tL0tjb25maWctMTI0LVxcbm1tL0tjb25maWc6MTI1OmNvbmZpZyBYU1dBUFxcbm1tL0tjb25maWctMTI2LVxcdGJvb2wgXFxcIkV4dGVuZGFibGUgKHZpcnR1YWwpIHN3YXAgZGV2aWNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNToxNi41MjMzMzgwNDFaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUzNzYyMTM0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKk5hdmlnYXRpbmcgdGhlIEtjb25maWcgTGFieXJpbnRoKipcblxuT2theSwgdGltZSB0byBkaXZlIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGFnYWluLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIHNldHRpbmdzIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSwgc29tZXRoaW5nIEknbSB0cm91Ymxlc2hvb3RpbmcuIExldCdzIHNlZS4uLiBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgaXMgdXN1YWxseSB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEknbGwgbmVlZCB0byBnbyB0byB0aGF0IGZpbGUgdG8gY2hlY2sgd2hhdCB0aGUgS2NvbmZpZyBzZXR0aW5ncyBhcmUsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAxMjUsIHRoYXQncyB1c3VhbGx5IHdoZXJlIHRoZSByZWxldmFudCBvcHRpb25zIGFyZS4gSSdsbCBmb2N1cyBteSBpbnZlc3RpZ2F0aW9uIHRoZXJlLiBIb3BlZnVsbHksIHRoYXQgd2lsbCBnaXZlIG1lIHNvbWUgY2xhcml0eSBvbiB0aGUgZmVhdHVyZSBhbmQgaXRzIGNvbmZpZ3VyYXRpb24uIEknbSBob3BpbmcgSSBjYW4gZmluZCB0aGUgYW5zd2VyIHF1aWNrbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MjEyLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MjAuMDYwOTYxNTg0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk2NjcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMTE1LFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTE1OlxcdCAgICAgICBzdHJpbmdcXG4gMTE2OlxcdCAgICAgICBkZXBlbmRzIG9uIFpTV0FQXFxuIDExNzpcXHQgICAgICAgZGVmYXVsdCBcXFwiZGVmbGF0ZVxcXCIgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0RFRkxBVEVcXG4gMTE4OlxcdCAgICAgICBkZWZhdWx0IFxcXCJsem9cXFwiIGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWk9cXG4gMTE5OlxcdCAgICAgICBkZWZhdWx0IFxcXCI4NDJcXFwiIGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF84NDJcXG4gMTIwOlxcdCAgICAgICBkZWZhdWx0IFxcXCJsejRcXFwiIGlmIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRcXG4gMTIxOlxcdCAgICAgICBkZWZhdWx0IFxcXCJsejRoY1xcXCIgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaNEhDXFxuIDEyMjpcXHQgICAgICAgZGVmYXVsdCBcXFwienN0ZFxcXCIgaWYgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX1pTVERcXG4gMTIzOlxcdCAgICAgICBkZWZhdWx0IFxcXCJcXFwiXFxuIDEyNDpcXHRcXG4gMTI1OlxcdGNvbmZpZyBYU1dBUFxcbiAxMjY6XFx0XFx0Ym9vbCBcXFwiRXh0ZW5kYWJsZSAodmlydHVhbCkgc3dhcCBkZXZpY2VcXFwiXFxuIDEyNzpcXHRcXHRkZXBlbmRzIG9uIFNXQVAgXFx1MDAyNlxcdTAwMjYgNjRCSVRcXG4gMTI4OlxcdFxcdGhlbHBcXG4gMTI5OlxcdFxcdCAgQWRkcyBzdXBwb3J0IGZvciBleHRlbmRhYmxlIHN3YXAgZGV2aWNlcyAoeHN3YXApIHRoYXQgZGVjb3VwbGVcXG4gMTMwOlxcdFxcdCAgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gVGhlIGNsdXN0ZXJfaW5mb1xcbiAxMzE6XFx0XFx0ICBhcnJheSBpcyBiYWNrZWQgYnkgYSBzcGFyc2Ugdm1hbGxvYyBhcmVhIHRoYXQgZ3Jvd3MgYW5kIHNocmlua3NcXG4gMTMyOlxcdFxcdCAgb24gZGVtYW5kLCBhdm9pZGluZyBzdGF0aWMgcHJlLWFsbG9jYXRpb24gb3ZlcmhlYWQuXFxuIDEzMzpcXHRcXG4gMTM0OlxcdGNvbmZpZyBaU01BTExPQ1xcbiAxMzU6XFx0XFx0dHJpc3RhdGVcXG4gMTM2OlxcdFxcbiAxMzc6XFx0bWVudSBcXFwiWnNtYWxsb2MgYWxsb2NhdG9yIG9wdGlvbnNcXFwiXFxuIDEzODpcXHRcXHRkZXBlbmRzIG9uIFpTTUFMTE9DXFxuIDEzOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6MjAuMDYxMDU5NDU0WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcwNjEzNTM0NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQ29uZmlndXJhdGlvbiBDaG9pY2VzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgdGhlIGZpcnN0IHRoaW5nIEkgbmVlZCB0byBkbyBpcyBjb25maWd1cmUgaXQuIFRoZSBjcml0aWNhbCBwaWVjZSBoZXJlIHNlZW1zIHRvIGJlIGBYU1dBUGAsIHNvIEknbGwgYmUgc3VyZSB0byBhZGQgdGhhdCB0byB0aGUgYEVuYWJsZUNvbmZpZ3NgLiBHaXZlbiB0aGF0IGRlYnVnZnMgaXMgYSBjZW50cmFsIHBhcnQgb2YgdGhpcywgSSdsbCBhbHNvIGJyaW5nIGluIGBERUJVR19GU2AgdG8gZW5zdXJlIHdlIGNhbiBmdXp6IGl0IGVmZmVjdGl2ZWx5LiBUaGF0J2xsIGJlIGltcG9ydGFudCBmb3IgdGhvcm91Z2ggdGVzdGluZy5cblxuTm93LCBvbiB0byB0aGUgQVBJIGV4cG9zdXJlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBmdW5jdGlvbnMgYXJlIHRoZSBrZXkgZW50cnkgcG9pbnRzLiBMZXQgbWUgc2VlIGlmIGB4c3dhcF9tYXBfY2x1c3RlcnNgIGlzIHN0YXRpYyAtIHllcCwgaXQgaXMuIFRoZSBwcm9tcHQgZG9lcyBzYXkgdG8gXCJQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcIi5cblxuQWxyaWdodCwgaGVyZeKAmXMgbXkgcGxhbiBmb3IgbGlzdGluZzogSSdsbCBpbmNsdWRlOlxuKiAgIGB4c3dhcF9tYXhfY2x1c3RlcnNfd3JpdGVgXG4qICAgYHhzd2FwX21heF9jbHVzdGVyc19yZWFkYFxuKiAgIGB4c3dhcF9zaHJpbmtfd29ya19mbmBcbiogICBgeHN3YXBfY2hlY2tfbWFwcGVkYFxuKiAgIGB4c3dhcF9jb2xsZWN0X3BhZ2VgXG4qICAgYHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mb2AgKGV2ZW4gdGhvdWdoIGl0J3Mgc3RhdGljLCBpdCdzIGEgbWFqb3Igc2V0dXAgZnVuY3Rpb24gYW5kIHByZXR0eSBzaWduaWZpY2FudCkuXG5cbkhhbmcgb24sIGRpZCBJIGp1c3QgbGlzdCBgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvYD8gVGhhdCdzIHJpZ2h0LCBpdCAqaXMqIHN0YXRpYy4gTGV0IG1lIHF1aWNrbHkgcmVhc3Nlc3MuIEkgc2hvdWxkIGNvbnNpZGVyIGBzeXNfc3dhcG9uYCBhbmQgYHN5c19zd2Fwb2ZmYCEgQmVpbmcgc3lzY2FsbHMsIHRoZXNlIGFyZSBkZWZpbml0ZWx5IGVudHJ5IHBvaW50cy4gSSBzaG91bGQgYWxzbyBjaGVjayBgbW0vc3dhcGZpbGUuY2AgdG8gYmUgY2VydGFpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg4MjMsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQwOToxNToyNy4xMjI0MTU4NjJaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwODAwMDk0ODUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiU1lTQ0FMTF9ERUZJTkUuKnN3YXBvblwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwZmlsZS5jPTQxMTQ9c3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbi0tXFxubW0vc3dhcGZpbGUuYy00MjU3LVxcbm1tL3N3YXBmaWxlLmM6NDI1ODpTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbm1tL3N3YXBmaWxlLmMtNDI1OS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDA5OjE1OjI5LjIwMjQyOTc2N1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTI3ODk3NzA5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBYc3dhcCBGdXp6aW5nIFRhcmdldCBTZWxlY3Rpb24qKlxuXG5Pa2F5LCBsZXQncyB0aGluayB0aGlzIHRocm91Z2guIFRoZSBwcm9tcHQgYXNrcyBmb3IgYSBsaXN0IG9mIGtlcm5lbCBmdW5jdGlvbnMgdG8gZm9jdXMgZnV6emluZyBlZmZvcnRzIG9uLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbmV3IHhzd2FwIGZ1bmN0aW9uYWxpdHkuIFN5emthbGxlciB1c3VhbGx5IHVzZXMgdGhlIGFjdHVhbCBzeW1ib2wgbmFtZXMsIHNvIEkgbmVlZCB0byBkZWNpZGUgd2hhdCdzIG1vc3QgYXBwcm9wcmlhdGUgaGVyZS4gU2hvdWxkIEkgbGlzdCB0aGUgc3lzY2FsbCBlbnRyeSBwb2ludCAoYF9feDY0X3N5c19zd2Fwb25gIG9yIGBzeXNfc3dhcG9uYCkgb3IgZGVsdmUgZGVlcGVyIGludG8gdGhlIGludGVybmFscz9cblxuVGhlIHByZWZlcmVuY2UgaXMgZm9yIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cy4gVGhpbmtpbmcgYWJvdXQgdGhhdCwgdGhlIG9yaWdpbmFsIHRob3VnaHQgd2FzIHRvIGxpc3QgZnVuY3Rpb25zICppbnNpZGUqIHRoZSBzeXNjYWxsLCBsaWtlIGBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm9gLiBCdXQgdGhlbiB0aGUgcHJvbXB0IGNsYXJpZmllZCB0aGUgbmVlZCB0byBhdm9pZCBzdGF0aWMgaW5saW5lZCBoZWxwZXIgZnVuY3Rpb25zLiBUaGF0IG1ha2VzIHNlbnNlLlxuXG5TbywgSSBuZWVkIHRvIGlkZW50aWZ5IGZ1bmN0aW9ucyB0aGF0IGFyZSAqbm90KiBpbmxpbmVkIGFuZCBoYXZlIGRpc3RpbmN0IGFkZHJlc3Nlcy4gSW1tZWRpYXRlbHksIEknbSB0aGlua2luZyBhYm91dCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgdXNlZC4gRnVuY3Rpb25zIGxpa2UgYHhzd2FwX21heF9jbHVzdGVyc193cml0ZWAsIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGAsIGB4c3dhcF9zaHJpbmtfd29ya19mbmAsIGB4c3dhcF9jaGVja19tYXBwZWRgLCBhbmQgYHhzd2FwX2NvbGxlY3RfcGFnZWAgYXJlIHBhc3NlZCBhcyBmdW5jdGlvbiBwb2ludGVycy4gVGhlc2UgYXJlIGhpZ2hseSB1bmxpa2VseSB0byBiZSBpbmxpbmVkIGFuZCBhcmUgZ3JlYXQgY2FuZGlkYXRlcy5cblxuV2hhdCBhYm91dCBvdGhlciBmdW5jdGlvbnM/IGBzd2FwX3R5cGVfc3RyYCBpcyBhIHByaW50IGhlbHBlciwgc28gdGhhdCdzIG91dC4gVGhlbiBteSBtaW5kIGlzIG9uIGB4c3dhcF9tYXBfY2x1c3RlcnNgIGFuZCBgeHN3YXBfdW5tYXBfY2x1c3RlcnNgLiBUaGV5ICptaWdodCogYmUgaW5saW5lZC4gQnV0IGB4c3dhcF9tYXBfY2x1c3RlcnNgIGlzIGEgc3Vic3RhbnRpYWwgZnVuY3Rpb27igJQxMzAgbGluZXMhIEl0J3MgcHJvYmFibHkgYSBnb29kIHRhcmdldCBiZWNhdXNlIGl0IGlzIGxlc3MgbGlrZWx5IHRvIGJlIGlubGluZWQuXG5cblRoZSB4c3dhcCBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dGVuZGFibGUgdmlydHVhbCBzd2FwIGRldmljZS4gVGhlIGltcGxlbWVudGF0aW9uIGRlY291cGxlcyBQVEUgc3dhcCBlbnRyaWVzIGZyb20gcGh5c2ljYWwgYmFja2luZyBzdG9yYWdlIGFuZCB1c2VzIGEgc3BhcnNlIHZtYWxsb2MgYXJlYSBmb3IgY2x1c3RlciBpbmZvLiBUaGlzIG9wZW5zIHVwIG5ldyBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0IG5lZWRzIGF0dGVudGlvbiwgaW5jbHVkaW5nIGRlYnVnZnMgaW50ZXJmYWNlcyBhbmQgYSBzaHJpbmtpbmcgd29ya3F1ZXVlLiBUaGUgbmV3IGZlYXR1cmUgaXMgZnVuY3Rpb25hbCwgc28gaXQgc2hvdWxkIGJlIGZ1enplZC5cblxuV2l0aCBhbGwgb2YgdGhpcyBpbiBtaW5kLCB0aGUgY29uZmlndXJhdGlvbnMgdG8gZW5hYmxlIGFyZSBgWFNXQVBgIGFuZCBgREVCVUdfRlNgLlxuXG5JJ2xsIHByb2NlZWQgd2l0aCB0aGVzZSBrZXkgc3ltYm9sczpcbiogICBgeHN3YXBfbWF4X2NsdXN0ZXJzX3dyaXRlYFxuKiAgIGB4c3dhcF9tYXhfY2x1c3RlcnNfcmVhZGBcbiogICBgeHN3YXBfc2hyaW5rX3dvcmtfZm5gXG4qICAgYHhzd2FwX2NoZWNrX21hcHBlZGBcbiogICBgeHN3YXBfY29sbGVjdF9wYWdlYFxuKiAgIGB4c3dhcF9tYXBfY2x1c3RlcnNgXG4qICAgYHhzd2FwX3VubWFwX2NsdXN0ZXJzYFxuXG5RdWljayBzYW5pdHkgY2hlY2s6IEFyZSBhbnkgb2YgdGhlc2UgZnVuY3Rpb25zICpzdGF0aWMqPyBZZXMsIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGludHJvZHVjZWQgYXJlIHN0YXRpYy4gVGhpcyBtZWFucyB0aGVyZSBhcmUgbm8gbm9uLXN0YXRpYyBmdW5jdGlvbnMgYWRkZWQsIGhvd2V2ZXIsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2VudHJhbCB0byB0aGUgbmV3IGZ1bmN0aW9uYWxpdHksIHdpdGggc29tZSBiZWluZyBmdW5jdGlvbiBwb2ludGVycywgdGhleSBhcmUgZ29vZCBjYW5kaWRhdGVzLlxuXG5Pa2F5LCBJJ20gY29uZmlkZW50IGluIHRoZXNlIHNlbGVjdGlvbnMuIE5vdywgbGV0J3MgY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTU1NywiT3V0cHV0VG9rZW5zIjoxODQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MDEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMDk6MTU6NDAuNDgxNDA5NDQxWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzUwMTQyMDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlhTV0FQXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInhzd2FwX21heF9jbHVzdGVyc193cml0ZVwiLFxuICAgIFwieHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRcIixcbiAgICBcInhzd2FwX3Nocmlua193b3JrX2ZuXCIsXG4gICAgXCJ4c3dhcF9jaGVja19tYXBwZWRcIixcbiAgICBcInhzd2FwX2NvbGxlY3RfcGFnZVwiLFxuICAgIFwieHN3YXBfbWFwX2NsdXN0ZXJzXCIsXG4gICAgXCJ4c3dhcF91bm1hcF9jbHVzdGVyc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlICh4c3dhcCkgdGhhdCBkZWNvdXBsZXMgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gSXQgdXNlcyBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgZm9yIGNsdXN0ZXIgaW5mbyB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzIGR5bmFtaWNhbGx5LiBUaGlzIGFkZHMgbmV3IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyBmb3Igc3dhcCBtYW5hZ2VtZW50LCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHdvcmtxdWV1ZSBmb3Igc2hyaW5raW5nLiBJdCBpcyBmdW5jdGlvbmFsIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlhTV0FQXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInhzd2FwX21heF9jbHVzdGVyc193cml0ZVwiLFxuICAgIFwieHN3YXBfbWF4X2NsdXN0ZXJzX3JlYWRcIixcbiAgICBcInhzd2FwX3Nocmlua193b3JrX2ZuXCIsXG4gICAgXCJ4c3dhcF9jaGVja19tYXBwZWRcIixcbiAgICBcInhzd2FwX2NvbGxlY3RfcGFnZVwiLFxuICAgIFwieHN3YXBfbWFwX2NsdXN0ZXJzXCIsXG4gICAgXCJ4c3dhcF91bm1hcF9jbHVzdGVyc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0ZW5kYWJsZSB2aXJ0dWFsIHN3YXAgZGV2aWNlICh4c3dhcCkgdGhhdCBkZWNvdXBsZXMgUFRFIHN3YXAgZW50cmllcyBmcm9tIHBoeXNpY2FsIGJhY2tpbmcgc3RvcmFnZS4gSXQgdXNlcyBhIHNwYXJzZSB2bWFsbG9jIGFyZWEgZm9yIGNsdXN0ZXIgaW5mbyB0aGF0IGdyb3dzIGFuZCBzaHJpbmtzIGR5bmFtaWNhbGx5LiBUaGlzIGFkZHMgbmV3IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyBmb3Igc3dhcCBtYW5hZ2VtZW50LCBpbmNsdWRpbmcgZGVidWdmcyBpbnRlcmZhY2VzIGFuZCBhIHdvcmtxdWV1ZSBmb3Igc2hyaW5raW5nLiBJdCBpcyBmdW5jdGlvbmFsIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflow4dljg[1] Phase: Succeeded StartedAt: 2026-08-05 09:16:26 +0000 UTC FinishedAt: 2026-08-05 09:16:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-05 09:16:26 +0000 UTC FinishedAt: 2026-08-05 09:16:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2] Phase: Succeeded StartedAt: 2026-08-05 09:16:26 +0000 UTC FinishedAt: 2026-08-05 12:59:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:16:26 +0000 UTC FinishedAt: 2026-08-05 12:59:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:16:26 +0000 UTC FinishedAt: 2026-08-05 09:16:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:16:26 +0000 UTC FinishedAt: 2026-08-05 09:16:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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-workflow4dljg/series-workflow4dljg-convert-artifact-117699662/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:16:36 +0000 UTC FinishedAt: 2026-08-05 09:32:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:16:36 +0000 UTC FinishedAt: 2026-08-05 09:32:38 +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:*341ad207-8f51-4def-9ec2-42a05da378d5,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-workflow4dljg/series-workflow4dljg-convert-artifact-117699662/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": "8ef576c1-ea65-4779-a6ac-cf223ab1a318", "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-workflow4dljg/series-workflow4dljg-build-action-1879727284/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:16:36 +0000 UTC FinishedAt: 2026-08-05 09:32:28 +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:*341ad207-8f51-4def-9ec2-42a05da378d5,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-workflow4dljg/series-workflow4dljg-convert-artifact-117699662/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": "8ef576c1-ea65-4779-a6ac-cf223ab1a318", "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-workflow4dljg/series-workflow4dljg-build-action-1879727284/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:32:38 +0000 UTC FinishedAt: 2026-08-05 09:32:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:32:38 +0000 UTC FinishedAt: 2026-08-05 09:32:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:32:38 +0000 UTC FinishedAt: 2026-08-05 09:32:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:32:38 +0000 UTC FinishedAt: 2026-08-05 09:32:42 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-workflow4dljg/series-workflow4dljg-convert-artifact-2408345153/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:32:48 +0000 UTC FinishedAt: 2026-08-05 09:34:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:32:48 +0000 UTC FinishedAt: 2026-08-05 09:34:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*8ef576c1-ea65-4779-a6ac-cf223ab1a318,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-workflow4dljg/series-workflow4dljg-build-action-1879727284/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-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:34:41 +0000 UTC FinishedAt: 2026-08-05 09:34:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:34:41 +0000 UTC FinishedAt: 2026-08-05 09:34:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:34:41 +0000 UTC FinishedAt: 2026-08-05 09:51:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:34:41 +0000 UTC FinishedAt: 2026-08-05 09:51:55 +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:*341ad207-8f51-4def-9ec2-42a05da378d5,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-workflow4dljg/series-workflow4dljg-convert-artifact-2408345153/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": "2488c322-7838-4644-bedc-5676c4ccf134", "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-workflow4dljg/series-workflow4dljg-build-action-896436173/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:34:41 +0000 UTC FinishedAt: 2026-08-05 09:51:44 +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:*341ad207-8f51-4def-9ec2-42a05da378d5,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-workflow4dljg/series-workflow4dljg-convert-artifact-2408345153/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": "2488c322-7838-4644-bedc-5676c4ccf134", "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-workflow4dljg/series-workflow4dljg-build-action-896436173/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:51:55 +0000 UTC FinishedAt: 2026-08-05 09:51:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:51:55 +0000 UTC FinishedAt: 2026-08-05 09:51:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:51:55 +0000 UTC FinishedAt: 2026-08-05 09:53:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:51:55 +0000 UTC FinishedAt: 2026-08-05 09:53:33 +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:*2488c322-7838-4644-bedc-5676c4ccf134,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-workflow4dljg/series-workflow4dljg-build-action-896436173/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-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:46 +0000 UTC FinishedAt: 2026-08-05 12:59:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:46 +0000 UTC FinishedAt: 2026-08-05 12:59:39 +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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"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:*8ef576c1-ea65-4779-a6ac-cf223ab1a318,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2488c322-7838-4644-bedc-5676c4ccf134,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-workflow4dljg/series-workflow4dljg-build-action-1879727284/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-workflow4dljg/series-workflow4dljg-build-action-896436173/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:46 +0000 UTC FinishedAt: 2026-08-05 09:53:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:46 +0000 UTC FinishedAt: 2026-08-05 09:53:53 +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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"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-workflow4dljg/series-workflow4dljg-convert-artifact-3907102166/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:46 +0000 UTC FinishedAt: 2026-08-05 09:53:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:46 +0000 UTC FinishedAt: 2026-08-05 09:53:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:46 +0000 UTC FinishedAt: 2026-08-05 09:53:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:56 +0000 UTC FinishedAt: 2026-08-05 12:59:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4dljg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"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":["xswap_max_clusters_write","xswap_max_clusters_read","xswap_shrink_work_fn","xswap_check_mapped","xswap_collect_page","xswap_map_clusters","xswap_unmap_clusters"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"938e833173e6cc7c1b6671f3463d36511d6dbb51","config_name":"upstream-apparmor-kasan.config","enable_configs":["XSWAP","DEBUG_FS"],"series_id":"4a7e1458-86e3-4b65-908c-6e1cb2a84b9a","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-08-05 09:53:56 +0000 UTC FinishedAt: 2026-08-05 12:59:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*8ef576c1-ea65-4779-a6ac-cf223ab1a318,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2488c322-7838-4644-bedc-5676c4ccf134,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-workflow4dljg/series-workflow4dljg-build-action-1879727284/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-workflow4dljg/series-workflow4dljg-build-action-896436173/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-workflow4dljg/series-workflow4dljg-convert-artifact-3907102166/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,}