Name: series-workflowd5694 Phase: Succeeded StartedAt: 2026-07-10 13:28:56 +0000 UTC FinishedAt: 2026-07-10 18:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[0] Phase: Succeeded StartedAt: 2026-07-10 13:28:56 +0000 UTC FinishedAt: 2026-07-10 13:44:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[0].run-triage Phase: Succeeded StartedAt: 2026-07-10 13:28:56 +0000 UTC FinishedAt: 2026-07-10 13:44:20 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "08412b8c707fdbccb7bf2116f0554fe09113cd53", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KEXEC_HANDOVER", "HUGETLB_PAGE" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "08412b8c707fdbccb7bf2116f0554fe09113cd53", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KEXEC_HANDOVER", "HUGETLB_PAGE" ], "series_id": "9791f6fe-efb5-4860-88aa-32474db3dd03" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "kho_radix_add_key", "kho_radix_del_key", "kho_radix_walk_tree", "kho_radix_init_tree", "kho_radix_destroy_tree", "kho_scratch_overlap", "kho_init_scratch_migratetype", "memblock_alloc_hugetlb" ], "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+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFWEVDX0hBTkRPVkVSJiMzNDssCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2tob19yYWRpeF9hZGRfa2V5JiMzNDssCiAgICAmIzM0O2tob19yYWRpeF9kZWxfa2V5JiMzNDssCiAgICAmIzM0O2tob19yYWRpeF93YWxrX3RyZWUmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X2luaXRfdHJlZSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfZGVzdHJveV90cmVlJiMzNDssCiAgICAmIzM0O2tob19zY3JhdGNoX292ZXJsYXAmIzM0OywKICAgICYjMzQ7a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSYjMzQ7LAogICAgJiMzNDttZW1ibG9ja19hbGxvY19odWdldGxiJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBLZXhlYyBIYW5kb3ZlciAoS0hPKSByYWRpeCB0cmVlIGltcGxlbWVudGF0aW9uLCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgZm9yIEtITyBzY3JhdGNoIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgY2hhbmdlcyBob3cgSHVnZVRMQiBwYWdlcyBhcmUgYWxsb2NhdGVkIGR1cmluZyBib290IHVzaW5nIG1lbWJsb2NrLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB0aGF0IGNhbiBiZSByZWFjaGVkIGR1cmluZyBib290IGFuZCBydW50aW1lLCBtYWtpbmcgdGhlbSB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMTVhODk1YjI3ZDcwNjliNDNlM2IxMjhkZjg1N2ViY2NkM2UzODA5MlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgSnVsIDEwIDEzOjQxOjI0IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaCBiL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaFxuaW5kZXggNDhhOTc5M2MyYjc2Y2QuLjMwYTcxNzEwNTY1YTMyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmhcbkBAIC0zMyw5ICYjNDM7MzMsMTMgQEAgdm9pZCBraG9fcmVtb3ZlX3N1YnRyZWUodm9pZCAqYmxvYik7XG4gaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpO1xuIFxuIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpO1xuJiM0Mzt2b2lkIGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKTtcbiBcbiB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sIHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cyxcbiBcdFx0ICB1NjQgc2NyYXRjaF9sZW4pO1xuJiM0MztcbiYjNDM7Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcbiYjNDM7dm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pO1xuICNlbHNlXG4gc3RhdGljIGlubGluZSBib29sIGtob19pc19lbmFibGVkKHZvaWQpXG4ge1xuQEAgLTEwOCwxMCAmIzQzOzExMiwyMiBAQCBzdGF0aWMgaW5saW5lIGludCBraG9fcmV0cmlldmVfc3VidHJlZShjb25zdCBjaGFyICpuYW1lLCBwaHlzX2FkZHJfdCAqcGh5cyxcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpIHsgfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIHZvaWQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcbiBcdFx0XHRcdHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cywgdTY0IHNjcmF0Y2hfbGVuKVxuIHtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4mIzQzO3tcbiYjNDM7fVxuICNlbmRpZiAvKiBDT05GSUdfS0VYRUNfSEFORE9WRVIgKi9cbiBcbiAjZW5kaWYgLyogTElOVVhfS0VYRUNfSEFORE9WRVJfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oIGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2tleGVjX2hhbmRvdmVyLmhcbmluZGV4IDVlMmViODUxOWJkYTZkLi4yZjRmYjljNjM5NDIxYSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaFxuQEAgLTI1NywxMSAmIzQzOzI1Nyw4IEBAIHN0cnVjdCBraG9fdm1hbGxvYyB7XG4gICogbWVtb3J5LiBUaGVzZSBjb25zdGFudHMgZ292ZXJuIHRoZSBpbmRleGluZywgc2l6aW5nLCBhbmQgZGVwdGggb2YgdGhlIHRyZWUuXG4gICovXG4gZW51bSBraG9fcmFkaXhfY29uc3RzIHtcbi1cdC8qXG4tXHQgKiBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSBvcmRlciBiaXQgKGFuZCBhbHNvIHRoZSBsZW5ndGggb2YgdGhlXG4tXHQgKiBzaGlmdGVkIHBoeXNpY2FsIGFkZHJlc3MpIGZvciBhbiBvcmRlci0wIHBhZ2UuXG4tXHQgKi9cbi1cdEtIT19PUkRFUl8wX0xPRzIgPSA2NCAtIFBBR0VfU0hJRlQsXG4mIzQzO1x0LyogTmVlZCB0byBzdG9yZSB0aGUgUEZOLCBwbHVzIG9uZSBiaXQgZm9yIG9yZGVyLiAqL1xuJiM0MztcdEtIT19SQURJWF9LRVlfV0lEVEggPSA2NCAtIFBBR0VfU0hJRlQgJiM0MzsgMSxcbiBcbiBcdC8qIFNpemUgb2YgdGhlIHRhYmxlIGluIGtob19yYWRpeF9ub2RlLCBpbiBsb2cyICovXG4gXHRLSE9fVEFCTEVfU0laRV9MT0cyID0gY29uc3RfaWxvZzIoUEFHRV9TSVpFIC8gc2l6ZW9mKHBoeXNfYWRkcl90KSksXG5AQCAtMjc0LDcgJiM0MzsyNzEsNyBAQCBlbnVtIGtob19yYWRpeF9jb25zdHMge1xuIFx0ICogYW5kIDEgYml0bWFwIGxldmVsLlxuIFx0ICovXG4gXHRLSE9fVFJFRV9NQVhfREVQVEggPVxuLVx0XHRESVZfUk9VTkRfVVAoS0hPX09SREVSXzBfTE9HMiAtIEtIT19CSVRNQVBfU0laRV9MT0cyICYjNDM7IDEsXG4mIzQzO1x0XHRESVZfUk9VTkRfVVAoS0hPX1JBRElYX0tFWV9XSURUSCAtIEtIT19CSVRNQVBfU0laRV9MT0cyLFxuIFx0XHRcdCAgICAgS0hPX1RBQkxFX1NJWkVfTE9HMikgJiM0MzsgMSxcbiB9O1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaCBiL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaFxuaW5kZXggODRlOTE4Yjk2ZTUzZGYuLjVkNmFlMjg5MzY4NGE0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmhcbkBAIC0zNCwzNyAmIzQzOzM0LDUzIEBAIHN0cnVjdCBraG9fcmFkaXhfdHJlZSB7XG4gXHRzdHJ1Y3QgbXV0ZXggbG9jazsgLyogcHJvdGVjdHMgdGhlIHRyZWUmIzM5O3Mgc3RydWN0dXJlIGFuZCByb290IHBvaW50ZXIgKi9cbiB9O1xuIFxuLXR5cGVkZWYgaW50ICgqa2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190KShwaHlzX2FkZHJfdCBwaHlzLFxuLVx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpO1xuJiM0MzsvKipcbiYjNDM7ICogc3RydWN0IGtob19yYWRpeF93YWxrX2NiIC0gQ2FsbGJhY2tzIGZvciBLSE8gcmFkaXggdHJlZSB3YWxrLlxuJiM0MzsgKiBAbGVhZjogICAgICBDYWxsZWQgb24gZWFjaCBwcmVzZW50IGtleSBpbiB0aGUgcmFkaXggdHJlZS5cbiYjNDM7ICogQG5vZGU6ICAgICAgQ2FsbGVkIG9uIGVhY2ggbm9kZSBvZiB0aGUgcmFkaXggdHJlZSBpdHNlbGYuIFJlY2VpdmVzIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG5vZGUuXG4mIzQzOyAqXG4mIzQzOyAqIEZvciBlYWNoIGNhbGxiYWNrLCBhIHJldHVybiB2YWx1ZSBvZiAwIGNvbnRpbnVlcyB0aGUgd2FsayBhbmQgYSBub24temVyb1xuJiM0MzsgKiByZXR1cm4gdmFsdWUgaXMgZGlyZWN0bHkgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiB7XG4mIzQzO1x0aW50ICgqbGVhZikodW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKmRhdGEpO1xuJiM0MztcdGludCAoKm5vZGUpKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpO1xuJiM0Mzt9O1xuIFxuICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVJcbiBcbi1pbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdCAgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpO1xuLVxuLXZvaWQga2hvX3JhZGl4X2RlbF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdFx0dW5zaWduZWQgaW50IG9yZGVyKTtcbi1cbiYjNDM7aW50IGtob19yYWRpeF9hZGRfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpO1xuJiM0Mzt2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpO1xuIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0XHRraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpO1xuJiM0MztcdFx0XHRjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgKmNiLCB2b2lkICpkYXRhKTtcbiYjNDM7aW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpO1xuJiM0Mzt2b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKTtcbiBcbiAjZWxzZSAgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqL1xuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIGxvbmcgcGZuLFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9hZGRfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpXG4ge1xuIFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2RlbF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpIHsgfVxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBrZXkpIHsgfVxuIFxuIHN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuLVx0XHRcdFx0ICAgICAga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuJiM0MztcdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2luaXRfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSkgeyB9XG4mIzQzO1xuICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSICovXG4gXG4gI2VuZGlmXHQvKiBfTElOVVhfS0hPX1JBRElYX1RSRUVfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaFxuaW5kZXggNWFmY2Q5OWFhOGMxNDQuLmQ2MmRiOWU3NzZjZjk0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmhcbkBAIC01MSw2ICYjNDM7NTEsNyBAQCBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG1heF9wb3NzaWJsZV9wZm47XG4gICogbWVtb3J5IHJlc2VydmF0aW9ucyB5ZXQsIHNvIHdlIGdldCBzY3JhdGNoIG1lbW9yeSBmcm9tIHRoZSBwcmV2aW91c1xuICAqIGtlcm5lbCB0aGF0IHdlIGtub3cgaXMgZ29vZCB0byB1c2UuIEl0IGlzIHRoZSBvbmx5IG1lbW9yeSB0aGF0XG4gICogYWxsb2NhdGlvbnMgbWF5IGhhcHBlbiBmcm9tIGluIHRoaXMgcGhhc2UuXG4mIzQzOyAqIEBNRU1CTE9DS19SU1JWX0hVR0VUTEI6IG1lbW9yeSBpcyByZXNlcnZlZCBmb3IgaHVnZXRsYiBwYWdlc1xuICAqL1xuIGVudW0gbWVtYmxvY2tfZmxhZ3Mge1xuIFx0TUVNQkxPQ0tfTk9ORVx0XHQ9IDB4MCxcdC8qIE5vIHNwZWNpYWwgcmVxdWVzdCAqL1xuQEAgLTYxLDYgJiM0Mzs2Miw3IEBAIGVudW0gbWVtYmxvY2tfZmxhZ3Mge1xuIFx0TUVNQkxPQ0tfUlNSVl9OT0lOSVRcdD0gMHgxMCxcdC8qIGRvbiYjMzk7dCBpbml0aWFsaXplIHN0cnVjdCBwYWdlcyAqL1xuIFx0TUVNQkxPQ0tfUlNSVl9LRVJOXHQ9IDB4MjAsXHQvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGtlcm5lbCB1c2UgKi9cbiBcdE1FTUJMT0NLX0tIT19TQ1JBVENIXHQ9IDB4NDAsXHQvKiBzY3JhdGNoIG1lbW9yeSBmb3Iga2V4ZWMgaGFuZG92ZXIgKi9cbiYjNDM7XHRNRU1CTE9DS19SU1JWX0hVR0VUTEJcdD0gMHg4MCwgLyogbWVtb3J5IHJlc2VydmVkIGZvciBodWdldGxiIHBhZ2VzICovXG4gfTtcbiBcbiAvKipcbkBAIC00MjAsNiAmIzQzOzQyMiw3IEBAIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLFxuIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXG4gXHRcdFx0ICAgICBwaHlzX2FkZHJfdCBtaW5fYWRkciwgcGh5c19hZGRyX3QgbWF4X2FkZHIsXG4gXHRcdFx0ICAgICBpbnQgbmlkKTtcbiYjNDM7dm9pZCAqbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZCk7XG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICptZW1ibG9ja19hbGxvYyhwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbilcbiB7XG5AQCAtNDg0LDYgJiM0Mzs0ODcsNyBAQCBzdGF0aWMgaW5saW5lIF9faW5pdF9tZW1ibG9jayBib29sIG1lbWJsb2NrX2JvdHRvbV91cCh2b2lkKVxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3BoeXNfbWVtX3NpemUodm9pZCk7XG4gcGh5c19hZGRyX3QgbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh2b2lkKTtcbiBwaHlzX2FkZHJfdCBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUocGh5c19hZGRyX3QgbGltaXQsIGludCBuaWQpO1xuJiM0MztwaHlzX2FkZHJfdCBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUocGh5c19hZGRyX3QgbGltaXQsIGludCBuaWQpO1xuIHVuc2lnbmVkIGxvbmcgbWVtYmxvY2tfZXN0aW1hdGVkX25yX2ZyZWVfcGFnZXModm9pZCk7XG4gcGh5c19hZGRyX3QgbWVtYmxvY2tfc3RhcnRfb2ZfRFJBTSh2b2lkKTtcbiBwaHlzX2FkZHJfdCBtZW1ibG9ja19lbmRfb2ZfRFJBTSh2b2lkKTtcbkBAIC02MTMsMjggJiM0Mzs2MTcsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgbWVtdGVzdF9yZXBvcnRfbWVtaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pIHsgfVxuICNpZmRlZiBDT05GSUdfTUVNQkxPQ0tfS0hPX1NDUkFUQ0hcbiB2b2lkIG1lbWJsb2NrX3NldF9raG9fc2NyYXRjaF9vbmx5KHZvaWQpO1xuIHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKTtcbi1ib29sIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShwaHlzX2FkZHJfdCBhZGRyKTtcbi1cbi1zdGF0aWMgaW5saW5lIGVudW0gbWlncmF0ZXR5cGUga2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdFx0XHRcdFx0ICAgICAgIGVudW0gbWlncmF0ZXR5cGUgbXQpXG4te1xuLVx0aWYgKG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShQRk5fUEhZUyhwZm4pKSlcbi1cdFx0cmV0dXJuIE1JR1JBVEVfQ01BO1xuLVx0cmV0dXJuIG10O1xuLX1cbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19zZXRfa2hvX3NjcmF0Y2hfb25seSh2b2lkKSB7IH1cbiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKSB7IH1cbi1zdGF0aWMgaW5saW5lIGJvb2wgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpXG4te1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIGVudW0gbWlncmF0ZXR5cGUga2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdFx0XHRcdFx0ICAgICAgIGVudW0gbWlncmF0ZXR5cGUgbXQpXG4te1xuLVx0cmV0dXJuIG10O1xuLX1cbiAjZW5kaWZcbiBcbiAjZW5kaWYgLyogX0xJTlVYX01FTUJMT0NLX0ggKi9cbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZSBiL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlXG5pbmRleCBlZWM5ZDNhZTA3ZWI0Yi4uZDlmNDY5NDYyNTU2NzMgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2xpdmV1cGRhdGUvTWFrZWZpbGVcbkBAIC04LDcgJiM0Mzs4LDYgQEAgbHVvLXkgOj1cdFx0XHRcdFx0XHRcdFx0XFxcbiBcdFx0bHVvX3Nlc3Npb24ub1xuIFxuIG9iai0kKENPTkZJR19LRVhFQ19IQU5ET1ZFUilcdFx0JiM0Mzs9IGtleGVjX2hhbmRvdmVyLm9cbi1vYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpXHQmIzQzOz0ga2V4ZWNfaGFuZG92ZXJfZGVidWcub1xuIG9iai0kKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVR0ZTKVx0JiM0Mzs9IGtleGVjX2hhbmRvdmVyX2RlYnVnZnMub1xuIFxuIG9iai0kKENPTkZJR19MSVZFVVBEQVRFKVx0XHQmIzQzOz0gbHVvLm9cbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuaW5kZXggNDgzNGE4MDk5ODVhYjcuLjlkYzc5YjcxMDNiZGJmIDEwMDY0NFxuLS0tIGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuQEAgLTg0LDggJiM0Mzs4NCwyNSBAQCBzdGF0aWMgc3RydWN0IGtob19vdXQga2hvX291dCA9IHtcbiBcdH0sXG4gfTtcbiBcbiYjNDM7c3RydWN0IGtob19pbiB7XG4mIzQzO1x0cGh5c19hZGRyX3QgZmR0X3BoeXM7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzO1xuJiM0MztcdGNoYXIgcHJldmlvdXNfcmVsZWFzZVtfX05FV19VVFNfTEVOICYjNDM7IDFdO1xuJiM0MztcdHUzMiBrZXhlY19jb3VudDtcbiYjNDM7XHRzdHJ1Y3Qga2hvX2RlYnVnZnMgZGJnO1xuJiM0MztcdHN0cnVjdCBraG9fcmFkaXhfdHJlZSByYWRpeF90cmVlO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBraG9faW4ga2hvX2luID0ge1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHZvaWQgKmtob19nZXRfZmR0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4ga2hvX2luLmZkdF9waHlzID8gcGh5c190b192aXJ0KGtob19pbi5mZHRfcGh5cykgOiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuLSAqIGtob19yYWRpeF9lbmNvZGVfa2V5IC0gRW5jb2RlcyBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyIGludG8gYSByYWRpeCBrZXkuXG4mIzQzOyAqIGtob19lbmNvZGVfcmFkaXhfa2V5IC0gRW5jb2RlcyBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyIGludG8gYSByYWRpeCBrZXkuXG4gICogQHBoeXM6IFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlLlxuICAqIEBvcmRlcjogVGhlIG9yZGVyIG9mIHRoZSBwYWdlLlxuICAqXG5AQCAtOTUsMzUgJiM0MzsxMTIsMzggQEAgc3RhdGljIHN0cnVjdCBraG9fb3V0IGtob19vdXQgPSB7XG4gICpcbiAgKiBSZXR1cm46IFRoZSBlbmNvZGVkIHVuc2lnbmVkIGxvbmcgcmFkaXgga2V5LlxuICAqL1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGtob19yYWRpeF9lbmNvZGVfa2V5KHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGludCBvcmRlcilcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX2VuY29kZV9yYWRpeF9rZXkocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgaW50IG9yZGVyKVxuIHtcbi1cdC8qIE9yZGVyIGJpdHMgcGFydCAqL1xuLVx0dW5zaWduZWQgbG9uZyBoID0gMVVMIFx1MDAzY1x1MDAzYyAoS0hPX09SREVSXzBfTE9HMiAtIG9yZGVyKTtcbi1cdC8qIFNoaWZ0ZWQgcGh5c2ljYWwgYWRkcmVzcyBwYXJ0ICovXG4tXHR1bnNpZ25lZCBsb25nIGwgPSBwaHlzIFx1MDAzZVx1MDAzZSAoUEFHRV9TSElGVCAmIzQzOyBvcmRlcik7XG4mIzQzO1x0LyogVGhlIHBoeXNpY2FsIGFkZHJlc3MgaXMgZW5jb2RlZCBieSBzaGlmdGluZyB0aGUgUEZOIGJ5IGl0cyBvcmRlci4gKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNoaWZ0ID0gUEFHRV9TSElGVCAmIzQzOyBvcmRlcjtcbiYjNDM7XHQvKiBPcmRlciBiaXQgZ29lcyByaWdodCBiZWZvcmUgdGhlIHNoaWZ0ZWQgUEZOLiAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaCA9IDFVTCBcdTAwM2NcdTAwM2MgKDY0IC0gc2hpZnQpO1xuJiM0MztcdC8qIFNoaWZ0ZWQgUEZOLiAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgXHUwMDNlXHUwMDNlIHNoaWZ0O1xuIFxuIFx0cmV0dXJuIGggfCBsO1xuIH1cbiBcbiAvKipcbi0gKiBraG9fcmFkaXhfZGVjb2RlX2tleSAtIERlY29kZXMgYSByYWRpeCBrZXkgYmFjayBpbnRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXG4mIzQzOyAqIGtob19kZWNvZGVfcmFkaXhfa2V5IC0gRGVjb2RlcyBhIHJhZGl4IGtleSBiYWNrIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlci5cbiAgKiBAa2V5OiBUaGUgdW5zaWduZWQgbG9uZyBrZXkgdG8gZGVjb2RlLlxuICAqIEBvcmRlcjogQW4gb3V0cHV0IHBhcmFtZXRlciwgYSBwb2ludGVyIHRvIGFuIHVuc2lnbmVkIGludCB3aGVyZSB0aGUgZGVjb2RlZFxuICAqICAgICAgICAgcGFnZSBvcmRlciB3aWxsIGJlIHN0b3JlZC5cbiAgKlxuLSAqIFRoaXMgZnVuY3Rpb24gcmV2ZXJzZXMgdGhlIGVuY29kaW5nIHBlcmZvcm1lZCBieSBraG9fcmFkaXhfZW5jb2RlX2tleSgpLFxuJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBlbmNvZGluZyBwZXJmb3JtZWQgYnkga2hvX2VuY29kZV9yYWRpeF9rZXkoKSxcbiAgKiBleHRyYWN0aW5nIHRoZSBvcmlnaW5hbCBwaHlzaWNhbCBhZGRyZXNzIGFuZCBwYWdlIG9yZGVyIGZyb20gYSBnaXZlbiBrZXkuXG4gICpcbiAgKiBSZXR1cm46IFRoZSBkZWNvZGVkIHBoeXNpY2FsIGFkZHJlc3MuXG4gICovXG4tc3RhdGljIHBoeXNfYWRkcl90IGtob19yYWRpeF9kZWNvZGVfa2V5KHVuc2lnbmVkIGxvbmcga2V5LCB1bnNpZ25lZCBpbnQgKm9yZGVyKVxuJiM0MztzdGF0aWMgcGh5c19hZGRyX3Qga2hvX2RlY29kZV9yYWRpeF9rZXkodW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGludCAqb3JkZXIpXG4ge1xuLVx0dW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSk7XG4mIzQzO1x0LyogZmxzNjQoKSBpbmRleGVzIHN0YXJ0aW5nIGZyb20gMS4gKi9cbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXJfYml0ID0gZmxzNjQoa2V5KSAtIDE7XG4gXHRwaHlzX2FkZHJfdCBwaHlzO1xuIFxuLVx0Lyogb3JkZXJfYml0IGlzIG51bWJlcmVkIHN0YXJ0aW5nIGF0IDEgZnJvbSBmbHM2NCAqL1xuLVx0Km9yZGVyID0gS0hPX09SREVSXzBfTE9HMiAtIG9yZGVyX2JpdCAmIzQzOyAxO1xuLVx0LyogVGhlIG9yZGVyIGlzIGRpc2NhcmRlZCBieSB0aGUgc2hpZnQgKi9cbiYjNDM7XHQvKiBvcmRlciBiaXQgZ29lcyByaWdodCBiZWZvcmUgdGhlIHNoaWZ0ZWQgUEZOLiAqL1xuJiM0MztcdCpvcmRlciA9IDY0IC0gKFBBR0VfU0hJRlQgJiM0Mzsgb3JkZXJfYml0KTtcbiYjNDM7XHQvKiBUaGUgb3JkZXIgYml0IGlzIGRpc2NhcmRlZCBieSB0aGUgc2hpZnQgKi9cbiBcdHBoeXMgPSBrZXkgXHUwMDNjXHUwMDNjIChQQUdFX1NISUZUICYjNDM7ICpvcmRlcik7XG4gXG4gXHRyZXR1cm4gcGh5cztcbkBAIC0xNDMsMjUgJiM0MzsxNjMsNDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX3JhZGl4X2dldF90YWJsZV9pbmRleCh1bnNpZ25lZCBsb25nIGtleSxcbiBcdHJldHVybiAoa2V5IFx1MDAzZVx1MDAzZSBzKSAlICgxIFx1MDAzY1x1MDAzYyBLSE9fVEFCTEVfU0laRV9MT0cyKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyB2b2lkIF9fcmVmICpraG9fcmFkaXhfYWxsb2Nfbm9kZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlO1xuJiM0MztcbiYjNDM7XHRpZiAoc2xhYl9pc19hdmFpbGFibGUoKSlcbiYjNDM7XHRcdG5vZGUgPSAoc3RydWN0IGtob19yYWRpeF9ub2RlICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG5vZGUgPSBtZW1ibG9ja19hbGxvYyhQQUdFX1NJWkUsIFBBR0VfU0laRSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBub2RlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBfX3JlZiBraG9fcmFkaXhfZnJlZV9ub2RlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSlcbiYjNDM7e1xuJiM0MztcdGlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKW5vZGUpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG1lbWJsb2NrX2ZyZWUobm9kZSwgUEFHRV9TSVpFKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbi0gKiBraG9fcmFkaXhfYWRkX3BhZ2UgLSBNYXJrcyBhIHBhZ2UgYXMgcHJlc2VydmVkIGluIHRoZSByYWRpeCB0cmVlLlxuJiM0MzsgKiBraG9fcmFkaXhfYWRkX2tleSAtIEFkZCBhIGtleSB0byB0aGUgcmFkaXggdHJlZS5cbiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLlxuLSAqIEBwZm46IFRoZSBwYWdlIGZyYW1lIG51bWJlciBvZiB0aGUgcGFnZSB0byBwcmVzZXJ2ZS5cbi0gKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS5cbiYjNDM7ICogQGtleTogVGhlIGtleSB0byBhZGQuXG4gICpcbi0gKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBiYXNlZCBvbiB0aGUga2V5IGRlcml2ZWQgZnJvbSBAcGZuXG4tICogYW5kIEBvcmRlci4gSXQgc2V0cyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGxlYWYgYml0bWFwIHRvIG1hcmsgdGhlXG4tICogcGFnZSBmb3IgcHJlc2VydmF0aW9uLiBJZiBpbnRlcm1lZGlhdGUgbm9kZXMgZG8gbm90IGV4aXN0IGFsb25nIHRoZSBwYXRoLFxuLSAqIHRoZXkgYXJlIGFsbG9jYXRlZCBhbmQgYWRkZWQgdG8gdGhlIHRyZWUuXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGJhc2VkIG9uIHRoZSBAa2V5IHByb3ZpZGVkLiBJdCBzZXRzIHRoZVxuJiM0MzsgKiBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGUgQGtleSBhcyBwcmVzZW50LiBJZlxuJiM0MzsgKiBpbnRlcm1lZGlhdGUgbm9kZXMgZG8gbm90IGV4aXN0IGFsb25nIHRoZSBwYXRoLCB0aGV5IGFyZSBhbGxvY2F0ZWQgYW5kIGFkZGVkXG4mIzQzOyAqIHRvIHRoZSB0cmVlLlxuJiM0MzsgKlxuJiM0MzsgKiBOT1RFOiBDdXJyZW50bHkgb25seSBrZXlzIG9mIHdpZHRoIHVwIHRvICVLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBzdXBwb3J0ZWQuXG4mIzQzOyAqIFRoaXMgbGltaXQgb25seSBleGlzdHMgYmVjYXVzZSBjdXJyZW50IHVzZXJzIG9mIHRoZSByYWRpeCB0cmVlIGRvbiYjMzk7dCB1c2UgbW9yZVxuJiM0MzsgKiB0aGFuIHRoYXQuIENoYW5naW5nIHRoZSBtYXhpbXVtIHdpZHRoIHJlcXVpcmVzIGNoYW5naW5nIHRoZSB0cmVlIGRlcHRoLCB3aGljaFxuJiM0MzsgKiBuZWVkcyBidW1waW5nIHRoZSBBQkkgdmVyc2lvbi5cbiAgKlxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbiAgKi9cbi1pbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpXG4mIzQzO2ludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxuIHtcbiBcdC8qIE5ld2x5IGFsbG9jYXRlZCBub2RlcyBmb3IgZXJyb3IgY2xlYW51cCAqL1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICppbnRlcm1lZGlhdGVfbm9kZXNbS0hPX1RSRUVfTUFYX0RFUFRIXSA9IHsgMCB9O1xuLVx0dW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7XG4gXHRzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKmFuY2hvcl9ub2RlID0gTlVMTDtcbiBcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSA9IHRyZWUtXHUwMDNlcm9vdDtcbiBcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbmV3X25vZGU7XG5AQCAtMTcyLDYgJiM0MzsyMTQsOSBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBcdGlmIChXQVJOX09OX09OQ0UoIXRyZWUtXHUwMDNlcm9vdCkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuJiM0MztcdGlmICh1bmxpa2VseShmbHM2NChrZXkpIFx1MDAzZSBLSE9fUkFESVhfS0VZX1dJRFRIKSlcbiYjNDM7XHRcdHJldHVybiAtRVJBTkdFO1xuJiM0MztcbiBcdG1pZ2h0X3NsZWVwKCk7XG4gXG4gXHRndWFyZChtdXRleCkoXHUwMDI2dHJlZS1cdTAwM2Vsb2NrKTtcbkBAIC0xODYsNyAmIzQzOzIzMSw3IEBAIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuIFx0XHR9XG4gXG4gXHRcdC8qIE5leHQgbm9kZSBpcyBlbXB0eSwgY3JlYXRlIGEgbmV3IG5vZGUgZm9yIGl0ICovXG4tXHRcdG5ld19ub2RlID0gKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbiYjNDM7XHRcdG5ld19ub2RlID0ga2hvX3JhZGl4X2FsbG9jX25vZGUoKTtcbiBcdFx0aWYgKCFuZXdfbm9kZSkge1xuIFx0XHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdFx0Z290byBlcnJfZnJlZV9ub2RlcztcbkBAIC0yMTcsMjkgJiM0MzsyNjIsMjYgQEAgaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4gZXJyX2ZyZWVfbm9kZXM6XG4gXHRmb3IgKGkgPSBLSE9fVFJFRV9NQVhfREVQVEggLSAxOyBpIFx1MDAzZSAwOyBpLS0pIHtcbiBcdFx0aWYgKGludGVybWVkaWF0ZV9ub2Rlc1tpXSlcbi1cdFx0XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpaW50ZXJtZWRpYXRlX25vZGVzW2ldKTtcbiYjNDM7XHRcdFx0a2hvX3JhZGl4X2ZyZWVfbm9kZShpbnRlcm1lZGlhdGVfbm9kZXNbaV0pO1xuIFx0fVxuIFx0aWYgKGFuY2hvcl9ub2RlKVxuIFx0XHRhbmNob3Jfbm9kZS1cdTAwM2V0YWJsZVthbmNob3JfaWR4XSA9IDA7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbi1FWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX3BhZ2UpO1xuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7XG4gXG4gLyoqXG4tICoga2hvX3JhZGl4X2RlbF9wYWdlIC0gUmVtb3ZlcyBhIHBhZ2UmIzM5O3MgcHJlc2VydmF0aW9uIHN0YXR1cyBmcm9tIHRoZSByYWRpeCB0cmVlLlxuJiM0MzsgKiBraG9fcmFkaXhfZGVsX2tleSAtIFJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSByYWRpeCB0cmVlLlxuICAqIEB0cmVlOiBUaGUgS0hPIHJhZGl4IHRyZWUuXG4tICogQHBmbjogVGhlIHBhZ2UgZnJhbWUgbnVtYmVyIG9mIHRoZSBwYWdlIHRvIHVucHJlc2VydmUuXG4tICogQG9yZGVyOiBUaGUgb3JkZXIgb2YgdGhlIHBhZ2UuXG4mIzQzOyAqIEBrZXk6IFRoZSBrZXkgdG8gcmVtb3ZlLlxuICAqXG4gICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNsZWFycyB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG9cbi0gKiB0aGUgcGFnZSwgZWZmZWN0aXZlbHkgcmVtb3ZpbmcgaXRzIFwmIzM0O3ByZXNlcnZlZFwmIzM0OyBzdGF0dXMuIEl0IGRvZXMgbm90IGZyZWVcbi0gKiB0aGUgdHJlZSYjMzk7cyBpbnRlcm1lZGlhdGUgbm9kZXMsIGV2ZW4gaWYgdGhleSBiZWNvbWUgZW1wdHkuXG4mIzQzOyAqIHRoZSBAa2V5LCBlZmZlY3RpdmVseSByZW1vdmluZyBpdCBmcm9tIHRoZSB0cmVlLiBJdCBkb2VzIG5vdCBmcmVlIHRoZSB0cmVlJiMzOTtzXG4mIzQzOyAqIGludGVybWVkaWF0ZSBub2RlcywgZXZlbiBpZiB0aGV5IGJlY29tZSBlbXB0eS5cbiAgKi9cbi12b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuLVx0XHRcdHVuc2lnbmVkIGludCBvcmRlcilcbiYjNDM7dm9pZCBraG9fcmFkaXhfZGVsX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcga2V5ID0ga2hvX3JhZGl4X2VuY29kZV9rZXkoUEZOX1BIWVMocGZuKSwgb3JkZXIpO1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlID0gdHJlZS1cdTAwM2Vyb290O1xuIFx0c3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmO1xuIFx0dW5zaWduZWQgaW50IGksIGlkeDtcbkBAIC0yNDcsNiAmIzQzOzI4OSwxMCBAQCB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuIFx0aWYgKFdBUk5fT05fT05DRSghdHJlZS1cdTAwM2Vyb290KSlcbiBcdFx0cmV0dXJuO1xuIFxuJiM0MztcdC8qIEtleXMgd2lkZXIgdGhhbiBLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBub3QgYWxsb3dlZCB0byBiZSBhZGRlZC4gKi9cbiYjNDM7XHRpZiAodW5saWtlbHkoZmxzNjQoa2V5KSBcdTAwM2UgS0hPX1JBRElYX0tFWV9XSURUSCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuIFx0bWlnaHRfc2xlZXAoKTtcbiBcbiBcdGd1YXJkKG11dGV4KShcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuQEAgLTI3MCwyMSAmIzQzOzMxNiw4NSBAQCB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuIFx0aWR4ID0ga2hvX3JhZGl4X2dldF9iaXRtYXBfaW5kZXgoa2V5KTtcbiBcdF9fY2xlYXJfYml0KGlkeCwgbGVhZi1cdTAwM2ViaXRtYXApO1xuIH1cbi1FWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfZGVsX3BhZ2UpO1xuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfZGVsX2tleSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBfX2tob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgaW50IGxldmVsKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRpZiAobGV2ZWwgPT0gMCkge1xuJiM0MztcdFx0a2hvX3JhZGl4X2ZyZWVfbm9kZShyb290KTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCk7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAocm9vdC1cdTAwM2V0YWJsZVtpXSlcbiYjNDM7XHRcdFx0X19raG9fcmFkaXhfZGVzdHJveV90cmVlKHBoeXNfdG9fdmlydChyb290LVx1MDAzZXRhYmxlW2ldKSxcbiYjNDM7XHRcdFx0XHRcdFx0IGxldmVsIC0gMSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRraG9fcmFkaXhfZnJlZV9ub2RlKHJvb3QpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICoga2hvX3JhZGl4X2luaXRfdHJlZSAtIGluaXRpYWxpemUgdGhlIHJhZGl4IHRyZWUuXG4mIzQzOyAqIEB0cmVlOiAgIHRoZSB0cmVlIHRvIGluaXRpYWxpemUuXG4mIzQzOyAqIEByb290OiAgIHJvb3QgdGFibGUgb2YgdGhlIHJhZGl4IHRyZWUuXG4mIzQzOyAqXG4mIzQzOyAqIEluaXRpYWxpemUgdGhlIHJhZGl4IHRyZWUgd2l0aCB0aGUgZ2l2ZW4gcm9vdCBub2RlLiBJZiByb290IGlzICVOVUxMLCBhblxuJiM0MzsgKiBlbXB0eSByb290IHRhYmxlIGlzIGFsbG9jYXRlZC4gSWYgcm9vdCBpcyBub3QgJU5VTEwsIGl0IGlzIHRoZSBjYWxsZXImIzM5O3NcbiYjNDM7ICogcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoZSByb290IGlzIHZhbGlkIGFuZCBpbiB0aGUgY29ycmVjdCBmb3JtYXQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO2ludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFyb290KVxuJiM0MztcdFx0cm9vdCA9IGtob19yYWRpeF9hbGxvY19ub2RlKCk7XG4mIzQzO1x0aWYgKCFyb290KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHRyZWUtXHUwMDNlcm9vdCA9IHJvb3Q7XG4mIzQzO1x0bXV0ZXhfaW5pdChcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGtob19yYWRpeF9kZXN0cm95X3RyZWUgLSBEZXN0cm95IHRoZSByYWRpeCB0cmVlXG4mIzQzOyAqIEB0cmVlOiBUaGUgcmFkaXggdHJlZSB0byBkZXN0cm95XG4mIzQzOyAqXG4mIzQzOyAqIFdhbGsgQHRyZWUgYW5kIGZyZWUgYWxsIGl0cyBub2Rlcy5cbiYjNDM7ICovXG4mIzQzO3ZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpXG4mIzQzO3tcbiYjNDM7XHRpZiAoIXRyZWUtXHUwMDNlcm9vdClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0X19raG9fcmFkaXhfZGVzdHJveV90cmVlKHRyZWUtXHUwMDNlcm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSk7XG4mIzQzO1x0dHJlZS1cdTAwM2Vyb290ID0gTlVMTDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfZGVzdHJveV90cmVlKTtcbiBcbi1zdGF0aWMgaW50IGtob19yYWRpeF93YWxrX2xlYWYoc3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmLFxuLVx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGtleSxcbi1cdFx0XHQgICAgICAga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuJiM0MztzdGF0aWMgaW50IGtob19yYWRpeF93YWxrX2xlYWYoc3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmLCB1bnNpZ25lZCBsb25nIGtleSxcbiYjNDM7XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilsZWFmO1xuLVx0dW5zaWduZWQgaW50IG9yZGVyO1xuLVx0cGh5c19hZGRyX3QgcGh5cztcbiBcdHVuc2lnbmVkIGludCBpO1xuIFx0aW50IGVycjtcbiBcbiYjNDM7XHRpZiAoY2ItXHUwMDNlbm9kZSkge1xuJiM0MztcdFx0ZXJyID0gY2ItXHUwMDNlbm9kZSh2aXJ0X3RvX3BoeXMobGVhZiksIGRhdGEpO1xuJiM0MztcdFx0aWYgKGVycilcbiYjNDM7XHRcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghY2ItXHUwMDNlbGVhZilcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiBcdGZvcl9lYWNoX3NldF9iaXQoaSwgYml0bWFwLCBQQUdFX1NJWkUgKiBCSVRTX1BFUl9CWVRFKSB7XG4tXHRcdHBoeXMgPSBraG9fcmFkaXhfZGVjb2RlX2tleShrZXkgfCBpLCBcdTAwMjZvcmRlcik7XG4tXHRcdGVyciA9IGNiKHBoeXMsIG9yZGVyKTtcbiYjNDM7XHRcdGVyciA9IGNiLVx1MDAzZWxlYWYoa2V5IHwgaSwgZGF0YSk7XG4gXHRcdGlmIChlcnIpXG4gXHRcdFx0cmV0dXJuIGVycjtcbiBcdH1cbkBAIC0yOTQsNyAmIzQzOzQwNCw3IEBAIHN0YXRpYyBpbnQga2hvX3JhZGl4X3dhbGtfbGVhZihzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWYsXG4gXG4gc3RhdGljIGludCBfX2tob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBsZXZlbCwgdW5zaWduZWQgbG9uZyBzdGFydCxcbi1cdFx0XHRcdCBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXG4mIzQzO1x0XHRcdFx0IGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlO1xuIFx0c3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmO1xuQEAgLTMwMiw2ICYjNDM7NDEyLDEyIEBAIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcbiBcdHVuc2lnbmVkIGludCBzaGlmdDtcbiBcdGludCBlcnI7XG4gXG4mIzQzO1x0aWYgKGNiLVx1MDAzZW5vZGUpIHtcbiYjNDM7XHRcdGVyciA9IGNiLVx1MDAzZW5vZGUodmlydF90b19waHlzKHJvb3QpLCBkYXRhKTtcbiYjNDM7XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0fVxuJiM0MztcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCk7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGlmICghcm9vdC1cdTAwM2V0YWJsZVtpXSlcbiBcdFx0XHRjb250aW51ZTtcbkBAIC0zMTgsMTAgJiM0Mzs0MzQsMTAgQEAgc3RhdGljIGludCBfX2tob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuIFx0XHRcdCAqIG5vZGUgaXMgcG9pbnRpbmcgdG8gdGhlIGxldmVsIDAgYml0bWFwLlxuIFx0XHRcdCAqL1xuIFx0XHRcdGxlYWYgPSAoc3RydWN0IGtob19yYWRpeF9sZWFmICopbm9kZTtcbi1cdFx0XHRlcnIgPSBraG9fcmFkaXhfd2Fsa19sZWFmKGxlYWYsIGtleSwgY2IpO1xuJiM0MztcdFx0XHRlcnIgPSBraG9fcmFkaXhfd2Fsa19sZWFmKGxlYWYsIGtleSwgY2IsIGRhdGEpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdGVyciAgPSBfX2tob19yYWRpeF93YWxrX3RyZWUobm9kZSwgbGV2ZWwgLSAxLFxuLVx0XHRcdFx0XHRcdCAgICAga2V5LCBjYik7XG4mIzQzO1x0XHRcdFx0XHRcdCAgICAga2V5LCBjYiwgZGF0YSk7XG4gXHRcdH1cbiBcbiBcdFx0aWYgKGVycilcbkBAIC0zMzIsMjggJiM0Mzs0NDgsMjcgQEAgc3RhdGljIGludCBfX2tob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuIH1cbiBcbiAvKipcbi0gKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIHByZXNlcnZlZCBwYWdlLlxuJiM0MzsgKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIGtleS5cbiAgKiBAdHJlZTogQSBwb2ludGVyIHRvIHRoZSBLSE8gcmFkaXggdHJlZSB0byB3YWxrLlxuLSAqIEBjYjogQSBjYWxsYmFjayBmdW5jdGlvbiBvZiB0eXBlIGtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCB0aGF0IHdpbGwgYmVcbi0gKiAgICAgIGludm9rZWQgZm9yIGVhY2ggcHJlc2VydmVkIHBhZ2UgZm91bmQgaW4gdGhlIHRyZWUuIFRoZSBjYWxsYmFjayByZWNlaXZlc1xuLSAqICAgICAgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyIG9mIHRoZSBwcmVzZXJ2ZWQgcGFnZS5cbiYjNDM7ICogQGNiOiAgIFNldCBvZiBjYWxsYmFja3MgdG8gYmUgaW52b2tlZCBkdXJpbmcgdGhlIHRyZWUgd2Fsay5cbiYjNDM7ICogQGRhdGE6IE9wYXF1ZSBkYXRhIHBvaW50ZXIgcGFzc2VkIHRvIGVhY2ggY2FsbGJhY2sgaW4gQGNiLlxuICAqXG4tICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHNwZWNpZmllZCB0b3AgbGV2ZWxcbi0gKiBkb3duIHRvIHRoZSBsb3dlc3QgbGV2ZWwgKGxldmVsIDApLiBGb3IgZWFjaCBwcmVzZXJ2ZWQgcGFnZSBmb3VuZCwgaXQgaW52b2tlc1xuLSAqIHRoZSBwcm92aWRlZCBjYWxsYmFjaywgcGFzc2luZyB0aGUgcGFnZSYjMzk7cyBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlci5cbiYjNDM7ICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHRvcCBsZXZlbCBkb3duIHRvIHRoZVxuJiM0MzsgKiBsb3dlc3QgbGV2ZWwgKGxldmVsIDApLCBpbnZva2luZyB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzLlxuICAqXG4gICogUmV0dXJuOiAwIGlmIHRoZSB3YWxrIGNvbXBsZXRlZCB0aGUgc3BlY2lmaWVkIHRyZWUsIG9yIHRoZSBub24temVybyByZXR1cm5cbiAgKiAgICAgICAgIHZhbHVlIGZyb20gdGhlIGNhbGxiYWNrIHRoYXQgc3RvcHBlZCB0aGUgd2Fsay5cbiAgKi9cbiBpbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4tXHRcdFx0a2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuJiM0MztcdFx0XHRjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgKmNiLCB2b2lkICpkYXRhKVxuIHtcbiBcdGlmIChXQVJOX09OX09OQ0UoIXRyZWUtXHUwMDNlcm9vdCkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuIFx0Z3VhcmQobXV0ZXgpKFx1MDAyNnRyZWUtXHUwMDNlbG9jayk7XG4gXG4tXHRyZXR1cm4gX19raG9fcmFkaXhfd2Fsa190cmVlKHRyZWUtXHUwMDNlcm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSwgMCwgY2IpO1xuJiM0MztcdHJldHVybiBfX2tob19yYWRpeF93YWxrX3RyZWUodHJlZS1cdTAwM2Vyb290LCBLSE9fVFJFRV9NQVhfREVQVEggLSAxLCAwLCBjYixcbiYjNDM7XHRcdFx0XHQgICAgIGRhdGEpO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfd2Fsa190cmVlKTtcbiBcbkBAIC00ODQsMTMgJiM0Mzs1OTksMTYgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpfX2luaXQga2hvX2dldF9wcmVzZXJ2ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzLFxuIFx0cmV0dXJuIHBmbl90b19wYWdlKHBmbik7XG4gfVxuIFxuLXN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cyxcbi1cdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBvcmRlcilcbiYjNDM7c3RhdGljIGludCBfX2luaXQga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcbiB7XG4gXHR1bmlvbiBraG9fcGFnZV9pbmZvIGluZm87XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4mIzQzO1x0cGh5c19hZGRyX3QgcGh5cztcbiBcdHU2NCBzejtcbiBcbiYjNDM7XHRwaHlzID0ga2hvX2RlY29kZV9yYWRpeF9rZXkoa2V5LCBcdTAwMjZvcmRlcik7XG4mIzQzO1xuIFx0c3ogPSAxIFx1MDAzY1x1MDAzYyAob3JkZXIgJiM0MzsgUEFHRV9TSElGVCk7XG4gXHRwYWdlID0ga2hvX2dldF9wcmVzZXJ2ZWRfcGFnZShwaHlzLCBvcmRlcik7XG4gXG5AQCAtNTA0LDE5ICYjNDM7NjIyLDI0IEBAIHN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cyxcbiBcdHJldHVybiAwO1xuIH1cbiBcbi0vKiBSZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovXG4tc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBraG9fZ2V0X21lbV9tYXBfcGh5cyhjb25zdCB2b2lkICpmZHQpXG4mIzQzOy8qIFJldHVybnMgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwcmVzZXJ2ZWQgbWVtb3J5IG1hcCBmcm9tIEZEVCAqL1xuJiM0MztzdGF0aWMgX19pbml0IHZvaWQgKmtob19nZXRfbWVtX21hcChjb25zdCB2b2lkICpmZHQpXG4ge1xuIFx0Y29uc3Qgdm9pZCAqbWVtX3B0cjtcbiYjNDM7XHRwaHlzX2FkZHJfdCBtZW1fbWFwX3BoeXM7XG4gXHRpbnQgbGVuO1xuIFxuIFx0bWVtX3B0ciA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgXHUwMDI2bGVuKTtcbiBcdGlmICghbWVtX3B0ciB8fCBsZW4gIT0gc2l6ZW9mKHU2NCkpIHtcbiBcdFx0cHJfZXJyKFwmIzM0O2ZhaWxlZCB0byBnZXQgcHJlc2VydmVkIG1lbW9yeSBtYXBcXG5cJiMzNDspO1xuLVx0XHRyZXR1cm4gMDtcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuIFx0fVxuIFxuLVx0cmV0dXJuIGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKW1lbV9wdHIpO1xuJiM0MztcdG1lbV9tYXBfcGh5cyA9IGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKW1lbV9wdHIpO1xuJiM0MztcdGlmICghbWVtX21hcF9waHlzKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdHJldHVybiBwaHlzX3RvX3ZpcnQobWVtX21hcF9waHlzKTtcbiB9XG4gXG4gLypcbkBAIC02MTksMTkgJiM0Mzs3NDIsMjQgQEAgZWFybHlfcGFyYW0oXCYjMzQ7a2hvX3NjcmF0Y2hcJiMzNDssIGtob19wYXJzZV9zY3JhdGNoX3NpemUpO1xuIHN0YXRpYyB2b2lkIF9faW5pdCBzY3JhdGNoX3NpemVfdXBkYXRlKHZvaWQpXG4ge1xuIFx0Lypcbi1cdCAqIElmIGZpeGVkIHNpemVzIGFyZSBub3QgcHJvdmlkZWQgdmlhIGNvbW1hbmQgbGluZSwgY2FsY3VsYXRlIHRoZW1cbi1cdCAqIG5vdy5cbiYjNDM7XHQgKiBJZiBmaXhlZCBzaXplcyBhcmUgbm90IHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUsIGNhbGN1bGF0ZSB0aGVtIG5vdy5cbiYjNDM7XHQgKiBSZW1vdmUgSHVnZVRMQiBhbGxvY2F0aW9ucyBmcm9tIGl0IGJlY2F1c2UgdGhleSBuZXZlciBnZXQgYWxsb2NhdGVkXG4mIzQzO1x0ICogZnJvbSBzY3JhdGNoLlxuIFx0ICovXG4gXHRpZiAoc2NyYXRjaF9zY2FsZSkge1xuIFx0XHRwaHlzX2FkZHJfdCBzaXplO1xuIFxuIFx0XHRzaXplID0gbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKEFSQ0hfTE9XX0FERFJFU1NfTElNSVQsXG4gXHRcdFx0XHRcdFx0ICAgTlVNQV9OT19OT0RFKTtcbiYjNDM7XHRcdHNpemUgLT0gbWVtYmxvY2tfcmVzZXJ2ZWRfaHVnZXRsYl9zaXplKEFSQ0hfTE9XX0FERFJFU1NfTElNSVQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgICBOVU1BX05PX05PREUpO1xuIFx0XHRzaXplID0gc2l6ZSAqIHNjcmF0Y2hfc2NhbGUgLyAxMDA7XG4gXHRcdHNjcmF0Y2hfc2l6ZV9sb3dtZW0gPSBzaXplO1xuIFxuIFx0XHRzaXplID0gbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKE1FTUJMT0NLX0FMTE9DX0FOWVdIRVJFLFxuIFx0XHRcdFx0XHRcdCAgIE5VTUFfTk9fTk9ERSk7XG4mIzQzO1x0XHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XG4gXHRcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMCAtIHNjcmF0Y2hfc2l6ZV9sb3dtZW07XG4gXHRcdHNjcmF0Y2hfc2l6ZV9nbG9iYWwgPSBzaXplO1xuIFx0fVxuQEAgLTY1MSw2ICYjNDM7Nzc5LDkgQEAgc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBzY3JhdGNoX3NpemVfbm9kZShpbnQgbmlkKVxuIFx0aWYgKHNjcmF0Y2hfc2NhbGUpIHtcbiBcdFx0c2l6ZSA9IG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcbiBcdFx0XHRcdFx0XHQgICBuaWQpO1xuJiM0MztcdFx0LyogRG8gbm90IGNvdW50IEh1Z2VUTEIgcGFnZXMuICovXG4mIzQzO1x0XHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgIG5pZCk7XG4gXHRcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMDtcbiBcdH0gZWxzZSB7XG4gXHRcdHNpemUgPSBzY3JhdGNoX3NpemVfcGVybm9kZTtcbkBAIC02NTksNiAmIzQzOzc5MCw0OSBAQCBzdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHNjcmF0Y2hfc2l6ZV9ub2RlKGludCBuaWQpXG4gXHRyZXR1cm4gcm91bmRfdXAoc2l6ZSwgQ01BX01JTl9BTElHTk1FTlRfQllURVMpO1xuIH1cbiBcbiYjNDM7Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGtob19zY3JhdGNoX2NudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHNjcmF0Y2hfc3RhcnQgPSBraG9fc2NyYXRjaFtpXS5hZGRyO1xuJiM0MztcdFx0c2NyYXRjaF9lbmQgPSBraG9fc2NyYXRjaFtpXS5hZGRyICYjNDM7IGtob19zY3JhdGNoW2ldLnNpemU7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHBoeXMgXHUwMDNjIHNjcmF0Y2hfZW5kIFx1MDAyNlx1MDAyNiAocGh5cyAmIzQzOyBzaXplKSBcdTAwM2Ugc2NyYXRjaF9zdGFydClcbiYjNDM7XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE1hcmsgYWxsIEtITyBzY3JhdGNoIHBhZ2VibG9ja3MgYmV0d2VlbiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gYXNcbiYjNDM7ICogTUlHUkFURV9DTUEuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiYjNDM7e1xuJiM0MztcdGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIFx1MDAzYyBraG9fc2NyYXRjaF9jbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHNjcmF0Y2hfc3RhcnQsIHNjcmF0Y2hfZW5kLCBwZm47XG4mIzQzO1xuJiM0MztcdFx0c2NyYXRjaF9zdGFydCA9IFBIWVNfUEZOKGtob19zY3JhdGNoW2ldLmFkZHIpO1xuJiM0MztcdFx0c2NyYXRjaF9lbmQgPSBQSFlTX1BGTihraG9fc2NyYXRjaFtpXS5hZGRyICYjNDM7IGtob19zY3JhdGNoW2ldLnNpemUpO1xuJiM0MztcbiYjNDM7XHRcdC8qIFRhcmdldCByYW5nZSBkb2VzbiYjMzk7dCBvdmVybGFwIHdpdGggc2NyYXRjaC4gKi9cbiYjNDM7XHRcdGlmIChzdGFydF9wZm4gXHUwMDNlPSBzY3JhdGNoX2VuZCB8fCBlbmRfcGZuIFx1MDAzYz0gc2NyYXRjaF9zdGFydClcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0cGZuID0gbWF4X3QodW5zaWduZWQgbG9uZywgc3RhcnRfcGZuLCBzY3JhdGNoX3N0YXJ0KTtcbiYjNDM7XHRcdHBmbiA9IHBhZ2VibG9ja19zdGFydF9wZm4ocGZuKTtcbiYjNDM7XG4mIzQzO1x0XHR3aGlsZSAocGZuIFx1MDAzYyBlbmRfcGZuIFx1MDAyNlx1MDAyNiBwZm4gXHUwMDNjIHNjcmF0Y2hfZW5kKSB7XG4mIzQzO1x0XHRcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBmbl90b19wYWdlKHBmbiksXG4mIzQzO1x0XHRcdFx0XHRcdCAgIE1JR1JBVEVfQ01BLCBmYWxzZSk7XG4mIzQzO1x0XHRcdHBmbiAmIzQzOz0gcGFnZWJsb2NrX25yX3BhZ2VzO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBraG9fcmVzZXJ2ZV9zY3JhdGNoIC0gUmVzZXJ2ZSBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IGZvciBrZXhlY1xuICAqXG5AQCAtNzQ2LDYgJiM0Mzs5MjAsMTI4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBraG9fcmVzZXJ2ZV9zY3JhdGNoKHZvaWQpXG4gXHRraG9fZW5hYmxlID0gZmFsc2U7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBMb29rIGZvciBmcmVlIGJsb2NrcyBvZiAxRy4gVGhpcyBpcyBhIGhldXJpc3RpYyBjaG9zZW4gdG8gd29yayBlZmZpY2llbnRseVxuJiM0MzsgKiB3aXRoIGxhcmdlIHN5c3RlbXMgd2l0aCBodW5kcmVkcyBvZiBnaWdhYnl0ZXMgb2YgbWVtb3J5LiBJdCB3aWxsIHdvcmsgcG9vcmx5XG4mIzQzOyAqIG9uIHNtYWxsZXIgc3lzdGVtcy4gVGhlIGFsZ29yaXRobSBpdHNlbGYgZG9lc24mIzM5O3QgZGVwZW5kIG9uIHRoZSBhY3R1YWwgdmFsdWUsXG4mIzQzOyAqIHNvIGl0IGNhbiBiZSBjaGFuZ2VkIHRvIGEgZGlmZmVyZW50IGhldXJpc3RpYyBsYXRlciBpZiBuZWVkZWQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIEtIT19FWFRfQkxLU0laRVx0XHRTWl8xR1xuJiM0MzsjZGVmaW5lIEtIT19FWFRfU0hJRlRcdFx0Y29uc3RfaWxvZzIoS0hPX0VYVF9CTEtTSVpFKVxuJiM0MztcbiYjNDM7LyogQ2FsbGVkIGZvciB0aGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZS4gKi9cbiYjNDM7c3RhdGljIGludCBfX2luaXQga2hvX2V4dF93YWxrX2xlYWYodW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHQvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqL1xuJiM0MztcdHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSA9IGRhdGE7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0c3RhcnQgPSBraG9fZGVjb2RlX3JhZGl4X2tleShrZXksIFx1MDAyNm9yZGVyKTtcbiYjNDM7XHRlbmQgPSBzdGFydCAmIzQzOyAoMVVMIFx1MDAzY1x1MDAzYyAob3JkZXIgJiM0MzsgUEFHRV9TSElGVCkpO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuJiM0MztcdFx0ZXJyID0ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgc3RhcnQgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xuJiM0MztcdFx0aWYgKGVycilcbiYjNDM7XHRcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0XHRzdGFydCAmIzQzOz0gKDFVTCBcdTAwM2NcdTAwM2MgS0hPX0VYVF9TSElGVCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ2FsbGVkIGZvciB0aGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZS4gKi9cbiYjNDM7c3RhdGljIGludCBfX2luaXQga2hvX2V4dF93YWxrX25vZGUocGh5c19hZGRyX3QgcGh5cywgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdC8qIFJhZGl4IHRyZWUgdHJhY2tpbmcgZnJlZSBibG9ja3MuICovXG4mIzQzO1x0c3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlID0gZGF0YTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIHBoeXMgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDYWxsZWQgZm9yIHRoZSBmcmVlIGJsb2NrIHJhZGl4IHRyZWUuICovXG4mIzQzO3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfbWFya19zY3JhdGNoKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0cGh5c19hZGRyX3QgKnByZXZfZW5kID0gZGF0YTtcbiYjNDM7XHRwaHlzX2FkZHJfdCBzdGFydCA9IGtleSBcdTAwM2NcdTAwM2MgS0hPX0VYVF9TSElGVDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAoc3RhcnQgXHUwMDNlICpwcmV2X2VuZCkge1xuJiM0MztcdFx0ZXJyID0gbWVtYmxvY2tfbWFya19raG9fc2NyYXRjaCgqcHJldl9lbmQsIHN0YXJ0IC0gKnByZXZfZW5kKTtcbiYjNDM7XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQqcHJldl9lbmQgPSBzdGFydCAmIzQzOyAoMVVMIFx1MDAzY1x1MDAzYyBLSE9fRVhUX1NISUZUKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICoga2hvX2V4dGVuZF9zY3JhdGNoIC0gRXh0ZW5kIHRoZSBzY3JhdGNoIHJlZ2lvbnNcbiYjNDM7ICpcbiYjNDM7ICogVGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUgbWl4ZXMgYm90aCBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlclxuJiM0MzsgKiBpbnRvIGEgc2luZ2xlIGtleS4gVGhpcyBtYWtlcyBpdCBoYXJkIHRvIGxvb2sgZm9yIGZyZWUgcmFuZ2VzIGRpcmVjdGx5LiBUaGlzXG4mIzQzOyAqIGZ1bmN0aW9uIGZpcnN0IHdhbGtzIHRoZSByYWRpeCB0cmVlIGFuZCBkaWdlc3RzIGl0IGRvd24gaW50byBhbm90aGVyIHJhZGl4XG4mIzQzOyAqIHRyZWUsIHdob3NlIGtleXMgaWRlbnRpZnkgYmxvY2tzIG9mIEtIT19FWFRfU0hJRlQgd2hpY2ggY29udGFpbiBwcmVzZXJ2ZWRcbiYjNDM7ICogbWVtb3J5LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGVuIGl0IHdhbGtzIHRoZSBkaWdlc3RlZCByYWRpeCB0cmVlIGFuZCBtYXJrcyBldmVyeXRoaW5nIHRoYXQgZG9lc24mIzM5O3QgaGF2ZVxuJiM0MzsgKiBwcmVzZXJ2ZWQgbWVtb3J5IGFzIHNjcmF0Y2guXG4mIzQzOyAqXG4mIzQzOyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBzbyBpdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2NyYXRjaCBoYXNcbiYjNDM7ICogYXZhaWxhYmxlIHNwYWNlLlxuJiM0MzsgKlxuJiM0MzsgKiBOT1RFOiBUaGUgcGFnZXMgb2YgdGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUgdGFibGVzIGFyZSBub3QgbWFya2VkXG4mIzQzOyAqIGFzIHByZXNlcnZlZCBpbiB0aGUgcHJlc2VydmVkIG1lbW9yeSB0cmVlLiBCdXQgdGhleSBhcmUgZXhwZWN0ZWQgdG8gcmVtYWluXG4mIzQzOyAqIHVudG91Y2hlZCB1bnRpbCB0aGUgdHJlZSBpcyBmdWxseSBwYXJzZWQuIFNvIHRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnNcbiYjNDM7ICogdGhlbSB0byBiZSBcJiMzNDtwcmVzZXJ2ZWQgbWVtb3J5XCYjMzQ7IGFuZCBtYXJrcyB0aGVpciBibG9ja3MgYXMgYnVzeS5cbiYjNDM7ICpcbiYjNDM7ICogTk9URTogZWZpX2luaXQoKTo6cmVzZXJ2ZV9yZWdpb25zKCkgcmVtb3ZlcyBhbGwgcmVnaW9ucyBleGNlcHRcbiYjNDM7ICogTUVNQkxPQ0tfS0hPX1NDUkFUQ0guIFRoaXMgZnVuY3Rpb24gYWRkcyBzdWNoIHJlZ2lvbnMgYnV0IHRoZXkgYXJlIG5vdCBLSE9cbiYjNDM7ICogc2NyYXRjaCBtZW1vcnksIHNvIHRoZXkgc2hvdWxkIG5vdCBiZSByZW1vdmVkLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbHdheXMgYmVcbiYjNDM7ICogY2FsbGVkIGFmdGVyIHJlc2VydmVfcmVnaW9ucygpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgX19pbml0IGtob19leHRlbmRfc2NyYXRjaCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGtob19jYiA9IHtcbiYjNDM7XHRcdC5sZWFmID0ga2hvX2V4dF93YWxrX2xlYWYsXG4mIzQzO1x0XHQubm9kZSA9IGtob19leHRfd2Fsa19ub2RlLFxuJiM0MztcdH07XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGV4dF9jYiA9IHtcbiYjNDM7XHRcdC5sZWFmID0ga2hvX2V4dF9tYXJrX3NjcmF0Y2gsXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgcmFkaXg7XG4mIzQzO1x0cGh5c19hZGRyX3QgcHJldl9lbmQgPSAwO1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBraG9fcmFkaXhfaW5pdF90cmVlKFx1MDAyNnJhZGl4LCBOVUxMKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0Z290byBwcmludDtcbiYjNDM7XG4mIzQzO1x0LyogV2FsayB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gZmluZCBidXN5IGJsb2Nrcy4gKi9cbiYjNDM7XHRlcnIgPSBraG9fcmFkaXhfd2Fsa190cmVlKFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBcdTAwMjZraG9fY2IsIFx1MDAyNnJhZGl4KTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIFdhbGsgdGhlIGJsb2NrcyBhbmQgbWFyayBldmVyeXRoaW5nIGJldHdlZW4ga2V5cyBhcyBzY3JhdGNoLiAqL1xuJiM0MztcdGVyciA9IGtob19yYWRpeF93YWxrX3RyZWUoXHUwMDI2cmFkaXgsIFx1MDAyNmV4dF9jYiwgXHUwMDI2cHJldl9lbmQpO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LyogTWFyayBldmVyeXRoaW5nIGZyb20gbGFzdCBidXN5IGJsb2NrIHRvIGVuZCBvZiBEUkFNLiAqL1xuJiM0MztcdGlmIChwcmV2X2VuZCBcdTAwM2MgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSlcbiYjNDM7XHRcdGVyciA9IG1lbWJsb2NrX21hcmtfa2hvX3NjcmF0Y2gocHJldl9lbmQsIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkgLSBwcmV2X2VuZCk7XG4mIzQzO1xuJiM0MztcdC8qIGZhbGx0aHJvdWdoICovXG4mIzQzO291dDpcbiYjNDM7XHRraG9fcmFkaXhfZGVzdHJveV90cmVlKFx1MDAyNnJhZGl4KTtcbiYjNDM7cHJpbnQ6XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHByX2VycihcJiMzNDtGYWlsZWQgdG8gZXh0ZW5kIHNjcmF0Y2g6ICVwZVxcblwmIzM0OywgRVJSX1BUUihlcnIpKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBraG9fYWRkX3N1YnRyZWUgLSByZWNvcmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBzdWIgYmxvYiBpbiBLSE8gcm9vdCB0cmVlLlxuICAqIEBuYW1lOiBuYW1lIG9mIHRoZSBzdWIgdHJlZS5cbkBAIC04NTYsMTAgJiM0MzsxMTUyLDEyIEBAIGludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gZm9saW9fcGZuKGZvbGlvKTtcbiBcdGNvbnN0IHVuc2lnbmVkIGludCBvcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcbi1cdGlmIChXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAocGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULCBQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIG9yZGVyKSkpXG4mIzQzO1x0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCwgUEFHRV9TSVpFIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbi1cdHJldHVybiBraG9fcmFkaXhfYWRkX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4mIzQzO1x0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgIG9yZGVyKSk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9mb2xpbyk7XG4gXG5AQCAtODc3LDcgJiM0MzsxMTc1LDcgQEAgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBmb2xpb19wZm4oZm9saW8pO1xuIFx0Y29uc3QgdW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0a2hvX3JhZGl4X2RlbF9wYWdlKHRyZWUsIHBmbiwgb3JkZXIpO1xuJiM0MztcdGtob19yYWRpeF9kZWxfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksIG9yZGVyKSk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob191bnByZXNlcnZlX2ZvbGlvKTtcbiBcbkBAIC05MDYsNyAmIzQzOzEyMDQsOCBAQCBzdGF0aWMgdm9pZCBfX2tob191bnByZXNlcnZlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBcdHdoaWxlIChwZm4gXHUwMDNjIGVuZF9wZm4pIHtcbiBcdFx0b3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xuIFxuLVx0XHRraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4mIzQzO1x0XHRraG9fcmFkaXhfZGVsX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgb3JkZXIpKTtcbiBcbiBcdFx0cGZuICYjNDM7PSAxIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiBcdH1cbkBAIC05MzEsNyAmIzQzOzEyMzAsOCBAQCBpbnQga2hvX3ByZXNlcnZlX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuIFx0dW5zaWduZWQgbG9uZyBmYWlsZWRfcGZuID0gMDtcbiBcdGludCBlcnIgPSAwO1xuIFxuLVx0aWYgKFdBUk5fT04oa2hvX3NjcmF0Y2hfb3ZlcmxhcChzdGFydF9wZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsXG4mIzQzO1x0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbiBcdFx0XHRcdFx0bnJfcGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpKSkge1xuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdH1cbkBAIC05MzksNyAmIzQzOzEyMzksOCBAQCBpbnQga2hvX3ByZXNlcnZlX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuIFx0d2hpbGUgKHBmbiBcdTAwM2MgZW5kX3Bmbikge1xuIFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xuIFxuLVx0XHRlcnIgPSBraG9fcmFkaXhfYWRkX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4mIzQzO1x0XHRlcnIgPSBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0ICAgb3JkZXIpKTtcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGZhaWxlZF9wZm4gPSBwZm47XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTMxNSwyMiAmIzQzOzE2MTYsNiBAQCB2b2lkIGtob19yZXN0b3JlX2ZyZWUodm9pZCAqbWVtKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChraG9fcmVzdG9yZV9mcmVlKTtcbiBcbi1zdHJ1Y3Qga2hvX2luIHtcbi1cdHBoeXNfYWRkcl90IGZkdF9waHlzO1xuLVx0cGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzO1xuLVx0Y2hhciBwcmV2aW91c19yZWxlYXNlW19fTkVXX1VUU19MRU4gJiM0MzsgMV07XG4tXHR1MzIga2V4ZWNfY291bnQ7XG4tXHRzdHJ1Y3Qga2hvX2RlYnVnZnMgZGJnO1xuLX07XG4tXG4tc3RhdGljIHN0cnVjdCBraG9faW4ga2hvX2luID0ge1xuLX07XG4tXG4tc3RhdGljIGNvbnN0IHZvaWQgKmtob19nZXRfZmR0KHZvaWQpXG4te1xuLVx0cmV0dXJuIGtob19pbi5mZHRfcGh5cyA/IHBoeXNfdG9fdmlydChraG9faW4uZmR0X3BoeXMpIDogTlVMTDtcbi19XG4tXG4gLyoqXG4gICogaXNfa2hvX2Jvb3QgLSBjaGVjayBpZiBjdXJyZW50IGtlcm5lbCB3YXMgYm9vdGVkIHZpYSBLSE8tZW5hYmxlZFxuICAqIGtleGVjXG5AQCAtMTM5OCwyNiAmIzQzOzE2ODMsMjQgQEAgaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yZXRyaWV2ZV9zdWJ0cmVlKTtcbiBcbi1zdGF0aWMgaW50IF9faW5pdCBraG9fbWVtX3JldHJpZXZlKGNvbnN0IHZvaWQgKmZkdClcbiYjNDM7c3RhdGljIHZvaWQgX19pbml0IGtob19tZW1fcmV0cmlldmUodm9pZClcbiB7XG4tXHRzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgdHJlZTtcbi1cdGNvbnN0IHBoeXNfYWRkcl90ICptZW07XG4tXHRpbnQgbGVuO1xuJiM0MztcdGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiBjYiA9IHtcbiYjNDM7XHRcdC5sZWFmID0ga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSxcbiYjNDM7XHR9O1xuIFxuLVx0LyogUmV0cmlldmUgdGhlIEtITyByYWRpeCB0cmVlIGZyb20gcGFzc2VkLWluIEZEVC4gKi9cbi1cdG1lbSA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgXHUwMDI2bGVuKTtcbiYjNDM7XHRpZiAoa2hvX3JhZGl4X3dhbGtfdHJlZShcdTAwMjZraG9faW4ucmFkaXhfdHJlZSwgXHUwMDI2Y2IsIE5VTEwpKVxuJiM0MztcdFx0Z290byBlcnI7XG4gXG4tXHRpZiAoIW1lbSB8fCBsZW4gIT0gc2l6ZW9mKCptZW0pKSB7XG4tXHRcdHByX2VycihcJiMzNDtmYWlsZWQgdG8gZ2V0IHByZXNlcnZlZCBLSE8gbWVtb3J5IHRyZWVcXG5cJiMzNDspO1xuLVx0XHRyZXR1cm4gLUVOT0VOVDtcbi1cdH1cbi1cbi1cdGlmICghKm1lbSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0cmV0dXJuO1xuIFxuLVx0dHJlZS5yb290ID0gcGh5c190b192aXJ0KCptZW0pO1xuLVx0bXV0ZXhfaW5pdChcdTAwMjZ0cmVlLmxvY2spO1xuLVx0cmV0dXJuIGtob19yYWRpeF93YWxrX3RyZWUoXHUwMDI2dHJlZSwga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSk7XG4mIzQzO2VycjpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZhaWxlZCB0byBpbml0aWFsaXplIHByZXNlcnZlZCBtZW1vcnkuIENsZWFyIEZEVCBhbmQgcmFkaXggc28gS0hPXG4mIzQzO1x0ICogdXNlcnMgZG9uJiMzOTt0IHRyZWF0IGl0IGFzIGEgS0hPIGJvb3QuXG4mIzQzO1x0ICovXG4mIzQzO1x0a2hvX2luLmZkdF9waHlzID0gMDtcbiYjNDM7XHRraG9faW4ucmFkaXhfdHJlZS5yb290ID0gTlVMTDtcbiB9XG4gXG4gc3RhdGljIF9faW5pdCBpbnQga2hvX291dF9mZHRfc2V0dXAodm9pZClcbkBAIC0xNTQzLDE2ICYjNDM7MTgyNiwxNCBAQCBzdGF0aWMgX19pbml0IGludCBraG9faW5pdCh2b2lkKVxuIFx0aWYgKCFraG9fZW5hYmxlKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHRyZWUtXHUwMDNlcm9vdCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghdHJlZS1cdTAwM2Vyb290KSB7XG4tXHRcdGVyciA9IC1FTk9NRU07XG4mIzQzO1x0ZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZSh0cmVlLCBOVUxMKTtcbiYjNDM7XHRpZiAoZXJyKVxuIFx0XHRnb3RvIGVycl9mcmVlX3NjcmF0Y2g7XG4tXHR9XG4gXG4gXHRraG9fb3V0LmZkdCA9IGtob19hbGxvY19wcmVzZXJ2ZShQQUdFX1NJWkUpO1xuIFx0aWYgKElTX0VSUihraG9fb3V0LmZkdCkpIHtcbiBcdFx0ZXJyID0gUFRSX0VSUihraG9fb3V0LmZkdCk7XG4tXHRcdGdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWVfcm9vdDtcbiYjNDM7XHRcdGdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU7XG4gXHR9XG4gXG4gXHRlcnIgPSBraG9fZGVidWdmc19pbml0KCk7XG5AQCAtMTYwMyw5ICYjNDM7MTg4NCw4IEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXG4gXG4gZXJyX2ZyZWVfZmR0OlxuIFx0a2hvX3VucHJlc2VydmVfZnJlZShraG9fb3V0LmZkdCk7XG4tZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWVfcm9vdDpcbi1cdGtmcmVlKHRyZWUtXHUwMDNlcm9vdCk7XG4tXHR0cmVlLVx1MDAzZXJvb3QgPSBOVUxMO1xuJiM0MztlcnJfZnJlZV9raG9fcmFkaXhfdHJlZTpcbiYjNDM7XHRraG9fcmFkaXhfZGVzdHJveV90cmVlKHRyZWUpO1xuIGVycl9mcmVlX3NjcmF0Y2g6XG4gXHRraG9fb3V0LmZkdCA9IE5VTEw7XG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpJiM0MzsmIzQzOykge1xuQEAgLTE2MTksMTYgJiM0MzsxODk5LDQzIEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXG4gfVxuIGZzX2luaXRjYWxsKGtob19pbml0KTtcbiBcbi12b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXQodm9pZClcbiYjNDM7dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpXG4ge1xuLVx0aWYgKGtob19pbi5zY3JhdGNoX3BoeXMpIHtcbi1cdFx0a2hvX3NjcmF0Y2ggPSBwaHlzX3RvX3ZpcnQoa2hvX2luLnNjcmF0Y2hfcGh5cyk7XG4mIzQzO1x0Y29uc3Qgdm9pZCAqZmR0ID0ga2hvX2dldF9mZHQoKTtcbiBcbi1cdFx0aWYgKGtob19tZW1fcmV0cmlldmUoa2hvX2dldF9mZHQoKSkpXG4tXHRcdFx0a2hvX2luLmZkdF9waHlzID0gMDtcbi1cdH0gZWxzZSB7XG4tXHRcdGtob19yZXNlcnZlX3NjcmF0Y2goKTtcbiYjNDM7XHRpZiAoIWlzX2tob19ib290KCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICoga2hvX3NjcmF0Y2hfb3ZlcmxhcCgpIG5lZWRzIGtob19zY3JhdGNoIHRvIGJlIGluaXRpYWxpemVkLiBJdFxuJiM0MztcdCAqIGlzIHVzZWQgYnkgZnJlZV9hcmVhX2luaXQoKSBvbiBLSE8gYm9vdHMsIHNvIGluaXRpYWxpemUgaXRcbiYjNDM7XHQgKiBlYXJseS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRraG9fc2NyYXRjaCA9IHBoeXNfdG9fdmlydChraG9faW4uc2NyYXRjaF9waHlzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBraG9fZ2V0X21lbV9tYXAoKSBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuIElmIGl0IGZhaWxzLCBraG9fcG9wdWxhdGUoKVxuJiM0MztcdCAqIGNhdGNoZXMgdGhhdCBhbmQgbmV2ZXIgc2V0cyBraG9faW4uZmR0X3BoeXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGtob19yYWRpeF9pbml0X3RyZWUoXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIGtob19nZXRfbWVtX21hcChmZHQpKSkge1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIEZhaWxlZCB0byBpbml0aWFsaXplIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZS4gQ2xlYXIgRkRUXG4mIzQzO1x0XHQgKiBhbmQgc2NyYXRjaCBzbyBLSE8gdXNlcnMgZG9uJiMzOTt0IHRyZWF0IGl0IGFzIGEgS0hPIGJvb3QuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGtob19pbi5mZHRfcGh5cyA9IDA7XG4mIzQzO1x0XHRraG9faW4uc2NyYXRjaF9waHlzID0gMDtcbiYjNDM7XHRcdHJldHVybjtcbiBcdH1cbiYjNDM7XG4mIzQzO1x0a2hvX2V4dGVuZF9zY3JhdGNoKCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGtob19pbi5zY3JhdGNoX3BoeXMpXG4mIzQzO1x0XHRraG9fbWVtX3JldHJpZXZlKCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0a2hvX3Jlc2VydmVfc2NyYXRjaCgpO1xuIH1cbiBcbiB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuQEAgLTE2MzYsOSAmIzQzOzE5NDMsOCBAQCB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuIHtcbiBcdHVuc2lnbmVkIGludCBzY3JhdGNoX2NudCA9IHNjcmF0Y2hfbGVuIC8gc2l6ZW9mKCpraG9fc2NyYXRjaCk7XG4gXHRzdHJ1Y3Qga2hvX3NjcmF0Y2ggKnNjcmF0Y2ggPSBOVUxMO1xuLVx0cGh5c19hZGRyX3QgbWVtX21hcF9waHlzO1xuLVx0dm9pZCAqZmR0ID0gTlVMTDtcbiBcdGJvb2wgcG9wdWxhdGVkID0gZmFsc2U7XG4mIzQzO1x0dm9pZCAqZmR0ID0gTlVMTDtcbiBcdGludCBlcnI7XG4gXG4gXHQvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgRkRUICovXG5AQCAtMTY2MCw4ICYjNDM7MTk2NiwxMyBAQCB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuIFx0XHRnb3RvIHVubWFwX2ZkdDtcbiBcdH1cbiBcbi1cdG1lbV9tYXBfcGh5cyA9IGtob19nZXRfbWVtX21hcF9waHlzKGZkdCk7XG4tXHRpZiAoIW1lbV9tYXBfcGh5cylcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEF0IHRoaXMgcG9pbnQgcGh5c190b192aXJ0KCkgZG9lc24mIzM5O3Qgd29yayBwcm9wZXJseSBhbmQgc29cbiYjNDM7XHQgKiBraG9fZ2V0X21lbV9tYXAoKSBjYW4gcmV0dXJuIGEgcHJlLUtBU0xSIHZpcnR1YWwgYWRkcmVzcy4gQnV0IGhlcmUgd2VcbiYjNDM7XHQgKiBvbmx5IHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBtZW1fbWFwIGlzIHZhbGlkIHNvIHRoZSBhY3R1YWwgdmFsdWVcbiYjNDM7XHQgKiBkb2VzbiYjMzk7dCBtYXR0ZXIgYXMgbG9uZyBhcyBpdCBpc24mIzM5O3QgTlVMTC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWtob19nZXRfbWVtX21hcChmZHQpKVxuIFx0XHRnb3RvIHVubWFwX2ZkdDtcbiBcbiBcdHNjcmF0Y2ggPSBlYXJseV9tZW1yZW1hcChzY3JhdGNoX3BoeXMsIHNjcmF0Y2hfbGVuKTtcbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfZGVidWcuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA2ZWZiNjk2ZjU0MjYxMi4uMDAwMDAwMDAwMDAwMDBcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2RlYnVnLmNcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDI1ICYjNDM7MCwwIEBAXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLS8qXG4tICoga2V4ZWNfaGFuZG92ZXJfZGVidWcuYyAtIGtleGVjIGhhbmRvdmVyIG9wdGlvbmFsIGRlYnVnIGZ1bmN0aW9uYWxpdHlcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMjUgR29vZ2xlIExMQywgUGFzaGEgVGF0YXNoaW4gXHUwMDNjcGFzaGEudGF0YXNoaW5Ac29sZWVuLmNvbVx1MDAzZVxuLSAqL1xuLVxuLSNkZWZpbmUgcHJfZm10KGZtdCkgXCYjMzQ7S0hPOiBcJiMzNDsgZm10XG4tXG4tI2luY2x1ZGUgXCYjMzQ7a2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaFwmIzM0O1xuLVxuLWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbi17XG4tXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3N0YXJ0LCBzY3JhdGNoX2VuZDtcbi1cdHVuc2lnbmVkIGludCBpO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpJiM0MzsmIzQzOykge1xuLVx0XHRzY3JhdGNoX3N0YXJ0ID0ga2hvX3NjcmF0Y2hbaV0uYWRkcjtcbi1cdFx0c2NyYXRjaF9lbmQgPSBraG9fc2NyYXRjaFtpXS5hZGRyICYjNDM7IGtob19zY3JhdGNoW2ldLnNpemU7XG4tXG4tXHRcdGlmIChwaHlzIFx1MDAzYyBzY3JhdGNoX2VuZCBcdTAwMjZcdTAwMjYgKHBoeXMgJiM0Mzsgc2l6ZSkgXHUwMDNlIHNjcmF0Y2hfc3RhcnQpXG4tXHRcdFx0cmV0dXJuIHRydWU7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2ludGVybmFsLmggYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG5pbmRleCAwMzk5ZmYxMDc3NzUwYi4uODA1ZDJhNzZjMzg4MTggMTAwNjQ0XG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG5AQCAtNDEsMTMgJiM0Mzs0MSw0IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBraG9fZGVidWdmc19ibG9iX3JlbW92ZShzdHJ1Y3Qga2hvX2RlYnVnZnMgKmRiZyxcbiBcdFx0XHRcdFx0ICAgdm9pZCAqYmxvYikgeyB9XG4gI2VuZGlmIC8qIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVR0ZTICovXG4gXG4tI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVR1xuLWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSk7XG4tI2Vsc2Vcbi1zdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbi17XG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLSNlbmRpZiAvKiBDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcgKi9cbi1cbiAjZW5kaWYgLyogTElOVVhfS0VYRUNfSEFORE9WRVJfSU5URVJOQUxfSCAqL1xuZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuY1xuaW5kZXggNTcxMjEyYjgwODM1ZWMuLmFiNGFmYzgxOGU4Y2JkIDEwMDY0NFxuLS0tIGEvbW0vaHVnZXRsYi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9odWdldGxiLmNcbkBAIC0zMDMzLDI5ICYjNDM7MzAzMywyMSBAQCBzdGF0aWMgX19pbml0IHZvaWQgKmFsbG9jX2Jvb3RtZW0oc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZCwgYm9vbCBub2RlX2V4YWN0KVxuIFx0aWYgKGh1Z2V0bGJfZWFybHlfY21hKGgpKVxuIFx0XHRtID0gaHVnZXRsYl9jbWFfYWxsb2NfYm9vdG1lbShoLCBcdTAwMjZsaXN0bm9kZSwgbm9kZV9leGFjdCk7XG4gXHRlbHNlIHtcbi1cdFx0aWYgKG5vZGVfZXhhY3QpXG4tXHRcdFx0bSA9IG1lbWJsb2NrX2FsbG9jX2V4YWN0X25pZF9yYXcoaHVnZV9wYWdlX3NpemUoaCksXG4tXHRcdFx0XHRodWdlX3BhZ2Vfc2l6ZShoKSwgMCxcbi1cdFx0XHRcdE1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUsIG5pZCk7XG4tXHRcdGVsc2Uge1xuLVx0XHRcdG0gPSBtZW1ibG9ja19hbGxvY190cnlfbmlkX3JhdyhodWdlX3BhZ2Vfc2l6ZShoKSxcbi1cdFx0XHRcdGh1Z2VfcGFnZV9zaXplKGgpLCAwLFxuLVx0XHRcdFx0TUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRSwgbmlkKTtcbiYjNDM7XHRcdG0gPSBtZW1ibG9ja19hbGxvY19odWdldGxiKGh1Z2VfcGFnZV9zaXplKGgpLCBuaWQsIG5vZGVfZXhhY3QpO1xuJiM0MztcdFx0aWYgKG0pIHtcbiYjNDM7XHRcdFx0bS1cdTAwM2VmbGFncyA9IDA7XG4mIzQzO1x0XHRcdG0tXHUwMDNlY21hID0gTlVMTDtcbiYjNDM7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiBGb3IgcHJlLUhWTyB0byB3b3JrIGNvcnJlY3RseSwgcGFnZXMgbmVlZCB0byBiZSBvblxuIFx0XHRcdCAqIHRoZSBsaXN0IGZvciB0aGUgbm9kZSB0aGV5IHdlcmUgYWN0dWFsbHkgYWxsb2NhdGVkXG4gXHRcdFx0ICogZnJvbS4gVGhhdCBub2RlIG1heSBiZSBkaWZmZXJlbnQgaW4gdGhlIGNhc2Ugb2Zcbi1cdFx0XHQgKiBmYWxsYmFjayBieSBtZW1ibG9ja19hbGxvY190cnlfbmlkX3Jhdy4gU28sXG4mIzQzO1x0XHRcdCAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJfYm9vdG1lbS4gU28sXG4gXHRcdFx0ICogZXh0cmFjdCB0aGUgYWN0dWFsIG5vZGUgZmlyc3QuXG4gXHRcdFx0ICovXG4tXHRcdFx0aWYgKG0pXG4mIzQzO1x0XHRcdGlmICghbm9kZV9leGFjdClcbiBcdFx0XHRcdGxpc3Rub2RlID0gZWFybHlfcGZuX3RvX25pZChQSFlTX1BGTihfX3BhKG0pKSk7XG4gXHRcdH1cbi1cbi1cdFx0aWYgKG0pIHtcbi1cdFx0XHRtLVx1MDAzZWZsYWdzID0gMDtcbi1cdFx0XHRtLVx1MDAzZWNtYSA9IE5VTEw7XG4tXHRcdH1cbiBcdH1cbiBcbiBcdGlmIChtKSB7XG5kaWZmIC0tZ2l0IGEvbW0vbWVtYmxvY2suYyBiL21tL21lbWJsb2NrLmNcbmluZGV4IDYzNDljNDgxNTRmNGIxLi5jMTBkZmIwNTQ4MDZhNyAxMDA2NDRcbi0tLSBhL21tL21lbWJsb2NrLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbWJsb2NrLmNcbkBAIC0xNTA2LDYgJiM0MzsxNTA2LDMyIEBAIGludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfc2V0X25vZGUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSxcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7c3RhdGljIHZvaWQgbWVtYmxvY2tfcHJlcF9hbGxvY2F0aW9uKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBzaXplLFxuJiM0MztcdFx0XHRcdCAgICAgYm9vbCBsZWFrdHJhY2UpXG4mIzQzO3tcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNraXAga21lbWxlYWsgZm9yIHRob3NlIHBsYWNlcyBsaWtlIGthc2FuX2luaXQoKSBhbmRcbiYjNDM7XHQgKiBlYXJseV9wZ3RhYmxlX2FsbG9jKCkgZHVlIHRvIGhpZ2ggdm9sdW1lLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChsZWFrdHJhY2UpXG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogTWVtYmxvY2sgYWxsb2NhdGVkIGJsb2NrcyBhcmUgbmV2ZXIgcmVwb3J0ZWQgYXNcbiYjNDM7XHRcdCAqIGxlYWtzLiBUaGlzIGlzIGJlY2F1c2UgbWFueSBvZiB0aGVzZSBibG9ja3MgYXJlXG4mIzQzO1x0XHQgKiBvbmx5IHJlZmVycmVkIHZpYSB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGljaCBpc1xuJiM0MztcdFx0ICogbm90IGxvb2tlZCB1cCBieSBrbWVtbGVhay5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0a21lbWxlYWtfYWxsb2NfcGh5cyhzdGFydCwgc2l6ZSwgMCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU29tZSBWaXJ0dWFsIE1hY2hpbmUgcGxhdGZvcm1zLCBzdWNoIGFzIEludGVsIFREWCBvciBBTUQgU0VWLVNOUCxcbiYjNDM7XHQgKiByZXF1aXJlIG1lbW9yeSB0byBiZSBhY2NlcHRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgdGhlXG4mIzQzO1x0ICogZ3Vlc3QuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBBY2NlcHQgdGhlIG1lbW9yeSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRhY2NlcHRfbWVtb3J5KHN0YXJ0LCBzaXplKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBtZW1ibG9ja19hbGxvY19yYW5nZV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9ja1xuICAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXNcbkBAIC0xNTgwLDI4ICYjNDM7MTYwNiw3IEBAIHBoeXNfYWRkcl90IF9faW5pdCBtZW1ibG9ja19hbGxvY19yYW5nZV9uaWQocGh5c19hZGRyX3Qgc2l6ZSxcbiBcdHJldHVybiAwO1xuIFxuIGRvbmU6XG4tXHQvKlxuLVx0ICogU2tpcCBrbWVtbGVhayBmb3IgdGhvc2UgcGxhY2VzIGxpa2Uga2FzYW5faW5pdCgpIGFuZFxuLVx0ICogZWFybHlfcGd0YWJsZV9hbGxvYygpIGR1ZSB0byBoaWdoIHZvbHVtZS5cbi1cdCAqL1xuLVx0aWYgKGVuZCAhPSBNRU1CTE9DS19BTExPQ19OT0xFQUtUUkFDRSlcbi1cdFx0Lypcbi1cdFx0ICogTWVtYmxvY2sgYWxsb2NhdGVkIGJsb2NrcyBhcmUgbmV2ZXIgcmVwb3J0ZWQgYXNcbi1cdFx0ICogbGVha3MuIFRoaXMgaXMgYmVjYXVzZSBtYW55IG9mIHRoZXNlIGJsb2NrcyBhcmVcbi1cdFx0ICogb25seSByZWZlcnJlZCB2aWEgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hpY2ggaXNcbi1cdFx0ICogbm90IGxvb2tlZCB1cCBieSBrbWVtbGVhay5cbi1cdFx0ICovXG4tXHRcdGttZW1sZWFrX2FsbG9jX3BoeXMoZm91bmQsIHNpemUsIDApO1xuLVxuLVx0Lypcbi1cdCAqIFNvbWUgVmlydHVhbCBNYWNoaW5lIHBsYXRmb3Jtcywgc3VjaCBhcyBJbnRlbCBURFggb3IgQU1EIFNFVi1TTlAsXG4tXHQgKiByZXF1aXJlIG1lbW9yeSB0byBiZSBhY2NlcHRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgdGhlXG4tXHQgKiBndWVzdC5cbi1cdCAqXG4tXHQgKiBBY2NlcHQgdGhlIG1lbW9yeSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci5cbi1cdCAqL1xuLVx0YWNjZXB0X21lbW9yeShmb3VuZCwgc2l6ZSk7XG4tXG4mIzQzO1x0bWVtYmxvY2tfcHJlcF9hbGxvY2F0aW9uKGZvdW5kLCBzaXplLCBlbmQgIT0gTUVNQkxPQ0tfQUxMT0NfTk9MRUFLVFJBQ0UpO1xuIFx0cmV0dXJuIGZvdW5kO1xuIH1cbiBcbkBAIC0xNzU2LDYgJiM0MzsxNzYxLDY5IEBAIHZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoXG4gXHRcdFx0XHQgICAgICAgZmFsc2UpO1xuIH1cbiBcbiYjNDM7LyoqXG4mIzQzOyAqIG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBmb3IgSHVnZVRMQiBwYWdlc1xuJiM0MzsgKiBAc2l6ZTogICAgICBzaXplIG9mIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzXG4mIzQzOyAqIEBuaWQ6ICAgICAgIG5pZCBvZiB0aGUgZnJlZSBtZW1vcnkgdG8gZmluZCwgJU5VTUFfTk9fTk9ERSBmb3IgYW55IG5vZGVcbiYjNDM7ICogQGV4YWN0X25pZDogb25seSBhbGxvY2F0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgbmlkLiBJZiAlZmFsc2UsIHRoZSBzcGVjaWZpZWRcbiYjNDM7ICogICAgICAgICAgICAgbmlkIGlzIHRyaWVkIGZpcnN0LCBhbmQgdGhlbiBhbGwgbm9kZXMgYXJlIHRyaWVkIGFzIGZhbGxiYWNrLlxuJiM0MzsgKlxuJiM0MzsgKiBIdWdlVExCIHBhZ2VzIGFyZSBhbHdheXMgYWxpZ25lZCBieSB0aGVpciBzaXplLCBzbyB0aGUgYWxpZ25tZW50IG1hdGNoZXNcbiYjNDM7ICogQHNpemUuIFNpbmNlIHRoZSBtZW1vcnkgaXMgZm9yIHVzZXJzcGFjZSwgbWlycm9yZWQgbWVtb3J5IGlzIG5vdCB1c2VkLiBUaGVcbiYjNDM7ICogbWVtb3J5IGlzIG5vdCB6ZXJvZWQuIERvZXMgbm90IHBhbmljIGlmIHJlcXVlc3QgY2Fubm90IGJlIHNhdGlzZmllZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOlxuJiM0MzsgKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvbiBzdWNjZXNzLCAlTlVMTCBvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxuJiM0Mzt7XG4mIzQzO1x0ZW51bSBtZW1ibG9ja19mbGFncyBmbGFncyA9IGNob29zZV9tZW1ibG9ja19mbGFncygpO1xuJiM0MztcdHBoeXNfYWRkcl90IGFkZHIsIHN0YXJ0ID0gMCwgZW5kID0gTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRTtcbiYjNDM7XG4mIzQzO1x0bWVtYmxvY2tfZGJnKFwmIzM0OyVzOiAlbGx1IGJ5dGVzLCBuaWQ9JWQsIGV4YWN0X25pZD0lZCAlcFNcXG5cJiMzNDssIF9fZnVuY19fLFxuJiM0MztcdFx0ICAgICAodTY0KXNpemUsIG5pZCwgZXhhY3RfbmlkLCAodm9pZCAqKV9SRVRfSVBfKTtcbiYjNDM7XG4mIzQzO1x0LyogRG9uJiMzOTt0IHdhc3RlIG1pcnJvcmVkIG1lbW9yeSBvbiBIdWdlVExCIHBhZ2VzLiAqL1xuJiM0MztcdGZsYWdzIFx1MDAyNj0gfk1FTUJMT0NLX01JUlJPUjtcbiYjNDM7cmV0cnk6XG4mIzQzO1x0LyogSHVnZVRMQiBwYWdlcyBhcmUgYWx3YXlzIGFsaWduZWQgYnkgdGhlaXIgc2l6ZS4gKi9cbiYjNDM7XHRhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZV9ub2RlKHNpemUsIHNpemUsIHN0YXJ0LCBlbmQsIG5pZCwgZmxhZ3MpO1xuJiM0MztcdGlmIChhZGRyKVxuJiM0MztcdFx0Z290byBmb3VuZDtcbiYjNDM7XG4mIzQzO1x0LyogVHJ5IGFsbCBub2RlcyBpZiBhbGxvd2VkLiAqL1xuJiM0MztcdGlmIChudW1hX3ZhbGlkX25vZGUobmlkKSBcdTAwMjZcdTAwMjYgIWV4YWN0X25pZCkge1xuJiM0MztcdFx0bmlkID0gTlVNQV9OT19OT0RFO1xuJiM0MztcdFx0Z290byByZXRyeTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEZvdW5kIG5vdGhpbmcuLi4gOi0oICovXG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0Mztmb3VuZDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEh1Z2VUTEIgcGFnZXMgY2FuIGJlIHByZXNlcnZlZCB3aXRoIEtITyBhbmQgbm8gcHJlc2VydmVkIG1lbW9yeSBjYW5cbiYjNDM7XHQgKiBiZSBpbiBzY3JhdGNoLiBTbyByZXRyeSBpZiBmb3VuZCBhZGRyZXNzIG92ZXJsYXBzIHdpdGggc2NyYXRjaC5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIFNjcmF0Y2ggYXJlYXMgYXJlIG5vcm1hbGx5IG5vdCB2ZXJ5IGxhcmdlLCBzbyB0aGlzIHNob3VsZG4mIzM5O3QgdGFrZSB0b29cbiYjNDM7XHQgKiBtYW55IHJldHJpZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGtob19zY3JhdGNoX292ZXJsYXAoYWRkciwgc2l6ZSkpIHtcbiYjNDM7XHRcdGlmIChtZW1ibG9ja19ib3R0b21fdXAoKSlcbiYjNDM7XHRcdFx0c3RhcnQgPSBhZGRyICYjNDM7IHNpemU7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdHN0YXJ0ID0gYWRkciAtIHNpemU7XG4mIzQzO1xuJiM0MztcdFx0Z290byByZXRyeTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChfX21lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSwgbmlkLCBNRU1CTE9DS19SU1JWX0tFUk4gfCBNRU1CTE9DS19SU1JWX0hVR0VUTEIpKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihhZGRyLCBzaXplLCB0cnVlKTtcbiYjNDM7XHRyZXR1cm4gcGh5c190b192aXJ0KGFkZHIpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIG1lbWJsb2NrX2FsbG9jX3RyeV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9ja1xuICAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXNcbkBAIC0xODI1LDYgJiM0MzsxODkzLDI4IEBAIHBoeXNfYWRkcl90IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19yZXNlcnZlZF9zaXplKHZvaWQpXG4gXHRyZXR1cm4gbWVtYmxvY2sucmVzZXJ2ZWQudG90YWxfc2l6ZTtcbiB9XG4gXG4mIzQzO3BoeXNfYWRkcl90IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUocGh5c19hZGRyX3QgbGltaXQsIGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuJiM0MztcdHBoeXNfYWRkcl90IHRvdGFsID0gMDtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfcmVzZXJ2ZWRfbWVtX3JlZ2lvbihyKSB7XG4mIzQzO1x0XHRwaHlzX2FkZHJfdCBzaXplID0gci1cdTAwM2VzaXplO1xuJiM0MztcbiYjNDM7XHRcdGlmIChyLVx1MDAzZWJhc2UgXHUwMDNlIGxpbWl0KVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoci1cdTAwM2ViYXNlICYjNDM7IHItXHUwMDNlc2l6ZSBcdTAwM2UgbGltaXQpXG4mIzQzO1x0XHRcdHNpemUgPSBsaW1pdCAtIHItXHUwMDNlYmFzZTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobmlkID09IG1lbWJsb2NrX2dldF9yZWdpb25fbm9kZShyKSB8fCAhbnVtYV92YWxpZF9ub2RlKG5pZCkpXG4mIzQzO1x0XHRcdGlmIChyLVx1MDAzZWZsYWdzIFx1MDAyNiBNRU1CTE9DS19SU1JWX0hVR0VUTEIpXG4mIzQzO1x0XHRcdFx0dG90YWwgJiM0Mzs9IHNpemU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdG90YWw7XG4mIzQzO31cbiYjNDM7XG4gcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcbiB7XG4gXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuQEAgLTI1MTEsMTYgJiM0MzsyNjAxLDYgQEAgX19pbml0IHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKVxuIHtcbiBcdGtob19zY3JhdGNoX29ubHkgPSBmYWxzZTtcbiB9XG4tXG4tYm9vbCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpXG4te1xuLVx0aW50IGkgPSBtZW1ibG9ja19zZWFyY2goXHUwMDI2bWVtYmxvY2subWVtb3J5LCBhZGRyKTtcbi1cbi1cdGlmIChpID09IC0xKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHRyZXR1cm4gbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2goXHUwMDI2bWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbaV0pO1xuLX1cbiAjZW5kaWZcbiBcbiAjaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSXG5kaWZmIC0tZ2l0IGEvbW0vbW1faW5pdC5jIGIvbW0vbW1faW5pdC5jXG5pbmRleCAwZjY0OTA5ZThkMjBlMi4uMWQyZjMwMmQ4Y2Q5YzEgMTAwNjQ0XG4tLS0gYS9tbS9tbV9pbml0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21tX2luaXQuY1xuQEAgLTcwNyw5ICYjNDM7NzA3LDEwIEBAIHZvaWQgX19tZW1pbml0IF9faW5pdF9wYWdlX2Zyb21fbmlkKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuIFx0X19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBmbiwgemlkLCBuaWQpO1xuIFxuIFx0aWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpIHtcbi1cdFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XG4tXHRcdFx0a2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBNSUdSQVRFX01PVkFCTEUpO1xuLVx0XHRpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwZm5fdG9fcGFnZShwZm4pLCBtdCwgZmFsc2UpO1xuJiM0MztcdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgTUlHUkFURV9NT1ZBQkxFLFxuJiM0MztcdFx0XHRcdFx0ICAgZmFsc2UpO1xuJiM0MztcdFx0LyogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgaW4gY2FzZSBpdCBpcyBLSE8gc2NyYXRjaC4gKi9cbiYjNDM7XHRcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBwZm4gJiM0MzsgMSk7XG4gXHR9XG4gfVxuIFxuQEAgLTkzOCwxMyAmIzQzOzkzOSwyMiBAQCB2b2lkIF9fbWVtaW5pdCBtZW1tYXBfaW5pdF9yYW5nZSh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZVxuIFx0XHR9XG4gXHRcdHBmbiYjNDM7JiM0Mzs7XG4gXHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgZm9yIGFueSBwYWdlYmxvY2tzIHRoYXQgZmFsbCBpbiBhIEtITyBzY3JhdGNoXG4mIzQzO1x0ICogYXJlYS4gRG8gdGhpcyBoZXJlIG91dHNpZGUgdGhlIGxvb3AgYmVjYXVzZSBtb3N0IHBhZ2VibG9ja3Mgd2lsbCBub3RcbiYjNDM7XHQgKiBiZSBLSE8gc2NyYXRjaCwgc28gb25seSBzZWFyY2ggb25jZS5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIE9ubHkgcGFnZWJsb2NrcyB1cCB0byBwZm4gYXJlIHVwZGF0ZWQsIGRlZmVycmVkIHBhZ2VibG9ja3Mgd2lsbCBiZVxuJiM0MztcdCAqIHVwZGF0ZWQgbGF0ZXIuXG4mIzQzO1x0ICovXG4mIzQzO1x0a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIHBmbik7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdF96b25lX3JhbmdlKHN0cnVjdCB6b25lICp6b25lLFxuIFx0XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbixcbi1cdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nICpob2xlX3Bmbixcbi1cdFx0XHRcdFx0ICBlbnVtIG1pZ3JhdGV0eXBlIG10KVxuJiM0MztcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nICpob2xlX3BmbilcbiB7XG4gXHR1bnNpZ25lZCBsb25nIHpvbmVfc3RhcnRfcGZuID0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbjtcbiBcdHVuc2lnbmVkIGxvbmcgem9uZV9lbmRfcGZuID0gem9uZV9zdGFydF9wZm4gJiM0Mzsgem9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzO1xuQEAgLTk1Nyw3ICYjNDM7OTY3LDggQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0X3pvbmVfcmFuZ2Uoc3RydWN0IHpvbmUgKnpvbmUsXG4gXHRcdHJldHVybjtcbiBcbiBcdG1lbW1hcF9pbml0X3JhbmdlKGVuZF9wZm4gLSBzdGFydF9wZm4sIG5pZCwgem9uZV9pZCwgc3RhcnRfcGZuLFxuLVx0XHRcdCAgem9uZV9lbmRfcGZuLCBNRU1JTklUX0VBUkxZLCBOVUxMLCBtdCwgZmFsc2UpO1xuJiM0MztcdFx0XHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxuJiM0MztcdFx0XHQgIGZhbHNlKTtcbiBcbiBcdGlmICgqaG9sZV9wZm4gXHUwMDNjIHN0YXJ0X3BmbilcbiBcdFx0aW5pdF91bmF2YWlsYWJsZV9yYW5nZSgqaG9sZV9wZm4sIHN0YXJ0X3Bmbiwgem9uZV9pZCwgbmlkKTtcbkBAIC05NzMsOCAmIzQzOzk4NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdCh2b2lkKVxuIFxuIFx0Zm9yX2VhY2hfbWVtX3Bmbl9yYW5nZShpLCBNQVhfTlVNTk9ERVMsIFx1MDAyNnN0YXJ0X3BmbiwgXHUwMDI2ZW5kX3BmbiwgXHUwMDI2bmlkKSB7XG4gXHRcdHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZSA9IE5PREVfREFUQShuaWQpO1xuLVx0XHRlbnVtIG1pZ3JhdGV0eXBlIG10ID1cbi1cdFx0XHRraG9fc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIE1JR1JBVEVfTU9WQUJMRSk7XG4gXG4gXHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIE1BWF9OUl9aT05FUzsgaiYjNDM7JiM0MzspIHtcbiBcdFx0XHRzdHJ1Y3Qgem9uZSAqem9uZSA9IG5vZGUtXHUwMDNlbm9kZV96b25lcyAmIzQzOyBqO1xuQEAgLTk4Myw3ICYjNDM7OTkyLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0KHZvaWQpXG4gXHRcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0XHRtZW1tYXBfaW5pdF96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgZW5kX3Bmbixcbi1cdFx0XHRcdFx0ICAgICAgIFx1MDAyNmhvbGVfcGZuLCBtdCk7XG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2aG9sZV9wZm4pO1xuIFx0XHRcdHpvbmVfaWQgPSBqO1xuIFx0XHR9XG4gXHR9XG5AQCAtMTk3Myw3ICYjNDM7MTk4Miw3IEBAIHVuc2lnbmVkIGxvbmcgX19pbml0IG5vZGVfbWFwX3Bmbl9hbGlnbm1lbnQodm9pZClcbiBcbiAjaWZkZWYgQ09ORklHX0RFRkVSUkVEX1NUUlVDVF9QQUdFX0lOSVRcbiBzdGF0aWMgdm9pZCBfX2luaXQgZGVmZXJyZWRfZnJlZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcywgZW51bSBtaWdyYXRldHlwZSBtdClcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHR1bnNpZ25lZCBsb25nIGk7XG5AQCAtMTk4NSw4ICYjNDM7MTk5NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxuIFxuIFx0LyogRnJlZSBhIGxhcmdlIG5hdHVyYWxseS1hbGlnbmVkIGNodW5rIGlmIHBvc3NpYmxlICovXG4gXHRpZiAobnJfcGFnZXMgPT0gTUFYX09SREVSX05SX1BBR0VTIFx1MDAyNlx1MDAyNiBJU19NQVhfT1JERVJfQUxJR05FRChwZm4pKSB7XG4tXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpICYjNDM7PSBwYWdlYmxvY2tfbnJfcGFnZXMpXG4tXHRcdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGFnZSAmIzQzOyBpLCBtdCwgZmFsc2UpO1xuIFx0XHRfX2ZyZWVfcGFnZXNfY29yZShwYWdlLCBNQVhfUEFHRV9PUkRFUiwgTUVNSU5JVF9FQVJMWSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xOTk0LDExICYjNDM7MjAwMSw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxuIFx0LyogQWNjZXB0IGNodW5rcyBzbWFsbGVyIHRoYW4gTUFYX1BBR0VfT1JERVIgdXBmcm9udCAqL1xuIFx0YWNjZXB0X21lbW9yeShQRk5fUEhZUyhwZm4pLCBucl9wYWdlcyAqIFBBR0VfU0laRSk7XG4gXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzssIHBhZ2UmIzQzOyYjNDM7LCBwZm4mIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlYmxvY2tfYWxpZ25lZChwZm4pKVxuLVx0XHRcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIG10LCBmYWxzZSk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7LCBwYWdlJiM0MzsmIzQzOywgcGZuJiM0MzsmIzQzOylcbiBcdFx0X19mcmVlX3BhZ2VzX2NvcmUocGFnZSwgMCwgTUVNSU5JVF9FQVJMWSk7XG4tXHR9XG4gfVxuIFxuIC8qIENvbXBsZXRpb24gdHJhY2tpbmcgZm9yIGRlZmVycmVkX2luaXRfbWVtbWFwKCkgdGhyZWFkcyAqL1xuQEAgLTIwMTcsMTUgJiM0MzsyMDIxLDI5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGdkYXRfaW5pdF9yZXBvcnRfb25lX2RvbmUodm9pZClcbiAgKiBSZXR1cm4gbnVtYmVyIG9mIHBhZ2VzIGluaXRpYWxpemVkLlxuICAqL1xuIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkZWZlcnJlZF9pbml0X3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLFxuLVx0XHR1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiB7XG4gXHRpbnQgbmlkID0gem9uZV90b19uaWQoem9uZSk7XG4tXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX3BmbiAtIHBmbjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX3BmbiAtIHN0YXJ0X3BmbiwgcGZuID0gc3RhcnRfcGZuO1xuIFx0aW50IHppZCA9IHpvbmVfaWR4KHpvbmUpO1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pO1xuIFxuIFx0Zm9yICg7IHBmbiBcdTAwM2MgZW5kX3BmbjsgcGZuJiM0MzsmIzQzOywgcGFnZSYjNDM7JiM0MzspXG4gXHRcdF9faW5pdF9zaW5nbGVfcGFnZShwYWdlLCBwZm4sIHppZCwgbmlkKTtcbiYjNDM7XG4mIzQzO1x0LyogTm93IGluaXRpYWxpemUgbWlncmF0ZSB0eXBlcyBmb3IgdGhlc2UgcGFnZXMuICovXG4mIzQzO1x0cGZuID0gcGFnZWJsb2NrX2FsaWduKHN0YXJ0X3Bmbik7XG4mIzQzO1x0cGFnZSA9IHBmbl90b19wYWdlKHBmbik7XG4mIzQzO1x0Zm9yICg7IHBmbiBcdTAwM2MgZW5kX3BmbjsgcGZuICYjNDM7PSBwYWdlYmxvY2tfbnJfcGFnZXMsIHBhZ2UgJiM0Mzs9IHBhZ2VibG9ja19ucl9wYWdlcylcbiYjNDM7XHRcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIE1JR1JBVEVfTU9WQUJMRSwgZmFsc2UpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGZvciBhbnkgcGFnZWJsb2NrcyB0aGF0IGZhbGwgaW4gYSBLSE8gc2NyYXRjaFxuJiM0MztcdCAqIGFyZWEuIFNpbmNlIG1vc3QgcGFnZWJsb2NrcyB3aWxsIG5vdCBiZSBLSE8gc2NyYXRjaCwgZG8gaXQgb3V0c2lkZVxuJiM0MztcdCAqIHRoZSBsb29wIHRvIG9ubHkgZG8gdGhlIHNlYXJjaCBvbmNlLlxuJiM0MztcdCAqL1xuJiM0MztcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBlbmRfcGZuKTtcbiYjNDM7XG4gXHRyZXR1cm4gbnJfcGFnZXM7XG4gfVxuIFxuQEAgLTIwNTQsOCAmIzQzOzIwNzIsNiBAQCBkZWZlcnJlZF9pbml0X21lbW1hcF9jaHVuayh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuLFxuIFx0Zm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgbmlkLCAwLCBcdTAwMjZzdGFydCwgXHUwMDI2ZW5kLCBOVUxMKSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgc3BmbiA9IFBGTl9VUChzdGFydCk7XG4gXHRcdHVuc2lnbmVkIGxvbmcgZXBmbiA9IFBGTl9ET1dOKGVuZCk7XG4tXHRcdGVudW0gbWlncmF0ZXR5cGUgbXQgPVxuLVx0XHRcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHNwZm4sIE1JR1JBVEVfTU9WQUJMRSk7XG4gXG4gXHRcdGlmIChzcGZuIFx1MDAzZT0gZW5kX3BmbilcbiBcdFx0XHRicmVhaztcbkBAIC0yMDY4LDcgJiM0MzsyMDg0LDcgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcbiBcdFx0XHR1bnNpZ25lZCBsb25nIGNodW5rX2VuZCA9IG1pbihtb19wZm4sIGVwZm4pO1xuIFxuIFx0XHRcdG5yX3BhZ2VzICYjNDM7PSBkZWZlcnJlZF9pbml0X3BhZ2VzKHpvbmUsIHNwZm4sIGNodW5rX2VuZCk7XG4tXHRcdFx0ZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZuLCBjaHVua19lbmQgLSBzcGZuLCBtdCk7XG4mIzQzO1x0XHRcdGRlZmVycmVkX2ZyZWVfcGFnZXMoc3BmbiwgY2h1bmtfZW5kIC0gc3Bmbik7XG4gXG4gXHRcdFx0c3BmbiA9IGNodW5rX2VuZDtcbiBcbkBAIC0yNjg3LDYgJiM0MzsyNzAzLDcgQEAgdm9pZCBfX2luaXQgX193ZWFrIG1lbV9pbml0KHZvaWQpXG4gXG4gdm9pZCBfX2luaXQgbW1fY29yZV9pbml0X2Vhcmx5KHZvaWQpXG4ge1xuJiM0MztcdGtob19tZW1vcnlfaW5pdF9lYXJseSgpO1xuIFx0aHVnZXRsYl9jbWFfcmVzZXJ2ZSgpO1xuIFx0aHVnZXRsYl9ib290bWVtX2FsbG9jKCk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oIGIvdG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oXG5pbmRleCBiNmIxZDE0N2ZkNzUwZS4uZTg2YmI5MDAwYjIyZjggMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaFxuQEAgLTY2LDQgJiM0Mzs2Niw5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2RlZmVycmVkX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpXG4gXG4gI2RlZmluZSBfX1NldFBhZ2VSZXNlcnZlZChwKVx0KCh2b2lkKShwKSlcbiBcbiYjNDM7c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4gI2VuZGlmXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S0VYRUNfSEFORE9WRVImIzM0OywKICAgICYjMzQ7SFVHRVRMQl9QQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7a2hvX3JhZGl4X2FkZF9rZXkmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X2RlbF9rZXkmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X3dhbGtfdHJlZSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfaW5pdF90cmVlJiMzNDssCiAgICAmIzM0O2tob19yYWRpeF9kZXN0cm95X3RyZWUmIzM0OywKICAgICYjMzQ7a2hvX3NjcmF0Y2hfb3ZlcmxhcCYjMzQ7LAogICAgJiMzNDtraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlJiMzNDssCiAgICAmIzM0O21lbWJsb2NrX2FsbG9jX2h1Z2V0bGImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIEtleGVjIEhhbmRvdmVyIChLSE8pIHJhZGl4IHRyZWUgaW1wbGVtZW50YXRpb24sIGludHJvZHVjZXMgbmV3IGZ1bmN0aW9ucyBmb3IgS0hPIHNjcmF0Y2ggbWVtb3J5IG1hbmFnZW1lbnQsIGFuZCBjaGFuZ2VzIGhvdyBIdWdlVExCIHBhZ2VzIGFyZSBhbGxvY2F0ZWQgZHVyaW5nIGJvb3QgdXNpbmcgbWVtYmxvY2suIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHRoYXQgY2FuIGJlIHJlYWNoZWQgZHVyaW5nIGJvb3QgYW5kIHJ1bnRpbWUsIG1ha2luZyB0aGVtIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDE1YTg5NWIyN2Q3MDY5YjQzZTNiMTI4ZGY4NTdlYmNjZDNlMzgwOTIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEp1bCAxMCAxMzo0MToyNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaCBiL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaAppbmRleCA0OGE5NzkzYzJiNzZjZC4uMzBhNzE3MTA1NjVhMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgKQEAgLTMzLDkgJiM0MzszMywxMyBAQCB2b2lkIGtob19yZW1vdmVfc3VidHJlZSh2b2lkICpibG9iKTsKIGludCBraG9fcmV0cmlldmVfc3VidHJlZShjb25zdCBjaGFyICpuYW1lLCBwaHlzX2FkZHJfdCAqcGh5cywgc2l6ZV90ICpzaXplKTsKIAogdm9pZCBraG9fbWVtb3J5X2luaXQodm9pZCk7CiYjNDM7dm9pZCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZCk7CiAKIHZvaWQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbiwgcGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzLAogCQkgIHU2NCBzY3JhdGNoX2xlbik7CiYjNDM7CiYjNDM7Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTsKJiM0Mzt2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CiAjZWxzZQogc3RhdGljIGlubGluZSBib29sIGtob19pc19lbmFibGVkKHZvaWQpCiB7CkBAIC0xMDgsMTAgJiM0MzsxMTIsMjIgQEAgc3RhdGljIGlubGluZSBpbnQga2hvX3JldHJpZXZlX3N1YnRyZWUoY29uc3QgY2hhciAqbmFtZSwgcGh5c19hZGRyX3QgKnBoeXMsCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBraG9fbWVtb3J5X2luaXQodm9pZCkgeyB9CiAKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfQomIzQzOwogc3RhdGljIGlubGluZSB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sCiAJCQkJcGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzLCB1NjQgc2NyYXRjaF9sZW4pCiB7CiB9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CiYjNDM7ewomIzQzO30KICNlbmRpZiAvKiBDT05GSUdfS0VYRUNfSEFORE9WRVIgKi8KIAogI2VuZGlmIC8qIExJTlVYX0tFWEVDX0hBTkRPVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oIGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2tleGVjX2hhbmRvdmVyLmgKaW5kZXggNWUyZWI4NTE5YmRhNmQuLjJmNGZiOWM2Mzk0MjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaApAQCAtMjU3LDExICYjNDM7MjU3LDggQEAgc3RydWN0IGtob192bWFsbG9jIHsKICAqIG1lbW9yeS4gVGhlc2UgY29uc3RhbnRzIGdvdmVybiB0aGUgaW5kZXhpbmcsIHNpemluZywgYW5kIGRlcHRoIG9mIHRoZSB0cmVlLgogICovCiBlbnVtIGtob19yYWRpeF9jb25zdHMgewotCS8qCi0JICogVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgb3JkZXIgYml0IChhbmQgYWxzbyB0aGUgbGVuZ3RoIG9mIHRoZQotCSAqIHNoaWZ0ZWQgcGh5c2ljYWwgYWRkcmVzcykgZm9yIGFuIG9yZGVyLTAgcGFnZS4KLQkgKi8KLQlLSE9fT1JERVJfMF9MT0cyID0gNjQgLSBQQUdFX1NISUZULAomIzQzOwkvKiBOZWVkIHRvIHN0b3JlIHRoZSBQRk4sIHBsdXMgb25lIGJpdCBmb3Igb3JkZXIuICovCiYjNDM7CUtIT19SQURJWF9LRVlfV0lEVEggPSA2NCAtIFBBR0VfU0hJRlQgJiM0MzsgMSwKIAogCS8qIFNpemUgb2YgdGhlIHRhYmxlIGluIGtob19yYWRpeF9ub2RlLCBpbiBsb2cyICovCiAJS0hPX1RBQkxFX1NJWkVfTE9HMiA9IGNvbnN0X2lsb2cyKFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCkpLApAQCAtMjc0LDcgJiM0MzsyNzEsNyBAQCBlbnVtIGtob19yYWRpeF9jb25zdHMgewogCSAqIGFuZCAxIGJpdG1hcCBsZXZlbC4KIAkgKi8KIAlLSE9fVFJFRV9NQVhfREVQVEggPQotCQlESVZfUk9VTkRfVVAoS0hPX09SREVSXzBfTE9HMiAtIEtIT19CSVRNQVBfU0laRV9MT0cyICYjNDM7IDEsCiYjNDM7CQlESVZfUk9VTkRfVVAoS0hPX1JBRElYX0tFWV9XSURUSCAtIEtIT19CSVRNQVBfU0laRV9MT0cyLAogCQkJICAgICBLSE9fVEFCTEVfU0laRV9MT0cyKSAmIzQzOyAxLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oIGIvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oCmluZGV4IDg0ZTkxOGI5NmU1M2RmLi41ZDZhZTI4OTM2ODRhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaApAQCAtMzQsMzcgJiM0MzszNCw1MyBAQCBzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgewogCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0cyB0aGUgdHJlZSYjMzk7cyBzdHJ1Y3R1cmUgYW5kIHJvb3QgcG9pbnRlciAqLwogfTsKIAotdHlwZWRlZiBpbnQgKCpraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QpKHBoeXNfYWRkcl90IHBoeXMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBvcmRlcik7CiYjNDM7LyoqCiYjNDM7ICogc3RydWN0IGtob19yYWRpeF93YWxrX2NiIC0gQ2FsbGJhY2tzIGZvciBLSE8gcmFkaXggdHJlZSB3YWxrLgomIzQzOyAqIEBsZWFmOiAgICAgIENhbGxlZCBvbiBlYWNoIHByZXNlbnQga2V5IGluIHRoZSByYWRpeCB0cmVlLgomIzQzOyAqIEBub2RlOiAgICAgIENhbGxlZCBvbiBlYWNoIG5vZGUgb2YgdGhlIHJhZGl4IHRyZWUgaXRzZWxmLiBSZWNlaXZlcyB0aGUKJiM0MzsgKiAgICAgICAgICAgICBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG5vZGUuCiYjNDM7ICoKJiM0MzsgKiBGb3IgZWFjaCBjYWxsYmFjaywgYSByZXR1cm4gdmFsdWUgb2YgMCBjb250aW51ZXMgdGhlIHdhbGsgYW5kIGEgbm9uLXplcm8KJiM0MzsgKiByZXR1cm4gdmFsdWUgaXMgZGlyZWN0bHkgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KJiM0MzsgKi8KJiM0MztzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgewomIzQzOwlpbnQgKCpsZWFmKSh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSk7CiYjNDM7CWludCAoKm5vZGUpKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpOwomIzQzO307CiAKICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVIKIAotaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLAotCQkgICAgICAgdW5zaWduZWQgaW50IG9yZGVyKTsKLQotdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbiwKLQkJCXVuc2lnbmVkIGludCBvcmRlcik7Ci0KJiM0MztpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7CiYjNDM7dm9pZCBraG9fcmFkaXhfZGVsX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KTsKIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwKLQkJCWtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCBjYik7CiYjNDM7CQkJY29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSk7CiYjNDM7aW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpOwomIzQzO3ZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpOwogCiAjZWxzZSAgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqLwogCi1zdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBsb25nIHBmbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvcmRlcikKJiM0MztzdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KQogewogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGludCBvcmRlcikgeyB9CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIGtleSkgeyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLAotCQkJCSAgICAgIGtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCBjYikKJiM0MzsJCQkJICAgICAgY29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSkKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwKJiM0MzsJCQkJICAgICAgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KQomIzQzO3sKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSkgeyB9CiYjNDM7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqLwogCiAjZW5kaWYJLyogX0xJTlVYX0tIT19SQURJWF9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAppbmRleCA1YWZjZDk5YWE4YzE0NC4uZDYyZGI5ZTc3NmNmOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmgKQEAgLTUxLDYgJiM0Mzs1MSw3IEBAIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbWF4X3Bvc3NpYmxlX3BmbjsKICAqIG1lbW9yeSByZXNlcnZhdGlvbnMgeWV0LCBzbyB3ZSBnZXQgc2NyYXRjaCBtZW1vcnkgZnJvbSB0aGUgcHJldmlvdXMKICAqIGtlcm5lbCB0aGF0IHdlIGtub3cgaXMgZ29vZCB0byB1c2UuIEl0IGlzIHRoZSBvbmx5IG1lbW9yeSB0aGF0CiAgKiBhbGxvY2F0aW9ucyBtYXkgaGFwcGVuIGZyb20gaW4gdGhpcyBwaGFzZS4KJiM0MzsgKiBATUVNQkxPQ0tfUlNSVl9IVUdFVExCOiBtZW1vcnkgaXMgcmVzZXJ2ZWQgZm9yIGh1Z2V0bGIgcGFnZXMKICAqLwogZW51bSBtZW1ibG9ja19mbGFncyB7CiAJTUVNQkxPQ0tfTk9ORQkJPSAweDAsCS8qIE5vIHNwZWNpYWwgcmVxdWVzdCAqLwpAQCAtNjEsNiAmIzQzOzYyLDcgQEAgZW51bSBtZW1ibG9ja19mbGFncyB7CiAJTUVNQkxPQ0tfUlNSVl9OT0lOSVQJPSAweDEwLAkvKiBkb24mIzM5O3QgaW5pdGlhbGl6ZSBzdHJ1Y3QgcGFnZXMgKi8KIAlNRU1CTE9DS19SU1JWX0tFUk4JPSAweDIwLAkvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGtlcm5lbCB1c2UgKi8KIAlNRU1CTE9DS19LSE9fU0NSQVRDSAk9IDB4NDAsCS8qIHNjcmF0Y2ggbWVtb3J5IGZvciBrZXhlYyBoYW5kb3ZlciAqLwomIzQzOwlNRU1CTE9DS19SU1JWX0hVR0VUTEIJPSAweDgwLCAvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGh1Z2V0bGIgcGFnZXMgKi8KIH07CiAKIC8qKgpAQCAtNDIwLDYgJiM0Mzs0MjIsNyBAQCB2b2lkICptZW1ibG9ja19hbGxvY190cnlfbmlkX3JhdyhwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbiwKIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sCiAJCQkgICAgIHBoeXNfYWRkcl90IG1pbl9hZGRyLCBwaHlzX2FkZHJfdCBtYXhfYWRkciwKIAkJCSAgICAgaW50IG5pZCk7CiYjNDM7dm9pZCAqbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZCk7CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqbWVtYmxvY2tfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24pCiB7CkBAIC00ODQsNiAmIzQzOzQ4Nyw3IEBAIHN0YXRpYyBpbmxpbmUgX19pbml0X21lbWJsb2NrIGJvb2wgbWVtYmxvY2tfYm90dG9tX3VwKHZvaWQpCiBwaHlzX2FkZHJfdCBtZW1ibG9ja19waHlzX21lbV9zaXplKHZvaWQpOwogcGh5c19hZGRyX3QgbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh2b2lkKTsKIHBoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCk7CiYjNDM7cGh5c19hZGRyX3QgbWVtYmxvY2tfcmVzZXJ2ZWRfaHVnZXRsYl9zaXplKHBoeXNfYWRkcl90IGxpbWl0LCBpbnQgbmlkKTsKIHVuc2lnbmVkIGxvbmcgbWVtYmxvY2tfZXN0aW1hdGVkX25yX2ZyZWVfcGFnZXModm9pZCk7CiBwaHlzX2FkZHJfdCBtZW1ibG9ja19zdGFydF9vZl9EUkFNKHZvaWQpOwogcGh5c19hZGRyX3QgbWVtYmxvY2tfZW5kX29mX0RSQU0odm9pZCk7CkBAIC02MTMsMjggJiM0Mzs2MTcsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgbWVtdGVzdF9yZXBvcnRfbWVtaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pIHsgfQogI2lmZGVmIENPTkZJR19NRU1CTE9DS19LSE9fU0NSQVRDSAogdm9pZCBtZW1ibG9ja19zZXRfa2hvX3NjcmF0Y2hfb25seSh2b2lkKTsKIHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKTsKLWJvb2wgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpOwotCi1zdGF0aWMgaW5saW5lIGVudW0gbWlncmF0ZXR5cGUga2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJCQkgICAgICAgZW51bSBtaWdyYXRldHlwZSBtdCkKLXsKLQlpZiAobWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KFBGTl9QSFlTKHBmbikpKQotCQlyZXR1cm4gTUlHUkFURV9DTUE7Ci0JcmV0dXJuIG10OwotfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19zZXRfa2hvX3NjcmF0Y2hfb25seSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBib29sIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShwaHlzX2FkZHJfdCBhZGRyKQotewotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBlbnVtIG1pZ3JhdGV0eXBlIGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgcGZuLAotCQkJCQkJICAgICAgIGVudW0gbWlncmF0ZXR5cGUgbXQpCi17Ci0JcmV0dXJuIG10OwotfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfTElOVVhfTUVNQkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUvTWFrZWZpbGUgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZQppbmRleCBlZWM5ZDNhZTA3ZWI0Yi4uZDlmNDY5NDYyNTU2NzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlCkBAIC04LDcgJiM0Mzs4LDYgQEAgbHVvLXkgOj0JCQkJCQkJCVwKIAkJbHVvX3Nlc3Npb24ubwogCiBvYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVIpCQkmIzQzOz0ga2V4ZWNfaGFuZG92ZXIubwotb2JqLSQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKQkmIzQzOz0ga2V4ZWNfaGFuZG92ZXJfZGVidWcubwogb2JqLSQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHRlMpCSYjNDM7PSBrZXhlY19oYW5kb3Zlcl9kZWJ1Z2ZzLm8KIAogb2JqLSQoQ09ORklHX0xJVkVVUERBVEUpCQkmIzQzOz0gbHVvLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jCmluZGV4IDQ4MzRhODA5OTg1YWI3Li45ZGM3OWI3MTAzYmRiZiAxMDA2NDQKLS0tIGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jCkBAIC04NCw4ICYjNDM7ODQsMjUgQEAgc3RhdGljIHN0cnVjdCBraG9fb3V0IGtob19vdXQgPSB7CiAJfSwKIH07CiAKJiM0MztzdHJ1Y3Qga2hvX2luIHsKJiM0MzsJcGh5c19hZGRyX3QgZmR0X3BoeXM7CiYjNDM7CXBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5czsKJiM0MzsJY2hhciBwcmV2aW91c19yZWxlYXNlW19fTkVXX1VUU19MRU4gJiM0MzsgMV07CiYjNDM7CXUzMiBrZXhlY19jb3VudDsKJiM0MzsJc3RydWN0IGtob19kZWJ1Z2ZzIGRiZzsKJiM0MzsJc3RydWN0IGtob19yYWRpeF90cmVlIHJhZGl4X3RyZWU7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGtob19pbiBraG9faW4gPSB7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgdm9pZCAqa2hvX2dldF9mZHQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBraG9faW4uZmR0X3BoeXMgPyBwaHlzX3RvX3ZpcnQoa2hvX2luLmZkdF9waHlzKSA6IE5VTEw7CiYjNDM7fQomIzQzOwogLyoqCi0gKiBraG9fcmFkaXhfZW5jb2RlX2tleSAtIEVuY29kZXMgYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBpbnRvIGEgcmFkaXgga2V5LgomIzQzOyAqIGtob19lbmNvZGVfcmFkaXhfa2V5IC0gRW5jb2RlcyBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyIGludG8gYSByYWRpeCBrZXkuCiAgKiBAcGh5czogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHBhZ2UuCiAgKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS4KICAqCkBAIC05NSwzNSAmIzQzOzExMiwzOCBAQCBzdGF0aWMgc3RydWN0IGtob19vdXQga2hvX291dCA9IHsKICAqCiAgKiBSZXR1cm46IFRoZSBlbmNvZGVkIHVuc2lnbmVkIGxvbmcgcmFkaXgga2V5LgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBraG9fcmFkaXhfZW5jb2RlX2tleShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBpbnQgb3JkZXIpCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX2VuY29kZV9yYWRpeF9rZXkocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgaW50IG9yZGVyKQogewotCS8qIE9yZGVyIGJpdHMgcGFydCAqLwotCXVuc2lnbmVkIGxvbmcgaCA9IDFVTCAmbHQ7Jmx0OyAoS0hPX09SREVSXzBfTE9HMiAtIG9yZGVyKTsKLQkvKiBTaGlmdGVkIHBoeXNpY2FsIGFkZHJlc3MgcGFydCAqLwotCXVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgJmd0OyZndDsgKFBBR0VfU0hJRlQgJiM0Mzsgb3JkZXIpOwomIzQzOwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBpcyBlbmNvZGVkIGJ5IHNoaWZ0aW5nIHRoZSBQRk4gYnkgaXRzIG9yZGVyLiAqLwomIzQzOwl1bnNpZ25lZCBsb25nIHNoaWZ0ID0gUEFHRV9TSElGVCAmIzQzOyBvcmRlcjsKJiM0MzsJLyogT3JkZXIgYml0IGdvZXMgcmlnaHQgYmVmb3JlIHRoZSBzaGlmdGVkIFBGTi4gKi8KJiM0MzsJdW5zaWduZWQgbG9uZyBoID0gMVVMICZsdDsmbHQ7ICg2NCAtIHNoaWZ0KTsKJiM0MzsJLyogU2hpZnRlZCBQRk4uICovCiYjNDM7CXVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgJmd0OyZndDsgc2hpZnQ7CiAKIAlyZXR1cm4gaCB8IGw7CiB9CiAKIC8qKgotICoga2hvX3JhZGl4X2RlY29kZV9rZXkgLSBEZWNvZGVzIGEgcmFkaXgga2V5IGJhY2sgaW50byBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyLgomIzQzOyAqIGtob19kZWNvZGVfcmFkaXhfa2V5IC0gRGVjb2RlcyBhIHJhZGl4IGtleSBiYWNrIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlci4KICAqIEBrZXk6IFRoZSB1bnNpZ25lZCBsb25nIGtleSB0byBkZWNvZGUuCiAgKiBAb3JkZXI6IEFuIG91dHB1dCBwYXJhbWV0ZXIsIGEgcG9pbnRlciB0byBhbiB1bnNpZ25lZCBpbnQgd2hlcmUgdGhlIGRlY29kZWQKICAqICAgICAgICAgcGFnZSBvcmRlciB3aWxsIGJlIHN0b3JlZC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBlbmNvZGluZyBwZXJmb3JtZWQgYnkga2hvX3JhZGl4X2VuY29kZV9rZXkoKSwKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBlbmNvZGluZyBwZXJmb3JtZWQgYnkga2hvX2VuY29kZV9yYWRpeF9rZXkoKSwKICAqIGV4dHJhY3RpbmcgdGhlIG9yaWdpbmFsIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHBhZ2Ugb3JkZXIgZnJvbSBhIGdpdmVuIGtleS4KICAqCiAgKiBSZXR1cm46IFRoZSBkZWNvZGVkIHBoeXNpY2FsIGFkZHJlc3MuCiAgKi8KLXN0YXRpYyBwaHlzX2FkZHJfdCBraG9fcmFkaXhfZGVjb2RlX2tleSh1bnNpZ25lZCBsb25nIGtleSwgdW5zaWduZWQgaW50ICpvcmRlcikKJiM0MztzdGF0aWMgcGh5c19hZGRyX3Qga2hvX2RlY29kZV9yYWRpeF9rZXkodW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGludCAqb3JkZXIpCiB7Ci0JdW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSk7CiYjNDM7CS8qIGZsczY0KCkgaW5kZXhlcyBzdGFydGluZyBmcm9tIDEuICovCiYjNDM7CXVuc2lnbmVkIGludCBvcmRlcl9iaXQgPSBmbHM2NChrZXkpIC0gMTsKIAlwaHlzX2FkZHJfdCBwaHlzOwogCi0JLyogb3JkZXJfYml0IGlzIG51bWJlcmVkIHN0YXJ0aW5nIGF0IDEgZnJvbSBmbHM2NCAqLwotCSpvcmRlciA9IEtIT19PUkRFUl8wX0xPRzIgLSBvcmRlcl9iaXQgJiM0MzsgMTsKLQkvKiBUaGUgb3JkZXIgaXMgZGlzY2FyZGVkIGJ5IHRoZSBzaGlmdCAqLwomIzQzOwkvKiBvcmRlciBiaXQgZ29lcyByaWdodCBiZWZvcmUgdGhlIHNoaWZ0ZWQgUEZOLiAqLwomIzQzOwkqb3JkZXIgPSA2NCAtIChQQUdFX1NISUZUICYjNDM7IG9yZGVyX2JpdCk7CiYjNDM7CS8qIFRoZSBvcmRlciBiaXQgaXMgZGlzY2FyZGVkIGJ5IHRoZSBzaGlmdCAqLwogCXBoeXMgPSBrZXkgJmx0OyZsdDsgKFBBR0VfU0hJRlQgJiM0MzsgKm9yZGVyKTsKIAogCXJldHVybiBwaHlzOwpAQCAtMTQzLDI1ICYjNDM7MTYzLDQ3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGtob19yYWRpeF9nZXRfdGFibGVfaW5kZXgodW5zaWduZWQgbG9uZyBrZXksCiAJcmV0dXJuIChrZXkgJmd0OyZndDsgcykgJSAoMSAmbHQ7Jmx0OyBLSE9fVEFCTEVfU0laRV9MT0cyKTsKIH0KIAomIzQzO3N0YXRpYyB2b2lkIF9fcmVmICpraG9fcmFkaXhfYWxsb2Nfbm9kZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlOwomIzQzOwomIzQzOwlpZiAoc2xhYl9pc19hdmFpbGFibGUoKSkKJiM0MzsJCW5vZGUgPSAoc3RydWN0IGtob19yYWRpeF9ub2RlICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwomIzQzOwllbHNlCiYjNDM7CQlub2RlID0gbWVtYmxvY2tfYWxsb2MoUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwomIzQzOwomIzQzOwlyZXR1cm4gbm9kZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgX19yZWYga2hvX3JhZGl4X2ZyZWVfbm9kZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGUpCiYjNDM7ewomIzQzOwlpZiAoc2xhYl9pc19hdmFpbGFibGUoKSkKJiM0MzsJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylub2RlKTsKJiM0MzsJZWxzZQomIzQzOwkJbWVtYmxvY2tfZnJlZShub2RlLCBQQUdFX1NJWkUpOwomIzQzO30KJiM0MzsKIC8qKgotICoga2hvX3JhZGl4X2FkZF9wYWdlIC0gTWFya3MgYSBwYWdlIGFzIHByZXNlcnZlZCBpbiB0aGUgcmFkaXggdHJlZS4KJiM0MzsgKiBraG9fcmFkaXhfYWRkX2tleSAtIEFkZCBhIGtleSB0byB0aGUgcmFkaXggdHJlZS4KICAqIEB0cmVlOiBUaGUgS0hPIHJhZGl4IHRyZWUuCi0gKiBAcGZuOiBUaGUgcGFnZSBmcmFtZSBudW1iZXIgb2YgdGhlIHBhZ2UgdG8gcHJlc2VydmUuCi0gKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS4KJiM0MzsgKiBAa2V5OiBUaGUga2V5IHRvIGFkZC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBiYXNlZCBvbiB0aGUga2V5IGRlcml2ZWQgZnJvbSBAcGZuCi0gKiBhbmQgQG9yZGVyLiBJdCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGUKLSAqIHBhZ2UgZm9yIHByZXNlcnZhdGlvbi4gSWYgaW50ZXJtZWRpYXRlIG5vZGVzIGRvIG5vdCBleGlzdCBhbG9uZyB0aGUgcGF0aCwKLSAqIHRoZXkgYXJlIGFsbG9jYXRlZCBhbmQgYWRkZWQgdG8gdGhlIHRyZWUuCiYjNDM7ICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYmFzZWQgb24gdGhlIEBrZXkgcHJvdmlkZWQuIEl0IHNldHMgdGhlCiYjNDM7ICogY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGxlYWYgYml0bWFwIHRvIG1hcmsgdGhlIEBrZXkgYXMgcHJlc2VudC4gSWYKJiM0MzsgKiBpbnRlcm1lZGlhdGUgbm9kZXMgZG8gbm90IGV4aXN0IGFsb25nIHRoZSBwYXRoLCB0aGV5IGFyZSBhbGxvY2F0ZWQgYW5kIGFkZGVkCiYjNDM7ICogdG8gdGhlIHRyZWUuCiYjNDM7ICoKJiM0MzsgKiBOT1RFOiBDdXJyZW50bHkgb25seSBrZXlzIG9mIHdpZHRoIHVwIHRvICVLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBzdXBwb3J0ZWQuCiYjNDM7ICogVGhpcyBsaW1pdCBvbmx5IGV4aXN0cyBiZWNhdXNlIGN1cnJlbnQgdXNlcnMgb2YgdGhlIHJhZGl4IHRyZWUgZG9uJiMzOTt0IHVzZSBtb3JlCiYjNDM7ICogdGhhbiB0aGF0LiBDaGFuZ2luZyB0aGUgbWF4aW11bSB3aWR0aCByZXF1aXJlcyBjaGFuZ2luZyB0aGUgdHJlZSBkZXB0aCwgd2hpY2gKJiM0MzsgKiBuZWVkcyBidW1waW5nIHRoZSBBQkkgdmVyc2lvbi4KICAqCiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLWludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGludCBvcmRlcikKJiM0MztpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSkKIHsKIAkvKiBOZXdseSBhbGxvY2F0ZWQgbm9kZXMgZm9yIGVycm9yIGNsZWFudXAgKi8KIAlzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKmludGVybWVkaWF0ZV9ub2Rlc1tLSE9fVFJFRV9NQVhfREVQVEhdID0geyAwIH07Ci0JdW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7CiAJc3RydWN0IGtob19yYWRpeF9ub2RlICphbmNob3Jfbm9kZSA9IE5VTEw7CiAJc3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlID0gdHJlZS0mZ3Q7cm9vdDsKIAlzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5ld19ub2RlOwpAQCAtMTcyLDYgJiM0MzsyMTQsOSBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwKIAlpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLSZndDtyb290KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKJiM0MzsJaWYgKHVubGlrZWx5KGZsczY0KGtleSkgJmd0OyBLSE9fUkFESVhfS0VZX1dJRFRIKSkKJiM0MzsJCXJldHVybiAtRVJBTkdFOwomIzQzOwogCW1pZ2h0X3NsZWVwKCk7CiAKIAlndWFyZChtdXRleCkoJmFtcDt0cmVlLSZndDtsb2NrKTsKQEAgLTE4Niw3ICYjNDM7MjMxLDcgQEAgaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsCiAJCX0KIAogCQkvKiBOZXh0IG5vZGUgaXMgZW1wdHksIGNyZWF0ZSBhIG5ldyBub2RlIGZvciBpdCAqLwotCQluZXdfbm9kZSA9IChzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiYjNDM7CQluZXdfbm9kZSA9IGtob19yYWRpeF9hbGxvY19ub2RlKCk7CiAJCWlmICghbmV3X25vZGUpIHsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9mcmVlX25vZGVzOwpAQCAtMjE3LDI5ICYjNDM7MjYyLDI2IEBAIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLAogZXJyX2ZyZWVfbm9kZXM6CiAJZm9yIChpID0gS0hPX1RSRUVfTUFYX0RFUFRIIC0gMTsgaSAmZ3Q7IDA7IGktLSkgewogCQlpZiAoaW50ZXJtZWRpYXRlX25vZGVzW2ldKQotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWludGVybWVkaWF0ZV9ub2Rlc1tpXSk7CiYjNDM7CQkJa2hvX3JhZGl4X2ZyZWVfbm9kZShpbnRlcm1lZGlhdGVfbm9kZXNbaV0pOwogCX0KIAlpZiAoYW5jaG9yX25vZGUpCiAJCWFuY2hvcl9ub2RlLSZndDt0YWJsZVthbmNob3JfaWR4XSA9IDA7CiAKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X2FkZF9wYWdlKTsKJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7CiAKIC8qKgotICoga2hvX3JhZGl4X2RlbF9wYWdlIC0gUmVtb3ZlcyBhIHBhZ2UmIzM5O3MgcHJlc2VydmF0aW9uIHN0YXR1cyBmcm9tIHRoZSByYWRpeCB0cmVlLgomIzQzOyAqIGtob19yYWRpeF9kZWxfa2V5IC0gUmVtb3ZlcyB0aGUga2V5IGZyb20gdGhlIHJhZGl4IHRyZWUuCiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLgotICogQHBmbjogVGhlIHBhZ2UgZnJhbWUgbnVtYmVyIG9mIHRoZSBwYWdlIHRvIHVucHJlc2VydmUuCi0gKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS4KJiM0MzsgKiBAa2V5OiBUaGUga2V5IHRvIHJlbW92ZS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBhbmQgY2xlYXJzIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0bwotICogdGhlIHBhZ2UsIGVmZmVjdGl2ZWx5IHJlbW92aW5nIGl0cyAmIzM0O3ByZXNlcnZlZCYjMzQ7IHN0YXR1cy4gSXQgZG9lcyBub3QgZnJlZQotICogdGhlIHRyZWUmIzM5O3MgaW50ZXJtZWRpYXRlIG5vZGVzLCBldmVuIGlmIHRoZXkgYmVjb21lIGVtcHR5LgomIzQzOyAqIHRoZSBAa2V5LCBlZmZlY3RpdmVseSByZW1vdmluZyBpdCBmcm9tIHRoZSB0cmVlLiBJdCBkb2VzIG5vdCBmcmVlIHRoZSB0cmVlJiMzOTtzCiYjNDM7ICogaW50ZXJtZWRpYXRlIG5vZGVzLCBldmVuIGlmIHRoZXkgYmVjb21lIGVtcHR5LgogICovCi12b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLAotCQkJdW5zaWduZWQgaW50IG9yZGVyKQomIzQzO3ZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSkKIHsKLQl1bnNpZ25lZCBsb25nIGtleSA9IGtob19yYWRpeF9lbmNvZGVfa2V5KFBGTl9QSFlTKHBmbiksIG9yZGVyKTsKIAlzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGUgPSB0cmVlLSZndDtyb290OwogCXN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZjsKIAl1bnNpZ25lZCBpbnQgaSwgaWR4OwpAQCAtMjQ3LDYgJiM0MzsyODksMTAgQEAgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbiwKIAlpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLSZndDtyb290KSkKIAkJcmV0dXJuOwogCiYjNDM7CS8qIEtleXMgd2lkZXIgdGhhbiBLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBub3QgYWxsb3dlZCB0byBiZSBhZGRlZC4gKi8KJiM0MzsJaWYgKHVubGlrZWx5KGZsczY0KGtleSkgJmd0OyBLSE9fUkFESVhfS0VZX1dJRFRIKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKIAltaWdodF9zbGVlcCgpOwogCiAJZ3VhcmQobXV0ZXgpKCZhbXA7dHJlZS0mZ3Q7bG9jayk7CkBAIC0yNzAsMjEgJiM0MzszMTYsODUgQEAgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbiwKIAlpZHggPSBraG9fcmFkaXhfZ2V0X2JpdG1hcF9pbmRleChrZXkpOwogCV9fY2xlYXJfYml0KGlkeCwgbGVhZi0mZ3Q7Yml0bWFwKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZWxfcGFnZSk7CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X2RlbF9rZXkpOwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIF9fa2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgaW50IGxldmVsKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlpZiAobGV2ZWwgPT0gMCkgewomIzQzOwkJa2hvX3JhZGl4X2ZyZWVfbm9kZShyb290KTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgUEFHRV9TSVpFIC8gc2l6ZW9mKHBoeXNfYWRkcl90KTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChyb290LSZndDt0YWJsZVtpXSkKJiM0MzsJCQlfX2tob19yYWRpeF9kZXN0cm95X3RyZWUocGh5c190b192aXJ0KHJvb3QtJmd0O3RhYmxlW2ldKSwKJiM0MzsJCQkJCQkgbGV2ZWwgLSAxKTsKJiM0MzsJfQomIzQzOwomIzQzOwlraG9fcmFkaXhfZnJlZV9ub2RlKHJvb3QpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBraG9fcmFkaXhfaW5pdF90cmVlIC0gaW5pdGlhbGl6ZSB0aGUgcmFkaXggdHJlZS4KJiM0MzsgKiBAdHJlZTogICB0aGUgdHJlZSB0byBpbml0aWFsaXplLgomIzQzOyAqIEByb290OiAgIHJvb3QgdGFibGUgb2YgdGhlIHJhZGl4IHRyZWUuCiYjNDM7ICoKJiM0MzsgKiBJbml0aWFsaXplIHRoZSByYWRpeCB0cmVlIHdpdGggdGhlIGdpdmVuIHJvb3Qgbm9kZS4gSWYgcm9vdCBpcyAlTlVMTCwgYW4KJiM0MzsgKiBlbXB0eSByb290IHRhYmxlIGlzIGFsbG9jYXRlZC4gSWYgcm9vdCBpcyBub3QgJU5VTEwsIGl0IGlzIHRoZSBjYWxsZXImIzM5O3MKJiM0MzsgKiByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIHJvb3QgaXMgdmFsaWQgYW5kIGluIHRoZSBjb3JyZWN0IGZvcm1hdC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztpbnQga2hvX3JhZGl4X2luaXRfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCkKJiM0Mzt7CiYjNDM7CWlmICghcm9vdCkKJiM0MzsJCXJvb3QgPSBraG9fcmFkaXhfYWxsb2Nfbm9kZSgpOwomIzQzOwlpZiAoIXJvb3QpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJdHJlZS0mZ3Q7cm9vdCA9IHJvb3Q7CiYjNDM7CW11dGV4X2luaXQoJmFtcDt0cmVlLSZndDtsb2NrKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGtob19yYWRpeF9kZXN0cm95X3RyZWUgLSBEZXN0cm95IHRoZSByYWRpeCB0cmVlCiYjNDM7ICogQHRyZWU6IFRoZSByYWRpeCB0cmVlIHRvIGRlc3Ryb3kKJiM0MzsgKgomIzQzOyAqIFdhbGsgQHRyZWUgYW5kIGZyZWUgYWxsIGl0cyBub2Rlcy4KJiM0MzsgKi8KJiM0Mzt2b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKQomIzQzO3sKJiM0MzsJaWYgKCF0cmVlLSZndDtyb290KQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlfX2tob19yYWRpeF9kZXN0cm95X3RyZWUodHJlZS0mZ3Q7cm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSk7CiYjNDM7CXRyZWUtJmd0O3Jvb3QgPSBOVUxMOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfZGVzdHJveV90cmVlKTsKIAotc3RhdGljIGludCBraG9fcmFkaXhfd2Fsa19sZWFmKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGtleSwKLQkJCSAgICAgICBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpCiYjNDM7c3RhdGljIGludCBraG9fcmFkaXhfd2Fsa19sZWFmKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZiwgdW5zaWduZWQgbG9uZyBrZXksCiYjNDM7CQkJICAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilsZWFmOwotCXVuc2lnbmVkIGludCBvcmRlcjsKLQlwaHlzX2FkZHJfdCBwaHlzOwogCXVuc2lnbmVkIGludCBpOwogCWludCBlcnI7CiAKJiM0MzsJaWYgKGNiLSZndDtub2RlKSB7CiYjNDM7CQllcnIgPSBjYi0mZ3Q7bm9kZSh2aXJ0X3RvX3BoeXMobGVhZiksIGRhdGEpOwomIzQzOwkJaWYgKGVycikKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghY2ItJmd0O2xlYWYpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAlmb3JfZWFjaF9zZXRfYml0KGksIGJpdG1hcCwgUEFHRV9TSVpFICogQklUU19QRVJfQllURSkgewotCQlwaHlzID0ga2hvX3JhZGl4X2RlY29kZV9rZXkoa2V5IHwgaSwgJmFtcDtvcmRlcik7Ci0JCWVyciA9IGNiKHBoeXMsIG9yZGVyKTsKJiM0MzsJCWVyciA9IGNiLSZndDtsZWFmKGtleSB8IGksIGRhdGEpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0yOTQsNyAmIzQzOzQwNCw3IEBAIHN0YXRpYyBpbnQga2hvX3JhZGl4X3dhbGtfbGVhZihzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWYsCiAKIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCwKIAkJCQkgdW5zaWduZWQgaW50IGxldmVsLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJCSBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpCiYjNDM7CQkJCSBjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgKmNiLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZTsKIAlzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWY7CkBAIC0zMDIsNiAmIzQzOzQxMiwxMiBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsCiAJdW5zaWduZWQgaW50IHNoaWZ0OwogCWludCBlcnI7CiAKJiM0MzsJaWYgKGNiLSZndDtub2RlKSB7CiYjNDM7CQllcnIgPSBjYi0mZ3Q7bm9kZSh2aXJ0X3RvX3BoeXMocm9vdCksIGRhdGEpOwomIzQzOwkJaWYgKGVycikKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiAJZm9yIChpID0gMDsgaSAmbHQ7IFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCk7IGkmIzQzOyYjNDM7KSB7CiAJCWlmICghcm9vdC0mZ3Q7dGFibGVbaV0pCiAJCQljb250aW51ZTsKQEAgLTMxOCwxMCAmIzQzOzQzNCwxMCBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsCiAJCQkgKiBub2RlIGlzIHBvaW50aW5nIHRvIHRoZSBsZXZlbCAwIGJpdG1hcC4KIAkJCSAqLwogCQkJbGVhZiA9IChzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKilub2RlOwotCQkJZXJyID0ga2hvX3JhZGl4X3dhbGtfbGVhZihsZWFmLCBrZXksIGNiKTsKJiM0MzsJCQllcnIgPSBraG9fcmFkaXhfd2Fsa19sZWFmKGxlYWYsIGtleSwgY2IsIGRhdGEpOwogCQl9IGVsc2UgewogCQkJZXJyICA9IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShub2RlLCBsZXZlbCAtIDEsCi0JCQkJCQkgICAgIGtleSwgY2IpOwomIzQzOwkJCQkJCSAgICAga2V5LCBjYiwgZGF0YSk7CiAJCX0KIAogCQlpZiAoZXJyKQpAQCAtMzMyLDI4ICYjNDM7NDQ4LDI3IEBAIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCwKIH0KIAogLyoqCi0gKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIHByZXNlcnZlZCBwYWdlLgomIzQzOyAqIGtob19yYWRpeF93YWxrX3RyZWUgLSBUcmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNhbGxzIGEgY2FsbGJhY2sgZm9yIGVhY2gga2V5LgogICogQHRyZWU6IEEgcG9pbnRlciB0byB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gd2Fsay4KLSAqIEBjYjogQSBjYWxsYmFjayBmdW5jdGlvbiBvZiB0eXBlIGtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCB0aGF0IHdpbGwgYmUKLSAqICAgICAgaW52b2tlZCBmb3IgZWFjaCBwcmVzZXJ2ZWQgcGFnZSBmb3VuZCBpbiB0aGUgdHJlZS4gVGhlIGNhbGxiYWNrIHJlY2VpdmVzCi0gKiAgICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBvZiB0aGUgcHJlc2VydmVkIHBhZ2UuCiYjNDM7ICogQGNiOiAgIFNldCBvZiBjYWxsYmFja3MgdG8gYmUgaW52b2tlZCBkdXJpbmcgdGhlIHRyZWUgd2Fsay4KJiM0MzsgKiBAZGF0YTogT3BhcXVlIGRhdGEgcG9pbnRlciBwYXNzZWQgdG8gZWFjaCBjYWxsYmFjayBpbiBAY2IuCiAgKgotICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHNwZWNpZmllZCB0b3AgbGV2ZWwKLSAqIGRvd24gdG8gdGhlIGxvd2VzdCBsZXZlbCAobGV2ZWwgMCkuIEZvciBlYWNoIHByZXNlcnZlZCBwYWdlIGZvdW5kLCBpdCBpbnZva2VzCi0gKiB0aGUgcHJvdmlkZWQgY2FsbGJhY2ssIHBhc3NpbmcgdGhlIHBhZ2UmIzM5O3MgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuCiYjNDM7ICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHRvcCBsZXZlbCBkb3duIHRvIHRoZQomIzQzOyAqIGxvd2VzdCBsZXZlbCAobGV2ZWwgMCksIGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MuCiAgKgogICogUmV0dXJuOiAwIGlmIHRoZSB3YWxrIGNvbXBsZXRlZCB0aGUgc3BlY2lmaWVkIHRyZWUsIG9yIHRoZSBub24temVybyByZXR1cm4KICAqICAgICAgICAgdmFsdWUgZnJvbSB0aGUgY2FsbGJhY2sgdGhhdCBzdG9wcGVkIHRoZSB3YWxrLgogICovCiBpbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsCi0JCQlraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpCiYjNDM7CQkJY29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSkKIHsKIAlpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLSZndDtyb290KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlndWFyZChtdXRleCkoJmFtcDt0cmVlLSZndDtsb2NrKTsKIAotCXJldHVybiBfX2tob19yYWRpeF93YWxrX3RyZWUodHJlZS0mZ3Q7cm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSwgMCwgY2IpOwomIzQzOwlyZXR1cm4gX19raG9fcmFkaXhfd2Fsa190cmVlKHRyZWUtJmd0O3Jvb3QsIEtIT19UUkVFX01BWF9ERVBUSCAtIDEsIDAsIGNiLAomIzQzOwkJCQkgICAgIGRhdGEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X3dhbGtfdHJlZSk7CiAKQEAgLTQ4NCwxMyAmIzQzOzU5OSwxNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKl9faW5pdCBraG9fZ2V0X3ByZXNlcnZlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMsCiAJcmV0dXJuIHBmbl90b19wYWdlKHBmbik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cywKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBvcmRlcikKJiM0MztzdGF0aWMgaW50IF9faW5pdCBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKQogewogCXVuaW9uIGtob19wYWdlX2luZm8gaW5mbzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJdW5zaWduZWQgaW50IG9yZGVyOwomIzQzOwlwaHlzX2FkZHJfdCBwaHlzOwogCXU2NCBzejsKIAomIzQzOwlwaHlzID0ga2hvX2RlY29kZV9yYWRpeF9rZXkoa2V5LCAmYW1wO29yZGVyKTsKJiM0MzsKIAlzeiA9IDEgJmx0OyZsdDsgKG9yZGVyICYjNDM7IFBBR0VfU0hJRlQpOwogCXBhZ2UgPSBraG9fZ2V0X3ByZXNlcnZlZF9wYWdlKHBoeXMsIG9yZGVyKTsKIApAQCAtNTA0LDE5ICYjNDM7NjIyLDI0IEBAIHN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cywKIAlyZXR1cm4gMDsKIH0KIAotLyogUmV0dXJucyBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwcmVzZXJ2ZWQgbWVtb3J5IG1hcCBmcm9tIEZEVCAqLwotc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBraG9fZ2V0X21lbV9tYXBfcGh5cyhjb25zdCB2b2lkICpmZHQpCiYjNDM7LyogUmV0dXJucyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovCiYjNDM7c3RhdGljIF9faW5pdCB2b2lkICpraG9fZ2V0X21lbV9tYXAoY29uc3Qgdm9pZCAqZmR0KQogewogCWNvbnN0IHZvaWQgKm1lbV9wdHI7CiYjNDM7CXBoeXNfYWRkcl90IG1lbV9tYXBfcGh5czsKIAlpbnQgbGVuOwogCiAJbWVtX3B0ciA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgJmFtcDtsZW4pOwogCWlmICghbWVtX3B0ciB8fCBsZW4gIT0gc2l6ZW9mKHU2NCkpIHsKIAkJcHJfZXJyKCYjMzQ7ZmFpbGVkIHRvIGdldCBwcmVzZXJ2ZWQgbWVtb3J5IG1hcFxuJiMzNDspOwotCQlyZXR1cm4gMDsKJiM0MzsJCXJldHVybiBOVUxMOwogCX0KIAotCXJldHVybiBnZXRfdW5hbGlnbmVkKChjb25zdCB1NjQgKiltZW1fcHRyKTsKJiM0MzsJbWVtX21hcF9waHlzID0gZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTY0ICopbWVtX3B0cik7CiYjNDM7CWlmICghbWVtX21hcF9waHlzKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CXJldHVybiBwaHlzX3RvX3ZpcnQobWVtX21hcF9waHlzKTsKIH0KIAogLyoKQEAgLTYxOSwxOSAmIzQzOzc0MiwyNCBAQCBlYXJseV9wYXJhbSgmIzM0O2tob19zY3JhdGNoJiMzNDssIGtob19wYXJzZV9zY3JhdGNoX3NpemUpOwogc3RhdGljIHZvaWQgX19pbml0IHNjcmF0Y2hfc2l6ZV91cGRhdGUodm9pZCkKIHsKIAkvKgotCSAqIElmIGZpeGVkIHNpemVzIGFyZSBub3QgcHJvdmlkZWQgdmlhIGNvbW1hbmQgbGluZSwgY2FsY3VsYXRlIHRoZW0KLQkgKiBub3cuCiYjNDM7CSAqIElmIGZpeGVkIHNpemVzIGFyZSBub3QgcHJvdmlkZWQgdmlhIGNvbW1hbmQgbGluZSwgY2FsY3VsYXRlIHRoZW0gbm93LgomIzQzOwkgKiBSZW1vdmUgSHVnZVRMQiBhbGxvY2F0aW9ucyBmcm9tIGl0IGJlY2F1c2UgdGhleSBuZXZlciBnZXQgYWxsb2NhdGVkCiYjNDM7CSAqIGZyb20gc2NyYXRjaC4KIAkgKi8KIAlpZiAoc2NyYXRjaF9zY2FsZSkgewogCQlwaHlzX2FkZHJfdCBzaXplOwogCiAJCXNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoQVJDSF9MT1dfQUREUkVTU19MSU1JVCwKIAkJCQkJCSAgIE5VTUFfTk9fTk9ERSk7CiYjNDM7CQlzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShBUkNIX0xPV19BRERSRVNTX0xJTUlULAomIzQzOwkJCQkJCSAgICAgICBOVU1BX05PX05PREUpOwogCQlzaXplID0gc2l6ZSAqIHNjcmF0Y2hfc2NhbGUgLyAxMDA7CiAJCXNjcmF0Y2hfc2l6ZV9sb3dtZW0gPSBzaXplOwogCiAJCXNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsCiAJCQkJCQkgICBOVU1BX05PX05PREUpOwomIzQzOwkJc2l6ZSAtPSBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsCiYjNDM7CQkJCQkJICAgICAgIE5VTUFfTk9fTk9ERSk7CiAJCXNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMCAtIHNjcmF0Y2hfc2l6ZV9sb3dtZW07CiAJCXNjcmF0Y2hfc2l6ZV9nbG9iYWwgPSBzaXplOwogCX0KQEAgLTY1MSw2ICYjNDM7Nzc5LDkgQEAgc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBzY3JhdGNoX3NpemVfbm9kZShpbnQgbmlkKQogCWlmIChzY3JhdGNoX3NjYWxlKSB7CiAJCXNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsCiAJCQkJCQkgICBuaWQpOwomIzQzOwkJLyogRG8gbm90IGNvdW50IEh1Z2VUTEIgcGFnZXMuICovCiYjNDM7CQlzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSwKJiM0MzsJCQkJCQkgICAgICAgbmlkKTsKIAkJc2l6ZSA9IHNpemUgKiBzY3JhdGNoX3NjYWxlIC8gMTAwOwogCX0gZWxzZSB7CiAJCXNpemUgPSBzY3JhdGNoX3NpemVfcGVybm9kZTsKQEAgLTY1OSw2ICYjNDM7NzkwLDQ5IEBAIHN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgc2NyYXRjaF9zaXplX25vZGUoaW50IG5pZCkKIAlyZXR1cm4gcm91bmRfdXAoc2l6ZSwgQ01BX01JTl9BTElHTk1FTlRfQllURVMpOwogfQogCiYjNDM7Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJcGh5c19hZGRyX3Qgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQ7CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsga2hvX3NjcmF0Y2hfY250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJc2NyYXRjaF9zdGFydCA9IGtob19zY3JhdGNoW2ldLmFkZHI7CiYjNDM7CQlzY3JhdGNoX2VuZCA9IGtob19zY3JhdGNoW2ldLmFkZHIgJiM0Mzsga2hvX3NjcmF0Y2hbaV0uc2l6ZTsKJiM0MzsKJiM0MzsJCWlmIChwaHlzICZsdDsgc2NyYXRjaF9lbmQgJmFtcDsmYW1wOyAocGh5cyAmIzQzOyBzaXplKSAmZ3Q7IHNjcmF0Y2hfc3RhcnQpCiYjNDM7CQkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIE1hcmsgYWxsIEtITyBzY3JhdGNoIHBhZ2VibG9ja3MgYmV0d2VlbiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gYXMKJiM0MzsgKiBNSUdSQVRFX0NNQS4KJiM0MzsgKi8KJiM0Mzt2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKJiM0Mzt7CiYjNDM7CWZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpICZsdDsga2hvX3NjcmF0Y2hfY250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJdW5zaWduZWQgbG9uZyBzY3JhdGNoX3N0YXJ0LCBzY3JhdGNoX2VuZCwgcGZuOwomIzQzOwomIzQzOwkJc2NyYXRjaF9zdGFydCA9IFBIWVNfUEZOKGtob19zY3JhdGNoW2ldLmFkZHIpOwomIzQzOwkJc2NyYXRjaF9lbmQgPSBQSFlTX1BGTihraG9fc2NyYXRjaFtpXS5hZGRyICYjNDM7IGtob19zY3JhdGNoW2ldLnNpemUpOwomIzQzOwomIzQzOwkJLyogVGFyZ2V0IHJhbmdlIGRvZXNuJiMzOTt0IG92ZXJsYXAgd2l0aCBzY3JhdGNoLiAqLwomIzQzOwkJaWYgKHN0YXJ0X3BmbiAmZ3Q7PSBzY3JhdGNoX2VuZCB8fCBlbmRfcGZuICZsdDs9IHNjcmF0Y2hfc3RhcnQpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlwZm4gPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBzdGFydF9wZm4sIHNjcmF0Y2hfc3RhcnQpOwomIzQzOwkJcGZuID0gcGFnZWJsb2NrX3N0YXJ0X3BmbihwZm4pOwomIzQzOwomIzQzOwkJd2hpbGUgKHBmbiAmbHQ7IGVuZF9wZm4gJmFtcDsmYW1wOyBwZm4gJmx0OyBzY3JhdGNoX2VuZCkgewomIzQzOwkJCWluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBmbl90b19wYWdlKHBmbiksCiYjNDM7CQkJCQkJICAgTUlHUkFURV9DTUEsIGZhbHNlKTsKJiM0MzsJCQlwZm4gJiM0Mzs9IHBhZ2VibG9ja19ucl9wYWdlczsKJiM0MzsJCX0KJiM0MzsJfQomIzQzO30KJiM0MzsKIC8qKgogICoga2hvX3Jlc2VydmVfc2NyYXRjaCAtIFJlc2VydmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBmb3Iga2V4ZWMKICAqCkBAIC03NDYsNiAmIzQzOzkyMCwxMjggQEAgc3RhdGljIHZvaWQgX19pbml0IGtob19yZXNlcnZlX3NjcmF0Y2godm9pZCkKIAlraG9fZW5hYmxlID0gZmFsc2U7CiB9CiAKJiM0MzsvKgomIzQzOyAqIExvb2sgZm9yIGZyZWUgYmxvY2tzIG9mIDFHLiBUaGlzIGlzIGEgaGV1cmlzdGljIGNob3NlbiB0byB3b3JrIGVmZmljaWVudGx5CiYjNDM7ICogd2l0aCBsYXJnZSBzeXN0ZW1zIHdpdGggaHVuZHJlZHMgb2YgZ2lnYWJ5dGVzIG9mIG1lbW9yeS4gSXQgd2lsbCB3b3JrIHBvb3JseQomIzQzOyAqIG9uIHNtYWxsZXIgc3lzdGVtcy4gVGhlIGFsZ29yaXRobSBpdHNlbGYgZG9lc24mIzM5O3QgZGVwZW5kIG9uIHRoZSBhY3R1YWwgdmFsdWUsCiYjNDM7ICogc28gaXQgY2FuIGJlIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgaGV1cmlzdGljIGxhdGVyIGlmIG5lZWRlZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIEtIT19FWFRfQkxLU0laRQkJU1pfMUcKJiM0MzsjZGVmaW5lIEtIT19FWFRfU0hJRlQJCWNvbnN0X2lsb2cyKEtIT19FWFRfQkxLU0laRSkKJiM0MzsKJiM0MzsvKiBDYWxsZWQgZm9yIHRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiAqLwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfd2Fsa19sZWFmKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJLyogUmFkaXggdHJlZSB0cmFja2luZyBmcmVlIGJsb2Nrcy4gKi8KJiM0MzsJc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlID0gZGF0YTsKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKJiM0MzsJdW5zaWduZWQgaW50IG9yZGVyOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlzdGFydCA9IGtob19kZWNvZGVfcmFkaXhfa2V5KGtleSwgJmFtcDtvcmRlcik7CiYjNDM7CWVuZCA9IHN0YXJ0ICYjNDM7ICgxVUwgJmx0OyZsdDsgKG9yZGVyICYjNDM7IFBBR0VfU0hJRlQpKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHN0YXJ0ICZsdDsgZW5kKSB7CiYjNDM7CQllcnIgPSBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBzdGFydCAmZ3Q7Jmd0OyBLSE9fRVhUX1NISUZUKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJCXN0YXJ0ICYjNDM7PSAoMVVMICZsdDsmbHQ7IEtIT19FWFRfU0hJRlQpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBDYWxsZWQgZm9yIHRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiAqLwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfd2Fsa19ub2RlKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwkvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqLwomIzQzOwlzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUgPSBkYXRhOwomIzQzOwomIzQzOwlyZXR1cm4ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgcGh5cyAmZ3Q7Jmd0OyBLSE9fRVhUX1NISUZUKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ2FsbGVkIGZvciB0aGUgZnJlZSBibG9jayByYWRpeCB0cmVlLiAqLwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfbWFya19zY3JhdGNoKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJcGh5c19hZGRyX3QgKnByZXZfZW5kID0gZGF0YTsKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQgPSBrZXkgJmx0OyZsdDsgS0hPX0VYVF9TSElGVDsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKHN0YXJ0ICZndDsgKnByZXZfZW5kKSB7CiYjNDM7CQllcnIgPSBtZW1ibG9ja19tYXJrX2tob19zY3JhdGNoKCpwcmV2X2VuZCwgc3RhcnQgLSAqcHJldl9lbmQpOwomIzQzOwkJaWYgKGVycikKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CSpwcmV2X2VuZCA9IHN0YXJ0ICYjNDM7ICgxVUwgJmx0OyZsdDsgS0hPX0VYVF9TSElGVCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGtob19leHRlbmRfc2NyYXRjaCAtIEV4dGVuZCB0aGUgc2NyYXRjaCByZWdpb25zCiYjNDM7ICoKJiM0MzsgKiBUaGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZSBtaXhlcyBib3RoIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyCiYjNDM7ICogaW50byBhIHNpbmdsZSBrZXkuIFRoaXMgbWFrZXMgaXQgaGFyZCB0byBsb29rIGZvciBmcmVlIHJhbmdlcyBkaXJlY3RseS4gVGhpcwomIzQzOyAqIGZ1bmN0aW9uIGZpcnN0IHdhbGtzIHRoZSByYWRpeCB0cmVlIGFuZCBkaWdlc3RzIGl0IGRvd24gaW50byBhbm90aGVyIHJhZGl4CiYjNDM7ICogdHJlZSwgd2hvc2Uga2V5cyBpZGVudGlmeSBibG9ja3Mgb2YgS0hPX0VYVF9TSElGVCB3aGljaCBjb250YWluIHByZXNlcnZlZAomIzQzOyAqIG1lbW9yeS4KJiM0MzsgKgomIzQzOyAqIFRoZW4gaXQgd2Fsa3MgdGhlIGRpZ2VzdGVkIHJhZGl4IHRyZWUgYW5kIG1hcmtzIGV2ZXJ5dGhpbmcgdGhhdCBkb2VzbiYjMzk7dCBoYXZlCiYjNDM7ICogcHJlc2VydmVkIG1lbW9yeSBhcyBzY3JhdGNoLgomIzQzOyAqCiYjNDM7ICogTk9URTogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IHNvIGl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBzY3JhdGNoIGhhcwomIzQzOyAqIGF2YWlsYWJsZSBzcGFjZS4KJiM0MzsgKgomIzQzOyAqIE5PVEU6IFRoZSBwYWdlcyBvZiB0aGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZSB0YWJsZXMgYXJlIG5vdCBtYXJrZWQKJiM0MzsgKiBhcyBwcmVzZXJ2ZWQgaW4gdGhlIHByZXNlcnZlZCBtZW1vcnkgdHJlZS4gQnV0IHRoZXkgYXJlIGV4cGVjdGVkIHRvIHJlbWFpbgomIzQzOyAqIHVudG91Y2hlZCB1bnRpbCB0aGUgdHJlZSBpcyBmdWxseSBwYXJzZWQuIFNvIHRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMKJiM0MzsgKiB0aGVtIHRvIGJlICYjMzQ7cHJlc2VydmVkIG1lbW9yeSYjMzQ7IGFuZCBtYXJrcyB0aGVpciBibG9ja3MgYXMgYnVzeS4KJiM0MzsgKgomIzQzOyAqIE5PVEU6IGVmaV9pbml0KCk6OnJlc2VydmVfcmVnaW9ucygpIHJlbW92ZXMgYWxsIHJlZ2lvbnMgZXhjZXB0CiYjNDM7ICogTUVNQkxPQ0tfS0hPX1NDUkFUQ0guIFRoaXMgZnVuY3Rpb24gYWRkcyBzdWNoIHJlZ2lvbnMgYnV0IHRoZXkgYXJlIG5vdCBLSE8KJiM0MzsgKiBzY3JhdGNoIG1lbW9yeSwgc28gdGhleSBzaG91bGQgbm90IGJlIHJlbW92ZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyBiZQomIzQzOyAqIGNhbGxlZCBhZnRlciByZXNlcnZlX3JlZ2lvbnMoKS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBfX2luaXQga2hvX2V4dGVuZF9zY3JhdGNoKHZvaWQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2Iga2hvX2NiID0gewomIzQzOwkJLmxlYWYgPSBraG9fZXh0X3dhbGtfbGVhZiwKJiM0MzsJCS5ub2RlID0ga2hvX2V4dF93YWxrX25vZGUsCiYjNDM7CX07CiYjNDM7CWNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiBleHRfY2IgPSB7CiYjNDM7CQkubGVhZiA9IGtob19leHRfbWFya19zY3JhdGNoLAomIzQzOwl9OwomIzQzOwlzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgcmFkaXg7CiYjNDM7CXBoeXNfYWRkcl90IHByZXZfZW5kID0gMDsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CWVyciA9IGtob19yYWRpeF9pbml0X3RyZWUoJmFtcDtyYWRpeCwgTlVMTCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlnb3RvIHByaW50OwomIzQzOwomIzQzOwkvKiBXYWxrIHRoZSBLSE8gcmFkaXggdHJlZSB0byBmaW5kIGJ1c3kgYmxvY2tzLiAqLwomIzQzOwllcnIgPSBraG9fcmFkaXhfd2Fsa190cmVlKCZhbXA7a2hvX2luLnJhZGl4X3RyZWUsICZhbXA7a2hvX2NiLCAmYW1wO3JhZGl4KTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBXYWxrIHRoZSBibG9ja3MgYW5kIG1hcmsgZXZlcnl0aGluZyBiZXR3ZWVuIGtleXMgYXMgc2NyYXRjaC4gKi8KJiM0MzsJZXJyID0ga2hvX3JhZGl4X3dhbGtfdHJlZSgmYW1wO3JhZGl4LCAmYW1wO2V4dF9jYiwgJmFtcDtwcmV2X2VuZCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyogTWFyayBldmVyeXRoaW5nIGZyb20gbGFzdCBidXN5IGJsb2NrIHRvIGVuZCBvZiBEUkFNLiAqLwomIzQzOwlpZiAocHJldl9lbmQgJmx0OyBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpKQomIzQzOwkJZXJyID0gbWVtYmxvY2tfbWFya19raG9fc2NyYXRjaChwcmV2X2VuZCwgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSAtIHByZXZfZW5kKTsKJiM0MzsKJiM0MzsJLyogZmFsbHRocm91Z2ggKi8KJiM0MztvdXQ6CiYjNDM7CWtob19yYWRpeF9kZXN0cm95X3RyZWUoJmFtcDtyYWRpeCk7CiYjNDM7cHJpbnQ6CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlwcl9lcnIoJiMzNDtGYWlsZWQgdG8gZXh0ZW5kIHNjcmF0Y2g6ICVwZVxuJiMzNDssIEVSUl9QVFIoZXJyKSk7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBraG9fYWRkX3N1YnRyZWUgLSByZWNvcmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBzdWIgYmxvYiBpbiBLSE8gcm9vdCB0cmVlLgogICogQG5hbWU6IG5hbWUgb2YgdGhlIHN1YiB0cmVlLgpAQCAtODU2LDEwICYjNDM7MTE1MiwxMiBAQCBpbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJY29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBmb2xpb19wZm4oZm9saW8pOwogCWNvbnN0IHVuc2lnbmVkIGludCBvcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAotCWlmIChXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAocGZuICZsdDsmbHQ7IFBBR0VfU0hJRlQsIFBBR0VfU0laRSAmbHQ7Jmx0OyBvcmRlcikpKQomIzQzOwlpZiAoSVNfRU5BQkxFRChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpICZhbXA7JmFtcDsKJiM0MzsJICAgIFdBUk5fT04oa2hvX3NjcmF0Y2hfb3ZlcmxhcChwZm4gJmx0OyZsdDsgUEFHRV9TSElGVCwgUEFHRV9TSVpFICZsdDsmbHQ7IG9yZGVyKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGtob19yYWRpeF9hZGRfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTsKJiM0MzsJcmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksCiYjNDM7CQkJCQkJCSAgICBvcmRlcikpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3ByZXNlcnZlX2ZvbGlvKTsKIApAQCAtODc3LDcgJiM0MzsxMTc1LDcgQEAgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCWNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gZm9saW9fcGZuKGZvbGlvKTsKIAljb25zdCB1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAKLQlraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7CiYjNDM7CWtob19yYWRpeF9kZWxfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksIG9yZGVyKSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChraG9fdW5wcmVzZXJ2ZV9mb2xpbyk7CiAKQEAgLTkwNiw3ICYjNDM7MTIwNCw4IEBAIHN0YXRpYyB2b2lkIF9fa2hvX3VucHJlc2VydmUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLAogCXdoaWxlIChwZm4gJmx0OyBlbmRfcGZuKSB7CiAJCW9yZGVyID0gX19raG9fcHJlc2VydmVfcGFnZXNfb3JkZXIocGZuLCBlbmRfcGZuKTsKIAotCQlraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7CiYjNDM7CQlraG9fcmFkaXhfZGVsX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLAomIzQzOwkJCQkJCQkgICAgIG9yZGVyKSk7CiAKIAkJcGZuICYjNDM7PSAxICZsdDsmbHQ7IG9yZGVyOwogCX0KQEAgLTkzMSw3ICYjNDM7MTIzMCw4IEBAIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiAJdW5zaWduZWQgbG9uZyBmYWlsZWRfcGZuID0gMDsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAoc3RhcnRfcGZuICZsdDsmbHQ7IFBBR0VfU0hJRlQsCiYjNDM7CWlmIChJU19FTkFCTEVEKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRykgJmFtcDsmYW1wOwomIzQzOwkgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiAmbHQ7Jmx0OyBQQUdFX1NISUZULAogCQkJCQlucl9wYWdlcyAmbHQ7Jmx0OyBQQUdFX1NISUZUKSkpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTM5LDcgJiM0MzsxMjM5LDggQEAgaW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKIAl3aGlsZSAocGZuICZsdDsgZW5kX3BmbikgewogCQl1bnNpZ25lZCBpbnQgb3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pOwogCi0JCWVyciA9IGtob19yYWRpeF9hZGRfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTsKJiM0MzsJCWVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksCiYjNDM7CQkJCQkJCQkgICBvcmRlcikpOwogCQlpZiAoZXJyKSB7CiAJCQlmYWlsZWRfcGZuID0gcGZuOwogCQkJYnJlYWs7CkBAIC0xMzE1LDIyICYjNDM7MTYxNiw2IEBAIHZvaWQga2hvX3Jlc3RvcmVfZnJlZSh2b2lkICptZW0pCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChraG9fcmVzdG9yZV9mcmVlKTsKIAotc3RydWN0IGtob19pbiB7Ci0JcGh5c19hZGRyX3QgZmR0X3BoeXM7Ci0JcGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzOwotCWNoYXIgcHJldmlvdXNfcmVsZWFzZVtfX05FV19VVFNfTEVOICYjNDM7IDFdOwotCXUzMiBrZXhlY19jb3VudDsKLQlzdHJ1Y3Qga2hvX2RlYnVnZnMgZGJnOwotfTsKLQotc3RhdGljIHN0cnVjdCBraG9faW4ga2hvX2luID0gewotfTsKLQotc3RhdGljIGNvbnN0IHZvaWQgKmtob19nZXRfZmR0KHZvaWQpCi17Ci0JcmV0dXJuIGtob19pbi5mZHRfcGh5cyA/IHBoeXNfdG9fdmlydChraG9faW4uZmR0X3BoeXMpIDogTlVMTDsKLX0KLQogLyoqCiAgKiBpc19raG9fYm9vdCAtIGNoZWNrIGlmIGN1cnJlbnQga2VybmVsIHdhcyBib290ZWQgdmlhIEtITy1lbmFibGVkCiAgKiBrZXhlYwpAQCAtMTM5OCwyNiAmIzQzOzE2ODMsMjQgQEAgaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChraG9fcmV0cmlldmVfc3VidHJlZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGtob19tZW1fcmV0cmlldmUoY29uc3Qgdm9pZCAqZmR0KQomIzQzO3N0YXRpYyB2b2lkIF9faW5pdCBraG9fbWVtX3JldHJpZXZlKHZvaWQpCiB7Ci0Jc3RydWN0IGtob19yYWRpeF90cmVlIHRyZWU7Ci0JY29uc3QgcGh5c19hZGRyX3QgKm1lbTsKLQlpbnQgbGVuOwomIzQzOwljb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgY2IgPSB7CiYjNDM7CQkubGVhZiA9IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUsCiYjNDM7CX07CiAKLQkvKiBSZXRyaWV2ZSB0aGUgS0hPIHJhZGl4IHRyZWUgZnJvbSBwYXNzZWQtaW4gRkRULiAqLwotCW1lbSA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgJmFtcDtsZW4pOwomIzQzOwlpZiAoa2hvX3JhZGl4X3dhbGtfdHJlZSgmYW1wO2tob19pbi5yYWRpeF90cmVlLCAmYW1wO2NiLCBOVUxMKSkKJiM0MzsJCWdvdG8gZXJyOwogCi0JaWYgKCFtZW0gfHwgbGVuICE9IHNpemVvZigqbWVtKSkgewotCQlwcl9lcnIoJiMzNDtmYWlsZWQgdG8gZ2V0IHByZXNlcnZlZCBLSE8gbWVtb3J5IHRyZWVcbiYjMzQ7KTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JaWYgKCEqbWVtKQotCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJcmV0dXJuOwogCi0JdHJlZS5yb290ID0gcGh5c190b192aXJ0KCptZW0pOwotCW11dGV4X2luaXQoJmFtcDt0cmVlLmxvY2spOwotCXJldHVybiBraG9fcmFkaXhfd2Fsa190cmVlKCZhbXA7dHJlZSwga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSk7CiYjNDM7ZXJyOgomIzQzOwkvKgomIzQzOwkgKiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcmVzZXJ2ZWQgbWVtb3J5LiBDbGVhciBGRFQgYW5kIHJhZGl4IHNvIEtITwomIzQzOwkgKiB1c2VycyBkb24mIzM5O3QgdHJlYXQgaXQgYXMgYSBLSE8gYm9vdC4KJiM0MzsJICovCiYjNDM7CWtob19pbi5mZHRfcGh5cyA9IDA7CiYjNDM7CWtob19pbi5yYWRpeF90cmVlLnJvb3QgPSBOVUxMOwogfQogCiBzdGF0aWMgX19pbml0IGludCBraG9fb3V0X2ZkdF9zZXR1cCh2b2lkKQpAQCAtMTU0MywxNiAmIzQzOzE4MjYsMTQgQEAgc3RhdGljIF9faW5pdCBpbnQga2hvX2luaXQodm9pZCkKIAlpZiAoIWtob19lbmFibGUpCiAJCXJldHVybiAwOwogCi0JdHJlZS0mZ3Q7cm9vdCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRyZWUtJmd0O3Jvb3QpIHsKLQkJZXJyID0gLUVOT01FTTsKJiM0MzsJZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZSh0cmVlLCBOVUxMKTsKJiM0MzsJaWYgKGVycikKIAkJZ290byBlcnJfZnJlZV9zY3JhdGNoOwotCX0KIAogCWtob19vdXQuZmR0ID0ga2hvX2FsbG9jX3ByZXNlcnZlKFBBR0VfU0laRSk7CiAJaWYgKElTX0VSUihraG9fb3V0LmZkdCkpIHsKIAkJZXJyID0gUFRSX0VSUihraG9fb3V0LmZkdCk7Ci0JCWdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWVfcm9vdDsKJiM0MzsJCWdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU7CiAJfQogCiAJZXJyID0ga2hvX2RlYnVnZnNfaW5pdCgpOwpAQCAtMTYwMyw5ICYjNDM7MTg4NCw4IEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpCiAKIGVycl9mcmVlX2ZkdDoKIAlraG9fdW5wcmVzZXJ2ZV9mcmVlKGtob19vdXQuZmR0KTsKLWVycl9mcmVlX2tob19yYWRpeF90cmVlX3Jvb3Q6Ci0Ja2ZyZWUodHJlZS0mZ3Q7cm9vdCk7Ci0JdHJlZS0mZ3Q7cm9vdCA9IE5VTEw7CiYjNDM7ZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU6CiYjNDM7CWtob19yYWRpeF9kZXN0cm95X3RyZWUodHJlZSk7CiBlcnJfZnJlZV9zY3JhdGNoOgogCWtob19vdXQuZmR0ID0gTlVMTDsKIAlmb3IgKGludCBpID0gMDsgaSAmbHQ7IGtob19zY3JhdGNoX2NudDsgaSYjNDM7JiM0MzspIHsKQEAgLTE2MTksMTYgJiM0MzsxODk5LDQzIEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpCiB9CiBmc19pbml0Y2FsbChraG9faW5pdCk7CiAKLXZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdCh2b2lkKQomIzQzO3ZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKQogewotCWlmIChraG9faW4uc2NyYXRjaF9waHlzKSB7Ci0JCWtob19zY3JhdGNoID0gcGh5c190b192aXJ0KGtob19pbi5zY3JhdGNoX3BoeXMpOwomIzQzOwljb25zdCB2b2lkICpmZHQgPSBraG9fZ2V0X2ZkdCgpOwogCi0JCWlmIChraG9fbWVtX3JldHJpZXZlKGtob19nZXRfZmR0KCkpKQotCQkJa2hvX2luLmZkdF9waHlzID0gMDsKLQl9IGVsc2UgewotCQlraG9fcmVzZXJ2ZV9zY3JhdGNoKCk7CiYjNDM7CWlmICghaXNfa2hvX2Jvb3QoKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICoga2hvX3NjcmF0Y2hfb3ZlcmxhcCgpIG5lZWRzIGtob19zY3JhdGNoIHRvIGJlIGluaXRpYWxpemVkLiBJdAomIzQzOwkgKiBpcyB1c2VkIGJ5IGZyZWVfYXJlYV9pbml0KCkgb24gS0hPIGJvb3RzLCBzbyBpbml0aWFsaXplIGl0CiYjNDM7CSAqIGVhcmx5LgomIzQzOwkgKi8KJiM0MzsJa2hvX3NjcmF0Y2ggPSBwaHlzX3RvX3ZpcnQoa2hvX2luLnNjcmF0Y2hfcGh5cyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGtob19nZXRfbWVtX21hcCgpIHNob3VsZCBhbHdheXMgc3VjY2VlZC4gSWYgaXQgZmFpbHMsIGtob19wb3B1bGF0ZSgpCiYjNDM7CSAqIGNhdGNoZXMgdGhhdCBhbmQgbmV2ZXIgc2V0cyBraG9faW4uZmR0X3BoeXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoa2hvX3JhZGl4X2luaXRfdHJlZSgmYW1wO2tob19pbi5yYWRpeF90cmVlLCBraG9fZ2V0X21lbV9tYXAoZmR0KSkpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUuIENsZWFyIEZEVAomIzQzOwkJICogYW5kIHNjcmF0Y2ggc28gS0hPIHVzZXJzIGRvbiYjMzk7dCB0cmVhdCBpdCBhcyBhIEtITyBib290LgomIzQzOwkJICovCiYjNDM7CQlraG9faW4uZmR0X3BoeXMgPSAwOwomIzQzOwkJa2hvX2luLnNjcmF0Y2hfcGh5cyA9IDA7CiYjNDM7CQlyZXR1cm47CiAJfQomIzQzOwomIzQzOwlraG9fZXh0ZW5kX3NjcmF0Y2goKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpZiAoa2hvX2luLnNjcmF0Y2hfcGh5cykKJiM0MzsJCWtob19tZW1fcmV0cmlldmUoKTsKJiM0MzsJZWxzZQomIzQzOwkJa2hvX3Jlc2VydmVfc2NyYXRjaCgpOwogfQogCiB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLApAQCAtMTYzNiw5ICYjNDM7MTk0Myw4IEBAIHZvaWQgX19pbml0IGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sCiB7CiAJdW5zaWduZWQgaW50IHNjcmF0Y2hfY250ID0gc2NyYXRjaF9sZW4gLyBzaXplb2YoKmtob19zY3JhdGNoKTsKIAlzdHJ1Y3Qga2hvX3NjcmF0Y2ggKnNjcmF0Y2ggPSBOVUxMOwotCXBoeXNfYWRkcl90IG1lbV9tYXBfcGh5czsKLQl2b2lkICpmZHQgPSBOVUxMOwogCWJvb2wgcG9wdWxhdGVkID0gZmFsc2U7CiYjNDM7CXZvaWQgKmZkdCA9IE5VTEw7CiAJaW50IGVycjsKIAogCS8qIFZhbGlkYXRlIHRoZSBpbnB1dCBGRFQgKi8KQEAgLTE2NjAsOCAmIzQzOzE5NjYsMTMgQEAgdm9pZCBfX2luaXQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbiwKIAkJZ290byB1bm1hcF9mZHQ7CiAJfQogCi0JbWVtX21hcF9waHlzID0ga2hvX2dldF9tZW1fbWFwX3BoeXMoZmR0KTsKLQlpZiAoIW1lbV9tYXBfcGh5cykKJiM0MzsJLyoKJiM0MzsJICogQXQgdGhpcyBwb2ludCBwaHlzX3RvX3ZpcnQoKSBkb2VzbiYjMzk7dCB3b3JrIHByb3Blcmx5IGFuZCBzbwomIzQzOwkgKiBraG9fZ2V0X21lbV9tYXAoKSBjYW4gcmV0dXJuIGEgcHJlLUtBU0xSIHZpcnR1YWwgYWRkcmVzcy4gQnV0IGhlcmUgd2UKJiM0MzsJICogb25seSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgbWVtX21hcCBpcyB2YWxpZCBzbyB0aGUgYWN0dWFsIHZhbHVlCiYjNDM7CSAqIGRvZXNuJiMzOTt0IG1hdHRlciBhcyBsb25nIGFzIGl0IGlzbiYjMzk7dCBOVUxMLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFraG9fZ2V0X21lbV9tYXAoZmR0KSkKIAkJZ290byB1bm1hcF9mZHQ7CiAKIAlzY3JhdGNoID0gZWFybHlfbWVtcmVtYXAoc2NyYXRjaF9waHlzLCBzY3JhdGNoX2xlbik7CmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmYjY5NmY1NDI2MTIuLjAwMDAwMDAwMDAwMDAwCi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2RlYnVnLmMKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSwyNSAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIGtleGVjX2hhbmRvdmVyX2RlYnVnLmMgLSBrZXhlYyBoYW5kb3ZlciBvcHRpb25hbCBkZWJ1ZyBmdW5jdGlvbmFsaXR5Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMjUgR29vZ2xlIExMQywgUGFzaGEgVGF0YXNoaW4gJmx0O3Bhc2hhLnRhdGFzaGluQHNvbGVlbi5jb20mZ3Q7Ci0gKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSAmIzM0O0tITzogJiMzNDsgZm10Ci0KLSNpbmNsdWRlICYjMzQ7a2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaCYjMzQ7Ci0KLWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSkKLXsKLQlwaHlzX2FkZHJfdCBzY3JhdGNoX3N0YXJ0LCBzY3JhdGNoX2VuZDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgJmx0OyBraG9fc2NyYXRjaF9jbnQ7IGkmIzQzOyYjNDM7KSB7Ci0JCXNjcmF0Y2hfc3RhcnQgPSBraG9fc2NyYXRjaFtpXS5hZGRyOwotCQlzY3JhdGNoX2VuZCA9IGtob19zY3JhdGNoW2ldLmFkZHIgJiM0Mzsga2hvX3NjcmF0Y2hbaV0uc2l6ZTsKLQotCQlpZiAocGh5cyAmbHQ7IHNjcmF0Y2hfZW5kICZhbXA7JmFtcDsgKHBoeXMgJiM0Mzsgc2l6ZSkgJmd0OyBzY3JhdGNoX3N0YXJ0KQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaCBiL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2ludGVybmFsLmgKaW5kZXggMDM5OWZmMTA3Nzc1MGIuLjgwNWQyYTc2YzM4ODE4IDEwMDY0NAotLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2ludGVybmFsLmgKQEAgLTQxLDEzICYjNDM7NDEsNCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga2hvX2RlYnVnZnNfYmxvYl9yZW1vdmUoc3RydWN0IGtob19kZWJ1Z2ZzICpkYmcsCiAJCQkJCSAgIHZvaWQgKmJsb2IpIHsgfQogI2VuZGlmIC8qIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVR0ZTICovCiAKLSNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcKLWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmIC8qIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRyAqLwotCiAjZW5kaWYgLyogTElOVVhfS0VYRUNfSEFORE9WRVJfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IDU3MTIxMmI4MDgzNWVjLi5hYjRhZmM4MThlOGNiZCAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2V0bGIuYwpAQCAtMzAzMywyOSAmIzQzOzMwMzMsMjEgQEAgc3RhdGljIF9faW5pdCB2b2lkICphbGxvY19ib290bWVtKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQsIGJvb2wgbm9kZV9leGFjdCkKIAlpZiAoaHVnZXRsYl9lYXJseV9jbWEoaCkpCiAJCW0gPSBodWdldGxiX2NtYV9hbGxvY19ib290bWVtKGgsICZhbXA7bGlzdG5vZGUsIG5vZGVfZXhhY3QpOwogCWVsc2UgewotCQlpZiAobm9kZV9leGFjdCkKLQkJCW0gPSBtZW1ibG9ja19hbGxvY19leGFjdF9uaWRfcmF3KGh1Z2VfcGFnZV9zaXplKGgpLAotCQkJCWh1Z2VfcGFnZV9zaXplKGgpLCAwLAotCQkJCU1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUsIG5pZCk7Ci0JCWVsc2UgewotCQkJbSA9IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KGh1Z2VfcGFnZV9zaXplKGgpLAotCQkJCWh1Z2VfcGFnZV9zaXplKGgpLCAwLAotCQkJCU1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUsIG5pZCk7CiYjNDM7CQltID0gbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihodWdlX3BhZ2Vfc2l6ZShoKSwgbmlkLCBub2RlX2V4YWN0KTsKJiM0MzsJCWlmIChtKSB7CiYjNDM7CQkJbS0mZ3Q7ZmxhZ3MgPSAwOwomIzQzOwkJCW0tJmd0O2NtYSA9IE5VTEw7CiYjNDM7CiAJCQkvKgogCQkJICogRm9yIHByZS1IVk8gdG8gd29yayBjb3JyZWN0bHksIHBhZ2VzIG5lZWQgdG8gYmUgb24KIAkJCSAqIHRoZSBsaXN0IGZvciB0aGUgbm9kZSB0aGV5IHdlcmUgYWN0dWFsbHkgYWxsb2NhdGVkCiAJCQkgKiBmcm9tLiBUaGF0IG5vZGUgbWF5IGJlIGRpZmZlcmVudCBpbiB0aGUgY2FzZSBvZgotCQkJICogZmFsbGJhY2sgYnkgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcuIFNvLAomIzQzOwkJCSAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJfYm9vdG1lbS4gU28sCiAJCQkgKiBleHRyYWN0IHRoZSBhY3R1YWwgbm9kZSBmaXJzdC4KIAkJCSAqLwotCQkJaWYgKG0pCiYjNDM7CQkJaWYgKCFub2RlX2V4YWN0KQogCQkJCWxpc3Rub2RlID0gZWFybHlfcGZuX3RvX25pZChQSFlTX1BGTihfX3BhKG0pKSk7CiAJCX0KLQotCQlpZiAobSkgewotCQkJbS0mZ3Q7ZmxhZ3MgPSAwOwotCQkJbS0mZ3Q7Y21hID0gTlVMTDsKLQkJfQogCX0KIAogCWlmIChtKSB7CmRpZmYgLS1naXQgYS9tbS9tZW1ibG9jay5jIGIvbW0vbWVtYmxvY2suYwppbmRleCA2MzQ5YzQ4MTU0ZjRiMS4uYzEwZGZiMDU0ODA2YTcgMTAwNjQ0Ci0tLSBhL21tL21lbWJsb2NrLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtYmxvY2suYwpAQCAtMTUwNiw2ICYjNDM7MTUwNiwzMiBAQCBpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3NldF9ub2RlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUsCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgdm9pZCBtZW1ibG9ja19wcmVwX2FsbG9jYXRpb24ocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IHNpemUsCiYjNDM7CQkJCSAgICAgYm9vbCBsZWFrdHJhY2UpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBTa2lwIGttZW1sZWFrIGZvciB0aG9zZSBwbGFjZXMgbGlrZSBrYXNhbl9pbml0KCkgYW5kCiYjNDM7CSAqIGVhcmx5X3BndGFibGVfYWxsb2MoKSBkdWUgdG8gaGlnaCB2b2x1bWUuCiYjNDM7CSAqLwomIzQzOwlpZiAobGVha3RyYWNlKQomIzQzOwkJLyoKJiM0MzsJCSAqIE1lbWJsb2NrIGFsbG9jYXRlZCBibG9ja3MgYXJlIG5ldmVyIHJlcG9ydGVkIGFzCiYjNDM7CQkgKiBsZWFrcy4gVGhpcyBpcyBiZWNhdXNlIG1hbnkgb2YgdGhlc2UgYmxvY2tzIGFyZQomIzQzOwkJICogb25seSByZWZlcnJlZCB2aWEgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hpY2ggaXMKJiM0MzsJCSAqIG5vdCBsb29rZWQgdXAgYnkga21lbWxlYWsuCiYjNDM7CQkgKi8KJiM0MzsJCWttZW1sZWFrX2FsbG9jX3BoeXMoc3RhcnQsIHNpemUsIDApOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBTb21lIFZpcnR1YWwgTWFjaGluZSBwbGF0Zm9ybXMsIHN1Y2ggYXMgSW50ZWwgVERYIG9yIEFNRCBTRVYtU05QLAomIzQzOwkgKiByZXF1aXJlIG1lbW9yeSB0byBiZSBhY2NlcHRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgdGhlCiYjNDM7CSAqIGd1ZXN0LgomIzQzOwkgKgomIzQzOwkgKiBBY2NlcHQgdGhlIG1lbW9yeSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KJiM0MzsJICovCiYjNDM7CWFjY2VwdF9tZW1vcnkoc3RhcnQsIHNpemUpOwomIzQzO30KJiM0MzsKIC8qKgogICogbWVtYmxvY2tfYWxsb2NfcmFuZ2VfbmlkIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgYmxvY2sKICAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXMKQEAgLTE1ODAsMjggJiM0MzsxNjA2LDcgQEAgcGh5c19hZGRyX3QgX19pbml0IG1lbWJsb2NrX2FsbG9jX3JhbmdlX25pZChwaHlzX2FkZHJfdCBzaXplLAogCXJldHVybiAwOwogCiBkb25lOgotCS8qCi0JICogU2tpcCBrbWVtbGVhayBmb3IgdGhvc2UgcGxhY2VzIGxpa2Uga2FzYW5faW5pdCgpIGFuZAotCSAqIGVhcmx5X3BndGFibGVfYWxsb2MoKSBkdWUgdG8gaGlnaCB2b2x1bWUuCi0JICovCi0JaWYgKGVuZCAhPSBNRU1CTE9DS19BTExPQ19OT0xFQUtUUkFDRSkKLQkJLyoKLQkJICogTWVtYmxvY2sgYWxsb2NhdGVkIGJsb2NrcyBhcmUgbmV2ZXIgcmVwb3J0ZWQgYXMKLQkJICogbGVha3MuIFRoaXMgaXMgYmVjYXVzZSBtYW55IG9mIHRoZXNlIGJsb2NrcyBhcmUKLQkJICogb25seSByZWZlcnJlZCB2aWEgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hpY2ggaXMKLQkJICogbm90IGxvb2tlZCB1cCBieSBrbWVtbGVhay4KLQkJICovCi0JCWttZW1sZWFrX2FsbG9jX3BoeXMoZm91bmQsIHNpemUsIDApOwotCi0JLyoKLQkgKiBTb21lIFZpcnR1YWwgTWFjaGluZSBwbGF0Zm9ybXMsIHN1Y2ggYXMgSW50ZWwgVERYIG9yIEFNRCBTRVYtU05QLAotCSAqIHJlcXVpcmUgbWVtb3J5IHRvIGJlIGFjY2VwdGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBieSB0aGUKLQkgKiBndWVzdC4KLQkgKgotCSAqIEFjY2VwdCB0aGUgbWVtb3J5IG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgotCSAqLwotCWFjY2VwdF9tZW1vcnkoZm91bmQsIHNpemUpOwotCiYjNDM7CW1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihmb3VuZCwgc2l6ZSwgZW5kICE9IE1FTUJMT0NLX0FMTE9DX05PTEVBS1RSQUNFKTsKIAlyZXR1cm4gZm91bmQ7CiB9CiAKQEAgLTE3NTYsNiAmIzQzOzE3NjEsNjkgQEAgdm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY190cnlfbmlkX3JhdygKIAkJCQkgICAgICAgZmFsc2UpOwogfQogCiYjNDM7LyoqCiYjNDM7ICogbWVtYmxvY2tfYWxsb2NfaHVnZXRsYiAtIGFsbG9jYXRlIGJvb3QgbWVtb3J5IGZvciBIdWdlVExCIHBhZ2VzCiYjNDM7ICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlcwomIzQzOyAqIEBuaWQ6ICAgICAgIG5pZCBvZiB0aGUgZnJlZSBtZW1vcnkgdG8gZmluZCwgJU5VTUFfTk9fTk9ERSBmb3IgYW55IG5vZGUKJiM0MzsgKiBAZXhhY3RfbmlkOiBvbmx5IGFsbG9jYXRlIGZyb20gdGhlIHNwZWNpZmllZCBuaWQuIElmICVmYWxzZSwgdGhlIHNwZWNpZmllZAomIzQzOyAqICAgICAgICAgICAgIG5pZCBpcyB0cmllZCBmaXJzdCwgYW5kIHRoZW4gYWxsIG5vZGVzIGFyZSB0cmllZCBhcyBmYWxsYmFjay4KJiM0MzsgKgomIzQzOyAqIEh1Z2VUTEIgcGFnZXMgYXJlIGFsd2F5cyBhbGlnbmVkIGJ5IHRoZWlyIHNpemUsIHNvIHRoZSBhbGlnbm1lbnQgbWF0Y2hlcwomIzQzOyAqIEBzaXplLiBTaW5jZSB0aGUgbWVtb3J5IGlzIGZvciB1c2Vyc3BhY2UsIG1pcnJvcmVkIG1lbW9yeSBpcyBub3QgdXNlZC4gVGhlCiYjNDM7ICogbWVtb3J5IGlzIG5vdCB6ZXJvZWQuIERvZXMgbm90IHBhbmljIGlmIHJlcXVlc3QgY2Fubm90IGJlIHNhdGlzZmllZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvbiBzdWNjZXNzLCAlTlVMTCBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3ZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZCkKJiM0Mzt7CiYjNDM7CWVudW0gbWVtYmxvY2tfZmxhZ3MgZmxhZ3MgPSBjaG9vc2VfbWVtYmxvY2tfZmxhZ3MoKTsKJiM0MzsJcGh5c19hZGRyX3QgYWRkciwgc3RhcnQgPSAwLCBlbmQgPSBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFOwomIzQzOwomIzQzOwltZW1ibG9ja19kYmcoJiMzNDslczogJWxsdSBieXRlcywgbmlkPSVkLCBleGFjdF9uaWQ9JWQgJXBTXG4mIzM0OywgX19mdW5jX18sCiYjNDM7CQkgICAgICh1NjQpc2l6ZSwgbmlkLCBleGFjdF9uaWQsICh2b2lkICopX1JFVF9JUF8pOwomIzQzOwomIzQzOwkvKiBEb24mIzM5O3Qgd2FzdGUgbWlycm9yZWQgbWVtb3J5IG9uIEh1Z2VUTEIgcGFnZXMuICovCiYjNDM7CWZsYWdzICZhbXA7PSB+TUVNQkxPQ0tfTUlSUk9SOwomIzQzO3JldHJ5OgomIzQzOwkvKiBIdWdlVExCIHBhZ2VzIGFyZSBhbHdheXMgYWxpZ25lZCBieSB0aGVpciBzaXplLiAqLwomIzQzOwlhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZV9ub2RlKHNpemUsIHNpemUsIHN0YXJ0LCBlbmQsIG5pZCwgZmxhZ3MpOwomIzQzOwlpZiAoYWRkcikKJiM0MzsJCWdvdG8gZm91bmQ7CiYjNDM7CiYjNDM7CS8qIFRyeSBhbGwgbm9kZXMgaWYgYWxsb3dlZC4gKi8KJiM0MzsJaWYgKG51bWFfdmFsaWRfbm9kZShuaWQpICZhbXA7JmFtcDsgIWV4YWN0X25pZCkgewomIzQzOwkJbmlkID0gTlVNQV9OT19OT0RFOwomIzQzOwkJZ290byByZXRyeTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBGb3VuZCBub3RoaW5nLi4uIDotKCAqLwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0Mztmb3VuZDoKJiM0MzsJLyoKJiM0MzsJICogSHVnZVRMQiBwYWdlcyBjYW4gYmUgcHJlc2VydmVkIHdpdGggS0hPIGFuZCBubyBwcmVzZXJ2ZWQgbWVtb3J5IGNhbgomIzQzOwkgKiBiZSBpbiBzY3JhdGNoLiBTbyByZXRyeSBpZiBmb3VuZCBhZGRyZXNzIG92ZXJsYXBzIHdpdGggc2NyYXRjaC4KJiM0MzsJICoKJiM0MzsJICogU2NyYXRjaCBhcmVhcyBhcmUgbm9ybWFsbHkgbm90IHZlcnkgbGFyZ2UsIHNvIHRoaXMgc2hvdWxkbiYjMzk7dCB0YWtlIHRvbwomIzQzOwkgKiBtYW55IHJldHJpZXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoa2hvX3NjcmF0Y2hfb3ZlcmxhcChhZGRyLCBzaXplKSkgewomIzQzOwkJaWYgKG1lbWJsb2NrX2JvdHRvbV91cCgpKQomIzQzOwkJCXN0YXJ0ID0gYWRkciAmIzQzOyBzaXplOwomIzQzOwkJZWxzZQomIzQzOwkJCXN0YXJ0ID0gYWRkciAtIHNpemU7CiYjNDM7CiYjNDM7CQlnb3RvIHJldHJ5OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChfX21lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSwgbmlkLCBNRU1CTE9DS19SU1JWX0tFUk4gfCBNRU1CTE9DS19SU1JWX0hVR0VUTEIpKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CW1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihhZGRyLCBzaXplLCB0cnVlKTsKJiM0MzsJcmV0dXJuIHBoeXNfdG9fdmlydChhZGRyKTsKJiM0Mzt9CiYjNDM7CiAvKioKICAqIG1lbWJsb2NrX2FsbG9jX3RyeV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9jawogICogQHNpemU6IHNpemUgb2YgbWVtb3J5IGJsb2NrIHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlcwpAQCAtMTgyNSw2ICYjNDM7MTg5MywyOCBAQCBwaHlzX2FkZHJfdCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh2b2lkKQogCXJldHVybiBtZW1ibG9jay5yZXNlcnZlZC50b3RhbF9zaXplOwogfQogCiYjNDM7cGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7CiYjNDM7CXBoeXNfYWRkcl90IHRvdGFsID0gMDsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfcmVzZXJ2ZWRfbWVtX3JlZ2lvbihyKSB7CiYjNDM7CQlwaHlzX2FkZHJfdCBzaXplID0gci0mZ3Q7c2l6ZTsKJiM0MzsKJiM0MzsJCWlmIChyLSZndDtiYXNlICZndDsgbGltaXQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CiYjNDM7CQlpZiAoci0mZ3Q7YmFzZSAmIzQzOyByLSZndDtzaXplICZndDsgbGltaXQpCiYjNDM7CQkJc2l6ZSA9IGxpbWl0IC0gci0mZ3Q7YmFzZTsKJiM0MzsKJiM0MzsJCWlmIChuaWQgPT0gbWVtYmxvY2tfZ2V0X3JlZ2lvbl9ub2RlKHIpIHx8ICFudW1hX3ZhbGlkX25vZGUobmlkKSkKJiM0MzsJCQlpZiAoci0mZ3Q7ZmxhZ3MgJmFtcDsgTUVNQkxPQ0tfUlNSVl9IVUdFVExCKQomIzQzOwkJCQl0b3RhbCAmIzQzOz0gc2l6ZTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gdG90YWw7CiYjNDM7fQomIzQzOwogcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCkKIHsKIAlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyOwpAQCAtMjUxMSwxNiAmIzQzOzI2MDEsNiBAQCBfX2luaXQgdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpCiB7CiAJa2hvX3NjcmF0Y2hfb25seSA9IGZhbHNlOwogfQotCi1ib29sIF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19pc19raG9fc2NyYXRjaF9tZW1vcnkocGh5c19hZGRyX3QgYWRkcikKLXsKLQlpbnQgaSA9IG1lbWJsb2NrX3NlYXJjaCgmYW1wO21lbWJsb2NrLm1lbW9yeSwgYWRkcik7Ci0KLQlpZiAoaSA9PSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoKCZhbXA7bWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbaV0pOwotfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVIKZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuYwppbmRleCAwZjY0OTA5ZThkMjBlMi4uMWQyZjMwMmQ4Y2Q5YzEgMTAwNjQ0Ci0tLSBhL21tL21tX2luaXQuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9tbV9pbml0LmMKQEAgLTcwNyw5ICYjNDM7NzA3LDEwIEBAIHZvaWQgX19tZW1pbml0IF9faW5pdF9wYWdlX2Zyb21fbmlkKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKQogCV9faW5pdF9zaW5nbGVfcGFnZShwZm5fdG9fcGFnZShwZm4pLCBwZm4sIHppZCwgbmlkKTsKIAogCWlmIChwYWdlYmxvY2tfYWxpZ25lZChwZm4pKSB7Ci0JCWVudW0gbWlncmF0ZXR5cGUgbXQgPQotCQkJa2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBNSUdSQVRFX01PVkFCTEUpOwotCQlpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwZm5fdG9fcGFnZShwZm4pLCBtdCwgZmFsc2UpOwomIzQzOwkJaW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgTUlHUkFURV9NT1ZBQkxFLAomIzQzOwkJCQkJICAgZmFsc2UpOwomIzQzOwkJLyogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgaW4gY2FzZSBpdCBpcyBLSE8gc2NyYXRjaC4gKi8KJiM0MzsJCWtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBwZm4gJiM0MzsgMSk7CiAJfQogfQogCkBAIC05MzgsMTMgJiM0Mzs5MzksMjIgQEAgdm9pZCBfX21lbWluaXQgbWVtbWFwX2luaXRfcmFuZ2UodW5zaWduZWQgbG9uZyBzaXplLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHpvbmUKIAkJfQogCQlwZm4mIzQzOyYjNDM7OwogCX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgZm9yIGFueSBwYWdlYmxvY2tzIHRoYXQgZmFsbCBpbiBhIEtITyBzY3JhdGNoCiYjNDM7CSAqIGFyZWEuIERvIHRoaXMgaGVyZSBvdXRzaWRlIHRoZSBsb29wIGJlY2F1c2UgbW9zdCBwYWdlYmxvY2tzIHdpbGwgbm90CiYjNDM7CSAqIGJlIEtITyBzY3JhdGNoLCBzbyBvbmx5IHNlYXJjaCBvbmNlLgomIzQzOwkgKgomIzQzOwkgKiBPbmx5IHBhZ2VibG9ja3MgdXAgdG8gcGZuIGFyZSB1cGRhdGVkLCBkZWZlcnJlZCBwYWdlYmxvY2tzIHdpbGwgYmUKJiM0MzsJICogdXBkYXRlZCBsYXRlci4KJiM0MzsJICovCiYjNDM7CWtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBwZm4pOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSwKIAkJCQkJICB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQkJICB1bnNpZ25lZCBsb25nIGVuZF9wZm4sCi0JCQkJCSAgdW5zaWduZWQgbG9uZyAqaG9sZV9wZm4sCi0JCQkJCSAgZW51bSBtaWdyYXRldHlwZSBtdCkKJiM0MzsJCQkJCSAgdW5zaWduZWQgbG9uZyAqaG9sZV9wZm4pCiB7CiAJdW5zaWduZWQgbG9uZyB6b25lX3N0YXJ0X3BmbiA9IHpvbmUtJmd0O3pvbmVfc3RhcnRfcGZuOwogCXVuc2lnbmVkIGxvbmcgem9uZV9lbmRfcGZuID0gem9uZV9zdGFydF9wZm4gJiM0Mzsgem9uZS0mZ3Q7c3Bhbm5lZF9wYWdlczsKQEAgLTk1Nyw3ICYjNDM7OTY3LDggQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0X3pvbmVfcmFuZ2Uoc3RydWN0IHpvbmUgKnpvbmUsCiAJCXJldHVybjsKIAogCW1lbW1hcF9pbml0X3JhbmdlKGVuZF9wZm4gLSBzdGFydF9wZm4sIG5pZCwgem9uZV9pZCwgc3RhcnRfcGZuLAotCQkJICB6b25lX2VuZF9wZm4sIE1FTUlOSVRfRUFSTFksIE5VTEwsIG10LCBmYWxzZSk7CiYjNDM7CQkJICB6b25lX2VuZF9wZm4sIE1FTUlOSVRfRUFSTFksIE5VTEwsIE1JR1JBVEVfTU9WQUJMRSwKJiM0MzsJCQkgIGZhbHNlKTsKIAogCWlmICgqaG9sZV9wZm4gJmx0OyBzdGFydF9wZm4pCiAJCWluaXRfdW5hdmFpbGFibGVfcmFuZ2UoKmhvbGVfcGZuLCBzdGFydF9wZm4sIHpvbmVfaWQsIG5pZCk7CkBAIC05NzMsOCAmIzQzOzk4NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdCh2b2lkKQogCiAJZm9yX2VhY2hfbWVtX3Bmbl9yYW5nZShpLCBNQVhfTlVNTk9ERVMsICZhbXA7c3RhcnRfcGZuLCAmYW1wO2VuZF9wZm4sICZhbXA7bmlkKSB7CiAJCXN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZSA9IE5PREVfREFUQShuaWQpOwotCQllbnVtIG1pZ3JhdGV0eXBlIG10ID0KLQkJCWtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgTUlHUkFURV9NT1ZBQkxFKTsKIAogCQlmb3IgKGogPSAwOyBqICZsdDsgTUFYX05SX1pPTkVTOyBqJiM0MzsmIzQzOykgewogCQkJc3RydWN0IHpvbmUgKnpvbmUgPSBub2RlLSZndDtub2RlX3pvbmVzICYjNDM7IGo7CkBAIC05ODMsNyAmIzQzOzk5Miw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdCh2b2lkKQogCQkJCWNvbnRpbnVlOwogCiAJCQltZW1tYXBfaW5pdF96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgZW5kX3BmbiwKLQkJCQkJICAgICAgICZhbXA7aG9sZV9wZm4sIG10KTsKJiM0MzsJCQkJCSAgICAgICAmYW1wO2hvbGVfcGZuKTsKIAkJCXpvbmVfaWQgPSBqOwogCQl9CiAJfQpAQCAtMTk3Myw3ICYjNDM7MTk4Miw3IEBAIHVuc2lnbmVkIGxvbmcgX19pbml0IG5vZGVfbWFwX3Bmbl9hbGlnbm1lbnQodm9pZCkKIAogI2lmZGVmIENPTkZJR19ERUZFUlJFRF9TVFJVQ1RfUEFHRV9JTklUCiBzdGF0aWMgdm9pZCBfX2luaXQgZGVmZXJyZWRfZnJlZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwKLQkJdW5zaWduZWQgbG9uZyBucl9wYWdlcywgZW51bSBtaWdyYXRldHlwZSBtdCkKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBpOwpAQCAtMTk4NSw4ICYjNDM7MTk5NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLAogCiAJLyogRnJlZSBhIGxhcmdlIG5hdHVyYWxseS1hbGlnbmVkIGNodW5rIGlmIHBvc3NpYmxlICovCiAJaWYgKG5yX3BhZ2VzID09IE1BWF9PUkRFUl9OUl9QQUdFUyAmYW1wOyZhbXA7IElTX01BWF9PUkRFUl9BTElHTkVEKHBmbikpIHsKLQkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3BhZ2VzOyBpICYjNDM7PSBwYWdlYmxvY2tfbnJfcGFnZXMpCi0JCQlpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlICYjNDM7IGksIG10LCBmYWxzZSk7CiAJCV9fZnJlZV9wYWdlc19jb3JlKHBhZ2UsIE1BWF9QQUdFX09SREVSLCBNRU1JTklUX0VBUkxZKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE5OTQsMTEgJiM0MzsyMDAxLDggQEAgc3RhdGljIHZvaWQgX19pbml0IGRlZmVycmVkX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sCiAJLyogQWNjZXB0IGNodW5rcyBzbWFsbGVyIHRoYW4gTUFYX1BBR0VfT1JERVIgdXBmcm9udCAqLwogCWFjY2VwdF9tZW1vcnkoUEZOX1BIWVMocGZuKSwgbnJfcGFnZXMgKiBQQUdFX1NJWkUpOwogCi0JZm9yIChpID0gMDsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOywgcGFnZSYjNDM7JiM0MzssIHBmbiYjNDM7JiM0MzspIHsKLQkJaWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpCi0JCQlpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlLCBtdCwgZmFsc2UpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7LCBwYWdlJiM0MzsmIzQzOywgcGZuJiM0MzsmIzQzOykKIAkJX19mcmVlX3BhZ2VzX2NvcmUocGFnZSwgMCwgTUVNSU5JVF9FQVJMWSk7Ci0JfQogfQogCiAvKiBDb21wbGV0aW9uIHRyYWNraW5nIGZvciBkZWZlcnJlZF9pbml0X21lbW1hcCgpIHRocmVhZHMgKi8KQEAgLTIwMTcsMTUgJiM0MzsyMDIxLDI5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGdkYXRfaW5pdF9yZXBvcnRfb25lX2RvbmUodm9pZCkKICAqIFJldHVybiBudW1iZXIgb2YgcGFnZXMgaW5pdGlhbGl6ZWQuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkZWZlcnJlZF9pbml0X3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLAotCQl1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQomIzQzOwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKIHsKIAlpbnQgbmlkID0gem9uZV90b19uaWQoem9uZSk7Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGVuZF9wZm4gLSBwZm47CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuLCBwZm4gPSBzdGFydF9wZm47CiAJaW50IHppZCA9IHpvbmVfaWR4KHpvbmUpOwogCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKIAogCWZvciAoOyBwZm4gJmx0OyBlbmRfcGZuOyBwZm4mIzQzOyYjNDM7LCBwYWdlJiM0MzsmIzQzOykKIAkJX19pbml0X3NpbmdsZV9wYWdlKHBhZ2UsIHBmbiwgemlkLCBuaWQpOwomIzQzOwomIzQzOwkvKiBOb3cgaW5pdGlhbGl6ZSBtaWdyYXRlIHR5cGVzIGZvciB0aGVzZSBwYWdlcy4gKi8KJiM0MzsJcGZuID0gcGFnZWJsb2NrX2FsaWduKHN0YXJ0X3Bmbik7CiYjNDM7CXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwomIzQzOwlmb3IgKDsgcGZuICZsdDsgZW5kX3BmbjsgcGZuICYjNDM7PSBwYWdlYmxvY2tfbnJfcGFnZXMsIHBhZ2UgJiM0Mzs9IHBhZ2VibG9ja19ucl9wYWdlcykKJiM0MzsJCWluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIE1JR1JBVEVfTU9WQUJMRSwgZmFsc2UpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBmb3IgYW55IHBhZ2VibG9ja3MgdGhhdCBmYWxsIGluIGEgS0hPIHNjcmF0Y2gKJiM0MzsJICogYXJlYS4gU2luY2UgbW9zdCBwYWdlYmxvY2tzIHdpbGwgbm90IGJlIEtITyBzY3JhdGNoLCBkbyBpdCBvdXRzaWRlCiYjNDM7CSAqIHRoZSBsb29wIHRvIG9ubHkgZG8gdGhlIHNlYXJjaCBvbmNlLgomIzQzOwkgKi8KJiM0MzsJa2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIGVuZF9wZm4pOwomIzQzOwogCXJldHVybiBucl9wYWdlczsKIH0KIApAQCAtMjA1NCw4ICYjNDM7MjA3Miw2IEBAIGRlZmVycmVkX2luaXRfbWVtbWFwX2NodW5rKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4sCiAJZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgbmlkLCAwLCAmYW1wO3N0YXJ0LCAmYW1wO2VuZCwgTlVMTCkgewogCQl1bnNpZ25lZCBsb25nIHNwZm4gPSBQRk5fVVAoc3RhcnQpOwogCQl1bnNpZ25lZCBsb25nIGVwZm4gPSBQRk5fRE9XTihlbmQpOwotCQllbnVtIG1pZ3JhdGV0eXBlIG10ID0KLQkJCWtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHNwZm4sIE1JR1JBVEVfTU9WQUJMRSk7CiAKIAkJaWYgKHNwZm4gJmd0Oz0gZW5kX3BmbikKIAkJCWJyZWFrOwpAQCAtMjA2OCw3ICYjNDM7MjA4NCw3IEBAIGRlZmVycmVkX2luaXRfbWVtbWFwX2NodW5rKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4sCiAJCQl1bnNpZ25lZCBsb25nIGNodW5rX2VuZCA9IG1pbihtb19wZm4sIGVwZm4pOwogCiAJCQlucl9wYWdlcyAmIzQzOz0gZGVmZXJyZWRfaW5pdF9wYWdlcyh6b25lLCBzcGZuLCBjaHVua19lbmQpOwotCQkJZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZuLCBjaHVua19lbmQgLSBzcGZuLCBtdCk7CiYjNDM7CQkJZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZuLCBjaHVua19lbmQgLSBzcGZuKTsKIAogCQkJc3BmbiA9IGNodW5rX2VuZDsKIApAQCAtMjY4Nyw2ICYjNDM7MjcwMyw3IEBAIHZvaWQgX19pbml0IF9fd2VhayBtZW1faW5pdCh2b2lkKQogCiB2b2lkIF9faW5pdCBtbV9jb3JlX2luaXRfZWFybHkodm9pZCkKIHsKJiM0MzsJa2hvX21lbW9yeV9pbml0X2Vhcmx5KCk7CiAJaHVnZXRsYl9jbWFfcmVzZXJ2ZSgpOwogCWh1Z2V0bGJfYm9vdG1lbV9hbGxvYygpOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmggYi90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmgKaW5kZXggYjZiMWQxNDdmZDc1MGUuLmU4NmJiOTAwMGIyMmY4IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oCkBAIC02Niw0ICYjNDM7NjYsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKQogCiAjZGVmaW5lIF9fU2V0UGFnZVJlc2VydmVkKHApCSgodm9pZCkocCkpCiAKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiAjZW5kaWYKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA3MjgKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAyMDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBLZXhlYyBIYW5kb3ZlciBQYXRjaCBTZXJpZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIHRoYXQmIzM5O3MgdGlua2VyaW5nIHdpdGggdGhlIEtleGVjIEhhbmRvdmVyIChLSE8pIGZ1bmN0aW9uYWxpdHkuIEZyb20gdGhlIGRlc2NyaXB0aW9uLCBpdCBzZWVtcyBsaWtlIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggc29tZSBzaWduaWZpY2FudCBjaGFuZ2VzOiBrZXkgZW5jb2Rpbmcgd2l0aGluIHRoZSBLSE8gcmFkaXggdHJlZSwgdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyBlYXJseSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBga2hvX21lbW9yeV9pbml0X2Vhcmx5KClgLCBtb2RpZmljYXRpb25zIHRvIGBtZW1ibG9ja19hbGxvY19odWdldGxiKClgLCBhbmQgYSByZXZhbXAgb2YgaG93IHNjcmF0Y2ggbWVtb3J5IGlzIGV4dGVuZGVkIGFuZCBtaWdyYXRlZC4gVGhhdCYjMzk7cyBxdWl0ZSBhIHdpZGUgc2NvcGUgb2YgaW1wYWN0LgoKVGhlIHBhdGNoIHRvdWNoZXMgYSBnb29kIGNvbGxlY3Rpb24gb2YgY29yZSBmaWxlcy4gSSYjMzk7bSBzZWVpbmcgY2hhbmdlcyBpbiB0aGUgaGVhZGVyIGZpbGVzIGZvciBLZXhlYyBIYW5kb3ZlciwgdGhlIEtITyBBQkksIHRoZSBLSE8gcmFkaXggdHJlZSwgYW5kIG1lbWJsb2NrLiBUaGF0JiMzOTtzIGV4cGVjdGVkLCBnaXZlbiB0aGUgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzLiBUaGUgQyBmaWxlcyBhZmZlY3RlZCBpbmNsdWRlIGBrZXhlY19oYW5kb3Zlci5jYCwgYGh1Z2V0bGIuY2AsIGBtZW1ibG9jay5jYCwgYW5kIGBtbV9pbml0LmNgLiBUaGlzIGRlZmluaXRlbHkgYWZmZWN0cyBjcml0aWNhbCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgaGFuZG92ZXIgY29tcG9uZW50cywgc28gdGhpcyB3YXJyYW50cyBhIGNhcmVmdWwgcmV2aWV3LgoKQmVmb3JlIGRpdmluZyBkZWVwZXIgaW50byB0aGUgaW5kaXZpZHVhbCBwYXRjaCBkZXRhaWxzLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbGFyZ2VyIGNvbnRleHQuIElzIEtleGVjIEhhbmRvdmVyIGV2ZW4gZW5hYmxlZCBhbmQgaG93IGlzIGl0IGNvbmZpZ3VyZWQ/IEkmIzM5O2xsIHF1aWNrbHkgY2hlY2sgZm9yIGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIHRvIHNlZSBpZiBpdCYjMzk7cyBpbiBwbGF5LiBJJiMzOTtsbCB1c2UgYGdyZXBwZXJgIGZvciB0aGF0LCBhIHF1aWNrIHNjYW4gd2lsbCBjb25maXJtIGlmIHRoaXMgY29kZSBwYXRoIGlzIHJlbGV2YW50IG9yIGlmIGl0JiMzOTtzIGd1YXJkZWQgYnkgYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIG9wdGlvbi4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoYXQgcmV2ZWFscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgS0VYRUNfSEFORE9WRVImIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZz0zPW1lbnUgXCYjMzQ7TGl2ZSBVcGRhdGUgYW5kIEtleGVjIEhhbmRPdmVyXCYjMzQ7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTQtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnOjU6Y29uZmlnIEtFWEVDX0hBTkRPVkVSXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTYtXHRib29sIFwmIzM0O2tleGVjIGhhbmRvdmVyXCYjMzQ7XG4tLVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0xNy1cbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6MTg6Y29uZmlnIEtFWEVDX0hBTkRPVkVSX0RFQlVHXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTE5LVx0Ym9vbCBcJiMzNDtFbmFibGUgS2V4ZWMgSGFuZG92ZXIgZGVidWcgY2hlY2tzXCYjMzQ7XG4tLVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0yNi1cbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6Mjc6Y29uZmlnIEtFWEVDX0hBTkRPVkVSX0RFQlVHRlNcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctMjgtXHRib29sIFwmIzM0O2tleGVjIGhhbmRvdmVyIGRlYnVnZnMgaW50ZXJmYWNlXCYjMzQ7XG4tLVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0zNy1cbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6Mzg6Y29uZmlnIEtFWEVDX0hBTkRPVkVSX0VOQUJMRV9ERUZBVUxUXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTM5LVx0Ym9vbCBcJiMzNDtFbmFibGUga2V4ZWMgaGFuZG92ZXIgYnkgZGVmYXVsdFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxNTIyCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjc3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2g6IEtleGVjIEhhbmRvdmVyIGFuZCBIdWdlVExCIEludGVncmF0aW9uKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgdG91Y2hpbmcgYGtleGVjX2hhbmRvdmVyLmNgIGFuZCBgbWVtYmxvY2suY2AuIEl0IGxvb2tzIGxpa2UgaXQmIzM5O3MgYSBtaXggb2YgbmV3IGZ1bmN0aW9ucyBhbmQgc29tZSBpbnRlZ3JhdGlvbiB3b3JrLiBJbiBga2V4ZWNfaGFuZG92ZXIuY2AsIEkgc2VlIGEgd2hvbGUgc2xldyBvZiByYWRpeCB0cmVlIGZ1bmN0aW9ucyBiZWluZyBhZGRlZDogYGtob19yYWRpeF9hZGRfa2V5YCwgYGtob19yYWRpeF9kZWxfa2V5YCwgdGhlIHdhbGtpbmcsIGluaXRpYWxpemF0aW9uLCBhbmQgZGVzdHJ1Y3Rpb24gZnVuY3Rpb25zIChga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgKSwgcGx1cyBzb21lIG1vcmUgc3BlY2lmaWMgdXRpbGl0eSBmdW5jdGlvbnMgbGlrZSBga2hvX2V4dGVuZF9zY3JhdGNoYCwgYGtob19tZW1vcnlfaW5pdF9lYXJseWAsIGBraG9fc2NyYXRjaF9vdmVybGFwYCwgYW5kIGBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlYC4gVGhhdCYjMzk7cyBhIHNpZ25pZmljYW50IGFkZGl0aW9uLCBjbGVhcmx5IGJ1aWxkaW5nIHNvbWUga2luZCBvZiBkYXRhIHN0cnVjdHVyZSBhbmQgcmVsYXRlZCBtYW5hZ2VtZW50IGxvZ2ljIHdpdGhpbiB0aGUga2V4ZWMgaGFuZG92ZXIgcHJvY2Vzcy4KCk5vdywgb3ZlciBpbiBgbWVtYmxvY2suY2AsIHRoZSBuZXcgZnVuY3Rpb24gYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGlzIGJlaW5nIGludHJvZHVjZWQuIEludGVyZXN0aW5nLiBBbmQgaXQgYXBwZWFycyB0aGF0IHdpdGhpbiBgbW0vaHVnZXRsYi5jYCwgYGFsbG9jX2Jvb3RtZW1gIGlzIHVzaW5nIGBtZW1ibG9ja19hbGxvY19odWdldGxiYC4KCk15IGZpcnN0IHRob3VnaHQgaXMsIGlzIGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIHRoZSBvbmx5IGNvbmZpZ3VyYXRpb24gb3B0aW9uIGFmZmVjdGVkPyBJIGFzc3VtZSB0aGF0JiMzOTtzIHRoZSBwcmltYXJ5IGRyaXZlciBoZXJlLiBPa2F5LCBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCBgQ09ORklHX0tFWEVDX0hBTkRPVkVSYCBpcyB0aGUgbWFpbiB0aGluZy4gQnV0IHdhaXQsIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCBpcyBjYWxsZWQgaW4gYG1tL2h1Z2V0bGIuY2AsIHNvIGBDT05GSUdfSFVHRVRMQl9QQUdFYCBpcyBhbHNvIGdvaW5nIHRvIGJlIHJlbGV2YW50IGhlcmUuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhvc2UgZGVwZW5kZW5jaWVzIGFyZSBwcm9wZXJseSBoYW5kbGVkLiBMZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBgbW0vaHVnZXRsYi5jYCBjb2RlIHRvIGNvbmZpcm0gdGhhdCBgYWxsb2NfYm9vdG1lbWAgaXMgaW5kZWVkIHVzaW5nIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbiBhbmQgZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBvdGhlciByZWxldmFudCBjb25maWd1cmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthbGxvY19ib290bWVtJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vaHVnZXRsYi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2V0bGIuYz0yODU1PXN0cnVjdCBmb2xpbyAqYWxsb2NfaHVnZXRsYl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdldGxiLmMtMzAyNy1cbm1tL2h1Z2V0bGIuYzozMDI4OnN0YXRpYyBfX2luaXQgdm9pZCAqYWxsb2NfYm9vdG1lbShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkLCBib29sIG5vZGVfZXhhY3QpXG5tbS9odWdldGxiLmMtMzAyOS17XG4tLVxubW0vaHVnZXRsYi5jLTMwMzMtXHRpZiAoaHVnZXRsYl9lYXJseV9jbWEoaCkpXG5tbS9odWdldGxiLmM6MzAzNDpcdFx0bSA9IGh1Z2V0bGJfY21hX2FsbG9jX2Jvb3RtZW0oaCwgXHUwMDI2bGlzdG5vZGUsIG5vZGVfZXhhY3QpO1xubW0vaHVnZXRsYi5jLTMwMzUtXHRlbHNlIHtcbi0tXG5tbS9odWdldGxiLmMtMzA2OS1cbm1tL2h1Z2V0bGIuYzozMDcwOmludCBhbGxvY19ib290bWVtX2h1Z2VfcGFnZShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkKVxubW0vaHVnZXRsYi5jOjMwNzE6XHRfX2F0dHJpYnV0ZV9fICgod2VhaywgYWxpYXMoXCYjMzQ7X19hbGxvY19ib290bWVtX2h1Z2VfcGFnZVwmIzM0OykpKTtcbm1tL2h1Z2V0bGIuYzozMDcyOmludCBfX2FsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQpXG5tbS9odWdldGxiLmMtMzA3My17XG4tLVxubW0vaHVnZXRsYi5jLTMwNzgtXHRpZiAobmlkICE9IE5VTUFfTk9fTk9ERSkge1xubW0vaHVnZXRsYi5jOjMwNzk6XHRcdG0gPSBhbGxvY19ib290bWVtKGgsIG5vZGUsIHRydWUpO1xubW0vaHVnZXRsYi5jLTMwODAtXHRcdGlmICghbSlcbi0tXG5tbS9odWdldGxiLmMtMzA4Ny1cdFx0XHRcdCAgICBcdTAwMjZodWdldGxiX2Jvb3RtZW1fbm9kZXMpIHtcbm1tL2h1Z2V0bGIuYzozMDg4Olx0XHRtID0gYWxsb2NfYm9vdG1lbShoLCBub2RlLCBmYWxzZSk7XG5tbS9odWdldGxiLmMtMzA4OS1cdFx0aWYgKCFtKVxuLS1cbm1tL2h1Z2V0bGIuYz0zMzY0PXN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX2hzdGF0ZV9hbGxvY19wYWdlc19vbmVub2RlKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQpXG4tLVxubW0vaHVnZXRsYi5jLTMzNzEtXHRcdGlmIChoc3RhdGVfaXNfZ2lnYW50aWMoaCkpIHtcbm1tL2h1Z2V0bGIuYzozMzcyOlx0XHRcdGlmICghYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2UoaCwgbmlkKSlcbm1tL2h1Z2V0bGIuYy0zMzczLVx0XHRcdFx0YnJlYWs7XG4tLVxubW0vaHVnZXRsYi5jPTM0NjU9c3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGh1Z2V0bGJfZ2lnYW50aWNfcGFnZXNfYWxsb2NfYm9vdChzdHJ1Y3QgaHN0YXRlICpoKVxuLS1cbm1tL2h1Z2V0bGIuYy0zNDY5LVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaC1cdTAwM2VtYXhfaHVnZV9wYWdlczsgJiM0MzsmIzQzO2kpIHtcbm1tL2h1Z2V0bGIuYzozNDcwOlx0XHRpZiAoIWFsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKGgsIE5VTUFfTk9fTk9ERSkpXG5tbS9odWdldGxiLmMtMzQ3MS1cdFx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjk3NQoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDE5NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbioqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIHRvdWNoaW5nIGBtbS9tZW1ibG9jay5jYCBhbmQgYG1tL2h1Z2V0bGIuY2Ag4oCTIGludGVyZXN0aW5nLiBQYXJ0aWN1bGFybHksIEkgc2VlIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCBpcyB1c2VkIGluIGBhbGxvY19ib290bWVtYCB3aGljaCBsaXZlcyBpbiBgbW0vaHVnZXRsYi5jYC4gVGhhdCBzY3JlYW1zIHBvdGVudGlhbCwgdGhpcyBsb29rcyBsaWtlIGEgZ29vZCB0YXJnZXQgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgd29ydGggaW52ZXN0aWdhdGluZyBtb3JlIGNsb3NlbHkuCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zIHdpdGhpbiB0aGF0IGFyZWEgdGhhdCB3YXJyYW50IGRlZXBlciBleGFtaW5hdGlvbi4gSSYjMzk7bSBzZWVpbmcgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcmFkaXggdHJlZXMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHRoYXQgSSBzaG91bGQgZm9jdXMgb246CgoqICAgYGtob19yYWRpeF9hZGRfa2V5YAoqICAgYGtob19yYWRpeF9kZWxfa2V5YAoqICAgYGtob19yYWRpeF93YWxrX3RyZWVgCiogICBga2hvX3JhZGl4X2luaXRfdHJlZWAKKiAgIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYAoqICAgYGtob19leHRlbmRfc2NyYXRjaGAKKiAgIGBraG9fbWVtb3J5X2luaXRfZWFybHlgCiogICBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAKKiAgIGBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlYAoqICAgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgCgpMZXQmIzM5O3MgYmVnaW4gYnkgY2hlY2tpbmcgdG8gc2VlIGlmIGBraG9fcmFkaXhfYWRkX2tleWAgaXMgZXhwb3J0ZWQgb3IgdXNlZC4gVGhpcyBjb3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2hvX3JhZGl4X2FkZF9rZXkmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oPTQ2PXN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiB7XG4tLVxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTUyLVxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oOjUzOmludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KTtcbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaC01NC12b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpO1xuLS1cbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaD01OD12b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNjEtXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg6NjI6c3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSlcbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaC02My17XG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xNzg9c3RhdGljIHZvaWQgX19yZWYga2hvX3JhZGl4X2ZyZWVfbm9kZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGUpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODYtLyoqXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjE4NzogKiBraG9fcmFkaXhfYWRkX2tleSAtIEFkZCBhIGtleSB0byB0aGUgcmFkaXggdHJlZS5cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTg4LSAqIEB0cmVlOiBUaGUgS0hPIHJhZGl4IHRyZWUuXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0yMDItICovXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjIwMzppbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSlcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMjA0LXtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTI3MS19XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjI3MjpFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTI3My1cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTkzMz1zdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbGVhZih1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTk0NC1cdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjk0NTpcdFx0ZXJyID0ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgc3RhcnQgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy05NDYtXHRcdGlmIChlcnIpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz05NTY9c3RhdGljIGludCBfX2luaXQga2hvX2V4dF93YWxrX25vZGUocGh5c19hZGRyX3QgcGh5cywgdm9pZCAqZGF0YSlcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTk2MC1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6OTYxOlx0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIHBoeXMgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy05NjItfVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTE0OT1pbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTU4LVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTU5Olx0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNjAtXHRcdFx0XHRcdFx0XHQgICAgb3JkZXIpKTtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEyMjQ9aW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNDEtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyNDI6XHRcdGVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNDMtXHRcdFx0XHRcdFx0XHRcdCAgIG9yZGVyKSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQ1MzMKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcyBvbiBjaGVja2luZyBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAsIHN1bW1hcml6ZWQgYXMgaWYgSSYjMzk7bSB0aGlua2luZyBpdDoKCioqQW5hbHl6aW5nIHRoZSBBbGxvY2F0aW9uIG9mIEh1Z2VUTEIgTWVtb3J5KioKCkFscmlnaHQsIHRpbWUgdG8gZ2V0IGludG8gdGhlIGRldGFpbHMuIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAuIE15IGluaXRpYWwgZm9jdXMgaXMgb24gKmhvdyogdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgSHVnZVRMQiBtZW1vcnkuIFRoaXMgaW1wbGllcyBhIGRlZXBlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBtYW5hZ2VtZW50IG1lY2hhbmlzbXMsIGxpa2VseSBpbnZvbHZpbmcgcGFnZSB0YWJsZSBtYW5pcHVsYXRpb24sIHBoeXNpY2FsIGFkZHJlc3MgYWxsb2NhdGlvbiwgYW5kIHBvdGVudGlhbCBjb25zaWRlcmF0aW9ucyBmb3IgTlVNQSBhcmNoaXRlY3R1cmVzLiBJJiMzOTtsbCBuZWVkIHRvIHNlZSBob3cgaXQgaW50ZWdyYXRlcyB3aXRoIHRoZSBleGlzdGluZyBgbWVtYmxvY2tgIHN5c3RlbSwgcGFydGljdWxhcmx5IGhvdyB0aGUgcmVzZXJ2ZWQgbWVtb3J5IHJlZ2lvbnMgZm9yIEh1Z2VUTEJzIGFyZSBtYW5hZ2VkIGFuZCBpZiB0aGVyZSBpcyBhbnkgb3ZlcmxhcCB3aXRoIG90aGVyIG1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZXMuIEkmIzM5O2xsIGFsc28gYmUgc2VhcmNoaW5nIGZvciBhbnkgcG90ZW50aWFsIG9wdGltaXphdGlvbiwgYW5kIHdpbGwgYmUgd2F0Y2hpbmcgaG93IGl0IGRlYWxzIHdpdGggZnJhZ21lbnRhdGlvbiBhbmQgcG90ZW50aWFsIGVycm9ycy4gTGV0JiMzOTtzIHNlZSBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHRoZSB3aG9sZSB0aGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVtYmxvY2tfYWxsb2NfaHVnZXRsYiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L21lbWJsb2NrLmg9NDIyPXZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXG4tLVxuaW5jbHVkZS9saW51eC9tZW1ibG9jay5oLTQyNC1cdFx0XHQgICAgIGludCBuaWQpO1xuaW5jbHVkZS9saW51eC9tZW1ibG9jay5oOjQyNTp2b2lkICptZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKTtcbmluY2x1ZGUvbGludXgvbWVtYmxvY2suaC00MjYtXG4tLVxubW0vaHVnZXRsYi5jPTMwMjg9c3RhdGljIF9faW5pdCB2b2lkICphbGxvY19ib290bWVtKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQsIGJvb2wgbm9kZV9leGFjdClcbi0tXG5tbS9odWdldGxiLmMtMzAzNS1cdGVsc2Uge1xubW0vaHVnZXRsYi5jOjMwMzY6XHRcdG0gPSBtZW1ibG9ja19hbGxvY19odWdldGxiKGh1Z2VfcGFnZV9zaXplKGgpLCBuaWQsIG5vZGVfZXhhY3QpO1xubW0vaHVnZXRsYi5jLTMwMzctXHRcdGlmIChtKSB7XG4tLVxubW0vaHVnZXRsYi5jLTMwNDQtXHRcdFx0ICogZnJvbS4gVGhhdCBub2RlIG1heSBiZSBkaWZmZXJlbnQgaW4gdGhlIGNhc2Ugb2Zcbm1tL2h1Z2V0bGIuYzozMDQ1Olx0XHRcdCAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJfYm9vdG1lbS4gU28sXG5tbS9odWdldGxiLmMtMzA0Ni1cdFx0XHQgKiBleHRyYWN0IHRoZSBhY3R1YWwgbm9kZSBmaXJzdC5cbi0tXG5tbS9tZW1ibG9jay5jPTE3NTE9dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY190cnlfbmlkX3Jhdyhcbi0tXG5tbS9tZW1ibG9jay5jLTE3NjQtLyoqXG5tbS9tZW1ibG9jay5jOjE3NjU6ICogbWVtYmxvY2tfYWxsb2NfaHVnZXRsYiAtIGFsbG9jYXRlIGJvb3QgbWVtb3J5IGZvciBIdWdlVExCIHBhZ2VzXG5tbS9tZW1ibG9jay5jLTE3NjYtICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xuLS1cbm1tL21lbWJsb2NrLmMtMTc3Ny0gKi9cbm1tL21lbWJsb2NrLmM6MTc3ODp2b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIocGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpXG5tbS9tZW1ibG9jay5jLTE3Nzkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTI3MAoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGFuIGV4cGVydCBpbiB0aGUgZmllbGQgYW5kIGNvbnNpZGVyaW5nIGl0IGFzIG15IG93biB0aG91Z2h0OgoKKipDaGVja2luZyBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgdG8gaXQuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IGBraG9fc2NyYXRjaF9vdmVybGFwYC4gVGhpcyB2YXJpYWJsZSBvciBwcm9jZXNzIGxpa2VseSByZWxhdGVzIHRvIGEgY3JpdGljYWwgYXNwZWN0IG9mIG15IGN1cnJlbnQgcHJvamVjdCwgd2hhdGV2ZXIgdGhhdCBpcywgbGlrZWx5IGBraG9gLCB3aGljaCBiYXNlZCBvbiB0aGUgdmFyaWFibGUgbmFtZSBpcyB0aGUgb3ZlcmFyY2hpbmcgcHJvamVjdCBuYW1lLiBJIHN1c3BlY3QgdGhpcyBlaXRoZXIgcmVsYXRlcyB0byBob3cgZGlmZmVyZW50IGBraG9gIGl0ZXJhdGlvbnMgb3IgY29tcG9uZW50cyBpbnRlcmFjdC4gT3IgdGhlIGRhdGEgaXMgcmVsYXRlZCB0byBvdmVybGFwLCB3aGljaCBjb3VsZCBiZSBzcGF0aWFsLCB0ZW1wb3JhbCwgYWxnb3JpdGhtaWMsIG9yIHNlbWFudGljLiBJJiMzOTttIHByb2JhYmx5IHRyeWluZyB0byBhc3Nlc3MgaXRzIHZhbGlkaXR5LCBjb21wbGV0ZW5lc3MsIG9yIHBlcmhhcHMgaXRzIGltcGFjdCBvbiBzb21ldGhpbmcgZWxzZS4gU3BlY2lmaWNhbGx5LCAmIzM0O3NjcmF0Y2gmIzM0OyBwcm9iYWJseSBtZWFucyBpdCYjMzk7cyBhbiBpbnRlcm1lZGlhdGUgY2FsY3VsYXRpb24gb3IgdGVtcG9yYXJ5IGhvbGRpbmcgc3BvdC4gSSBoYXZlIHRvIHNlZSBob3cgaXQmIzM5O3Mgd29ya2luZyBhbmQgZnVuY3Rpb25pbmcuIFRoaXMgd2lsbCBiZSBrZXkuIERlcGVuZGluZyBvbiB3aGF0IGl0IGlzLCBJIGhhdmUgY2VydGFpbiBhc3N1bXB0aW9ucyBhYm91dCBpdHMgY2hhcmFjdGVyaXN0aWNzLCBhbmQgSSBuZWVkIHRvIHZlcmlmeSB0aGF0IHRob3NlIGhvbGQgdHJ1ZS4gVGhlICYjMzQ7b3ZlcmxhcCYjMzQ7IHBhcnQgcHJvYmFibHkgdGVsbHMgbWUgdGhlIGRhdGEgaGFzIGR1cGxpY2F0ZXMgb3IgYSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgY29uc29saWRhdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraG9fc2NyYXRjaF9vdmVybGFwJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0zOD12b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sIHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cyxcbi0tXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtNDAtXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6NDE6Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC00Mi12b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTExNz1zdGF0aWMgaW5saW5lIHZvaWQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcbi0tXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMTIxLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjEyMjpzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMjMte1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9Nzc1PXN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgc2NyYXRjaF9zaXplX25vZGUoaW50IG5pZClcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTc5Mi1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6NzkzOmJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtNzk0LXtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTExNDk9aW50IGtob19wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE1NS1cdGlmIChJU19FTkFCTEVEKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRykgXHUwMDI2XHUwMDI2XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExNTY6XHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCwgUEFHRV9TSVpFIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTU3LVx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEyMjQ9aW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMzMtXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpIFx1MDAyNlx1MDAyNlxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjM0Olx0ICAgIFdBUk5fT04oa2hvX3NjcmF0Y2hfb3ZlcmxhcChzdGFydF9wZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMzUtXHRcdFx0XHRcdG5yX3BhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSkpIHtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTE5MDI9dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xOTA5LVx0Lypcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTkxMDpcdCAqIGtob19zY3JhdGNoX292ZXJsYXAoKSBuZWVkcyBraG9fc2NyYXRjaCB0byBiZSBpbml0aWFsaXplZC4gSXRcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkxMS1cdCAqIGlzIHVzZWQgYnkgZnJlZV9hcmVhX2luaXQoKSBvbiBLSE8gYm9vdHMsIHNvIGluaXRpYWxpemUgaXRcbi0tXG5tbS9tZW1ibG9jay5jPTE3Nzg9dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxuLS1cbm1tL21lbWJsb2NrLmMtMTgxMC1cdCAqL1xubW0vbWVtYmxvY2suYzoxODExOlx0aWYgKGtob19zY3JhdGNoX292ZXJsYXAoYWRkciwgc2l6ZSkpIHtcbm1tL21lbWJsb2NrLmMtMTgxMi1cdFx0aWYgKG1lbWJsb2NrX2JvdHRvbV91cCgpKVxuLS1cbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaD02Mz1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuLS1cbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaC02OC1cbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaDo2OTpzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaC03MC17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2NTU0CgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSYjMzk7bSB0YWtpbmcgYSBsb29rIGF0IHRoaXMgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIHRoaW5nLiBCYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIGl0JiMzOTtzIHByZXR0eSBjbGVhciB0aGlzIGlzIHByb2JhYmx5IHJlbGF0ZWQgdG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIGEgc2NyYXRjaCBlbnZpcm9ubWVudCBhbmQgcG9zc2libHkgc29tZXRoaW5nIHJlbGF0ZWQgdG8gbWlncmF0aW5nIHNvbWUgZGF0YSB0eXBlIG9yIHNjaGVtYS4gSSYjMzk7bSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCBwb3RlbnRpYWwgdXNlIGNhc2VzIGFuZCBnb3RjaGFzLiBJcyB0aGlzIGZvciBhIHNwZWNpZmljIGRhdGFiYXNlIHN5c3RlbT8gSXMgdGhlcmUgc29tZSBraW5kIG9mIHZlcnNpb25pbmcgb3IgY29tcGF0aWJpbGl0eSBjb25jZXJuIHRoYXQgSSBuZWVkIHRvIGtlZXAgaW4gbWluZD8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBzaW1wbGUgY29weSwgb3Igc29tZSBzb3J0IG9mIGRhdGEgdHJhbnNmb3JtYXRpb24/IFRoZSBpbXBsaWNhdGlvbnMgY291bGQgYmUgd2lkZS1yYW5naW5nLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgc2NyYXRjaCBlbnZpcm9ubWVudCBpcyBmb3IsIGFuZCBwcmVjaXNlbHkgd2hhdCBkYXRhIG1pZ3JhdGlvbiBpcyBpbnZvbHZlZC4gRnJvbSB0aGVyZSwgSSBjYW4gZGV0ZXJtaW5lIHRoZSBwb3RlbnRpYWwgY29tcGxleGl0eSBhbmQgcmlza3MuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLCBlcnJvciBoYW5kbGluZywgbG9nZ2luZywgYW5kIHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zLiBNeSBtaW5kIHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIHNjZW5hcmlvcyBxdWlja2x5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD00MT1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpO1xuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjQyOnZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC00My0jZWxzZVxuLS1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0xMjI9c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTEyNi1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDoxMjc6c3RhdGljIGlubGluZSB2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMTI4LVx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz03OTM9Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODEyLSAqL1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzo4MTM6dm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTgxNC17XG4tLVxubW0vbW1faW5pdC5jPTY5ND12b2lkIF9fbWVtaW5pdCBfX2luaXRfcGFnZV9mcm9tX25pZCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcbi0tXG5tbS9tbV9pbml0LmMtNzEyLVx0XHQvKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBpbiBjYXNlIGl0IGlzIEtITyBzY3JhdGNoLiAqL1xubW0vbW1faW5pdC5jOjcxMzpcdFx0a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShwZm4sIHBmbiAmIzQzOyAxKTtcbm1tL21tX2luaXQuYy03MTQtXHR9XG4tLVxubW0vbW1faW5pdC5jPTg3NT12b2lkIF9fbWVtaW5pdCBtZW1tYXBfaW5pdF9yYW5nZSh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZSxcbi0tXG5tbS9tbV9pbml0LmMtOTUwLVx0ICovXG5tbS9tbV9pbml0LmM6OTUxOlx0a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIHBmbik7XG5tbS9tbV9pbml0LmMtOTUyLX1cbi0tXG5tbS9tbV9pbml0LmM9MjAyMz1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZGVmZXJyZWRfaW5pdF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSxcbi0tXG5tbS9tbV9pbml0LmMtMjA0NC1cdCAqL1xubW0vbW1faW5pdC5jOjIwNDU6XHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgZW5kX3Bmbik7XG5tbS9tbV9pbml0LmMtMjA0Ni1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjc0NjcKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCoqCgpPa2F5LCB0aW1lIHRvIGRpc3NlY3QgdGhpcy4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIGBraG9fbWVtb3J5X2luaXRfZWFybHlgLiBUaGF0IGZ1bmN0aW9uIG5hbWUgaXRzZWxmIGlzIHByZXR0eSBpbmRpY2F0aXZlLiAmIzM0O0Vhcmx5JiMzNDsgc3VnZ2VzdHMgaXQmIzM5O3MgYSBjcml0aWNhbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBsaWtlbHkgZXhlY3V0ZWQgYmVmb3JlIGEgc2lnbmlmaWNhbnQgcG9ydGlvbiBvZiB0aGUgc3lzdGVtIGlzIHVwIGFuZCBydW5uaW5nLiBJJiMzOTttIGltbWVkaWF0ZWx5IHRoaW5raW5nIGxvdy1sZXZlbCwgcHJvYmFibHkgZGVhbGluZyB3aXRoIGhhcmR3YXJlLCBtZW1vcnkgbWFwcGluZywgb3IgYXQgbGVhc3Qgc2V0dGluZyB1cCB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4KCk15IHByaW1hcnkgY29uY2VybiBub3cgaXMgdW5kZXJzdGFuZGluZyBpdHMgc2NvcGUuIERvZXMgaXQgZGVhbCB3aXRoIGp1c3QgdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnksIG9yIGlzIGl0IHNldHRpbmcgdXAgaW5pdGlhbCBtYXBwaW5ncyBmb3IgdXNlciBzcGFjZSB0b28sIGV2ZW4gYXQgdGhpcyBzdGFnZT8gVGhhdCB3b3VsZCBiZSBpbnRlcmVzdGluZywgYW5kIHBvdGVudGlhbGx5IHRyaWNreSwgcmVxdWlyaW5nIGNhcmVmdWwgYXR0ZW50aW9uIHRvIGFkZHJlc3Mgc3BhY2VzLgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBzcGVjaWZpYyBoYXJkd2FyZSBjb250ZXh0cyB0aGlzIGZ1bmN0aW9uIGlzIG9wZXJhdGluZyB1bmRlci4gRG9lcyB0aGlzIHJvdXRpbmUgZGVhbCB3aXRoIE1NVSBjb25maWd1cmF0aW9uLCBwYWdlIHRhYmxlIGluaXRpYWxpemF0aW9uLCBvciBpcyBpdCBtb3JlIHJlbGF0ZWQgdG8gYm9vdGxvYWRlci1saWtlIGFjdGl2aXRpZXMgbGlrZSByZXNlcnZpbmcgbWVtb3J5IHJlZ2lvbnM/IElzIHRoZXJlIGFueXRoaW5nIHNwZWNpZmljIGFib3V0IHRoZSBhcmNoaXRlY3R1cmUgKGUuZy4sIEFSTSwgeDg2KSB0aGF0IHNob3VsZCBkaWN0YXRlIG15IGFuYWx5c2lzPwoKSSYjMzk7bSBtZW50YWxseSBwcmVwYXJpbmcgZm9yIGEgZGVlcCBkaXZlIGludG8gdGhlIGNvZGUuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBhdCBhbnkgaW5jbHVkZWQgaGVhZGVycyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwb3RlbnRpYWwgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGluaXRpYWwgcm91dGluZXMuIEkgZXhwZWN0IHRvIGJlIGxvb2tpbmcgZm9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGVzcGVjaWFsbHkgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBtdWx0aXBsZSBwYXJ0cyBvZiB0aGUgYm9vdCBwcm9jZXNzLiBEZWJ1Z2dpbmcgdGhpcyB0eXBlIG9mIGZ1bmN0aW9uIGlzIGFsd2F5cyBmdW4hIExldCYjMzk7cyBnZXQgZ29pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tob19tZW1vcnlfaW5pdF9lYXJseSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9MzU9dm9pZCBraG9fbWVtb3J5X2luaXQodm9pZCk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MzY6dm9pZCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZCk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMzctXG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTExMz1zdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpIHsgfVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTExNC1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDoxMTU6c3RhdGljIGlubGluZSB2b2lkIGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKSB7IH1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMTYtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xOTAwPWZzX2luaXRjYWxsKGtob19pbml0KTtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkwMS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTkwMjp2b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZClcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkwMy17XG4tLVxubW0vbW1faW5pdC5jPTI3MDQ9dm9pZCBfX2luaXQgbW1fY29yZV9pbml0X2Vhcmx5KHZvaWQpXG5tbS9tbV9pbml0LmMtMjcwNS17XG5tbS9tbV9pbml0LmM6MjcwNjpcdGtob19tZW1vcnlfaW5pdF9lYXJseSgpO1xubW0vbW1faW5pdC5jLTI3MDctXHRodWdldGxiX2NtYV9yZXNlcnZlKCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MTg2CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogMjY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgS2V4ZWMgSGFuZG92ZXI6IEEgU3RyYXRlZ3kqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBpbnRyb2R1Y2luZyBLZXhlYyBIYW5kb3ZlciAoS0hPKSBmdW5jdGlvbmFsaXR5IGFuZCBtZXNzaW5nIHdpdGggaG93IHRoZSBrZXJuZWwgYWxsb2NhdGVzIG1lbW9yeSBmb3IgaHVnZSBwYWdlcyAoaHVnZXRsYikgdXNpbmcgbWVtYmxvY2suIE15IGd1dCBzYXlzOiAqKmZ1enogdGhpcyEqKiBUaGlzIGhpdHMgKmNvcmUqIGtlcm5lbCBsb2dpYyDigJMgbWVtYmxvY2ssIG1tX2luaXQsIGh1Z2V0bGIg4oCTIGFuZCwgY3J1Y2lhbGx5LCBhZGRzIGVudGlyZWx5IG5ldyBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIGR1cmluZyBib3RoIGJvb3QgYW5kIHJ1bnRpbWUuIFRoYXQmIzM5O3MgYSBmdXp6aW5nIGdvbGRtaW5lIHJpZ2h0IHRoZXJlLgoKSG1tLCBsZXQmIzM5O3Mgc2VlLCBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCBpcyBjYWxsZWQgZnJvbSBgbW1fY29yZV9pbml0X2Vhcmx5YC4gQW5kIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCBpcyBhY3R1YWxseSB1c2VkIHdpdGggYGFsbG9jX2Jvb3RtZW1gIGluIGBtbS9odWdldGxiLmNgLiBUaGVzZSBhcmUgYm9vdC10aW1lIGZ1bmN0aW9ucy4gQ2FuIHdlIGV2ZW4gZnV6eiB0aGVtIGVmZmVjdGl2ZWx5PwoKU3l6Ym90IGlzIGFtYXppbmcsIGJ1dCB0eXBpY2FsbHkgaXQgaGl0cyB0aGluZ3MgcG9zdC1ib290LiBIb3dldmVyLCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBmdXp6IGJvb3QgcGFyYW1ldGVycyB0byBpbmZsdWVuY2UgdGhlc2UgZWFybHkgc3RhZ2VzLCBvciBwZXJoYXBzIFN5emJvdCBjb3VsZCB0cmlnZ2VyIEtITyBkaXJlY3RseSBpZiBpdOKAmXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UuCgpBbHJpZ2h0LCB0aGUgcGxvdCB0aGlja2Vucy4gYGtob19yYWRpeF9hZGRfa2V5YCBhbmQgYGtob19yYWRpeF9kZWxfa2V5YCBhcmUgZXhwb3J0ZWQgc3ltYm9scy4gVGhhdCYjMzk7cyBodWdlISBBbmQgdGhleeKAmXJlIGNhbGxlZCBmcm9tIGBraG9fcHJlc2VydmVfZm9saW9gLCBga2hvX3VucHJlc2VydmVfZm9saW9gLCBga2hvX3ByZXNlcnZlX3BhZ2VzYCwgYW5kIGBraG9fdW5wcmVzZXJ2ZV9wYWdlc2AuIFRob3NlIGZ1bmN0aW9ucyBhcmUgaG93IGRyaXZlcnMgYW5kIHN1YnN5c3RlbXMgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aCBwcmVzZXJ2aW5nIG1lbW9yeSBhY3Jvc3MgYSBrZXhlYyB0cmFuc2l0aW9uISBUaGF0IG1lYW5zIHJ1bnRpbWUgZXhwb3N1cmUuIEV4Y2VsbGVudC4gVGhpcyBzaWduaWZpY2FudGx5IGluY3JlYXNlcyB0aGUgZnV6emluZyBhdHRhY2sgc3VyZmFjZSwgYmVjYXVzZSBub3cgd2UgY2FuIHBvdGVudGlhbGx5IGhpdCB0aGVzZSBkdXJpbmcgcnVudGltZSEKCkkgdGhpbmsgSSB3aWxsIGNoZWNrIHRvIHNlZSBob3cgYGtob19wcmVzZXJ2ZV9mb2xpb2AgaXMgdXNlZCBlbHNld2hlcmUgaW4gdGhlIGtlcm5lbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2hvX3ByZXNlcnZlX2ZvbGlvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0xNz1ib29sIGlzX2tob19ib290KHZvaWQpO1xuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTE4LVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjE5OmludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbyk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMjAtdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9NDk9c3RhdGljIGlubGluZSBib29sIGlzX2tob19ib290KHZvaWQpXG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTUzLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjU0OnN0YXRpYyBpbmxpbmUgaW50IGtob19wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTU1LXtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTExMzg9RVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JlbW92ZV9zdWJ0cmVlKTtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNDAtLyoqXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExNDE6ICoga2hvX3ByZXNlcnZlX2ZvbGlvIC0gcHJlc2VydmUgYSBmb2xpbyBhY3Jvc3Mga2V4ZWMuXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNDItICogQGZvbGlvOiBmb2xpbyB0byBwcmVzZXJ2ZS5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNDgtICovXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExNDk6aW50IGtob19wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTUwLXtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNjEtfVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTYyOkVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9mb2xpbyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNjMtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTY4LSAqIEluc3RydWN0cyBLSE8gdG8gdW5wcmVzZXJ2ZSBhIGZvbGlvIHRoYXQgd2FzIHByZXNlcnZlZCBieVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTY5OiAqIGtob19wcmVzZXJ2ZV9mb2xpbygpIGJlZm9yZS4gVGhlIHByb3ZpZGVkIEBmb2xpbyAocGZuIGFuZCBvcmRlcilcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE3MC0gKiBtdXN0IGV4YWN0bHkgbWF0Y2ggYSBwcmV2aW91c2x5IHByZXNlcnZlZCBmb2xpby5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTE1NDc9dm9pZCAqa2hvX2FsbG9jX3ByZXNlcnZlKHNpemVfdCBzaXplKVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTU2Mi1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTU2MzpcdHJldCA9IGtob19wcmVzZXJ2ZV9mb2xpbyhmb2xpbyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTE1NjQtXHRpZiAocmV0KSB7XG4tLVxubGliL3Rlc3Rfa2hvLmM9NTQ9c3RhdGljIGludCBraG9fdGVzdF9wcmVzZXJ2ZV9kYXRhKHN0cnVjdCBraG9fdGVzdF9zdGF0ZSAqc3RhdGUpXG4tLVxubGliL3Rlc3Rfa2hvLmMtNzUtXHRcdGZvbGlvc19pbmZvW2ldID0gdmlydF90b19waHlzKGZvbGlvX2FkZHJlc3MoZm9saW8pKSB8IG9yZGVyO1xubGliL3Rlc3Rfa2hvLmM6NzY6XHRcdGVyciA9IGtob19wcmVzZXJ2ZV9mb2xpbyhmb2xpbyk7XG5saWIvdGVzdF9raG8uYy03Ny1cdFx0aWYgKGVycilcbi0tXG5saWIvdGVzdF9raG8uYz0xMjQ9c3RhdGljIGludCBraG9fdGVzdF9wcmVzZXJ2ZShzdHJ1Y3Qga2hvX3Rlc3Rfc3RhdGUgKnN0YXRlKVxuLS1cbmxpYi90ZXN0X2toby5jLTEzMy1cbmxpYi90ZXN0X2toby5jOjEzNDpcdGVyciA9IGtob19wcmVzZXJ2ZV9mb2xpbyhzdGF0ZS1cdTAwM2VmZHQpO1xubGliL3Rlc3Rfa2hvLmMtMTM1LVx0aWYgKGVycilcbi0tXG5tbS9tZW1mZF9sdW8uYz04Nz1zdGF0aWMgaW50IG1lbWZkX2x1b19wcmVzZXJ2ZV9mb2xpb3Moc3RydWN0IGZpbGUgKmZpbGUsXG4tLVxubW0vbWVtZmRfbHVvLmMtMTUxLVxubW0vbWVtZmRfbHVvLmM6MTUyOlx0XHRlcnIgPSBraG9fcHJlc2VydmVfZm9saW8oZm9saW8pO1xubW0vbWVtZmRfbHVvLmMtMTUzLVx0XHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTgxNwoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDI4MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlICYjMzk7a2hvJiMzOTsgYW5kICYjMzk7bWVtZmRfbHVvJiMzOTsgQ29kZSoqCgpPa2F5LCBzbyBgbWVtZmRfbHVvLmNgIGlzIGRlZmluaXRlbHkgbWFraW5nIHVzZSBvZiB0aGlzLCB3aGljaCBtYWtlcyBtZSB0aGluayBpdCYjMzk7cyBsaWtlbHkgYSBtZW1mZCBleHRlbnNpb24gcmVsYXRlZCB0byBsaXZlIHVwZGF0ZXMuIEludGVyZXN0aW5nLiBBbmQgdGhlbiBJIHNlZSBpdCBhZ2FpbiBpbiBgbGliL3Rlc3Rfa2hvLmNgLiAgVGhhdCBtZWFucyBga2hvX3ByZXNlcnZlX2ZvbGlvYCBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSwgd2hpY2ggaXMgYSBrZXkgcG9pbnQgdG8gcmVtZW1iZXIuCgpOb3csIGxldCYjMzk7cyB0aGluayBhYm91dCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAuICBJIGtub3cgdGhhdCYjMzk7cyBjYWxsZWQgZnJvbSBgYWxsb2NfYm9vdG1lbWAgaW4gYG1tL2h1Z2V0bGIuY2AuIFRoYXQmIzM5O3MgYWxsb2NhdGVkIGR1cmluZyBib290IHdoZW4gaHVnZXRsYiBwYWdlcyBnZXQgYWxsb2NhdGVkLiAgSGFuZyBvbi4uLiBgYWxsb2NfYm9vdG1lbWAgaXMgbGlua2VkIHdpdGggdGhlIGBodWdlcGFnZXM9YCBrZXJuZWwgY29tbWFuZC1saW5lIG9wdGlvbiwgcmlnaHQ/ICBXb3VsZCBmdXp6aW5nIGJlIHVzZWZ1bCBoZXJlPyBQcm9iYWJseSBub3QsIHNpbmNlIGBhbGxvY19ib290bWVtYCBpcyBgX19pbml0YCwgc28gaXQgd291bGQgYmUgYSBib290IHRpbWUgaXNzdWUgYW5kIGxlc3MgdXNlZnVsIHRvIHN5emJvdC4KCkJ1dCB3YWl0LCBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBhbmQgYGtob19yYWRpeF93YWxrX3RyZWVgIGFyZSByZWFjaGFibGUgZHVyaW5nIHJ1bnRpbWUhIFRoYXQmIzM5O3MgcHJvbWlzaW5nLiBBbmQgYGtob19leHRlbmRfc2NyYXRjaGAgaXMgYF9faW5pdGAsIHNvIG5vdCBpbW1lZGlhdGVseSBmdXp6YWJsZS4gIFNpbWlsYXJseSwgYGtob19tZW1vcnlfaW5pdF9lYXJseWAgaXMgbWFya2VkIGFzIGBfX2luaXRgIGFzIHdlbGwuCgpUaGUgbW9yZSBpbnRlcmVzdGluZyBmaW5kIGlzIHRoYXQgYGtob19zY3JhdGNoX292ZXJsYXBgIGlzIGNhbGxlZCBmcm9tIGBraG9fcHJlc2VydmVfZm9saW9gIGFuZCBga2hvX3ByZXNlcnZlX3BhZ2VzYCwgYW5kIHdlJiMzOTt2ZSBhbHJlYWR5IGVzdGFibGlzaGVkIHRoYXQgdGhvc2UgY2FuIGJlIGNhbGxlZCBhdCBydW50aW1lLCB3aGljaCBpcyBhIGdyZWF0IHRhcmdldC4KCkxldCYjMzk7cyBkaWcgaW50byBga2hvX3ByZXNlcnZlX3BhZ2VzYCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhhdCBjYWxsIGNoYWluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraG9fcHJlc2VydmVfcGFnZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTIwPXZvaWQga2hvX3VucHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbyk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MjE6aW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMjItdm9pZCBraG9fdW5wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTU5PXN0YXRpYyBpbmxpbmUgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKSB7IH1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC02MC1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDo2MTpzdGF0aWMgaW5saW5lIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBucl9wYWdlcylcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC02Mi17XG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz01NDU9RVhQT1JUX1NZTUJPTF9HUEwoa2hvX3Jlc3RvcmVfZm9saW8pO1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtNTUyLSAqIFJlc3RvcmUgYSBjb250aWd1b3VzIGxpc3Qgb2Ygb3JkZXIgMCBwYWdlcyB0aGF0IHdhcyBwcmVzZXJ2ZWQgd2l0aFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzo1NTM6ICoga2hvX3ByZXNlcnZlX3BhZ2VzKCkuXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTU1NC0gKlxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTE4MD1FWFBPUlRfU1lNQk9MX0dQTChraG9fdW5wcmVzZXJ2ZV9mb2xpbyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExODEtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExODI6c3RhdGljIHVuc2lnbmVkIGludCBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcih1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE4My1cdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbilcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTExOTk9c3RhdGljIHZvaWQgX19raG9fdW5wcmVzZXJ2ZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjA0LVx0d2hpbGUgKHBmbiBcdTAwM2MgZW5kX3Bmbikge1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjA1Olx0XHRvcmRlciA9IF9fa2hvX3ByZXNlcnZlX3BhZ2VzX29yZGVyKHBmbiwgZW5kX3Bmbik7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMDYtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjE0LS8qKlxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjE1OiAqIGtob19wcmVzZXJ2ZV9wYWdlcyAtIHByZXNlcnZlIGNvbnRpZ3VvdXMgcGFnZXMgYWNyb3NzIGtleGVjXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMTYtICogQHBhZ2U6IGZpcnN0IHBhZ2UgaW4gdGhlIGxpc3QuXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjIzLSAqL1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjI0OmludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMjUte1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTIzOS1cdHdoaWxlIChwZm4gXHUwMDNjIGVuZF9wZm4pIHtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTI0MDpcdFx0dW5zaWduZWQgaW50IG9yZGVyID0gX19raG9fcHJlc2VydmVfcGFnZXNfb3JkZXIocGZuLCBlbmRfcGZuKTtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTI0MS1cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNTYtfVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjU3OkVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9wYWdlcyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNTgtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjY1LSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBAcGFnZSBhbmQgQG5yX3BhZ2VzIGFzIHRoZSBjb3JyZXNwb25kaW5nXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyNjY6ICoga2hvX3ByZXNlcnZlX3BhZ2VzKCkgY2FsbC4gVW5wcmVzZXJ2aW5nIGFyYml0cmFyeSBzdWItcmFuZ2VzIG9mIGxhcmdlclxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjY3LSAqIHByZXNlcnZlZCBibG9ja3MgaXMgbm90IHN1cHBvcnRlZC5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEzMTA9c3RhdGljIHN0cnVjdCBraG9fdm1hbGxvY19jaHVuayAqbmV3X3ZtYWxsb2NfY2h1bmsoc3RydWN0IGtob192bWFsbG9jX2NodW5rICpjdXIpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzE4LVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMzE5Olx0ZXJyID0ga2hvX3ByZXNlcnZlX3BhZ2VzKHZpcnRfdG9fcGFnZShjaHVuayksIDEpO1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzIwLVx0aWYgKGVycilcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEzNjA9aW50IGtob19wcmVzZXJ2ZV92bWFsbG9jKHZvaWQgKnB0ciwgc3RydWN0IGtob192bWFsbG9jICpwcmVzZXJ2YXRpb24pXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzg1LVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMzg2Olx0XHRlcnIgPSBraG9fcHJlc2VydmVfcGFnZXModm0tXHUwMDNlcGFnZXNbaV0sIG5yX2NvbnRpZ19wYWdlcyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEzODctXHRcdGlmIChlcnIpXG4tLVxubW0vbWVtYmxvY2suYz0yNjA4PXN0YXRpYyBpbnQgX19pbml0IHJlc2VydmVkX21lbV9wcmVzZXJ2ZSh2b2lkKVxuLS1cbm1tL21lbWJsb2NrLmMtMjYxNy1cbm1tL21lbWJsb2NrLmM6MjYxODpcdFx0ZXJyID0ga2hvX3ByZXNlcnZlX3BhZ2VzKHBhZ2UsIG5yX3BhZ2VzKTtcbm1tL21lbWJsb2NrLmMtMjYxOS1cdFx0aWYgKGVycilcbi0tXG5tbS9tZW1ibG9jay5jPTI2Mzc9c3RhdGljIGludCBfX2luaXQgcHJlcGFyZV9raG9fZmR0KHZvaWQpXG4tLVxubW0vbWVtYmxvY2suYy0yNjQ5LVx0ZmR0ID0gcGFnZV90b192aXJ0KGZkdF9wYWdlKTtcbm1tL21lbWJsb2NrLmM6MjY1MDpcdGVyciA9IGtob19wcmVzZXJ2ZV9wYWdlcyhmZHRfcGFnZSwgMSk7XG5tbS9tZW1ibG9jay5jLTI2NTEtXHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMTk1MQoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDQzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgdHJhY2luZyB0aGUgZnVuY3Rpb24gY2FsbHMuIEl0IGxvb2tzIGxpa2UgYGtob19wcmVzZXJ2ZV9wYWdlc2AgaXMga2V5LCBjYWxsZWQgYnkgYGtob19wcmVzZXJ2ZV92bWFsbG9jYCwgd2hpY2ggaXMgaW4gdHVybiB1c2VkIGJ5IGRyaXZlcnMgb3Igc3Vic3lzdGVtcyAtIGludGVyZXN0aW5nLiBUaGUgcGF0Y2ggbW9kaWZpZXMgYGtob19yYWRpeF9hZGRfa2V5YCBhbmQgYGtob19yYWRpeF9kZWxfa2V5YC4gVGhvc2UgYXJlIGNhbGxlZCBieSBga2hvX3ByZXNlcnZlX2ZvbGlvYCBhbmQgYGtob19wcmVzZXJ2ZV9wYWdlc2AsIHdoaWNoIG1ha2VzIHRoZW0gZ29vZCBjYW5kaWRhdGVzLiBUaGVyZSYjMzk7cyBhbHNvIHRoaXMgbmV3IGZ1bmN0aW9uLCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAsIHRoYXQmIzM5O3MgaW50cm9kdWNlZCBhbmQgYWxzbyBjYWxsZWQgYnkgYGtob19wcmVzZXJ2ZV9mb2xpb2AgYW5kIGBraG9fcHJlc2VydmVfcGFnZXNgLiBBbmQgdGhlbiB0aGVyZSYjMzk7cyBhIG1vZGlmaWNhdGlvbiB0byBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgY2FsbGVkIGJ5IGBhbGxvY19ib290bWVtYCwgZGVlcCBpbiBgbW0vaHVnZXRsYi5jYC4gUmlnaHQsIHRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBzb21lIGZ1enppbmcgZWZmb3J0LgoKTm93LCBsZXQmIzM5O3MgaWRlbnRpZnkgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyB0byBmb2N1cyBvbi4gSSYjMzk7dmUgZ290IGEgbGlzdCBmb3JtaW5nOiBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgLCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAsIGBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlYCwgYW5kIGBtZW1ibG9ja19hbGxvY19odWdldGxiYC4KCkhvbGQgb24sIEkgc2VlIGBraG9fZXh0ZW5kX3NjcmF0Y2hgIGFuZCBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCBhcmUgYF9faW5pdGAgZnVuY3Rpb25zLiBDYW4gc3l6Ym90IGV2ZW4gZnV6eiB0aG9zZT8gTm8sIG5vdCBkaXJlY3RseS4gU3l6Ym90IHRyaWdnZXJzIGBfX2luaXRgIGZ1bmN0aW9ucyBpZiB0aGV5IGFyZSBjYWxsZWQgZHVyaW5nIGJvb3QsIHNvIHRoZXkgYXJlbiYjMzk7dCBncmVhdCBjYW5kaWRhdGVzIGZvciB0aGUgYEZvY3VzU3ltYm9sc2AgbGlzdC4gVGhhdCBsaXN0IGlzIGZvciBmdXp6ZXIgdGFyZ2V0cy4gU28sIEkgd2lsbCBpbmNsdWRlIGBraG9fcmFkaXhfYWRkX2tleWAsIGBraG9fcmFkaXhfZGVsX2tleWAsIGBraG9fcmFkaXhfd2Fsa190cmVlYCwgYGtob19yYWRpeF9pbml0X3RyZWVgLCBga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZWAsIGFuZCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAuIEkgbmVlZCB0byBkb3VibGUtY2hlY2sgYGtob19yYWRpeF9pbml0X3RyZWVgIGFuZCBga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZWAgdGhvdWdoLiBUaGV5IGFyZSBleHBvcnRlZCBzeW1ib2xzLCBidXQgYXJlIHRoZXkgYWN0dWFsbHkgdXNlZCBvdXRzaWRlIHRoZWlyIG1vZHVsZT8gSSBzaG91bGQgbG9vayBpbnRvIHRoYXQgYmVmb3JlIGNvbW1pdHRpbmcgdGhpcyBhcyBhIHByb3BlciBmdXp6aW5nIHRhcmdldCBsaXN0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraG9fcmFkaXhfaW5pdF90cmVlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaD01NT1pbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNTYtXHRcdFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSk7XG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg6NTc6aW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpO1xuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTU4LXZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpO1xuLS1cbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaD03MD1zdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi0tXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNzUtXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg6NzY6c3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2luaXRfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNzctXHRcdFx0XHQgICAgICBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0zMjE9c3RhdGljIHZvaWQgX19raG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTM0MC0vKipcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MzQxOiAqIGtob19yYWRpeF9pbml0X3RyZWUgLSBpbml0aWFsaXplIHRoZSByYWRpeCB0cmVlLlxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNDItICogQHRyZWU6ICAgdGhlIHRyZWUgdG8gaW5pdGlhbGl6ZS5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTM1MC0gKi9cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MzUxOmludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNTIte1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMzYxLX1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MzYyOkVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpO1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNjMtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMDA2PXN0YXRpYyB2b2lkIF9faW5pdCBraG9fZXh0ZW5kX3NjcmF0Y2godm9pZClcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEwMTgtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEwMTk6XHRlcnIgPSBraG9fcmFkaXhfaW5pdF90cmVlKFx1MDAyNnJhZGl4LCBOVUxMKTtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTAyMC1cdGlmIChlcnIpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xODIwPXN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODI4LVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxODI5Olx0ZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZSh0cmVlLCBOVUxMKTtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTgzMC1cdGlmIChlcnIpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xOTAyPXZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkxOS1cdCAqL1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxOTIwOlx0aWYgKGtob19yYWRpeF9pbml0X3RyZWUoXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIGtob19nZXRfbWVtX21hcChmZHQpKSkge1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xOTIxLVx0XHQvKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMzg0MgoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDE1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBNZW50YWwgQ2hlY2tsaXN0IGZvciBNZW1vcnkgQWxsb2NhdGlvbiBGdW5jdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSBwdXR0aW5nIHRvZ2V0aGVyIGEgbWVudGFsIG1hcCBvZiB3aGVyZSB0aGVzZSBrZXkgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFyZSB1c2VkLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZSBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcsIGVzcGVjaWFsbHkgc2luY2UgdGhlc2UgZnVuY3Rpb25zIGFyZSBzbyBmdW5kYW1lbnRhbCB0byB0aGUgc3lzdGVtJiMzOTtzIG9wZXJhdGlvbi4gIEkga25vdyB0aGV5JiMzOTtyZSBkZWZpbml0ZWx5IGV4cG9ydGVkIGFuZCB1dGlsaXplZCBpbiBga2hvX2luaXRgLCBga2hvX2V4dGVuZF9zY3JhdGNoYCwgYW5kIGBraG9fbWVtb3J5X2luaXRfZWFybHlgLgoKSSBzaG91bGQgcHJvYmFibHkgYWxzbyBpbmNsdWRlIHRoZXNlIHJhZGl4IHRyZWUgZnVuY3Rpb25zIGluIG15IHRoaW5raW5nOiBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYW5kIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYC4gSSYjMzk7bSBhbHNvIHJlbWVtYmVyaW5nIGBraG9fc2NyYXRjaF9vdmVybGFwYCBhbmQgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIGFyZSBwcm9iYWJseSB3b3J0aCBsaXN0aW5nLiBBbmQgb2YgY291cnNlLCB0aGUgYmlnIG9uZTogYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgLgoKTGV0IG1lIHF1aWNrbHkgdmVyaWZ5IHNvbWV0aGluZyBhYm91dCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAuICBBaCwgeWVzLCB0aGF0JiMzOTtzIGRlZmluZWQgYXMgYF9faW5pdGAuIE5vdywgd2hhdCBhYm91dCBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWA/IEhtbSwgaXQgbG9va3MgbGlrZSBpdCBpc24mIzM5O3QgYF9faW5pdGAuIExldCBtZSBkb3VibGUtY2hlY2sgdGhhdC4uLiBqdXN0IHRvIGJlIGNlcnRhaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTQxPWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6NDI6dm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pO1xuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTQzLSNlbHNlXG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTEyMj1zdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbi0tXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMTI2LVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjEyNzpzdGF0aWMgaW5saW5lIHZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMjgtXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTc5Mz1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy04MTItICovXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjgxMzp2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbilcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODE0LXtcbi0tXG5tbS9tbV9pbml0LmM9Njk0PXZvaWQgX19tZW1pbml0IF9faW5pdF9wYWdlX2Zyb21fbmlkKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuLS1cbm1tL21tX2luaXQuYy03MTItXHRcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXG5tbS9tbV9pbml0LmM6NzEzOlx0XHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgcGZuICYjNDM7IDEpO1xubW0vbW1faW5pdC5jLTcxNC1cdH1cbi0tXG5tbS9tbV9pbml0LmM9ODc1PXZvaWQgX19tZW1pbml0IG1lbW1hcF9pbml0X3JhbmdlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyB6b25lLFxuLS1cbm1tL21tX2luaXQuYy05NTAtXHQgKi9cbm1tL21tX2luaXQuYzo5NTE6XHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgcGZuKTtcbm1tL21tX2luaXQuYy05NTItfVxuLS1cbm1tL21tX2luaXQuYz0yMDIzPXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkZWZlcnJlZF9pbml0X3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLFxuLS1cbm1tL21tX2luaXQuYy0yMDQ0LVx0ICovXG5tbS9tbV9pbml0LmM6MjA0NTpcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBlbmRfcGZuKTtcbm1tL21tX2luaXQuYy0yMDQ2LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDk1NAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE3OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbml0aWFsIEFzc2Vzc21lbnQgb2YgTWVtb3J5IEluaXRpYWxpemF0aW9uIEZ1bmN0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCBhbmQgYSBmZXcgdGhpbmdzIGp1bXAgb3V0LiBUaGUgZnVuY3Rpb24gYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIGlzbiYjMzk7dCBleHBsaWNpdGx5IG1hcmtlZCBhcyBhbiBgX19pbml0YCBmdW5jdGlvbiwgd2hpY2ggaXMgYSBiaXQgb2RkLCBidXQgSSBzZWUgaXQmIzM5O3MgY2FsbGVkIGZyb20gYm90aCBgX19pbml0YCBhbmQgYF9fbWVtaW5pdGAgZnVuY3Rpb25zLiBUaGF0JiMzOTtzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGBraG9fcmFkaXhfYWRkX2tleWAsIGBraG9fcmFkaXhfZGVsX2tleWAsIGFuZCBga2hvX3JhZGl4X3dhbGtfdHJlZWAgbG9vayBsaWtlIHByaW1lIGNhbmRpZGF0ZXMgZm9yIGZ1enppbmcuIFRoZXkgc2VlbSBsaWtlIGdvb2Qgc3RhcnRpbmcgcG9pbnRzIHRvIGxvb2sgZm9yIG1lbW9yeS1yZWxhdGVkIHZ1bG5lcmFiaWxpdGllcy4gYGtob19zY3JhdGNoX292ZXJsYXBgIHNlZW1zIHBvdGVudGlhbGx5IGludGVyZXN0aW5nIHRvbywgc28gSSYjMzk7bGwgaW5jbHVkZSBpdCBvbiB0aGUgbGlzdC4KCk5vdywgbGV0IG1lIHNoaWZ0IGdlYXJzIGFuZCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVudmlyb25tZW50IHRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIGluLiBJJiMzOTttIGdvaW5nIHRvIGNoZWNrIGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIGFuZCBgQ09ORklHX0hVR0VUTEJfUEFHRWAuIFJpZ2h0LCBgQ09ORklHX0tFWEVDX0hBTkRPVkVSYCBzZWVtcyB0byBiZSB0aGUgcHJpbWFyeSBjb25maWd1cmF0aW9uIGl0ZW0uIEFuZCBgQ09ORklHX0hVR0VUTEJfUEFHRWAgaXMgY3J1Y2lhbCBiZWNhdXNlIGl0JiMzOTtzIHJlcXVpcmVkIGZvciBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgdG8gYmUgdXNlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdCBjYWxsLiBXYWl0LCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgaXMgZGVmaW5lZCBpbiBgbW0vbWVtYmxvY2suY2AuIEl0JiMzOTtzIGRlZmluZWQgdGhlcmUsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGlzbiYjMzk7dCBjb21waWxlZCBjb25kaXRpb25hbGx5LiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIHRoZSBidWlsZCBjb25maWd1cmF0aW9ucyB0byB2ZXJpZnkgdGhpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVtYmxvY2tfYWxsb2NfaHVnZXRsYiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbWJsb2NrLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtYmxvY2suYz0xNzUxPXZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoXG4tLVxubW0vbWVtYmxvY2suYy0xNzY0LS8qKlxubW0vbWVtYmxvY2suYzoxNzY1OiAqIG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBmb3IgSHVnZVRMQiBwYWdlc1xubW0vbWVtYmxvY2suYy0xNzY2LSAqIEBzaXplOiAgICAgIHNpemUgb2YgdGhlIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXNcbi0tXG5tbS9tZW1ibG9jay5jLTE3NzctICovXG5tbS9tZW1ibG9jay5jOjE3Nzg6dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxubW0vbWVtYmxvY2suYy0xNzc5LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzU2ODYKCQkJCQkJCW91dHB1dDogMTk4CgkJCQkJCQl0aG91Z2h0czogMjQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRGVwZW5kZW5jaWVzIG9mIGEgQ29kZSBTbmlwcGV0KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBpZWNlIG9mIGNvZGUgYW5kIGl0JiMzOTtzIG5vdCBndWFyZGVkIGJ5IGFueSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBsaWtlIGAjaWZkZWZgLiBUaGF0JiMzOTtzIGEgbGl0dGxlIHVudXN1YWwuIEhvd2V2ZXIsIGFmdGVyIGEgcXVpY2sgY2hlY2ssIEkgY2FuIHNlZSB0aGF0IHRoaXMgY29kZSBpcyBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBgbW0vaHVnZXRsYi5jYC4gTm93LCBgbW0vaHVnZXRsYi5jYCBpdHNlbGYgaXMgb25seSBjb21waWxlZCB3aGVuIHRoZSBgQ09ORklHX0hVR0VUTEJfUEFHRWAgb3B0aW9uIGlzIGVuYWJsZWQgaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBUaGF0IG1lYW5zIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBhcmUgYEtFWEVDX0hBTkRPVkVSYCBhbmQgYEhVR0VUTEJfUEFHRWAuIFJpZ2h0LCBnb3QgaXQuCgpMZXQgbWUganVzdCBtYWtlIHN1cmUgdGhvc2UgYXJlIHByb3Blcmx5IHN1bW1hcml6ZWQ6CgoqICAgYEtFWEVDX0hBTkRPVkVSYAoqICAgYEhVR0VUTEJfUEFHRWAKCk5vdywgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGtleSBzeW1ib2xzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhpcy4gT2theSwgSSBzZWU6CgoqICAgYGtob19yYWRpeF9hZGRfa2V5YAoqICAgYGtob19yYWRpeF9kZWxfa2V5YAoqICAgYGtob19yYWRpeF93YWxrX3RyZWVgCiogICBga2hvX3JhZGl4X2luaXRfdHJlZWAKKiAgIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYAoqICAgYGtob19zY3JhdGNoX292ZXJsYXBgCiogICBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWAKKiAgIGBtZW1ibG9ja19hbGxvY19odWdldGxiYAoKSG1tLCBhZnRlciBhIHF1aWNrIGV2YWx1YXRpb24sIGBraG9fcmFkaXhfYWRkX2tleWAgYW5kIGBraG9fcmFkaXhfZGVsX2tleWAgc3RhbmQgb3V0IGFzIHRoZSBtb3N0IGNydWNpYWwgZnVuY3Rpb25zIGhlcmUsIGF0IGxlYXN0IGluIHRoZSBjb250ZXh0IG9mIHdoYXQgSSYjMzk7bSBsb29raW5nIGF0LiBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAgYWxzbyBzZWVtcyBwcmV0dHkgaW1wb3J0YW50LiBBbmQgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGxvb2tzIGxpa2UgYSByZWxldmFudCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4KCkFscmlnaHQsIEkgdGhpbmsgSSBoYXZlIGEgZ29vZCBoYW5kbGUgb24gdGhpbmdzLiBMZXQmIzM5O3Mgc2V0IHRoZSByZXN1bHRzIG5vdy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFWEVDX0hBTkRPVkVSJiMzNDssCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2tob19yYWRpeF9hZGRfa2V5JiMzNDssCiAgICAmIzM0O2tob19yYWRpeF9kZWxfa2V5JiMzNDssCiAgICAmIzM0O2tob19yYWRpeF93YWxrX3RyZWUmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X2luaXRfdHJlZSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfZGVzdHJveV90cmVlJiMzNDssCiAgICAmIzM0O2tob19zY3JhdGNoX292ZXJsYXAmIzM0OywKICAgICYjMzQ7a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSYjMzQ7LAogICAgJiMzNDttZW1ibG9ja19hbGxvY19odWdldGxiJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBLZXhlYyBIYW5kb3ZlciAoS0hPKSByYWRpeCB0cmVlIGltcGxlbWVudGF0aW9uLCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgZm9yIEtITyBzY3JhdGNoIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgY2hhbmdlcyBob3cgSHVnZVRMQiBwYWdlcyBhcmUgYWxsb2NhdGVkIGR1cmluZyBib290IHVzaW5nIG1lbWJsb2NrLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB0aGF0IGNhbiBiZSByZWFjaGVkIGR1cmluZyBib290IGFuZCBydW50aW1lLCBtYWtpbmcgdGhlbSB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVhFQ19IQU5ET1ZFUiYjMzQ7LAogICAgJiMzNDtIVUdFVExCX1BBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtraG9fcmFkaXhfYWRkX2tleSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfZGVsX2tleSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfd2Fsa190cmVlJiMzNDssCiAgICAmIzM0O2tob19yYWRpeF9pbml0X3RyZWUmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZSYjMzQ7LAogICAgJiMzNDtraG9fc2NyYXRjaF9vdmVybGFwJiMzNDssCiAgICAmIzM0O2tob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUmIzM0OywKICAgICYjMzQ7bWVtYmxvY2tfYWxsb2NfaHVnZXRsYiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgS2V4ZWMgSGFuZG92ZXIgKEtITykgcmFkaXggdHJlZSBpbXBsZW1lbnRhdGlvbiwgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIGZvciBLSE8gc2NyYXRjaCBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGNoYW5nZXMgaG93IEh1Z2VUTEIgcGFnZXMgYXJlIGFsbG9jYXRlZCBkdXJpbmcgYm9vdCB1c2luZyBtZW1ibG9jay4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdGhhdCBjYW4gYmUgcmVhY2hlZCBkdXJpbmcgYm9vdCBhbmQgcnVudGltZSwgbWFraW5nIHRoZW0gd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjI2Ljg0ODQxNDc3OFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk3MjA0NjczMjU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFWEVDX0hBTkRPVkVSXCIsXG4gICAgXCJIVUdFVExCX1BBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJraG9fcmFkaXhfYWRkX2tleVwiLFxuICAgIFwia2hvX3JhZGl4X2RlbF9rZXlcIixcbiAgICBcImtob19yYWRpeF93YWxrX3RyZWVcIixcbiAgICBcImtob19yYWRpeF9pbml0X3RyZWVcIixcbiAgICBcImtob19yYWRpeF9kZXN0cm95X3RyZWVcIixcbiAgICBcImtob19zY3JhdGNoX292ZXJsYXBcIixcbiAgICBcImtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVcIixcbiAgICBcIm1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgS2V4ZWMgSGFuZG92ZXIgKEtITykgcmFkaXggdHJlZSBpbXBsZW1lbnRhdGlvbiwgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIGZvciBLSE8gc2NyYXRjaCBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGNoYW5nZXMgaG93IEh1Z2VUTEIgcGFnZXMgYXJlIGFsbG9jYXRlZCBkdXJpbmcgYm9vdCB1c2luZyBtZW1ibG9jay4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdGhhdCBjYW4gYmUgcmVhY2hlZCBkdXJpbmcgYm9vdCBhbmQgcnVudGltZSwgbWFraW5nIHRoZW0gd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDE6MjYuODQ4NDE5ODc4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTMwNTA3ODY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMTVhODk1YjI3ZDcwNjliNDNlM2IxMjhkZjg1N2ViY2NkM2UzODA5MlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIEp1bCAxMCAxMzo0MToyNCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmggYi9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmhcXG5pbmRleCA0OGE5NzkzYzJiNzZjZC4uMzBhNzE3MTA1NjVhMzIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oXFxuQEAgLTMzLDkgKzMzLDEzIEBAIHZvaWQga2hvX3JlbW92ZV9zdWJ0cmVlKHZvaWQgKmJsb2IpO1xcbiBpbnQga2hvX3JldHJpZXZlX3N1YnRyZWUoY29uc3QgY2hhciAqbmFtZSwgcGh5c19hZGRyX3QgKnBoeXMsIHNpemVfdCAqc2l6ZSk7XFxuIFxcbiB2b2lkIGtob19tZW1vcnlfaW5pdCh2b2lkKTtcXG4rdm9pZCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZCk7XFxuIFxcbiB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sIHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cyxcXG4gXFx0XFx0ICB1NjQgc2NyYXRjaF9sZW4pO1xcbitcXG4rYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcXG4rdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pO1xcbiAjZWxzZVxcbiBzdGF0aWMgaW5saW5lIGJvb2wga2hvX2lzX2VuYWJsZWQodm9pZClcXG4ge1xcbkBAIC0xMDgsMTAgKzExMiwyMiBAQCBzdGF0aWMgaW5saW5lIGludCBraG9fcmV0cmlldmVfc3VidHJlZShjb25zdCBjaGFyICpuYW1lLCBwaHlzX2FkZHJfdCAqcGh5cyxcXG4gXFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBraG9fbWVtb3J5X2luaXQodm9pZCkgeyB9XFxuIFxcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfVxcbitcXG4gc3RhdGljIGlubGluZSB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sXFxuIFxcdFxcdFxcdFxcdHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cywgdTY0IHNjcmF0Y2hfbGVuKVxcbiB7XFxuIH1cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XFxuK3tcXG4rfVxcbiAjZW5kaWYgLyogQ09ORklHX0tFWEVDX0hBTkRPVkVSICovXFxuIFxcbiAjZW5kaWYgLyogTElOVVhfS0VYRUNfSEFORE9WRVJfSCAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oXFxuaW5kZXggNWUyZWI4NTE5YmRhNmQuLjJmNGZiOWM2Mzk0MjFhIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2tleGVjX2hhbmRvdmVyLmhcXG5AQCAtMjU3LDExICsyNTcsOCBAQCBzdHJ1Y3Qga2hvX3ZtYWxsb2Mge1xcbiAgKiBtZW1vcnkuIFRoZXNlIGNvbnN0YW50cyBnb3Zlcm4gdGhlIGluZGV4aW5nLCBzaXppbmcsIGFuZCBkZXB0aCBvZiB0aGUgdHJlZS5cXG4gICovXFxuIGVudW0ga2hvX3JhZGl4X2NvbnN0cyB7XFxuLVxcdC8qXFxuLVxcdCAqIFRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIG9yZGVyIGJpdCAoYW5kIGFsc28gdGhlIGxlbmd0aCBvZiB0aGVcXG4tXFx0ICogc2hpZnRlZCBwaHlzaWNhbCBhZGRyZXNzKSBmb3IgYW4gb3JkZXItMCBwYWdlLlxcbi1cXHQgKi9cXG4tXFx0S0hPX09SREVSXzBfTE9HMiA9IDY0IC0gUEFHRV9TSElGVCxcXG4rXFx0LyogTmVlZCB0byBzdG9yZSB0aGUgUEZOLCBwbHVzIG9uZSBiaXQgZm9yIG9yZGVyLiAqL1xcbitcXHRLSE9fUkFESVhfS0VZX1dJRFRIID0gNjQgLSBQQUdFX1NISUZUICsgMSxcXG4gXFxuIFxcdC8qIFNpemUgb2YgdGhlIHRhYmxlIGluIGtob19yYWRpeF9ub2RlLCBpbiBsb2cyICovXFxuIFxcdEtIT19UQUJMRV9TSVpFX0xPRzIgPSBjb25zdF9pbG9nMihQQUdFX1NJWkUgLyBzaXplb2YocGh5c19hZGRyX3QpKSxcXG5AQCAtMjc0LDcgKzI3MSw3IEBAIGVudW0ga2hvX3JhZGl4X2NvbnN0cyB7XFxuIFxcdCAqIGFuZCAxIGJpdG1hcCBsZXZlbC5cXG4gXFx0ICovXFxuIFxcdEtIT19UUkVFX01BWF9ERVBUSCA9XFxuLVxcdFxcdERJVl9ST1VORF9VUChLSE9fT1JERVJfMF9MT0cyIC0gS0hPX0JJVE1BUF9TSVpFX0xPRzIgKyAxLFxcbitcXHRcXHRESVZfUk9VTkRfVVAoS0hPX1JBRElYX0tFWV9XSURUSCAtIEtIT19CSVRNQVBfU0laRV9MT0cyLFxcbiBcXHRcXHRcXHQgICAgIEtIT19UQUJMRV9TSVpFX0xPRzIpICsgMSxcXG4gfTtcXG4gXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaCBiL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaFxcbmluZGV4IDg0ZTkxOGI5NmU1M2RmLi41ZDZhZTI4OTM2ODRhNCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmhcXG5AQCAtMzQsMzcgKzM0LDUzIEBAIHN0cnVjdCBraG9fcmFkaXhfdHJlZSB7XFxuIFxcdHN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0cyB0aGUgdHJlZSdzIHN0cnVjdHVyZSBhbmQgcm9vdCBwb2ludGVyICovXFxuIH07XFxuIFxcbi10eXBlZGVmIGludCAoKmtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCkocGh5c19hZGRyX3QgcGh5cyxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IG9yZGVyKTtcXG4rLyoqXFxuKyAqIHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAtIENhbGxiYWNrcyBmb3IgS0hPIHJhZGl4IHRyZWUgd2Fsay5cXG4rICogQGxlYWY6ICAgICAgQ2FsbGVkIG9uIGVhY2ggcHJlc2VudCBrZXkgaW4gdGhlIHJhZGl4IHRyZWUuXFxuKyAqIEBub2RlOiAgICAgIENhbGxlZCBvbiBlYWNoIG5vZGUgb2YgdGhlIHJhZGl4IHRyZWUgaXRzZWxmLiBSZWNlaXZlcyB0aGVcXG4rICogICAgICAgICAgICAgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBub2RlLlxcbisgKlxcbisgKiBGb3IgZWFjaCBjYWxsYmFjaywgYSByZXR1cm4gdmFsdWUgb2YgMCBjb250aW51ZXMgdGhlIHdhbGsgYW5kIGEgbm9uLXplcm9cXG4rICogcmV0dXJuIHZhbHVlIGlzIGRpcmVjdGx5IHJldHVybmVkIHRvIHRoZSBjYWxsZXIuXFxuKyAqL1xcbitzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2Ige1xcbitcXHRpbnQgKCpsZWFmKSh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSk7XFxuK1xcdGludCAoKm5vZGUpKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpO1xcbit9O1xcbiBcXG4gI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUlxcbiBcXG4taW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxcbi1cXHRcXHQgICAgICAgdW5zaWduZWQgaW50IG9yZGVyKTtcXG4tXFxuLXZvaWQga2hvX3JhZGl4X2RlbF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBwZm4sXFxuLVxcdFxcdFxcdHVuc2lnbmVkIGludCBvcmRlcik7XFxuLVxcbitpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7XFxuK3ZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7XFxuIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG4tXFx0XFx0XFx0a2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKTtcXG4rXFx0XFx0XFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSk7XFxuK2ludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KTtcXG4rdm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSk7XFxuIFxcbiAjZWxzZSAgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqL1xcbiBcXG4tc3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgbG9uZyBwZm4sXFxuLVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG9yZGVyKVxcbitzdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxcbiB7XFxuIFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLVxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpIHsgfVxcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcga2V5KSB7IH1cXG4gXFxuIHN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbi1cXHRcXHRcXHRcXHQgICAgICBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXFxuK1xcdFxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXFxuIHtcXG4gXFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpIHsgfVxcbitcXG4gI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVIgKi9cXG4gXFxuICNlbmRpZlxcdC8qIF9MSU5VWF9LSE9fUkFESVhfVFJFRV9IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaFxcbmluZGV4IDVhZmNkOTlhYThjMTQ0Li5kNjJkYjllNzc2Y2Y5NCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmhcXG5AQCAtNTEsNiArNTEsNyBAQCBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG1heF9wb3NzaWJsZV9wZm47XFxuICAqIG1lbW9yeSByZXNlcnZhdGlvbnMgeWV0LCBzbyB3ZSBnZXQgc2NyYXRjaCBtZW1vcnkgZnJvbSB0aGUgcHJldmlvdXNcXG4gICoga2VybmVsIHRoYXQgd2Uga25vdyBpcyBnb29kIHRvIHVzZS4gSXQgaXMgdGhlIG9ubHkgbWVtb3J5IHRoYXRcXG4gICogYWxsb2NhdGlvbnMgbWF5IGhhcHBlbiBmcm9tIGluIHRoaXMgcGhhc2UuXFxuKyAqIEBNRU1CTE9DS19SU1JWX0hVR0VUTEI6IG1lbW9yeSBpcyByZXNlcnZlZCBmb3IgaHVnZXRsYiBwYWdlc1xcbiAgKi9cXG4gZW51bSBtZW1ibG9ja19mbGFncyB7XFxuIFxcdE1FTUJMT0NLX05PTkVcXHRcXHQ9IDB4MCxcXHQvKiBObyBzcGVjaWFsIHJlcXVlc3QgKi9cXG5AQCAtNjEsNiArNjIsNyBAQCBlbnVtIG1lbWJsb2NrX2ZsYWdzIHtcXG4gXFx0TUVNQkxPQ0tfUlNSVl9OT0lOSVRcXHQ9IDB4MTAsXFx0LyogZG9uJ3QgaW5pdGlhbGl6ZSBzdHJ1Y3QgcGFnZXMgKi9cXG4gXFx0TUVNQkxPQ0tfUlNSVl9LRVJOXFx0PSAweDIwLFxcdC8qIG1lbW9yeSByZXNlcnZlZCBmb3Iga2VybmVsIHVzZSAqL1xcbiBcXHRNRU1CTE9DS19LSE9fU0NSQVRDSFxcdD0gMHg0MCxcXHQvKiBzY3JhdGNoIG1lbW9yeSBmb3Iga2V4ZWMgaGFuZG92ZXIgKi9cXG4rXFx0TUVNQkxPQ0tfUlNSVl9IVUdFVExCXFx0PSAweDgwLCAvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGh1Z2V0bGIgcGFnZXMgKi9cXG4gfTtcXG4gXFxuIC8qKlxcbkBAIC00MjAsNiArNDIyLDcgQEAgdm9pZCAqbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXFxuIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXFxuIFxcdFxcdFxcdCAgICAgcGh5c19hZGRyX3QgbWluX2FkZHIsIHBoeXNfYWRkcl90IG1heF9hZGRyLFxcbiBcXHRcXHRcXHQgICAgIGludCBuaWQpO1xcbit2b2lkICptZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKTtcXG4gXFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqbWVtYmxvY2tfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24pXFxuIHtcXG5AQCAtNDg0LDYgKzQ4Nyw3IEBAIHN0YXRpYyBpbmxpbmUgX19pbml0X21lbWJsb2NrIGJvb2wgbWVtYmxvY2tfYm90dG9tX3VwKHZvaWQpXFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3BoeXNfbWVtX3NpemUodm9pZCk7XFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX3NpemUodm9pZCk7XFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCk7XFxuK3BoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCk7XFxuIHVuc2lnbmVkIGxvbmcgbWVtYmxvY2tfZXN0aW1hdGVkX25yX2ZyZWVfcGFnZXModm9pZCk7XFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3N0YXJ0X29mX0RSQU0odm9pZCk7XFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX2VuZF9vZl9EUkFNKHZvaWQpO1xcbkBAIC02MTMsMjggKzYxNyw5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW10ZXN0X3JlcG9ydF9tZW1pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkgeyB9XFxuICNpZmRlZiBDT05GSUdfTUVNQkxPQ0tfS0hPX1NDUkFUQ0hcXG4gdm9pZCBtZW1ibG9ja19zZXRfa2hvX3NjcmF0Y2hfb25seSh2b2lkKTtcXG4gdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpO1xcbi1ib29sIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShwaHlzX2FkZHJfdCBhZGRyKTtcXG4tXFxuLXN0YXRpYyBpbmxpbmUgZW51bSBtaWdyYXRldHlwZSBraG9fc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHBmbixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIGVudW0gbWlncmF0ZXR5cGUgbXQpXFxuLXtcXG4tXFx0aWYgKG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShQRk5fUEhZUyhwZm4pKSlcXG4tXFx0XFx0cmV0dXJuIE1JR1JBVEVfQ01BO1xcbi1cXHRyZXR1cm4gbXQ7XFxuLX1cXG4gI2Vsc2VcXG4gc3RhdGljIGlubGluZSB2b2lkIG1lbWJsb2NrX3NldF9raG9fc2NyYXRjaF9vbmx5KHZvaWQpIHsgfVxcbiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKSB7IH1cXG4tc3RhdGljIGlubGluZSBib29sIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShwaHlzX2FkZHJfdCBhZGRyKVxcbi17XFxuLVxcdHJldHVybiBmYWxzZTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSBlbnVtIG1pZ3JhdGV0eXBlIGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgcGZuLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgZW51bSBtaWdyYXRldHlwZSBtdClcXG4te1xcbi1cXHRyZXR1cm4gbXQ7XFxuLX1cXG4gI2VuZGlmXFxuIFxcbiAjZW5kaWYgLyogX0xJTlVYX01FTUJMT0NLX0ggKi9cXG5kaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUvTWFrZWZpbGUgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxcbmluZGV4IGVlYzlkM2FlMDdlYjRiLi5kOWY0Njk0NjI1NTY3MyAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxcbisrKyBiL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlXFxuQEAgLTgsNyArOCw2IEBAIGx1by15IDo9XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHRcXHRsdW9fc2Vzc2lvbi5vXFxuIFxcbiBvYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVIpXFx0XFx0Kz0ga2V4ZWNfaGFuZG92ZXIub1xcbi1vYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpXFx0Kz0ga2V4ZWNfaGFuZG92ZXJfZGVidWcub1xcbiBvYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUdGUylcXHQrPSBrZXhlY19oYW5kb3Zlcl9kZWJ1Z2ZzLm9cXG4gXFxuIG9iai0kKENPTkZJR19MSVZFVVBEQVRFKVxcdFxcdCs9IGx1by5vXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jXFxuaW5kZXggNDgzNGE4MDk5ODVhYjcuLjlkYzc5YjcxMDNiZGJmIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmNcXG4rKysgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jXFxuQEAgLTg0LDggKzg0LDI1IEBAIHN0YXRpYyBzdHJ1Y3Qga2hvX291dCBraG9fb3V0ID0ge1xcbiBcXHR9LFxcbiB9O1xcbiBcXG4rc3RydWN0IGtob19pbiB7XFxuK1xcdHBoeXNfYWRkcl90IGZkdF9waHlzO1xcbitcXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXM7XFxuK1xcdGNoYXIgcHJldmlvdXNfcmVsZWFzZVtfX05FV19VVFNfTEVOICsgMV07XFxuK1xcdHUzMiBrZXhlY19jb3VudDtcXG4rXFx0c3RydWN0IGtob19kZWJ1Z2ZzIGRiZztcXG4rXFx0c3RydWN0IGtob19yYWRpeF90cmVlIHJhZGl4X3RyZWU7XFxuK307XFxuK1xcbitzdGF0aWMgc3RydWN0IGtob19pbiBraG9faW4gPSB7XFxuK307XFxuK1xcbitzdGF0aWMgY29uc3Qgdm9pZCAqa2hvX2dldF9mZHQodm9pZClcXG4re1xcbitcXHRyZXR1cm4ga2hvX2luLmZkdF9waHlzID8gcGh5c190b192aXJ0KGtob19pbi5mZHRfcGh5cykgOiBOVUxMO1xcbit9XFxuK1xcbiAvKipcXG4tICoga2hvX3JhZGl4X2VuY29kZV9rZXkgLSBFbmNvZGVzIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIgaW50byBhIHJhZGl4IGtleS5cXG4rICoga2hvX2VuY29kZV9yYWRpeF9rZXkgLSBFbmNvZGVzIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIgaW50byBhIHJhZGl4IGtleS5cXG4gICogQHBoeXM6IFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlLlxcbiAgKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS5cXG4gICpcXG5AQCAtOTUsMzUgKzExMiwzOCBAQCBzdGF0aWMgc3RydWN0IGtob19vdXQga2hvX291dCA9IHtcXG4gICpcXG4gICogUmV0dXJuOiBUaGUgZW5jb2RlZCB1bnNpZ25lZCBsb25nIHJhZGl4IGtleS5cXG4gICovXFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGtob19yYWRpeF9lbmNvZGVfa2V5KHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGludCBvcmRlcilcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX2VuY29kZV9yYWRpeF9rZXkocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgaW50IG9yZGVyKVxcbiB7XFxuLVxcdC8qIE9yZGVyIGJpdHMgcGFydCAqL1xcbi1cXHR1bnNpZ25lZCBsb25nIGggPSAxVUwgXFx1MDAzY1xcdTAwM2MgKEtIT19PUkRFUl8wX0xPRzIgLSBvcmRlcik7XFxuLVxcdC8qIFNoaWZ0ZWQgcGh5c2ljYWwgYWRkcmVzcyBwYXJ0ICovXFxuLVxcdHVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgXFx1MDAzZVxcdTAwM2UgKFBBR0VfU0hJRlQgKyBvcmRlcik7XFxuK1xcdC8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIGlzIGVuY29kZWQgYnkgc2hpZnRpbmcgdGhlIFBGTiBieSBpdHMgb3JkZXIuICovXFxuK1xcdHVuc2lnbmVkIGxvbmcgc2hpZnQgPSBQQUdFX1NISUZUICsgb3JkZXI7XFxuK1xcdC8qIE9yZGVyIGJpdCBnb2VzIHJpZ2h0IGJlZm9yZSB0aGUgc2hpZnRlZCBQRk4uICovXFxuK1xcdHVuc2lnbmVkIGxvbmcgaCA9IDFVTCBcXHUwMDNjXFx1MDAzYyAoNjQgLSBzaGlmdCk7XFxuK1xcdC8qIFNoaWZ0ZWQgUEZOLiAqL1xcbitcXHR1bnNpZ25lZCBsb25nIGwgPSBwaHlzIFxcdTAwM2VcXHUwMDNlIHNoaWZ0O1xcbiBcXG4gXFx0cmV0dXJuIGggfCBsO1xcbiB9XFxuIFxcbiAvKipcXG4tICoga2hvX3JhZGl4X2RlY29kZV9rZXkgLSBEZWNvZGVzIGEgcmFkaXgga2V5IGJhY2sgaW50byBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyLlxcbisgKiBraG9fZGVjb2RlX3JhZGl4X2tleSAtIERlY29kZXMgYSByYWRpeCBrZXkgYmFjayBpbnRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXFxuICAqIEBrZXk6IFRoZSB1bnNpZ25lZCBsb25nIGtleSB0byBkZWNvZGUuXFxuICAqIEBvcmRlcjogQW4gb3V0cHV0IHBhcmFtZXRlciwgYSBwb2ludGVyIHRvIGFuIHVuc2lnbmVkIGludCB3aGVyZSB0aGUgZGVjb2RlZFxcbiAgKiAgICAgICAgIHBhZ2Ugb3JkZXIgd2lsbCBiZSBzdG9yZWQuXFxuICAqXFxuLSAqIFRoaXMgZnVuY3Rpb24gcmV2ZXJzZXMgdGhlIGVuY29kaW5nIHBlcmZvcm1lZCBieSBraG9fcmFkaXhfZW5jb2RlX2tleSgpLFxcbisgKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBlbmNvZGluZyBwZXJmb3JtZWQgYnkga2hvX2VuY29kZV9yYWRpeF9rZXkoKSxcXG4gICogZXh0cmFjdGluZyB0aGUgb3JpZ2luYWwgcGh5c2ljYWwgYWRkcmVzcyBhbmQgcGFnZSBvcmRlciBmcm9tIGEgZ2l2ZW4ga2V5LlxcbiAgKlxcbiAgKiBSZXR1cm46IFRoZSBkZWNvZGVkIHBoeXNpY2FsIGFkZHJlc3MuXFxuICAqL1xcbi1zdGF0aWMgcGh5c19hZGRyX3Qga2hvX3JhZGl4X2RlY29kZV9rZXkodW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGludCAqb3JkZXIpXFxuK3N0YXRpYyBwaHlzX2FkZHJfdCBraG9fZGVjb2RlX3JhZGl4X2tleSh1bnNpZ25lZCBsb25nIGtleSwgdW5zaWduZWQgaW50ICpvcmRlcilcXG4ge1xcbi1cXHR1bnNpZ25lZCBpbnQgb3JkZXJfYml0ID0gZmxzNjQoa2V5KTtcXG4rXFx0LyogZmxzNjQoKSBpbmRleGVzIHN0YXJ0aW5nIGZyb20gMS4gKi9cXG4rXFx0dW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSkgLSAxO1xcbiBcXHRwaHlzX2FkZHJfdCBwaHlzO1xcbiBcXG4tXFx0Lyogb3JkZXJfYml0IGlzIG51bWJlcmVkIHN0YXJ0aW5nIGF0IDEgZnJvbSBmbHM2NCAqL1xcbi1cXHQqb3JkZXIgPSBLSE9fT1JERVJfMF9MT0cyIC0gb3JkZXJfYml0ICsgMTtcXG4tXFx0LyogVGhlIG9yZGVyIGlzIGRpc2NhcmRlZCBieSB0aGUgc2hpZnQgKi9cXG4rXFx0Lyogb3JkZXIgYml0IGdvZXMgcmlnaHQgYmVmb3JlIHRoZSBzaGlmdGVkIFBGTi4gKi9cXG4rXFx0Km9yZGVyID0gNjQgLSAoUEFHRV9TSElGVCArIG9yZGVyX2JpdCk7XFxuK1xcdC8qIFRoZSBvcmRlciBiaXQgaXMgZGlzY2FyZGVkIGJ5IHRoZSBzaGlmdCAqL1xcbiBcXHRwaHlzID0ga2V5IFxcdTAwM2NcXHUwMDNjIChQQUdFX1NISUZUICsgKm9yZGVyKTtcXG4gXFxuIFxcdHJldHVybiBwaHlzO1xcbkBAIC0xNDMsMjUgKzE2Myw0NyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBraG9fcmFkaXhfZ2V0X3RhYmxlX2luZGV4KHVuc2lnbmVkIGxvbmcga2V5LFxcbiBcXHRyZXR1cm4gKGtleSBcXHUwMDNlXFx1MDAzZSBzKSAlICgxIFxcdTAwM2NcXHUwMDNjIEtIT19UQUJMRV9TSVpFX0xPRzIpO1xcbiB9XFxuIFxcbitzdGF0aWMgdm9pZCBfX3JlZiAqa2hvX3JhZGl4X2FsbG9jX25vZGUodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGU7XFxuK1xcbitcXHRpZiAoc2xhYl9pc19hdmFpbGFibGUoKSlcXG4rXFx0XFx0bm9kZSA9IChzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0bm9kZSA9IG1lbWJsb2NrX2FsbG9jKFBBR0VfU0laRSwgUEFHRV9TSVpFKTtcXG4rXFxuK1xcdHJldHVybiBub2RlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBfX3JlZiBraG9fcmFkaXhfZnJlZV9ub2RlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSlcXG4re1xcbitcXHRpZiAoc2xhYl9pc19hdmFpbGFibGUoKSlcXG4rXFx0XFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKW5vZGUpO1xcbitcXHRlbHNlXFxuK1xcdFxcdG1lbWJsb2NrX2ZyZWUobm9kZSwgUEFHRV9TSVpFKTtcXG4rfVxcbitcXG4gLyoqXFxuLSAqIGtob19yYWRpeF9hZGRfcGFnZSAtIE1hcmtzIGEgcGFnZSBhcyBwcmVzZXJ2ZWQgaW4gdGhlIHJhZGl4IHRyZWUuXFxuKyAqIGtob19yYWRpeF9hZGRfa2V5IC0gQWRkIGEga2V5IHRvIHRoZSByYWRpeCB0cmVlLlxcbiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLlxcbi0gKiBAcGZuOiBUaGUgcGFnZSBmcmFtZSBudW1iZXIgb2YgdGhlIHBhZ2UgdG8gcHJlc2VydmUuXFxuLSAqIEBvcmRlcjogVGhlIG9yZGVyIG9mIHRoZSBwYWdlLlxcbisgKiBAa2V5OiBUaGUga2V5IHRvIGFkZC5cXG4gICpcXG4tICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYmFzZWQgb24gdGhlIGtleSBkZXJpdmVkIGZyb20gQHBmblxcbi0gKiBhbmQgQG9yZGVyLiBJdCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGVcXG4tICogcGFnZSBmb3IgcHJlc2VydmF0aW9uLiBJZiBpbnRlcm1lZGlhdGUgbm9kZXMgZG8gbm90IGV4aXN0IGFsb25nIHRoZSBwYXRoLFxcbi0gKiB0aGV5IGFyZSBhbGxvY2F0ZWQgYW5kIGFkZGVkIHRvIHRoZSB0cmVlLlxcbisgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBiYXNlZCBvbiB0aGUgQGtleSBwcm92aWRlZC4gSXQgc2V0cyB0aGVcXG4rICogY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGxlYWYgYml0bWFwIHRvIG1hcmsgdGhlIEBrZXkgYXMgcHJlc2VudC4gSWZcXG4rICogaW50ZXJtZWRpYXRlIG5vZGVzIGRvIG5vdCBleGlzdCBhbG9uZyB0aGUgcGF0aCwgdGhleSBhcmUgYWxsb2NhdGVkIGFuZCBhZGRlZFxcbisgKiB0byB0aGUgdHJlZS5cXG4rICpcXG4rICogTk9URTogQ3VycmVudGx5IG9ubHkga2V5cyBvZiB3aWR0aCB1cCB0byAlS0hPX1JBRElYX0tFWV9XSURUSCBhcmUgc3VwcG9ydGVkLlxcbisgKiBUaGlzIGxpbWl0IG9ubHkgZXhpc3RzIGJlY2F1c2UgY3VycmVudCB1c2VycyBvZiB0aGUgcmFkaXggdHJlZSBkb24ndCB1c2UgbW9yZVxcbisgKiB0aGFuIHRoYXQuIENoYW5naW5nIHRoZSBtYXhpbXVtIHdpZHRoIHJlcXVpcmVzIGNoYW5naW5nIHRoZSB0cmVlIGRlcHRoLCB3aGljaFxcbisgKiBuZWVkcyBidW1waW5nIHRoZSBBQkkgdmVyc2lvbi5cXG4gICpcXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLlxcbiAgKi9cXG4taW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLVxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgaW50IG9yZGVyKVxcbitpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSlcXG4ge1xcbiBcXHQvKiBOZXdseSBhbGxvY2F0ZWQgbm9kZXMgZm9yIGVycm9yIGNsZWFudXAgKi9cXG4gXFx0c3RydWN0IGtob19yYWRpeF9ub2RlICppbnRlcm1lZGlhdGVfbm9kZXNbS0hPX1RSRUVfTUFYX0RFUFRIXSA9IHsgMCB9O1xcbi1cXHR1bnNpZ25lZCBsb25nIGtleSA9IGtob19yYWRpeF9lbmNvZGVfa2V5KFBGTl9QSFlTKHBmbiksIG9yZGVyKTtcXG4gXFx0c3RydWN0IGtob19yYWRpeF9ub2RlICphbmNob3Jfbm9kZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSA9IHRyZWUtXFx1MDAzZXJvb3Q7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbmV3X25vZGU7XFxuQEAgLTE3Miw2ICsyMTQsOSBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG4gXFx0aWYgKFdBUk5fT05fT05DRSghdHJlZS1cXHUwMDNlcm9vdCkpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4rXFx0aWYgKHVubGlrZWx5KGZsczY0KGtleSkgXFx1MDAzZSBLSE9fUkFESVhfS0VZX1dJRFRIKSlcXG4rXFx0XFx0cmV0dXJuIC1FUkFOR0U7XFxuK1xcbiBcXHRtaWdodF9zbGVlcCgpO1xcbiBcXG4gXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZ0cmVlLVxcdTAwM2Vsb2NrKTtcXG5AQCAtMTg2LDcgKzIzMSw3IEBAIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbiBcXHRcXHR9XFxuIFxcbiBcXHRcXHQvKiBOZXh0IG5vZGUgaXMgZW1wdHksIGNyZWF0ZSBhIG5ldyBub2RlIGZvciBpdCAqL1xcbi1cXHRcXHRuZXdfbm9kZSA9IChzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdG5ld19ub2RlID0ga2hvX3JhZGl4X2FsbG9jX25vZGUoKTtcXG4gXFx0XFx0aWYgKCFuZXdfbm9kZSkge1xcbiBcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbiBcXHRcXHRcXHRnb3RvIGVycl9mcmVlX25vZGVzO1xcbkBAIC0yMTcsMjkgKzI2MiwyNiBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG4gZXJyX2ZyZWVfbm9kZXM6XFxuIFxcdGZvciAoaSA9IEtIT19UUkVFX01BWF9ERVBUSCAtIDE7IGkgXFx1MDAzZSAwOyBpLS0pIHtcXG4gXFx0XFx0aWYgKGludGVybWVkaWF0ZV9ub2Rlc1tpXSlcXG4tXFx0XFx0XFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWludGVybWVkaWF0ZV9ub2Rlc1tpXSk7XFxuK1xcdFxcdFxcdGtob19yYWRpeF9mcmVlX25vZGUoaW50ZXJtZWRpYXRlX25vZGVzW2ldKTtcXG4gXFx0fVxcbiBcXHRpZiAoYW5jaG9yX25vZGUpXFxuIFxcdFxcdGFuY2hvcl9ub2RlLVxcdTAwM2V0YWJsZVthbmNob3JfaWR4XSA9IDA7XFxuIFxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuLUVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9hZGRfcGFnZSk7XFxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9hZGRfa2V5KTtcXG4gXFxuIC8qKlxcbi0gKiBraG9fcmFkaXhfZGVsX3BhZ2UgLSBSZW1vdmVzIGEgcGFnZSdzIHByZXNlcnZhdGlvbiBzdGF0dXMgZnJvbSB0aGUgcmFkaXggdHJlZS5cXG4rICoga2hvX3JhZGl4X2RlbF9rZXkgLSBSZW1vdmVzIHRoZSBrZXkgZnJvbSB0aGUgcmFkaXggdHJlZS5cXG4gICogQHRyZWU6IFRoZSBLSE8gcmFkaXggdHJlZS5cXG4tICogQHBmbjogVGhlIHBhZ2UgZnJhbWUgbnVtYmVyIG9mIHRoZSBwYWdlIHRvIHVucHJlc2VydmUuXFxuLSAqIEBvcmRlcjogVGhlIG9yZGVyIG9mIHRoZSBwYWdlLlxcbisgKiBAa2V5OiBUaGUga2V5IHRvIHJlbW92ZS5cXG4gICpcXG4gICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNsZWFycyB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG9cXG4tICogdGhlIHBhZ2UsIGVmZmVjdGl2ZWx5IHJlbW92aW5nIGl0cyBcXFwicHJlc2VydmVkXFxcIiBzdGF0dXMuIEl0IGRvZXMgbm90IGZyZWVcXG4tICogdGhlIHRyZWUncyBpbnRlcm1lZGlhdGUgbm9kZXMsIGV2ZW4gaWYgdGhleSBiZWNvbWUgZW1wdHkuXFxuKyAqIHRoZSBAa2V5LCBlZmZlY3RpdmVseSByZW1vdmluZyBpdCBmcm9tIHRoZSB0cmVlLiBJdCBkb2VzIG5vdCBmcmVlIHRoZSB0cmVlJ3NcXG4rICogaW50ZXJtZWRpYXRlIG5vZGVzLCBldmVuIGlmIHRoZXkgYmVjb21lIGVtcHR5LlxcbiAgKi9cXG4tdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcXG4tXFx0XFx0XFx0dW5zaWduZWQgaW50IG9yZGVyKVxcbit2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpXFxuIHtcXG4tXFx0dW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSA9IHRyZWUtXFx1MDAzZXJvb3Q7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZjtcXG4gXFx0dW5zaWduZWQgaW50IGksIGlkeDtcXG5AQCAtMjQ3LDYgKzI4OSwxMCBAQCB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxcbiBcXHRpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLVxcdTAwM2Vyb290KSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4rXFx0LyogS2V5cyB3aWRlciB0aGFuIEtIT19SQURJWF9LRVlfV0lEVEggYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGFkZGVkLiAqL1xcbitcXHRpZiAodW5saWtlbHkoZmxzNjQoa2V5KSBcXHUwMDNlIEtIT19SQURJWF9LRVlfV0lEVEgpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbiBcXHRtaWdodF9zbGVlcCgpO1xcbiBcXG4gXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZ0cmVlLVxcdTAwM2Vsb2NrKTtcXG5AQCAtMjcwLDIxICszMTYsODUgQEAgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcXG4gXFx0aWR4ID0ga2hvX3JhZGl4X2dldF9iaXRtYXBfaW5kZXgoa2V5KTtcXG4gXFx0X19jbGVhcl9iaXQoaWR4LCBsZWFmLVxcdTAwM2ViaXRtYXApO1xcbiB9XFxuLUVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZWxfcGFnZSk7XFxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZWxfa2V5KTtcXG4rXFxuK3N0YXRpYyB2b2lkIF9fa2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IGxldmVsKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdGlmIChsZXZlbCA9PSAwKSB7XFxuK1xcdFxcdGtob19yYWRpeF9mcmVlX25vZGUocm9vdCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCk7IGkrKykge1xcbitcXHRcXHRpZiAocm9vdC1cXHUwMDNldGFibGVbaV0pXFxuK1xcdFxcdFxcdF9fa2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShwaHlzX3RvX3ZpcnQocm9vdC1cXHUwMDNldGFibGVbaV0pLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgbGV2ZWwgLSAxKTtcXG4rXFx0fVxcbitcXG4rXFx0a2hvX3JhZGl4X2ZyZWVfbm9kZShyb290KTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGtob19yYWRpeF9pbml0X3RyZWUgLSBpbml0aWFsaXplIHRoZSByYWRpeCB0cmVlLlxcbisgKiBAdHJlZTogICB0aGUgdHJlZSB0byBpbml0aWFsaXplLlxcbisgKiBAcm9vdDogICByb290IHRhYmxlIG9mIHRoZSByYWRpeCB0cmVlLlxcbisgKlxcbisgKiBJbml0aWFsaXplIHRoZSByYWRpeCB0cmVlIHdpdGggdGhlIGdpdmVuIHJvb3Qgbm9kZS4gSWYgcm9vdCBpcyAlTlVMTCwgYW5cXG4rICogZW1wdHkgcm9vdCB0YWJsZSBpcyBhbGxvY2F0ZWQuIElmIHJvb3QgaXMgbm90ICVOVUxMLCBpdCBpcyB0aGUgY2FsbGVyJ3NcXG4rICogcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoZSByb290IGlzIHZhbGlkIGFuZCBpbiB0aGUgY29ycmVjdCBmb3JtYXQuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS5cXG4rICovXFxuK2ludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxcbit7XFxuK1xcdGlmICghcm9vdClcXG4rXFx0XFx0cm9vdCA9IGtob19yYWRpeF9hbGxvY19ub2RlKCk7XFxuK1xcdGlmICghcm9vdClcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHR0cmVlLVxcdTAwM2Vyb290ID0gcm9vdDtcXG4rXFx0bXV0ZXhfaW5pdChcXHUwMDI2dHJlZS1cXHUwMDNlbG9jayk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpO1xcbitcXG4rLyoqXFxuKyAqIGtob19yYWRpeF9kZXN0cm95X3RyZWUgLSBEZXN0cm95IHRoZSByYWRpeCB0cmVlXFxuKyAqIEB0cmVlOiBUaGUgcmFkaXggdHJlZSB0byBkZXN0cm95XFxuKyAqXFxuKyAqIFdhbGsgQHRyZWUgYW5kIGZyZWUgYWxsIGl0cyBub2Rlcy5cXG4rICovXFxuK3ZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpXFxuK3tcXG4rXFx0aWYgKCF0cmVlLVxcdTAwM2Vyb290KVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRfX2tob19yYWRpeF9kZXN0cm95X3RyZWUodHJlZS1cXHUwMDNlcm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSk7XFxuK1xcdHRyZWUtXFx1MDAzZXJvb3QgPSBOVUxMO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZXN0cm95X3RyZWUpO1xcbiBcXG4tc3RhdGljIGludCBraG9fcmFkaXhfd2Fsa19sZWFmKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZixcXG4tXFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcga2V5LFxcbi1cXHRcXHRcXHQgICAgICAga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxcbitzdGF0aWMgaW50IGtob19yYWRpeF93YWxrX2xlYWYoc3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmLCB1bnNpZ25lZCBsb25nIGtleSxcXG4rXFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilsZWFmO1xcbi1cXHR1bnNpZ25lZCBpbnQgb3JkZXI7XFxuLVxcdHBoeXNfYWRkcl90IHBoeXM7XFxuIFxcdHVuc2lnbmVkIGludCBpO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4rXFx0aWYgKGNiLVxcdTAwM2Vub2RlKSB7XFxuK1xcdFxcdGVyciA9IGNiLVxcdTAwM2Vub2RlKHZpcnRfdG9fcGh5cyhsZWFmKSwgZGF0YSk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghY2ItXFx1MDAzZWxlYWYpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4gXFx0Zm9yX2VhY2hfc2V0X2JpdChpLCBiaXRtYXAsIFBBR0VfU0laRSAqIEJJVFNfUEVSX0JZVEUpIHtcXG4tXFx0XFx0cGh5cyA9IGtob19yYWRpeF9kZWNvZGVfa2V5KGtleSB8IGksIFxcdTAwMjZvcmRlcik7XFxuLVxcdFxcdGVyciA9IGNiKHBoeXMsIG9yZGVyKTtcXG4rXFx0XFx0ZXJyID0gY2ItXFx1MDAzZWxlYWYoa2V5IHwgaSwgZGF0YSk7XFxuIFxcdFxcdGlmIChlcnIpXFxuIFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG5AQCAtMjk0LDcgKzQwNCw3IEBAIHN0YXRpYyBpbnQga2hvX3JhZGl4X3dhbGtfbGVhZihzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWYsXFxuIFxcbiBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXFxuIFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuLVxcdFxcdFxcdFxcdCBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXFxuK1xcdFxcdFxcdFxcdCBjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgKmNiLCB2b2lkICpkYXRhKVxcbiB7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZTtcXG4gXFx0c3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmO1xcbkBAIC0zMDIsNiArNDEyLDEyIEBAIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcXG4gXFx0dW5zaWduZWQgaW50IHNoaWZ0O1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4rXFx0aWYgKGNiLVxcdTAwM2Vub2RlKSB7XFxuK1xcdFxcdGVyciA9IGNiLVxcdTAwM2Vub2RlKHZpcnRfdG9fcGh5cyhyb290KSwgZGF0YSk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBQQUdFX1NJWkUgLyBzaXplb2YocGh5c19hZGRyX3QpOyBpKyspIHtcXG4gXFx0XFx0aWYgKCFyb290LVxcdTAwM2V0YWJsZVtpXSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuQEAgLTMxOCwxMCArNDM0LDEwIEBAIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcXG4gXFx0XFx0XFx0ICogbm9kZSBpcyBwb2ludGluZyB0byB0aGUgbGV2ZWwgMCBiaXRtYXAuXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRsZWFmID0gKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqKW5vZGU7XFxuLVxcdFxcdFxcdGVyciA9IGtob19yYWRpeF93YWxrX2xlYWYobGVhZiwga2V5LCBjYik7XFxuK1xcdFxcdFxcdGVyciA9IGtob19yYWRpeF93YWxrX2xlYWYobGVhZiwga2V5LCBjYiwgZGF0YSk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuIFxcdFxcdFxcdGVyciAgPSBfX2tob19yYWRpeF93YWxrX3RyZWUobm9kZSwgbGV2ZWwgLSAxLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgIGtleSwgY2IpO1xcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGtleSwgY2IsIGRhdGEpO1xcbiBcXHRcXHR9XFxuIFxcbiBcXHRcXHRpZiAoZXJyKVxcbkBAIC0zMzIsMjggKzQ0OCwyNyBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXFxuIH1cXG4gXFxuIC8qKlxcbi0gKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIHByZXNlcnZlZCBwYWdlLlxcbisgKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIGtleS5cXG4gICogQHRyZWU6IEEgcG9pbnRlciB0byB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gd2Fsay5cXG4tICogQGNiOiBBIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHR5cGUga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IHRoYXQgd2lsbCBiZVxcbi0gKiAgICAgIGludm9rZWQgZm9yIGVhY2ggcHJlc2VydmVkIHBhZ2UgZm91bmQgaW4gdGhlIHRyZWUuIFRoZSBjYWxsYmFjayByZWNlaXZlc1xcbi0gKiAgICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBvZiB0aGUgcHJlc2VydmVkIHBhZ2UuXFxuKyAqIEBjYjogICBTZXQgb2YgY2FsbGJhY2tzIHRvIGJlIGludm9rZWQgZHVyaW5nIHRoZSB0cmVlIHdhbGsuXFxuKyAqIEBkYXRhOiBPcGFxdWUgZGF0YSBwb2ludGVyIHBhc3NlZCB0byBlYWNoIGNhbGxiYWNrIGluIEBjYi5cXG4gICpcXG4tICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHNwZWNpZmllZCB0b3AgbGV2ZWxcXG4tICogZG93biB0byB0aGUgbG93ZXN0IGxldmVsIChsZXZlbCAwKS4gRm9yIGVhY2ggcHJlc2VydmVkIHBhZ2UgZm91bmQsIGl0IGludm9rZXNcXG4tICogdGhlIHByb3ZpZGVkIGNhbGxiYWNrLCBwYXNzaW5nIHRoZSBwYWdlJ3MgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXFxuKyAqIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIHJhZGl4IHRyZWUsIHNlYXJjaGluZyBmcm9tIHRoZSB0b3AgbGV2ZWwgZG93biB0byB0aGVcXG4rICogbG93ZXN0IGxldmVsIChsZXZlbCAwKSwgaW52b2tpbmcgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcy5cXG4gICpcXG4gICogUmV0dXJuOiAwIGlmIHRoZSB3YWxrIGNvbXBsZXRlZCB0aGUgc3BlY2lmaWVkIHRyZWUsIG9yIHRoZSBub24temVybyByZXR1cm5cXG4gICogICAgICAgICB2YWx1ZSBmcm9tIHRoZSBjYWxsYmFjayB0aGF0IHN0b3BwZWQgdGhlIHdhbGsuXFxuICAqL1xcbiBpbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLVxcdFxcdFxcdGtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCBjYilcXG4rXFx0XFx0XFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSlcXG4ge1xcbiBcXHRpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLVxcdTAwM2Vyb290KSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbiBcXHRndWFyZChtdXRleCkoXFx1MDAyNnRyZWUtXFx1MDAzZWxvY2spO1xcbiBcXG4tXFx0cmV0dXJuIF9fa2hvX3JhZGl4X3dhbGtfdHJlZSh0cmVlLVxcdTAwM2Vyb290LCBLSE9fVFJFRV9NQVhfREVQVEggLSAxLCAwLCBjYik7XFxuK1xcdHJldHVybiBfX2tob19yYWRpeF93YWxrX3RyZWUodHJlZS1cXHUwMDNlcm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSwgMCwgY2IsXFxuK1xcdFxcdFxcdFxcdCAgICAgZGF0YSk7XFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X3dhbGtfdHJlZSk7XFxuIFxcbkBAIC00ODQsMTMgKzU5OSwxNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKl9faW5pdCBraG9fZ2V0X3ByZXNlcnZlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMsXFxuIFxcdHJldHVybiBwZm5fdG9fcGFnZShwZm4pO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IF9faW5pdCBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlKHBoeXNfYWRkcl90IHBoeXMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXFxuK3N0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUodW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKmRhdGEpXFxuIHtcXG4gXFx0dW5pb24ga2hvX3BhZ2VfaW5mbyBpbmZvO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4rXFx0dW5zaWduZWQgaW50IG9yZGVyO1xcbitcXHRwaHlzX2FkZHJfdCBwaHlzO1xcbiBcXHR1NjQgc3o7XFxuIFxcbitcXHRwaHlzID0ga2hvX2RlY29kZV9yYWRpeF9rZXkoa2V5LCBcXHUwMDI2b3JkZXIpO1xcbitcXG4gXFx0c3ogPSAxIFxcdTAwM2NcXHUwMDNjIChvcmRlciArIFBBR0VfU0hJRlQpO1xcbiBcXHRwYWdlID0ga2hvX2dldF9wcmVzZXJ2ZWRfcGFnZShwaHlzLCBvcmRlcik7XFxuIFxcbkBAIC01MDQsMTkgKzYyMiwyNCBAQCBzdGF0aWMgaW50IF9faW5pdCBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlKHBoeXNfYWRkcl90IHBoeXMsXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi0vKiBSZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovXFxuLXN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQga2hvX2dldF9tZW1fbWFwX3BoeXMoY29uc3Qgdm9pZCAqZmR0KVxcbisvKiBSZXR1cm5zIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcHJlc2VydmVkIG1lbW9yeSBtYXAgZnJvbSBGRFQgKi9cXG4rc3RhdGljIF9faW5pdCB2b2lkICpraG9fZ2V0X21lbV9tYXAoY29uc3Qgdm9pZCAqZmR0KVxcbiB7XFxuIFxcdGNvbnN0IHZvaWQgKm1lbV9wdHI7XFxuK1xcdHBoeXNfYWRkcl90IG1lbV9tYXBfcGh5cztcXG4gXFx0aW50IGxlbjtcXG4gXFxuIFxcdG1lbV9wdHIgPSBmZHRfZ2V0cHJvcChmZHQsIDAsIEtIT19GRFRfTUVNT1JZX01BUF9QUk9QX05BTUUsIFxcdTAwMjZsZW4pO1xcbiBcXHRpZiAoIW1lbV9wdHIgfHwgbGVuICE9IHNpemVvZih1NjQpKSB7XFxuIFxcdFxcdHByX2VycihcXFwiZmFpbGVkIHRvIGdldCBwcmVzZXJ2ZWQgbWVtb3J5IG1hcFxcXFxuXFxcIik7XFxuLVxcdFxcdHJldHVybiAwO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFx0fVxcbiBcXG4tXFx0cmV0dXJuIGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKW1lbV9wdHIpO1xcbitcXHRtZW1fbWFwX3BoeXMgPSBnZXRfdW5hbGlnbmVkKChjb25zdCB1NjQgKiltZW1fcHRyKTtcXG4rXFx0aWYgKCFtZW1fbWFwX3BoeXMpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXG4rXFx0cmV0dXJuIHBoeXNfdG9fdmlydChtZW1fbWFwX3BoeXMpO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC02MTksMTkgKzc0MiwyNCBAQCBlYXJseV9wYXJhbShcXFwia2hvX3NjcmF0Y2hcXFwiLCBraG9fcGFyc2Vfc2NyYXRjaF9zaXplKTtcXG4gc3RhdGljIHZvaWQgX19pbml0IHNjcmF0Y2hfc2l6ZV91cGRhdGUodm9pZClcXG4ge1xcbiBcXHQvKlxcbi1cXHQgKiBJZiBmaXhlZCBzaXplcyBhcmUgbm90IHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUsIGNhbGN1bGF0ZSB0aGVtXFxuLVxcdCAqIG5vdy5cXG4rXFx0ICogSWYgZml4ZWQgc2l6ZXMgYXJlIG5vdCBwcm92aWRlZCB2aWEgY29tbWFuZCBsaW5lLCBjYWxjdWxhdGUgdGhlbSBub3cuXFxuK1xcdCAqIFJlbW92ZSBIdWdlVExCIGFsbG9jYXRpb25zIGZyb20gaXQgYmVjYXVzZSB0aGV5IG5ldmVyIGdldCBhbGxvY2F0ZWRcXG4rXFx0ICogZnJvbSBzY3JhdGNoLlxcbiBcXHQgKi9cXG4gXFx0aWYgKHNjcmF0Y2hfc2NhbGUpIHtcXG4gXFx0XFx0cGh5c19hZGRyX3Qgc2l6ZTtcXG4gXFxuIFxcdFxcdHNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoQVJDSF9MT1dfQUREUkVTU19MSU1JVCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgTlVNQV9OT19OT0RFKTtcXG4rXFx0XFx0c2l6ZSAtPSBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUoQVJDSF9MT1dfQUREUkVTU19MSU1JVCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XFxuIFxcdFxcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMDtcXG4gXFx0XFx0c2NyYXRjaF9zaXplX2xvd21lbSA9IHNpemU7XFxuIFxcbiBcXHRcXHRzaXplID0gbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKE1FTUJMT0NLX0FMTE9DX0FOWVdIRVJFLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgICBOVU1BX05PX05PREUpO1xcbitcXHRcXHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XFxuIFxcdFxcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMCAtIHNjcmF0Y2hfc2l6ZV9sb3dtZW07XFxuIFxcdFxcdHNjcmF0Y2hfc2l6ZV9nbG9iYWwgPSBzaXplO1xcbiBcXHR9XFxuQEAgLTY1MSw2ICs3NzksOSBAQCBzdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHNjcmF0Y2hfc2l6ZV9ub2RlKGludCBuaWQpXFxuIFxcdGlmIChzY3JhdGNoX3NjYWxlKSB7XFxuIFxcdFxcdHNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgIG5pZCk7XFxuK1xcdFxcdC8qIERvIG5vdCBjb3VudCBIdWdlVExCIHBhZ2VzLiAqL1xcbitcXHRcXHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIG5pZCk7XFxuIFxcdFxcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMDtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0c2l6ZSA9IHNjcmF0Y2hfc2l6ZV9wZXJub2RlO1xcbkBAIC02NTksNiArNzkwLDQ5IEBAIHN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgc2NyYXRjaF9zaXplX25vZGUoaW50IG5pZClcXG4gXFx0cmV0dXJuIHJvdW5kX3VwKHNpemUsIENNQV9NSU5fQUxJR05NRU5UX0JZVEVTKTtcXG4gfVxcbiBcXG4rYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdHBoeXNfYWRkcl90IHNjcmF0Y2hfc3RhcnQsIHNjcmF0Y2hfZW5kO1xcbitcXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBraG9fc2NyYXRjaF9jbnQ7IGkrKykge1xcbitcXHRcXHRzY3JhdGNoX3N0YXJ0ID0ga2hvX3NjcmF0Y2hbaV0uYWRkcjtcXG4rXFx0XFx0c2NyYXRjaF9lbmQgPSBraG9fc2NyYXRjaFtpXS5hZGRyICsga2hvX3NjcmF0Y2hbaV0uc2l6ZTtcXG4rXFxuK1xcdFxcdGlmIChwaHlzIFxcdTAwM2Mgc2NyYXRjaF9lbmQgXFx1MDAyNlxcdTAwMjYgKHBoeXMgKyBzaXplKSBcXHUwMDNlIHNjcmF0Y2hfc3RhcnQpXFxuK1xcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuKy8qXFxuKyAqIE1hcmsgYWxsIEtITyBzY3JhdGNoIHBhZ2VibG9ja3MgYmV0d2VlbiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gYXNcXG4rICogTUlHUkFURV9DTUEuXFxuKyAqL1xcbit2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4re1xcbitcXHRmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSBcXHUwMDNjIGtob19zY3JhdGNoX2NudDsgaSsrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQsIHBmbjtcXG4rXFxuK1xcdFxcdHNjcmF0Y2hfc3RhcnQgPSBQSFlTX1BGTihraG9fc2NyYXRjaFtpXS5hZGRyKTtcXG4rXFx0XFx0c2NyYXRjaF9lbmQgPSBQSFlTX1BGTihraG9fc2NyYXRjaFtpXS5hZGRyICsga2hvX3NjcmF0Y2hbaV0uc2l6ZSk7XFxuK1xcbitcXHRcXHQvKiBUYXJnZXQgcmFuZ2UgZG9lc24ndCBvdmVybGFwIHdpdGggc2NyYXRjaC4gKi9cXG4rXFx0XFx0aWYgKHN0YXJ0X3BmbiBcXHUwMDNlPSBzY3JhdGNoX2VuZCB8fCBlbmRfcGZuIFxcdTAwM2M9IHNjcmF0Y2hfc3RhcnQpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0cGZuID0gbWF4X3QodW5zaWduZWQgbG9uZywgc3RhcnRfcGZuLCBzY3JhdGNoX3N0YXJ0KTtcXG4rXFx0XFx0cGZuID0gcGFnZWJsb2NrX3N0YXJ0X3BmbihwZm4pO1xcbitcXG4rXFx0XFx0d2hpbGUgKHBmbiBcXHUwMDNjIGVuZF9wZm4gXFx1MDAyNlxcdTAwMjYgcGZuIFxcdTAwM2Mgc2NyYXRjaF9lbmQpIHtcXG4rXFx0XFx0XFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgTUlHUkFURV9DTUEsIGZhbHNlKTtcXG4rXFx0XFx0XFx0cGZuICs9IHBhZ2VibG9ja19ucl9wYWdlcztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBraG9fcmVzZXJ2ZV9zY3JhdGNoIC0gUmVzZXJ2ZSBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IGZvciBrZXhlY1xcbiAgKlxcbkBAIC03NDYsNiArOTIwLDEyOCBAQCBzdGF0aWMgdm9pZCBfX2luaXQga2hvX3Jlc2VydmVfc2NyYXRjaCh2b2lkKVxcbiBcXHRraG9fZW5hYmxlID0gZmFsc2U7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIExvb2sgZm9yIGZyZWUgYmxvY2tzIG9mIDFHLiBUaGlzIGlzIGEgaGV1cmlzdGljIGNob3NlbiB0byB3b3JrIGVmZmljaWVudGx5XFxuKyAqIHdpdGggbGFyZ2Ugc3lzdGVtcyB3aXRoIGh1bmRyZWRzIG9mIGdpZ2FieXRlcyBvZiBtZW1vcnkuIEl0IHdpbGwgd29yayBwb29ybHlcXG4rICogb24gc21hbGxlciBzeXN0ZW1zLiBUaGUgYWxnb3JpdGhtIGl0c2VsZiBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHZhbHVlLFxcbisgKiBzbyBpdCBjYW4gYmUgY2hhbmdlZCB0byBhIGRpZmZlcmVudCBoZXVyaXN0aWMgbGF0ZXIgaWYgbmVlZGVkLlxcbisgKi9cXG4rI2RlZmluZSBLSE9fRVhUX0JMS1NJWkVcXHRcXHRTWl8xR1xcbisjZGVmaW5lIEtIT19FWFRfU0hJRlRcXHRcXHRjb25zdF9pbG9nMihLSE9fRVhUX0JMS1NJWkUpXFxuK1xcbisvKiBDYWxsZWQgZm9yIHRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiAqL1xcbitzdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbGVhZih1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHQvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqL1xcbitcXHRzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUgPSBkYXRhO1xcbitcXHRwaHlzX2FkZHJfdCBzdGFydCwgZW5kO1xcbitcXHR1bnNpZ25lZCBpbnQgb3JkZXI7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRzdGFydCA9IGtob19kZWNvZGVfcmFkaXhfa2V5KGtleSwgXFx1MDAyNm9yZGVyKTtcXG4rXFx0ZW5kID0gc3RhcnQgKyAoMVVMIFxcdTAwM2NcXHUwMDNjIChvcmRlciArIFBBR0VfU0hJRlQpKTtcXG4rXFxuK1xcdHdoaWxlIChzdGFydCBcXHUwMDNjIGVuZCkge1xcbitcXHRcXHRlcnIgPSBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBzdGFydCBcXHUwMDNlXFx1MDAzZSBLSE9fRVhUX1NISUZUKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFxuK1xcdFxcdHN0YXJ0ICs9ICgxVUwgXFx1MDAzY1xcdTAwM2MgS0hPX0VYVF9TSElGVCk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKiBDYWxsZWQgZm9yIHRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiAqL1xcbitzdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbm9kZShwaHlzX2FkZHJfdCBwaHlzLCB2b2lkICpkYXRhKVxcbit7XFxuK1xcdC8qIFJhZGl4IHRyZWUgdHJhY2tpbmcgZnJlZSBibG9ja3MuICovXFxuK1xcdHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSA9IGRhdGE7XFxuK1xcbitcXHRyZXR1cm4ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgcGh5cyBcXHUwMDNlXFx1MDAzZSBLSE9fRVhUX1NISUZUKTtcXG4rfVxcbitcXG4rLyogQ2FsbGVkIGZvciB0aGUgZnJlZSBibG9jayByYWRpeCB0cmVlLiAqL1xcbitzdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X21hcmtfc2NyYXRjaCh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHRwaHlzX2FkZHJfdCAqcHJldl9lbmQgPSBkYXRhO1xcbitcXHRwaHlzX2FkZHJfdCBzdGFydCA9IGtleSBcXHUwMDNjXFx1MDAzYyBLSE9fRVhUX1NISUZUO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKHN0YXJ0IFxcdTAwM2UgKnByZXZfZW5kKSB7XFxuK1xcdFxcdGVyciA9IG1lbWJsb2NrX21hcmtfa2hvX3NjcmF0Y2goKnByZXZfZW5kLCBzdGFydCAtICpwcmV2X2VuZCk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdCpwcmV2X2VuZCA9IHN0YXJ0ICsgKDFVTCBcXHUwMDNjXFx1MDAzYyBLSE9fRVhUX1NISUZUKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qXFxuKyAqIGtob19leHRlbmRfc2NyYXRjaCAtIEV4dGVuZCB0aGUgc2NyYXRjaCByZWdpb25zXFxuKyAqXFxuKyAqIFRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlIG1peGVzIGJvdGggcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXJcXG4rICogaW50byBhIHNpbmdsZSBrZXkuIFRoaXMgbWFrZXMgaXQgaGFyZCB0byBsb29rIGZvciBmcmVlIHJhbmdlcyBkaXJlY3RseS4gVGhpc1xcbisgKiBmdW5jdGlvbiBmaXJzdCB3YWxrcyB0aGUgcmFkaXggdHJlZSBhbmQgZGlnZXN0cyBpdCBkb3duIGludG8gYW5vdGhlciByYWRpeFxcbisgKiB0cmVlLCB3aG9zZSBrZXlzIGlkZW50aWZ5IGJsb2NrcyBvZiBLSE9fRVhUX1NISUZUIHdoaWNoIGNvbnRhaW4gcHJlc2VydmVkXFxuKyAqIG1lbW9yeS5cXG4rICpcXG4rICogVGhlbiBpdCB3YWxrcyB0aGUgZGlnZXN0ZWQgcmFkaXggdHJlZSBhbmQgbWFya3MgZXZlcnl0aGluZyB0aGF0IGRvZXNuJ3QgaGF2ZVxcbisgKiBwcmVzZXJ2ZWQgbWVtb3J5IGFzIHNjcmF0Y2guXFxuKyAqXFxuKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBzbyBpdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2NyYXRjaCBoYXNcXG4rICogYXZhaWxhYmxlIHNwYWNlLlxcbisgKlxcbisgKiBOT1RFOiBUaGUgcGFnZXMgb2YgdGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUgdGFibGVzIGFyZSBub3QgbWFya2VkXFxuKyAqIGFzIHByZXNlcnZlZCBpbiB0aGUgcHJlc2VydmVkIG1lbW9yeSB0cmVlLiBCdXQgdGhleSBhcmUgZXhwZWN0ZWQgdG8gcmVtYWluXFxuKyAqIHVudG91Y2hlZCB1bnRpbCB0aGUgdHJlZSBpcyBmdWxseSBwYXJzZWQuIFNvIHRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnNcXG4rICogdGhlbSB0byBiZSBcXFwicHJlc2VydmVkIG1lbW9yeVxcXCIgYW5kIG1hcmtzIHRoZWlyIGJsb2NrcyBhcyBidXN5LlxcbisgKlxcbisgKiBOT1RFOiBlZmlfaW5pdCgpOjpyZXNlcnZlX3JlZ2lvbnMoKSByZW1vdmVzIGFsbCByZWdpb25zIGV4Y2VwdFxcbisgKiBNRU1CTE9DS19LSE9fU0NSQVRDSC4gVGhpcyBmdW5jdGlvbiBhZGRzIHN1Y2ggcmVnaW9ucyBidXQgdGhleSBhcmUgbm90IEtIT1xcbisgKiBzY3JhdGNoIG1lbW9yeSwgc28gdGhleSBzaG91bGQgbm90IGJlIHJlbW92ZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyBiZVxcbisgKiBjYWxsZWQgYWZ0ZXIgcmVzZXJ2ZV9yZWdpb25zKCkuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBfX2luaXQga2hvX2V4dGVuZF9zY3JhdGNoKHZvaWQpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGtob19jYiA9IHtcXG4rXFx0XFx0LmxlYWYgPSBraG9fZXh0X3dhbGtfbGVhZixcXG4rXFx0XFx0Lm5vZGUgPSBraG9fZXh0X3dhbGtfbm9kZSxcXG4rXFx0fTtcXG4rXFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGV4dF9jYiA9IHtcXG4rXFx0XFx0LmxlYWYgPSBraG9fZXh0X21hcmtfc2NyYXRjaCxcXG4rXFx0fTtcXG4rXFx0c3RydWN0IGtob19yYWRpeF90cmVlIHJhZGl4O1xcbitcXHRwaHlzX2FkZHJfdCBwcmV2X2VuZCA9IDA7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXG4rXFx0ZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZShcXHUwMDI2cmFkaXgsIE5VTEwpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRnb3RvIHByaW50O1xcbitcXG4rXFx0LyogV2FsayB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gZmluZCBidXN5IGJsb2Nrcy4gKi9cXG4rXFx0ZXJyID0ga2hvX3JhZGl4X3dhbGtfdHJlZShcXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIFxcdTAwMjZraG9fY2IsIFxcdTAwMjZyYWRpeCk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LyogV2FsayB0aGUgYmxvY2tzIGFuZCBtYXJrIGV2ZXJ5dGhpbmcgYmV0d2VlbiBrZXlzIGFzIHNjcmF0Y2guICovXFxuK1xcdGVyciA9IGtob19yYWRpeF93YWxrX3RyZWUoXFx1MDAyNnJhZGl4LCBcXHUwMDI2ZXh0X2NiLCBcXHUwMDI2cHJldl9lbmQpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdC8qIE1hcmsgZXZlcnl0aGluZyBmcm9tIGxhc3QgYnVzeSBibG9jayB0byBlbmQgb2YgRFJBTS4gKi9cXG4rXFx0aWYgKHByZXZfZW5kIFxcdTAwM2MgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSlcXG4rXFx0XFx0ZXJyID0gbWVtYmxvY2tfbWFya19raG9fc2NyYXRjaChwcmV2X2VuZCwgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSAtIHByZXZfZW5kKTtcXG4rXFxuK1xcdC8qIGZhbGx0aHJvdWdoICovXFxuK291dDpcXG4rXFx0a2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShcXHUwMDI2cmFkaXgpO1xcbitwcmludDpcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gZXh0ZW5kIHNjcmF0Y2g6ICVwZVxcXFxuXFxcIiwgRVJSX1BUUihlcnIpKTtcXG4rfVxcbitcXG4gLyoqXFxuICAqIGtob19hZGRfc3VidHJlZSAtIHJlY29yZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIHN1YiBibG9iIGluIEtITyByb290IHRyZWUuXFxuICAqIEBuYW1lOiBuYW1lIG9mIHRoZSBzdWIgdHJlZS5cXG5AQCAtODU2LDEwICsxMTUyLDEyIEBAIGludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBmb2xpb19wZm4oZm9saW8pO1xcbiBcXHRjb25zdCB1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcbi1cXHRpZiAoV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULCBQQUdFX1NJWkUgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpKSlcXG4rXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULCBQQUdFX1NJWkUgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbi1cXHRyZXR1cm4ga2hvX3JhZGl4X2FkZF9wYWdlKHRyZWUsIHBmbiwgb3JkZXIpO1xcbitcXHRyZXR1cm4ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwga2hvX2VuY29kZV9yYWRpeF9rZXkoUEZOX1BIWVMocGZuKSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIG9yZGVyKSk7XFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3ByZXNlcnZlX2ZvbGlvKTtcXG4gXFxuQEAgLTg3Nyw3ICsxMTc1LDcgQEAgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IGZvbGlvX3Bmbihmb2xpbyk7XFxuIFxcdGNvbnN0IHVuc2lnbmVkIGludCBvcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFxuLVxcdGtob19yYWRpeF9kZWxfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTtcXG4rXFx0a2hvX3JhZGl4X2RlbF9rZXkodHJlZSwga2hvX2VuY29kZV9yYWRpeF9rZXkoUEZOX1BIWVMocGZuKSwgb3JkZXIpKTtcXG4gfVxcbiBFWFBPUlRfU1lNQk9MX0dQTChraG9fdW5wcmVzZXJ2ZV9mb2xpbyk7XFxuIFxcbkBAIC05MDYsNyArMTIwNCw4IEBAIHN0YXRpYyB2b2lkIF9fa2hvX3VucHJlc2VydmUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbiBcXHR3aGlsZSAocGZuIFxcdTAwM2MgZW5kX3Bmbikge1xcbiBcXHRcXHRvcmRlciA9IF9fa2hvX3ByZXNlcnZlX3BhZ2VzX29yZGVyKHBmbiwgZW5kX3Bmbik7XFxuIFxcbi1cXHRcXHRraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XFxuK1xcdFxcdGtob19yYWRpeF9kZWxfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgb3JkZXIpKTtcXG4gXFxuIFxcdFxcdHBmbiArPSAxIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbiBcXHR9XFxuQEAgLTkzMSw3ICsxMjMwLDggQEAgaW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4gXFx0dW5zaWduZWQgbG9uZyBmYWlsZWRfcGZuID0gMDtcXG4gXFx0aW50IGVyciA9IDA7XFxuIFxcbi1cXHRpZiAoV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULFxcbitcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAoc3RhcnRfcGZuIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQsXFxuIFxcdFxcdFxcdFxcdFxcdG5yX3BhZ2VzIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpKSkge1xcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0fVxcbkBAIC05MzksNyArMTIzOSw4IEBAIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuIFxcdHdoaWxlIChwZm4gXFx1MDAzYyBlbmRfcGZuKSB7XFxuIFxcdFxcdHVuc2lnbmVkIGludCBvcmRlciA9IF9fa2hvX3ByZXNlcnZlX3BhZ2VzX29yZGVyKHBmbiwgZW5kX3Bmbik7XFxuIFxcbi1cXHRcXHRlcnIgPSBraG9fcmFkaXhfYWRkX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XFxuK1xcdFxcdGVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIG9yZGVyKSk7XFxuIFxcdFxcdGlmIChlcnIpIHtcXG4gXFx0XFx0XFx0ZmFpbGVkX3BmbiA9IHBmbjtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuQEAgLTEzMTUsMjIgKzE2MTYsNiBAQCB2b2lkIGtob19yZXN0b3JlX2ZyZWUodm9pZCAqbWVtKVxcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yZXN0b3JlX2ZyZWUpO1xcbiBcXG4tc3RydWN0IGtob19pbiB7XFxuLVxcdHBoeXNfYWRkcl90IGZkdF9waHlzO1xcbi1cXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXM7XFxuLVxcdGNoYXIgcHJldmlvdXNfcmVsZWFzZVtfX05FV19VVFNfTEVOICsgMV07XFxuLVxcdHUzMiBrZXhlY19jb3VudDtcXG4tXFx0c3RydWN0IGtob19kZWJ1Z2ZzIGRiZztcXG4tfTtcXG4tXFxuLXN0YXRpYyBzdHJ1Y3Qga2hvX2luIGtob19pbiA9IHtcXG4tfTtcXG4tXFxuLXN0YXRpYyBjb25zdCB2b2lkICpraG9fZ2V0X2ZkdCh2b2lkKVxcbi17XFxuLVxcdHJldHVybiBraG9faW4uZmR0X3BoeXMgPyBwaHlzX3RvX3ZpcnQoa2hvX2luLmZkdF9waHlzKSA6IE5VTEw7XFxuLX1cXG4tXFxuIC8qKlxcbiAgKiBpc19raG9fYm9vdCAtIGNoZWNrIGlmIGN1cnJlbnQga2VybmVsIHdhcyBib290ZWQgdmlhIEtITy1lbmFibGVkXFxuICAqIGtleGVjXFxuQEAgLTEzOTgsMjYgKzE2ODMsMjQgQEAgaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpXFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JldHJpZXZlX3N1YnRyZWUpO1xcbiBcXG4tc3RhdGljIGludCBfX2luaXQga2hvX21lbV9yZXRyaWV2ZShjb25zdCB2b2lkICpmZHQpXFxuK3N0YXRpYyB2b2lkIF9faW5pdCBraG9fbWVtX3JldHJpZXZlKHZvaWQpXFxuIHtcXG4tXFx0c3RydWN0IGtob19yYWRpeF90cmVlIHRyZWU7XFxuLVxcdGNvbnN0IHBoeXNfYWRkcl90ICptZW07XFxuLVxcdGludCBsZW47XFxuK1xcdGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiBjYiA9IHtcXG4rXFx0XFx0LmxlYWYgPSBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlLFxcbitcXHR9O1xcbiBcXG4tXFx0LyogUmV0cmlldmUgdGhlIEtITyByYWRpeCB0cmVlIGZyb20gcGFzc2VkLWluIEZEVC4gKi9cXG4tXFx0bWVtID0gZmR0X2dldHByb3AoZmR0LCAwLCBLSE9fRkRUX01FTU9SWV9NQVBfUFJPUF9OQU1FLCBcXHUwMDI2bGVuKTtcXG4rXFx0aWYgKGtob19yYWRpeF93YWxrX3RyZWUoXFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBcXHUwMDI2Y2IsIE5VTEwpKVxcbitcXHRcXHRnb3RvIGVycjtcXG4gXFxuLVxcdGlmICghbWVtIHx8IGxlbiAhPSBzaXplb2YoKm1lbSkpIHtcXG4tXFx0XFx0cHJfZXJyKFxcXCJmYWlsZWQgdG8gZ2V0IHByZXNlcnZlZCBLSE8gbWVtb3J5IHRyZWVcXFxcblxcXCIpO1xcbi1cXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4tXFx0fVxcbi1cXG4tXFx0aWYgKCEqbWVtKVxcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0cmV0dXJuO1xcbiBcXG4tXFx0dHJlZS5yb290ID0gcGh5c190b192aXJ0KCptZW0pO1xcbi1cXHRtdXRleF9pbml0KFxcdTAwMjZ0cmVlLmxvY2spO1xcbi1cXHRyZXR1cm4ga2hvX3JhZGl4X3dhbGtfdHJlZShcXHUwMDI2dHJlZSwga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSk7XFxuK2VycjpcXG4rXFx0LypcXG4rXFx0ICogRmFpbGVkIHRvIGluaXRpYWxpemUgcHJlc2VydmVkIG1lbW9yeS4gQ2xlYXIgRkRUIGFuZCByYWRpeCBzbyBLSE9cXG4rXFx0ICogdXNlcnMgZG9uJ3QgdHJlYXQgaXQgYXMgYSBLSE8gYm9vdC5cXG4rXFx0ICovXFxuK1xcdGtob19pbi5mZHRfcGh5cyA9IDA7XFxuK1xcdGtob19pbi5yYWRpeF90cmVlLnJvb3QgPSBOVUxMO1xcbiB9XFxuIFxcbiBzdGF0aWMgX19pbml0IGludCBraG9fb3V0X2ZkdF9zZXR1cCh2b2lkKVxcbkBAIC0xNTQzLDE2ICsxODI2LDE0IEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXFxuIFxcdGlmICgha2hvX2VuYWJsZSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcbi1cXHR0cmVlLVxcdTAwM2Vyb290ID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpO1xcbi1cXHRpZiAoIXRyZWUtXFx1MDAzZXJvb3QpIHtcXG4tXFx0XFx0ZXJyID0gLUVOT01FTTtcXG4rXFx0ZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZSh0cmVlLCBOVUxMKTtcXG4rXFx0aWYgKGVycilcXG4gXFx0XFx0Z290byBlcnJfZnJlZV9zY3JhdGNoO1xcbi1cXHR9XFxuIFxcbiBcXHRraG9fb3V0LmZkdCA9IGtob19hbGxvY19wcmVzZXJ2ZShQQUdFX1NJWkUpO1xcbiBcXHRpZiAoSVNfRVJSKGtob19vdXQuZmR0KSkge1xcbiBcXHRcXHRlcnIgPSBQVFJfRVJSKGtob19vdXQuZmR0KTtcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9raG9fcmFkaXhfdHJlZV9yb290O1xcbitcXHRcXHRnb3RvIGVycl9mcmVlX2tob19yYWRpeF90cmVlO1xcbiBcXHR9XFxuIFxcbiBcXHRlcnIgPSBraG9fZGVidWdmc19pbml0KCk7XFxuQEAgLTE2MDMsOSArMTg4NCw4IEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXFxuIFxcbiBlcnJfZnJlZV9mZHQ6XFxuIFxcdGtob191bnByZXNlcnZlX2ZyZWUoa2hvX291dC5mZHQpO1xcbi1lcnJfZnJlZV9raG9fcmFkaXhfdHJlZV9yb290Olxcbi1cXHRrZnJlZSh0cmVlLVxcdTAwM2Vyb290KTtcXG4tXFx0dHJlZS1cXHUwMDNlcm9vdCA9IE5VTEw7XFxuK2Vycl9mcmVlX2tob19yYWRpeF90cmVlOlxcbitcXHRraG9fcmFkaXhfZGVzdHJveV90cmVlKHRyZWUpO1xcbiBlcnJfZnJlZV9zY3JhdGNoOlxcbiBcXHRraG9fb3V0LmZkdCA9IE5VTEw7XFxuIFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpKyspIHtcXG5AQCAtMTYxOSwxNiArMTg5OSw0MyBAQCBzdGF0aWMgX19pbml0IGludCBraG9faW5pdCh2b2lkKVxcbiB9XFxuIGZzX2luaXRjYWxsKGtob19pbml0KTtcXG4gXFxuLXZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdCh2b2lkKVxcbit2b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZClcXG4ge1xcbi1cXHRpZiAoa2hvX2luLnNjcmF0Y2hfcGh5cykge1xcbi1cXHRcXHRraG9fc2NyYXRjaCA9IHBoeXNfdG9fdmlydChraG9faW4uc2NyYXRjaF9waHlzKTtcXG4rXFx0Y29uc3Qgdm9pZCAqZmR0ID0ga2hvX2dldF9mZHQoKTtcXG4gXFxuLVxcdFxcdGlmIChraG9fbWVtX3JldHJpZXZlKGtob19nZXRfZmR0KCkpKVxcbi1cXHRcXHRcXHRraG9faW4uZmR0X3BoeXMgPSAwO1xcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHRraG9fcmVzZXJ2ZV9zY3JhdGNoKCk7XFxuK1xcdGlmICghaXNfa2hvX2Jvb3QoKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LypcXG4rXFx0ICoga2hvX3NjcmF0Y2hfb3ZlcmxhcCgpIG5lZWRzIGtob19zY3JhdGNoIHRvIGJlIGluaXRpYWxpemVkLiBJdFxcbitcXHQgKiBpcyB1c2VkIGJ5IGZyZWVfYXJlYV9pbml0KCkgb24gS0hPIGJvb3RzLCBzbyBpbml0aWFsaXplIGl0XFxuK1xcdCAqIGVhcmx5LlxcbitcXHQgKi9cXG4rXFx0a2hvX3NjcmF0Y2ggPSBwaHlzX3RvX3ZpcnQoa2hvX2luLnNjcmF0Y2hfcGh5cyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBraG9fZ2V0X21lbV9tYXAoKSBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuIElmIGl0IGZhaWxzLCBraG9fcG9wdWxhdGUoKVxcbitcXHQgKiBjYXRjaGVzIHRoYXQgYW5kIG5ldmVyIHNldHMga2hvX2luLmZkdF9waHlzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGtob19yYWRpeF9pbml0X3RyZWUoXFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBraG9fZ2V0X21lbV9tYXAoZmR0KSkpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogRmFpbGVkIHRvIGluaXRpYWxpemUgcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiBDbGVhciBGRFRcXG4rXFx0XFx0ICogYW5kIHNjcmF0Y2ggc28gS0hPIHVzZXJzIGRvbid0IHRyZWF0IGl0IGFzIGEgS0hPIGJvb3QuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRraG9faW4uZmR0X3BoeXMgPSAwO1xcbitcXHRcXHRraG9faW4uc2NyYXRjaF9waHlzID0gMDtcXG4rXFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuK1xcbitcXHRraG9fZXh0ZW5kX3NjcmF0Y2goKTtcXG4rfVxcbitcXG4rdm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0KHZvaWQpXFxuK3tcXG4rXFx0aWYgKGtob19pbi5zY3JhdGNoX3BoeXMpXFxuK1xcdFxcdGtob19tZW1fcmV0cmlldmUoKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRraG9fcmVzZXJ2ZV9zY3JhdGNoKCk7XFxuIH1cXG4gXFxuIHZvaWQgX19pbml0IGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sXFxuQEAgLTE2MzYsOSArMTk0Myw4IEBAIHZvaWQgX19pbml0IGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IHNjcmF0Y2hfY250ID0gc2NyYXRjaF9sZW4gLyBzaXplb2YoKmtob19zY3JhdGNoKTtcXG4gXFx0c3RydWN0IGtob19zY3JhdGNoICpzY3JhdGNoID0gTlVMTDtcXG4tXFx0cGh5c19hZGRyX3QgbWVtX21hcF9waHlzO1xcbi1cXHR2b2lkICpmZHQgPSBOVUxMO1xcbiBcXHRib29sIHBvcHVsYXRlZCA9IGZhbHNlO1xcbitcXHR2b2lkICpmZHQgPSBOVUxMO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4gXFx0LyogVmFsaWRhdGUgdGhlIGlucHV0IEZEVCAqL1xcbkBAIC0xNjYwLDggKzE5NjYsMTMgQEAgdm9pZCBfX2luaXQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcXG4gXFx0XFx0Z290byB1bm1hcF9mZHQ7XFxuIFxcdH1cXG4gXFxuLVxcdG1lbV9tYXBfcGh5cyA9IGtob19nZXRfbWVtX21hcF9waHlzKGZkdCk7XFxuLVxcdGlmICghbWVtX21hcF9waHlzKVxcbitcXHQvKlxcbitcXHQgKiBBdCB0aGlzIHBvaW50IHBoeXNfdG9fdmlydCgpIGRvZXNuJ3Qgd29yayBwcm9wZXJseSBhbmQgc29cXG4rXFx0ICoga2hvX2dldF9tZW1fbWFwKCkgY2FuIHJldHVybiBhIHByZS1LQVNMUiB2aXJ0dWFsIGFkZHJlc3MuIEJ1dCBoZXJlIHdlXFxuK1xcdCAqIG9ubHkgd2FudCB0byBtYWtlIHN1cmUgdGhlIG1lbV9tYXAgaXMgdmFsaWQgc28gdGhlIGFjdHVhbCB2YWx1ZVxcbitcXHQgKiBkb2Vzbid0IG1hdHRlciBhcyBsb25nIGFzIGl0IGlzbid0IE5VTEwuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWtob19nZXRfbWVtX21hcChmZHQpKVxcbiBcXHRcXHRnb3RvIHVubWFwX2ZkdDtcXG4gXFxuIFxcdHNjcmF0Y2ggPSBlYXJseV9tZW1yZW1hcChzY3JhdGNoX3BoeXMsIHNjcmF0Y2hfbGVuKTtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfZGVidWcuYyBiL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2RlYnVnLmNcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCA2ZWZiNjk2ZjU0MjYxMi4uMDAwMDAwMDAwMDAwMDBcXG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDI1ICswLDAgQEBcXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbi0vKlxcbi0gKiBrZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIC0ga2V4ZWMgaGFuZG92ZXIgb3B0aW9uYWwgZGVidWcgZnVuY3Rpb25hbGl0eVxcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMjUgR29vZ2xlIExMQywgUGFzaGEgVGF0YXNoaW4gXFx1MDAzY3Bhc2hhLnRhdGFzaGluQHNvbGVlbi5jb21cXHUwMDNlXFxuLSAqL1xcbi1cXG4tI2RlZmluZSBwcl9mbXQoZm10KSBcXFwiS0hPOiBcXFwiIGZtdFxcbi1cXG4tI2luY2x1ZGUgXFxcImtleGVjX2hhbmRvdmVyX2ludGVybmFsLmhcXFwiXFxuLVxcbi1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxuLXtcXG4tXFx0cGh5c19hZGRyX3Qgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQ7XFxuLVxcdHVuc2lnbmVkIGludCBpO1xcbi1cXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGtob19zY3JhdGNoX2NudDsgaSsrKSB7XFxuLVxcdFxcdHNjcmF0Y2hfc3RhcnQgPSBraG9fc2NyYXRjaFtpXS5hZGRyO1xcbi1cXHRcXHRzY3JhdGNoX2VuZCA9IGtob19zY3JhdGNoW2ldLmFkZHIgKyBraG9fc2NyYXRjaFtpXS5zaXplO1xcbi1cXG4tXFx0XFx0aWYgKHBoeXMgXFx1MDAzYyBzY3JhdGNoX2VuZCBcXHUwMDI2XFx1MDAyNiAocGh5cyArIHNpemUpIFxcdTAwM2Ugc2NyYXRjaF9zdGFydClcXG4tXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcdH1cXG4tXFxuLVxcdHJldHVybiBmYWxzZTtcXG4tfVxcbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaFxcbmluZGV4IDAzOTlmZjEwNzc3NTBiLi44MDVkMmE3NmMzODgxOCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXFxuKysrIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaFxcbkBAIC00MSwxMyArNDEsNCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga2hvX2RlYnVnZnNfYmxvYl9yZW1vdmUoc3RydWN0IGtob19kZWJ1Z2ZzICpkYmcsXFxuIFxcdFxcdFxcdFxcdFxcdCAgIHZvaWQgKmJsb2IpIHsgfVxcbiAjZW5kaWYgLyogQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHRlMgKi9cXG4gXFxuLSNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUdcXG4tYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcXG4tI2Vsc2VcXG4tc3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxuLXtcXG4tXFx0cmV0dXJuIGZhbHNlO1xcbi19XFxuLSNlbmRpZiAvKiBDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcgKi9cXG4tXFxuICNlbmRpZiAvKiBMSU5VWF9LRVhFQ19IQU5ET1ZFUl9JTlRFUk5BTF9IICovXFxuZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuY1xcbmluZGV4IDU3MTIxMmI4MDgzNWVjLi5hYjRhZmM4MThlOGNiZCAxMDA2NDRcXG4tLS0gYS9tbS9odWdldGxiLmNcXG4rKysgYi9tbS9odWdldGxiLmNcXG5AQCAtMzAzMywyOSArMzAzMywyMSBAQCBzdGF0aWMgX19pbml0IHZvaWQgKmFsbG9jX2Jvb3RtZW0oc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZCwgYm9vbCBub2RlX2V4YWN0KVxcbiBcXHRpZiAoaHVnZXRsYl9lYXJseV9jbWEoaCkpXFxuIFxcdFxcdG0gPSBodWdldGxiX2NtYV9hbGxvY19ib290bWVtKGgsIFxcdTAwMjZsaXN0bm9kZSwgbm9kZV9leGFjdCk7XFxuIFxcdGVsc2Uge1xcbi1cXHRcXHRpZiAobm9kZV9leGFjdClcXG4tXFx0XFx0XFx0bSA9IG1lbWJsb2NrX2FsbG9jX2V4YWN0X25pZF9yYXcoaHVnZV9wYWdlX3NpemUoaCksXFxuLVxcdFxcdFxcdFxcdGh1Z2VfcGFnZV9zaXplKGgpLCAwLFxcbi1cXHRcXHRcXHRcXHRNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFLCBuaWQpO1xcbi1cXHRcXHRlbHNlIHtcXG4tXFx0XFx0XFx0bSA9IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KGh1Z2VfcGFnZV9zaXplKGgpLFxcbi1cXHRcXHRcXHRcXHRodWdlX3BhZ2Vfc2l6ZShoKSwgMCxcXG4tXFx0XFx0XFx0XFx0TUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRSwgbmlkKTtcXG4rXFx0XFx0bSA9IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIoaHVnZV9wYWdlX3NpemUoaCksIG5pZCwgbm9kZV9leGFjdCk7XFxuK1xcdFxcdGlmIChtKSB7XFxuK1xcdFxcdFxcdG0tXFx1MDAzZWZsYWdzID0gMDtcXG4rXFx0XFx0XFx0bS1cXHUwMDNlY21hID0gTlVMTDtcXG4rXFxuIFxcdFxcdFxcdC8qXFxuIFxcdFxcdFxcdCAqIEZvciBwcmUtSFZPIHRvIHdvcmsgY29ycmVjdGx5LCBwYWdlcyBuZWVkIHRvIGJlIG9uXFxuIFxcdFxcdFxcdCAqIHRoZSBsaXN0IGZvciB0aGUgbm9kZSB0aGV5IHdlcmUgYWN0dWFsbHkgYWxsb2NhdGVkXFxuIFxcdFxcdFxcdCAqIGZyb20uIFRoYXQgbm9kZSBtYXkgYmUgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mXFxuLVxcdFxcdFxcdCAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3LiBTbyxcXG4rXFx0XFx0XFx0ICogZmFsbGJhY2sgYnkgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYl9ib290bWVtLiBTbyxcXG4gXFx0XFx0XFx0ICogZXh0cmFjdCB0aGUgYWN0dWFsIG5vZGUgZmlyc3QuXFxuIFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAobSlcXG4rXFx0XFx0XFx0aWYgKCFub2RlX2V4YWN0KVxcbiBcXHRcXHRcXHRcXHRsaXN0bm9kZSA9IGVhcmx5X3Bmbl90b19uaWQoUEhZU19QRk4oX19wYShtKSkpO1xcbiBcXHRcXHR9XFxuLVxcbi1cXHRcXHRpZiAobSkge1xcbi1cXHRcXHRcXHRtLVxcdTAwM2VmbGFncyA9IDA7XFxuLVxcdFxcdFxcdG0tXFx1MDAzZWNtYSA9IE5VTEw7XFxuLVxcdFxcdH1cXG4gXFx0fVxcbiBcXG4gXFx0aWYgKG0pIHtcXG5kaWZmIC0tZ2l0IGEvbW0vbWVtYmxvY2suYyBiL21tL21lbWJsb2NrLmNcXG5pbmRleCA2MzQ5YzQ4MTU0ZjRiMS4uYzEwZGZiMDU0ODA2YTcgMTAwNjQ0XFxuLS0tIGEvbW0vbWVtYmxvY2suY1xcbisrKyBiL21tL21lbWJsb2NrLmNcXG5AQCAtMTUwNiw2ICsxNTA2LDMyIEBAIGludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfc2V0X25vZGUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSxcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuK3N0YXRpYyB2b2lkIG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3Qgc2l6ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICBib29sIGxlYWt0cmFjZSlcXG4re1xcbitcXHQvKlxcbitcXHQgKiBTa2lwIGttZW1sZWFrIGZvciB0aG9zZSBwbGFjZXMgbGlrZSBrYXNhbl9pbml0KCkgYW5kXFxuK1xcdCAqIGVhcmx5X3BndGFibGVfYWxsb2MoKSBkdWUgdG8gaGlnaCB2b2x1bWUuXFxuK1xcdCAqL1xcbitcXHRpZiAobGVha3RyYWNlKVxcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBNZW1ibG9jayBhbGxvY2F0ZWQgYmxvY2tzIGFyZSBuZXZlciByZXBvcnRlZCBhc1xcbitcXHRcXHQgKiBsZWFrcy4gVGhpcyBpcyBiZWNhdXNlIG1hbnkgb2YgdGhlc2UgYmxvY2tzIGFyZVxcbitcXHRcXHQgKiBvbmx5IHJlZmVycmVkIHZpYSB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGljaCBpc1xcbitcXHRcXHQgKiBub3QgbG9va2VkIHVwIGJ5IGttZW1sZWFrLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0a21lbWxlYWtfYWxsb2NfcGh5cyhzdGFydCwgc2l6ZSwgMCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBTb21lIFZpcnR1YWwgTWFjaGluZSBwbGF0Zm9ybXMsIHN1Y2ggYXMgSW50ZWwgVERYIG9yIEFNRCBTRVYtU05QLFxcbitcXHQgKiByZXF1aXJlIG1lbW9yeSB0byBiZSBhY2NlcHRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgdGhlXFxuK1xcdCAqIGd1ZXN0LlxcbitcXHQgKlxcbitcXHQgKiBBY2NlcHQgdGhlIG1lbW9yeSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci5cXG4rXFx0ICovXFxuK1xcdGFjY2VwdF9tZW1vcnkoc3RhcnQsIHNpemUpO1xcbit9XFxuK1xcbiAvKipcXG4gICogbWVtYmxvY2tfYWxsb2NfcmFuZ2VfbmlkIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgYmxvY2tcXG4gICogQHNpemU6IHNpemUgb2YgbWVtb3J5IGJsb2NrIHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xcbkBAIC0xNTgwLDI4ICsxNjA2LDcgQEAgcGh5c19hZGRyX3QgX19pbml0IG1lbWJsb2NrX2FsbG9jX3JhbmdlX25pZChwaHlzX2FkZHJfdCBzaXplLFxcbiBcXHRyZXR1cm4gMDtcXG4gXFxuIGRvbmU6XFxuLVxcdC8qXFxuLVxcdCAqIFNraXAga21lbWxlYWsgZm9yIHRob3NlIHBsYWNlcyBsaWtlIGthc2FuX2luaXQoKSBhbmRcXG4tXFx0ICogZWFybHlfcGd0YWJsZV9hbGxvYygpIGR1ZSB0byBoaWdoIHZvbHVtZS5cXG4tXFx0ICovXFxuLVxcdGlmIChlbmQgIT0gTUVNQkxPQ0tfQUxMT0NfTk9MRUFLVFJBQ0UpXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIE1lbWJsb2NrIGFsbG9jYXRlZCBibG9ja3MgYXJlIG5ldmVyIHJlcG9ydGVkIGFzXFxuLVxcdFxcdCAqIGxlYWtzLiBUaGlzIGlzIGJlY2F1c2UgbWFueSBvZiB0aGVzZSBibG9ja3MgYXJlXFxuLVxcdFxcdCAqIG9ubHkgcmVmZXJyZWQgdmlhIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoaWNoIGlzXFxuLVxcdFxcdCAqIG5vdCBsb29rZWQgdXAgYnkga21lbWxlYWsuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRrbWVtbGVha19hbGxvY19waHlzKGZvdW5kLCBzaXplLCAwKTtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFNvbWUgVmlydHVhbCBNYWNoaW5lIHBsYXRmb3Jtcywgc3VjaCBhcyBJbnRlbCBURFggb3IgQU1EIFNFVi1TTlAsXFxuLVxcdCAqIHJlcXVpcmUgbWVtb3J5IHRvIGJlIGFjY2VwdGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBieSB0aGVcXG4tXFx0ICogZ3Vlc3QuXFxuLVxcdCAqXFxuLVxcdCAqIEFjY2VwdCB0aGUgbWVtb3J5IG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLlxcbi1cXHQgKi9cXG4tXFx0YWNjZXB0X21lbW9yeShmb3VuZCwgc2l6ZSk7XFxuLVxcbitcXHRtZW1ibG9ja19wcmVwX2FsbG9jYXRpb24oZm91bmQsIHNpemUsIGVuZCAhPSBNRU1CTE9DS19BTExPQ19OT0xFQUtUUkFDRSk7XFxuIFxcdHJldHVybiBmb3VuZDtcXG4gfVxcbiBcXG5AQCAtMTc1Niw2ICsxNzYxLDY5IEBAIHZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoXFxuIFxcdFxcdFxcdFxcdCAgICAgICBmYWxzZSk7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBtZW1ibG9ja19hbGxvY19odWdldGxiIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgZm9yIEh1Z2VUTEIgcGFnZXNcXG4rICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xcbisgKiBAbmlkOiAgICAgICBuaWQgb2YgdGhlIGZyZWUgbWVtb3J5IHRvIGZpbmQsICVOVU1BX05PX05PREUgZm9yIGFueSBub2RlXFxuKyAqIEBleGFjdF9uaWQ6IG9ubHkgYWxsb2NhdGUgZnJvbSB0aGUgc3BlY2lmaWVkIG5pZC4gSWYgJWZhbHNlLCB0aGUgc3BlY2lmaWVkXFxuKyAqICAgICAgICAgICAgIG5pZCBpcyB0cmllZCBmaXJzdCwgYW5kIHRoZW4gYWxsIG5vZGVzIGFyZSB0cmllZCBhcyBmYWxsYmFjay5cXG4rICpcXG4rICogSHVnZVRMQiBwYWdlcyBhcmUgYWx3YXlzIGFsaWduZWQgYnkgdGhlaXIgc2l6ZSwgc28gdGhlIGFsaWdubWVudCBtYXRjaGVzXFxuKyAqIEBzaXplLiBTaW5jZSB0aGUgbWVtb3J5IGlzIGZvciB1c2Vyc3BhY2UsIG1pcnJvcmVkIG1lbW9yeSBpcyBub3QgdXNlZC4gVGhlXFxuKyAqIG1lbW9yeSBpcyBub3QgemVyb2VkLiBEb2VzIG5vdCBwYW5pYyBpZiByZXF1ZXN0IGNhbm5vdCBiZSBzYXRpc2ZpZWQuXFxuKyAqXFxuKyAqIFJldHVybjpcXG4rICogVmlydHVhbCBhZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb24gc3VjY2VzcywgJU5VTEwgb24gZmFpbHVyZS5cXG4rICovXFxuK3ZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZClcXG4re1xcbitcXHRlbnVtIG1lbWJsb2NrX2ZsYWdzIGZsYWdzID0gY2hvb3NlX21lbWJsb2NrX2ZsYWdzKCk7XFxuK1xcdHBoeXNfYWRkcl90IGFkZHIsIHN0YXJ0ID0gMCwgZW5kID0gTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRTtcXG4rXFxuK1xcdG1lbWJsb2NrX2RiZyhcXFwiJXM6ICVsbHUgYnl0ZXMsIG5pZD0lZCwgZXhhY3RfbmlkPSVkICVwU1xcXFxuXFxcIiwgX19mdW5jX18sXFxuK1xcdFxcdCAgICAgKHU2NClzaXplLCBuaWQsIGV4YWN0X25pZCwgKHZvaWQgKilfUkVUX0lQXyk7XFxuK1xcbitcXHQvKiBEb24ndCB3YXN0ZSBtaXJyb3JlZCBtZW1vcnkgb24gSHVnZVRMQiBwYWdlcy4gKi9cXG4rXFx0ZmxhZ3MgXFx1MDAyNj0gfk1FTUJMT0NLX01JUlJPUjtcXG4rcmV0cnk6XFxuK1xcdC8qIEh1Z2VUTEIgcGFnZXMgYXJlIGFsd2F5cyBhbGlnbmVkIGJ5IHRoZWlyIHNpemUuICovXFxuK1xcdGFkZHIgPSBtZW1ibG9ja19maW5kX2luX3JhbmdlX25vZGUoc2l6ZSwgc2l6ZSwgc3RhcnQsIGVuZCwgbmlkLCBmbGFncyk7XFxuK1xcdGlmIChhZGRyKVxcbitcXHRcXHRnb3RvIGZvdW5kO1xcbitcXG4rXFx0LyogVHJ5IGFsbCBub2RlcyBpZiBhbGxvd2VkLiAqL1xcbitcXHRpZiAobnVtYV92YWxpZF9ub2RlKG5pZCkgXFx1MDAyNlxcdTAwMjYgIWV4YWN0X25pZCkge1xcbitcXHRcXHRuaWQgPSBOVU1BX05PX05PREU7XFxuK1xcdFxcdGdvdG8gcmV0cnk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEZvdW5kIG5vdGhpbmcuLi4gOi0oICovXFxuK1xcdHJldHVybiBOVUxMO1xcbitcXG4rZm91bmQ6XFxuK1xcdC8qXFxuK1xcdCAqIEh1Z2VUTEIgcGFnZXMgY2FuIGJlIHByZXNlcnZlZCB3aXRoIEtITyBhbmQgbm8gcHJlc2VydmVkIG1lbW9yeSBjYW5cXG4rXFx0ICogYmUgaW4gc2NyYXRjaC4gU28gcmV0cnkgaWYgZm91bmQgYWRkcmVzcyBvdmVybGFwcyB3aXRoIHNjcmF0Y2guXFxuK1xcdCAqXFxuK1xcdCAqIFNjcmF0Y2ggYXJlYXMgYXJlIG5vcm1hbGx5IG5vdCB2ZXJ5IGxhcmdlLCBzbyB0aGlzIHNob3VsZG4ndCB0YWtlIHRvb1xcbitcXHQgKiBtYW55IHJldHJpZXMuXFxuK1xcdCAqL1xcbitcXHRpZiAoa2hvX3NjcmF0Y2hfb3ZlcmxhcChhZGRyLCBzaXplKSkge1xcbitcXHRcXHRpZiAobWVtYmxvY2tfYm90dG9tX3VwKCkpXFxuK1xcdFxcdFxcdHN0YXJ0ID0gYWRkciArIHNpemU7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0c3RhcnQgPSBhZGRyIC0gc2l6ZTtcXG4rXFxuK1xcdFxcdGdvdG8gcmV0cnk7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChfX21lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSwgbmlkLCBNRU1CTE9DS19SU1JWX0tFUk4gfCBNRU1CTE9DS19SU1JWX0hVR0VUTEIpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihhZGRyLCBzaXplLCB0cnVlKTtcXG4rXFx0cmV0dXJuIHBoeXNfdG9fdmlydChhZGRyKTtcXG4rfVxcbitcXG4gLyoqXFxuICAqIG1lbWJsb2NrX2FsbG9jX3RyeV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9ja1xcbiAgKiBAc2l6ZTogc2l6ZSBvZiBtZW1vcnkgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzXFxuQEAgLTE4MjUsNiArMTg5MywyOCBAQCBwaHlzX2FkZHJfdCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh2b2lkKVxcbiBcXHRyZXR1cm4gbWVtYmxvY2sucmVzZXJ2ZWQudG90YWxfc2l6ZTtcXG4gfVxcbiBcXG4rcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcXG4re1xcbitcXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xcbitcXHRwaHlzX2FkZHJfdCB0b3RhbCA9IDA7XFxuK1xcbitcXHRmb3JfZWFjaF9yZXNlcnZlZF9tZW1fcmVnaW9uKHIpIHtcXG4rXFx0XFx0cGh5c19hZGRyX3Qgc2l6ZSA9IHItXFx1MDAzZXNpemU7XFxuK1xcbitcXHRcXHRpZiAoci1cXHUwMDNlYmFzZSBcXHUwMDNlIGxpbWl0KVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdGlmIChyLVxcdTAwM2ViYXNlICsgci1cXHUwMDNlc2l6ZSBcXHUwMDNlIGxpbWl0KVxcbitcXHRcXHRcXHRzaXplID0gbGltaXQgLSByLVxcdTAwM2ViYXNlO1xcbitcXG4rXFx0XFx0aWYgKG5pZCA9PSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocikgfHwgIW51bWFfdmFsaWRfbm9kZShuaWQpKVxcbitcXHRcXHRcXHRpZiAoci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNRU1CTE9DS19SU1JWX0hVR0VUTEIpXFxuK1xcdFxcdFxcdFxcdHRvdGFsICs9IHNpemU7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiB0b3RhbDtcXG4rfVxcbitcXG4gcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcXG4ge1xcbiBcXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xcbkBAIC0yNTExLDE2ICsyNjAxLDYgQEAgX19pbml0IHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKVxcbiB7XFxuIFxcdGtob19zY3JhdGNoX29ubHkgPSBmYWxzZTtcXG4gfVxcbi1cXG4tYm9vbCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpXFxuLXtcXG4tXFx0aW50IGkgPSBtZW1ibG9ja19zZWFyY2goXFx1MDAyNm1lbWJsb2NrLm1lbW9yeSwgYWRkcik7XFxuLVxcbi1cXHRpZiAoaSA9PSAtMSlcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXG4tXFx0cmV0dXJuIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoKFxcdTAwMjZtZW1ibG9jay5tZW1vcnkucmVnaW9uc1tpXSk7XFxuLX1cXG4gI2VuZGlmXFxuIFxcbiAjaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSXFxuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuY1xcbmluZGV4IDBmNjQ5MDllOGQyMGUyLi4xZDJmMzAyZDhjZDljMSAxMDA2NDRcXG4tLS0gYS9tbS9tbV9pbml0LmNcXG4rKysgYi9tbS9tbV9pbml0LmNcXG5AQCAtNzA3LDkgKzcwNywxMCBAQCB2b2lkIF9fbWVtaW5pdCBfX2luaXRfcGFnZV9mcm9tX25pZCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcXG4gXFx0X19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBmbiwgemlkLCBuaWQpO1xcbiBcXG4gXFx0aWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpIHtcXG4tXFx0XFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XFxuLVxcdFxcdFxcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgTUlHUkFURV9NT1ZBQkxFKTtcXG4tXFx0XFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgbXQsIGZhbHNlKTtcXG4rXFx0XFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgTUlHUkFURV9NT1ZBQkxFLFxcbitcXHRcXHRcXHRcXHRcXHQgICBmYWxzZSk7XFxuK1xcdFxcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXFxuK1xcdFxcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBwZm4gKyAxKTtcXG4gXFx0fVxcbiB9XFxuIFxcbkBAIC05MzgsMTMgKzkzOSwyMiBAQCB2b2lkIF9fbWVtaW5pdCBtZW1tYXBfaW5pdF9yYW5nZSh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZVxcbiBcXHRcXHR9XFxuIFxcdFxcdHBmbisrO1xcbiBcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBmb3IgYW55IHBhZ2VibG9ja3MgdGhhdCBmYWxsIGluIGEgS0hPIHNjcmF0Y2hcXG4rXFx0ICogYXJlYS4gRG8gdGhpcyBoZXJlIG91dHNpZGUgdGhlIGxvb3AgYmVjYXVzZSBtb3N0IHBhZ2VibG9ja3Mgd2lsbCBub3RcXG4rXFx0ICogYmUgS0hPIHNjcmF0Y2gsIHNvIG9ubHkgc2VhcmNoIG9uY2UuXFxuK1xcdCAqXFxuK1xcdCAqIE9ubHkgcGFnZWJsb2NrcyB1cCB0byBwZm4gYXJlIHVwZGF0ZWQsIGRlZmVycmVkIHBhZ2VibG9ja3Mgd2lsbCBiZVxcbitcXHQgKiB1cGRhdGVkIGxhdGVyLlxcbitcXHQgKi9cXG4rXFx0a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIHBmbik7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdF96b25lX3JhbmdlKHN0cnVjdCB6b25lICp6b25lLFxcbiBcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbiBcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcXG4tXFx0XFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nICpob2xlX3BmbixcXG4tXFx0XFx0XFx0XFx0XFx0ICBlbnVtIG1pZ3JhdGV0eXBlIG10KVxcbitcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgKmhvbGVfcGZuKVxcbiB7XFxuIFxcdHVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4gPSB6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbjtcXG4gXFx0dW5zaWduZWQgbG9uZyB6b25lX2VuZF9wZm4gPSB6b25lX3N0YXJ0X3BmbiArIHpvbmUtXFx1MDAzZXNwYW5uZWRfcGFnZXM7XFxuQEAgLTk1Nyw3ICs5NjcsOCBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSxcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4gXFx0bWVtbWFwX2luaXRfcmFuZ2UoZW5kX3BmbiAtIHN0YXJ0X3BmbiwgbmlkLCB6b25lX2lkLCBzdGFydF9wZm4sXFxuLVxcdFxcdFxcdCAgem9uZV9lbmRfcGZuLCBNRU1JTklUX0VBUkxZLCBOVUxMLCBtdCwgZmFsc2UpO1xcbitcXHRcXHRcXHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxcbitcXHRcXHRcXHQgIGZhbHNlKTtcXG4gXFxuIFxcdGlmICgqaG9sZV9wZm4gXFx1MDAzYyBzdGFydF9wZm4pXFxuIFxcdFxcdGluaXRfdW5hdmFpbGFibGVfcmFuZ2UoKmhvbGVfcGZuLCBzdGFydF9wZm4sIHpvbmVfaWQsIG5pZCk7XFxuQEAgLTk3Myw4ICs5ODQsNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXQodm9pZClcXG4gXFxuIFxcdGZvcl9lYWNoX21lbV9wZm5fcmFuZ2UoaSwgTUFYX05VTU5PREVTLCBcXHUwMDI2c3RhcnRfcGZuLCBcXHUwMDI2ZW5kX3BmbiwgXFx1MDAyNm5pZCkge1xcbiBcXHRcXHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGUgPSBOT0RFX0RBVEEobmlkKTtcXG4tXFx0XFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XFxuLVxcdFxcdFxcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgTUlHUkFURV9NT1ZBQkxFKTtcXG4gXFxuIFxcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBNQVhfTlJfWk9ORVM7IGorKykge1xcbiBcXHRcXHRcXHRzdHJ1Y3Qgem9uZSAqem9uZSA9IG5vZGUtXFx1MDAzZW5vZGVfem9uZXMgKyBqO1xcbkBAIC05ODMsNyArOTkyLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0KHZvaWQpXFxuIFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4gXFx0XFx0XFx0bWVtbWFwX2luaXRfem9uZV9yYW5nZSh6b25lLCBzdGFydF9wZm4sIGVuZF9wZm4sXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2aG9sZV9wZm4sIG10KTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZob2xlX3Bmbik7XFxuIFxcdFxcdFxcdHpvbmVfaWQgPSBqO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG5AQCAtMTk3Myw3ICsxOTgyLDcgQEAgdW5zaWduZWQgbG9uZyBfX2luaXQgbm9kZV9tYXBfcGZuX2FsaWdubWVudCh2b2lkKVxcbiBcXG4gI2lmZGVmIENPTkZJR19ERUZFUlJFRF9TVFJVQ1RfUEFHRV9JTklUXFxuIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxcbi1cXHRcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBlbnVtIG1pZ3JhdGV0eXBlIG10KVxcbitcXHRcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbiB7XFxuIFxcdHN0cnVjdCBwYWdlICpwYWdlO1xcbiBcXHR1bnNpZ25lZCBsb25nIGk7XFxuQEAgLTE5ODUsOCArMTk5NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxcbiBcXG4gXFx0LyogRnJlZSBhIGxhcmdlIG5hdHVyYWxseS1hbGlnbmVkIGNodW5rIGlmIHBvc3NpYmxlICovXFxuIFxcdGlmIChucl9wYWdlcyA9PSBNQVhfT1JERVJfTlJfUEFHRVMgXFx1MDAyNlxcdTAwMjYgSVNfTUFYX09SREVSX0FMSUdORUQocGZuKSkge1xcbi1cXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkgKz0gcGFnZWJsb2NrX25yX3BhZ2VzKVxcbi1cXHRcXHRcXHRpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlICsgaSwgbXQsIGZhbHNlKTtcXG4gXFx0XFx0X19mcmVlX3BhZ2VzX2NvcmUocGFnZSwgTUFYX1BBR0VfT1JERVIsIE1FTUlOSVRfRUFSTFkpO1xcbiBcXHRcXHRyZXR1cm47XFxuIFxcdH1cXG5AQCAtMTk5NCwxMSArMjAwMSw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxcbiBcXHQvKiBBY2NlcHQgY2h1bmtzIHNtYWxsZXIgdGhhbiBNQVhfUEFHRV9PUkRFUiB1cGZyb250ICovXFxuIFxcdGFjY2VwdF9tZW1vcnkoUEZOX1BIWVMocGZuKSwgbnJfcGFnZXMgKiBQQUdFX1NJWkUpO1xcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyssIHBhZ2UrKywgcGZuKyspIHtcXG4tXFx0XFx0aWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpXFxuLVxcdFxcdFxcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIG10LCBmYWxzZSk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrLCBwYWdlKyssIHBmbisrKVxcbiBcXHRcXHRfX2ZyZWVfcGFnZXNfY29yZShwYWdlLCAwLCBNRU1JTklUX0VBUkxZKTtcXG4tXFx0fVxcbiB9XFxuIFxcbiAvKiBDb21wbGV0aW9uIHRyYWNraW5nIGZvciBkZWZlcnJlZF9pbml0X21lbW1hcCgpIHRocmVhZHMgKi9cXG5AQCAtMjAxNywxNSArMjAyMSwyOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBnZGF0X2luaXRfcmVwb3J0X29uZV9kb25lKHZvaWQpXFxuICAqIFJldHVybiBudW1iZXIgb2YgcGFnZXMgaW5pdGlhbGl6ZWQuXFxuICAqL1xcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZGVmZXJyZWRfaW5pdF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSxcXG4tXFx0XFx0dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4ge1xcbiBcXHRpbnQgbmlkID0gem9uZV90b19uaWQoem9uZSk7XFxuLVxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfcGZuIC0gcGZuO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX3BmbiAtIHN0YXJ0X3BmbiwgcGZuID0gc3RhcnRfcGZuO1xcbiBcXHRpbnQgemlkID0gem9uZV9pZHgoem9uZSk7XFxuIFxcdHN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTtcXG4gXFxuIFxcdGZvciAoOyBwZm4gXFx1MDAzYyBlbmRfcGZuOyBwZm4rKywgcGFnZSsrKVxcbiBcXHRcXHRfX2luaXRfc2luZ2xlX3BhZ2UocGFnZSwgcGZuLCB6aWQsIG5pZCk7XFxuK1xcbitcXHQvKiBOb3cgaW5pdGlhbGl6ZSBtaWdyYXRlIHR5cGVzIGZvciB0aGVzZSBwYWdlcy4gKi9cXG4rXFx0cGZuID0gcGFnZWJsb2NrX2FsaWduKHN0YXJ0X3Bmbik7XFxuK1xcdHBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pO1xcbitcXHRmb3IgKDsgcGZuIFxcdTAwM2MgZW5kX3BmbjsgcGZuICs9IHBhZ2VibG9ja19ucl9wYWdlcywgcGFnZSArPSBwYWdlYmxvY2tfbnJfcGFnZXMpXFxuK1xcdFxcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIE1JR1JBVEVfTU9WQUJMRSwgZmFsc2UpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgZm9yIGFueSBwYWdlYmxvY2tzIHRoYXQgZmFsbCBpbiBhIEtITyBzY3JhdGNoXFxuK1xcdCAqIGFyZWEuIFNpbmNlIG1vc3QgcGFnZWJsb2NrcyB3aWxsIG5vdCBiZSBLSE8gc2NyYXRjaCwgZG8gaXQgb3V0c2lkZVxcbitcXHQgKiB0aGUgbG9vcCB0byBvbmx5IGRvIHRoZSBzZWFyY2ggb25jZS5cXG4rXFx0ICovXFxuK1xcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBlbmRfcGZuKTtcXG4rXFxuIFxcdHJldHVybiBucl9wYWdlcztcXG4gfVxcbiBcXG5AQCAtMjA1NCw4ICsyMDcyLDYgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcXG4gXFx0Zm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgbmlkLCAwLCBcXHUwMDI2c3RhcnQsIFxcdTAwMjZlbmQsIE5VTEwpIHtcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBzcGZuID0gUEZOX1VQKHN0YXJ0KTtcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBlcGZuID0gUEZOX0RPV04oZW5kKTtcXG4tXFx0XFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XFxuLVxcdFxcdFxcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHNwZm4sIE1JR1JBVEVfTU9WQUJMRSk7XFxuIFxcbiBcXHRcXHRpZiAoc3BmbiBcXHUwMDNlPSBlbmRfcGZuKVxcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtMjA2OCw3ICsyMDg0LDcgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcXG4gXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBjaHVua19lbmQgPSBtaW4obW9fcGZuLCBlcGZuKTtcXG4gXFxuIFxcdFxcdFxcdG5yX3BhZ2VzICs9IGRlZmVycmVkX2luaXRfcGFnZXMoem9uZSwgc3BmbiwgY2h1bmtfZW5kKTtcXG4tXFx0XFx0XFx0ZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZuLCBjaHVua19lbmQgLSBzcGZuLCBtdCk7XFxuK1xcdFxcdFxcdGRlZmVycmVkX2ZyZWVfcGFnZXMoc3BmbiwgY2h1bmtfZW5kIC0gc3Bmbik7XFxuIFxcbiBcXHRcXHRcXHRzcGZuID0gY2h1bmtfZW5kO1xcbiBcXG5AQCAtMjY4Nyw2ICsyNzAzLDcgQEAgdm9pZCBfX2luaXQgX193ZWFrIG1lbV9pbml0KHZvaWQpXFxuIFxcbiB2b2lkIF9faW5pdCBtbV9jb3JlX2luaXRfZWFybHkodm9pZClcXG4ge1xcbitcXHRraG9fbWVtb3J5X2luaXRfZWFybHkoKTtcXG4gXFx0aHVnZXRsYl9jbWFfcmVzZXJ2ZSgpO1xcbiBcXHRodWdldGxiX2Jvb3RtZW1fYWxsb2MoKTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaCBiL3Rvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaFxcbmluZGV4IGI2YjFkMTQ3ZmQ3NTBlLi5lODZiYjkwMDBiMjJmOCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmhcXG5AQCAtNjYsNCArNjYsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxcbiBcXG4gI2RlZmluZSBfX1NldFBhZ2VSZXNlcnZlZChwKVxcdCgodm9pZCkocCkpXFxuIFxcbitzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcXG4re1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuICNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MToyNy45Nzk3MzE5NTZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjk2MDczMzQ3NTM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFWEVDX0hBTkRPVkVSXCIsXG4gICAgXCJIVUdFVExCX1BBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJraG9fcmFkaXhfYWRkX2tleVwiLFxuICAgIFwia2hvX3JhZGl4X2RlbF9rZXlcIixcbiAgICBcImtob19yYWRpeF93YWxrX3RyZWVcIixcbiAgICBcImtob19yYWRpeF9pbml0X3RyZWVcIixcbiAgICBcImtob19yYWRpeF9kZXN0cm95X3RyZWVcIixcbiAgICBcImtob19zY3JhdGNoX292ZXJsYXBcIixcbiAgICBcImtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVcIixcbiAgICBcIm1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgS2V4ZWMgSGFuZG92ZXIgKEtITykgcmFkaXggdHJlZSBpbXBsZW1lbnRhdGlvbiwgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIGZvciBLSE8gc2NyYXRjaCBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGNoYW5nZXMgaG93IEh1Z2VUTEIgcGFnZXMgYXJlIGFsbG9jYXRlZCBkdXJpbmcgYm9vdCB1c2luZyBtZW1ibG9jay4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdGhhdCBjYW4gYmUgcmVhY2hlZCBkdXJpbmcgYm9vdCBhbmQgcnVudGltZSwgbWFraW5nIHRoZW0gd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAxNWE4OTViMjdkNzA2OWI0M2UzYjEyOGRmODU3ZWJjY2QzZTM4MDkyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBKdWwgMTAgMTM6NDE6MjQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmggYi9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmhcbmluZGV4IDQ4YTk3OTNjMmI3NmNkLi4zMGE3MTcxMDU2NWEzMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaFxuKysrIGIvaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oXG5AQCAtMzMsOSArMzMsMTMgQEAgdm9pZCBraG9fcmVtb3ZlX3N1YnRyZWUodm9pZCAqYmxvYik7XG4gaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpO1xuIFxuIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpO1xuK3ZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpO1xuIFxuIHZvaWQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbiwgcGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzLFxuIFx0XHQgIHU2NCBzY3JhdGNoX2xlbik7XG4rXG4rYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcbit2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIGJvb2wga2hvX2lzX2VuYWJsZWQodm9pZClcbiB7XG5AQCAtMTA4LDEwICsxMTIsMjIgQEAgc3RhdGljIGlubGluZSBpbnQga2hvX3JldHJpZXZlX3N1YnRyZWUoY29uc3QgY2hhciAqbmFtZSwgcGh5c19hZGRyX3QgKnBoeXMsXG4gXG4gc3RhdGljIGlubGluZSB2b2lkIGtob19tZW1vcnlfaW5pdCh2b2lkKSB7IH1cbiBcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfVxuK1xuIHN0YXRpYyBpbmxpbmUgdm9pZCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuIFx0XHRcdFx0cGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzLCB1NjQgc2NyYXRjaF9sZW4pXG4ge1xuIH1cbitcbitzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbit7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4re1xuK31cbiAjZW5kaWYgLyogQ09ORklHX0tFWEVDX0hBTkRPVkVSICovXG4gXG4gI2VuZGlmIC8qIExJTlVYX0tFWEVDX0hBTkRPVkVSX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oXG5pbmRleCA1ZTJlYjg1MTliZGE2ZC4uMmY0ZmI5YzYzOTQyMWEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaFxuKysrIGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2tleGVjX2hhbmRvdmVyLmhcbkBAIC0yNTcsMTEgKzI1Nyw4IEBAIHN0cnVjdCBraG9fdm1hbGxvYyB7XG4gICogbWVtb3J5LiBUaGVzZSBjb25zdGFudHMgZ292ZXJuIHRoZSBpbmRleGluZywgc2l6aW5nLCBhbmQgZGVwdGggb2YgdGhlIHRyZWUuXG4gICovXG4gZW51bSBraG9fcmFkaXhfY29uc3RzIHtcbi1cdC8qXG4tXHQgKiBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSBvcmRlciBiaXQgKGFuZCBhbHNvIHRoZSBsZW5ndGggb2YgdGhlXG4tXHQgKiBzaGlmdGVkIHBoeXNpY2FsIGFkZHJlc3MpIGZvciBhbiBvcmRlci0wIHBhZ2UuXG4tXHQgKi9cbi1cdEtIT19PUkRFUl8wX0xPRzIgPSA2NCAtIFBBR0VfU0hJRlQsXG4rXHQvKiBOZWVkIHRvIHN0b3JlIHRoZSBQRk4sIHBsdXMgb25lIGJpdCBmb3Igb3JkZXIuICovXG4rXHRLSE9fUkFESVhfS0VZX1dJRFRIID0gNjQgLSBQQUdFX1NISUZUICsgMSxcbiBcbiBcdC8qIFNpemUgb2YgdGhlIHRhYmxlIGluIGtob19yYWRpeF9ub2RlLCBpbiBsb2cyICovXG4gXHRLSE9fVEFCTEVfU0laRV9MT0cyID0gY29uc3RfaWxvZzIoUEFHRV9TSVpFIC8gc2l6ZW9mKHBoeXNfYWRkcl90KSksXG5AQCAtMjc0LDcgKzI3MSw3IEBAIGVudW0ga2hvX3JhZGl4X2NvbnN0cyB7XG4gXHQgKiBhbmQgMSBiaXRtYXAgbGV2ZWwuXG4gXHQgKi9cbiBcdEtIT19UUkVFX01BWF9ERVBUSCA9XG4tXHRcdERJVl9ST1VORF9VUChLSE9fT1JERVJfMF9MT0cyIC0gS0hPX0JJVE1BUF9TSVpFX0xPRzIgKyAxLFxuK1x0XHRESVZfUk9VTkRfVVAoS0hPX1JBRElYX0tFWV9XSURUSCAtIEtIT19CSVRNQVBfU0laRV9MT0cyLFxuIFx0XHRcdCAgICAgS0hPX1RBQkxFX1NJWkVfTE9HMikgKyAxLFxuIH07XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oIGIvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oXG5pbmRleCA4NGU5MThiOTZlNTNkZi4uNWQ2YWUyODkzNjg0YTQgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmhcbisrKyBiL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaFxuQEAgLTM0LDM3ICszNCw1MyBAQCBzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUge1xuIFx0c3RydWN0IG11dGV4IGxvY2s7IC8qIHByb3RlY3RzIHRoZSB0cmVlJ3Mgc3RydWN0dXJlIGFuZCByb290IHBvaW50ZXIgKi9cbiB9O1xuIFxuLXR5cGVkZWYgaW50ICgqa2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190KShwaHlzX2FkZHJfdCBwaHlzLFxuLVx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpO1xuKy8qKlxuKyAqIHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAtIENhbGxiYWNrcyBmb3IgS0hPIHJhZGl4IHRyZWUgd2Fsay5cbisgKiBAbGVhZjogICAgICBDYWxsZWQgb24gZWFjaCBwcmVzZW50IGtleSBpbiB0aGUgcmFkaXggdHJlZS5cbisgKiBAbm9kZTogICAgICBDYWxsZWQgb24gZWFjaCBub2RlIG9mIHRoZSByYWRpeCB0cmVlIGl0c2VsZi4gUmVjZWl2ZXMgdGhlXG4rICogICAgICAgICAgICAgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBub2RlLlxuKyAqXG4rICogRm9yIGVhY2ggY2FsbGJhY2ssIGEgcmV0dXJuIHZhbHVlIG9mIDAgY29udGludWVzIHRoZSB3YWxrIGFuZCBhIG5vbi16ZXJvXG4rICogcmV0dXJuIHZhbHVlIGlzIGRpcmVjdGx5IHJldHVybmVkIHRvIHRoZSBjYWxsZXIuXG4rICovXG4rc3RydWN0IGtob19yYWRpeF93YWxrX2NiIHtcbitcdGludCAoKmxlYWYpKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKTtcbitcdGludCAoKm5vZGUpKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpO1xuK307XG4gXG4gI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUlxuIFxuLWludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0ICAgICAgIHVuc2lnbmVkIGludCBvcmRlcik7XG4tXG4tdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIpO1xuLVxuK2ludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KTtcbit2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpO1xuIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0XHRraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpO1xuK1x0XHRcdGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpO1xuK2ludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KTtcbit2b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKTtcbiBcbiAjZWxzZSAgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqL1xuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIGxvbmcgcGZuLFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4rc3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSlcbiB7XG4gXHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuLVx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGludCBvcmRlcikgeyB9XG4rc3RhdGljIGlubGluZSB2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBrZXkpIHsgfVxuIFxuIHN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuLVx0XHRcdFx0ICAgICAga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuK1x0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSlcbiB7XG4gXHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxuK3tcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpIHsgfVxuK1xuICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSICovXG4gXG4gI2VuZGlmXHQvKiBfTElOVVhfS0hPX1JBRElYX1RSRUVfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaFxuaW5kZXggNWFmY2Q5OWFhOGMxNDQuLmQ2MmRiOWU3NzZjZjk0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmhcbkBAIC01MSw2ICs1MSw3IEBAIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbWF4X3Bvc3NpYmxlX3BmbjtcbiAgKiBtZW1vcnkgcmVzZXJ2YXRpb25zIHlldCwgc28gd2UgZ2V0IHNjcmF0Y2ggbWVtb3J5IGZyb20gdGhlIHByZXZpb3VzXG4gICoga2VybmVsIHRoYXQgd2Uga25vdyBpcyBnb29kIHRvIHVzZS4gSXQgaXMgdGhlIG9ubHkgbWVtb3J5IHRoYXRcbiAgKiBhbGxvY2F0aW9ucyBtYXkgaGFwcGVuIGZyb20gaW4gdGhpcyBwaGFzZS5cbisgKiBATUVNQkxPQ0tfUlNSVl9IVUdFVExCOiBtZW1vcnkgaXMgcmVzZXJ2ZWQgZm9yIGh1Z2V0bGIgcGFnZXNcbiAgKi9cbiBlbnVtIG1lbWJsb2NrX2ZsYWdzIHtcbiBcdE1FTUJMT0NLX05PTkVcdFx0PSAweDAsXHQvKiBObyBzcGVjaWFsIHJlcXVlc3QgKi9cbkBAIC02MSw2ICs2Miw3IEBAIGVudW0gbWVtYmxvY2tfZmxhZ3Mge1xuIFx0TUVNQkxPQ0tfUlNSVl9OT0lOSVRcdD0gMHgxMCxcdC8qIGRvbid0IGluaXRpYWxpemUgc3RydWN0IHBhZ2VzICovXG4gXHRNRU1CTE9DS19SU1JWX0tFUk5cdD0gMHgyMCxcdC8qIG1lbW9yeSByZXNlcnZlZCBmb3Iga2VybmVsIHVzZSAqL1xuIFx0TUVNQkxPQ0tfS0hPX1NDUkFUQ0hcdD0gMHg0MCxcdC8qIHNjcmF0Y2ggbWVtb3J5IGZvciBrZXhlYyBoYW5kb3ZlciAqL1xuK1x0TUVNQkxPQ0tfUlNSVl9IVUdFVExCXHQ9IDB4ODAsIC8qIG1lbW9yeSByZXNlcnZlZCBmb3IgaHVnZXRsYiBwYWdlcyAqL1xuIH07XG4gXG4gLyoqXG5AQCAtNDIwLDYgKzQyMiw3IEBAIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLFxuIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXG4gXHRcdFx0ICAgICBwaHlzX2FkZHJfdCBtaW5fYWRkciwgcGh5c19hZGRyX3QgbWF4X2FkZHIsXG4gXHRcdFx0ICAgICBpbnQgbmlkKTtcbit2b2lkICptZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKTtcbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKm1lbWJsb2NrX2FsbG9jKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduKVxuIHtcbkBAIC00ODQsNiArNDg3LDcgQEAgc3RhdGljIGlubGluZSBfX2luaXRfbWVtYmxvY2sgYm9vbCBtZW1ibG9ja19ib3R0b21fdXAodm9pZClcbiBwaHlzX2FkZHJfdCBtZW1ibG9ja19waHlzX21lbV9zaXplKHZvaWQpO1xuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX3NpemUodm9pZCk7XG4gcGh5c19hZGRyX3QgbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKHBoeXNfYWRkcl90IGxpbWl0LCBpbnQgbmlkKTtcbitwaHlzX2FkZHJfdCBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUocGh5c19hZGRyX3QgbGltaXQsIGludCBuaWQpO1xuIHVuc2lnbmVkIGxvbmcgbWVtYmxvY2tfZXN0aW1hdGVkX25yX2ZyZWVfcGFnZXModm9pZCk7XG4gcGh5c19hZGRyX3QgbWVtYmxvY2tfc3RhcnRfb2ZfRFJBTSh2b2lkKTtcbiBwaHlzX2FkZHJfdCBtZW1ibG9ja19lbmRfb2ZfRFJBTSh2b2lkKTtcbkBAIC02MTMsMjggKzYxNyw5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW10ZXN0X3JlcG9ydF9tZW1pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkgeyB9XG4gI2lmZGVmIENPTkZJR19NRU1CTE9DS19LSE9fU0NSQVRDSFxuIHZvaWQgbWVtYmxvY2tfc2V0X2tob19zY3JhdGNoX29ubHkodm9pZCk7XG4gdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpO1xuLWJvb2wgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpO1xuLVxuLXN0YXRpYyBpbmxpbmUgZW51bSBtaWdyYXRldHlwZSBraG9fc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0XHRcdFx0XHQgICAgICAgZW51bSBtaWdyYXRldHlwZSBtdClcbi17XG4tXHRpZiAobWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KFBGTl9QSFlTKHBmbikpKVxuLVx0XHRyZXR1cm4gTUlHUkFURV9DTUE7XG4tXHRyZXR1cm4gbXQ7XG4tfVxuICNlbHNlXG4gc3RhdGljIGlubGluZSB2b2lkIG1lbWJsb2NrX3NldF9raG9fc2NyYXRjaF9vbmx5KHZvaWQpIHsgfVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpIHsgfVxuLXN0YXRpYyBpbmxpbmUgYm9vbCBtZW1ibG9ja19pc19raG9fc2NyYXRjaF9tZW1vcnkocGh5c19hZGRyX3QgYWRkcilcbi17XG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgZW51bSBtaWdyYXRldHlwZSBraG9fc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0XHRcdFx0XHQgICAgICAgZW51bSBtaWdyYXRldHlwZSBtdClcbi17XG4tXHRyZXR1cm4gbXQ7XG4tfVxuICNlbmRpZlxuIFxuICNlbmRpZiAvKiBfTElOVVhfTUVNQkxPQ0tfSCAqL1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlIGIva2VybmVsL2xpdmV1cGRhdGUvTWFrZWZpbGVcbmluZGV4IGVlYzlkM2FlMDdlYjRiLi5kOWY0Njk0NjI1NTY3MyAxMDA2NDRcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlXG4rKysgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxuQEAgLTgsNyArOCw2IEBAIGx1by15IDo9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHRcdGx1b19zZXNzaW9uLm9cbiBcbiBvYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVIpXHRcdCs9IGtleGVjX2hhbmRvdmVyLm9cbi1vYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpXHQrPSBrZXhlY19oYW5kb3Zlcl9kZWJ1Zy5vXG4gb2JqLSQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHRlMpXHQrPSBrZXhlY19oYW5kb3Zlcl9kZWJ1Z2ZzLm9cbiBcbiBvYmotJChDT05GSUdfTElWRVVQREFURSlcdFx0Kz0gbHVvLm9cbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuaW5kZXggNDgzNGE4MDk5ODVhYjcuLjlkYzc5YjcxMDNiZGJmIDEwMDY0NFxuLS0tIGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuKysrIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuQEAgLTg0LDggKzg0LDI1IEBAIHN0YXRpYyBzdHJ1Y3Qga2hvX291dCBraG9fb3V0ID0ge1xuIFx0fSxcbiB9O1xuIFxuK3N0cnVjdCBraG9faW4ge1xuK1x0cGh5c19hZGRyX3QgZmR0X3BoeXM7XG4rXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXM7XG4rXHRjaGFyIHByZXZpb3VzX3JlbGVhc2VbX19ORVdfVVRTX0xFTiArIDFdO1xuK1x0dTMyIGtleGVjX2NvdW50O1xuK1x0c3RydWN0IGtob19kZWJ1Z2ZzIGRiZztcbitcdHN0cnVjdCBraG9fcmFkaXhfdHJlZSByYWRpeF90cmVlO1xuK307XG4rXG4rc3RhdGljIHN0cnVjdCBraG9faW4ga2hvX2luID0ge1xuK307XG4rXG4rc3RhdGljIGNvbnN0IHZvaWQgKmtob19nZXRfZmR0KHZvaWQpXG4re1xuK1x0cmV0dXJuIGtob19pbi5mZHRfcGh5cyA/IHBoeXNfdG9fdmlydChraG9faW4uZmR0X3BoeXMpIDogTlVMTDtcbit9XG4rXG4gLyoqXG4tICoga2hvX3JhZGl4X2VuY29kZV9rZXkgLSBFbmNvZGVzIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIgaW50byBhIHJhZGl4IGtleS5cbisgKiBraG9fZW5jb2RlX3JhZGl4X2tleSAtIEVuY29kZXMgYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBpbnRvIGEgcmFkaXgga2V5LlxuICAqIEBwaHlzOiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZS5cbiAgKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS5cbiAgKlxuQEAgLTk1LDM1ICsxMTIsMzggQEAgc3RhdGljIHN0cnVjdCBraG9fb3V0IGtob19vdXQgPSB7XG4gICpcbiAgKiBSZXR1cm46IFRoZSBlbmNvZGVkIHVuc2lnbmVkIGxvbmcgcmFkaXgga2V5LlxuICAqL1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGtob19yYWRpeF9lbmNvZGVfa2V5KHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGludCBvcmRlcilcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBraG9fZW5jb2RlX3JhZGl4X2tleShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBpbnQgb3JkZXIpXG4ge1xuLVx0LyogT3JkZXIgYml0cyBwYXJ0ICovXG4tXHR1bnNpZ25lZCBsb25nIGggPSAxVUwgXHUwMDNjXHUwMDNjIChLSE9fT1JERVJfMF9MT0cyIC0gb3JkZXIpO1xuLVx0LyogU2hpZnRlZCBwaHlzaWNhbCBhZGRyZXNzIHBhcnQgKi9cbi1cdHVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgXHUwMDNlXHUwMDNlIChQQUdFX1NISUZUICsgb3JkZXIpO1xuK1x0LyogVGhlIHBoeXNpY2FsIGFkZHJlc3MgaXMgZW5jb2RlZCBieSBzaGlmdGluZyB0aGUgUEZOIGJ5IGl0cyBvcmRlci4gKi9cbitcdHVuc2lnbmVkIGxvbmcgc2hpZnQgPSBQQUdFX1NISUZUICsgb3JkZXI7XG4rXHQvKiBPcmRlciBiaXQgZ29lcyByaWdodCBiZWZvcmUgdGhlIHNoaWZ0ZWQgUEZOLiAqL1xuK1x0dW5zaWduZWQgbG9uZyBoID0gMVVMIFx1MDAzY1x1MDAzYyAoNjQgLSBzaGlmdCk7XG4rXHQvKiBTaGlmdGVkIFBGTi4gKi9cbitcdHVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgXHUwMDNlXHUwMDNlIHNoaWZ0O1xuIFxuIFx0cmV0dXJuIGggfCBsO1xuIH1cbiBcbiAvKipcbi0gKiBraG9fcmFkaXhfZGVjb2RlX2tleSAtIERlY29kZXMgYSByYWRpeCBrZXkgYmFjayBpbnRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXG4rICoga2hvX2RlY29kZV9yYWRpeF9rZXkgLSBEZWNvZGVzIGEgcmFkaXgga2V5IGJhY2sgaW50byBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyLlxuICAqIEBrZXk6IFRoZSB1bnNpZ25lZCBsb25nIGtleSB0byBkZWNvZGUuXG4gICogQG9yZGVyOiBBbiBvdXRwdXQgcGFyYW1ldGVyLCBhIHBvaW50ZXIgdG8gYW4gdW5zaWduZWQgaW50IHdoZXJlIHRoZSBkZWNvZGVkXG4gICogICAgICAgICBwYWdlIG9yZGVyIHdpbGwgYmUgc3RvcmVkLlxuICAqXG4tICogVGhpcyBmdW5jdGlvbiByZXZlcnNlcyB0aGUgZW5jb2RpbmcgcGVyZm9ybWVkIGJ5IGtob19yYWRpeF9lbmNvZGVfa2V5KCksXG4rICogVGhpcyBmdW5jdGlvbiByZXZlcnNlcyB0aGUgZW5jb2RpbmcgcGVyZm9ybWVkIGJ5IGtob19lbmNvZGVfcmFkaXhfa2V5KCksXG4gICogZXh0cmFjdGluZyB0aGUgb3JpZ2luYWwgcGh5c2ljYWwgYWRkcmVzcyBhbmQgcGFnZSBvcmRlciBmcm9tIGEgZ2l2ZW4ga2V5LlxuICAqXG4gICogUmV0dXJuOiBUaGUgZGVjb2RlZCBwaHlzaWNhbCBhZGRyZXNzLlxuICAqL1xuLXN0YXRpYyBwaHlzX2FkZHJfdCBraG9fcmFkaXhfZGVjb2RlX2tleSh1bnNpZ25lZCBsb25nIGtleSwgdW5zaWduZWQgaW50ICpvcmRlcilcbitzdGF0aWMgcGh5c19hZGRyX3Qga2hvX2RlY29kZV9yYWRpeF9rZXkodW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGludCAqb3JkZXIpXG4ge1xuLVx0dW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSk7XG4rXHQvKiBmbHM2NCgpIGluZGV4ZXMgc3RhcnRpbmcgZnJvbSAxLiAqL1xuK1x0dW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSkgLSAxO1xuIFx0cGh5c19hZGRyX3QgcGh5cztcbiBcbi1cdC8qIG9yZGVyX2JpdCBpcyBudW1iZXJlZCBzdGFydGluZyBhdCAxIGZyb20gZmxzNjQgKi9cbi1cdCpvcmRlciA9IEtIT19PUkRFUl8wX0xPRzIgLSBvcmRlcl9iaXQgKyAxO1xuLVx0LyogVGhlIG9yZGVyIGlzIGRpc2NhcmRlZCBieSB0aGUgc2hpZnQgKi9cbitcdC8qIG9yZGVyIGJpdCBnb2VzIHJpZ2h0IGJlZm9yZSB0aGUgc2hpZnRlZCBQRk4uICovXG4rXHQqb3JkZXIgPSA2NCAtIChQQUdFX1NISUZUICsgb3JkZXJfYml0KTtcbitcdC8qIFRoZSBvcmRlciBiaXQgaXMgZGlzY2FyZGVkIGJ5IHRoZSBzaGlmdCAqL1xuIFx0cGh5cyA9IGtleSBcdTAwM2NcdTAwM2MgKFBBR0VfU0hJRlQgKyAqb3JkZXIpO1xuIFxuIFx0cmV0dXJuIHBoeXM7XG5AQCAtMTQzLDI1ICsxNjMsNDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX3JhZGl4X2dldF90YWJsZV9pbmRleCh1bnNpZ25lZCBsb25nIGtleSxcbiBcdHJldHVybiAoa2V5IFx1MDAzZVx1MDAzZSBzKSAlICgxIFx1MDAzY1x1MDAzYyBLSE9fVEFCTEVfU0laRV9MT0cyKTtcbiB9XG4gXG4rc3RhdGljIHZvaWQgX19yZWYgKmtob19yYWRpeF9hbGxvY19ub2RlKHZvaWQpXG4re1xuK1x0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlO1xuK1xuK1x0aWYgKHNsYWJfaXNfYXZhaWxhYmxlKCkpXG4rXHRcdG5vZGUgPSAoc3RydWN0IGtob19yYWRpeF9ub2RlICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xuK1x0ZWxzZVxuK1x0XHRub2RlID0gbWVtYmxvY2tfYWxsb2MoUEFHRV9TSVpFLCBQQUdFX1NJWkUpO1xuK1xuK1x0cmV0dXJuIG5vZGU7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIF9fcmVmIGtob19yYWRpeF9mcmVlX25vZGUoc3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlKVxuK3tcbitcdGlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKVxuK1x0XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpbm9kZSk7XG4rXHRlbHNlXG4rXHRcdG1lbWJsb2NrX2ZyZWUobm9kZSwgUEFHRV9TSVpFKTtcbit9XG4rXG4gLyoqXG4tICoga2hvX3JhZGl4X2FkZF9wYWdlIC0gTWFya3MgYSBwYWdlIGFzIHByZXNlcnZlZCBpbiB0aGUgcmFkaXggdHJlZS5cbisgKiBraG9fcmFkaXhfYWRkX2tleSAtIEFkZCBhIGtleSB0byB0aGUgcmFkaXggdHJlZS5cbiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLlxuLSAqIEBwZm46IFRoZSBwYWdlIGZyYW1lIG51bWJlciBvZiB0aGUgcGFnZSB0byBwcmVzZXJ2ZS5cbi0gKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS5cbisgKiBAa2V5OiBUaGUga2V5IHRvIGFkZC5cbiAgKlxuLSAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGJhc2VkIG9uIHRoZSBrZXkgZGVyaXZlZCBmcm9tIEBwZm5cbi0gKiBhbmQgQG9yZGVyLiBJdCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGVcbi0gKiBwYWdlIGZvciBwcmVzZXJ2YXRpb24uIElmIGludGVybWVkaWF0ZSBub2RlcyBkbyBub3QgZXhpc3QgYWxvbmcgdGhlIHBhdGgsXG4tICogdGhleSBhcmUgYWxsb2NhdGVkIGFuZCBhZGRlZCB0byB0aGUgdHJlZS5cbisgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBiYXNlZCBvbiB0aGUgQGtleSBwcm92aWRlZC4gSXQgc2V0cyB0aGVcbisgKiBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGUgQGtleSBhcyBwcmVzZW50LiBJZlxuKyAqIGludGVybWVkaWF0ZSBub2RlcyBkbyBub3QgZXhpc3QgYWxvbmcgdGhlIHBhdGgsIHRoZXkgYXJlIGFsbG9jYXRlZCBhbmQgYWRkZWRcbisgKiB0byB0aGUgdHJlZS5cbisgKlxuKyAqIE5PVEU6IEN1cnJlbnRseSBvbmx5IGtleXMgb2Ygd2lkdGggdXAgdG8gJUtIT19SQURJWF9LRVlfV0lEVEggYXJlIHN1cHBvcnRlZC5cbisgKiBUaGlzIGxpbWl0IG9ubHkgZXhpc3RzIGJlY2F1c2UgY3VycmVudCB1c2VycyBvZiB0aGUgcmFkaXggdHJlZSBkb24ndCB1c2UgbW9yZVxuKyAqIHRoYW4gdGhhdC4gQ2hhbmdpbmcgdGhlIG1heGltdW0gd2lkdGggcmVxdWlyZXMgY2hhbmdpbmcgdGhlIHRyZWUgZGVwdGgsIHdoaWNoXG4rICogbmVlZHMgYnVtcGluZyB0aGUgQUJJIHZlcnNpb24uXG4gICpcbiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuXG4gICovXG4taW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4tXHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgaW50IG9yZGVyKVxuK2ludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxuIHtcbiBcdC8qIE5ld2x5IGFsbG9jYXRlZCBub2RlcyBmb3IgZXJyb3IgY2xlYW51cCAqL1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICppbnRlcm1lZGlhdGVfbm9kZXNbS0hPX1RSRUVfTUFYX0RFUFRIXSA9IHsgMCB9O1xuLVx0dW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7XG4gXHRzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKmFuY2hvcl9ub2RlID0gTlVMTDtcbiBcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSA9IHRyZWUtXHUwMDNlcm9vdDtcbiBcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbmV3X25vZGU7XG5AQCAtMTcyLDYgKzIxNCw5IEBAIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuIFx0aWYgKFdBUk5fT05fT05DRSghdHJlZS1cdTAwM2Vyb290KSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4rXHRpZiAodW5saWtlbHkoZmxzNjQoa2V5KSBcdTAwM2UgS0hPX1JBRElYX0tFWV9XSURUSCkpXG4rXHRcdHJldHVybiAtRVJBTkdFO1xuK1xuIFx0bWlnaHRfc2xlZXAoKTtcbiBcbiBcdGd1YXJkKG11dGV4KShcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuQEAgLTE4Niw3ICsyMzEsNyBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBcdFx0fVxuIFxuIFx0XHQvKiBOZXh0IG5vZGUgaXMgZW1wdHksIGNyZWF0ZSBhIG5ldyBub2RlIGZvciBpdCAqL1xuLVx0XHRuZXdfbm9kZSA9IChzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4rXHRcdG5ld19ub2RlID0ga2hvX3JhZGl4X2FsbG9jX25vZGUoKTtcbiBcdFx0aWYgKCFuZXdfbm9kZSkge1xuIFx0XHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdFx0Z290byBlcnJfZnJlZV9ub2RlcztcbkBAIC0yMTcsMjkgKzI2MiwyNiBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBlcnJfZnJlZV9ub2RlczpcbiBcdGZvciAoaSA9IEtIT19UUkVFX01BWF9ERVBUSCAtIDE7IGkgXHUwMDNlIDA7IGktLSkge1xuIFx0XHRpZiAoaW50ZXJtZWRpYXRlX25vZGVzW2ldKVxuLVx0XHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylpbnRlcm1lZGlhdGVfbm9kZXNbaV0pO1xuK1x0XHRcdGtob19yYWRpeF9mcmVlX25vZGUoaW50ZXJtZWRpYXRlX25vZGVzW2ldKTtcbiBcdH1cbiBcdGlmIChhbmNob3Jfbm9kZSlcbiBcdFx0YW5jaG9yX25vZGUtXHUwMDNldGFibGVbYW5jaG9yX2lkeF0gPSAwO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG4tRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X2FkZF9wYWdlKTtcbitFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7XG4gXG4gLyoqXG4tICoga2hvX3JhZGl4X2RlbF9wYWdlIC0gUmVtb3ZlcyBhIHBhZ2UncyBwcmVzZXJ2YXRpb24gc3RhdHVzIGZyb20gdGhlIHJhZGl4IHRyZWUuXG4rICoga2hvX3JhZGl4X2RlbF9rZXkgLSBSZW1vdmVzIHRoZSBrZXkgZnJvbSB0aGUgcmFkaXggdHJlZS5cbiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLlxuLSAqIEBwZm46IFRoZSBwYWdlIGZyYW1lIG51bWJlciBvZiB0aGUgcGFnZSB0byB1bnByZXNlcnZlLlxuLSAqIEBvcmRlcjogVGhlIG9yZGVyIG9mIHRoZSBwYWdlLlxuKyAqIEBrZXk6IFRoZSBrZXkgdG8gcmVtb3ZlLlxuICAqXG4gICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNsZWFycyB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG9cbi0gKiB0aGUgcGFnZSwgZWZmZWN0aXZlbHkgcmVtb3ZpbmcgaXRzIFwicHJlc2VydmVkXCIgc3RhdHVzLiBJdCBkb2VzIG5vdCBmcmVlXG4tICogdGhlIHRyZWUncyBpbnRlcm1lZGlhdGUgbm9kZXMsIGV2ZW4gaWYgdGhleSBiZWNvbWUgZW1wdHkuXG4rICogdGhlIEBrZXksIGVmZmVjdGl2ZWx5IHJlbW92aW5nIGl0IGZyb20gdGhlIHRyZWUuIEl0IGRvZXMgbm90IGZyZWUgdGhlIHRyZWUnc1xuKyAqIGludGVybWVkaWF0ZSBub2RlcywgZXZlbiBpZiB0aGV5IGJlY29tZSBlbXB0eS5cbiAgKi9cbi12b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuLVx0XHRcdHVuc2lnbmVkIGludCBvcmRlcilcbit2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpXG4ge1xuLVx0dW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7XG4gXHRzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGUgPSB0cmVlLVx1MDAzZXJvb3Q7XG4gXHRzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWY7XG4gXHR1bnNpZ25lZCBpbnQgaSwgaWR4O1xuQEAgLTI0Nyw2ICsyODksMTAgQEAgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcbiBcdGlmIChXQVJOX09OX09OQ0UoIXRyZWUtXHUwMDNlcm9vdCkpXG4gXHRcdHJldHVybjtcbiBcbitcdC8qIEtleXMgd2lkZXIgdGhhbiBLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBub3QgYWxsb3dlZCB0byBiZSBhZGRlZC4gKi9cbitcdGlmICh1bmxpa2VseShmbHM2NChrZXkpIFx1MDAzZSBLSE9fUkFESVhfS0VZX1dJRFRIKSlcbitcdFx0cmV0dXJuO1xuK1xuIFx0bWlnaHRfc2xlZXAoKTtcbiBcbiBcdGd1YXJkKG11dGV4KShcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuQEAgLTI3MCwyMSArMzE2LDg1IEBAIHZvaWQga2hvX3JhZGl4X2RlbF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBwZm4sXG4gXHRpZHggPSBraG9fcmFkaXhfZ2V0X2JpdG1hcF9pbmRleChrZXkpO1xuIFx0X19jbGVhcl9iaXQoaWR4LCBsZWFmLVx1MDAzZWJpdG1hcCk7XG4gfVxuLUVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZWxfcGFnZSk7XG4rRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X2RlbF9rZXkpO1xuK1xuK3N0YXRpYyB2b2lkIF9fa2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGludCBsZXZlbClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRpZiAobGV2ZWwgPT0gMCkge1xuK1x0XHRraG9fcmFkaXhfZnJlZV9ub2RlKHJvb3QpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBQQUdFX1NJWkUgLyBzaXplb2YocGh5c19hZGRyX3QpOyBpKyspIHtcbitcdFx0aWYgKHJvb3QtXHUwMDNldGFibGVbaV0pXG4rXHRcdFx0X19raG9fcmFkaXhfZGVzdHJveV90cmVlKHBoeXNfdG9fdmlydChyb290LVx1MDAzZXRhYmxlW2ldKSxcbitcdFx0XHRcdFx0XHQgbGV2ZWwgLSAxKTtcbitcdH1cbitcbitcdGtob19yYWRpeF9mcmVlX25vZGUocm9vdCk7XG4rfVxuK1xuKy8qKlxuKyAqIGtob19yYWRpeF9pbml0X3RyZWUgLSBpbml0aWFsaXplIHRoZSByYWRpeCB0cmVlLlxuKyAqIEB0cmVlOiAgIHRoZSB0cmVlIHRvIGluaXRpYWxpemUuXG4rICogQHJvb3Q6ICAgcm9vdCB0YWJsZSBvZiB0aGUgcmFkaXggdHJlZS5cbisgKlxuKyAqIEluaXRpYWxpemUgdGhlIHJhZGl4IHRyZWUgd2l0aCB0aGUgZ2l2ZW4gcm9vdCBub2RlLiBJZiByb290IGlzICVOVUxMLCBhblxuKyAqIGVtcHR5IHJvb3QgdGFibGUgaXMgYWxsb2NhdGVkLiBJZiByb290IGlzIG5vdCAlTlVMTCwgaXQgaXMgdGhlIGNhbGxlcidzXG4rICogcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoZSByb290IGlzIHZhbGlkIGFuZCBpbiB0aGUgY29ycmVjdCBmb3JtYXQuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuXG4rICovXG4raW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpXG4re1xuK1x0aWYgKCFyb290KVxuK1x0XHRyb290ID0ga2hvX3JhZGl4X2FsbG9jX25vZGUoKTtcbitcdGlmICghcm9vdClcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHR0cmVlLVx1MDAzZXJvb3QgPSByb290O1xuK1x0bXV0ZXhfaW5pdChcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuK1x0cmV0dXJuIDA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpO1xuK1xuKy8qKlxuKyAqIGtob19yYWRpeF9kZXN0cm95X3RyZWUgLSBEZXN0cm95IHRoZSByYWRpeCB0cmVlXG4rICogQHRyZWU6IFRoZSByYWRpeCB0cmVlIHRvIGRlc3Ryb3lcbisgKlxuKyAqIFdhbGsgQHRyZWUgYW5kIGZyZWUgYWxsIGl0cyBub2Rlcy5cbisgKi9cbit2b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKVxuK3tcbitcdGlmICghdHJlZS1cdTAwM2Vyb290KVxuK1x0XHRyZXR1cm47XG4rXG4rXHRfX2tob19yYWRpeF9kZXN0cm95X3RyZWUodHJlZS1cdTAwM2Vyb290LCBLSE9fVFJFRV9NQVhfREVQVEggLSAxKTtcbitcdHRyZWUtXHUwMDNlcm9vdCA9IE5VTEw7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZXN0cm95X3RyZWUpO1xuIFxuLXN0YXRpYyBpbnQga2hvX3JhZGl4X3dhbGtfbGVhZihzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWYsXG4tXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcga2V5LFxuLVx0XHRcdCAgICAgICBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXG4rc3RhdGljIGludCBraG9fcmFkaXhfd2Fsa19sZWFmKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZiwgdW5zaWduZWQgbG9uZyBrZXksXG4rXHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilsZWFmO1xuLVx0dW5zaWduZWQgaW50IG9yZGVyO1xuLVx0cGh5c19hZGRyX3QgcGh5cztcbiBcdHVuc2lnbmVkIGludCBpO1xuIFx0aW50IGVycjtcbiBcbitcdGlmIChjYi1cdTAwM2Vub2RlKSB7XG4rXHRcdGVyciA9IGNiLVx1MDAzZW5vZGUodmlydF90b19waHlzKGxlYWYpLCBkYXRhKTtcbitcdFx0aWYgKGVycilcbitcdFx0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuK1x0aWYgKCFjYi1cdTAwM2VsZWFmKVxuK1x0XHRyZXR1cm4gMDtcbitcbiBcdGZvcl9lYWNoX3NldF9iaXQoaSwgYml0bWFwLCBQQUdFX1NJWkUgKiBCSVRTX1BFUl9CWVRFKSB7XG4tXHRcdHBoeXMgPSBraG9fcmFkaXhfZGVjb2RlX2tleShrZXkgfCBpLCBcdTAwMjZvcmRlcik7XG4tXHRcdGVyciA9IGNiKHBoeXMsIG9yZGVyKTtcbitcdFx0ZXJyID0gY2ItXHUwMDNlbGVhZihrZXkgfCBpLCBkYXRhKTtcbiBcdFx0aWYgKGVycilcbiBcdFx0XHRyZXR1cm4gZXJyO1xuIFx0fVxuQEAgLTI5NCw3ICs0MDQsNyBAQCBzdGF0aWMgaW50IGtob19yYWRpeF93YWxrX2xlYWYoc3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmLFxuIFxuIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcbiBcdFx0XHRcdCB1bnNpZ25lZCBpbnQgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tXHRcdFx0XHQga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuK1x0XHRcdFx0IGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlO1xuIFx0c3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmO1xuQEAgLTMwMiw2ICs0MTIsMTIgQEAgc3RhdGljIGludCBfX2tob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuIFx0dW5zaWduZWQgaW50IHNoaWZ0O1xuIFx0aW50IGVycjtcbiBcbitcdGlmIChjYi1cdTAwM2Vub2RlKSB7XG4rXHRcdGVyciA9IGNiLVx1MDAzZW5vZGUodmlydF90b19waHlzKHJvb3QpLCBkYXRhKTtcbitcdFx0aWYgKGVycilcbitcdFx0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUEFHRV9TSVpFIC8gc2l6ZW9mKHBoeXNfYWRkcl90KTsgaSsrKSB7XG4gXHRcdGlmICghcm9vdC1cdTAwM2V0YWJsZVtpXSlcbiBcdFx0XHRjb250aW51ZTtcbkBAIC0zMTgsMTAgKzQzNCwxMCBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXG4gXHRcdFx0ICogbm9kZSBpcyBwb2ludGluZyB0byB0aGUgbGV2ZWwgMCBiaXRtYXAuXG4gXHRcdFx0ICovXG4gXHRcdFx0bGVhZiA9IChzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKilub2RlO1xuLVx0XHRcdGVyciA9IGtob19yYWRpeF93YWxrX2xlYWYobGVhZiwga2V5LCBjYik7XG4rXHRcdFx0ZXJyID0ga2hvX3JhZGl4X3dhbGtfbGVhZihsZWFmLCBrZXksIGNiLCBkYXRhKTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRlcnIgID0gX19raG9fcmFkaXhfd2Fsa190cmVlKG5vZGUsIGxldmVsIC0gMSxcbi1cdFx0XHRcdFx0XHQgICAgIGtleSwgY2IpO1xuK1x0XHRcdFx0XHRcdCAgICAga2V5LCBjYiwgZGF0YSk7XG4gXHRcdH1cbiBcbiBcdFx0aWYgKGVycilcbkBAIC0zMzIsMjggKzQ0OCwyNyBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXG4gfVxuIFxuIC8qKlxuLSAqIGtob19yYWRpeF93YWxrX3RyZWUgLSBUcmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNhbGxzIGEgY2FsbGJhY2sgZm9yIGVhY2ggcHJlc2VydmVkIHBhZ2UuXG4rICoga2hvX3JhZGl4X3dhbGtfdHJlZSAtIFRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBhbmQgY2FsbHMgYSBjYWxsYmFjayBmb3IgZWFjaCBrZXkuXG4gICogQHRyZWU6IEEgcG9pbnRlciB0byB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gd2Fsay5cbi0gKiBAY2I6IEEgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdHlwZSBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgdGhhdCB3aWxsIGJlXG4tICogICAgICBpbnZva2VkIGZvciBlYWNoIHByZXNlcnZlZCBwYWdlIGZvdW5kIGluIHRoZSB0cmVlLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXNcbi0gKiAgICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBvZiB0aGUgcHJlc2VydmVkIHBhZ2UuXG4rICogQGNiOiAgIFNldCBvZiBjYWxsYmFja3MgdG8gYmUgaW52b2tlZCBkdXJpbmcgdGhlIHRyZWUgd2Fsay5cbisgKiBAZGF0YTogT3BhcXVlIGRhdGEgcG9pbnRlciBwYXNzZWQgdG8gZWFjaCBjYWxsYmFjayBpbiBAY2IuXG4gICpcbi0gKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIHRoZSByYWRpeCB0cmVlLCBzZWFyY2hpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHRvcCBsZXZlbFxuLSAqIGRvd24gdG8gdGhlIGxvd2VzdCBsZXZlbCAobGV2ZWwgMCkuIEZvciBlYWNoIHByZXNlcnZlZCBwYWdlIGZvdW5kLCBpdCBpbnZva2VzXG4tICogdGhlIHByb3ZpZGVkIGNhbGxiYWNrLCBwYXNzaW5nIHRoZSBwYWdlJ3MgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXG4rICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHRvcCBsZXZlbCBkb3duIHRvIHRoZVxuKyAqIGxvd2VzdCBsZXZlbCAobGV2ZWwgMCksIGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MuXG4gICpcbiAgKiBSZXR1cm46IDAgaWYgdGhlIHdhbGsgY29tcGxldGVkIHRoZSBzcGVjaWZpZWQgdHJlZSwgb3IgdGhlIG5vbi16ZXJvIHJldHVyblxuICAqICAgICAgICAgdmFsdWUgZnJvbSB0aGUgY2FsbGJhY2sgdGhhdCBzdG9wcGVkIHRoZSB3YWxrLlxuICAqL1xuIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0XHRraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXG4rXHRcdFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSlcbiB7XG4gXHRpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLVx1MDAzZXJvb3QpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiBcdGd1YXJkKG11dGV4KShcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuIFxuLVx0cmV0dXJuIF9fa2hvX3JhZGl4X3dhbGtfdHJlZSh0cmVlLVx1MDAzZXJvb3QsIEtIT19UUkVFX01BWF9ERVBUSCAtIDEsIDAsIGNiKTtcbitcdHJldHVybiBfX2tob19yYWRpeF93YWxrX3RyZWUodHJlZS1cdTAwM2Vyb290LCBLSE9fVFJFRV9NQVhfREVQVEggLSAxLCAwLCBjYixcbitcdFx0XHRcdCAgICAgZGF0YSk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF93YWxrX3RyZWUpO1xuIFxuQEAgLTQ4NCwxMyArNTk5LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqX19pbml0IGtob19nZXRfcHJlc2VydmVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyxcbiBcdHJldHVybiBwZm5fdG9fcGFnZShwZm4pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9faW5pdCBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlKHBoeXNfYWRkcl90IHBoeXMsXG4tXHRcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4rc3RhdGljIGludCBfX2luaXQga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcbiB7XG4gXHR1bmlvbiBraG9fcGFnZV9pbmZvIGluZm87XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdHVuc2lnbmVkIGludCBvcmRlcjtcbitcdHBoeXNfYWRkcl90IHBoeXM7XG4gXHR1NjQgc3o7XG4gXG4rXHRwaHlzID0ga2hvX2RlY29kZV9yYWRpeF9rZXkoa2V5LCBcdTAwMjZvcmRlcik7XG4rXG4gXHRzeiA9IDEgXHUwMDNjXHUwMDNjIChvcmRlciArIFBBR0VfU0hJRlQpO1xuIFx0cGFnZSA9IGtob19nZXRfcHJlc2VydmVkX3BhZ2UocGh5cywgb3JkZXIpO1xuIFxuQEAgLTUwNCwxOSArNjIyLDI0IEBAIHN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cyxcbiBcdHJldHVybiAwO1xuIH1cbiBcbi0vKiBSZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovXG4tc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBraG9fZ2V0X21lbV9tYXBfcGh5cyhjb25zdCB2b2lkICpmZHQpXG4rLyogUmV0dXJucyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovXG4rc3RhdGljIF9faW5pdCB2b2lkICpraG9fZ2V0X21lbV9tYXAoY29uc3Qgdm9pZCAqZmR0KVxuIHtcbiBcdGNvbnN0IHZvaWQgKm1lbV9wdHI7XG4rXHRwaHlzX2FkZHJfdCBtZW1fbWFwX3BoeXM7XG4gXHRpbnQgbGVuO1xuIFxuIFx0bWVtX3B0ciA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgXHUwMDI2bGVuKTtcbiBcdGlmICghbWVtX3B0ciB8fCBsZW4gIT0gc2l6ZW9mKHU2NCkpIHtcbiBcdFx0cHJfZXJyKFwiZmFpbGVkIHRvIGdldCBwcmVzZXJ2ZWQgbWVtb3J5IG1hcFxcblwiKTtcbi1cdFx0cmV0dXJuIDA7XG4rXHRcdHJldHVybiBOVUxMO1xuIFx0fVxuIFxuLVx0cmV0dXJuIGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKW1lbV9wdHIpO1xuK1x0bWVtX21hcF9waHlzID0gZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTY0ICopbWVtX3B0cik7XG4rXHRpZiAoIW1lbV9tYXBfcGh5cylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRyZXR1cm4gcGh5c190b192aXJ0KG1lbV9tYXBfcGh5cyk7XG4gfVxuIFxuIC8qXG5AQCAtNjE5LDE5ICs3NDIsMjQgQEAgZWFybHlfcGFyYW0oXCJraG9fc2NyYXRjaFwiLCBraG9fcGFyc2Vfc2NyYXRjaF9zaXplKTtcbiBzdGF0aWMgdm9pZCBfX2luaXQgc2NyYXRjaF9zaXplX3VwZGF0ZSh2b2lkKVxuIHtcbiBcdC8qXG4tXHQgKiBJZiBmaXhlZCBzaXplcyBhcmUgbm90IHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUsIGNhbGN1bGF0ZSB0aGVtXG4tXHQgKiBub3cuXG4rXHQgKiBJZiBmaXhlZCBzaXplcyBhcmUgbm90IHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUsIGNhbGN1bGF0ZSB0aGVtIG5vdy5cbitcdCAqIFJlbW92ZSBIdWdlVExCIGFsbG9jYXRpb25zIGZyb20gaXQgYmVjYXVzZSB0aGV5IG5ldmVyIGdldCBhbGxvY2F0ZWRcbitcdCAqIGZyb20gc2NyYXRjaC5cbiBcdCAqL1xuIFx0aWYgKHNjcmF0Y2hfc2NhbGUpIHtcbiBcdFx0cGh5c19hZGRyX3Qgc2l6ZTtcbiBcbiBcdFx0c2l6ZSA9IG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShBUkNIX0xPV19BRERSRVNTX0xJTUlULFxuIFx0XHRcdFx0XHRcdCAgIE5VTUFfTk9fTk9ERSk7XG4rXHRcdHNpemUgLT0gbWVtYmxvY2tfcmVzZXJ2ZWRfaHVnZXRsYl9zaXplKEFSQ0hfTE9XX0FERFJFU1NfTElNSVQsXG4rXHRcdFx0XHRcdFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XG4gXHRcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMDtcbiBcdFx0c2NyYXRjaF9zaXplX2xvd21lbSA9IHNpemU7XG4gXG4gXHRcdHNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsXG4gXHRcdFx0XHRcdFx0ICAgTlVNQV9OT19OT0RFKTtcbitcdFx0c2l6ZSAtPSBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsXG4rXHRcdFx0XHRcdFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XG4gXHRcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMCAtIHNjcmF0Y2hfc2l6ZV9sb3dtZW07XG4gXHRcdHNjcmF0Y2hfc2l6ZV9nbG9iYWwgPSBzaXplO1xuIFx0fVxuQEAgLTY1MSw2ICs3NzksOSBAQCBzdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHNjcmF0Y2hfc2l6ZV9ub2RlKGludCBuaWQpXG4gXHRpZiAoc2NyYXRjaF9zY2FsZSkge1xuIFx0XHRzaXplID0gbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKE1FTUJMT0NLX0FMTE9DX0FOWVdIRVJFLFxuIFx0XHRcdFx0XHRcdCAgIG5pZCk7XG4rXHRcdC8qIERvIG5vdCBjb3VudCBIdWdlVExCIHBhZ2VzLiAqL1xuK1x0XHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcbitcdFx0XHRcdFx0XHQgICAgICAgbmlkKTtcbiBcdFx0c2l6ZSA9IHNpemUgKiBzY3JhdGNoX3NjYWxlIC8gMTAwO1xuIFx0fSBlbHNlIHtcbiBcdFx0c2l6ZSA9IHNjcmF0Y2hfc2l6ZV9wZXJub2RlO1xuQEAgLTY1OSw2ICs3OTAsNDkgQEAgc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBzY3JhdGNoX3NpemVfbm9kZShpbnQgbmlkKVxuIFx0cmV0dXJuIHJvdW5kX3VwKHNpemUsIENNQV9NSU5fQUxJR05NRU5UX0JZVEVTKTtcbiB9XG4gXG4rYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxuK3tcbitcdHBoeXNfYWRkcl90IHNjcmF0Y2hfc3RhcnQsIHNjcmF0Y2hfZW5kO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBraG9fc2NyYXRjaF9jbnQ7IGkrKykge1xuK1x0XHRzY3JhdGNoX3N0YXJ0ID0ga2hvX3NjcmF0Y2hbaV0uYWRkcjtcbitcdFx0c2NyYXRjaF9lbmQgPSBraG9fc2NyYXRjaFtpXS5hZGRyICsga2hvX3NjcmF0Y2hbaV0uc2l6ZTtcbitcbitcdFx0aWYgKHBoeXMgXHUwMDNjIHNjcmF0Y2hfZW5kIFx1MDAyNlx1MDAyNiAocGh5cyArIHNpemUpIFx1MDAzZSBzY3JhdGNoX3N0YXJ0KVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisvKlxuKyAqIE1hcmsgYWxsIEtITyBzY3JhdGNoIHBhZ2VibG9ja3MgYmV0d2VlbiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gYXNcbisgKiBNSUdSQVRFX0NNQS5cbisgKi9cbit2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbilcbit7XG4rXHRmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSBcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyBzY3JhdGNoX3N0YXJ0LCBzY3JhdGNoX2VuZCwgcGZuO1xuK1xuK1x0XHRzY3JhdGNoX3N0YXJ0ID0gUEhZU19QRk4oa2hvX3NjcmF0Y2hbaV0uYWRkcik7XG4rXHRcdHNjcmF0Y2hfZW5kID0gUEhZU19QRk4oa2hvX3NjcmF0Y2hbaV0uYWRkciArIGtob19zY3JhdGNoW2ldLnNpemUpO1xuK1xuK1x0XHQvKiBUYXJnZXQgcmFuZ2UgZG9lc24ndCBvdmVybGFwIHdpdGggc2NyYXRjaC4gKi9cbitcdFx0aWYgKHN0YXJ0X3BmbiBcdTAwM2U9IHNjcmF0Y2hfZW5kIHx8IGVuZF9wZm4gXHUwMDNjPSBzY3JhdGNoX3N0YXJ0KVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRwZm4gPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBzdGFydF9wZm4sIHNjcmF0Y2hfc3RhcnQpO1xuK1x0XHRwZm4gPSBwYWdlYmxvY2tfc3RhcnRfcGZuKHBmbik7XG4rXG4rXHRcdHdoaWxlIChwZm4gXHUwMDNjIGVuZF9wZm4gXHUwMDI2XHUwMDI2IHBmbiBcdTAwM2Mgc2NyYXRjaF9lbmQpIHtcbitcdFx0XHRpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwZm5fdG9fcGFnZShwZm4pLFxuK1x0XHRcdFx0XHRcdCAgIE1JR1JBVEVfQ01BLCBmYWxzZSk7XG4rXHRcdFx0cGZuICs9IHBhZ2VibG9ja19ucl9wYWdlcztcbitcdFx0fVxuK1x0fVxuK31cbitcbiAvKipcbiAgKiBraG9fcmVzZXJ2ZV9zY3JhdGNoIC0gUmVzZXJ2ZSBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IGZvciBrZXhlY1xuICAqXG5AQCAtNzQ2LDYgKzkyMCwxMjggQEAgc3RhdGljIHZvaWQgX19pbml0IGtob19yZXNlcnZlX3NjcmF0Y2godm9pZClcbiBcdGtob19lbmFibGUgPSBmYWxzZTtcbiB9XG4gXG4rLypcbisgKiBMb29rIGZvciBmcmVlIGJsb2NrcyBvZiAxRy4gVGhpcyBpcyBhIGhldXJpc3RpYyBjaG9zZW4gdG8gd29yayBlZmZpY2llbnRseVxuKyAqIHdpdGggbGFyZ2Ugc3lzdGVtcyB3aXRoIGh1bmRyZWRzIG9mIGdpZ2FieXRlcyBvZiBtZW1vcnkuIEl0IHdpbGwgd29yayBwb29ybHlcbisgKiBvbiBzbWFsbGVyIHN5c3RlbXMuIFRoZSBhbGdvcml0aG0gaXRzZWxmIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBhY3R1YWwgdmFsdWUsXG4rICogc28gaXQgY2FuIGJlIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgaGV1cmlzdGljIGxhdGVyIGlmIG5lZWRlZC5cbisgKi9cbisjZGVmaW5lIEtIT19FWFRfQkxLU0laRVx0XHRTWl8xR1xuKyNkZWZpbmUgS0hPX0VYVF9TSElGVFx0XHRjb25zdF9pbG9nMihLSE9fRVhUX0JMS1NJWkUpXG4rXG4rLyogQ2FsbGVkIGZvciB0aGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZS4gKi9cbitzdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbGVhZih1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcbit7XG4rXHQvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqL1xuK1x0c3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlID0gZGF0YTtcbitcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4rXHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4rXHRpbnQgZXJyO1xuK1xuK1x0c3RhcnQgPSBraG9fZGVjb2RlX3JhZGl4X2tleShrZXksIFx1MDAyNm9yZGVyKTtcbitcdGVuZCA9IHN0YXJ0ICsgKDFVTCBcdTAwM2NcdTAwM2MgKG9yZGVyICsgUEFHRV9TSElGVCkpO1xuK1xuK1x0d2hpbGUgKHN0YXJ0IFx1MDAzYyBlbmQpIHtcbitcdFx0ZXJyID0ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgc3RhcnQgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdHJldHVybiBlcnI7XG4rXG4rXHRcdHN0YXJ0ICs9ICgxVUwgXHUwMDNjXHUwMDNjIEtIT19FWFRfU0hJRlQpO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIENhbGxlZCBmb3IgdGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUuICovXG4rc3RhdGljIGludCBfX2luaXQga2hvX2V4dF93YWxrX25vZGUocGh5c19hZGRyX3QgcGh5cywgdm9pZCAqZGF0YSlcbit7XG4rXHQvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqL1xuK1x0c3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlID0gZGF0YTtcbitcbitcdHJldHVybiBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBwaHlzIFx1MDAzZVx1MDAzZSBLSE9fRVhUX1NISUZUKTtcbit9XG4rXG4rLyogQ2FsbGVkIGZvciB0aGUgZnJlZSBibG9jayByYWRpeCB0cmVlLiAqL1xuK3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfbWFya19zY3JhdGNoKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKVxuK3tcbitcdHBoeXNfYWRkcl90ICpwcmV2X2VuZCA9IGRhdGE7XG4rXHRwaHlzX2FkZHJfdCBzdGFydCA9IGtleSBcdTAwM2NcdTAwM2MgS0hPX0VYVF9TSElGVDtcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoc3RhcnQgXHUwMDNlICpwcmV2X2VuZCkge1xuK1x0XHRlcnIgPSBtZW1ibG9ja19tYXJrX2tob19zY3JhdGNoKCpwcmV2X2VuZCwgc3RhcnQgLSAqcHJldl9lbmQpO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHQqcHJldl9lbmQgPSBzdGFydCArICgxVUwgXHUwMDNjXHUwMDNjIEtIT19FWFRfU0hJRlQpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qXG4rICoga2hvX2V4dGVuZF9zY3JhdGNoIC0gRXh0ZW5kIHRoZSBzY3JhdGNoIHJlZ2lvbnNcbisgKlxuKyAqIFRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlIG1peGVzIGJvdGggcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXJcbisgKiBpbnRvIGEgc2luZ2xlIGtleS4gVGhpcyBtYWtlcyBpdCBoYXJkIHRvIGxvb2sgZm9yIGZyZWUgcmFuZ2VzIGRpcmVjdGx5LiBUaGlzXG4rICogZnVuY3Rpb24gZmlyc3Qgd2Fsa3MgdGhlIHJhZGl4IHRyZWUgYW5kIGRpZ2VzdHMgaXQgZG93biBpbnRvIGFub3RoZXIgcmFkaXhcbisgKiB0cmVlLCB3aG9zZSBrZXlzIGlkZW50aWZ5IGJsb2NrcyBvZiBLSE9fRVhUX1NISUZUIHdoaWNoIGNvbnRhaW4gcHJlc2VydmVkXG4rICogbWVtb3J5LlxuKyAqXG4rICogVGhlbiBpdCB3YWxrcyB0aGUgZGlnZXN0ZWQgcmFkaXggdHJlZSBhbmQgbWFya3MgZXZlcnl0aGluZyB0aGF0IGRvZXNuJ3QgaGF2ZVxuKyAqIHByZXNlcnZlZCBtZW1vcnkgYXMgc2NyYXRjaC5cbisgKlxuKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBzbyBpdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2NyYXRjaCBoYXNcbisgKiBhdmFpbGFibGUgc3BhY2UuXG4rICpcbisgKiBOT1RFOiBUaGUgcGFnZXMgb2YgdGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUgdGFibGVzIGFyZSBub3QgbWFya2VkXG4rICogYXMgcHJlc2VydmVkIGluIHRoZSBwcmVzZXJ2ZWQgbWVtb3J5IHRyZWUuIEJ1dCB0aGV5IGFyZSBleHBlY3RlZCB0byByZW1haW5cbisgKiB1bnRvdWNoZWQgdW50aWwgdGhlIHRyZWUgaXMgZnVsbHkgcGFyc2VkLiBTbyB0aGlzIGZ1bmN0aW9uIGFsc28gY29uc2lkZXJzXG4rICogdGhlbSB0byBiZSBcInByZXNlcnZlZCBtZW1vcnlcIiBhbmQgbWFya3MgdGhlaXIgYmxvY2tzIGFzIGJ1c3kuXG4rICpcbisgKiBOT1RFOiBlZmlfaW5pdCgpOjpyZXNlcnZlX3JlZ2lvbnMoKSByZW1vdmVzIGFsbCByZWdpb25zIGV4Y2VwdFxuKyAqIE1FTUJMT0NLX0tIT19TQ1JBVENILiBUaGlzIGZ1bmN0aW9uIGFkZHMgc3VjaCByZWdpb25zIGJ1dCB0aGV5IGFyZSBub3QgS0hPXG4rICogc2NyYXRjaCBtZW1vcnksIHNvIHRoZXkgc2hvdWxkIG5vdCBiZSByZW1vdmVkLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbHdheXMgYmVcbisgKiBjYWxsZWQgYWZ0ZXIgcmVzZXJ2ZV9yZWdpb25zKCkuXG4rICovXG4rc3RhdGljIHZvaWQgX19pbml0IGtob19leHRlbmRfc2NyYXRjaCh2b2lkKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiBraG9fY2IgPSB7XG4rXHRcdC5sZWFmID0ga2hvX2V4dF93YWxrX2xlYWYsXG4rXHRcdC5ub2RlID0ga2hvX2V4dF93YWxrX25vZGUsXG4rXHR9O1xuK1x0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGV4dF9jYiA9IHtcbitcdFx0LmxlYWYgPSBraG9fZXh0X21hcmtfc2NyYXRjaCxcbitcdH07XG4rXHRzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgcmFkaXg7XG4rXHRwaHlzX2FkZHJfdCBwcmV2X2VuZCA9IDA7XG4rXHRpbnQgZXJyID0gMDtcbitcbitcdGVyciA9IGtob19yYWRpeF9pbml0X3RyZWUoXHUwMDI2cmFkaXgsIE5VTEwpO1xuK1x0aWYgKGVycilcbitcdFx0Z290byBwcmludDtcbitcbitcdC8qIFdhbGsgdGhlIEtITyByYWRpeCB0cmVlIHRvIGZpbmQgYnVzeSBibG9ja3MuICovXG4rXHRlcnIgPSBraG9fcmFkaXhfd2Fsa190cmVlKFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBcdTAwMjZraG9fY2IsIFx1MDAyNnJhZGl4KTtcbitcdGlmIChlcnIpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LyogV2FsayB0aGUgYmxvY2tzIGFuZCBtYXJrIGV2ZXJ5dGhpbmcgYmV0d2VlbiBrZXlzIGFzIHNjcmF0Y2guICovXG4rXHRlcnIgPSBraG9fcmFkaXhfd2Fsa190cmVlKFx1MDAyNnJhZGl4LCBcdTAwMjZleHRfY2IsIFx1MDAyNnByZXZfZW5kKTtcbitcdGlmIChlcnIpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LyogTWFyayBldmVyeXRoaW5nIGZyb20gbGFzdCBidXN5IGJsb2NrIHRvIGVuZCBvZiBEUkFNLiAqL1xuK1x0aWYgKHByZXZfZW5kIFx1MDAzYyBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpKVxuK1x0XHRlcnIgPSBtZW1ibG9ja19tYXJrX2tob19zY3JhdGNoKHByZXZfZW5kLCBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpIC0gcHJldl9lbmQpO1xuK1xuK1x0LyogZmFsbHRocm91Z2ggKi9cbitvdXQ6XG4rXHRraG9fcmFkaXhfZGVzdHJveV90cmVlKFx1MDAyNnJhZGl4KTtcbitwcmludDpcbitcdGlmIChlcnIpXG4rXHRcdHByX2VycihcIkZhaWxlZCB0byBleHRlbmQgc2NyYXRjaDogJXBlXFxuXCIsIEVSUl9QVFIoZXJyKSk7XG4rfVxuK1xuIC8qKlxuICAqIGtob19hZGRfc3VidHJlZSAtIHJlY29yZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIHN1YiBibG9iIGluIEtITyByb290IHRyZWUuXG4gICogQG5hbWU6IG5hbWUgb2YgdGhlIHN1YiB0cmVlLlxuQEAgLTg1NiwxMCArMTE1MiwxMiBAQCBpbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IGZvbGlvX3Bmbihmb2xpbyk7XG4gXHRjb25zdCB1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXG4tXHRpZiAoV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCwgUEFHRV9TSVpFIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuK1x0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKSBcdTAwMjZcdTAwMjZcbitcdCAgICBXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAocGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULCBQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIG9yZGVyKSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0cmV0dXJuIGtob19yYWRpeF9hZGRfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTtcbitcdHJldHVybiBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLFxuK1x0XHRcdFx0XHRcdFx0ICAgIG9yZGVyKSk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9mb2xpbyk7XG4gXG5AQCAtODc3LDcgKzExNzUsNyBAQCB2b2lkIGtob191bnByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IGZvbGlvX3Bmbihmb2xpbyk7XG4gXHRjb25zdCB1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXG4tXHRraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4rXHRraG9fcmFkaXhfZGVsX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcikpO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChraG9fdW5wcmVzZXJ2ZV9mb2xpbyk7XG4gXG5AQCAtOTA2LDcgKzEyMDQsOCBAQCBzdGF0aWMgdm9pZCBfX2tob191bnByZXNlcnZlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBcdHdoaWxlIChwZm4gXHUwMDNjIGVuZF9wZm4pIHtcbiBcdFx0b3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xuIFxuLVx0XHRraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4rXHRcdGtob19yYWRpeF9kZWxfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXG4rXHRcdFx0XHRcdFx0XHQgICAgIG9yZGVyKSk7XG4gXG4gXHRcdHBmbiArPSAxIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiBcdH1cbkBAIC05MzEsNyArMTIzMCw4IEBAIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4gXHR1bnNpZ25lZCBsb25nIGZhaWxlZF9wZm4gPSAwO1xuIFx0aW50IGVyciA9IDA7XG4gXG4tXHRpZiAoV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbitcdGlmIChJU19FTkFCTEVEKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRykgXHUwMDI2XHUwMDI2XG4rXHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbiBcdFx0XHRcdFx0bnJfcGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpKSkge1xuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdH1cbkBAIC05MzksNyArMTIzOSw4IEBAIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4gXHR3aGlsZSAocGZuIFx1MDAzYyBlbmRfcGZuKSB7XG4gXHRcdHVuc2lnbmVkIGludCBvcmRlciA9IF9fa2hvX3ByZXNlcnZlX3BhZ2VzX29yZGVyKHBmbiwgZW5kX3Bmbik7XG4gXG4tXHRcdGVyciA9IGtob19yYWRpeF9hZGRfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTtcbitcdFx0ZXJyID0ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwga2hvX2VuY29kZV9yYWRpeF9rZXkoUEZOX1BIWVMocGZuKSxcbitcdFx0XHRcdFx0XHRcdFx0ICAgb3JkZXIpKTtcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGZhaWxlZF9wZm4gPSBwZm47XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTMxNSwyMiArMTYxNiw2IEBAIHZvaWQga2hvX3Jlc3RvcmVfZnJlZSh2b2lkICptZW0pXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yZXN0b3JlX2ZyZWUpO1xuIFxuLXN0cnVjdCBraG9faW4ge1xuLVx0cGh5c19hZGRyX3QgZmR0X3BoeXM7XG4tXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXM7XG4tXHRjaGFyIHByZXZpb3VzX3JlbGVhc2VbX19ORVdfVVRTX0xFTiArIDFdO1xuLVx0dTMyIGtleGVjX2NvdW50O1xuLVx0c3RydWN0IGtob19kZWJ1Z2ZzIGRiZztcbi19O1xuLVxuLXN0YXRpYyBzdHJ1Y3Qga2hvX2luIGtob19pbiA9IHtcbi19O1xuLVxuLXN0YXRpYyBjb25zdCB2b2lkICpraG9fZ2V0X2ZkdCh2b2lkKVxuLXtcbi1cdHJldHVybiBraG9faW4uZmR0X3BoeXMgPyBwaHlzX3RvX3ZpcnQoa2hvX2luLmZkdF9waHlzKSA6IE5VTEw7XG4tfVxuLVxuIC8qKlxuICAqIGlzX2tob19ib290IC0gY2hlY2sgaWYgY3VycmVudCBrZXJuZWwgd2FzIGJvb3RlZCB2aWEgS0hPLWVuYWJsZWRcbiAgKiBrZXhlY1xuQEAgLTEzOTgsMjYgKzE2ODMsMjQgQEAgaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yZXRyaWV2ZV9zdWJ0cmVlKTtcbiBcbi1zdGF0aWMgaW50IF9faW5pdCBraG9fbWVtX3JldHJpZXZlKGNvbnN0IHZvaWQgKmZkdClcbitzdGF0aWMgdm9pZCBfX2luaXQga2hvX21lbV9yZXRyaWV2ZSh2b2lkKVxuIHtcbi1cdHN0cnVjdCBraG9fcmFkaXhfdHJlZSB0cmVlO1xuLVx0Y29uc3QgcGh5c19hZGRyX3QgKm1lbTtcbi1cdGludCBsZW47XG4rXHRjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgY2IgPSB7XG4rXHRcdC5sZWFmID0ga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSxcbitcdH07XG4gXG4tXHQvKiBSZXRyaWV2ZSB0aGUgS0hPIHJhZGl4IHRyZWUgZnJvbSBwYXNzZWQtaW4gRkRULiAqL1xuLVx0bWVtID0gZmR0X2dldHByb3AoZmR0LCAwLCBLSE9fRkRUX01FTU9SWV9NQVBfUFJPUF9OQU1FLCBcdTAwMjZsZW4pO1xuK1x0aWYgKGtob19yYWRpeF93YWxrX3RyZWUoXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIFx1MDAyNmNiLCBOVUxMKSlcbitcdFx0Z290byBlcnI7XG4gXG4tXHRpZiAoIW1lbSB8fCBsZW4gIT0gc2l6ZW9mKCptZW0pKSB7XG4tXHRcdHByX2VycihcImZhaWxlZCB0byBnZXQgcHJlc2VydmVkIEtITyBtZW1vcnkgdHJlZVxcblwiKTtcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4tXHR9XG4tXG4tXHRpZiAoISptZW0pXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0cmV0dXJuO1xuIFxuLVx0dHJlZS5yb290ID0gcGh5c190b192aXJ0KCptZW0pO1xuLVx0bXV0ZXhfaW5pdChcdTAwMjZ0cmVlLmxvY2spO1xuLVx0cmV0dXJuIGtob19yYWRpeF93YWxrX3RyZWUoXHUwMDI2dHJlZSwga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSk7XG4rZXJyOlxuK1x0LypcbitcdCAqIEZhaWxlZCB0byBpbml0aWFsaXplIHByZXNlcnZlZCBtZW1vcnkuIENsZWFyIEZEVCBhbmQgcmFkaXggc28gS0hPXG4rXHQgKiB1c2VycyBkb24ndCB0cmVhdCBpdCBhcyBhIEtITyBib290LlxuK1x0ICovXG4rXHRraG9faW4uZmR0X3BoeXMgPSAwO1xuK1x0a2hvX2luLnJhZGl4X3RyZWUucm9vdCA9IE5VTEw7XG4gfVxuIFxuIHN0YXRpYyBfX2luaXQgaW50IGtob19vdXRfZmR0X3NldHVwKHZvaWQpXG5AQCAtMTU0MywxNiArMTgyNiwxNCBAQCBzdGF0aWMgX19pbml0IGludCBraG9faW5pdCh2b2lkKVxuIFx0aWYgKCFraG9fZW5hYmxlKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHRyZWUtXHUwMDNlcm9vdCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghdHJlZS1cdTAwM2Vyb290KSB7XG4tXHRcdGVyciA9IC1FTk9NRU07XG4rXHRlcnIgPSBraG9fcmFkaXhfaW5pdF90cmVlKHRyZWUsIE5VTEwpO1xuK1x0aWYgKGVycilcbiBcdFx0Z290byBlcnJfZnJlZV9zY3JhdGNoO1xuLVx0fVxuIFxuIFx0a2hvX291dC5mZHQgPSBraG9fYWxsb2NfcHJlc2VydmUoUEFHRV9TSVpFKTtcbiBcdGlmIChJU19FUlIoa2hvX291dC5mZHQpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoa2hvX291dC5mZHQpO1xuLVx0XHRnb3RvIGVycl9mcmVlX2tob19yYWRpeF90cmVlX3Jvb3Q7XG4rXHRcdGdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU7XG4gXHR9XG4gXG4gXHRlcnIgPSBraG9fZGVidWdmc19pbml0KCk7XG5AQCAtMTYwMyw5ICsxODg0LDggQEAgc3RhdGljIF9faW5pdCBpbnQga2hvX2luaXQodm9pZClcbiBcbiBlcnJfZnJlZV9mZHQ6XG4gXHRraG9fdW5wcmVzZXJ2ZV9mcmVlKGtob19vdXQuZmR0KTtcbi1lcnJfZnJlZV9raG9fcmFkaXhfdHJlZV9yb290OlxuLVx0a2ZyZWUodHJlZS1cdTAwM2Vyb290KTtcbi1cdHRyZWUtXHUwMDNlcm9vdCA9IE5VTEw7XG4rZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU6XG4rXHRraG9fcmFkaXhfZGVzdHJveV90cmVlKHRyZWUpO1xuIGVycl9mcmVlX3NjcmF0Y2g6XG4gXHRraG9fb3V0LmZkdCA9IE5VTEw7XG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpKyspIHtcbkBAIC0xNjE5LDE2ICsxODk5LDQzIEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXG4gfVxuIGZzX2luaXRjYWxsKGtob19pbml0KTtcbiBcbi12b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXQodm9pZClcbit2b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZClcbiB7XG4tXHRpZiAoa2hvX2luLnNjcmF0Y2hfcGh5cykge1xuLVx0XHRraG9fc2NyYXRjaCA9IHBoeXNfdG9fdmlydChraG9faW4uc2NyYXRjaF9waHlzKTtcbitcdGNvbnN0IHZvaWQgKmZkdCA9IGtob19nZXRfZmR0KCk7XG4gXG4tXHRcdGlmIChraG9fbWVtX3JldHJpZXZlKGtob19nZXRfZmR0KCkpKVxuLVx0XHRcdGtob19pbi5mZHRfcGh5cyA9IDA7XG4tXHR9IGVsc2Uge1xuLVx0XHRraG9fcmVzZXJ2ZV9zY3JhdGNoKCk7XG4rXHRpZiAoIWlzX2tob19ib290KCkpXG4rXHRcdHJldHVybjtcbitcbitcdC8qXG4rXHQgKiBraG9fc2NyYXRjaF9vdmVybGFwKCkgbmVlZHMga2hvX3NjcmF0Y2ggdG8gYmUgaW5pdGlhbGl6ZWQuIEl0XG4rXHQgKiBpcyB1c2VkIGJ5IGZyZWVfYXJlYV9pbml0KCkgb24gS0hPIGJvb3RzLCBzbyBpbml0aWFsaXplIGl0XG4rXHQgKiBlYXJseS5cbitcdCAqL1xuK1x0a2hvX3NjcmF0Y2ggPSBwaHlzX3RvX3ZpcnQoa2hvX2luLnNjcmF0Y2hfcGh5cyk7XG4rXG4rXHQvKlxuK1x0ICoga2hvX2dldF9tZW1fbWFwKCkgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLiBJZiBpdCBmYWlscywga2hvX3BvcHVsYXRlKClcbitcdCAqIGNhdGNoZXMgdGhhdCBhbmQgbmV2ZXIgc2V0cyBraG9faW4uZmR0X3BoeXMuXG4rXHQgKi9cbitcdGlmIChraG9fcmFkaXhfaW5pdF90cmVlKFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBraG9fZ2V0X21lbV9tYXAoZmR0KSkpIHtcbitcdFx0LypcbitcdFx0ICogRmFpbGVkIHRvIGluaXRpYWxpemUgcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiBDbGVhciBGRFRcbitcdFx0ICogYW5kIHNjcmF0Y2ggc28gS0hPIHVzZXJzIGRvbid0IHRyZWF0IGl0IGFzIGEgS0hPIGJvb3QuXG4rXHRcdCAqL1xuK1x0XHRraG9faW4uZmR0X3BoeXMgPSAwO1xuK1x0XHRraG9faW4uc2NyYXRjaF9waHlzID0gMDtcbitcdFx0cmV0dXJuO1xuIFx0fVxuK1xuK1x0a2hvX2V4dGVuZF9zY3JhdGNoKCk7XG4rfVxuK1xuK3ZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdCh2b2lkKVxuK3tcbitcdGlmIChraG9faW4uc2NyYXRjaF9waHlzKVxuK1x0XHRraG9fbWVtX3JldHJpZXZlKCk7XG4rXHRlbHNlXG4rXHRcdGtob19yZXNlcnZlX3NjcmF0Y2goKTtcbiB9XG4gXG4gdm9pZCBfX2luaXQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcbkBAIC0xNjM2LDkgKzE5NDMsOCBAQCB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuIHtcbiBcdHVuc2lnbmVkIGludCBzY3JhdGNoX2NudCA9IHNjcmF0Y2hfbGVuIC8gc2l6ZW9mKCpraG9fc2NyYXRjaCk7XG4gXHRzdHJ1Y3Qga2hvX3NjcmF0Y2ggKnNjcmF0Y2ggPSBOVUxMO1xuLVx0cGh5c19hZGRyX3QgbWVtX21hcF9waHlzO1xuLVx0dm9pZCAqZmR0ID0gTlVMTDtcbiBcdGJvb2wgcG9wdWxhdGVkID0gZmFsc2U7XG4rXHR2b2lkICpmZHQgPSBOVUxMO1xuIFx0aW50IGVycjtcbiBcbiBcdC8qIFZhbGlkYXRlIHRoZSBpbnB1dCBGRFQgKi9cbkBAIC0xNjYwLDggKzE5NjYsMTMgQEAgdm9pZCBfX2luaXQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcbiBcdFx0Z290byB1bm1hcF9mZHQ7XG4gXHR9XG4gXG4tXHRtZW1fbWFwX3BoeXMgPSBraG9fZ2V0X21lbV9tYXBfcGh5cyhmZHQpO1xuLVx0aWYgKCFtZW1fbWFwX3BoeXMpXG4rXHQvKlxuK1x0ICogQXQgdGhpcyBwb2ludCBwaHlzX3RvX3ZpcnQoKSBkb2Vzbid0IHdvcmsgcHJvcGVybHkgYW5kIHNvXG4rXHQgKiBraG9fZ2V0X21lbV9tYXAoKSBjYW4gcmV0dXJuIGEgcHJlLUtBU0xSIHZpcnR1YWwgYWRkcmVzcy4gQnV0IGhlcmUgd2VcbitcdCAqIG9ubHkgd2FudCB0byBtYWtlIHN1cmUgdGhlIG1lbV9tYXAgaXMgdmFsaWQgc28gdGhlIGFjdHVhbCB2YWx1ZVxuK1x0ICogZG9lc24ndCBtYXR0ZXIgYXMgbG9uZyBhcyBpdCBpc24ndCBOVUxMLlxuK1x0ICovXG4rXHRpZiAoIWtob19nZXRfbWVtX21hcChmZHQpKVxuIFx0XHRnb3RvIHVubWFwX2ZkdDtcbiBcbiBcdHNjcmF0Y2ggPSBlYXJseV9tZW1yZW1hcChzY3JhdGNoX3BoeXMsIHNjcmF0Y2hfbGVuKTtcbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfZGVidWcuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA2ZWZiNjk2ZjU0MjYxMi4uMDAwMDAwMDAwMDAwMDBcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2RlYnVnLmNcbisrKyAvZGV2L251bGxcbkBAIC0xLDI1ICswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBrZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIC0ga2V4ZWMgaGFuZG92ZXIgb3B0aW9uYWwgZGVidWcgZnVuY3Rpb25hbGl0eVxuLSAqIENvcHlyaWdodCAoQykgMjAyNSBHb29nbGUgTExDLCBQYXNoYSBUYXRhc2hpbiBcdTAwM2NwYXNoYS50YXRhc2hpbkBzb2xlZW4uY29tXHUwMDNlXG4tICovXG4tXG4tI2RlZmluZSBwcl9mbXQoZm10KSBcIktITzogXCIgZm10XG4tXG4tI2luY2x1ZGUgXCJrZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXCJcbi1cbi1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4te1xuLVx0cGh5c19hZGRyX3Qgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQ7XG4tXHR1bnNpZ25lZCBpbnQgaTtcbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIGtob19zY3JhdGNoX2NudDsgaSsrKSB7XG4tXHRcdHNjcmF0Y2hfc3RhcnQgPSBraG9fc2NyYXRjaFtpXS5hZGRyO1xuLVx0XHRzY3JhdGNoX2VuZCA9IGtob19zY3JhdGNoW2ldLmFkZHIgKyBraG9fc2NyYXRjaFtpXS5zaXplO1xuLVxuLVx0XHRpZiAocGh5cyBcdTAwM2Mgc2NyYXRjaF9lbmQgXHUwMDI2XHUwMDI2IChwaHlzICsgc2l6ZSkgXHUwMDNlIHNjcmF0Y2hfc3RhcnQpXG4tXHRcdFx0cmV0dXJuIHRydWU7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2ludGVybmFsLmggYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG5pbmRleCAwMzk5ZmYxMDc3NzUwYi4uODA1ZDJhNzZjMzg4MTggMTAwNjQ0XG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG4rKysgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG5AQCAtNDEsMTMgKzQxLDQgQEAgc3RhdGljIGlubGluZSB2b2lkIGtob19kZWJ1Z2ZzX2Jsb2JfcmVtb3ZlKHN0cnVjdCBraG9fZGVidWdmcyAqZGJnLFxuIFx0XHRcdFx0XHQgICB2b2lkICpibG9iKSB7IH1cbiAjZW5kaWYgLyogQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHRlMgKi9cbiBcbi0jaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHXG4tYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcbi0jZWxzZVxuLXN0YXRpYyBpbmxpbmUgYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxuLXtcbi1cdHJldHVybiBmYWxzZTtcbi19XG4tI2VuZGlmIC8qIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRyAqL1xuLVxuICNlbmRpZiAvKiBMSU5VWF9LRVhFQ19IQU5ET1ZFUl9JTlRFUk5BTF9IICovXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jXG5pbmRleCA1NzEyMTJiODA4MzVlYy4uYWI0YWZjODE4ZThjYmQgMTAwNjQ0XG4tLS0gYS9tbS9odWdldGxiLmNcbisrKyBiL21tL2h1Z2V0bGIuY1xuQEAgLTMwMzMsMjkgKzMwMzMsMjEgQEAgc3RhdGljIF9faW5pdCB2b2lkICphbGxvY19ib290bWVtKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQsIGJvb2wgbm9kZV9leGFjdClcbiBcdGlmIChodWdldGxiX2Vhcmx5X2NtYShoKSlcbiBcdFx0bSA9IGh1Z2V0bGJfY21hX2FsbG9jX2Jvb3RtZW0oaCwgXHUwMDI2bGlzdG5vZGUsIG5vZGVfZXhhY3QpO1xuIFx0ZWxzZSB7XG4tXHRcdGlmIChub2RlX2V4YWN0KVxuLVx0XHRcdG0gPSBtZW1ibG9ja19hbGxvY19leGFjdF9uaWRfcmF3KGh1Z2VfcGFnZV9zaXplKGgpLFxuLVx0XHRcdFx0aHVnZV9wYWdlX3NpemUoaCksIDAsXG4tXHRcdFx0XHRNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFLCBuaWQpO1xuLVx0XHRlbHNlIHtcbi1cdFx0XHRtID0gbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoaHVnZV9wYWdlX3NpemUoaCksXG4tXHRcdFx0XHRodWdlX3BhZ2Vfc2l6ZShoKSwgMCxcbi1cdFx0XHRcdE1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUsIG5pZCk7XG4rXHRcdG0gPSBtZW1ibG9ja19hbGxvY19odWdldGxiKGh1Z2VfcGFnZV9zaXplKGgpLCBuaWQsIG5vZGVfZXhhY3QpO1xuK1x0XHRpZiAobSkge1xuK1x0XHRcdG0tXHUwMDNlZmxhZ3MgPSAwO1xuK1x0XHRcdG0tXHUwMDNlY21hID0gTlVMTDtcbitcbiBcdFx0XHQvKlxuIFx0XHRcdCAqIEZvciBwcmUtSFZPIHRvIHdvcmsgY29ycmVjdGx5LCBwYWdlcyBuZWVkIHRvIGJlIG9uXG4gXHRcdFx0ICogdGhlIGxpc3QgZm9yIHRoZSBub2RlIHRoZXkgd2VyZSBhY3R1YWxseSBhbGxvY2F0ZWRcbiBcdFx0XHQgKiBmcm9tLiBUaGF0IG5vZGUgbWF5IGJlIGRpZmZlcmVudCBpbiB0aGUgY2FzZSBvZlxuLVx0XHRcdCAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3LiBTbyxcbitcdFx0XHQgKiBmYWxsYmFjayBieSBtZW1ibG9ja19hbGxvY19odWdldGxiX2Jvb3RtZW0uIFNvLFxuIFx0XHRcdCAqIGV4dHJhY3QgdGhlIGFjdHVhbCBub2RlIGZpcnN0LlxuIFx0XHRcdCAqL1xuLVx0XHRcdGlmIChtKVxuK1x0XHRcdGlmICghbm9kZV9leGFjdClcbiBcdFx0XHRcdGxpc3Rub2RlID0gZWFybHlfcGZuX3RvX25pZChQSFlTX1BGTihfX3BhKG0pKSk7XG4gXHRcdH1cbi1cbi1cdFx0aWYgKG0pIHtcbi1cdFx0XHRtLVx1MDAzZWZsYWdzID0gMDtcbi1cdFx0XHRtLVx1MDAzZWNtYSA9IE5VTEw7XG4tXHRcdH1cbiBcdH1cbiBcbiBcdGlmIChtKSB7XG5kaWZmIC0tZ2l0IGEvbW0vbWVtYmxvY2suYyBiL21tL21lbWJsb2NrLmNcbmluZGV4IDYzNDljNDgxNTRmNGIxLi5jMTBkZmIwNTQ4MDZhNyAxMDA2NDRcbi0tLSBhL21tL21lbWJsb2NrLmNcbisrKyBiL21tL21lbWJsb2NrLmNcbkBAIC0xNTA2LDYgKzE1MDYsMzIgQEAgaW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19zZXRfbm9kZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyB2b2lkIG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3Qgc2l6ZSxcbitcdFx0XHRcdCAgICAgYm9vbCBsZWFrdHJhY2UpXG4re1xuK1x0LypcbitcdCAqIFNraXAga21lbWxlYWsgZm9yIHRob3NlIHBsYWNlcyBsaWtlIGthc2FuX2luaXQoKSBhbmRcbitcdCAqIGVhcmx5X3BndGFibGVfYWxsb2MoKSBkdWUgdG8gaGlnaCB2b2x1bWUuXG4rXHQgKi9cbitcdGlmIChsZWFrdHJhY2UpXG4rXHRcdC8qXG4rXHRcdCAqIE1lbWJsb2NrIGFsbG9jYXRlZCBibG9ja3MgYXJlIG5ldmVyIHJlcG9ydGVkIGFzXG4rXHRcdCAqIGxlYWtzLiBUaGlzIGlzIGJlY2F1c2UgbWFueSBvZiB0aGVzZSBibG9ja3MgYXJlXG4rXHRcdCAqIG9ubHkgcmVmZXJyZWQgdmlhIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoaWNoIGlzXG4rXHRcdCAqIG5vdCBsb29rZWQgdXAgYnkga21lbWxlYWsuXG4rXHRcdCAqL1xuK1x0XHRrbWVtbGVha19hbGxvY19waHlzKHN0YXJ0LCBzaXplLCAwKTtcbitcbitcdC8qXG4rXHQgKiBTb21lIFZpcnR1YWwgTWFjaGluZSBwbGF0Zm9ybXMsIHN1Y2ggYXMgSW50ZWwgVERYIG9yIEFNRCBTRVYtU05QLFxuK1x0ICogcmVxdWlyZSBtZW1vcnkgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGJ5IHRoZVxuK1x0ICogZ3Vlc3QuXG4rXHQgKlxuK1x0ICogQWNjZXB0IHRoZSBtZW1vcnkgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuXG4rXHQgKi9cbitcdGFjY2VwdF9tZW1vcnkoc3RhcnQsIHNpemUpO1xuK31cbitcbiAvKipcbiAgKiBtZW1ibG9ja19hbGxvY19yYW5nZV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9ja1xuICAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXNcbkBAIC0xNTgwLDI4ICsxNjA2LDcgQEAgcGh5c19hZGRyX3QgX19pbml0IG1lbWJsb2NrX2FsbG9jX3JhbmdlX25pZChwaHlzX2FkZHJfdCBzaXplLFxuIFx0cmV0dXJuIDA7XG4gXG4gZG9uZTpcbi1cdC8qXG4tXHQgKiBTa2lwIGttZW1sZWFrIGZvciB0aG9zZSBwbGFjZXMgbGlrZSBrYXNhbl9pbml0KCkgYW5kXG4tXHQgKiBlYXJseV9wZ3RhYmxlX2FsbG9jKCkgZHVlIHRvIGhpZ2ggdm9sdW1lLlxuLVx0ICovXG4tXHRpZiAoZW5kICE9IE1FTUJMT0NLX0FMTE9DX05PTEVBS1RSQUNFKVxuLVx0XHQvKlxuLVx0XHQgKiBNZW1ibG9jayBhbGxvY2F0ZWQgYmxvY2tzIGFyZSBuZXZlciByZXBvcnRlZCBhc1xuLVx0XHQgKiBsZWFrcy4gVGhpcyBpcyBiZWNhdXNlIG1hbnkgb2YgdGhlc2UgYmxvY2tzIGFyZVxuLVx0XHQgKiBvbmx5IHJlZmVycmVkIHZpYSB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGljaCBpc1xuLVx0XHQgKiBub3QgbG9va2VkIHVwIGJ5IGttZW1sZWFrLlxuLVx0XHQgKi9cbi1cdFx0a21lbWxlYWtfYWxsb2NfcGh5cyhmb3VuZCwgc2l6ZSwgMCk7XG4tXG4tXHQvKlxuLVx0ICogU29tZSBWaXJ0dWFsIE1hY2hpbmUgcGxhdGZvcm1zLCBzdWNoIGFzIEludGVsIFREWCBvciBBTUQgU0VWLVNOUCxcbi1cdCAqIHJlcXVpcmUgbWVtb3J5IHRvIGJlIGFjY2VwdGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBieSB0aGVcbi1cdCAqIGd1ZXN0LlxuLVx0ICpcbi1cdCAqIEFjY2VwdCB0aGUgbWVtb3J5IG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLlxuLVx0ICovXG4tXHRhY2NlcHRfbWVtb3J5KGZvdW5kLCBzaXplKTtcbi1cbitcdG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihmb3VuZCwgc2l6ZSwgZW5kICE9IE1FTUJMT0NLX0FMTE9DX05PTEVBS1RSQUNFKTtcbiBcdHJldHVybiBmb3VuZDtcbiB9XG4gXG5AQCAtMTc1Niw2ICsxNzYxLDY5IEBAIHZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoXG4gXHRcdFx0XHQgICAgICAgZmFsc2UpO1xuIH1cbiBcbisvKipcbisgKiBtZW1ibG9ja19hbGxvY19odWdldGxiIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgZm9yIEh1Z2VUTEIgcGFnZXNcbisgKiBAc2l6ZTogICAgICBzaXplIG9mIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzXG4rICogQG5pZDogICAgICAgbmlkIG9mIHRoZSBmcmVlIG1lbW9yeSB0byBmaW5kLCAlTlVNQV9OT19OT0RFIGZvciBhbnkgbm9kZVxuKyAqIEBleGFjdF9uaWQ6IG9ubHkgYWxsb2NhdGUgZnJvbSB0aGUgc3BlY2lmaWVkIG5pZC4gSWYgJWZhbHNlLCB0aGUgc3BlY2lmaWVkXG4rICogICAgICAgICAgICAgbmlkIGlzIHRyaWVkIGZpcnN0LCBhbmQgdGhlbiBhbGwgbm9kZXMgYXJlIHRyaWVkIGFzIGZhbGxiYWNrLlxuKyAqXG4rICogSHVnZVRMQiBwYWdlcyBhcmUgYWx3YXlzIGFsaWduZWQgYnkgdGhlaXIgc2l6ZSwgc28gdGhlIGFsaWdubWVudCBtYXRjaGVzXG4rICogQHNpemUuIFNpbmNlIHRoZSBtZW1vcnkgaXMgZm9yIHVzZXJzcGFjZSwgbWlycm9yZWQgbWVtb3J5IGlzIG5vdCB1c2VkLiBUaGVcbisgKiBtZW1vcnkgaXMgbm90IHplcm9lZC4gRG9lcyBub3QgcGFuaWMgaWYgcmVxdWVzdCBjYW5ub3QgYmUgc2F0aXNmaWVkLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqIFZpcnR1YWwgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIG9uIHN1Y2Nlc3MsICVOVUxMIG9uIGZhaWx1cmUuXG4rICovXG4rdm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxuK3tcbitcdGVudW0gbWVtYmxvY2tfZmxhZ3MgZmxhZ3MgPSBjaG9vc2VfbWVtYmxvY2tfZmxhZ3MoKTtcbitcdHBoeXNfYWRkcl90IGFkZHIsIHN0YXJ0ID0gMCwgZW5kID0gTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRTtcbitcbitcdG1lbWJsb2NrX2RiZyhcIiVzOiAlbGx1IGJ5dGVzLCBuaWQ9JWQsIGV4YWN0X25pZD0lZCAlcFNcXG5cIiwgX19mdW5jX18sXG4rXHRcdCAgICAgKHU2NClzaXplLCBuaWQsIGV4YWN0X25pZCwgKHZvaWQgKilfUkVUX0lQXyk7XG4rXG4rXHQvKiBEb24ndCB3YXN0ZSBtaXJyb3JlZCBtZW1vcnkgb24gSHVnZVRMQiBwYWdlcy4gKi9cbitcdGZsYWdzIFx1MDAyNj0gfk1FTUJMT0NLX01JUlJPUjtcbityZXRyeTpcbitcdC8qIEh1Z2VUTEIgcGFnZXMgYXJlIGFsd2F5cyBhbGlnbmVkIGJ5IHRoZWlyIHNpemUuICovXG4rXHRhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZV9ub2RlKHNpemUsIHNpemUsIHN0YXJ0LCBlbmQsIG5pZCwgZmxhZ3MpO1xuK1x0aWYgKGFkZHIpXG4rXHRcdGdvdG8gZm91bmQ7XG4rXG4rXHQvKiBUcnkgYWxsIG5vZGVzIGlmIGFsbG93ZWQuICovXG4rXHRpZiAobnVtYV92YWxpZF9ub2RlKG5pZCkgXHUwMDI2XHUwMDI2ICFleGFjdF9uaWQpIHtcbitcdFx0bmlkID0gTlVNQV9OT19OT0RFO1xuK1x0XHRnb3RvIHJldHJ5O1xuK1x0fVxuK1xuK1x0LyogRm91bmQgbm90aGluZy4uLiA6LSggKi9cbitcdHJldHVybiBOVUxMO1xuK1xuK2ZvdW5kOlxuK1x0LypcbitcdCAqIEh1Z2VUTEIgcGFnZXMgY2FuIGJlIHByZXNlcnZlZCB3aXRoIEtITyBhbmQgbm8gcHJlc2VydmVkIG1lbW9yeSBjYW5cbitcdCAqIGJlIGluIHNjcmF0Y2guIFNvIHJldHJ5IGlmIGZvdW5kIGFkZHJlc3Mgb3ZlcmxhcHMgd2l0aCBzY3JhdGNoLlxuK1x0ICpcbitcdCAqIFNjcmF0Y2ggYXJlYXMgYXJlIG5vcm1hbGx5IG5vdCB2ZXJ5IGxhcmdlLCBzbyB0aGlzIHNob3VsZG4ndCB0YWtlIHRvb1xuK1x0ICogbWFueSByZXRyaWVzLlxuK1x0ICovXG4rXHRpZiAoa2hvX3NjcmF0Y2hfb3ZlcmxhcChhZGRyLCBzaXplKSkge1xuK1x0XHRpZiAobWVtYmxvY2tfYm90dG9tX3VwKCkpXG4rXHRcdFx0c3RhcnQgPSBhZGRyICsgc2l6ZTtcbitcdFx0ZWxzZVxuK1x0XHRcdHN0YXJ0ID0gYWRkciAtIHNpemU7XG4rXG4rXHRcdGdvdG8gcmV0cnk7XG4rXHR9XG4rXG4rXHRpZiAoX19tZW1ibG9ja19yZXNlcnZlKGFkZHIsIHNpemUsIG5pZCwgTUVNQkxPQ0tfUlNSVl9LRVJOIHwgTUVNQkxPQ0tfUlNSVl9IVUdFVExCKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRtZW1ibG9ja19wcmVwX2FsbG9jYXRpb24oYWRkciwgc2l6ZSwgdHJ1ZSk7XG4rXHRyZXR1cm4gcGh5c190b192aXJ0KGFkZHIpO1xuK31cbitcbiAvKipcbiAgKiBtZW1ibG9ja19hbGxvY190cnlfbmlkIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgYmxvY2tcbiAgKiBAc2l6ZTogc2l6ZSBvZiBtZW1vcnkgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzXG5AQCAtMTgyNSw2ICsxODkzLDI4IEBAIHBoeXNfYWRkcl90IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19yZXNlcnZlZF9zaXplKHZvaWQpXG4gXHRyZXR1cm4gbWVtYmxvY2sucmVzZXJ2ZWQudG90YWxfc2l6ZTtcbiB9XG4gXG4rcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcbit7XG4rXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuK1x0cGh5c19hZGRyX3QgdG90YWwgPSAwO1xuK1xuK1x0Zm9yX2VhY2hfcmVzZXJ2ZWRfbWVtX3JlZ2lvbihyKSB7XG4rXHRcdHBoeXNfYWRkcl90IHNpemUgPSByLVx1MDAzZXNpemU7XG4rXG4rXHRcdGlmIChyLVx1MDAzZWJhc2UgXHUwMDNlIGxpbWl0KVxuK1x0XHRcdGJyZWFrO1xuK1xuK1x0XHRpZiAoci1cdTAwM2ViYXNlICsgci1cdTAwM2VzaXplIFx1MDAzZSBsaW1pdClcbitcdFx0XHRzaXplID0gbGltaXQgLSByLVx1MDAzZWJhc2U7XG4rXG4rXHRcdGlmIChuaWQgPT0gbWVtYmxvY2tfZ2V0X3JlZ2lvbl9ub2RlKHIpIHx8ICFudW1hX3ZhbGlkX25vZGUobmlkKSlcbitcdFx0XHRpZiAoci1cdTAwM2VmbGFncyBcdTAwMjYgTUVNQkxPQ0tfUlNSVl9IVUdFVExCKVxuK1x0XHRcdFx0dG90YWwgKz0gc2l6ZTtcbitcdH1cbitcbitcdHJldHVybiB0b3RhbDtcbit9XG4rXG4gcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcbiB7XG4gXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuQEAgLTI1MTEsMTYgKzI2MDEsNiBAQCBfX2luaXQgdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpXG4ge1xuIFx0a2hvX3NjcmF0Y2hfb25seSA9IGZhbHNlO1xuIH1cbi1cbi1ib29sIF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19pc19raG9fc2NyYXRjaF9tZW1vcnkocGh5c19hZGRyX3QgYWRkcilcbi17XG4tXHRpbnQgaSA9IG1lbWJsb2NrX3NlYXJjaChcdTAwMjZtZW1ibG9jay5tZW1vcnksIGFkZHIpO1xuLVxuLVx0aWYgKGkgPT0gLTEpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdHJldHVybiBtZW1ibG9ja19pc19raG9fc2NyYXRjaChcdTAwMjZtZW1ibG9jay5tZW1vcnkucmVnaW9uc1tpXSk7XG4tfVxuICNlbmRpZlxuIFxuICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVJcbmRpZmYgLS1naXQgYS9tbS9tbV9pbml0LmMgYi9tbS9tbV9pbml0LmNcbmluZGV4IDBmNjQ5MDllOGQyMGUyLi4xZDJmMzAyZDhjZDljMSAxMDA2NDRcbi0tLSBhL21tL21tX2luaXQuY1xuKysrIGIvbW0vbW1faW5pdC5jXG5AQCAtNzA3LDkgKzcwNywxMCBAQCB2b2lkIF9fbWVtaW5pdCBfX2luaXRfcGFnZV9mcm9tX25pZCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcbiBcdF9faW5pdF9zaW5nbGVfcGFnZShwZm5fdG9fcGFnZShwZm4pLCBwZm4sIHppZCwgbmlkKTtcbiBcbiBcdGlmIChwYWdlYmxvY2tfYWxpZ25lZChwZm4pKSB7XG4tXHRcdGVudW0gbWlncmF0ZXR5cGUgbXQgPVxuLVx0XHRcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgTUlHUkFURV9NT1ZBQkxFKTtcbi1cdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgbXQsIGZhbHNlKTtcbitcdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgTUlHUkFURV9NT1ZBQkxFLFxuK1x0XHRcdFx0XHQgICBmYWxzZSk7XG4rXHRcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXG4rXHRcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBwZm4gKyAxKTtcbiBcdH1cbiB9XG4gXG5AQCAtOTM4LDEzICs5MzksMjIgQEAgdm9pZCBfX21lbWluaXQgbWVtbWFwX2luaXRfcmFuZ2UodW5zaWduZWQgbG9uZyBzaXplLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHpvbmVcbiBcdFx0fVxuIFx0XHRwZm4rKztcbiBcdH1cbitcbitcdC8qXG4rXHQgKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBmb3IgYW55IHBhZ2VibG9ja3MgdGhhdCBmYWxsIGluIGEgS0hPIHNjcmF0Y2hcbitcdCAqIGFyZWEuIERvIHRoaXMgaGVyZSBvdXRzaWRlIHRoZSBsb29wIGJlY2F1c2UgbW9zdCBwYWdlYmxvY2tzIHdpbGwgbm90XG4rXHQgKiBiZSBLSE8gc2NyYXRjaCwgc28gb25seSBzZWFyY2ggb25jZS5cbitcdCAqXG4rXHQgKiBPbmx5IHBhZ2VibG9ja3MgdXAgdG8gcGZuIGFyZSB1cGRhdGVkLCBkZWZlcnJlZCBwYWdlYmxvY2tzIHdpbGwgYmVcbitcdCAqIHVwZGF0ZWQgbGF0ZXIuXG4rXHQgKi9cbitcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBwZm4pO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSxcbiBcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbiBcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGVuZF9wZm4sXG4tXHRcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyAqaG9sZV9wZm4sXG4tXHRcdFx0XHRcdCAgZW51bSBtaWdyYXRldHlwZSBtdClcbitcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nICpob2xlX3BmbilcbiB7XG4gXHR1bnNpZ25lZCBsb25nIHpvbmVfc3RhcnRfcGZuID0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbjtcbiBcdHVuc2lnbmVkIGxvbmcgem9uZV9lbmRfcGZuID0gem9uZV9zdGFydF9wZm4gKyB6b25lLVx1MDAzZXNwYW5uZWRfcGFnZXM7XG5AQCAtOTU3LDcgKzk2Nyw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdF96b25lX3JhbmdlKHN0cnVjdCB6b25lICp6b25lLFxuIFx0XHRyZXR1cm47XG4gXG4gXHRtZW1tYXBfaW5pdF9yYW5nZShlbmRfcGZuIC0gc3RhcnRfcGZuLCBuaWQsIHpvbmVfaWQsIHN0YXJ0X3Bmbixcbi1cdFx0XHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgbXQsIGZhbHNlKTtcbitcdFx0XHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxuK1x0XHRcdCAgZmFsc2UpO1xuIFxuIFx0aWYgKCpob2xlX3BmbiBcdTAwM2Mgc3RhcnRfcGZuKVxuIFx0XHRpbml0X3VuYXZhaWxhYmxlX3JhbmdlKCpob2xlX3Bmbiwgc3RhcnRfcGZuLCB6b25lX2lkLCBuaWQpO1xuQEAgLTk3Myw4ICs5ODQsNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXQodm9pZClcbiBcbiBcdGZvcl9lYWNoX21lbV9wZm5fcmFuZ2UoaSwgTUFYX05VTU5PREVTLCBcdTAwMjZzdGFydF9wZm4sIFx1MDAyNmVuZF9wZm4sIFx1MDAyNm5pZCkge1xuIFx0XHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGUgPSBOT0RFX0RBVEEobmlkKTtcbi1cdFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XG4tXHRcdFx0a2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBNSUdSQVRFX01PVkFCTEUpO1xuIFxuIFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBNQVhfTlJfWk9ORVM7IGorKykge1xuIFx0XHRcdHN0cnVjdCB6b25lICp6b25lID0gbm9kZS1cdTAwM2Vub2RlX3pvbmVzICsgajtcbkBAIC05ODMsNyArOTkyLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0KHZvaWQpXG4gXHRcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0XHRtZW1tYXBfaW5pdF96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgZW5kX3Bmbixcbi1cdFx0XHRcdFx0ICAgICAgIFx1MDAyNmhvbGVfcGZuLCBtdCk7XG4rXHRcdFx0XHRcdCAgICAgICBcdTAwMjZob2xlX3Bmbik7XG4gXHRcdFx0em9uZV9pZCA9IGo7XG4gXHRcdH1cbiBcdH1cbkBAIC0xOTczLDcgKzE5ODIsNyBAQCB1bnNpZ25lZCBsb25nIF9faW5pdCBub2RlX21hcF9wZm5fYWxpZ25tZW50KHZvaWQpXG4gXG4gI2lmZGVmIENPTkZJR19ERUZFUlJFRF9TVFJVQ1RfUEFHRV9JTklUXG4gc3RhdGljIHZvaWQgX19pbml0IGRlZmVycmVkX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGVudW0gbWlncmF0ZXR5cGUgbXQpXG4rXHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHR1bnNpZ25lZCBsb25nIGk7XG5AQCAtMTk4NSw4ICsxOTk0LDYgQEAgc3RhdGljIHZvaWQgX19pbml0IGRlZmVycmVkX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sXG4gXG4gXHQvKiBGcmVlIGEgbGFyZ2UgbmF0dXJhbGx5LWFsaWduZWQgY2h1bmsgaWYgcG9zc2libGUgKi9cbiBcdGlmIChucl9wYWdlcyA9PSBNQVhfT1JERVJfTlJfUEFHRVMgXHUwMDI2XHUwMDI2IElTX01BWF9PUkRFUl9BTElHTkVEKHBmbikpIHtcbi1cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXM7IGkgKz0gcGFnZWJsb2NrX25yX3BhZ2VzKVxuLVx0XHRcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UgKyBpLCBtdCwgZmFsc2UpO1xuIFx0XHRfX2ZyZWVfcGFnZXNfY29yZShwYWdlLCBNQVhfUEFHRV9PUkRFUiwgTUVNSU5JVF9FQVJMWSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xOTk0LDExICsyMDAxLDggQEAgc3RhdGljIHZvaWQgX19pbml0IGRlZmVycmVkX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sXG4gXHQvKiBBY2NlcHQgY2h1bmtzIHNtYWxsZXIgdGhhbiBNQVhfUEFHRV9PUkRFUiB1cGZyb250ICovXG4gXHRhY2NlcHRfbWVtb3J5KFBGTl9QSFlTKHBmbiksIG5yX3BhZ2VzICogUEFHRV9TSVpFKTtcbiBcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyssIHBhZ2UrKywgcGZuKyspIHtcbi1cdFx0aWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpXG4tXHRcdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGFnZSwgbXQsIGZhbHNlKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyssIHBhZ2UrKywgcGZuKyspXG4gXHRcdF9fZnJlZV9wYWdlc19jb3JlKHBhZ2UsIDAsIE1FTUlOSVRfRUFSTFkpO1xuLVx0fVxuIH1cbiBcbiAvKiBDb21wbGV0aW9uIHRyYWNraW5nIGZvciBkZWZlcnJlZF9pbml0X21lbW1hcCgpIHRocmVhZHMgKi9cbkBAIC0yMDE3LDE1ICsyMDIxLDI5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGdkYXRfaW5pdF9yZXBvcnRfb25lX2RvbmUodm9pZClcbiAgKiBSZXR1cm4gbnVtYmVyIG9mIHBhZ2VzIGluaXRpYWxpemVkLlxuICAqL1xuIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkZWZlcnJlZF9pbml0X3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLFxuLVx0XHR1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuK1x0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuIHtcbiBcdGludCBuaWQgPSB6b25lX3RvX25pZCh6b25lKTtcbi1cdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfcGZuIC0gcGZuO1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGVuZF9wZm4gLSBzdGFydF9wZm4sIHBmbiA9IHN0YXJ0X3BmbjtcbiBcdGludCB6aWQgPSB6b25lX2lkeCh6b25lKTtcbiBcdHN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTtcbiBcbiBcdGZvciAoOyBwZm4gXHUwMDNjIGVuZF9wZm47IHBmbisrLCBwYWdlKyspXG4gXHRcdF9faW5pdF9zaW5nbGVfcGFnZShwYWdlLCBwZm4sIHppZCwgbmlkKTtcbitcbitcdC8qIE5vdyBpbml0aWFsaXplIG1pZ3JhdGUgdHlwZXMgZm9yIHRoZXNlIHBhZ2VzLiAqL1xuK1x0cGZuID0gcGFnZWJsb2NrX2FsaWduKHN0YXJ0X3Bmbik7XG4rXHRwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTtcbitcdGZvciAoOyBwZm4gXHUwMDNjIGVuZF9wZm47IHBmbiArPSBwYWdlYmxvY2tfbnJfcGFnZXMsIHBhZ2UgKz0gcGFnZWJsb2NrX25yX3BhZ2VzKVxuK1x0XHRpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlLCBNSUdSQVRFX01PVkFCTEUsIGZhbHNlKTtcbitcbitcdC8qXG4rXHQgKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBmb3IgYW55IHBhZ2VibG9ja3MgdGhhdCBmYWxsIGluIGEgS0hPIHNjcmF0Y2hcbitcdCAqIGFyZWEuIFNpbmNlIG1vc3QgcGFnZWJsb2NrcyB3aWxsIG5vdCBiZSBLSE8gc2NyYXRjaCwgZG8gaXQgb3V0c2lkZVxuK1x0ICogdGhlIGxvb3AgdG8gb25seSBkbyB0aGUgc2VhcmNoIG9uY2UuXG4rXHQgKi9cbitcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBlbmRfcGZuKTtcbitcbiBcdHJldHVybiBucl9wYWdlcztcbiB9XG4gXG5AQCAtMjA1NCw4ICsyMDcyLDYgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcbiBcdGZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlKGksIG5pZCwgMCwgXHUwMDI2c3RhcnQsIFx1MDAyNmVuZCwgTlVMTCkge1xuIFx0XHR1bnNpZ25lZCBsb25nIHNwZm4gPSBQRk5fVVAoc3RhcnQpO1xuIFx0XHR1bnNpZ25lZCBsb25nIGVwZm4gPSBQRk5fRE9XTihlbmQpO1xuLVx0XHRlbnVtIG1pZ3JhdGV0eXBlIG10ID1cbi1cdFx0XHRraG9fc2NyYXRjaF9taWdyYXRldHlwZShzcGZuLCBNSUdSQVRFX01PVkFCTEUpO1xuIFxuIFx0XHRpZiAoc3BmbiBcdTAwM2U9IGVuZF9wZm4pXG4gXHRcdFx0YnJlYWs7XG5AQCAtMjA2OCw3ICsyMDg0LDcgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcbiBcdFx0XHR1bnNpZ25lZCBsb25nIGNodW5rX2VuZCA9IG1pbihtb19wZm4sIGVwZm4pO1xuIFxuIFx0XHRcdG5yX3BhZ2VzICs9IGRlZmVycmVkX2luaXRfcGFnZXMoem9uZSwgc3BmbiwgY2h1bmtfZW5kKTtcbi1cdFx0XHRkZWZlcnJlZF9mcmVlX3BhZ2VzKHNwZm4sIGNodW5rX2VuZCAtIHNwZm4sIG10KTtcbitcdFx0XHRkZWZlcnJlZF9mcmVlX3BhZ2VzKHNwZm4sIGNodW5rX2VuZCAtIHNwZm4pO1xuIFxuIFx0XHRcdHNwZm4gPSBjaHVua19lbmQ7XG4gXG5AQCAtMjY4Nyw2ICsyNzAzLDcgQEAgdm9pZCBfX2luaXQgX193ZWFrIG1lbV9pbml0KHZvaWQpXG4gXG4gdm9pZCBfX2luaXQgbW1fY29yZV9pbml0X2Vhcmx5KHZvaWQpXG4ge1xuK1x0a2hvX21lbW9yeV9pbml0X2Vhcmx5KCk7XG4gXHRodWdldGxiX2NtYV9yZXNlcnZlKCk7XG4gXHRodWdldGxiX2Jvb3RtZW1fYWxsb2MoKTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmggYi90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmhcbmluZGV4IGI2YjFkMTQ3ZmQ3NTBlLi5lODZiYjkwMDBiMjJmOCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oXG5AQCAtNjYsNCArNjYsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuIFxuICNkZWZpbmUgX19TZXRQYWdlUmVzZXJ2ZWQocClcdCgodm9pZCkocCkpXG4gXG4rc3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4re1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiAjZW5kaWZcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjI3Ljk3OTczMzQxNloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwODY4Njc1MDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBLZXhlYyBIYW5kb3ZlciBQYXRjaCBTZXJpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHNlcmllcyB0aGF0J3MgdGlua2VyaW5nIHdpdGggdGhlIEtleGVjIEhhbmRvdmVyIChLSE8pIGZ1bmN0aW9uYWxpdHkuIEZyb20gdGhlIGRlc2NyaXB0aW9uLCBpdCBzZWVtcyBsaWtlIHdlJ3JlIGRlYWxpbmcgd2l0aCBzb21lIHNpZ25pZmljYW50IGNoYW5nZXM6IGtleSBlbmNvZGluZyB3aXRoaW4gdGhlIEtITyByYWRpeCB0cmVlLCB0aGUgaW50cm9kdWN0aW9uIG9mIGEgbmV3IGVhcmx5IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGBraG9fbWVtb3J5X2luaXRfZWFybHkoKWAsIG1vZGlmaWNhdGlvbnMgdG8gYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIoKWAsIGFuZCBhIHJldmFtcCBvZiBob3cgc2NyYXRjaCBtZW1vcnkgaXMgZXh0ZW5kZWQgYW5kIG1pZ3JhdGVkLiBUaGF0J3MgcXVpdGUgYSB3aWRlIHNjb3BlIG9mIGltcGFjdC5cblxuVGhlIHBhdGNoIHRvdWNoZXMgYSBnb29kIGNvbGxlY3Rpb24gb2YgY29yZSBmaWxlcy4gSSdtIHNlZWluZyBjaGFuZ2VzIGluIHRoZSBoZWFkZXIgZmlsZXMgZm9yIEtleGVjIEhhbmRvdmVyLCB0aGUgS0hPIEFCSSwgdGhlIEtITyByYWRpeCB0cmVlLCBhbmQgbWVtYmxvY2suIFRoYXQncyBleHBlY3RlZCwgZ2l2ZW4gdGhlIG5hdHVyZSBvZiB0aGUgY2hhbmdlcy4gVGhlIEMgZmlsZXMgYWZmZWN0ZWQgaW5jbHVkZSBga2V4ZWNfaGFuZG92ZXIuY2AsIGBodWdldGxiLmNgLCBgbWVtYmxvY2suY2AsIGFuZCBgbW1faW5pdC5jYC4gVGhpcyBkZWZpbml0ZWx5IGFmZmVjdHMgY3JpdGljYWwgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGhhbmRvdmVyIGNvbXBvbmVudHMsIHNvIHRoaXMgd2FycmFudHMgYSBjYXJlZnVsIHJldmlldy5cblxuQmVmb3JlIGRpdmluZyBkZWVwZXIgaW50byB0aGUgaW5kaXZpZHVhbCBwYXRjaCBkZXRhaWxzLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbGFyZ2VyIGNvbnRleHQuIElzIEtleGVjIEhhbmRvdmVyIGV2ZW4gZW5hYmxlZCBhbmQgaG93IGlzIGl0IGNvbmZpZ3VyZWQ/IEknbGwgcXVpY2tseSBjaGVjayBmb3IgYENPTkZJR19LRVhFQ19IQU5ET1ZFUmAgdG8gc2VlIGlmIGl0J3MgaW4gcGxheS4gSSdsbCB1c2UgYGdyZXBwZXJgIGZvciB0aGF0LCBhIHF1aWNrIHNjYW4gd2lsbCBjb25maXJtIGlmIHRoaXMgY29kZSBwYXRoIGlzIHJlbGV2YW50IG9yIGlmIGl0J3MgZ3VhcmRlZCBieSBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBMZXQncyBzZWUgd2hhdCB0aGF0IHJldmVhbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNzI4LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjA1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDE6MzMuMDY2NjAzMTYzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyNjA3MjI5ODUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEtFWEVDX0hBTkRPVkVSXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9saXZldXBkYXRlL0tjb25maWc9Mz1tZW51IFxcXCJMaXZlIFVwZGF0ZSBhbmQgS2V4ZWMgSGFuZE92ZXJcXFwiXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy00LVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6NTpjb25maWcgS0VYRUNfSEFORE9WRVJcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTYtXFx0Ym9vbCBcXFwia2V4ZWMgaGFuZG92ZXJcXFwiXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTE3LVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6MTg6Y29uZmlnIEtFWEVDX0hBTkRPVkVSX0RFQlVHXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0xOS1cXHRib29sIFxcXCJFbmFibGUgS2V4ZWMgSGFuZG92ZXIgZGVidWcgY2hlY2tzXFxcIlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0yNi1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnOjI3OmNvbmZpZyBLRVhFQ19IQU5ET1ZFUl9ERUJVR0ZTXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0yOC1cXHRib29sIFxcXCJrZXhlYyBoYW5kb3ZlciBkZWJ1Z2ZzIGludGVyZmFjZVxcXCJcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctMzctXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzozODpjb25maWcgS0VYRUNfSEFORE9WRVJfRU5BQkxFX0RFRkFVTFRcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTM5LVxcdGJvb2wgXFxcIkVuYWJsZSBrZXhlYyBoYW5kb3ZlciBieSBkZWZhdWx0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MTozNy4zMjczMzE1MDhaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MTY2NTkzMzU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2g6IEtleGVjIEhhbmRvdmVyIGFuZCBIdWdlVExCIEludGVncmF0aW9uKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyB0b3VjaGluZyBga2V4ZWNfaGFuZG92ZXIuY2AgYW5kIGBtZW1ibG9jay5jYC4gSXQgbG9va3MgbGlrZSBpdCdzIGEgbWl4IG9mIG5ldyBmdW5jdGlvbnMgYW5kIHNvbWUgaW50ZWdyYXRpb24gd29yay4gSW4gYGtleGVjX2hhbmRvdmVyLmNgLCBJIHNlZSBhIHdob2xlIHNsZXcgb2YgcmFkaXggdHJlZSBmdW5jdGlvbnMgYmVpbmcgYWRkZWQ6IGBraG9fcmFkaXhfYWRkX2tleWAsIGBraG9fcmFkaXhfZGVsX2tleWAsIHRoZSB3YWxraW5nLCBpbml0aWFsaXphdGlvbiwgYW5kIGRlc3RydWN0aW9uIGZ1bmN0aW9ucyAoYGtob19yYWRpeF93YWxrX3RyZWVgLCBga2hvX3JhZGl4X2luaXRfdHJlZWAsIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYCksIHBsdXMgc29tZSBtb3JlIHNwZWNpZmljIHV0aWxpdHkgZnVuY3Rpb25zIGxpa2UgYGtob19leHRlbmRfc2NyYXRjaGAsIGBraG9fbWVtb3J5X2luaXRfZWFybHlgLCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAsIGFuZCBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWAuIFRoYXQncyBhIHNpZ25pZmljYW50IGFkZGl0aW9uLCBjbGVhcmx5IGJ1aWxkaW5nIHNvbWUga2luZCBvZiBkYXRhIHN0cnVjdHVyZSBhbmQgcmVsYXRlZCBtYW5hZ2VtZW50IGxvZ2ljIHdpdGhpbiB0aGUga2V4ZWMgaGFuZG92ZXIgcHJvY2Vzcy5cblxuTm93LCBvdmVyIGluIGBtZW1ibG9jay5jYCwgdGhlIG5ldyBmdW5jdGlvbiBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgaXMgYmVpbmcgaW50cm9kdWNlZC4gSW50ZXJlc3RpbmcuIEFuZCBpdCBhcHBlYXJzIHRoYXQgd2l0aGluIGBtbS9odWdldGxiLmNgLCBgYWxsb2NfYm9vdG1lbWAgaXMgdXNpbmcgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgLlxuXG5NeSBmaXJzdCB0aG91Z2h0IGlzLCBpcyBgQ09ORklHX0tFWEVDX0hBTkRPVkVSYCB0aGUgb25seSBjb25maWd1cmF0aW9uIG9wdGlvbiBhZmZlY3RlZD8gSSBhc3N1bWUgdGhhdCdzIHRoZSBwcmltYXJ5IGRyaXZlciBoZXJlLiBPa2F5LCBJJ3ZlIGNvbmZpcm1lZCB0aGF0IGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIGlzIHRoZSBtYWluIHRoaW5nLiBCdXQgd2FpdCwgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGlzIGNhbGxlZCBpbiBgbW0vaHVnZXRsYi5jYCwgc28gYENPTkZJR19IVUdFVExCX1BBR0VgIGlzIGFsc28gZ29pbmcgdG8gYmUgcmVsZXZhbnQgaGVyZS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIHByb3Blcmx5IGhhbmRsZWQuIExldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBtbS9odWdldGxiLmNgIGNvZGUgdG8gY29uZmlybSB0aGF0IGBhbGxvY19ib290bWVtYCBpcyBpbmRlZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIG90aGVyIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTUyMiwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MTo0NC40OTM5MjczNDJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE5MDMyNDI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFsbG9jX2Jvb3RtZW1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vaHVnZXRsYi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2V0bGIuYz0yODU1PXN0cnVjdCBmb2xpbyAqYWxsb2NfaHVnZXRsYl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2h1Z2V0bGIuYy0zMDI3LVxcbm1tL2h1Z2V0bGIuYzozMDI4OnN0YXRpYyBfX2luaXQgdm9pZCAqYWxsb2NfYm9vdG1lbShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkLCBib29sIG5vZGVfZXhhY3QpXFxubW0vaHVnZXRsYi5jLTMwMjkte1xcbi0tXFxubW0vaHVnZXRsYi5jLTMwMzMtXFx0aWYgKGh1Z2V0bGJfZWFybHlfY21hKGgpKVxcbm1tL2h1Z2V0bGIuYzozMDM0OlxcdFxcdG0gPSBodWdldGxiX2NtYV9hbGxvY19ib290bWVtKGgsIFxcdTAwMjZsaXN0bm9kZSwgbm9kZV9leGFjdCk7XFxubW0vaHVnZXRsYi5jLTMwMzUtXFx0ZWxzZSB7XFxuLS1cXG5tbS9odWdldGxiLmMtMzA2OS1cXG5tbS9odWdldGxiLmM6MzA3MDppbnQgYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZClcXG5tbS9odWdldGxiLmM6MzA3MTpcXHRfX2F0dHJpYnV0ZV9fICgod2VhaywgYWxpYXMoXFxcIl9fYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2VcXFwiKSkpO1xcbm1tL2h1Z2V0bGIuYzozMDcyOmludCBfX2FsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQpXFxubW0vaHVnZXRsYi5jLTMwNzMte1xcbi0tXFxubW0vaHVnZXRsYi5jLTMwNzgtXFx0aWYgKG5pZCAhPSBOVU1BX05PX05PREUpIHtcXG5tbS9odWdldGxiLmM6MzA3OTpcXHRcXHRtID0gYWxsb2NfYm9vdG1lbShoLCBub2RlLCB0cnVlKTtcXG5tbS9odWdldGxiLmMtMzA4MC1cXHRcXHRpZiAoIW0pXFxuLS1cXG5tbS9odWdldGxiLmMtMzA4Ny1cXHRcXHRcXHRcXHQgICAgXFx1MDAyNmh1Z2V0bGJfYm9vdG1lbV9ub2Rlcykge1xcbm1tL2h1Z2V0bGIuYzozMDg4OlxcdFxcdG0gPSBhbGxvY19ib290bWVtKGgsIG5vZGUsIGZhbHNlKTtcXG5tbS9odWdldGxiLmMtMzA4OS1cXHRcXHRpZiAoIW0pXFxuLS1cXG5tbS9odWdldGxiLmM9MzM2ND1zdGF0aWMgdm9pZCBfX2luaXQgaHVnZXRsYl9oc3RhdGVfYWxsb2NfcGFnZXNfb25lbm9kZShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkKVxcbi0tXFxubW0vaHVnZXRsYi5jLTMzNzEtXFx0XFx0aWYgKGhzdGF0ZV9pc19naWdhbnRpYyhoKSkge1xcbm1tL2h1Z2V0bGIuYzozMzcyOlxcdFxcdFxcdGlmICghYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2UoaCwgbmlkKSlcXG5tbS9odWdldGxiLmMtMzM3My1cXHRcXHRcXHRcXHRicmVhaztcXG4tLVxcbm1tL2h1Z2V0bGIuYz0zNDY1PXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBodWdldGxiX2dpZ2FudGljX3BhZ2VzX2FsbG9jX2Jvb3Qoc3RydWN0IGhzdGF0ZSAqaClcXG4tLVxcbm1tL2h1Z2V0bGIuYy0zNDY5LVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBoLVxcdTAwM2VtYXhfaHVnZV9wYWdlczsgKytpKSB7XFxubW0vaHVnZXRsYi5jOjM0NzA6XFx0XFx0aWYgKCFhbGxvY19ib290bWVtX2h1Z2VfcGFnZShoLCBOVU1BX05PX05PREUpKVxcbm1tL2h1Z2V0bGIuYy0zNDcxLVxcdFxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MTo0NC43MTI5NjU2N1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyMjg0MTkwOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24qKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIHRvdWNoaW5nIGBtbS9tZW1ibG9jay5jYCBhbmQgYG1tL2h1Z2V0bGIuY2Ag4oCTIGludGVyZXN0aW5nLiBQYXJ0aWN1bGFybHksIEkgc2VlIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCBpcyB1c2VkIGluIGBhbGxvY19ib290bWVtYCB3aGljaCBsaXZlcyBpbiBgbW0vaHVnZXRsYi5jYC4gVGhhdCBzY3JlYW1zIHBvdGVudGlhbCwgdGhpcyBsb29rcyBsaWtlIGEgZ29vZCB0YXJnZXQgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgd29ydGggaW52ZXN0aWdhdGluZyBtb3JlIGNsb3NlbHkuXG5cbk5vdywgbGV0J3MgaWRlbnRpZnkgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyB3aXRoaW4gdGhhdCBhcmVhIHRoYXQgd2FycmFudCBkZWVwZXIgZXhhbWluYXRpb24uIEknbSBzZWVpbmcgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcmFkaXggdHJlZXMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHRoYXQgSSBzaG91bGQgZm9jdXMgb246XG5cbiogICBga2hvX3JhZGl4X2FkZF9rZXlgXG4qICAgYGtob19yYWRpeF9kZWxfa2V5YFxuKiAgIGBraG9fcmFkaXhfd2Fsa190cmVlYFxuKiAgIGBraG9fcmFkaXhfaW5pdF90cmVlYFxuKiAgIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYFxuKiAgIGBraG9fZXh0ZW5kX3NjcmF0Y2hgXG4qICAgYGtob19tZW1vcnlfaW5pdF9lYXJseWBcbiogICBga2hvX3NjcmF0Y2hfb3ZlcmxhcGBcbiogICBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWBcbiogICBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmBcblxuTGV0J3MgYmVnaW4gYnkgY2hlY2tpbmcgdG8gc2VlIGlmIGBraG9fcmFkaXhfYWRkX2tleWAgaXMgZXhwb3J0ZWQgb3IgdXNlZC4gVGhpcyBjb3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyOTc1LCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTk3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjQ5Ljk0MTM4NzQ5NVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTczODMwMzc3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtob19yYWRpeF9hZGRfa2V5XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaD00Nj1zdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2Ige1xcbi0tXFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTUyLVxcbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaDo1MzppbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7XFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTU0LXZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg9NTg9dm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNjEtXFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oOjYyOnN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9hZGRfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpXFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTYzLXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTc4PXN0YXRpYyB2b2lkIF9fcmVmIGtob19yYWRpeF9mcmVlX25vZGUoc3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODYtLyoqXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxODc6ICoga2hvX3JhZGl4X2FkZF9rZXkgLSBBZGQgYSBrZXkgdG8gdGhlIHJhZGl4IHRyZWUuXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODgtICogQHRyZWU6IFRoZSBLSE8gcmFkaXggdHJlZS5cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMjAyLSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MjAzOmludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMjA0LXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMjcxLX1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjI3MjpFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0yNzMtXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTkzMz1zdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbGVhZih1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtOTQ0LVxcdHdoaWxlIChzdGFydCBcXHUwMDNjIGVuZCkge1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6OTQ1OlxcdFxcdGVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIHN0YXJ0IFxcdTAwM2VcXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtOTQ2LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTk1Nj1zdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbm9kZShwaHlzX2FkZHJfdCBwaHlzLCB2b2lkICpkYXRhKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy05NjAtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzo5NjE6XFx0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIHBoeXMgXFx1MDAzZVxcdTAwM2UgS0hPX0VYVF9TSElGVCk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy05NjItfVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMTQ5PWludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE1OC1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExNTk6XFx0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTYwLVxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBvcmRlcikpO1xcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMjI0PWludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNDEtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjQyOlxcdFxcdGVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjQzLVxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIG9yZGVyKSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjUyLjExNTIyNTg4MloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMxMDM5NjkyMjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzIG9uIGNoZWNraW5nIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCwgc3VtbWFyaXplZCBhcyBpZiBJJ20gdGhpbmtpbmcgaXQ6XG5cbioqQW5hbHl6aW5nIHRoZSBBbGxvY2F0aW9uIG9mIEh1Z2VUTEIgTWVtb3J5KipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGUgZGV0YWlscy4gSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IGBtZW1ibG9ja19hbGxvY19odWdldGxiYC4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiAqaG93KiB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBIdWdlVExCIG1lbW9yeS4gVGhpcyBpbXBsaWVzIGEgZGVlcGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5IG1hbmFnZW1lbnQgbWVjaGFuaXNtcywgbGlrZWx5IGludm9sdmluZyBwYWdlIHRhYmxlIG1hbmlwdWxhdGlvbiwgcGh5c2ljYWwgYWRkcmVzcyBhbGxvY2F0aW9uLCBhbmQgcG90ZW50aWFsIGNvbnNpZGVyYXRpb25zIGZvciBOVU1BIGFyY2hpdGVjdHVyZXMuIEknbGwgbmVlZCB0byBzZWUgaG93IGl0IGludGVncmF0ZXMgd2l0aCB0aGUgZXhpc3RpbmcgYG1lbWJsb2NrYCBzeXN0ZW0sIHBhcnRpY3VsYXJseSBob3cgdGhlIHJlc2VydmVkIG1lbW9yeSByZWdpb25zIGZvciBIdWdlVExCcyBhcmUgbWFuYWdlZCBhbmQgaWYgdGhlcmUgaXMgYW55IG92ZXJsYXAgd2l0aCBvdGhlciBtZW1vcnkgYWxsb2NhdGlvbiBzY2hlbWVzLiBJJ2xsIGFsc28gYmUgc2VhcmNoaW5nIGZvciBhbnkgcG90ZW50aWFsIG9wdGltaXphdGlvbiwgYW5kIHdpbGwgYmUgd2F0Y2hpbmcgaG93IGl0IGRlYWxzIHdpdGggZnJhZ21lbnRhdGlvbiBhbmQgcG90ZW50aWFsIGVycm9ycy4gTGV0J3Mgc2VlIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIHdob2xlIHRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDUzMywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjU1LjIxOTE5NzczOVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYzMTA5NTc1MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1ibG9ja19hbGxvY19odWdldGxiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvbWVtYmxvY2suaD00MjI9dm9pZCAqbWVtYmxvY2tfYWxsb2NfdHJ5X25pZChwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbixcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtYmxvY2suaC00MjQtXFx0XFx0XFx0ICAgICBpbnQgbmlkKTtcXG5pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmg6NDI1OnZvaWQgKm1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIocGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpO1xcbmluY2x1ZGUvbGludXgvbWVtYmxvY2suaC00MjYtXFxuLS1cXG5tbS9odWdldGxiLmM9MzAyOD1zdGF0aWMgX19pbml0IHZvaWQgKmFsbG9jX2Jvb3RtZW0oc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZCwgYm9vbCBub2RlX2V4YWN0KVxcbi0tXFxubW0vaHVnZXRsYi5jLTMwMzUtXFx0ZWxzZSB7XFxubW0vaHVnZXRsYi5jOjMwMzY6XFx0XFx0bSA9IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIoaHVnZV9wYWdlX3NpemUoaCksIG5pZCwgbm9kZV9leGFjdCk7XFxubW0vaHVnZXRsYi5jLTMwMzctXFx0XFx0aWYgKG0pIHtcXG4tLVxcbm1tL2h1Z2V0bGIuYy0zMDQ0LVxcdFxcdFxcdCAqIGZyb20uIFRoYXQgbm9kZSBtYXkgYmUgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mXFxubW0vaHVnZXRsYi5jOjMwNDU6XFx0XFx0XFx0ICogZmFsbGJhY2sgYnkgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYl9ib290bWVtLiBTbyxcXG5tbS9odWdldGxiLmMtMzA0Ni1cXHRcXHRcXHQgKiBleHRyYWN0IHRoZSBhY3R1YWwgbm9kZSBmaXJzdC5cXG4tLVxcbm1tL21lbWJsb2NrLmM9MTc1MT12b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KFxcbi0tXFxubW0vbWVtYmxvY2suYy0xNzY0LS8qKlxcbm1tL21lbWJsb2NrLmM6MTc2NTogKiBtZW1ibG9ja19hbGxvY19odWdldGxiIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgZm9yIEh1Z2VUTEIgcGFnZXNcXG5tbS9tZW1ibG9jay5jLTE3NjYtICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xcbi0tXFxubW0vbWVtYmxvY2suYy0xNzc3LSAqL1xcbm1tL21lbWJsb2NrLmM6MTc3ODp2b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIocGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpXFxubW0vbWVtYmxvY2suYy0xNzc5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDE6NTYuODUwMzAyODUyWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMxNTg0MTE5NzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIGFuIGV4cGVydCBpbiB0aGUgZmllbGQgYW5kIGNvbnNpZGVyaW5nIGl0IGFzIG15IG93biB0aG91Z2h0OlxuXG4qKkNoZWNraW5nIGBraG9fc2NyYXRjaF9vdmVybGFwYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIGl0LiBGaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAuIFRoaXMgdmFyaWFibGUgb3IgcHJvY2VzcyBsaWtlbHkgcmVsYXRlcyB0byBhIGNyaXRpY2FsIGFzcGVjdCBvZiBteSBjdXJyZW50IHByb2plY3QsIHdoYXRldmVyIHRoYXQgaXMsIGxpa2VseSBga2hvYCwgd2hpY2ggYmFzZWQgb24gdGhlIHZhcmlhYmxlIG5hbWUgaXMgdGhlIG92ZXJhcmNoaW5nIHByb2plY3QgbmFtZS4gSSBzdXNwZWN0IHRoaXMgZWl0aGVyIHJlbGF0ZXMgdG8gaG93IGRpZmZlcmVudCBga2hvYCBpdGVyYXRpb25zIG9yIGNvbXBvbmVudHMgaW50ZXJhY3QuIE9yIHRoZSBkYXRhIGlzIHJlbGF0ZWQgdG8gb3ZlcmxhcCwgd2hpY2ggY291bGQgYmUgc3BhdGlhbCwgdGVtcG9yYWwsIGFsZ29yaXRobWljLCBvciBzZW1hbnRpYy4gSSdtIHByb2JhYmx5IHRyeWluZyB0byBhc3Nlc3MgaXRzIHZhbGlkaXR5LCBjb21wbGV0ZW5lc3MsIG9yIHBlcmhhcHMgaXRzIGltcGFjdCBvbiBzb21ldGhpbmcgZWxzZS4gU3BlY2lmaWNhbGx5LCBcInNjcmF0Y2hcIiBwcm9iYWJseSBtZWFucyBpdCdzIGFuIGludGVybWVkaWF0ZSBjYWxjdWxhdGlvbiBvciB0ZW1wb3JhcnkgaG9sZGluZyBzcG90LiBJIGhhdmUgdG8gc2VlIGhvdyBpdCdzIHdvcmtpbmcgYW5kIGZ1bmN0aW9uaW5nLiBUaGlzIHdpbGwgYmUga2V5LiBEZXBlbmRpbmcgb24gd2hhdCBpdCBpcywgSSBoYXZlIGNlcnRhaW4gYXNzdW1wdGlvbnMgYWJvdXQgaXRzIGNoYXJhY3RlcmlzdGljcywgYW5kIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aG9zZSBob2xkIHRydWUuIFRoZSBcIm92ZXJsYXBcIiBwYXJ0IHByb2JhYmx5IHRlbGxzIG1lIHRoZSBkYXRhIGhhcyBkdXBsaWNhdGVzIG9yIGEgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGNvbnNvbGlkYXRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjUyNzAsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MjowMC4wMDg3MTcwNzlaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MDM4NzkwOTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2hvX3NjcmF0Y2hfb3ZlcmxhcFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9Mzg9dm9pZCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLCBwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXMsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtNDAtXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjQxOmJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSk7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTQyLXZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcXG4tLVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0xMTc9c3RhdGljIGlubGluZSB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMTIxLVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDoxMjI6c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTEyMy17XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTc3NT1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHNjcmF0Y2hfc2l6ZV9ub2RlKGludCBuaWQpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTc5Mi1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjc5Mzpib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy03OTQte1xcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMTQ5PWludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE1NS1cXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpIFxcdTAwMjZcXHUwMDI2XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTU2OlxcdCAgICBXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAocGZuIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQsIFBBR0VfU0laRSBcXHUwMDNjXFx1MDAzYyBvcmRlcikpKVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE1Ny1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTIyND1pbnQga2hvX3ByZXNlcnZlX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjMzLVxcdGlmIChJU19FTkFCTEVEKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRykgXFx1MDAyNlxcdTAwMjZcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyMzQ6XFx0ICAgIFdBUk5fT04oa2hvX3NjcmF0Y2hfb3ZlcmxhcChzdGFydF9wZm4gXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCxcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMzUtXFx0XFx0XFx0XFx0XFx0bnJfcGFnZXMgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCkpKSB7XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTE5MDI9dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTE5MDktXFx0LypcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjE5MTA6XFx0ICoga2hvX3NjcmF0Y2hfb3ZlcmxhcCgpIG5lZWRzIGtob19zY3JhdGNoIHRvIGJlIGluaXRpYWxpemVkLiBJdFxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkxMS1cXHQgKiBpcyB1c2VkIGJ5IGZyZWVfYXJlYV9pbml0KCkgb24gS0hPIGJvb3RzLCBzbyBpbml0aWFsaXplIGl0XFxuLS1cXG5tbS9tZW1ibG9jay5jPTE3Nzg9dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxcbi0tXFxubW0vbWVtYmxvY2suYy0xODEwLVxcdCAqL1xcbm1tL21lbWJsb2NrLmM6MTgxMTpcXHRpZiAoa2hvX3NjcmF0Y2hfb3ZlcmxhcChhZGRyLCBzaXplKSkge1xcbm1tL21lbWJsb2NrLmMtMTgxMi1cXHRcXHRpZiAobWVtYmxvY2tfYm90dG9tX3VwKCkpXFxuLS1cXG50b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmg9NjM9c3RhdGljIGlubGluZSB2b2lkIGluaXRfZGVmZXJyZWRfcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcXG4tLVxcbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaC02OC1cXG50b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmg6Njk6c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxudG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oLTcwLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6MDEuODEyNjAyMjdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzA3NDY3NDk2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEknbSB0YWtpbmcgYSBsb29rIGF0IHRoaXMgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIHRoaW5nLiBCYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIGl0J3MgcHJldHR5IGNsZWFyIHRoaXMgaXMgcHJvYmFibHkgcmVsYXRlZCB0byB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYSBzY3JhdGNoIGVudmlyb25tZW50IGFuZCBwb3NzaWJseSBzb21ldGhpbmcgcmVsYXRlZCB0byBtaWdyYXRpbmcgc29tZSBkYXRhIHR5cGUgb3Igc2NoZW1hLiBJJ20gaW1tZWRpYXRlbHkgdGhpbmtpbmcgYWJvdXQgcG90ZW50aWFsIHVzZSBjYXNlcyBhbmQgZ290Y2hhcy4gSXMgdGhpcyBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZSBzeXN0ZW0/IElzIHRoZXJlIHNvbWUga2luZCBvZiB2ZXJzaW9uaW5nIG9yIGNvbXBhdGliaWxpdHkgY29uY2VybiB0aGF0IEkgbmVlZCB0byBrZWVwIGluIG1pbmQ/IEFyZSB3ZSB0YWxraW5nIGFib3V0IGEgc2ltcGxlIGNvcHksIG9yIHNvbWUgc29ydCBvZiBkYXRhIHRyYW5zZm9ybWF0aW9uPyBUaGUgaW1wbGljYXRpb25zIGNvdWxkIGJlIHdpZGUtcmFuZ2luZy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIHNjcmF0Y2ggZW52aXJvbm1lbnQgaXMgZm9yLCBhbmQgcHJlY2lzZWx5IHdoYXQgZGF0YSBtaWdyYXRpb24gaXMgaW52b2x2ZWQuIEZyb20gdGhlcmUsIEkgY2FuIGRldGVybWluZSB0aGUgcG90ZW50aWFsIGNvbXBsZXhpdHkgYW5kIHJpc2tzLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLCBlcnJvciBoYW5kbGluZywgbG9nZ2luZywgYW5kIHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zLiBNeSBtaW5kIHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIHNjZW5hcmlvcyBxdWlja2x5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjU1NCwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjA0Ljg4NzI3OTkyOFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcyNzA4NzE0MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD00MT1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpO1xcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDo0Mjp2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTQzLSNlbHNlXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9MTIyPXN0YXRpYyBpbmxpbmUgYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTEyNi1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MTI3OnN0YXRpYyBpbmxpbmUgdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMjgtXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9NzkzPWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODEyLSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6ODEzOnZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODE0LXtcXG4tLVxcbm1tL21tX2luaXQuYz02OTQ9dm9pZCBfX21lbWluaXQgX19pbml0X3BhZ2VfZnJvbV9uaWQodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpXFxuLS1cXG5tbS9tbV9pbml0LmMtNzEyLVxcdFxcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXFxubW0vbW1faW5pdC5jOjcxMzpcXHRcXHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgcGZuICsgMSk7XFxubW0vbW1faW5pdC5jLTcxNC1cXHR9XFxuLS1cXG5tbS9tbV9pbml0LmM9ODc1PXZvaWQgX19tZW1pbml0IG1lbW1hcF9pbml0X3JhbmdlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyB6b25lLFxcbi0tXFxubW0vbW1faW5pdC5jLTk1MC1cXHQgKi9cXG5tbS9tbV9pbml0LmM6OTUxOlxcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBwZm4pO1xcbm1tL21tX2luaXQuYy05NTItfVxcbi0tXFxubW0vbW1faW5pdC5jPTIwMjM9c3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGRlZmVycmVkX2luaXRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9tbV9pbml0LmMtMjA0NC1cXHQgKi9cXG5tbS9tbV9pbml0LmM6MjA0NTpcXHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgZW5kX3Bmbik7XFxubW0vbW1faW5pdC5jLTIwNDYtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjA2LjYxNDM3MzM5OVoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1OTU4NTQyMTg3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCoqXG5cbk9rYXksIHRpbWUgdG8gZGlzc2VjdCB0aGlzLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYGtob19tZW1vcnlfaW5pdF9lYXJseWAuIFRoYXQgZnVuY3Rpb24gbmFtZSBpdHNlbGYgaXMgcHJldHR5IGluZGljYXRpdmUuIFwiRWFybHlcIiBzdWdnZXN0cyBpdCdzIGEgY3JpdGljYWwgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgbGlrZWx5IGV4ZWN1dGVkIGJlZm9yZSBhIHNpZ25pZmljYW50IHBvcnRpb24gb2YgdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZy4gSSdtIGltbWVkaWF0ZWx5IHRoaW5raW5nIGxvdy1sZXZlbCwgcHJvYmFibHkgZGVhbGluZyB3aXRoIGhhcmR3YXJlLCBtZW1vcnkgbWFwcGluZywgb3IgYXQgbGVhc3Qgc2V0dGluZyB1cCB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS5cblxuTXkgcHJpbWFyeSBjb25jZXJuIG5vdyBpcyB1bmRlcnN0YW5kaW5nIGl0cyBzY29wZS4gRG9lcyBpdCBkZWFsIHdpdGgganVzdCB0aGUga2VybmVsJ3MgbWVtb3J5LCBvciBpcyBpdCBzZXR0aW5nIHVwIGluaXRpYWwgbWFwcGluZ3MgZm9yIHVzZXIgc3BhY2UgdG9vLCBldmVuIGF0IHRoaXMgc3RhZ2U/IFRoYXQgd291bGQgYmUgaW50ZXJlc3RpbmcsIGFuZCBwb3RlbnRpYWxseSB0cmlja3ksIHJlcXVpcmluZyBjYXJlZnVsIGF0dGVudGlvbiB0byBhZGRyZXNzIHNwYWNlcy5cblxuSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBzcGVjaWZpYyBoYXJkd2FyZSBjb250ZXh0cyB0aGlzIGZ1bmN0aW9uIGlzIG9wZXJhdGluZyB1bmRlci4gRG9lcyB0aGlzIHJvdXRpbmUgZGVhbCB3aXRoIE1NVSBjb25maWd1cmF0aW9uLCBwYWdlIHRhYmxlIGluaXRpYWxpemF0aW9uLCBvciBpcyBpdCBtb3JlIHJlbGF0ZWQgdG8gYm9vdGxvYWRlci1saWtlIGFjdGl2aXRpZXMgbGlrZSByZXNlcnZpbmcgbWVtb3J5IHJlZ2lvbnM/IElzIHRoZXJlIGFueXRoaW5nIHNwZWNpZmljIGFib3V0IHRoZSBhcmNoaXRlY3R1cmUgKGUuZy4sIEFSTSwgeDg2KSB0aGF0IHNob3VsZCBkaWN0YXRlIG15IGFuYWx5c2lzP1xuXG5JJ20gbWVudGFsbHkgcHJlcGFyaW5nIGZvciBhIGRlZXAgZGl2ZSBpbnRvIHRoZSBjb2RlLiBJJ2xsIG5lZWQgdG8gbG9vayBhdCBhbnkgaW5jbHVkZWQgaGVhZGVycyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwb3RlbnRpYWwgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGluaXRpYWwgcm91dGluZXMuIEkgZXhwZWN0IHRvIGJlIGxvb2tpbmcgZm9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGVzcGVjaWFsbHkgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBtdWx0aXBsZSBwYXJ0cyBvZiB0aGUgYm9vdCBwcm9jZXNzLiBEZWJ1Z2dpbmcgdGhpcyB0eXBlIG9mIGZ1bmN0aW9uIGlzIGFsd2F5cyBmdW4hIExldCdzIGdldCBnb2luZy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc0NjcsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MjoxMi41NzI5MTg0MzZaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NDE4MjI4ODIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2hvX21lbW9yeV9pbml0X2Vhcmx5XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0zNT12b2lkIGtob19tZW1vcnlfaW5pdCh2b2lkKTtcXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MzY6dm9pZCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZCk7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTM3LVxcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTExMz1zdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpIHsgfVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMTQtXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjExNTpzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMTYtXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTE5MDA9ZnNfaW5pdGNhbGwoa2hvX2luaXQpO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkwMS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjE5MDI6dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xOTAzLXtcXG4tLVxcbm1tL21tX2luaXQuYz0yNzA0PXZvaWQgX19pbml0IG1tX2NvcmVfaW5pdF9lYXJseSh2b2lkKVxcbm1tL21tX2luaXQuYy0yNzA1LXtcXG5tbS9tbV9pbml0LmM6MjcwNjpcXHRraG9fbWVtb3J5X2luaXRfZWFybHkoKTtcXG5tbS9tbV9pbml0LmMtMjcwNy1cXHRodWdldGxiX2NtYV9yZXNlcnZlKCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjE0LjIxNDc0ODYwOVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5MDUyNjgzODc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgS2V4ZWMgSGFuZG92ZXI6IEEgU3RyYXRlZ3kqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGludHJvZHVjaW5nIEtleGVjIEhhbmRvdmVyIChLSE8pIGZ1bmN0aW9uYWxpdHkgYW5kIG1lc3Npbmcgd2l0aCBob3cgdGhlIGtlcm5lbCBhbGxvY2F0ZXMgbWVtb3J5IGZvciBodWdlIHBhZ2VzIChodWdldGxiKSB1c2luZyBtZW1ibG9jay4gTXkgZ3V0IHNheXM6ICoqZnV6eiB0aGlzISoqIFRoaXMgaGl0cyAqY29yZSoga2VybmVsIGxvZ2ljIOKAkyBtZW1ibG9jaywgbW1faW5pdCwgaHVnZXRsYiDigJMgYW5kLCBjcnVjaWFsbHksIGFkZHMgZW50aXJlbHkgbmV3IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgZHVyaW5nIGJvdGggYm9vdCBhbmQgcnVudGltZS4gVGhhdCdzIGEgZnV6emluZyBnb2xkbWluZSByaWdodCB0aGVyZS5cblxuSG1tLCBsZXQncyBzZWUsIGBraG9fbWVtb3J5X2luaXRfZWFybHlgIGlzIGNhbGxlZCBmcm9tIGBtbV9jb3JlX2luaXRfZWFybHlgLiBBbmQgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGlzIGFjdHVhbGx5IHVzZWQgd2l0aCBgYWxsb2NfYm9vdG1lbWAgaW4gYG1tL2h1Z2V0bGIuY2AuIFRoZXNlIGFyZSBib290LXRpbWUgZnVuY3Rpb25zLiBDYW4gd2UgZXZlbiBmdXp6IHRoZW0gZWZmZWN0aXZlbHk/XG5cblN5emJvdCBpcyBhbWF6aW5nLCBidXQgdHlwaWNhbGx5IGl0IGhpdHMgdGhpbmdzIHBvc3QtYm9vdC4gSG93ZXZlciwgd2UgY291bGQgcG90ZW50aWFsbHkgZnV6eiBib290IHBhcmFtZXRlcnMgdG8gaW5mbHVlbmNlIHRoZXNlIGVhcmx5IHN0YWdlcywgb3IgcGVyaGFwcyBTeXpib3QgY291bGQgdHJpZ2dlciBLSE8gZGlyZWN0bHkgaWYgaXTigJlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLlxuXG5BbHJpZ2h0LCB0aGUgcGxvdCB0aGlja2Vucy4gYGtob19yYWRpeF9hZGRfa2V5YCBhbmQgYGtob19yYWRpeF9kZWxfa2V5YCBhcmUgZXhwb3J0ZWQgc3ltYm9scy4gVGhhdCdzIGh1Z2UhIEFuZCB0aGV54oCZcmUgY2FsbGVkIGZyb20gYGtob19wcmVzZXJ2ZV9mb2xpb2AsIGBraG9fdW5wcmVzZXJ2ZV9mb2xpb2AsIGBraG9fcHJlc2VydmVfcGFnZXNgLCBhbmQgYGtob191bnByZXNlcnZlX3BhZ2VzYC4gVGhvc2UgZnVuY3Rpb25zIGFyZSBob3cgZHJpdmVycyBhbmQgc3Vic3lzdGVtcyBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoIHByZXNlcnZpbmcgbWVtb3J5IGFjcm9zcyBhIGtleGVjIHRyYW5zaXRpb24hIFRoYXQgbWVhbnMgcnVudGltZSBleHBvc3VyZS4gRXhjZWxsZW50LiBUaGlzIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHRoZSBmdXp6aW5nIGF0dGFjayBzdXJmYWNlLCBiZWNhdXNlIG5vdyB3ZSBjYW4gcG90ZW50aWFsbHkgaGl0IHRoZXNlIGR1cmluZyBydW50aW1lIVxuXG5JIHRoaW5rIEkgd2lsbCBjaGVjayB0byBzZWUgaG93IGBraG9fcHJlc2VydmVfZm9saW9gIGlzIHVzZWQgZWxzZXdoZXJlIGluIHRoZSBrZXJuZWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4MTg2LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjY1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjIzLjI2NzQzNTUzNFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk0NTQwODgxOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJraG9fcHJlc2VydmVfZm9saW9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTE3PWJvb2wgaXNfa2hvX2Jvb3Qodm9pZCk7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTE4LVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDoxOTppbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0yMC12b2lkIGtob191bnByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTQ5PXN0YXRpYyBpbmxpbmUgYm9vbCBpc19raG9fYm9vdCh2b2lkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTUzLVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDo1NDpzdGF0aWMgaW5saW5lIGludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtNTUte1xcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMTM4PUVYUE9SVF9TWU1CT0xfR1BMKGtob19yZW1vdmVfc3VidHJlZSk7XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNDAtLyoqXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTQxOiAqIGtob19wcmVzZXJ2ZV9mb2xpbyAtIHByZXNlcnZlIGEgZm9saW8gYWNyb3NzIGtleGVjLlxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE0Mi0gKiBAZm9saW86IGZvbGlvIHRvIHByZXNlcnZlLlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTQ4LSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTE0OTppbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTUwLXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE2MS19XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTYyOkVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9mb2xpbyk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTYzLVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTY4LSAqIEluc3RydWN0cyBLSE8gdG8gdW5wcmVzZXJ2ZSBhIGZvbGlvIHRoYXQgd2FzIHByZXNlcnZlZCBieVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTE2OTogKiBraG9fcHJlc2VydmVfZm9saW8oKSBiZWZvcmUuIFRoZSBwcm92aWRlZCBAZm9saW8gKHBmbiBhbmQgb3JkZXIpXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTcwLSAqIG11c3QgZXhhY3RseSBtYXRjaCBhIHByZXZpb3VzbHkgcHJlc2VydmVkIGZvbGlvLlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xNTQ3PXZvaWQgKmtob19hbGxvY19wcmVzZXJ2ZShzaXplX3Qgc2l6ZSlcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTU2Mi1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjE1NjM6XFx0cmV0ID0ga2hvX3ByZXNlcnZlX2ZvbGlvKGZvbGlvKTtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTE1NjQtXFx0aWYgKHJldCkge1xcbi0tXFxubGliL3Rlc3Rfa2hvLmM9NTQ9c3RhdGljIGludCBraG9fdGVzdF9wcmVzZXJ2ZV9kYXRhKHN0cnVjdCBraG9fdGVzdF9zdGF0ZSAqc3RhdGUpXFxuLS1cXG5saWIvdGVzdF9raG8uYy03NS1cXHRcXHRmb2xpb3NfaW5mb1tpXSA9IHZpcnRfdG9fcGh5cyhmb2xpb19hZGRyZXNzKGZvbGlvKSkgfCBvcmRlcjtcXG5saWIvdGVzdF9raG8uYzo3NjpcXHRcXHRlcnIgPSBraG9fcHJlc2VydmVfZm9saW8oZm9saW8pO1xcbmxpYi90ZXN0X2toby5jLTc3LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5saWIvdGVzdF9raG8uYz0xMjQ9c3RhdGljIGludCBraG9fdGVzdF9wcmVzZXJ2ZShzdHJ1Y3Qga2hvX3Rlc3Rfc3RhdGUgKnN0YXRlKVxcbi0tXFxubGliL3Rlc3Rfa2hvLmMtMTMzLVxcbmxpYi90ZXN0X2toby5jOjEzNDpcXHRlcnIgPSBraG9fcHJlc2VydmVfZm9saW8oc3RhdGUtXFx1MDAzZWZkdCk7XFxubGliL3Rlc3Rfa2hvLmMtMTM1LVxcdGlmIChlcnIpXFxuLS1cXG5tbS9tZW1mZF9sdW8uYz04Nz1zdGF0aWMgaW50IG1lbWZkX2x1b19wcmVzZXJ2ZV9mb2xpb3Moc3RydWN0IGZpbGUgKmZpbGUsXFxuLS1cXG5tbS9tZW1mZF9sdW8uYy0xNTEtXFxubW0vbWVtZmRfbHVvLmM6MTUyOlxcdFxcdGVyciA9IGtob19wcmVzZXJ2ZV9mb2xpbyhmb2xpbyk7XFxubW0vbWVtZmRfbHVvLmMtMTUzLVxcdFxcdGlmIChlcnIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjI1LjIxMjg1NDU3NFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1ODUwNjA2NDY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgJ2tobycgYW5kICdtZW1mZF9sdW8nIENvZGUqKlxuXG5Pa2F5LCBzbyBgbWVtZmRfbHVvLmNgIGlzIGRlZmluaXRlbHkgbWFraW5nIHVzZSBvZiB0aGlzLCB3aGljaCBtYWtlcyBtZSB0aGluayBpdCdzIGxpa2VseSBhIG1lbWZkIGV4dGVuc2lvbiByZWxhdGVkIHRvIGxpdmUgdXBkYXRlcy4gSW50ZXJlc3RpbmcuIEFuZCB0aGVuIEkgc2VlIGl0IGFnYWluIGluIGBsaWIvdGVzdF9raG8uY2AuICBUaGF0IG1lYW5zIGBraG9fcHJlc2VydmVfZm9saW9gIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlLCB3aGljaCBpcyBhIGtleSBwb2ludCB0byByZW1lbWJlci5cblxuTm93LCBsZXQncyB0aGluayBhYm91dCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAuICBJIGtub3cgdGhhdCdzIGNhbGxlZCBmcm9tIGBhbGxvY19ib290bWVtYCBpbiBgbW0vaHVnZXRsYi5jYC4gVGhhdCdzIGFsbG9jYXRlZCBkdXJpbmcgYm9vdCB3aGVuIGh1Z2V0bGIgcGFnZXMgZ2V0IGFsbG9jYXRlZC4gIEhhbmcgb24uLi4gYGFsbG9jX2Jvb3RtZW1gIGlzIGxpbmtlZCB3aXRoIHRoZSBgaHVnZXBhZ2VzPWAga2VybmVsIGNvbW1hbmQtbGluZSBvcHRpb24sIHJpZ2h0PyAgV291bGQgZnV6emluZyBiZSB1c2VmdWwgaGVyZT8gUHJvYmFibHkgbm90LCBzaW5jZSBgYWxsb2NfYm9vdG1lbWAgaXMgYF9faW5pdGAsIHNvIGl0IHdvdWxkIGJlIGEgYm9vdCB0aW1lIGlzc3VlIGFuZCBsZXNzIHVzZWZ1bCB0byBzeXpib3QuXG5cbkJ1dCB3YWl0LCBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBhbmQgYGtob19yYWRpeF93YWxrX3RyZWVgIGFyZSByZWFjaGFibGUgZHVyaW5nIHJ1bnRpbWUhIFRoYXQncyBwcm9taXNpbmcuIEFuZCBga2hvX2V4dGVuZF9zY3JhdGNoYCBpcyBgX19pbml0YCwgc28gbm90IGltbWVkaWF0ZWx5IGZ1enphYmxlLiAgU2ltaWxhcmx5LCBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCBpcyBtYXJrZWQgYXMgYF9faW5pdGAgYXMgd2VsbC5cblxuVGhlIG1vcmUgaW50ZXJlc3RpbmcgZmluZCBpcyB0aGF0IGBraG9fc2NyYXRjaF9vdmVybGFwYCBpcyBjYWxsZWQgZnJvbSBga2hvX3ByZXNlcnZlX2ZvbGlvYCBhbmQgYGtob19wcmVzZXJ2ZV9wYWdlc2AsIGFuZCB3ZSd2ZSBhbHJlYWR5IGVzdGFibGlzaGVkIHRoYXQgdGhvc2UgY2FuIGJlIGNhbGxlZCBhdCBydW50aW1lLCB3aGljaCBpcyBhIGdyZWF0IHRhcmdldC5cblxuTGV0J3MgZGlnIGludG8gYGtob19wcmVzZXJ2ZV9wYWdlc2AgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoYXQgY2FsbCBjaGFpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjk4MTcsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyODMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6MzEuMDYzNDYyNzgyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODQ5NDM2MDQxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtob19wcmVzZXJ2ZV9wYWdlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9MjA9dm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MjE6aW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTIyLXZvaWQga2hvX3VucHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTU5PXN0YXRpYyBpbmxpbmUgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKSB7IH1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtNjAtXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjYxOnN0YXRpYyBpbmxpbmUgaW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG5yX3BhZ2VzKVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC02Mi17XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTU0NT1FWFBPUlRfU1lNQk9MX0dQTChraG9fcmVzdG9yZV9mb2xpbyk7XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTU1Mi0gKiBSZXN0b3JlIGEgY29udGlndW91cyBsaXN0IG9mIG9yZGVyIDAgcGFnZXMgdGhhdCB3YXMgcHJlc2VydmVkIHdpdGhcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjU1MzogKiBraG9fcHJlc2VydmVfcGFnZXMoKS5cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTU1NC0gKlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMTgwPUVYUE9SVF9TWU1CT0xfR1BMKGtob191bnByZXNlcnZlX2ZvbGlvKTtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExODEtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTgyOnN0YXRpYyB1bnNpZ25lZCBpbnQgX19raG9fcHJlc2VydmVfcGFnZXNfb3JkZXIodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTgzLVxcdFxcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTExOTk9c3RhdGljIHZvaWQgX19raG9fdW5wcmVzZXJ2ZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMDQtXFx0d2hpbGUgKHBmbiBcXHUwMDNjIGVuZF9wZm4pIHtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyMDU6XFx0XFx0b3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTIwNi1cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTIxNC0vKipcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyMTU6ICoga2hvX3ByZXNlcnZlX3BhZ2VzIC0gcHJlc2VydmUgY29udGlndW91cyBwYWdlcyBhY3Jvc3Mga2V4ZWNcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMTYtICogQHBhZ2U6IGZpcnN0IHBhZ2UgaW4gdGhlIGxpc3QuXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMjMtICovXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjI0OmludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjI1LXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTIzOS1cXHR3aGlsZSAocGZuIFxcdTAwM2MgZW5kX3Bmbikge1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTI0MDpcXHRcXHR1bnNpZ25lZCBpbnQgb3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTI0MS1cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTI1Ni19XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjU3OkVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9wYWdlcyk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjU4LVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjY1LSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBAcGFnZSBhbmQgQG5yX3BhZ2VzIGFzIHRoZSBjb3JyZXNwb25kaW5nXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjY2OiAqIGtob19wcmVzZXJ2ZV9wYWdlcygpIGNhbGwuIFVucHJlc2VydmluZyBhcmJpdHJhcnkgc3ViLXJhbmdlcyBvZiBsYXJnZXJcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNjctICogcHJlc2VydmVkIGJsb2NrcyBpcyBub3Qgc3VwcG9ydGVkLlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMzEwPXN0YXRpYyBzdHJ1Y3Qga2hvX3ZtYWxsb2NfY2h1bmsgKm5ld192bWFsbG9jX2NodW5rKHN0cnVjdCBraG9fdm1hbGxvY19jaHVuayAqY3VyKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzE4LVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTMxOTpcXHRlcnIgPSBraG9fcHJlc2VydmVfcGFnZXModmlydF90b19wYWdlKGNodW5rKSwgMSk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzIwLVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEzNjA9aW50IGtob19wcmVzZXJ2ZV92bWFsbG9jKHZvaWQgKnB0ciwgc3RydWN0IGtob192bWFsbG9jICpwcmVzZXJ2YXRpb24pXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEzODUtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMzg2OlxcdFxcdGVyciA9IGtob19wcmVzZXJ2ZV9wYWdlcyh2bS1cXHUwMDNlcGFnZXNbaV0sIG5yX2NvbnRpZ19wYWdlcyk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzg3LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS9tZW1ibG9jay5jPTI2MDg9c3RhdGljIGludCBfX2luaXQgcmVzZXJ2ZWRfbWVtX3ByZXNlcnZlKHZvaWQpXFxuLS1cXG5tbS9tZW1ibG9jay5jLTI2MTctXFxubW0vbWVtYmxvY2suYzoyNjE4OlxcdFxcdGVyciA9IGtob19wcmVzZXJ2ZV9wYWdlcyhwYWdlLCBucl9wYWdlcyk7XFxubW0vbWVtYmxvY2suYy0yNjE5LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS9tZW1ibG9jay5jPTI2Mzc9c3RhdGljIGludCBfX2luaXQgcHJlcGFyZV9raG9fZmR0KHZvaWQpXFxuLS1cXG5tbS9tZW1ibG9jay5jLTI2NDktXFx0ZmR0ID0gcGFnZV90b192aXJ0KGZkdF9wYWdlKTtcXG5tbS9tZW1ibG9jay5jOjI2NTA6XFx0ZXJyID0ga2hvX3ByZXNlcnZlX3BhZ2VzKGZkdF9wYWdlLCAxKTtcXG5tbS9tZW1ibG9jay5jLTI2NTEtXFx0aWYgKGVycilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6MzIuOTEyOTA1MzMzWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwODQ0NDkzNzk1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgdHJhY2luZyB0aGUgZnVuY3Rpb24gY2FsbHMuIEl0IGxvb2tzIGxpa2UgYGtob19wcmVzZXJ2ZV9wYWdlc2AgaXMga2V5LCBjYWxsZWQgYnkgYGtob19wcmVzZXJ2ZV92bWFsbG9jYCwgd2hpY2ggaXMgaW4gdHVybiB1c2VkIGJ5IGRyaXZlcnMgb3Igc3Vic3lzdGVtcyAtIGludGVyZXN0aW5nLiBUaGUgcGF0Y2ggbW9kaWZpZXMgYGtob19yYWRpeF9hZGRfa2V5YCBhbmQgYGtob19yYWRpeF9kZWxfa2V5YC4gVGhvc2UgYXJlIGNhbGxlZCBieSBga2hvX3ByZXNlcnZlX2ZvbGlvYCBhbmQgYGtob19wcmVzZXJ2ZV9wYWdlc2AsIHdoaWNoIG1ha2VzIHRoZW0gZ29vZCBjYW5kaWRhdGVzLiBUaGVyZSdzIGFsc28gdGhpcyBuZXcgZnVuY3Rpb24sIGBraG9fc2NyYXRjaF9vdmVybGFwYCwgdGhhdCdzIGludHJvZHVjZWQgYW5kIGFsc28gY2FsbGVkIGJ5IGBraG9fcHJlc2VydmVfZm9saW9gIGFuZCBga2hvX3ByZXNlcnZlX3BhZ2VzYC4gQW5kIHRoZW4gdGhlcmUncyBhIG1vZGlmaWNhdGlvbiB0byBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgY2FsbGVkIGJ5IGBhbGxvY19ib290bWVtYCwgZGVlcCBpbiBgbW0vaHVnZXRsYi5jYC4gUmlnaHQsIHRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBzb21lIGZ1enppbmcgZWZmb3J0LlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdG8gZm9jdXMgb24uIEkndmUgZ290IGEgbGlzdCBmb3JtaW5nOiBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgLCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAsIGBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlYCwgYW5kIGBtZW1ibG9ja19hbGxvY19odWdldGxiYC5cblxuSG9sZCBvbiwgSSBzZWUgYGtob19leHRlbmRfc2NyYXRjaGAgYW5kIGBraG9fbWVtb3J5X2luaXRfZWFybHlgIGFyZSBgX19pbml0YCBmdW5jdGlvbnMuIENhbiBzeXpib3QgZXZlbiBmdXp6IHRob3NlPyBObywgbm90IGRpcmVjdGx5LiBTeXpib3QgdHJpZ2dlcnMgYF9faW5pdGAgZnVuY3Rpb25zIGlmIHRoZXkgYXJlIGNhbGxlZCBkdXJpbmcgYm9vdCwgc28gdGhleSBhcmVuJ3QgZ3JlYXQgY2FuZGlkYXRlcyBmb3IgdGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QuIFRoYXQgbGlzdCBpcyBmb3IgZnV6emVyIHRhcmdldHMuIFNvLCBJIHdpbGwgaW5jbHVkZSBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgLCBhbmQgYGtob19zY3JhdGNoX292ZXJsYXBgLiBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIGBraG9fcmFkaXhfaW5pdF90cmVlYCBhbmQgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgIHRob3VnaC4gVGhleSBhcmUgZXhwb3J0ZWQgc3ltYm9scywgYnV0IGFyZSB0aGV5IGFjdHVhbGx5IHVzZWQgb3V0c2lkZSB0aGVpciBtb2R1bGU/IEkgc2hvdWxkIGxvb2sgaW50byB0aGF0IGJlZm9yZSBjb21taXR0aW5nIHRoaXMgYXMgYSBwcm9wZXIgZnV6emluZyB0YXJnZXQgbGlzdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE5NTEsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6NDMuNzU3NDAxMTU4WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODAzMDU1NzUxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtob19yYWRpeF9pbml0X3RyZWVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oPTU1PWludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNTYtXFx0XFx0XFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSk7XFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oOjU3OmludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KTtcXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNTgtdm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg9NzA9c3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNzUtXFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oOjc2OnN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaC03Ny1cXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTMyMT1zdGF0aWMgdm9pZCBfX2tob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNDAtLyoqXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzozNDE6ICoga2hvX3JhZGl4X2luaXRfdHJlZSAtIGluaXRpYWxpemUgdGhlIHJhZGl4IHRyZWUuXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNDItICogQHRyZWU6ICAgdGhlIHRyZWUgdG8gaW5pdGlhbGl6ZS5cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMzUwLSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MzUxOmludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMzUyLXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMzYxLX1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjM2MjpFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfaW5pdF90cmVlKTtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTM2My1cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTAwNj1zdGF0aWMgdm9pZCBfX2luaXQga2hvX2V4dGVuZF9zY3JhdGNoKHZvaWQpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEwMTgtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMDE5OlxcdGVyciA9IGtob19yYWRpeF9pbml0X3RyZWUoXFx1MDAyNnJhZGl4LCBOVUxMKTtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEwMjAtXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTgyMD1zdGF0aWMgX19pbml0IGludCBraG9faW5pdCh2b2lkKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODI4LVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTgyOTpcXHRlcnIgPSBraG9fcmFkaXhfaW5pdF90cmVlKHRyZWUsIE5VTEwpO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTgzMC1cXHRpZiAoZXJyKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xOTAyPXZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xOTE5LVxcdCAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTkyMDpcXHRpZiAoa2hvX3JhZGl4X2luaXRfdHJlZShcXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIGtob19nZXRfbWVtX21hcChmZHQpKSkge1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkyMS1cXHRcXHQvKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0Mjo0NS41NjA0NjQ0MzlaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ3NDcyNDYzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBNZW50YWwgQ2hlY2tsaXN0IGZvciBNZW1vcnkgQWxsb2NhdGlvbiBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gcHV0dGluZyB0b2dldGhlciBhIG1lbnRhbCBtYXAgb2Ygd2hlcmUgdGhlc2Uga2V5IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhcmUgdXNlZC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGhhdmUgYSBjb21wcmVoZW5zaXZlIG92ZXJ2aWV3LCBlc3BlY2lhbGx5IHNpbmNlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgc28gZnVuZGFtZW50YWwgdG8gdGhlIHN5c3RlbSdzIG9wZXJhdGlvbi4gIEkga25vdyB0aGV5J3JlIGRlZmluaXRlbHkgZXhwb3J0ZWQgYW5kIHV0aWxpemVkIGluIGBraG9faW5pdGAsIGBraG9fZXh0ZW5kX3NjcmF0Y2hgLCBhbmQgYGtob19tZW1vcnlfaW5pdF9lYXJseWAuXG5cbkkgc2hvdWxkIHByb2JhYmx5IGFsc28gaW5jbHVkZSB0aGVzZSByYWRpeCB0cmVlIGZ1bmN0aW9ucyBpbiBteSB0aGlua2luZzogYGtob19yYWRpeF9hZGRfa2V5YCwgYGtob19yYWRpeF9kZWxfa2V5YCwgYGtob19yYWRpeF93YWxrX3RyZWVgLCBga2hvX3JhZGl4X2luaXRfdHJlZWAsIGFuZCBga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZWAuIEknbSBhbHNvIHJlbWVtYmVyaW5nIGBraG9fc2NyYXRjaF9vdmVybGFwYCBhbmQgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIGFyZSBwcm9iYWJseSB3b3J0aCBsaXN0aW5nLiBBbmQgb2YgY291cnNlLCB0aGUgYmlnIG9uZTogYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgLlxuXG5MZXQgbWUgcXVpY2tseSB2ZXJpZnkgc29tZXRoaW5nIGFib3V0IGBtZW1ibG9ja19hbGxvY19odWdldGxiYC4gIEFoLCB5ZXMsIHRoYXQncyBkZWZpbmVkIGFzIGBfX2luaXRgLiBOb3csIHdoYXQgYWJvdXQgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgPyBIbW0sIGl0IGxvb2tzIGxpa2UgaXQgaXNuJ3QgYF9faW5pdGAuIExldCBtZSBkb3VibGUtY2hlY2sgdGhhdC4uLiBqdXN0IHRvIGJlIGNlcnRhaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzODQyLCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjUwLjAzNTE5MTM4MloiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgyMTI0ODE4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD00MT1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpO1xcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDo0Mjp2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTQzLSNlbHNlXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9MTIyPXN0YXRpYyBpbmxpbmUgYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTEyNi1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MTI3OnN0YXRpYyBpbmxpbmUgdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMjgtXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9NzkzPWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODEyLSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6ODEzOnZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODE0LXtcXG4tLVxcbm1tL21tX2luaXQuYz02OTQ9dm9pZCBfX21lbWluaXQgX19pbml0X3BhZ2VfZnJvbV9uaWQodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpXFxuLS1cXG5tbS9tbV9pbml0LmMtNzEyLVxcdFxcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXFxubW0vbW1faW5pdC5jOjcxMzpcXHRcXHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgcGZuICsgMSk7XFxubW0vbW1faW5pdC5jLTcxNC1cXHR9XFxuLS1cXG5tbS9tbV9pbml0LmM9ODc1PXZvaWQgX19tZW1pbml0IG1lbW1hcF9pbml0X3JhbmdlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyB6b25lLFxcbi0tXFxubW0vbW1faW5pdC5jLTk1MC1cXHQgKi9cXG5tbS9tbV9pbml0LmM6OTUxOlxcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBwZm4pO1xcbm1tL21tX2luaXQuYy05NTItfVxcbi0tXFxubW0vbW1faW5pdC5jPTIwMjM9c3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGRlZmVycmVkX2luaXRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9tbV9pbml0LmMtMjA0NC1cXHQgKi9cXG5tbS9tbV9pbml0LmM6MjA0NTpcXHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgZW5kX3Bmbik7XFxubW0vbW1faW5pdC5jLTIwNDYtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjUxLjg1NjQ0NDc0M1oiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTk5Mzk5OTc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkluaXRpYWwgQXNzZXNzbWVudCBvZiBNZW1vcnkgSW5pdGlhbGl6YXRpb24gRnVuY3Rpb25zKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCBhbmQgYSBmZXcgdGhpbmdzIGp1bXAgb3V0LiBUaGUgZnVuY3Rpb24gYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIGlzbid0IGV4cGxpY2l0bHkgbWFya2VkIGFzIGFuIGBfX2luaXRgIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGJpdCBvZGQsIGJ1dCBJIHNlZSBpdCdzIGNhbGxlZCBmcm9tIGJvdGggYF9faW5pdGAgYW5kIGBfX21lbWluaXRgIGZ1bmN0aW9ucy4gVGhhdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgYGtob19yYWRpeF9hZGRfa2V5YCwgYGtob19yYWRpeF9kZWxfa2V5YCwgYW5kIGBraG9fcmFkaXhfd2Fsa190cmVlYCBsb29rIGxpa2UgcHJpbWUgY2FuZGlkYXRlcyBmb3IgZnV6emluZy4gVGhleSBzZWVtIGxpa2UgZ29vZCBzdGFydGluZyBwb2ludHMgdG8gbG9vayBmb3IgbWVtb3J5LXJlbGF0ZWQgdnVsbmVyYWJpbGl0aWVzLiBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAgc2VlbXMgcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgdG9vLCBzbyBJJ2xsIGluY2x1ZGUgaXQgb24gdGhlIGxpc3QuXG5cbk5vdywgbGV0IG1lIHNoaWZ0IGdlYXJzIGFuZCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVudmlyb25tZW50IHRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIGluLiBJJ20gZ29pbmcgdG8gY2hlY2sgYENPTkZJR19LRVhFQ19IQU5ET1ZFUmAgYW5kIGBDT05GSUdfSFVHRVRMQl9QQUdFYC4gUmlnaHQsIGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIHNlZW1zIHRvIGJlIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gaXRlbS4gQW5kIGBDT05GSUdfSFVHRVRMQl9QQUdFYCBpcyBjcnVjaWFsIGJlY2F1c2UgaXQncyByZXF1aXJlZCBmb3IgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIHRvIGJlIHVzZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoYXQgY2FsbC4gV2FpdCwgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGlzIGRlZmluZWQgaW4gYG1tL21lbWJsb2NrLmNgLiBJdCdzIGRlZmluZWQgdGhlcmUsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGlzbid0IGNvbXBpbGVkIGNvbmRpdGlvbmFsbHkuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgYnVpbGQgY29uZmlndXJhdGlvbnMgdG8gdmVyaWZ5IHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0OTU0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjU3LjA1NTg0NzgzOFoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTc0NzAxMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtYmxvY2tfYWxsb2NfaHVnZXRsYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1ibG9jay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbWJsb2NrLmM9MTc1MT12b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KFxcbi0tXFxubW0vbWVtYmxvY2suYy0xNzY0LS8qKlxcbm1tL21lbWJsb2NrLmM6MTc2NTogKiBtZW1ibG9ja19hbGxvY19odWdldGxiIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgZm9yIEh1Z2VUTEIgcGFnZXNcXG5tbS9tZW1ibG9jay5jLTE3NjYtICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xcbi0tXFxubW0vbWVtYmxvY2suYy0xNzc3LSAqL1xcbm1tL21lbWJsb2NrLmM6MTc3ODp2b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIocGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpXFxubW0vbWVtYmxvY2suYy0xNzc5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6NTcuMTEzMzIxNzc4WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY4NTY3OTUyNjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBEZXBlbmRlbmNpZXMgb2YgYSBDb2RlIFNuaXBwZXQqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBpZWNlIG9mIGNvZGUgYW5kIGl0J3Mgbm90IGd1YXJkZWQgYnkgYW55IHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGxpa2UgYCNpZmRlZmAuIFRoYXQncyBhIGxpdHRsZSB1bnVzdWFsLiBIb3dldmVyLCBhZnRlciBhIHF1aWNrIGNoZWNrLCBJIGNhbiBzZWUgdGhhdCB0aGlzIGNvZGUgaXMgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gYG1tL2h1Z2V0bGIuY2AuIE5vdywgYG1tL2h1Z2V0bGIuY2AgaXRzZWxmIGlzIG9ubHkgY29tcGlsZWQgd2hlbiB0aGUgYENPTkZJR19IVUdFVExCX1BBR0VgIG9wdGlvbiBpcyBlbmFibGVkIGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gVGhhdCBtZWFucyB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgYXJlIGBLRVhFQ19IQU5ET1ZFUmAgYW5kIGBIVUdFVExCX1BBR0VgLiBSaWdodCwgZ290IGl0LlxuXG5MZXQgbWUganVzdCBtYWtlIHN1cmUgdGhvc2UgYXJlIHByb3Blcmx5IHN1bW1hcml6ZWQ6XG5cbiogICBgS0VYRUNfSEFORE9WRVJgXG4qICAgYEhVR0VUTEJfUEFHRWBcblxuTm93LCBsZXQncyBsb29rIGF0IHRoZSBrZXkgc3ltYm9scyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoaXMuIE9rYXksIEkgc2VlOlxuXG4qICAgYGtob19yYWRpeF9hZGRfa2V5YFxuKiAgIGBraG9fcmFkaXhfZGVsX2tleWBcbiogICBga2hvX3JhZGl4X3dhbGtfdHJlZWBcbiogICBga2hvX3JhZGl4X2luaXRfdHJlZWBcbiogICBga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZWBcbiogICBga2hvX3NjcmF0Y2hfb3ZlcmxhcGBcbiogICBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWBcbiogICBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmBcblxuSG1tLCBhZnRlciBhIHF1aWNrIGV2YWx1YXRpb24sIGBraG9fcmFkaXhfYWRkX2tleWAgYW5kIGBraG9fcmFkaXhfZGVsX2tleWAgc3RhbmQgb3V0IGFzIHRoZSBtb3N0IGNydWNpYWwgZnVuY3Rpb25zIGhlcmUsIGF0IGxlYXN0IGluIHRoZSBjb250ZXh0IG9mIHdoYXQgSSdtIGxvb2tpbmcgYXQuIGBraG9fc2NyYXRjaF9vdmVybGFwYCBhbHNvIHNlZW1zIHByZXR0eSBpbXBvcnRhbnQuIEFuZCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgbG9va3MgbGlrZSBhIHJlbGV2YW50IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLlxuXG5BbHJpZ2h0LCBJIHRoaW5rIEkgaGF2ZSBhIGdvb2QgaGFuZGxlIG9uIHRoaW5ncy4gTGV0J3Mgc2V0IHRoZSByZXN1bHRzIG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzU2ODYsIk91dHB1dFRva2VucyI6MTk4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQ1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQzOjAzLjk3MDExOTE0NVoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgyOTU2OTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLRVhFQ19IQU5ET1ZFUlwiLFxuICAgIFwiSFVHRVRMQl9QQUdFXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia2hvX3JhZGl4X2FkZF9rZXlcIixcbiAgICBcImtob19yYWRpeF9kZWxfa2V5XCIsXG4gICAgXCJraG9fcmFkaXhfd2Fsa190cmVlXCIsXG4gICAgXCJraG9fcmFkaXhfaW5pdF90cmVlXCIsXG4gICAgXCJraG9fcmFkaXhfZGVzdHJveV90cmVlXCIsXG4gICAgXCJraG9fc2NyYXRjaF9vdmVybGFwXCIsXG4gICAgXCJraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlXCIsXG4gICAgXCJtZW1ibG9ja19hbGxvY19odWdldGxiXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIEtleGVjIEhhbmRvdmVyIChLSE8pIHJhZGl4IHRyZWUgaW1wbGVtZW50YXRpb24sIGludHJvZHVjZXMgbmV3IGZ1bmN0aW9ucyBmb3IgS0hPIHNjcmF0Y2ggbWVtb3J5IG1hbmFnZW1lbnQsIGFuZCBjaGFuZ2VzIGhvdyBIdWdlVExCIHBhZ2VzIGFyZSBhbGxvY2F0ZWQgZHVyaW5nIGJvb3QgdXNpbmcgbWVtYmxvY2suIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHRoYXQgY2FuIGJlIHJlYWNoZWQgZHVyaW5nIGJvb3QgYW5kIHJ1bnRpbWUsIG1ha2luZyB0aGVtIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS0VYRUNfSEFORE9WRVJcIixcbiAgICBcIkhVR0VUTEJfUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImtob19yYWRpeF9hZGRfa2V5XCIsXG4gICAgXCJraG9fcmFkaXhfZGVsX2tleVwiLFxuICAgIFwia2hvX3JhZGl4X3dhbGtfdHJlZVwiLFxuICAgIFwia2hvX3JhZGl4X2luaXRfdHJlZVwiLFxuICAgIFwia2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZVwiLFxuICAgIFwia2hvX3NjcmF0Y2hfb3ZlcmxhcFwiLFxuICAgIFwia2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZVwiLFxuICAgIFwibWVtYmxvY2tfYWxsb2NfaHVnZXRsYlwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBLZXhlYyBIYW5kb3ZlciAoS0hPKSByYWRpeCB0cmVlIGltcGxlbWVudGF0aW9uLCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgZm9yIEtITyBzY3JhdGNoIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgY2hhbmdlcyBob3cgSHVnZVRMQiBwYWdlcyBhcmUgYWxsb2NhdGVkIGR1cmluZyBib290IHVzaW5nIG1lbWJsb2NrLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB0aGF0IGNhbiBiZSByZWFjaGVkIGR1cmluZyBib290IGFuZCBydW50aW1lLCBtYWtpbmcgdGhlbSB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflowd5694[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-10 13:28:56 +0000 UTC FinishedAt: 2026-07-10 13:43:06 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "08412b8c707fdbccb7bf2116f0554fe09113cd53", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KEXEC_HANDOVER", "HUGETLB_PAGE" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "08412b8c707fdbccb7bf2116f0554fe09113cd53", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KEXEC_HANDOVER", "HUGETLB_PAGE" ], "series_id": "9791f6fe-efb5-4860-88aa-32474db3dd03" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "kho_radix_add_key", "kho_radix_del_key", "kho_radix_walk_tree", "kho_radix_init_tree", "kho_radix_destroy_tree", "kho_scratch_overlap", "kho_init_scratch_migratetype", "memblock_alloc_hugetlb" ], "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+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFWEVDX0hBTkRPVkVSJiMzNDssCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2tob19yYWRpeF9hZGRfa2V5JiMzNDssCiAgICAmIzM0O2tob19yYWRpeF9kZWxfa2V5JiMzNDssCiAgICAmIzM0O2tob19yYWRpeF93YWxrX3RyZWUmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X2luaXRfdHJlZSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfZGVzdHJveV90cmVlJiMzNDssCiAgICAmIzM0O2tob19zY3JhdGNoX292ZXJsYXAmIzM0OywKICAgICYjMzQ7a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSYjMzQ7LAogICAgJiMzNDttZW1ibG9ja19hbGxvY19odWdldGxiJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBLZXhlYyBIYW5kb3ZlciAoS0hPKSByYWRpeCB0cmVlIGltcGxlbWVudGF0aW9uLCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgZm9yIEtITyBzY3JhdGNoIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgY2hhbmdlcyBob3cgSHVnZVRMQiBwYWdlcyBhcmUgYWxsb2NhdGVkIGR1cmluZyBib290IHVzaW5nIG1lbWJsb2NrLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB0aGF0IGNhbiBiZSByZWFjaGVkIGR1cmluZyBib290IGFuZCBydW50aW1lLCBtYWtpbmcgdGhlbSB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMTVhODk1YjI3ZDcwNjliNDNlM2IxMjhkZjg1N2ViY2NkM2UzODA5MlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgSnVsIDEwIDEzOjQxOjI0IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaCBiL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaFxuaW5kZXggNDhhOTc5M2MyYjc2Y2QuLjMwYTcxNzEwNTY1YTMyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmhcbkBAIC0zMyw5ICYjNDM7MzMsMTMgQEAgdm9pZCBraG9fcmVtb3ZlX3N1YnRyZWUodm9pZCAqYmxvYik7XG4gaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpO1xuIFxuIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpO1xuJiM0Mzt2b2lkIGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKTtcbiBcbiB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sIHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cyxcbiBcdFx0ICB1NjQgc2NyYXRjaF9sZW4pO1xuJiM0MztcbiYjNDM7Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcbiYjNDM7dm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pO1xuICNlbHNlXG4gc3RhdGljIGlubGluZSBib29sIGtob19pc19lbmFibGVkKHZvaWQpXG4ge1xuQEAgLTEwOCwxMCAmIzQzOzExMiwyMiBAQCBzdGF0aWMgaW5saW5lIGludCBraG9fcmV0cmlldmVfc3VidHJlZShjb25zdCBjaGFyICpuYW1lLCBwaHlzX2FkZHJfdCAqcGh5cyxcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpIHsgfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIHZvaWQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcbiBcdFx0XHRcdHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cywgdTY0IHNjcmF0Y2hfbGVuKVxuIHtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4mIzQzO3tcbiYjNDM7fVxuICNlbmRpZiAvKiBDT05GSUdfS0VYRUNfSEFORE9WRVIgKi9cbiBcbiAjZW5kaWYgLyogTElOVVhfS0VYRUNfSEFORE9WRVJfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oIGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2tleGVjX2hhbmRvdmVyLmhcbmluZGV4IDVlMmViODUxOWJkYTZkLi4yZjRmYjljNjM5NDIxYSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaFxuQEAgLTI1NywxMSAmIzQzOzI1Nyw4IEBAIHN0cnVjdCBraG9fdm1hbGxvYyB7XG4gICogbWVtb3J5LiBUaGVzZSBjb25zdGFudHMgZ292ZXJuIHRoZSBpbmRleGluZywgc2l6aW5nLCBhbmQgZGVwdGggb2YgdGhlIHRyZWUuXG4gICovXG4gZW51bSBraG9fcmFkaXhfY29uc3RzIHtcbi1cdC8qXG4tXHQgKiBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSBvcmRlciBiaXQgKGFuZCBhbHNvIHRoZSBsZW5ndGggb2YgdGhlXG4tXHQgKiBzaGlmdGVkIHBoeXNpY2FsIGFkZHJlc3MpIGZvciBhbiBvcmRlci0wIHBhZ2UuXG4tXHQgKi9cbi1cdEtIT19PUkRFUl8wX0xPRzIgPSA2NCAtIFBBR0VfU0hJRlQsXG4mIzQzO1x0LyogTmVlZCB0byBzdG9yZSB0aGUgUEZOLCBwbHVzIG9uZSBiaXQgZm9yIG9yZGVyLiAqL1xuJiM0MztcdEtIT19SQURJWF9LRVlfV0lEVEggPSA2NCAtIFBBR0VfU0hJRlQgJiM0MzsgMSxcbiBcbiBcdC8qIFNpemUgb2YgdGhlIHRhYmxlIGluIGtob19yYWRpeF9ub2RlLCBpbiBsb2cyICovXG4gXHRLSE9fVEFCTEVfU0laRV9MT0cyID0gY29uc3RfaWxvZzIoUEFHRV9TSVpFIC8gc2l6ZW9mKHBoeXNfYWRkcl90KSksXG5AQCAtMjc0LDcgJiM0MzsyNzEsNyBAQCBlbnVtIGtob19yYWRpeF9jb25zdHMge1xuIFx0ICogYW5kIDEgYml0bWFwIGxldmVsLlxuIFx0ICovXG4gXHRLSE9fVFJFRV9NQVhfREVQVEggPVxuLVx0XHRESVZfUk9VTkRfVVAoS0hPX09SREVSXzBfTE9HMiAtIEtIT19CSVRNQVBfU0laRV9MT0cyICYjNDM7IDEsXG4mIzQzO1x0XHRESVZfUk9VTkRfVVAoS0hPX1JBRElYX0tFWV9XSURUSCAtIEtIT19CSVRNQVBfU0laRV9MT0cyLFxuIFx0XHRcdCAgICAgS0hPX1RBQkxFX1NJWkVfTE9HMikgJiM0MzsgMSxcbiB9O1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaCBiL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaFxuaW5kZXggODRlOTE4Yjk2ZTUzZGYuLjVkNmFlMjg5MzY4NGE0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmhcbkBAIC0zNCwzNyAmIzQzOzM0LDUzIEBAIHN0cnVjdCBraG9fcmFkaXhfdHJlZSB7XG4gXHRzdHJ1Y3QgbXV0ZXggbG9jazsgLyogcHJvdGVjdHMgdGhlIHRyZWUmIzM5O3Mgc3RydWN0dXJlIGFuZCByb290IHBvaW50ZXIgKi9cbiB9O1xuIFxuLXR5cGVkZWYgaW50ICgqa2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190KShwaHlzX2FkZHJfdCBwaHlzLFxuLVx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpO1xuJiM0MzsvKipcbiYjNDM7ICogc3RydWN0IGtob19yYWRpeF93YWxrX2NiIC0gQ2FsbGJhY2tzIGZvciBLSE8gcmFkaXggdHJlZSB3YWxrLlxuJiM0MzsgKiBAbGVhZjogICAgICBDYWxsZWQgb24gZWFjaCBwcmVzZW50IGtleSBpbiB0aGUgcmFkaXggdHJlZS5cbiYjNDM7ICogQG5vZGU6ICAgICAgQ2FsbGVkIG9uIGVhY2ggbm9kZSBvZiB0aGUgcmFkaXggdHJlZSBpdHNlbGYuIFJlY2VpdmVzIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG5vZGUuXG4mIzQzOyAqXG4mIzQzOyAqIEZvciBlYWNoIGNhbGxiYWNrLCBhIHJldHVybiB2YWx1ZSBvZiAwIGNvbnRpbnVlcyB0aGUgd2FsayBhbmQgYSBub24temVyb1xuJiM0MzsgKiByZXR1cm4gdmFsdWUgaXMgZGlyZWN0bHkgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiB7XG4mIzQzO1x0aW50ICgqbGVhZikodW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKmRhdGEpO1xuJiM0MztcdGludCAoKm5vZGUpKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpO1xuJiM0Mzt9O1xuIFxuICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVJcbiBcbi1pbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdCAgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpO1xuLVxuLXZvaWQga2hvX3JhZGl4X2RlbF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdFx0dW5zaWduZWQgaW50IG9yZGVyKTtcbi1cbiYjNDM7aW50IGtob19yYWRpeF9hZGRfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpO1xuJiM0Mzt2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpO1xuIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0XHRraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpO1xuJiM0MztcdFx0XHRjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgKmNiLCB2b2lkICpkYXRhKTtcbiYjNDM7aW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpO1xuJiM0Mzt2b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKTtcbiBcbiAjZWxzZSAgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqL1xuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIGxvbmcgcGZuLFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9hZGRfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpXG4ge1xuIFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2RlbF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpIHsgfVxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBrZXkpIHsgfVxuIFxuIHN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuLVx0XHRcdFx0ICAgICAga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuJiM0MztcdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2luaXRfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSkgeyB9XG4mIzQzO1xuICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSICovXG4gXG4gI2VuZGlmXHQvKiBfTElOVVhfS0hPX1JBRElYX1RSRUVfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaFxuaW5kZXggNWFmY2Q5OWFhOGMxNDQuLmQ2MmRiOWU3NzZjZjk0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmhcbkBAIC01MSw2ICYjNDM7NTEsNyBAQCBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG1heF9wb3NzaWJsZV9wZm47XG4gICogbWVtb3J5IHJlc2VydmF0aW9ucyB5ZXQsIHNvIHdlIGdldCBzY3JhdGNoIG1lbW9yeSBmcm9tIHRoZSBwcmV2aW91c1xuICAqIGtlcm5lbCB0aGF0IHdlIGtub3cgaXMgZ29vZCB0byB1c2UuIEl0IGlzIHRoZSBvbmx5IG1lbW9yeSB0aGF0XG4gICogYWxsb2NhdGlvbnMgbWF5IGhhcHBlbiBmcm9tIGluIHRoaXMgcGhhc2UuXG4mIzQzOyAqIEBNRU1CTE9DS19SU1JWX0hVR0VUTEI6IG1lbW9yeSBpcyByZXNlcnZlZCBmb3IgaHVnZXRsYiBwYWdlc1xuICAqL1xuIGVudW0gbWVtYmxvY2tfZmxhZ3Mge1xuIFx0TUVNQkxPQ0tfTk9ORVx0XHQ9IDB4MCxcdC8qIE5vIHNwZWNpYWwgcmVxdWVzdCAqL1xuQEAgLTYxLDYgJiM0Mzs2Miw3IEBAIGVudW0gbWVtYmxvY2tfZmxhZ3Mge1xuIFx0TUVNQkxPQ0tfUlNSVl9OT0lOSVRcdD0gMHgxMCxcdC8qIGRvbiYjMzk7dCBpbml0aWFsaXplIHN0cnVjdCBwYWdlcyAqL1xuIFx0TUVNQkxPQ0tfUlNSVl9LRVJOXHQ9IDB4MjAsXHQvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGtlcm5lbCB1c2UgKi9cbiBcdE1FTUJMT0NLX0tIT19TQ1JBVENIXHQ9IDB4NDAsXHQvKiBzY3JhdGNoIG1lbW9yeSBmb3Iga2V4ZWMgaGFuZG92ZXIgKi9cbiYjNDM7XHRNRU1CTE9DS19SU1JWX0hVR0VUTEJcdD0gMHg4MCwgLyogbWVtb3J5IHJlc2VydmVkIGZvciBodWdldGxiIHBhZ2VzICovXG4gfTtcbiBcbiAvKipcbkBAIC00MjAsNiAmIzQzOzQyMiw3IEBAIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLFxuIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXG4gXHRcdFx0ICAgICBwaHlzX2FkZHJfdCBtaW5fYWRkciwgcGh5c19hZGRyX3QgbWF4X2FkZHIsXG4gXHRcdFx0ICAgICBpbnQgbmlkKTtcbiYjNDM7dm9pZCAqbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZCk7XG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICptZW1ibG9ja19hbGxvYyhwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbilcbiB7XG5AQCAtNDg0LDYgJiM0Mzs0ODcsNyBAQCBzdGF0aWMgaW5saW5lIF9faW5pdF9tZW1ibG9jayBib29sIG1lbWJsb2NrX2JvdHRvbV91cCh2b2lkKVxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3BoeXNfbWVtX3NpemUodm9pZCk7XG4gcGh5c19hZGRyX3QgbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh2b2lkKTtcbiBwaHlzX2FkZHJfdCBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUocGh5c19hZGRyX3QgbGltaXQsIGludCBuaWQpO1xuJiM0MztwaHlzX2FkZHJfdCBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUocGh5c19hZGRyX3QgbGltaXQsIGludCBuaWQpO1xuIHVuc2lnbmVkIGxvbmcgbWVtYmxvY2tfZXN0aW1hdGVkX25yX2ZyZWVfcGFnZXModm9pZCk7XG4gcGh5c19hZGRyX3QgbWVtYmxvY2tfc3RhcnRfb2ZfRFJBTSh2b2lkKTtcbiBwaHlzX2FkZHJfdCBtZW1ibG9ja19lbmRfb2ZfRFJBTSh2b2lkKTtcbkBAIC02MTMsMjggJiM0Mzs2MTcsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgbWVtdGVzdF9yZXBvcnRfbWVtaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pIHsgfVxuICNpZmRlZiBDT05GSUdfTUVNQkxPQ0tfS0hPX1NDUkFUQ0hcbiB2b2lkIG1lbWJsb2NrX3NldF9raG9fc2NyYXRjaF9vbmx5KHZvaWQpO1xuIHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKTtcbi1ib29sIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShwaHlzX2FkZHJfdCBhZGRyKTtcbi1cbi1zdGF0aWMgaW5saW5lIGVudW0gbWlncmF0ZXR5cGUga2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdFx0XHRcdFx0ICAgICAgIGVudW0gbWlncmF0ZXR5cGUgbXQpXG4te1xuLVx0aWYgKG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShQRk5fUEhZUyhwZm4pKSlcbi1cdFx0cmV0dXJuIE1JR1JBVEVfQ01BO1xuLVx0cmV0dXJuIG10O1xuLX1cbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19zZXRfa2hvX3NjcmF0Y2hfb25seSh2b2lkKSB7IH1cbiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKSB7IH1cbi1zdGF0aWMgaW5saW5lIGJvb2wgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpXG4te1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIGVudW0gbWlncmF0ZXR5cGUga2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdFx0XHRcdFx0ICAgICAgIGVudW0gbWlncmF0ZXR5cGUgbXQpXG4te1xuLVx0cmV0dXJuIG10O1xuLX1cbiAjZW5kaWZcbiBcbiAjZW5kaWYgLyogX0xJTlVYX01FTUJMT0NLX0ggKi9cbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZSBiL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlXG5pbmRleCBlZWM5ZDNhZTA3ZWI0Yi4uZDlmNDY5NDYyNTU2NzMgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2xpdmV1cGRhdGUvTWFrZWZpbGVcbkBAIC04LDcgJiM0Mzs4LDYgQEAgbHVvLXkgOj1cdFx0XHRcdFx0XHRcdFx0XFxcbiBcdFx0bHVvX3Nlc3Npb24ub1xuIFxuIG9iai0kKENPTkZJR19LRVhFQ19IQU5ET1ZFUilcdFx0JiM0Mzs9IGtleGVjX2hhbmRvdmVyLm9cbi1vYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpXHQmIzQzOz0ga2V4ZWNfaGFuZG92ZXJfZGVidWcub1xuIG9iai0kKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVR0ZTKVx0JiM0Mzs9IGtleGVjX2hhbmRvdmVyX2RlYnVnZnMub1xuIFxuIG9iai0kKENPTkZJR19MSVZFVVBEQVRFKVx0XHQmIzQzOz0gbHVvLm9cbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuaW5kZXggNDgzNGE4MDk5ODVhYjcuLjlkYzc5YjcxMDNiZGJmIDEwMDY0NFxuLS0tIGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuQEAgLTg0LDggJiM0Mzs4NCwyNSBAQCBzdGF0aWMgc3RydWN0IGtob19vdXQga2hvX291dCA9IHtcbiBcdH0sXG4gfTtcbiBcbiYjNDM7c3RydWN0IGtob19pbiB7XG4mIzQzO1x0cGh5c19hZGRyX3QgZmR0X3BoeXM7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzO1xuJiM0MztcdGNoYXIgcHJldmlvdXNfcmVsZWFzZVtfX05FV19VVFNfTEVOICYjNDM7IDFdO1xuJiM0MztcdHUzMiBrZXhlY19jb3VudDtcbiYjNDM7XHRzdHJ1Y3Qga2hvX2RlYnVnZnMgZGJnO1xuJiM0MztcdHN0cnVjdCBraG9fcmFkaXhfdHJlZSByYWRpeF90cmVlO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBraG9faW4ga2hvX2luID0ge1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHZvaWQgKmtob19nZXRfZmR0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4ga2hvX2luLmZkdF9waHlzID8gcGh5c190b192aXJ0KGtob19pbi5mZHRfcGh5cykgOiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuLSAqIGtob19yYWRpeF9lbmNvZGVfa2V5IC0gRW5jb2RlcyBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyIGludG8gYSByYWRpeCBrZXkuXG4mIzQzOyAqIGtob19lbmNvZGVfcmFkaXhfa2V5IC0gRW5jb2RlcyBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyIGludG8gYSByYWRpeCBrZXkuXG4gICogQHBoeXM6IFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlLlxuICAqIEBvcmRlcjogVGhlIG9yZGVyIG9mIHRoZSBwYWdlLlxuICAqXG5AQCAtOTUsMzUgJiM0MzsxMTIsMzggQEAgc3RhdGljIHN0cnVjdCBraG9fb3V0IGtob19vdXQgPSB7XG4gICpcbiAgKiBSZXR1cm46IFRoZSBlbmNvZGVkIHVuc2lnbmVkIGxvbmcgcmFkaXgga2V5LlxuICAqL1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGtob19yYWRpeF9lbmNvZGVfa2V5KHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGludCBvcmRlcilcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX2VuY29kZV9yYWRpeF9rZXkocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgaW50IG9yZGVyKVxuIHtcbi1cdC8qIE9yZGVyIGJpdHMgcGFydCAqL1xuLVx0dW5zaWduZWQgbG9uZyBoID0gMVVMIFx1MDAzY1x1MDAzYyAoS0hPX09SREVSXzBfTE9HMiAtIG9yZGVyKTtcbi1cdC8qIFNoaWZ0ZWQgcGh5c2ljYWwgYWRkcmVzcyBwYXJ0ICovXG4tXHR1bnNpZ25lZCBsb25nIGwgPSBwaHlzIFx1MDAzZVx1MDAzZSAoUEFHRV9TSElGVCAmIzQzOyBvcmRlcik7XG4mIzQzO1x0LyogVGhlIHBoeXNpY2FsIGFkZHJlc3MgaXMgZW5jb2RlZCBieSBzaGlmdGluZyB0aGUgUEZOIGJ5IGl0cyBvcmRlci4gKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNoaWZ0ID0gUEFHRV9TSElGVCAmIzQzOyBvcmRlcjtcbiYjNDM7XHQvKiBPcmRlciBiaXQgZ29lcyByaWdodCBiZWZvcmUgdGhlIHNoaWZ0ZWQgUEZOLiAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaCA9IDFVTCBcdTAwM2NcdTAwM2MgKDY0IC0gc2hpZnQpO1xuJiM0MztcdC8qIFNoaWZ0ZWQgUEZOLiAqL1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgXHUwMDNlXHUwMDNlIHNoaWZ0O1xuIFxuIFx0cmV0dXJuIGggfCBsO1xuIH1cbiBcbiAvKipcbi0gKiBraG9fcmFkaXhfZGVjb2RlX2tleSAtIERlY29kZXMgYSByYWRpeCBrZXkgYmFjayBpbnRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXG4mIzQzOyAqIGtob19kZWNvZGVfcmFkaXhfa2V5IC0gRGVjb2RlcyBhIHJhZGl4IGtleSBiYWNrIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlci5cbiAgKiBAa2V5OiBUaGUgdW5zaWduZWQgbG9uZyBrZXkgdG8gZGVjb2RlLlxuICAqIEBvcmRlcjogQW4gb3V0cHV0IHBhcmFtZXRlciwgYSBwb2ludGVyIHRvIGFuIHVuc2lnbmVkIGludCB3aGVyZSB0aGUgZGVjb2RlZFxuICAqICAgICAgICAgcGFnZSBvcmRlciB3aWxsIGJlIHN0b3JlZC5cbiAgKlxuLSAqIFRoaXMgZnVuY3Rpb24gcmV2ZXJzZXMgdGhlIGVuY29kaW5nIHBlcmZvcm1lZCBieSBraG9fcmFkaXhfZW5jb2RlX2tleSgpLFxuJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBlbmNvZGluZyBwZXJmb3JtZWQgYnkga2hvX2VuY29kZV9yYWRpeF9rZXkoKSxcbiAgKiBleHRyYWN0aW5nIHRoZSBvcmlnaW5hbCBwaHlzaWNhbCBhZGRyZXNzIGFuZCBwYWdlIG9yZGVyIGZyb20gYSBnaXZlbiBrZXkuXG4gICpcbiAgKiBSZXR1cm46IFRoZSBkZWNvZGVkIHBoeXNpY2FsIGFkZHJlc3MuXG4gICovXG4tc3RhdGljIHBoeXNfYWRkcl90IGtob19yYWRpeF9kZWNvZGVfa2V5KHVuc2lnbmVkIGxvbmcga2V5LCB1bnNpZ25lZCBpbnQgKm9yZGVyKVxuJiM0MztzdGF0aWMgcGh5c19hZGRyX3Qga2hvX2RlY29kZV9yYWRpeF9rZXkodW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGludCAqb3JkZXIpXG4ge1xuLVx0dW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSk7XG4mIzQzO1x0LyogZmxzNjQoKSBpbmRleGVzIHN0YXJ0aW5nIGZyb20gMS4gKi9cbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXJfYml0ID0gZmxzNjQoa2V5KSAtIDE7XG4gXHRwaHlzX2FkZHJfdCBwaHlzO1xuIFxuLVx0Lyogb3JkZXJfYml0IGlzIG51bWJlcmVkIHN0YXJ0aW5nIGF0IDEgZnJvbSBmbHM2NCAqL1xuLVx0Km9yZGVyID0gS0hPX09SREVSXzBfTE9HMiAtIG9yZGVyX2JpdCAmIzQzOyAxO1xuLVx0LyogVGhlIG9yZGVyIGlzIGRpc2NhcmRlZCBieSB0aGUgc2hpZnQgKi9cbiYjNDM7XHQvKiBvcmRlciBiaXQgZ29lcyByaWdodCBiZWZvcmUgdGhlIHNoaWZ0ZWQgUEZOLiAqL1xuJiM0MztcdCpvcmRlciA9IDY0IC0gKFBBR0VfU0hJRlQgJiM0Mzsgb3JkZXJfYml0KTtcbiYjNDM7XHQvKiBUaGUgb3JkZXIgYml0IGlzIGRpc2NhcmRlZCBieSB0aGUgc2hpZnQgKi9cbiBcdHBoeXMgPSBrZXkgXHUwMDNjXHUwMDNjIChQQUdFX1NISUZUICYjNDM7ICpvcmRlcik7XG4gXG4gXHRyZXR1cm4gcGh5cztcbkBAIC0xNDMsMjUgJiM0MzsxNjMsNDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX3JhZGl4X2dldF90YWJsZV9pbmRleCh1bnNpZ25lZCBsb25nIGtleSxcbiBcdHJldHVybiAoa2V5IFx1MDAzZVx1MDAzZSBzKSAlICgxIFx1MDAzY1x1MDAzYyBLSE9fVEFCTEVfU0laRV9MT0cyKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyB2b2lkIF9fcmVmICpraG9fcmFkaXhfYWxsb2Nfbm9kZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlO1xuJiM0MztcbiYjNDM7XHRpZiAoc2xhYl9pc19hdmFpbGFibGUoKSlcbiYjNDM7XHRcdG5vZGUgPSAoc3RydWN0IGtob19yYWRpeF9ub2RlICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG5vZGUgPSBtZW1ibG9ja19hbGxvYyhQQUdFX1NJWkUsIFBBR0VfU0laRSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBub2RlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBfX3JlZiBraG9fcmFkaXhfZnJlZV9ub2RlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSlcbiYjNDM7e1xuJiM0MztcdGlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKW5vZGUpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG1lbWJsb2NrX2ZyZWUobm9kZSwgUEFHRV9TSVpFKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbi0gKiBraG9fcmFkaXhfYWRkX3BhZ2UgLSBNYXJrcyBhIHBhZ2UgYXMgcHJlc2VydmVkIGluIHRoZSByYWRpeCB0cmVlLlxuJiM0MzsgKiBraG9fcmFkaXhfYWRkX2tleSAtIEFkZCBhIGtleSB0byB0aGUgcmFkaXggdHJlZS5cbiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLlxuLSAqIEBwZm46IFRoZSBwYWdlIGZyYW1lIG51bWJlciBvZiB0aGUgcGFnZSB0byBwcmVzZXJ2ZS5cbi0gKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS5cbiYjNDM7ICogQGtleTogVGhlIGtleSB0byBhZGQuXG4gICpcbi0gKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBiYXNlZCBvbiB0aGUga2V5IGRlcml2ZWQgZnJvbSBAcGZuXG4tICogYW5kIEBvcmRlci4gSXQgc2V0cyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGxlYWYgYml0bWFwIHRvIG1hcmsgdGhlXG4tICogcGFnZSBmb3IgcHJlc2VydmF0aW9uLiBJZiBpbnRlcm1lZGlhdGUgbm9kZXMgZG8gbm90IGV4aXN0IGFsb25nIHRoZSBwYXRoLFxuLSAqIHRoZXkgYXJlIGFsbG9jYXRlZCBhbmQgYWRkZWQgdG8gdGhlIHRyZWUuXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGJhc2VkIG9uIHRoZSBAa2V5IHByb3ZpZGVkLiBJdCBzZXRzIHRoZVxuJiM0MzsgKiBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGUgQGtleSBhcyBwcmVzZW50LiBJZlxuJiM0MzsgKiBpbnRlcm1lZGlhdGUgbm9kZXMgZG8gbm90IGV4aXN0IGFsb25nIHRoZSBwYXRoLCB0aGV5IGFyZSBhbGxvY2F0ZWQgYW5kIGFkZGVkXG4mIzQzOyAqIHRvIHRoZSB0cmVlLlxuJiM0MzsgKlxuJiM0MzsgKiBOT1RFOiBDdXJyZW50bHkgb25seSBrZXlzIG9mIHdpZHRoIHVwIHRvICVLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBzdXBwb3J0ZWQuXG4mIzQzOyAqIFRoaXMgbGltaXQgb25seSBleGlzdHMgYmVjYXVzZSBjdXJyZW50IHVzZXJzIG9mIHRoZSByYWRpeCB0cmVlIGRvbiYjMzk7dCB1c2UgbW9yZVxuJiM0MzsgKiB0aGFuIHRoYXQuIENoYW5naW5nIHRoZSBtYXhpbXVtIHdpZHRoIHJlcXVpcmVzIGNoYW5naW5nIHRoZSB0cmVlIGRlcHRoLCB3aGljaFxuJiM0MzsgKiBuZWVkcyBidW1waW5nIHRoZSBBQkkgdmVyc2lvbi5cbiAgKlxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbiAgKi9cbi1pbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpXG4mIzQzO2ludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxuIHtcbiBcdC8qIE5ld2x5IGFsbG9jYXRlZCBub2RlcyBmb3IgZXJyb3IgY2xlYW51cCAqL1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICppbnRlcm1lZGlhdGVfbm9kZXNbS0hPX1RSRUVfTUFYX0RFUFRIXSA9IHsgMCB9O1xuLVx0dW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7XG4gXHRzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKmFuY2hvcl9ub2RlID0gTlVMTDtcbiBcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSA9IHRyZWUtXHUwMDNlcm9vdDtcbiBcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbmV3X25vZGU7XG5AQCAtMTcyLDYgJiM0MzsyMTQsOSBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBcdGlmIChXQVJOX09OX09OQ0UoIXRyZWUtXHUwMDNlcm9vdCkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuJiM0MztcdGlmICh1bmxpa2VseShmbHM2NChrZXkpIFx1MDAzZSBLSE9fUkFESVhfS0VZX1dJRFRIKSlcbiYjNDM7XHRcdHJldHVybiAtRVJBTkdFO1xuJiM0MztcbiBcdG1pZ2h0X3NsZWVwKCk7XG4gXG4gXHRndWFyZChtdXRleCkoXHUwMDI2dHJlZS1cdTAwM2Vsb2NrKTtcbkBAIC0xODYsNyAmIzQzOzIzMSw3IEBAIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuIFx0XHR9XG4gXG4gXHRcdC8qIE5leHQgbm9kZSBpcyBlbXB0eSwgY3JlYXRlIGEgbmV3IG5vZGUgZm9yIGl0ICovXG4tXHRcdG5ld19ub2RlID0gKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbiYjNDM7XHRcdG5ld19ub2RlID0ga2hvX3JhZGl4X2FsbG9jX25vZGUoKTtcbiBcdFx0aWYgKCFuZXdfbm9kZSkge1xuIFx0XHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdFx0Z290byBlcnJfZnJlZV9ub2RlcztcbkBAIC0yMTcsMjkgJiM0MzsyNjIsMjYgQEAgaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4gZXJyX2ZyZWVfbm9kZXM6XG4gXHRmb3IgKGkgPSBLSE9fVFJFRV9NQVhfREVQVEggLSAxOyBpIFx1MDAzZSAwOyBpLS0pIHtcbiBcdFx0aWYgKGludGVybWVkaWF0ZV9ub2Rlc1tpXSlcbi1cdFx0XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpaW50ZXJtZWRpYXRlX25vZGVzW2ldKTtcbiYjNDM7XHRcdFx0a2hvX3JhZGl4X2ZyZWVfbm9kZShpbnRlcm1lZGlhdGVfbm9kZXNbaV0pO1xuIFx0fVxuIFx0aWYgKGFuY2hvcl9ub2RlKVxuIFx0XHRhbmNob3Jfbm9kZS1cdTAwM2V0YWJsZVthbmNob3JfaWR4XSA9IDA7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbi1FWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX3BhZ2UpO1xuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7XG4gXG4gLyoqXG4tICoga2hvX3JhZGl4X2RlbF9wYWdlIC0gUmVtb3ZlcyBhIHBhZ2UmIzM5O3MgcHJlc2VydmF0aW9uIHN0YXR1cyBmcm9tIHRoZSByYWRpeCB0cmVlLlxuJiM0MzsgKiBraG9fcmFkaXhfZGVsX2tleSAtIFJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSByYWRpeCB0cmVlLlxuICAqIEB0cmVlOiBUaGUgS0hPIHJhZGl4IHRyZWUuXG4tICogQHBmbjogVGhlIHBhZ2UgZnJhbWUgbnVtYmVyIG9mIHRoZSBwYWdlIHRvIHVucHJlc2VydmUuXG4tICogQG9yZGVyOiBUaGUgb3JkZXIgb2YgdGhlIHBhZ2UuXG4mIzQzOyAqIEBrZXk6IFRoZSBrZXkgdG8gcmVtb3ZlLlxuICAqXG4gICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNsZWFycyB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG9cbi0gKiB0aGUgcGFnZSwgZWZmZWN0aXZlbHkgcmVtb3ZpbmcgaXRzIFwmIzM0O3ByZXNlcnZlZFwmIzM0OyBzdGF0dXMuIEl0IGRvZXMgbm90IGZyZWVcbi0gKiB0aGUgdHJlZSYjMzk7cyBpbnRlcm1lZGlhdGUgbm9kZXMsIGV2ZW4gaWYgdGhleSBiZWNvbWUgZW1wdHkuXG4mIzQzOyAqIHRoZSBAa2V5LCBlZmZlY3RpdmVseSByZW1vdmluZyBpdCBmcm9tIHRoZSB0cmVlLiBJdCBkb2VzIG5vdCBmcmVlIHRoZSB0cmVlJiMzOTtzXG4mIzQzOyAqIGludGVybWVkaWF0ZSBub2RlcywgZXZlbiBpZiB0aGV5IGJlY29tZSBlbXB0eS5cbiAgKi9cbi12b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuLVx0XHRcdHVuc2lnbmVkIGludCBvcmRlcilcbiYjNDM7dm9pZCBraG9fcmFkaXhfZGVsX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxuIHtcbi1cdHVuc2lnbmVkIGxvbmcga2V5ID0ga2hvX3JhZGl4X2VuY29kZV9rZXkoUEZOX1BIWVMocGZuKSwgb3JkZXIpO1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlID0gdHJlZS1cdTAwM2Vyb290O1xuIFx0c3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmO1xuIFx0dW5zaWduZWQgaW50IGksIGlkeDtcbkBAIC0yNDcsNiAmIzQzOzI4OSwxMCBAQCB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuIFx0aWYgKFdBUk5fT05fT05DRSghdHJlZS1cdTAwM2Vyb290KSlcbiBcdFx0cmV0dXJuO1xuIFxuJiM0MztcdC8qIEtleXMgd2lkZXIgdGhhbiBLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBub3QgYWxsb3dlZCB0byBiZSBhZGRlZC4gKi9cbiYjNDM7XHRpZiAodW5saWtlbHkoZmxzNjQoa2V5KSBcdTAwM2UgS0hPX1JBRElYX0tFWV9XSURUSCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuIFx0bWlnaHRfc2xlZXAoKTtcbiBcbiBcdGd1YXJkKG11dGV4KShcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuQEAgLTI3MCwyMSAmIzQzOzMxNiw4NSBAQCB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuIFx0aWR4ID0ga2hvX3JhZGl4X2dldF9iaXRtYXBfaW5kZXgoa2V5KTtcbiBcdF9fY2xlYXJfYml0KGlkeCwgbGVhZi1cdTAwM2ViaXRtYXApO1xuIH1cbi1FWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfZGVsX3BhZ2UpO1xuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfZGVsX2tleSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBfX2tob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgaW50IGxldmVsKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRpZiAobGV2ZWwgPT0gMCkge1xuJiM0MztcdFx0a2hvX3JhZGl4X2ZyZWVfbm9kZShyb290KTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCk7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAocm9vdC1cdTAwM2V0YWJsZVtpXSlcbiYjNDM7XHRcdFx0X19raG9fcmFkaXhfZGVzdHJveV90cmVlKHBoeXNfdG9fdmlydChyb290LVx1MDAzZXRhYmxlW2ldKSxcbiYjNDM7XHRcdFx0XHRcdFx0IGxldmVsIC0gMSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRraG9fcmFkaXhfZnJlZV9ub2RlKHJvb3QpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICoga2hvX3JhZGl4X2luaXRfdHJlZSAtIGluaXRpYWxpemUgdGhlIHJhZGl4IHRyZWUuXG4mIzQzOyAqIEB0cmVlOiAgIHRoZSB0cmVlIHRvIGluaXRpYWxpemUuXG4mIzQzOyAqIEByb290OiAgIHJvb3QgdGFibGUgb2YgdGhlIHJhZGl4IHRyZWUuXG4mIzQzOyAqXG4mIzQzOyAqIEluaXRpYWxpemUgdGhlIHJhZGl4IHRyZWUgd2l0aCB0aGUgZ2l2ZW4gcm9vdCBub2RlLiBJZiByb290IGlzICVOVUxMLCBhblxuJiM0MzsgKiBlbXB0eSByb290IHRhYmxlIGlzIGFsbG9jYXRlZC4gSWYgcm9vdCBpcyBub3QgJU5VTEwsIGl0IGlzIHRoZSBjYWxsZXImIzM5O3NcbiYjNDM7ICogcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoZSByb290IGlzIHZhbGlkIGFuZCBpbiB0aGUgY29ycmVjdCBmb3JtYXQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO2ludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFyb290KVxuJiM0MztcdFx0cm9vdCA9IGtob19yYWRpeF9hbGxvY19ub2RlKCk7XG4mIzQzO1x0aWYgKCFyb290KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHRyZWUtXHUwMDNlcm9vdCA9IHJvb3Q7XG4mIzQzO1x0bXV0ZXhfaW5pdChcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGtob19yYWRpeF9kZXN0cm95X3RyZWUgLSBEZXN0cm95IHRoZSByYWRpeCB0cmVlXG4mIzQzOyAqIEB0cmVlOiBUaGUgcmFkaXggdHJlZSB0byBkZXN0cm95XG4mIzQzOyAqXG4mIzQzOyAqIFdhbGsgQHRyZWUgYW5kIGZyZWUgYWxsIGl0cyBub2Rlcy5cbiYjNDM7ICovXG4mIzQzO3ZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpXG4mIzQzO3tcbiYjNDM7XHRpZiAoIXRyZWUtXHUwMDNlcm9vdClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0X19raG9fcmFkaXhfZGVzdHJveV90cmVlKHRyZWUtXHUwMDNlcm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSk7XG4mIzQzO1x0dHJlZS1cdTAwM2Vyb290ID0gTlVMTDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfZGVzdHJveV90cmVlKTtcbiBcbi1zdGF0aWMgaW50IGtob19yYWRpeF93YWxrX2xlYWYoc3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmLFxuLVx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGtleSxcbi1cdFx0XHQgICAgICAga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuJiM0MztzdGF0aWMgaW50IGtob19yYWRpeF93YWxrX2xlYWYoc3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmLCB1bnNpZ25lZCBsb25nIGtleSxcbiYjNDM7XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilsZWFmO1xuLVx0dW5zaWduZWQgaW50IG9yZGVyO1xuLVx0cGh5c19hZGRyX3QgcGh5cztcbiBcdHVuc2lnbmVkIGludCBpO1xuIFx0aW50IGVycjtcbiBcbiYjNDM7XHRpZiAoY2ItXHUwMDNlbm9kZSkge1xuJiM0MztcdFx0ZXJyID0gY2ItXHUwMDNlbm9kZSh2aXJ0X3RvX3BoeXMobGVhZiksIGRhdGEpO1xuJiM0MztcdFx0aWYgKGVycilcbiYjNDM7XHRcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghY2ItXHUwMDNlbGVhZilcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiBcdGZvcl9lYWNoX3NldF9iaXQoaSwgYml0bWFwLCBQQUdFX1NJWkUgKiBCSVRTX1BFUl9CWVRFKSB7XG4tXHRcdHBoeXMgPSBraG9fcmFkaXhfZGVjb2RlX2tleShrZXkgfCBpLCBcdTAwMjZvcmRlcik7XG4tXHRcdGVyciA9IGNiKHBoeXMsIG9yZGVyKTtcbiYjNDM7XHRcdGVyciA9IGNiLVx1MDAzZWxlYWYoa2V5IHwgaSwgZGF0YSk7XG4gXHRcdGlmIChlcnIpXG4gXHRcdFx0cmV0dXJuIGVycjtcbiBcdH1cbkBAIC0yOTQsNyAmIzQzOzQwNCw3IEBAIHN0YXRpYyBpbnQga2hvX3JhZGl4X3dhbGtfbGVhZihzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWYsXG4gXG4gc3RhdGljIGludCBfX2tob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBsZXZlbCwgdW5zaWduZWQgbG9uZyBzdGFydCxcbi1cdFx0XHRcdCBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXG4mIzQzO1x0XHRcdFx0IGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlO1xuIFx0c3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmO1xuQEAgLTMwMiw2ICYjNDM7NDEyLDEyIEBAIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcbiBcdHVuc2lnbmVkIGludCBzaGlmdDtcbiBcdGludCBlcnI7XG4gXG4mIzQzO1x0aWYgKGNiLVx1MDAzZW5vZGUpIHtcbiYjNDM7XHRcdGVyciA9IGNiLVx1MDAzZW5vZGUodmlydF90b19waHlzKHJvb3QpLCBkYXRhKTtcbiYjNDM7XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0fVxuJiM0MztcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCk7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGlmICghcm9vdC1cdTAwM2V0YWJsZVtpXSlcbiBcdFx0XHRjb250aW51ZTtcbkBAIC0zMTgsMTAgJiM0Mzs0MzQsMTAgQEAgc3RhdGljIGludCBfX2tob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuIFx0XHRcdCAqIG5vZGUgaXMgcG9pbnRpbmcgdG8gdGhlIGxldmVsIDAgYml0bWFwLlxuIFx0XHRcdCAqL1xuIFx0XHRcdGxlYWYgPSAoc3RydWN0IGtob19yYWRpeF9sZWFmICopbm9kZTtcbi1cdFx0XHRlcnIgPSBraG9fcmFkaXhfd2Fsa19sZWFmKGxlYWYsIGtleSwgY2IpO1xuJiM0MztcdFx0XHRlcnIgPSBraG9fcmFkaXhfd2Fsa19sZWFmKGxlYWYsIGtleSwgY2IsIGRhdGEpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdGVyciAgPSBfX2tob19yYWRpeF93YWxrX3RyZWUobm9kZSwgbGV2ZWwgLSAxLFxuLVx0XHRcdFx0XHRcdCAgICAga2V5LCBjYik7XG4mIzQzO1x0XHRcdFx0XHRcdCAgICAga2V5LCBjYiwgZGF0YSk7XG4gXHRcdH1cbiBcbiBcdFx0aWYgKGVycilcbkBAIC0zMzIsMjggJiM0Mzs0NDgsMjcgQEAgc3RhdGljIGludCBfX2tob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuIH1cbiBcbiAvKipcbi0gKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIHByZXNlcnZlZCBwYWdlLlxuJiM0MzsgKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIGtleS5cbiAgKiBAdHJlZTogQSBwb2ludGVyIHRvIHRoZSBLSE8gcmFkaXggdHJlZSB0byB3YWxrLlxuLSAqIEBjYjogQSBjYWxsYmFjayBmdW5jdGlvbiBvZiB0eXBlIGtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCB0aGF0IHdpbGwgYmVcbi0gKiAgICAgIGludm9rZWQgZm9yIGVhY2ggcHJlc2VydmVkIHBhZ2UgZm91bmQgaW4gdGhlIHRyZWUuIFRoZSBjYWxsYmFjayByZWNlaXZlc1xuLSAqICAgICAgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyIG9mIHRoZSBwcmVzZXJ2ZWQgcGFnZS5cbiYjNDM7ICogQGNiOiAgIFNldCBvZiBjYWxsYmFja3MgdG8gYmUgaW52b2tlZCBkdXJpbmcgdGhlIHRyZWUgd2Fsay5cbiYjNDM7ICogQGRhdGE6IE9wYXF1ZSBkYXRhIHBvaW50ZXIgcGFzc2VkIHRvIGVhY2ggY2FsbGJhY2sgaW4gQGNiLlxuICAqXG4tICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHNwZWNpZmllZCB0b3AgbGV2ZWxcbi0gKiBkb3duIHRvIHRoZSBsb3dlc3QgbGV2ZWwgKGxldmVsIDApLiBGb3IgZWFjaCBwcmVzZXJ2ZWQgcGFnZSBmb3VuZCwgaXQgaW52b2tlc1xuLSAqIHRoZSBwcm92aWRlZCBjYWxsYmFjaywgcGFzc2luZyB0aGUgcGFnZSYjMzk7cyBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlci5cbiYjNDM7ICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHRvcCBsZXZlbCBkb3duIHRvIHRoZVxuJiM0MzsgKiBsb3dlc3QgbGV2ZWwgKGxldmVsIDApLCBpbnZva2luZyB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzLlxuICAqXG4gICogUmV0dXJuOiAwIGlmIHRoZSB3YWxrIGNvbXBsZXRlZCB0aGUgc3BlY2lmaWVkIHRyZWUsIG9yIHRoZSBub24temVybyByZXR1cm5cbiAgKiAgICAgICAgIHZhbHVlIGZyb20gdGhlIGNhbGxiYWNrIHRoYXQgc3RvcHBlZCB0aGUgd2Fsay5cbiAgKi9cbiBpbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4tXHRcdFx0a2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuJiM0MztcdFx0XHRjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgKmNiLCB2b2lkICpkYXRhKVxuIHtcbiBcdGlmIChXQVJOX09OX09OQ0UoIXRyZWUtXHUwMDNlcm9vdCkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuIFx0Z3VhcmQobXV0ZXgpKFx1MDAyNnRyZWUtXHUwMDNlbG9jayk7XG4gXG4tXHRyZXR1cm4gX19raG9fcmFkaXhfd2Fsa190cmVlKHRyZWUtXHUwMDNlcm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSwgMCwgY2IpO1xuJiM0MztcdHJldHVybiBfX2tob19yYWRpeF93YWxrX3RyZWUodHJlZS1cdTAwM2Vyb290LCBLSE9fVFJFRV9NQVhfREVQVEggLSAxLCAwLCBjYixcbiYjNDM7XHRcdFx0XHQgICAgIGRhdGEpO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfd2Fsa190cmVlKTtcbiBcbkBAIC00ODQsMTMgJiM0Mzs1OTksMTYgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpfX2luaXQga2hvX2dldF9wcmVzZXJ2ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzLFxuIFx0cmV0dXJuIHBmbl90b19wYWdlKHBmbik7XG4gfVxuIFxuLXN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cyxcbi1cdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBvcmRlcilcbiYjNDM7c3RhdGljIGludCBfX2luaXQga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcbiB7XG4gXHR1bmlvbiBraG9fcGFnZV9pbmZvIGluZm87XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4mIzQzO1x0cGh5c19hZGRyX3QgcGh5cztcbiBcdHU2NCBzejtcbiBcbiYjNDM7XHRwaHlzID0ga2hvX2RlY29kZV9yYWRpeF9rZXkoa2V5LCBcdTAwMjZvcmRlcik7XG4mIzQzO1xuIFx0c3ogPSAxIFx1MDAzY1x1MDAzYyAob3JkZXIgJiM0MzsgUEFHRV9TSElGVCk7XG4gXHRwYWdlID0ga2hvX2dldF9wcmVzZXJ2ZWRfcGFnZShwaHlzLCBvcmRlcik7XG4gXG5AQCAtNTA0LDE5ICYjNDM7NjIyLDI0IEBAIHN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cyxcbiBcdHJldHVybiAwO1xuIH1cbiBcbi0vKiBSZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovXG4tc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBraG9fZ2V0X21lbV9tYXBfcGh5cyhjb25zdCB2b2lkICpmZHQpXG4mIzQzOy8qIFJldHVybnMgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwcmVzZXJ2ZWQgbWVtb3J5IG1hcCBmcm9tIEZEVCAqL1xuJiM0MztzdGF0aWMgX19pbml0IHZvaWQgKmtob19nZXRfbWVtX21hcChjb25zdCB2b2lkICpmZHQpXG4ge1xuIFx0Y29uc3Qgdm9pZCAqbWVtX3B0cjtcbiYjNDM7XHRwaHlzX2FkZHJfdCBtZW1fbWFwX3BoeXM7XG4gXHRpbnQgbGVuO1xuIFxuIFx0bWVtX3B0ciA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgXHUwMDI2bGVuKTtcbiBcdGlmICghbWVtX3B0ciB8fCBsZW4gIT0gc2l6ZW9mKHU2NCkpIHtcbiBcdFx0cHJfZXJyKFwmIzM0O2ZhaWxlZCB0byBnZXQgcHJlc2VydmVkIG1lbW9yeSBtYXBcXG5cJiMzNDspO1xuLVx0XHRyZXR1cm4gMDtcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuIFx0fVxuIFxuLVx0cmV0dXJuIGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKW1lbV9wdHIpO1xuJiM0MztcdG1lbV9tYXBfcGh5cyA9IGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKW1lbV9wdHIpO1xuJiM0MztcdGlmICghbWVtX21hcF9waHlzKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdHJldHVybiBwaHlzX3RvX3ZpcnQobWVtX21hcF9waHlzKTtcbiB9XG4gXG4gLypcbkBAIC02MTksMTkgJiM0Mzs3NDIsMjQgQEAgZWFybHlfcGFyYW0oXCYjMzQ7a2hvX3NjcmF0Y2hcJiMzNDssIGtob19wYXJzZV9zY3JhdGNoX3NpemUpO1xuIHN0YXRpYyB2b2lkIF9faW5pdCBzY3JhdGNoX3NpemVfdXBkYXRlKHZvaWQpXG4ge1xuIFx0Lypcbi1cdCAqIElmIGZpeGVkIHNpemVzIGFyZSBub3QgcHJvdmlkZWQgdmlhIGNvbW1hbmQgbGluZSwgY2FsY3VsYXRlIHRoZW1cbi1cdCAqIG5vdy5cbiYjNDM7XHQgKiBJZiBmaXhlZCBzaXplcyBhcmUgbm90IHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUsIGNhbGN1bGF0ZSB0aGVtIG5vdy5cbiYjNDM7XHQgKiBSZW1vdmUgSHVnZVRMQiBhbGxvY2F0aW9ucyBmcm9tIGl0IGJlY2F1c2UgdGhleSBuZXZlciBnZXQgYWxsb2NhdGVkXG4mIzQzO1x0ICogZnJvbSBzY3JhdGNoLlxuIFx0ICovXG4gXHRpZiAoc2NyYXRjaF9zY2FsZSkge1xuIFx0XHRwaHlzX2FkZHJfdCBzaXplO1xuIFxuIFx0XHRzaXplID0gbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKEFSQ0hfTE9XX0FERFJFU1NfTElNSVQsXG4gXHRcdFx0XHRcdFx0ICAgTlVNQV9OT19OT0RFKTtcbiYjNDM7XHRcdHNpemUgLT0gbWVtYmxvY2tfcmVzZXJ2ZWRfaHVnZXRsYl9zaXplKEFSQ0hfTE9XX0FERFJFU1NfTElNSVQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgICBOVU1BX05PX05PREUpO1xuIFx0XHRzaXplID0gc2l6ZSAqIHNjcmF0Y2hfc2NhbGUgLyAxMDA7XG4gXHRcdHNjcmF0Y2hfc2l6ZV9sb3dtZW0gPSBzaXplO1xuIFxuIFx0XHRzaXplID0gbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKE1FTUJMT0NLX0FMTE9DX0FOWVdIRVJFLFxuIFx0XHRcdFx0XHRcdCAgIE5VTUFfTk9fTk9ERSk7XG4mIzQzO1x0XHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XG4gXHRcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMCAtIHNjcmF0Y2hfc2l6ZV9sb3dtZW07XG4gXHRcdHNjcmF0Y2hfc2l6ZV9nbG9iYWwgPSBzaXplO1xuIFx0fVxuQEAgLTY1MSw2ICYjNDM7Nzc5LDkgQEAgc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBzY3JhdGNoX3NpemVfbm9kZShpbnQgbmlkKVxuIFx0aWYgKHNjcmF0Y2hfc2NhbGUpIHtcbiBcdFx0c2l6ZSA9IG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcbiBcdFx0XHRcdFx0XHQgICBuaWQpO1xuJiM0MztcdFx0LyogRG8gbm90IGNvdW50IEh1Z2VUTEIgcGFnZXMuICovXG4mIzQzO1x0XHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgIG5pZCk7XG4gXHRcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMDtcbiBcdH0gZWxzZSB7XG4gXHRcdHNpemUgPSBzY3JhdGNoX3NpemVfcGVybm9kZTtcbkBAIC02NTksNiAmIzQzOzc5MCw0OSBAQCBzdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHNjcmF0Y2hfc2l6ZV9ub2RlKGludCBuaWQpXG4gXHRyZXR1cm4gcm91bmRfdXAoc2l6ZSwgQ01BX01JTl9BTElHTk1FTlRfQllURVMpO1xuIH1cbiBcbiYjNDM7Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGtob19zY3JhdGNoX2NudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHNjcmF0Y2hfc3RhcnQgPSBraG9fc2NyYXRjaFtpXS5hZGRyO1xuJiM0MztcdFx0c2NyYXRjaF9lbmQgPSBraG9fc2NyYXRjaFtpXS5hZGRyICYjNDM7IGtob19zY3JhdGNoW2ldLnNpemU7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHBoeXMgXHUwMDNjIHNjcmF0Y2hfZW5kIFx1MDAyNlx1MDAyNiAocGh5cyAmIzQzOyBzaXplKSBcdTAwM2Ugc2NyYXRjaF9zdGFydClcbiYjNDM7XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE1hcmsgYWxsIEtITyBzY3JhdGNoIHBhZ2VibG9ja3MgYmV0d2VlbiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gYXNcbiYjNDM7ICogTUlHUkFURV9DTUEuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiYjNDM7e1xuJiM0MztcdGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIFx1MDAzYyBraG9fc2NyYXRjaF9jbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHNjcmF0Y2hfc3RhcnQsIHNjcmF0Y2hfZW5kLCBwZm47XG4mIzQzO1xuJiM0MztcdFx0c2NyYXRjaF9zdGFydCA9IFBIWVNfUEZOKGtob19zY3JhdGNoW2ldLmFkZHIpO1xuJiM0MztcdFx0c2NyYXRjaF9lbmQgPSBQSFlTX1BGTihraG9fc2NyYXRjaFtpXS5hZGRyICYjNDM7IGtob19zY3JhdGNoW2ldLnNpemUpO1xuJiM0MztcbiYjNDM7XHRcdC8qIFRhcmdldCByYW5nZSBkb2VzbiYjMzk7dCBvdmVybGFwIHdpdGggc2NyYXRjaC4gKi9cbiYjNDM7XHRcdGlmIChzdGFydF9wZm4gXHUwMDNlPSBzY3JhdGNoX2VuZCB8fCBlbmRfcGZuIFx1MDAzYz0gc2NyYXRjaF9zdGFydClcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0cGZuID0gbWF4X3QodW5zaWduZWQgbG9uZywgc3RhcnRfcGZuLCBzY3JhdGNoX3N0YXJ0KTtcbiYjNDM7XHRcdHBmbiA9IHBhZ2VibG9ja19zdGFydF9wZm4ocGZuKTtcbiYjNDM7XG4mIzQzO1x0XHR3aGlsZSAocGZuIFx1MDAzYyBlbmRfcGZuIFx1MDAyNlx1MDAyNiBwZm4gXHUwMDNjIHNjcmF0Y2hfZW5kKSB7XG4mIzQzO1x0XHRcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBmbl90b19wYWdlKHBmbiksXG4mIzQzO1x0XHRcdFx0XHRcdCAgIE1JR1JBVEVfQ01BLCBmYWxzZSk7XG4mIzQzO1x0XHRcdHBmbiAmIzQzOz0gcGFnZWJsb2NrX25yX3BhZ2VzO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBraG9fcmVzZXJ2ZV9zY3JhdGNoIC0gUmVzZXJ2ZSBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IGZvciBrZXhlY1xuICAqXG5AQCAtNzQ2LDYgJiM0Mzs5MjAsMTI4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBraG9fcmVzZXJ2ZV9zY3JhdGNoKHZvaWQpXG4gXHRraG9fZW5hYmxlID0gZmFsc2U7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBMb29rIGZvciBmcmVlIGJsb2NrcyBvZiAxRy4gVGhpcyBpcyBhIGhldXJpc3RpYyBjaG9zZW4gdG8gd29yayBlZmZpY2llbnRseVxuJiM0MzsgKiB3aXRoIGxhcmdlIHN5c3RlbXMgd2l0aCBodW5kcmVkcyBvZiBnaWdhYnl0ZXMgb2YgbWVtb3J5LiBJdCB3aWxsIHdvcmsgcG9vcmx5XG4mIzQzOyAqIG9uIHNtYWxsZXIgc3lzdGVtcy4gVGhlIGFsZ29yaXRobSBpdHNlbGYgZG9lc24mIzM5O3QgZGVwZW5kIG9uIHRoZSBhY3R1YWwgdmFsdWUsXG4mIzQzOyAqIHNvIGl0IGNhbiBiZSBjaGFuZ2VkIHRvIGEgZGlmZmVyZW50IGhldXJpc3RpYyBsYXRlciBpZiBuZWVkZWQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIEtIT19FWFRfQkxLU0laRVx0XHRTWl8xR1xuJiM0MzsjZGVmaW5lIEtIT19FWFRfU0hJRlRcdFx0Y29uc3RfaWxvZzIoS0hPX0VYVF9CTEtTSVpFKVxuJiM0MztcbiYjNDM7LyogQ2FsbGVkIGZvciB0aGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZS4gKi9cbiYjNDM7c3RhdGljIGludCBfX2luaXQga2hvX2V4dF93YWxrX2xlYWYodW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHQvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqL1xuJiM0MztcdHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSA9IGRhdGE7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0c3RhcnQgPSBraG9fZGVjb2RlX3JhZGl4X2tleShrZXksIFx1MDAyNm9yZGVyKTtcbiYjNDM7XHRlbmQgPSBzdGFydCAmIzQzOyAoMVVMIFx1MDAzY1x1MDAzYyAob3JkZXIgJiM0MzsgUEFHRV9TSElGVCkpO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuJiM0MztcdFx0ZXJyID0ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgc3RhcnQgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xuJiM0MztcdFx0aWYgKGVycilcbiYjNDM7XHRcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0XHRzdGFydCAmIzQzOz0gKDFVTCBcdTAwM2NcdTAwM2MgS0hPX0VYVF9TSElGVCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ2FsbGVkIGZvciB0aGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZS4gKi9cbiYjNDM7c3RhdGljIGludCBfX2luaXQga2hvX2V4dF93YWxrX25vZGUocGh5c19hZGRyX3QgcGh5cywgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdC8qIFJhZGl4IHRyZWUgdHJhY2tpbmcgZnJlZSBibG9ja3MuICovXG4mIzQzO1x0c3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlID0gZGF0YTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIHBoeXMgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDYWxsZWQgZm9yIHRoZSBmcmVlIGJsb2NrIHJhZGl4IHRyZWUuICovXG4mIzQzO3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfbWFya19zY3JhdGNoKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0cGh5c19hZGRyX3QgKnByZXZfZW5kID0gZGF0YTtcbiYjNDM7XHRwaHlzX2FkZHJfdCBzdGFydCA9IGtleSBcdTAwM2NcdTAwM2MgS0hPX0VYVF9TSElGVDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAoc3RhcnQgXHUwMDNlICpwcmV2X2VuZCkge1xuJiM0MztcdFx0ZXJyID0gbWVtYmxvY2tfbWFya19raG9fc2NyYXRjaCgqcHJldl9lbmQsIHN0YXJ0IC0gKnByZXZfZW5kKTtcbiYjNDM7XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQqcHJldl9lbmQgPSBzdGFydCAmIzQzOyAoMVVMIFx1MDAzY1x1MDAzYyBLSE9fRVhUX1NISUZUKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICoga2hvX2V4dGVuZF9zY3JhdGNoIC0gRXh0ZW5kIHRoZSBzY3JhdGNoIHJlZ2lvbnNcbiYjNDM7ICpcbiYjNDM7ICogVGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUgbWl4ZXMgYm90aCBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlclxuJiM0MzsgKiBpbnRvIGEgc2luZ2xlIGtleS4gVGhpcyBtYWtlcyBpdCBoYXJkIHRvIGxvb2sgZm9yIGZyZWUgcmFuZ2VzIGRpcmVjdGx5LiBUaGlzXG4mIzQzOyAqIGZ1bmN0aW9uIGZpcnN0IHdhbGtzIHRoZSByYWRpeCB0cmVlIGFuZCBkaWdlc3RzIGl0IGRvd24gaW50byBhbm90aGVyIHJhZGl4XG4mIzQzOyAqIHRyZWUsIHdob3NlIGtleXMgaWRlbnRpZnkgYmxvY2tzIG9mIEtIT19FWFRfU0hJRlQgd2hpY2ggY29udGFpbiBwcmVzZXJ2ZWRcbiYjNDM7ICogbWVtb3J5LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGVuIGl0IHdhbGtzIHRoZSBkaWdlc3RlZCByYWRpeCB0cmVlIGFuZCBtYXJrcyBldmVyeXRoaW5nIHRoYXQgZG9lc24mIzM5O3QgaGF2ZVxuJiM0MzsgKiBwcmVzZXJ2ZWQgbWVtb3J5IGFzIHNjcmF0Y2guXG4mIzQzOyAqXG4mIzQzOyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBzbyBpdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2NyYXRjaCBoYXNcbiYjNDM7ICogYXZhaWxhYmxlIHNwYWNlLlxuJiM0MzsgKlxuJiM0MzsgKiBOT1RFOiBUaGUgcGFnZXMgb2YgdGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUgdGFibGVzIGFyZSBub3QgbWFya2VkXG4mIzQzOyAqIGFzIHByZXNlcnZlZCBpbiB0aGUgcHJlc2VydmVkIG1lbW9yeSB0cmVlLiBCdXQgdGhleSBhcmUgZXhwZWN0ZWQgdG8gcmVtYWluXG4mIzQzOyAqIHVudG91Y2hlZCB1bnRpbCB0aGUgdHJlZSBpcyBmdWxseSBwYXJzZWQuIFNvIHRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnNcbiYjNDM7ICogdGhlbSB0byBiZSBcJiMzNDtwcmVzZXJ2ZWQgbWVtb3J5XCYjMzQ7IGFuZCBtYXJrcyB0aGVpciBibG9ja3MgYXMgYnVzeS5cbiYjNDM7ICpcbiYjNDM7ICogTk9URTogZWZpX2luaXQoKTo6cmVzZXJ2ZV9yZWdpb25zKCkgcmVtb3ZlcyBhbGwgcmVnaW9ucyBleGNlcHRcbiYjNDM7ICogTUVNQkxPQ0tfS0hPX1NDUkFUQ0guIFRoaXMgZnVuY3Rpb24gYWRkcyBzdWNoIHJlZ2lvbnMgYnV0IHRoZXkgYXJlIG5vdCBLSE9cbiYjNDM7ICogc2NyYXRjaCBtZW1vcnksIHNvIHRoZXkgc2hvdWxkIG5vdCBiZSByZW1vdmVkLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbHdheXMgYmVcbiYjNDM7ICogY2FsbGVkIGFmdGVyIHJlc2VydmVfcmVnaW9ucygpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgX19pbml0IGtob19leHRlbmRfc2NyYXRjaCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGtob19jYiA9IHtcbiYjNDM7XHRcdC5sZWFmID0ga2hvX2V4dF93YWxrX2xlYWYsXG4mIzQzO1x0XHQubm9kZSA9IGtob19leHRfd2Fsa19ub2RlLFxuJiM0MztcdH07XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGV4dF9jYiA9IHtcbiYjNDM7XHRcdC5sZWFmID0ga2hvX2V4dF9tYXJrX3NjcmF0Y2gsXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgcmFkaXg7XG4mIzQzO1x0cGh5c19hZGRyX3QgcHJldl9lbmQgPSAwO1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBraG9fcmFkaXhfaW5pdF90cmVlKFx1MDAyNnJhZGl4LCBOVUxMKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0Z290byBwcmludDtcbiYjNDM7XG4mIzQzO1x0LyogV2FsayB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gZmluZCBidXN5IGJsb2Nrcy4gKi9cbiYjNDM7XHRlcnIgPSBraG9fcmFkaXhfd2Fsa190cmVlKFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBcdTAwMjZraG9fY2IsIFx1MDAyNnJhZGl4KTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIFdhbGsgdGhlIGJsb2NrcyBhbmQgbWFyayBldmVyeXRoaW5nIGJldHdlZW4ga2V5cyBhcyBzY3JhdGNoLiAqL1xuJiM0MztcdGVyciA9IGtob19yYWRpeF93YWxrX3RyZWUoXHUwMDI2cmFkaXgsIFx1MDAyNmV4dF9jYiwgXHUwMDI2cHJldl9lbmQpO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LyogTWFyayBldmVyeXRoaW5nIGZyb20gbGFzdCBidXN5IGJsb2NrIHRvIGVuZCBvZiBEUkFNLiAqL1xuJiM0MztcdGlmIChwcmV2X2VuZCBcdTAwM2MgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSlcbiYjNDM7XHRcdGVyciA9IG1lbWJsb2NrX21hcmtfa2hvX3NjcmF0Y2gocHJldl9lbmQsIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkgLSBwcmV2X2VuZCk7XG4mIzQzO1xuJiM0MztcdC8qIGZhbGx0aHJvdWdoICovXG4mIzQzO291dDpcbiYjNDM7XHRraG9fcmFkaXhfZGVzdHJveV90cmVlKFx1MDAyNnJhZGl4KTtcbiYjNDM7cHJpbnQ6XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHByX2VycihcJiMzNDtGYWlsZWQgdG8gZXh0ZW5kIHNjcmF0Y2g6ICVwZVxcblwmIzM0OywgRVJSX1BUUihlcnIpKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBraG9fYWRkX3N1YnRyZWUgLSByZWNvcmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBzdWIgYmxvYiBpbiBLSE8gcm9vdCB0cmVlLlxuICAqIEBuYW1lOiBuYW1lIG9mIHRoZSBzdWIgdHJlZS5cbkBAIC04NTYsMTAgJiM0MzsxMTUyLDEyIEBAIGludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gZm9saW9fcGZuKGZvbGlvKTtcbiBcdGNvbnN0IHVuc2lnbmVkIGludCBvcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcbi1cdGlmIChXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAocGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULCBQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIG9yZGVyKSkpXG4mIzQzO1x0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCwgUEFHRV9TSVpFIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbi1cdHJldHVybiBraG9fcmFkaXhfYWRkX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4mIzQzO1x0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgIG9yZGVyKSk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9mb2xpbyk7XG4gXG5AQCAtODc3LDcgJiM0MzsxMTc1LDcgQEAgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBmb2xpb19wZm4oZm9saW8pO1xuIFx0Y29uc3QgdW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0a2hvX3JhZGl4X2RlbF9wYWdlKHRyZWUsIHBmbiwgb3JkZXIpO1xuJiM0MztcdGtob19yYWRpeF9kZWxfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksIG9yZGVyKSk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob191bnByZXNlcnZlX2ZvbGlvKTtcbiBcbkBAIC05MDYsNyAmIzQzOzEyMDQsOCBAQCBzdGF0aWMgdm9pZCBfX2tob191bnByZXNlcnZlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBcdHdoaWxlIChwZm4gXHUwMDNjIGVuZF9wZm4pIHtcbiBcdFx0b3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xuIFxuLVx0XHRraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4mIzQzO1x0XHRraG9fcmFkaXhfZGVsX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgb3JkZXIpKTtcbiBcbiBcdFx0cGZuICYjNDM7PSAxIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiBcdH1cbkBAIC05MzEsNyAmIzQzOzEyMzAsOCBAQCBpbnQga2hvX3ByZXNlcnZlX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuIFx0dW5zaWduZWQgbG9uZyBmYWlsZWRfcGZuID0gMDtcbiBcdGludCBlcnIgPSAwO1xuIFxuLVx0aWYgKFdBUk5fT04oa2hvX3NjcmF0Y2hfb3ZlcmxhcChzdGFydF9wZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsXG4mIzQzO1x0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbiBcdFx0XHRcdFx0bnJfcGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpKSkge1xuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdH1cbkBAIC05MzksNyAmIzQzOzEyMzksOCBAQCBpbnQga2hvX3ByZXNlcnZlX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuIFx0d2hpbGUgKHBmbiBcdTAwM2MgZW5kX3Bmbikge1xuIFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xuIFxuLVx0XHRlcnIgPSBraG9fcmFkaXhfYWRkX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4mIzQzO1x0XHRlcnIgPSBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLFxuJiM0MztcdFx0XHRcdFx0XHRcdFx0ICAgb3JkZXIpKTtcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGZhaWxlZF9wZm4gPSBwZm47XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTMxNSwyMiAmIzQzOzE2MTYsNiBAQCB2b2lkIGtob19yZXN0b3JlX2ZyZWUodm9pZCAqbWVtKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChraG9fcmVzdG9yZV9mcmVlKTtcbiBcbi1zdHJ1Y3Qga2hvX2luIHtcbi1cdHBoeXNfYWRkcl90IGZkdF9waHlzO1xuLVx0cGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzO1xuLVx0Y2hhciBwcmV2aW91c19yZWxlYXNlW19fTkVXX1VUU19MRU4gJiM0MzsgMV07XG4tXHR1MzIga2V4ZWNfY291bnQ7XG4tXHRzdHJ1Y3Qga2hvX2RlYnVnZnMgZGJnO1xuLX07XG4tXG4tc3RhdGljIHN0cnVjdCBraG9faW4ga2hvX2luID0ge1xuLX07XG4tXG4tc3RhdGljIGNvbnN0IHZvaWQgKmtob19nZXRfZmR0KHZvaWQpXG4te1xuLVx0cmV0dXJuIGtob19pbi5mZHRfcGh5cyA/IHBoeXNfdG9fdmlydChraG9faW4uZmR0X3BoeXMpIDogTlVMTDtcbi19XG4tXG4gLyoqXG4gICogaXNfa2hvX2Jvb3QgLSBjaGVjayBpZiBjdXJyZW50IGtlcm5lbCB3YXMgYm9vdGVkIHZpYSBLSE8tZW5hYmxlZFxuICAqIGtleGVjXG5AQCAtMTM5OCwyNiAmIzQzOzE2ODMsMjQgQEAgaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yZXRyaWV2ZV9zdWJ0cmVlKTtcbiBcbi1zdGF0aWMgaW50IF9faW5pdCBraG9fbWVtX3JldHJpZXZlKGNvbnN0IHZvaWQgKmZkdClcbiYjNDM7c3RhdGljIHZvaWQgX19pbml0IGtob19tZW1fcmV0cmlldmUodm9pZClcbiB7XG4tXHRzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgdHJlZTtcbi1cdGNvbnN0IHBoeXNfYWRkcl90ICptZW07XG4tXHRpbnQgbGVuO1xuJiM0MztcdGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiBjYiA9IHtcbiYjNDM7XHRcdC5sZWFmID0ga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSxcbiYjNDM7XHR9O1xuIFxuLVx0LyogUmV0cmlldmUgdGhlIEtITyByYWRpeCB0cmVlIGZyb20gcGFzc2VkLWluIEZEVC4gKi9cbi1cdG1lbSA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgXHUwMDI2bGVuKTtcbiYjNDM7XHRpZiAoa2hvX3JhZGl4X3dhbGtfdHJlZShcdTAwMjZraG9faW4ucmFkaXhfdHJlZSwgXHUwMDI2Y2IsIE5VTEwpKVxuJiM0MztcdFx0Z290byBlcnI7XG4gXG4tXHRpZiAoIW1lbSB8fCBsZW4gIT0gc2l6ZW9mKCptZW0pKSB7XG4tXHRcdHByX2VycihcJiMzNDtmYWlsZWQgdG8gZ2V0IHByZXNlcnZlZCBLSE8gbWVtb3J5IHRyZWVcXG5cJiMzNDspO1xuLVx0XHRyZXR1cm4gLUVOT0VOVDtcbi1cdH1cbi1cbi1cdGlmICghKm1lbSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0cmV0dXJuO1xuIFxuLVx0dHJlZS5yb290ID0gcGh5c190b192aXJ0KCptZW0pO1xuLVx0bXV0ZXhfaW5pdChcdTAwMjZ0cmVlLmxvY2spO1xuLVx0cmV0dXJuIGtob19yYWRpeF93YWxrX3RyZWUoXHUwMDI2dHJlZSwga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSk7XG4mIzQzO2VycjpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZhaWxlZCB0byBpbml0aWFsaXplIHByZXNlcnZlZCBtZW1vcnkuIENsZWFyIEZEVCBhbmQgcmFkaXggc28gS0hPXG4mIzQzO1x0ICogdXNlcnMgZG9uJiMzOTt0IHRyZWF0IGl0IGFzIGEgS0hPIGJvb3QuXG4mIzQzO1x0ICovXG4mIzQzO1x0a2hvX2luLmZkdF9waHlzID0gMDtcbiYjNDM7XHRraG9faW4ucmFkaXhfdHJlZS5yb290ID0gTlVMTDtcbiB9XG4gXG4gc3RhdGljIF9faW5pdCBpbnQga2hvX291dF9mZHRfc2V0dXAodm9pZClcbkBAIC0xNTQzLDE2ICYjNDM7MTgyNiwxNCBAQCBzdGF0aWMgX19pbml0IGludCBraG9faW5pdCh2b2lkKVxuIFx0aWYgKCFraG9fZW5hYmxlKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHRyZWUtXHUwMDNlcm9vdCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghdHJlZS1cdTAwM2Vyb290KSB7XG4tXHRcdGVyciA9IC1FTk9NRU07XG4mIzQzO1x0ZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZSh0cmVlLCBOVUxMKTtcbiYjNDM7XHRpZiAoZXJyKVxuIFx0XHRnb3RvIGVycl9mcmVlX3NjcmF0Y2g7XG4tXHR9XG4gXG4gXHRraG9fb3V0LmZkdCA9IGtob19hbGxvY19wcmVzZXJ2ZShQQUdFX1NJWkUpO1xuIFx0aWYgKElTX0VSUihraG9fb3V0LmZkdCkpIHtcbiBcdFx0ZXJyID0gUFRSX0VSUihraG9fb3V0LmZkdCk7XG4tXHRcdGdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWVfcm9vdDtcbiYjNDM7XHRcdGdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU7XG4gXHR9XG4gXG4gXHRlcnIgPSBraG9fZGVidWdmc19pbml0KCk7XG5AQCAtMTYwMyw5ICYjNDM7MTg4NCw4IEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXG4gXG4gZXJyX2ZyZWVfZmR0OlxuIFx0a2hvX3VucHJlc2VydmVfZnJlZShraG9fb3V0LmZkdCk7XG4tZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWVfcm9vdDpcbi1cdGtmcmVlKHRyZWUtXHUwMDNlcm9vdCk7XG4tXHR0cmVlLVx1MDAzZXJvb3QgPSBOVUxMO1xuJiM0MztlcnJfZnJlZV9raG9fcmFkaXhfdHJlZTpcbiYjNDM7XHRraG9fcmFkaXhfZGVzdHJveV90cmVlKHRyZWUpO1xuIGVycl9mcmVlX3NjcmF0Y2g6XG4gXHRraG9fb3V0LmZkdCA9IE5VTEw7XG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpJiM0MzsmIzQzOykge1xuQEAgLTE2MTksMTYgJiM0MzsxODk5LDQzIEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXG4gfVxuIGZzX2luaXRjYWxsKGtob19pbml0KTtcbiBcbi12b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXQodm9pZClcbiYjNDM7dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpXG4ge1xuLVx0aWYgKGtob19pbi5zY3JhdGNoX3BoeXMpIHtcbi1cdFx0a2hvX3NjcmF0Y2ggPSBwaHlzX3RvX3ZpcnQoa2hvX2luLnNjcmF0Y2hfcGh5cyk7XG4mIzQzO1x0Y29uc3Qgdm9pZCAqZmR0ID0ga2hvX2dldF9mZHQoKTtcbiBcbi1cdFx0aWYgKGtob19tZW1fcmV0cmlldmUoa2hvX2dldF9mZHQoKSkpXG4tXHRcdFx0a2hvX2luLmZkdF9waHlzID0gMDtcbi1cdH0gZWxzZSB7XG4tXHRcdGtob19yZXNlcnZlX3NjcmF0Y2goKTtcbiYjNDM7XHRpZiAoIWlzX2tob19ib290KCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICoga2hvX3NjcmF0Y2hfb3ZlcmxhcCgpIG5lZWRzIGtob19zY3JhdGNoIHRvIGJlIGluaXRpYWxpemVkLiBJdFxuJiM0MztcdCAqIGlzIHVzZWQgYnkgZnJlZV9hcmVhX2luaXQoKSBvbiBLSE8gYm9vdHMsIHNvIGluaXRpYWxpemUgaXRcbiYjNDM7XHQgKiBlYXJseS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRraG9fc2NyYXRjaCA9IHBoeXNfdG9fdmlydChraG9faW4uc2NyYXRjaF9waHlzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBraG9fZ2V0X21lbV9tYXAoKSBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuIElmIGl0IGZhaWxzLCBraG9fcG9wdWxhdGUoKVxuJiM0MztcdCAqIGNhdGNoZXMgdGhhdCBhbmQgbmV2ZXIgc2V0cyBraG9faW4uZmR0X3BoeXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGtob19yYWRpeF9pbml0X3RyZWUoXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIGtob19nZXRfbWVtX21hcChmZHQpKSkge1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIEZhaWxlZCB0byBpbml0aWFsaXplIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZS4gQ2xlYXIgRkRUXG4mIzQzO1x0XHQgKiBhbmQgc2NyYXRjaCBzbyBLSE8gdXNlcnMgZG9uJiMzOTt0IHRyZWF0IGl0IGFzIGEgS0hPIGJvb3QuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGtob19pbi5mZHRfcGh5cyA9IDA7XG4mIzQzO1x0XHRraG9faW4uc2NyYXRjaF9waHlzID0gMDtcbiYjNDM7XHRcdHJldHVybjtcbiBcdH1cbiYjNDM7XG4mIzQzO1x0a2hvX2V4dGVuZF9zY3JhdGNoKCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGtob19pbi5zY3JhdGNoX3BoeXMpXG4mIzQzO1x0XHRraG9fbWVtX3JldHJpZXZlKCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0a2hvX3Jlc2VydmVfc2NyYXRjaCgpO1xuIH1cbiBcbiB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuQEAgLTE2MzYsOSAmIzQzOzE5NDMsOCBAQCB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuIHtcbiBcdHVuc2lnbmVkIGludCBzY3JhdGNoX2NudCA9IHNjcmF0Y2hfbGVuIC8gc2l6ZW9mKCpraG9fc2NyYXRjaCk7XG4gXHRzdHJ1Y3Qga2hvX3NjcmF0Y2ggKnNjcmF0Y2ggPSBOVUxMO1xuLVx0cGh5c19hZGRyX3QgbWVtX21hcF9waHlzO1xuLVx0dm9pZCAqZmR0ID0gTlVMTDtcbiBcdGJvb2wgcG9wdWxhdGVkID0gZmFsc2U7XG4mIzQzO1x0dm9pZCAqZmR0ID0gTlVMTDtcbiBcdGludCBlcnI7XG4gXG4gXHQvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgRkRUICovXG5AQCAtMTY2MCw4ICYjNDM7MTk2NiwxMyBAQCB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuIFx0XHRnb3RvIHVubWFwX2ZkdDtcbiBcdH1cbiBcbi1cdG1lbV9tYXBfcGh5cyA9IGtob19nZXRfbWVtX21hcF9waHlzKGZkdCk7XG4tXHRpZiAoIW1lbV9tYXBfcGh5cylcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEF0IHRoaXMgcG9pbnQgcGh5c190b192aXJ0KCkgZG9lc24mIzM5O3Qgd29yayBwcm9wZXJseSBhbmQgc29cbiYjNDM7XHQgKiBraG9fZ2V0X21lbV9tYXAoKSBjYW4gcmV0dXJuIGEgcHJlLUtBU0xSIHZpcnR1YWwgYWRkcmVzcy4gQnV0IGhlcmUgd2VcbiYjNDM7XHQgKiBvbmx5IHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBtZW1fbWFwIGlzIHZhbGlkIHNvIHRoZSBhY3R1YWwgdmFsdWVcbiYjNDM7XHQgKiBkb2VzbiYjMzk7dCBtYXR0ZXIgYXMgbG9uZyBhcyBpdCBpc24mIzM5O3QgTlVMTC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWtob19nZXRfbWVtX21hcChmZHQpKVxuIFx0XHRnb3RvIHVubWFwX2ZkdDtcbiBcbiBcdHNjcmF0Y2ggPSBlYXJseV9tZW1yZW1hcChzY3JhdGNoX3BoeXMsIHNjcmF0Y2hfbGVuKTtcbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfZGVidWcuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA2ZWZiNjk2ZjU0MjYxMi4uMDAwMDAwMDAwMDAwMDBcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2RlYnVnLmNcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDI1ICYjNDM7MCwwIEBAXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLS8qXG4tICoga2V4ZWNfaGFuZG92ZXJfZGVidWcuYyAtIGtleGVjIGhhbmRvdmVyIG9wdGlvbmFsIGRlYnVnIGZ1bmN0aW9uYWxpdHlcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMjUgR29vZ2xlIExMQywgUGFzaGEgVGF0YXNoaW4gXHUwMDNjcGFzaGEudGF0YXNoaW5Ac29sZWVuLmNvbVx1MDAzZVxuLSAqL1xuLVxuLSNkZWZpbmUgcHJfZm10KGZtdCkgXCYjMzQ7S0hPOiBcJiMzNDsgZm10XG4tXG4tI2luY2x1ZGUgXCYjMzQ7a2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaFwmIzM0O1xuLVxuLWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbi17XG4tXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3N0YXJ0LCBzY3JhdGNoX2VuZDtcbi1cdHVuc2lnbmVkIGludCBpO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpJiM0MzsmIzQzOykge1xuLVx0XHRzY3JhdGNoX3N0YXJ0ID0ga2hvX3NjcmF0Y2hbaV0uYWRkcjtcbi1cdFx0c2NyYXRjaF9lbmQgPSBraG9fc2NyYXRjaFtpXS5hZGRyICYjNDM7IGtob19zY3JhdGNoW2ldLnNpemU7XG4tXG4tXHRcdGlmIChwaHlzIFx1MDAzYyBzY3JhdGNoX2VuZCBcdTAwMjZcdTAwMjYgKHBoeXMgJiM0Mzsgc2l6ZSkgXHUwMDNlIHNjcmF0Y2hfc3RhcnQpXG4tXHRcdFx0cmV0dXJuIHRydWU7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2ludGVybmFsLmggYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG5pbmRleCAwMzk5ZmYxMDc3NzUwYi4uODA1ZDJhNzZjMzg4MTggMTAwNjQ0XG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG5AQCAtNDEsMTMgJiM0Mzs0MSw0IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBraG9fZGVidWdmc19ibG9iX3JlbW92ZShzdHJ1Y3Qga2hvX2RlYnVnZnMgKmRiZyxcbiBcdFx0XHRcdFx0ICAgdm9pZCAqYmxvYikgeyB9XG4gI2VuZGlmIC8qIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVR0ZTICovXG4gXG4tI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVR1xuLWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSk7XG4tI2Vsc2Vcbi1zdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbi17XG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLSNlbmRpZiAvKiBDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcgKi9cbi1cbiAjZW5kaWYgLyogTElOVVhfS0VYRUNfSEFORE9WRVJfSU5URVJOQUxfSCAqL1xuZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuY1xuaW5kZXggNTcxMjEyYjgwODM1ZWMuLmFiNGFmYzgxOGU4Y2JkIDEwMDY0NFxuLS0tIGEvbW0vaHVnZXRsYi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9odWdldGxiLmNcbkBAIC0zMDMzLDI5ICYjNDM7MzAzMywyMSBAQCBzdGF0aWMgX19pbml0IHZvaWQgKmFsbG9jX2Jvb3RtZW0oc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZCwgYm9vbCBub2RlX2V4YWN0KVxuIFx0aWYgKGh1Z2V0bGJfZWFybHlfY21hKGgpKVxuIFx0XHRtID0gaHVnZXRsYl9jbWFfYWxsb2NfYm9vdG1lbShoLCBcdTAwMjZsaXN0bm9kZSwgbm9kZV9leGFjdCk7XG4gXHRlbHNlIHtcbi1cdFx0aWYgKG5vZGVfZXhhY3QpXG4tXHRcdFx0bSA9IG1lbWJsb2NrX2FsbG9jX2V4YWN0X25pZF9yYXcoaHVnZV9wYWdlX3NpemUoaCksXG4tXHRcdFx0XHRodWdlX3BhZ2Vfc2l6ZShoKSwgMCxcbi1cdFx0XHRcdE1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUsIG5pZCk7XG4tXHRcdGVsc2Uge1xuLVx0XHRcdG0gPSBtZW1ibG9ja19hbGxvY190cnlfbmlkX3JhdyhodWdlX3BhZ2Vfc2l6ZShoKSxcbi1cdFx0XHRcdGh1Z2VfcGFnZV9zaXplKGgpLCAwLFxuLVx0XHRcdFx0TUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRSwgbmlkKTtcbiYjNDM7XHRcdG0gPSBtZW1ibG9ja19hbGxvY19odWdldGxiKGh1Z2VfcGFnZV9zaXplKGgpLCBuaWQsIG5vZGVfZXhhY3QpO1xuJiM0MztcdFx0aWYgKG0pIHtcbiYjNDM7XHRcdFx0bS1cdTAwM2VmbGFncyA9IDA7XG4mIzQzO1x0XHRcdG0tXHUwMDNlY21hID0gTlVMTDtcbiYjNDM7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiBGb3IgcHJlLUhWTyB0byB3b3JrIGNvcnJlY3RseSwgcGFnZXMgbmVlZCB0byBiZSBvblxuIFx0XHRcdCAqIHRoZSBsaXN0IGZvciB0aGUgbm9kZSB0aGV5IHdlcmUgYWN0dWFsbHkgYWxsb2NhdGVkXG4gXHRcdFx0ICogZnJvbS4gVGhhdCBub2RlIG1heSBiZSBkaWZmZXJlbnQgaW4gdGhlIGNhc2Ugb2Zcbi1cdFx0XHQgKiBmYWxsYmFjayBieSBtZW1ibG9ja19hbGxvY190cnlfbmlkX3Jhdy4gU28sXG4mIzQzO1x0XHRcdCAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJfYm9vdG1lbS4gU28sXG4gXHRcdFx0ICogZXh0cmFjdCB0aGUgYWN0dWFsIG5vZGUgZmlyc3QuXG4gXHRcdFx0ICovXG4tXHRcdFx0aWYgKG0pXG4mIzQzO1x0XHRcdGlmICghbm9kZV9leGFjdClcbiBcdFx0XHRcdGxpc3Rub2RlID0gZWFybHlfcGZuX3RvX25pZChQSFlTX1BGTihfX3BhKG0pKSk7XG4gXHRcdH1cbi1cbi1cdFx0aWYgKG0pIHtcbi1cdFx0XHRtLVx1MDAzZWZsYWdzID0gMDtcbi1cdFx0XHRtLVx1MDAzZWNtYSA9IE5VTEw7XG4tXHRcdH1cbiBcdH1cbiBcbiBcdGlmIChtKSB7XG5kaWZmIC0tZ2l0IGEvbW0vbWVtYmxvY2suYyBiL21tL21lbWJsb2NrLmNcbmluZGV4IDYzNDljNDgxNTRmNGIxLi5jMTBkZmIwNTQ4MDZhNyAxMDA2NDRcbi0tLSBhL21tL21lbWJsb2NrLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbWJsb2NrLmNcbkBAIC0xNTA2LDYgJiM0MzsxNTA2LDMyIEBAIGludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfc2V0X25vZGUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSxcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7c3RhdGljIHZvaWQgbWVtYmxvY2tfcHJlcF9hbGxvY2F0aW9uKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBzaXplLFxuJiM0MztcdFx0XHRcdCAgICAgYm9vbCBsZWFrdHJhY2UpXG4mIzQzO3tcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNraXAga21lbWxlYWsgZm9yIHRob3NlIHBsYWNlcyBsaWtlIGthc2FuX2luaXQoKSBhbmRcbiYjNDM7XHQgKiBlYXJseV9wZ3RhYmxlX2FsbG9jKCkgZHVlIHRvIGhpZ2ggdm9sdW1lLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChsZWFrdHJhY2UpXG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogTWVtYmxvY2sgYWxsb2NhdGVkIGJsb2NrcyBhcmUgbmV2ZXIgcmVwb3J0ZWQgYXNcbiYjNDM7XHRcdCAqIGxlYWtzLiBUaGlzIGlzIGJlY2F1c2UgbWFueSBvZiB0aGVzZSBibG9ja3MgYXJlXG4mIzQzO1x0XHQgKiBvbmx5IHJlZmVycmVkIHZpYSB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGljaCBpc1xuJiM0MztcdFx0ICogbm90IGxvb2tlZCB1cCBieSBrbWVtbGVhay5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0a21lbWxlYWtfYWxsb2NfcGh5cyhzdGFydCwgc2l6ZSwgMCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU29tZSBWaXJ0dWFsIE1hY2hpbmUgcGxhdGZvcm1zLCBzdWNoIGFzIEludGVsIFREWCBvciBBTUQgU0VWLVNOUCxcbiYjNDM7XHQgKiByZXF1aXJlIG1lbW9yeSB0byBiZSBhY2NlcHRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgdGhlXG4mIzQzO1x0ICogZ3Vlc3QuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBBY2NlcHQgdGhlIG1lbW9yeSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRhY2NlcHRfbWVtb3J5KHN0YXJ0LCBzaXplKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBtZW1ibG9ja19hbGxvY19yYW5nZV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9ja1xuICAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXNcbkBAIC0xNTgwLDI4ICYjNDM7MTYwNiw3IEBAIHBoeXNfYWRkcl90IF9faW5pdCBtZW1ibG9ja19hbGxvY19yYW5nZV9uaWQocGh5c19hZGRyX3Qgc2l6ZSxcbiBcdHJldHVybiAwO1xuIFxuIGRvbmU6XG4tXHQvKlxuLVx0ICogU2tpcCBrbWVtbGVhayBmb3IgdGhvc2UgcGxhY2VzIGxpa2Uga2FzYW5faW5pdCgpIGFuZFxuLVx0ICogZWFybHlfcGd0YWJsZV9hbGxvYygpIGR1ZSB0byBoaWdoIHZvbHVtZS5cbi1cdCAqL1xuLVx0aWYgKGVuZCAhPSBNRU1CTE9DS19BTExPQ19OT0xFQUtUUkFDRSlcbi1cdFx0Lypcbi1cdFx0ICogTWVtYmxvY2sgYWxsb2NhdGVkIGJsb2NrcyBhcmUgbmV2ZXIgcmVwb3J0ZWQgYXNcbi1cdFx0ICogbGVha3MuIFRoaXMgaXMgYmVjYXVzZSBtYW55IG9mIHRoZXNlIGJsb2NrcyBhcmVcbi1cdFx0ICogb25seSByZWZlcnJlZCB2aWEgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hpY2ggaXNcbi1cdFx0ICogbm90IGxvb2tlZCB1cCBieSBrbWVtbGVhay5cbi1cdFx0ICovXG4tXHRcdGttZW1sZWFrX2FsbG9jX3BoeXMoZm91bmQsIHNpemUsIDApO1xuLVxuLVx0Lypcbi1cdCAqIFNvbWUgVmlydHVhbCBNYWNoaW5lIHBsYXRmb3Jtcywgc3VjaCBhcyBJbnRlbCBURFggb3IgQU1EIFNFVi1TTlAsXG4tXHQgKiByZXF1aXJlIG1lbW9yeSB0byBiZSBhY2NlcHRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgdGhlXG4tXHQgKiBndWVzdC5cbi1cdCAqXG4tXHQgKiBBY2NlcHQgdGhlIG1lbW9yeSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci5cbi1cdCAqL1xuLVx0YWNjZXB0X21lbW9yeShmb3VuZCwgc2l6ZSk7XG4tXG4mIzQzO1x0bWVtYmxvY2tfcHJlcF9hbGxvY2F0aW9uKGZvdW5kLCBzaXplLCBlbmQgIT0gTUVNQkxPQ0tfQUxMT0NfTk9MRUFLVFJBQ0UpO1xuIFx0cmV0dXJuIGZvdW5kO1xuIH1cbiBcbkBAIC0xNzU2LDYgJiM0MzsxNzYxLDY5IEBAIHZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoXG4gXHRcdFx0XHQgICAgICAgZmFsc2UpO1xuIH1cbiBcbiYjNDM7LyoqXG4mIzQzOyAqIG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBmb3IgSHVnZVRMQiBwYWdlc1xuJiM0MzsgKiBAc2l6ZTogICAgICBzaXplIG9mIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzXG4mIzQzOyAqIEBuaWQ6ICAgICAgIG5pZCBvZiB0aGUgZnJlZSBtZW1vcnkgdG8gZmluZCwgJU5VTUFfTk9fTk9ERSBmb3IgYW55IG5vZGVcbiYjNDM7ICogQGV4YWN0X25pZDogb25seSBhbGxvY2F0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgbmlkLiBJZiAlZmFsc2UsIHRoZSBzcGVjaWZpZWRcbiYjNDM7ICogICAgICAgICAgICAgbmlkIGlzIHRyaWVkIGZpcnN0LCBhbmQgdGhlbiBhbGwgbm9kZXMgYXJlIHRyaWVkIGFzIGZhbGxiYWNrLlxuJiM0MzsgKlxuJiM0MzsgKiBIdWdlVExCIHBhZ2VzIGFyZSBhbHdheXMgYWxpZ25lZCBieSB0aGVpciBzaXplLCBzbyB0aGUgYWxpZ25tZW50IG1hdGNoZXNcbiYjNDM7ICogQHNpemUuIFNpbmNlIHRoZSBtZW1vcnkgaXMgZm9yIHVzZXJzcGFjZSwgbWlycm9yZWQgbWVtb3J5IGlzIG5vdCB1c2VkLiBUaGVcbiYjNDM7ICogbWVtb3J5IGlzIG5vdCB6ZXJvZWQuIERvZXMgbm90IHBhbmljIGlmIHJlcXVlc3QgY2Fubm90IGJlIHNhdGlzZmllZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOlxuJiM0MzsgKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvbiBzdWNjZXNzLCAlTlVMTCBvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxuJiM0Mzt7XG4mIzQzO1x0ZW51bSBtZW1ibG9ja19mbGFncyBmbGFncyA9IGNob29zZV9tZW1ibG9ja19mbGFncygpO1xuJiM0MztcdHBoeXNfYWRkcl90IGFkZHIsIHN0YXJ0ID0gMCwgZW5kID0gTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRTtcbiYjNDM7XG4mIzQzO1x0bWVtYmxvY2tfZGJnKFwmIzM0OyVzOiAlbGx1IGJ5dGVzLCBuaWQ9JWQsIGV4YWN0X25pZD0lZCAlcFNcXG5cJiMzNDssIF9fZnVuY19fLFxuJiM0MztcdFx0ICAgICAodTY0KXNpemUsIG5pZCwgZXhhY3RfbmlkLCAodm9pZCAqKV9SRVRfSVBfKTtcbiYjNDM7XG4mIzQzO1x0LyogRG9uJiMzOTt0IHdhc3RlIG1pcnJvcmVkIG1lbW9yeSBvbiBIdWdlVExCIHBhZ2VzLiAqL1xuJiM0MztcdGZsYWdzIFx1MDAyNj0gfk1FTUJMT0NLX01JUlJPUjtcbiYjNDM7cmV0cnk6XG4mIzQzO1x0LyogSHVnZVRMQiBwYWdlcyBhcmUgYWx3YXlzIGFsaWduZWQgYnkgdGhlaXIgc2l6ZS4gKi9cbiYjNDM7XHRhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZV9ub2RlKHNpemUsIHNpemUsIHN0YXJ0LCBlbmQsIG5pZCwgZmxhZ3MpO1xuJiM0MztcdGlmIChhZGRyKVxuJiM0MztcdFx0Z290byBmb3VuZDtcbiYjNDM7XG4mIzQzO1x0LyogVHJ5IGFsbCBub2RlcyBpZiBhbGxvd2VkLiAqL1xuJiM0MztcdGlmIChudW1hX3ZhbGlkX25vZGUobmlkKSBcdTAwMjZcdTAwMjYgIWV4YWN0X25pZCkge1xuJiM0MztcdFx0bmlkID0gTlVNQV9OT19OT0RFO1xuJiM0MztcdFx0Z290byByZXRyeTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEZvdW5kIG5vdGhpbmcuLi4gOi0oICovXG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0Mztmb3VuZDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEh1Z2VUTEIgcGFnZXMgY2FuIGJlIHByZXNlcnZlZCB3aXRoIEtITyBhbmQgbm8gcHJlc2VydmVkIG1lbW9yeSBjYW5cbiYjNDM7XHQgKiBiZSBpbiBzY3JhdGNoLiBTbyByZXRyeSBpZiBmb3VuZCBhZGRyZXNzIG92ZXJsYXBzIHdpdGggc2NyYXRjaC5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIFNjcmF0Y2ggYXJlYXMgYXJlIG5vcm1hbGx5IG5vdCB2ZXJ5IGxhcmdlLCBzbyB0aGlzIHNob3VsZG4mIzM5O3QgdGFrZSB0b29cbiYjNDM7XHQgKiBtYW55IHJldHJpZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGtob19zY3JhdGNoX292ZXJsYXAoYWRkciwgc2l6ZSkpIHtcbiYjNDM7XHRcdGlmIChtZW1ibG9ja19ib3R0b21fdXAoKSlcbiYjNDM7XHRcdFx0c3RhcnQgPSBhZGRyICYjNDM7IHNpemU7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdHN0YXJ0ID0gYWRkciAtIHNpemU7XG4mIzQzO1xuJiM0MztcdFx0Z290byByZXRyeTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChfX21lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSwgbmlkLCBNRU1CTE9DS19SU1JWX0tFUk4gfCBNRU1CTE9DS19SU1JWX0hVR0VUTEIpKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihhZGRyLCBzaXplLCB0cnVlKTtcbiYjNDM7XHRyZXR1cm4gcGh5c190b192aXJ0KGFkZHIpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIG1lbWJsb2NrX2FsbG9jX3RyeV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9ja1xuICAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXNcbkBAIC0xODI1LDYgJiM0MzsxODkzLDI4IEBAIHBoeXNfYWRkcl90IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19yZXNlcnZlZF9zaXplKHZvaWQpXG4gXHRyZXR1cm4gbWVtYmxvY2sucmVzZXJ2ZWQudG90YWxfc2l6ZTtcbiB9XG4gXG4mIzQzO3BoeXNfYWRkcl90IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUocGh5c19hZGRyX3QgbGltaXQsIGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuJiM0MztcdHBoeXNfYWRkcl90IHRvdGFsID0gMDtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfcmVzZXJ2ZWRfbWVtX3JlZ2lvbihyKSB7XG4mIzQzO1x0XHRwaHlzX2FkZHJfdCBzaXplID0gci1cdTAwM2VzaXplO1xuJiM0MztcbiYjNDM7XHRcdGlmIChyLVx1MDAzZWJhc2UgXHUwMDNlIGxpbWl0KVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoci1cdTAwM2ViYXNlICYjNDM7IHItXHUwMDNlc2l6ZSBcdTAwM2UgbGltaXQpXG4mIzQzO1x0XHRcdHNpemUgPSBsaW1pdCAtIHItXHUwMDNlYmFzZTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobmlkID09IG1lbWJsb2NrX2dldF9yZWdpb25fbm9kZShyKSB8fCAhbnVtYV92YWxpZF9ub2RlKG5pZCkpXG4mIzQzO1x0XHRcdGlmIChyLVx1MDAzZWZsYWdzIFx1MDAyNiBNRU1CTE9DS19SU1JWX0hVR0VUTEIpXG4mIzQzO1x0XHRcdFx0dG90YWwgJiM0Mzs9IHNpemU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdG90YWw7XG4mIzQzO31cbiYjNDM7XG4gcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcbiB7XG4gXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuQEAgLTI1MTEsMTYgJiM0MzsyNjAxLDYgQEAgX19pbml0IHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKVxuIHtcbiBcdGtob19zY3JhdGNoX29ubHkgPSBmYWxzZTtcbiB9XG4tXG4tYm9vbCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpXG4te1xuLVx0aW50IGkgPSBtZW1ibG9ja19zZWFyY2goXHUwMDI2bWVtYmxvY2subWVtb3J5LCBhZGRyKTtcbi1cbi1cdGlmIChpID09IC0xKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHRyZXR1cm4gbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2goXHUwMDI2bWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbaV0pO1xuLX1cbiAjZW5kaWZcbiBcbiAjaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSXG5kaWZmIC0tZ2l0IGEvbW0vbW1faW5pdC5jIGIvbW0vbW1faW5pdC5jXG5pbmRleCAwZjY0OTA5ZThkMjBlMi4uMWQyZjMwMmQ4Y2Q5YzEgMTAwNjQ0XG4tLS0gYS9tbS9tbV9pbml0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21tX2luaXQuY1xuQEAgLTcwNyw5ICYjNDM7NzA3LDEwIEBAIHZvaWQgX19tZW1pbml0IF9faW5pdF9wYWdlX2Zyb21fbmlkKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuIFx0X19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBmbiwgemlkLCBuaWQpO1xuIFxuIFx0aWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpIHtcbi1cdFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XG4tXHRcdFx0a2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBNSUdSQVRFX01PVkFCTEUpO1xuLVx0XHRpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwZm5fdG9fcGFnZShwZm4pLCBtdCwgZmFsc2UpO1xuJiM0MztcdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgTUlHUkFURV9NT1ZBQkxFLFxuJiM0MztcdFx0XHRcdFx0ICAgZmFsc2UpO1xuJiM0MztcdFx0LyogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgaW4gY2FzZSBpdCBpcyBLSE8gc2NyYXRjaC4gKi9cbiYjNDM7XHRcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBwZm4gJiM0MzsgMSk7XG4gXHR9XG4gfVxuIFxuQEAgLTkzOCwxMyAmIzQzOzkzOSwyMiBAQCB2b2lkIF9fbWVtaW5pdCBtZW1tYXBfaW5pdF9yYW5nZSh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZVxuIFx0XHR9XG4gXHRcdHBmbiYjNDM7JiM0Mzs7XG4gXHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgZm9yIGFueSBwYWdlYmxvY2tzIHRoYXQgZmFsbCBpbiBhIEtITyBzY3JhdGNoXG4mIzQzO1x0ICogYXJlYS4gRG8gdGhpcyBoZXJlIG91dHNpZGUgdGhlIGxvb3AgYmVjYXVzZSBtb3N0IHBhZ2VibG9ja3Mgd2lsbCBub3RcbiYjNDM7XHQgKiBiZSBLSE8gc2NyYXRjaCwgc28gb25seSBzZWFyY2ggb25jZS5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIE9ubHkgcGFnZWJsb2NrcyB1cCB0byBwZm4gYXJlIHVwZGF0ZWQsIGRlZmVycmVkIHBhZ2VibG9ja3Mgd2lsbCBiZVxuJiM0MztcdCAqIHVwZGF0ZWQgbGF0ZXIuXG4mIzQzO1x0ICovXG4mIzQzO1x0a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIHBmbik7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdF96b25lX3JhbmdlKHN0cnVjdCB6b25lICp6b25lLFxuIFx0XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbixcbi1cdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nICpob2xlX3Bmbixcbi1cdFx0XHRcdFx0ICBlbnVtIG1pZ3JhdGV0eXBlIG10KVxuJiM0MztcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nICpob2xlX3BmbilcbiB7XG4gXHR1bnNpZ25lZCBsb25nIHpvbmVfc3RhcnRfcGZuID0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbjtcbiBcdHVuc2lnbmVkIGxvbmcgem9uZV9lbmRfcGZuID0gem9uZV9zdGFydF9wZm4gJiM0Mzsgem9uZS1cdTAwM2VzcGFubmVkX3BhZ2VzO1xuQEAgLTk1Nyw3ICYjNDM7OTY3LDggQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0X3pvbmVfcmFuZ2Uoc3RydWN0IHpvbmUgKnpvbmUsXG4gXHRcdHJldHVybjtcbiBcbiBcdG1lbW1hcF9pbml0X3JhbmdlKGVuZF9wZm4gLSBzdGFydF9wZm4sIG5pZCwgem9uZV9pZCwgc3RhcnRfcGZuLFxuLVx0XHRcdCAgem9uZV9lbmRfcGZuLCBNRU1JTklUX0VBUkxZLCBOVUxMLCBtdCwgZmFsc2UpO1xuJiM0MztcdFx0XHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxuJiM0MztcdFx0XHQgIGZhbHNlKTtcbiBcbiBcdGlmICgqaG9sZV9wZm4gXHUwMDNjIHN0YXJ0X3BmbilcbiBcdFx0aW5pdF91bmF2YWlsYWJsZV9yYW5nZSgqaG9sZV9wZm4sIHN0YXJ0X3Bmbiwgem9uZV9pZCwgbmlkKTtcbkBAIC05NzMsOCAmIzQzOzk4NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdCh2b2lkKVxuIFxuIFx0Zm9yX2VhY2hfbWVtX3Bmbl9yYW5nZShpLCBNQVhfTlVNTk9ERVMsIFx1MDAyNnN0YXJ0X3BmbiwgXHUwMDI2ZW5kX3BmbiwgXHUwMDI2bmlkKSB7XG4gXHRcdHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZSA9IE5PREVfREFUQShuaWQpO1xuLVx0XHRlbnVtIG1pZ3JhdGV0eXBlIG10ID1cbi1cdFx0XHRraG9fc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIE1JR1JBVEVfTU9WQUJMRSk7XG4gXG4gXHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIE1BWF9OUl9aT05FUzsgaiYjNDM7JiM0MzspIHtcbiBcdFx0XHRzdHJ1Y3Qgem9uZSAqem9uZSA9IG5vZGUtXHUwMDNlbm9kZV96b25lcyAmIzQzOyBqO1xuQEAgLTk4Myw3ICYjNDM7OTkyLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0KHZvaWQpXG4gXHRcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0XHRtZW1tYXBfaW5pdF96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgZW5kX3Bmbixcbi1cdFx0XHRcdFx0ICAgICAgIFx1MDAyNmhvbGVfcGZuLCBtdCk7XG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2aG9sZV9wZm4pO1xuIFx0XHRcdHpvbmVfaWQgPSBqO1xuIFx0XHR9XG4gXHR9XG5AQCAtMTk3Myw3ICYjNDM7MTk4Miw3IEBAIHVuc2lnbmVkIGxvbmcgX19pbml0IG5vZGVfbWFwX3Bmbl9hbGlnbm1lbnQodm9pZClcbiBcbiAjaWZkZWYgQ09ORklHX0RFRkVSUkVEX1NUUlVDVF9QQUdFX0lOSVRcbiBzdGF0aWMgdm9pZCBfX2luaXQgZGVmZXJyZWRfZnJlZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcywgZW51bSBtaWdyYXRldHlwZSBtdClcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHR1bnNpZ25lZCBsb25nIGk7XG5AQCAtMTk4NSw4ICYjNDM7MTk5NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxuIFxuIFx0LyogRnJlZSBhIGxhcmdlIG5hdHVyYWxseS1hbGlnbmVkIGNodW5rIGlmIHBvc3NpYmxlICovXG4gXHRpZiAobnJfcGFnZXMgPT0gTUFYX09SREVSX05SX1BBR0VTIFx1MDAyNlx1MDAyNiBJU19NQVhfT1JERVJfQUxJR05FRChwZm4pKSB7XG4tXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpICYjNDM7PSBwYWdlYmxvY2tfbnJfcGFnZXMpXG4tXHRcdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGFnZSAmIzQzOyBpLCBtdCwgZmFsc2UpO1xuIFx0XHRfX2ZyZWVfcGFnZXNfY29yZShwYWdlLCBNQVhfUEFHRV9PUkRFUiwgTUVNSU5JVF9FQVJMWSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xOTk0LDExICYjNDM7MjAwMSw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxuIFx0LyogQWNjZXB0IGNodW5rcyBzbWFsbGVyIHRoYW4gTUFYX1BBR0VfT1JERVIgdXBmcm9udCAqL1xuIFx0YWNjZXB0X21lbW9yeShQRk5fUEhZUyhwZm4pLCBucl9wYWdlcyAqIFBBR0VfU0laRSk7XG4gXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzssIHBhZ2UmIzQzOyYjNDM7LCBwZm4mIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlYmxvY2tfYWxpZ25lZChwZm4pKVxuLVx0XHRcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIG10LCBmYWxzZSk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7LCBwYWdlJiM0MzsmIzQzOywgcGZuJiM0MzsmIzQzOylcbiBcdFx0X19mcmVlX3BhZ2VzX2NvcmUocGFnZSwgMCwgTUVNSU5JVF9FQVJMWSk7XG4tXHR9XG4gfVxuIFxuIC8qIENvbXBsZXRpb24gdHJhY2tpbmcgZm9yIGRlZmVycmVkX2luaXRfbWVtbWFwKCkgdGhyZWFkcyAqL1xuQEAgLTIwMTcsMTUgJiM0MzsyMDIxLDI5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGdkYXRfaW5pdF9yZXBvcnRfb25lX2RvbmUodm9pZClcbiAgKiBSZXR1cm4gbnVtYmVyIG9mIHBhZ2VzIGluaXRpYWxpemVkLlxuICAqL1xuIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkZWZlcnJlZF9pbml0X3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLFxuLVx0XHR1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiB7XG4gXHRpbnQgbmlkID0gem9uZV90b19uaWQoem9uZSk7XG4tXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX3BmbiAtIHBmbjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX3BmbiAtIHN0YXJ0X3BmbiwgcGZuID0gc3RhcnRfcGZuO1xuIFx0aW50IHppZCA9IHpvbmVfaWR4KHpvbmUpO1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pO1xuIFxuIFx0Zm9yICg7IHBmbiBcdTAwM2MgZW5kX3BmbjsgcGZuJiM0MzsmIzQzOywgcGFnZSYjNDM7JiM0MzspXG4gXHRcdF9faW5pdF9zaW5nbGVfcGFnZShwYWdlLCBwZm4sIHppZCwgbmlkKTtcbiYjNDM7XG4mIzQzO1x0LyogTm93IGluaXRpYWxpemUgbWlncmF0ZSB0eXBlcyBmb3IgdGhlc2UgcGFnZXMuICovXG4mIzQzO1x0cGZuID0gcGFnZWJsb2NrX2FsaWduKHN0YXJ0X3Bmbik7XG4mIzQzO1x0cGFnZSA9IHBmbl90b19wYWdlKHBmbik7XG4mIzQzO1x0Zm9yICg7IHBmbiBcdTAwM2MgZW5kX3BmbjsgcGZuICYjNDM7PSBwYWdlYmxvY2tfbnJfcGFnZXMsIHBhZ2UgJiM0Mzs9IHBhZ2VibG9ja19ucl9wYWdlcylcbiYjNDM7XHRcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIE1JR1JBVEVfTU9WQUJMRSwgZmFsc2UpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGZvciBhbnkgcGFnZWJsb2NrcyB0aGF0IGZhbGwgaW4gYSBLSE8gc2NyYXRjaFxuJiM0MztcdCAqIGFyZWEuIFNpbmNlIG1vc3QgcGFnZWJsb2NrcyB3aWxsIG5vdCBiZSBLSE8gc2NyYXRjaCwgZG8gaXQgb3V0c2lkZVxuJiM0MztcdCAqIHRoZSBsb29wIHRvIG9ubHkgZG8gdGhlIHNlYXJjaCBvbmNlLlxuJiM0MztcdCAqL1xuJiM0MztcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBlbmRfcGZuKTtcbiYjNDM7XG4gXHRyZXR1cm4gbnJfcGFnZXM7XG4gfVxuIFxuQEAgLTIwNTQsOCAmIzQzOzIwNzIsNiBAQCBkZWZlcnJlZF9pbml0X21lbW1hcF9jaHVuayh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuLFxuIFx0Zm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgbmlkLCAwLCBcdTAwMjZzdGFydCwgXHUwMDI2ZW5kLCBOVUxMKSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgc3BmbiA9IFBGTl9VUChzdGFydCk7XG4gXHRcdHVuc2lnbmVkIGxvbmcgZXBmbiA9IFBGTl9ET1dOKGVuZCk7XG4tXHRcdGVudW0gbWlncmF0ZXR5cGUgbXQgPVxuLVx0XHRcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHNwZm4sIE1JR1JBVEVfTU9WQUJMRSk7XG4gXG4gXHRcdGlmIChzcGZuIFx1MDAzZT0gZW5kX3BmbilcbiBcdFx0XHRicmVhaztcbkBAIC0yMDY4LDcgJiM0MzsyMDg0LDcgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcbiBcdFx0XHR1bnNpZ25lZCBsb25nIGNodW5rX2VuZCA9IG1pbihtb19wZm4sIGVwZm4pO1xuIFxuIFx0XHRcdG5yX3BhZ2VzICYjNDM7PSBkZWZlcnJlZF9pbml0X3BhZ2VzKHpvbmUsIHNwZm4sIGNodW5rX2VuZCk7XG4tXHRcdFx0ZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZuLCBjaHVua19lbmQgLSBzcGZuLCBtdCk7XG4mIzQzO1x0XHRcdGRlZmVycmVkX2ZyZWVfcGFnZXMoc3BmbiwgY2h1bmtfZW5kIC0gc3Bmbik7XG4gXG4gXHRcdFx0c3BmbiA9IGNodW5rX2VuZDtcbiBcbkBAIC0yNjg3LDYgJiM0MzsyNzAzLDcgQEAgdm9pZCBfX2luaXQgX193ZWFrIG1lbV9pbml0KHZvaWQpXG4gXG4gdm9pZCBfX2luaXQgbW1fY29yZV9pbml0X2Vhcmx5KHZvaWQpXG4ge1xuJiM0MztcdGtob19tZW1vcnlfaW5pdF9lYXJseSgpO1xuIFx0aHVnZXRsYl9jbWFfcmVzZXJ2ZSgpO1xuIFx0aHVnZXRsYl9ib290bWVtX2FsbG9jKCk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oIGIvdG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oXG5pbmRleCBiNmIxZDE0N2ZkNzUwZS4uZTg2YmI5MDAwYjIyZjggMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaFxuQEAgLTY2LDQgJiM0Mzs2Niw5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2RlZmVycmVkX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpXG4gXG4gI2RlZmluZSBfX1NldFBhZ2VSZXNlcnZlZChwKVx0KCh2b2lkKShwKSlcbiBcbiYjNDM7c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4gI2VuZGlmXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S0VYRUNfSEFORE9WRVImIzM0OywKICAgICYjMzQ7SFVHRVRMQl9QQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7a2hvX3JhZGl4X2FkZF9rZXkmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X2RlbF9rZXkmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X3dhbGtfdHJlZSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfaW5pdF90cmVlJiMzNDssCiAgICAmIzM0O2tob19yYWRpeF9kZXN0cm95X3RyZWUmIzM0OywKICAgICYjMzQ7a2hvX3NjcmF0Y2hfb3ZlcmxhcCYjMzQ7LAogICAgJiMzNDtraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlJiMzNDssCiAgICAmIzM0O21lbWJsb2NrX2FsbG9jX2h1Z2V0bGImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIEtleGVjIEhhbmRvdmVyIChLSE8pIHJhZGl4IHRyZWUgaW1wbGVtZW50YXRpb24sIGludHJvZHVjZXMgbmV3IGZ1bmN0aW9ucyBmb3IgS0hPIHNjcmF0Y2ggbWVtb3J5IG1hbmFnZW1lbnQsIGFuZCBjaGFuZ2VzIGhvdyBIdWdlVExCIHBhZ2VzIGFyZSBhbGxvY2F0ZWQgZHVyaW5nIGJvb3QgdXNpbmcgbWVtYmxvY2suIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHRoYXQgY2FuIGJlIHJlYWNoZWQgZHVyaW5nIGJvb3QgYW5kIHJ1bnRpbWUsIG1ha2luZyB0aGVtIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDE1YTg5NWIyN2Q3MDY5YjQzZTNiMTI4ZGY4NTdlYmNjZDNlMzgwOTIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEp1bCAxMCAxMzo0MToyNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaCBiL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaAppbmRleCA0OGE5NzkzYzJiNzZjZC4uMzBhNzE3MTA1NjVhMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgKQEAgLTMzLDkgJiM0MzszMywxMyBAQCB2b2lkIGtob19yZW1vdmVfc3VidHJlZSh2b2lkICpibG9iKTsKIGludCBraG9fcmV0cmlldmVfc3VidHJlZShjb25zdCBjaGFyICpuYW1lLCBwaHlzX2FkZHJfdCAqcGh5cywgc2l6ZV90ICpzaXplKTsKIAogdm9pZCBraG9fbWVtb3J5X2luaXQodm9pZCk7CiYjNDM7dm9pZCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZCk7CiAKIHZvaWQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbiwgcGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzLAogCQkgIHU2NCBzY3JhdGNoX2xlbik7CiYjNDM7CiYjNDM7Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTsKJiM0Mzt2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CiAjZWxzZQogc3RhdGljIGlubGluZSBib29sIGtob19pc19lbmFibGVkKHZvaWQpCiB7CkBAIC0xMDgsMTAgJiM0MzsxMTIsMjIgQEAgc3RhdGljIGlubGluZSBpbnQga2hvX3JldHJpZXZlX3N1YnRyZWUoY29uc3QgY2hhciAqbmFtZSwgcGh5c19hZGRyX3QgKnBoeXMsCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBraG9fbWVtb3J5X2luaXQodm9pZCkgeyB9CiAKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfQomIzQzOwogc3RhdGljIGlubGluZSB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sCiAJCQkJcGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzLCB1NjQgc2NyYXRjaF9sZW4pCiB7CiB9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CiYjNDM7ewomIzQzO30KICNlbmRpZiAvKiBDT05GSUdfS0VYRUNfSEFORE9WRVIgKi8KIAogI2VuZGlmIC8qIExJTlVYX0tFWEVDX0hBTkRPVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oIGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2tleGVjX2hhbmRvdmVyLmgKaW5kZXggNWUyZWI4NTE5YmRhNmQuLjJmNGZiOWM2Mzk0MjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaApAQCAtMjU3LDExICYjNDM7MjU3LDggQEAgc3RydWN0IGtob192bWFsbG9jIHsKICAqIG1lbW9yeS4gVGhlc2UgY29uc3RhbnRzIGdvdmVybiB0aGUgaW5kZXhpbmcsIHNpemluZywgYW5kIGRlcHRoIG9mIHRoZSB0cmVlLgogICovCiBlbnVtIGtob19yYWRpeF9jb25zdHMgewotCS8qCi0JICogVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgb3JkZXIgYml0IChhbmQgYWxzbyB0aGUgbGVuZ3RoIG9mIHRoZQotCSAqIHNoaWZ0ZWQgcGh5c2ljYWwgYWRkcmVzcykgZm9yIGFuIG9yZGVyLTAgcGFnZS4KLQkgKi8KLQlLSE9fT1JERVJfMF9MT0cyID0gNjQgLSBQQUdFX1NISUZULAomIzQzOwkvKiBOZWVkIHRvIHN0b3JlIHRoZSBQRk4sIHBsdXMgb25lIGJpdCBmb3Igb3JkZXIuICovCiYjNDM7CUtIT19SQURJWF9LRVlfV0lEVEggPSA2NCAtIFBBR0VfU0hJRlQgJiM0MzsgMSwKIAogCS8qIFNpemUgb2YgdGhlIHRhYmxlIGluIGtob19yYWRpeF9ub2RlLCBpbiBsb2cyICovCiAJS0hPX1RBQkxFX1NJWkVfTE9HMiA9IGNvbnN0X2lsb2cyKFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCkpLApAQCAtMjc0LDcgJiM0MzsyNzEsNyBAQCBlbnVtIGtob19yYWRpeF9jb25zdHMgewogCSAqIGFuZCAxIGJpdG1hcCBsZXZlbC4KIAkgKi8KIAlLSE9fVFJFRV9NQVhfREVQVEggPQotCQlESVZfUk9VTkRfVVAoS0hPX09SREVSXzBfTE9HMiAtIEtIT19CSVRNQVBfU0laRV9MT0cyICYjNDM7IDEsCiYjNDM7CQlESVZfUk9VTkRfVVAoS0hPX1JBRElYX0tFWV9XSURUSCAtIEtIT19CSVRNQVBfU0laRV9MT0cyLAogCQkJICAgICBLSE9fVEFCTEVfU0laRV9MT0cyKSAmIzQzOyAxLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oIGIvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oCmluZGV4IDg0ZTkxOGI5NmU1M2RmLi41ZDZhZTI4OTM2ODRhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaApAQCAtMzQsMzcgJiM0MzszNCw1MyBAQCBzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgewogCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0cyB0aGUgdHJlZSYjMzk7cyBzdHJ1Y3R1cmUgYW5kIHJvb3QgcG9pbnRlciAqLwogfTsKIAotdHlwZWRlZiBpbnQgKCpraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QpKHBoeXNfYWRkcl90IHBoeXMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBvcmRlcik7CiYjNDM7LyoqCiYjNDM7ICogc3RydWN0IGtob19yYWRpeF93YWxrX2NiIC0gQ2FsbGJhY2tzIGZvciBLSE8gcmFkaXggdHJlZSB3YWxrLgomIzQzOyAqIEBsZWFmOiAgICAgIENhbGxlZCBvbiBlYWNoIHByZXNlbnQga2V5IGluIHRoZSByYWRpeCB0cmVlLgomIzQzOyAqIEBub2RlOiAgICAgIENhbGxlZCBvbiBlYWNoIG5vZGUgb2YgdGhlIHJhZGl4IHRyZWUgaXRzZWxmLiBSZWNlaXZlcyB0aGUKJiM0MzsgKiAgICAgICAgICAgICBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG5vZGUuCiYjNDM7ICoKJiM0MzsgKiBGb3IgZWFjaCBjYWxsYmFjaywgYSByZXR1cm4gdmFsdWUgb2YgMCBjb250aW51ZXMgdGhlIHdhbGsgYW5kIGEgbm9uLXplcm8KJiM0MzsgKiByZXR1cm4gdmFsdWUgaXMgZGlyZWN0bHkgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KJiM0MzsgKi8KJiM0MztzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgewomIzQzOwlpbnQgKCpsZWFmKSh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSk7CiYjNDM7CWludCAoKm5vZGUpKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpOwomIzQzO307CiAKICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVIKIAotaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLAotCQkgICAgICAgdW5zaWduZWQgaW50IG9yZGVyKTsKLQotdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbiwKLQkJCXVuc2lnbmVkIGludCBvcmRlcik7Ci0KJiM0MztpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7CiYjNDM7dm9pZCBraG9fcmFkaXhfZGVsX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KTsKIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwKLQkJCWtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCBjYik7CiYjNDM7CQkJY29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSk7CiYjNDM7aW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpOwomIzQzO3ZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpOwogCiAjZWxzZSAgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqLwogCi1zdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBsb25nIHBmbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvcmRlcikKJiM0MztzdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KQogewogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGludCBvcmRlcikgeyB9CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIGtleSkgeyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLAotCQkJCSAgICAgIGtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCBjYikKJiM0MzsJCQkJICAgICAgY29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSkKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwKJiM0MzsJCQkJICAgICAgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KQomIzQzO3sKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSkgeyB9CiYjNDM7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqLwogCiAjZW5kaWYJLyogX0xJTlVYX0tIT19SQURJWF9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAppbmRleCA1YWZjZDk5YWE4YzE0NC4uZDYyZGI5ZTc3NmNmOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmgKQEAgLTUxLDYgJiM0Mzs1MSw3IEBAIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbWF4X3Bvc3NpYmxlX3BmbjsKICAqIG1lbW9yeSByZXNlcnZhdGlvbnMgeWV0LCBzbyB3ZSBnZXQgc2NyYXRjaCBtZW1vcnkgZnJvbSB0aGUgcHJldmlvdXMKICAqIGtlcm5lbCB0aGF0IHdlIGtub3cgaXMgZ29vZCB0byB1c2UuIEl0IGlzIHRoZSBvbmx5IG1lbW9yeSB0aGF0CiAgKiBhbGxvY2F0aW9ucyBtYXkgaGFwcGVuIGZyb20gaW4gdGhpcyBwaGFzZS4KJiM0MzsgKiBATUVNQkxPQ0tfUlNSVl9IVUdFVExCOiBtZW1vcnkgaXMgcmVzZXJ2ZWQgZm9yIGh1Z2V0bGIgcGFnZXMKICAqLwogZW51bSBtZW1ibG9ja19mbGFncyB7CiAJTUVNQkxPQ0tfTk9ORQkJPSAweDAsCS8qIE5vIHNwZWNpYWwgcmVxdWVzdCAqLwpAQCAtNjEsNiAmIzQzOzYyLDcgQEAgZW51bSBtZW1ibG9ja19mbGFncyB7CiAJTUVNQkxPQ0tfUlNSVl9OT0lOSVQJPSAweDEwLAkvKiBkb24mIzM5O3QgaW5pdGlhbGl6ZSBzdHJ1Y3QgcGFnZXMgKi8KIAlNRU1CTE9DS19SU1JWX0tFUk4JPSAweDIwLAkvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGtlcm5lbCB1c2UgKi8KIAlNRU1CTE9DS19LSE9fU0NSQVRDSAk9IDB4NDAsCS8qIHNjcmF0Y2ggbWVtb3J5IGZvciBrZXhlYyBoYW5kb3ZlciAqLwomIzQzOwlNRU1CTE9DS19SU1JWX0hVR0VUTEIJPSAweDgwLCAvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGh1Z2V0bGIgcGFnZXMgKi8KIH07CiAKIC8qKgpAQCAtNDIwLDYgJiM0Mzs0MjIsNyBAQCB2b2lkICptZW1ibG9ja19hbGxvY190cnlfbmlkX3JhdyhwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbiwKIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sCiAJCQkgICAgIHBoeXNfYWRkcl90IG1pbl9hZGRyLCBwaHlzX2FkZHJfdCBtYXhfYWRkciwKIAkJCSAgICAgaW50IG5pZCk7CiYjNDM7dm9pZCAqbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZCk7CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqbWVtYmxvY2tfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24pCiB7CkBAIC00ODQsNiAmIzQzOzQ4Nyw3IEBAIHN0YXRpYyBpbmxpbmUgX19pbml0X21lbWJsb2NrIGJvb2wgbWVtYmxvY2tfYm90dG9tX3VwKHZvaWQpCiBwaHlzX2FkZHJfdCBtZW1ibG9ja19waHlzX21lbV9zaXplKHZvaWQpOwogcGh5c19hZGRyX3QgbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh2b2lkKTsKIHBoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCk7CiYjNDM7cGh5c19hZGRyX3QgbWVtYmxvY2tfcmVzZXJ2ZWRfaHVnZXRsYl9zaXplKHBoeXNfYWRkcl90IGxpbWl0LCBpbnQgbmlkKTsKIHVuc2lnbmVkIGxvbmcgbWVtYmxvY2tfZXN0aW1hdGVkX25yX2ZyZWVfcGFnZXModm9pZCk7CiBwaHlzX2FkZHJfdCBtZW1ibG9ja19zdGFydF9vZl9EUkFNKHZvaWQpOwogcGh5c19hZGRyX3QgbWVtYmxvY2tfZW5kX29mX0RSQU0odm9pZCk7CkBAIC02MTMsMjggJiM0Mzs2MTcsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgbWVtdGVzdF9yZXBvcnRfbWVtaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pIHsgfQogI2lmZGVmIENPTkZJR19NRU1CTE9DS19LSE9fU0NSQVRDSAogdm9pZCBtZW1ibG9ja19zZXRfa2hvX3NjcmF0Y2hfb25seSh2b2lkKTsKIHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKTsKLWJvb2wgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpOwotCi1zdGF0aWMgaW5saW5lIGVudW0gbWlncmF0ZXR5cGUga2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJCQkgICAgICAgZW51bSBtaWdyYXRldHlwZSBtdCkKLXsKLQlpZiAobWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KFBGTl9QSFlTKHBmbikpKQotCQlyZXR1cm4gTUlHUkFURV9DTUE7Ci0JcmV0dXJuIG10OwotfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19zZXRfa2hvX3NjcmF0Y2hfb25seSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBib29sIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShwaHlzX2FkZHJfdCBhZGRyKQotewotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBlbnVtIG1pZ3JhdGV0eXBlIGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgcGZuLAotCQkJCQkJICAgICAgIGVudW0gbWlncmF0ZXR5cGUgbXQpCi17Ci0JcmV0dXJuIG10OwotfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfTElOVVhfTUVNQkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUvTWFrZWZpbGUgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZQppbmRleCBlZWM5ZDNhZTA3ZWI0Yi4uZDlmNDY5NDYyNTU2NzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlCkBAIC04LDcgJiM0Mzs4LDYgQEAgbHVvLXkgOj0JCQkJCQkJCVwKIAkJbHVvX3Nlc3Npb24ubwogCiBvYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVIpCQkmIzQzOz0ga2V4ZWNfaGFuZG92ZXIubwotb2JqLSQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKQkmIzQzOz0ga2V4ZWNfaGFuZG92ZXJfZGVidWcubwogb2JqLSQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHRlMpCSYjNDM7PSBrZXhlY19oYW5kb3Zlcl9kZWJ1Z2ZzLm8KIAogb2JqLSQoQ09ORklHX0xJVkVVUERBVEUpCQkmIzQzOz0gbHVvLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jCmluZGV4IDQ4MzRhODA5OTg1YWI3Li45ZGM3OWI3MTAzYmRiZiAxMDA2NDQKLS0tIGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jCkBAIC04NCw4ICYjNDM7ODQsMjUgQEAgc3RhdGljIHN0cnVjdCBraG9fb3V0IGtob19vdXQgPSB7CiAJfSwKIH07CiAKJiM0MztzdHJ1Y3Qga2hvX2luIHsKJiM0MzsJcGh5c19hZGRyX3QgZmR0X3BoeXM7CiYjNDM7CXBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5czsKJiM0MzsJY2hhciBwcmV2aW91c19yZWxlYXNlW19fTkVXX1VUU19MRU4gJiM0MzsgMV07CiYjNDM7CXUzMiBrZXhlY19jb3VudDsKJiM0MzsJc3RydWN0IGtob19kZWJ1Z2ZzIGRiZzsKJiM0MzsJc3RydWN0IGtob19yYWRpeF90cmVlIHJhZGl4X3RyZWU7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGtob19pbiBraG9faW4gPSB7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgdm9pZCAqa2hvX2dldF9mZHQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBraG9faW4uZmR0X3BoeXMgPyBwaHlzX3RvX3ZpcnQoa2hvX2luLmZkdF9waHlzKSA6IE5VTEw7CiYjNDM7fQomIzQzOwogLyoqCi0gKiBraG9fcmFkaXhfZW5jb2RlX2tleSAtIEVuY29kZXMgYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBpbnRvIGEgcmFkaXgga2V5LgomIzQzOyAqIGtob19lbmNvZGVfcmFkaXhfa2V5IC0gRW5jb2RlcyBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyIGludG8gYSByYWRpeCBrZXkuCiAgKiBAcGh5czogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHBhZ2UuCiAgKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS4KICAqCkBAIC05NSwzNSAmIzQzOzExMiwzOCBAQCBzdGF0aWMgc3RydWN0IGtob19vdXQga2hvX291dCA9IHsKICAqCiAgKiBSZXR1cm46IFRoZSBlbmNvZGVkIHVuc2lnbmVkIGxvbmcgcmFkaXgga2V5LgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBraG9fcmFkaXhfZW5jb2RlX2tleShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBpbnQgb3JkZXIpCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX2VuY29kZV9yYWRpeF9rZXkocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgaW50IG9yZGVyKQogewotCS8qIE9yZGVyIGJpdHMgcGFydCAqLwotCXVuc2lnbmVkIGxvbmcgaCA9IDFVTCAmbHQ7Jmx0OyAoS0hPX09SREVSXzBfTE9HMiAtIG9yZGVyKTsKLQkvKiBTaGlmdGVkIHBoeXNpY2FsIGFkZHJlc3MgcGFydCAqLwotCXVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgJmd0OyZndDsgKFBBR0VfU0hJRlQgJiM0Mzsgb3JkZXIpOwomIzQzOwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBpcyBlbmNvZGVkIGJ5IHNoaWZ0aW5nIHRoZSBQRk4gYnkgaXRzIG9yZGVyLiAqLwomIzQzOwl1bnNpZ25lZCBsb25nIHNoaWZ0ID0gUEFHRV9TSElGVCAmIzQzOyBvcmRlcjsKJiM0MzsJLyogT3JkZXIgYml0IGdvZXMgcmlnaHQgYmVmb3JlIHRoZSBzaGlmdGVkIFBGTi4gKi8KJiM0MzsJdW5zaWduZWQgbG9uZyBoID0gMVVMICZsdDsmbHQ7ICg2NCAtIHNoaWZ0KTsKJiM0MzsJLyogU2hpZnRlZCBQRk4uICovCiYjNDM7CXVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgJmd0OyZndDsgc2hpZnQ7CiAKIAlyZXR1cm4gaCB8IGw7CiB9CiAKIC8qKgotICoga2hvX3JhZGl4X2RlY29kZV9rZXkgLSBEZWNvZGVzIGEgcmFkaXgga2V5IGJhY2sgaW50byBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyLgomIzQzOyAqIGtob19kZWNvZGVfcmFkaXhfa2V5IC0gRGVjb2RlcyBhIHJhZGl4IGtleSBiYWNrIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlci4KICAqIEBrZXk6IFRoZSB1bnNpZ25lZCBsb25nIGtleSB0byBkZWNvZGUuCiAgKiBAb3JkZXI6IEFuIG91dHB1dCBwYXJhbWV0ZXIsIGEgcG9pbnRlciB0byBhbiB1bnNpZ25lZCBpbnQgd2hlcmUgdGhlIGRlY29kZWQKICAqICAgICAgICAgcGFnZSBvcmRlciB3aWxsIGJlIHN0b3JlZC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBlbmNvZGluZyBwZXJmb3JtZWQgYnkga2hvX3JhZGl4X2VuY29kZV9rZXkoKSwKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBlbmNvZGluZyBwZXJmb3JtZWQgYnkga2hvX2VuY29kZV9yYWRpeF9rZXkoKSwKICAqIGV4dHJhY3RpbmcgdGhlIG9yaWdpbmFsIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHBhZ2Ugb3JkZXIgZnJvbSBhIGdpdmVuIGtleS4KICAqCiAgKiBSZXR1cm46IFRoZSBkZWNvZGVkIHBoeXNpY2FsIGFkZHJlc3MuCiAgKi8KLXN0YXRpYyBwaHlzX2FkZHJfdCBraG9fcmFkaXhfZGVjb2RlX2tleSh1bnNpZ25lZCBsb25nIGtleSwgdW5zaWduZWQgaW50ICpvcmRlcikKJiM0MztzdGF0aWMgcGh5c19hZGRyX3Qga2hvX2RlY29kZV9yYWRpeF9rZXkodW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGludCAqb3JkZXIpCiB7Ci0JdW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSk7CiYjNDM7CS8qIGZsczY0KCkgaW5kZXhlcyBzdGFydGluZyBmcm9tIDEuICovCiYjNDM7CXVuc2lnbmVkIGludCBvcmRlcl9iaXQgPSBmbHM2NChrZXkpIC0gMTsKIAlwaHlzX2FkZHJfdCBwaHlzOwogCi0JLyogb3JkZXJfYml0IGlzIG51bWJlcmVkIHN0YXJ0aW5nIGF0IDEgZnJvbSBmbHM2NCAqLwotCSpvcmRlciA9IEtIT19PUkRFUl8wX0xPRzIgLSBvcmRlcl9iaXQgJiM0MzsgMTsKLQkvKiBUaGUgb3JkZXIgaXMgZGlzY2FyZGVkIGJ5IHRoZSBzaGlmdCAqLwomIzQzOwkvKiBvcmRlciBiaXQgZ29lcyByaWdodCBiZWZvcmUgdGhlIHNoaWZ0ZWQgUEZOLiAqLwomIzQzOwkqb3JkZXIgPSA2NCAtIChQQUdFX1NISUZUICYjNDM7IG9yZGVyX2JpdCk7CiYjNDM7CS8qIFRoZSBvcmRlciBiaXQgaXMgZGlzY2FyZGVkIGJ5IHRoZSBzaGlmdCAqLwogCXBoeXMgPSBrZXkgJmx0OyZsdDsgKFBBR0VfU0hJRlQgJiM0MzsgKm9yZGVyKTsKIAogCXJldHVybiBwaHlzOwpAQCAtMTQzLDI1ICYjNDM7MTYzLDQ3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGtob19yYWRpeF9nZXRfdGFibGVfaW5kZXgodW5zaWduZWQgbG9uZyBrZXksCiAJcmV0dXJuIChrZXkgJmd0OyZndDsgcykgJSAoMSAmbHQ7Jmx0OyBLSE9fVEFCTEVfU0laRV9MT0cyKTsKIH0KIAomIzQzO3N0YXRpYyB2b2lkIF9fcmVmICpraG9fcmFkaXhfYWxsb2Nfbm9kZSh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlOwomIzQzOwomIzQzOwlpZiAoc2xhYl9pc19hdmFpbGFibGUoKSkKJiM0MzsJCW5vZGUgPSAoc3RydWN0IGtob19yYWRpeF9ub2RlICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwomIzQzOwllbHNlCiYjNDM7CQlub2RlID0gbWVtYmxvY2tfYWxsb2MoUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwomIzQzOwomIzQzOwlyZXR1cm4gbm9kZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgX19yZWYga2hvX3JhZGl4X2ZyZWVfbm9kZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGUpCiYjNDM7ewomIzQzOwlpZiAoc2xhYl9pc19hdmFpbGFibGUoKSkKJiM0MzsJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylub2RlKTsKJiM0MzsJZWxzZQomIzQzOwkJbWVtYmxvY2tfZnJlZShub2RlLCBQQUdFX1NJWkUpOwomIzQzO30KJiM0MzsKIC8qKgotICoga2hvX3JhZGl4X2FkZF9wYWdlIC0gTWFya3MgYSBwYWdlIGFzIHByZXNlcnZlZCBpbiB0aGUgcmFkaXggdHJlZS4KJiM0MzsgKiBraG9fcmFkaXhfYWRkX2tleSAtIEFkZCBhIGtleSB0byB0aGUgcmFkaXggdHJlZS4KICAqIEB0cmVlOiBUaGUgS0hPIHJhZGl4IHRyZWUuCi0gKiBAcGZuOiBUaGUgcGFnZSBmcmFtZSBudW1iZXIgb2YgdGhlIHBhZ2UgdG8gcHJlc2VydmUuCi0gKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS4KJiM0MzsgKiBAa2V5OiBUaGUga2V5IHRvIGFkZC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBiYXNlZCBvbiB0aGUga2V5IGRlcml2ZWQgZnJvbSBAcGZuCi0gKiBhbmQgQG9yZGVyLiBJdCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGUKLSAqIHBhZ2UgZm9yIHByZXNlcnZhdGlvbi4gSWYgaW50ZXJtZWRpYXRlIG5vZGVzIGRvIG5vdCBleGlzdCBhbG9uZyB0aGUgcGF0aCwKLSAqIHRoZXkgYXJlIGFsbG9jYXRlZCBhbmQgYWRkZWQgdG8gdGhlIHRyZWUuCiYjNDM7ICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYmFzZWQgb24gdGhlIEBrZXkgcHJvdmlkZWQuIEl0IHNldHMgdGhlCiYjNDM7ICogY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGxlYWYgYml0bWFwIHRvIG1hcmsgdGhlIEBrZXkgYXMgcHJlc2VudC4gSWYKJiM0MzsgKiBpbnRlcm1lZGlhdGUgbm9kZXMgZG8gbm90IGV4aXN0IGFsb25nIHRoZSBwYXRoLCB0aGV5IGFyZSBhbGxvY2F0ZWQgYW5kIGFkZGVkCiYjNDM7ICogdG8gdGhlIHRyZWUuCiYjNDM7ICoKJiM0MzsgKiBOT1RFOiBDdXJyZW50bHkgb25seSBrZXlzIG9mIHdpZHRoIHVwIHRvICVLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBzdXBwb3J0ZWQuCiYjNDM7ICogVGhpcyBsaW1pdCBvbmx5IGV4aXN0cyBiZWNhdXNlIGN1cnJlbnQgdXNlcnMgb2YgdGhlIHJhZGl4IHRyZWUgZG9uJiMzOTt0IHVzZSBtb3JlCiYjNDM7ICogdGhhbiB0aGF0LiBDaGFuZ2luZyB0aGUgbWF4aW11bSB3aWR0aCByZXF1aXJlcyBjaGFuZ2luZyB0aGUgdHJlZSBkZXB0aCwgd2hpY2gKJiM0MzsgKiBuZWVkcyBidW1waW5nIHRoZSBBQkkgdmVyc2lvbi4KICAqCiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLWludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGludCBvcmRlcikKJiM0MztpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSkKIHsKIAkvKiBOZXdseSBhbGxvY2F0ZWQgbm9kZXMgZm9yIGVycm9yIGNsZWFudXAgKi8KIAlzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKmludGVybWVkaWF0ZV9ub2Rlc1tLSE9fVFJFRV9NQVhfREVQVEhdID0geyAwIH07Ci0JdW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7CiAJc3RydWN0IGtob19yYWRpeF9ub2RlICphbmNob3Jfbm9kZSA9IE5VTEw7CiAJc3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlID0gdHJlZS0mZ3Q7cm9vdDsKIAlzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5ld19ub2RlOwpAQCAtMTcyLDYgJiM0MzsyMTQsOSBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwKIAlpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLSZndDtyb290KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKJiM0MzsJaWYgKHVubGlrZWx5KGZsczY0KGtleSkgJmd0OyBLSE9fUkFESVhfS0VZX1dJRFRIKSkKJiM0MzsJCXJldHVybiAtRVJBTkdFOwomIzQzOwogCW1pZ2h0X3NsZWVwKCk7CiAKIAlndWFyZChtdXRleCkoJmFtcDt0cmVlLSZndDtsb2NrKTsKQEAgLTE4Niw3ICYjNDM7MjMxLDcgQEAgaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsCiAJCX0KIAogCQkvKiBOZXh0IG5vZGUgaXMgZW1wdHksIGNyZWF0ZSBhIG5ldyBub2RlIGZvciBpdCAqLwotCQluZXdfbm9kZSA9IChzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiYjNDM7CQluZXdfbm9kZSA9IGtob19yYWRpeF9hbGxvY19ub2RlKCk7CiAJCWlmICghbmV3X25vZGUpIHsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9mcmVlX25vZGVzOwpAQCAtMjE3LDI5ICYjNDM7MjYyLDI2IEBAIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLAogZXJyX2ZyZWVfbm9kZXM6CiAJZm9yIChpID0gS0hPX1RSRUVfTUFYX0RFUFRIIC0gMTsgaSAmZ3Q7IDA7IGktLSkgewogCQlpZiAoaW50ZXJtZWRpYXRlX25vZGVzW2ldKQotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWludGVybWVkaWF0ZV9ub2Rlc1tpXSk7CiYjNDM7CQkJa2hvX3JhZGl4X2ZyZWVfbm9kZShpbnRlcm1lZGlhdGVfbm9kZXNbaV0pOwogCX0KIAlpZiAoYW5jaG9yX25vZGUpCiAJCWFuY2hvcl9ub2RlLSZndDt0YWJsZVthbmNob3JfaWR4XSA9IDA7CiAKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X2FkZF9wYWdlKTsKJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7CiAKIC8qKgotICoga2hvX3JhZGl4X2RlbF9wYWdlIC0gUmVtb3ZlcyBhIHBhZ2UmIzM5O3MgcHJlc2VydmF0aW9uIHN0YXR1cyBmcm9tIHRoZSByYWRpeCB0cmVlLgomIzQzOyAqIGtob19yYWRpeF9kZWxfa2V5IC0gUmVtb3ZlcyB0aGUga2V5IGZyb20gdGhlIHJhZGl4IHRyZWUuCiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLgotICogQHBmbjogVGhlIHBhZ2UgZnJhbWUgbnVtYmVyIG9mIHRoZSBwYWdlIHRvIHVucHJlc2VydmUuCi0gKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS4KJiM0MzsgKiBAa2V5OiBUaGUga2V5IHRvIHJlbW92ZS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBhbmQgY2xlYXJzIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0bwotICogdGhlIHBhZ2UsIGVmZmVjdGl2ZWx5IHJlbW92aW5nIGl0cyAmIzM0O3ByZXNlcnZlZCYjMzQ7IHN0YXR1cy4gSXQgZG9lcyBub3QgZnJlZQotICogdGhlIHRyZWUmIzM5O3MgaW50ZXJtZWRpYXRlIG5vZGVzLCBldmVuIGlmIHRoZXkgYmVjb21lIGVtcHR5LgomIzQzOyAqIHRoZSBAa2V5LCBlZmZlY3RpdmVseSByZW1vdmluZyBpdCBmcm9tIHRoZSB0cmVlLiBJdCBkb2VzIG5vdCBmcmVlIHRoZSB0cmVlJiMzOTtzCiYjNDM7ICogaW50ZXJtZWRpYXRlIG5vZGVzLCBldmVuIGlmIHRoZXkgYmVjb21lIGVtcHR5LgogICovCi12b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLAotCQkJdW5zaWduZWQgaW50IG9yZGVyKQomIzQzO3ZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSkKIHsKLQl1bnNpZ25lZCBsb25nIGtleSA9IGtob19yYWRpeF9lbmNvZGVfa2V5KFBGTl9QSFlTKHBmbiksIG9yZGVyKTsKIAlzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGUgPSB0cmVlLSZndDtyb290OwogCXN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZjsKIAl1bnNpZ25lZCBpbnQgaSwgaWR4OwpAQCAtMjQ3LDYgJiM0MzsyODksMTAgQEAgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbiwKIAlpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLSZndDtyb290KSkKIAkJcmV0dXJuOwogCiYjNDM7CS8qIEtleXMgd2lkZXIgdGhhbiBLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBub3QgYWxsb3dlZCB0byBiZSBhZGRlZC4gKi8KJiM0MzsJaWYgKHVubGlrZWx5KGZsczY0KGtleSkgJmd0OyBLSE9fUkFESVhfS0VZX1dJRFRIKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKIAltaWdodF9zbGVlcCgpOwogCiAJZ3VhcmQobXV0ZXgpKCZhbXA7dHJlZS0mZ3Q7bG9jayk7CkBAIC0yNzAsMjEgJiM0MzszMTYsODUgQEAgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbiwKIAlpZHggPSBraG9fcmFkaXhfZ2V0X2JpdG1hcF9pbmRleChrZXkpOwogCV9fY2xlYXJfYml0KGlkeCwgbGVhZi0mZ3Q7Yml0bWFwKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZWxfcGFnZSk7CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X2RlbF9rZXkpOwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIF9fa2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgaW50IGxldmVsKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlpZiAobGV2ZWwgPT0gMCkgewomIzQzOwkJa2hvX3JhZGl4X2ZyZWVfbm9kZShyb290KTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgUEFHRV9TSVpFIC8gc2l6ZW9mKHBoeXNfYWRkcl90KTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChyb290LSZndDt0YWJsZVtpXSkKJiM0MzsJCQlfX2tob19yYWRpeF9kZXN0cm95X3RyZWUocGh5c190b192aXJ0KHJvb3QtJmd0O3RhYmxlW2ldKSwKJiM0MzsJCQkJCQkgbGV2ZWwgLSAxKTsKJiM0MzsJfQomIzQzOwomIzQzOwlraG9fcmFkaXhfZnJlZV9ub2RlKHJvb3QpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBraG9fcmFkaXhfaW5pdF90cmVlIC0gaW5pdGlhbGl6ZSB0aGUgcmFkaXggdHJlZS4KJiM0MzsgKiBAdHJlZTogICB0aGUgdHJlZSB0byBpbml0aWFsaXplLgomIzQzOyAqIEByb290OiAgIHJvb3QgdGFibGUgb2YgdGhlIHJhZGl4IHRyZWUuCiYjNDM7ICoKJiM0MzsgKiBJbml0aWFsaXplIHRoZSByYWRpeCB0cmVlIHdpdGggdGhlIGdpdmVuIHJvb3Qgbm9kZS4gSWYgcm9vdCBpcyAlTlVMTCwgYW4KJiM0MzsgKiBlbXB0eSByb290IHRhYmxlIGlzIGFsbG9jYXRlZC4gSWYgcm9vdCBpcyBub3QgJU5VTEwsIGl0IGlzIHRoZSBjYWxsZXImIzM5O3MKJiM0MzsgKiByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIHJvb3QgaXMgdmFsaWQgYW5kIGluIHRoZSBjb3JyZWN0IGZvcm1hdC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztpbnQga2hvX3JhZGl4X2luaXRfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCkKJiM0Mzt7CiYjNDM7CWlmICghcm9vdCkKJiM0MzsJCXJvb3QgPSBraG9fcmFkaXhfYWxsb2Nfbm9kZSgpOwomIzQzOwlpZiAoIXJvb3QpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJdHJlZS0mZ3Q7cm9vdCA9IHJvb3Q7CiYjNDM7CW11dGV4X2luaXQoJmFtcDt0cmVlLSZndDtsb2NrKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGtob19yYWRpeF9kZXN0cm95X3RyZWUgLSBEZXN0cm95IHRoZSByYWRpeCB0cmVlCiYjNDM7ICogQHRyZWU6IFRoZSByYWRpeCB0cmVlIHRvIGRlc3Ryb3kKJiM0MzsgKgomIzQzOyAqIFdhbGsgQHRyZWUgYW5kIGZyZWUgYWxsIGl0cyBub2Rlcy4KJiM0MzsgKi8KJiM0Mzt2b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKQomIzQzO3sKJiM0MzsJaWYgKCF0cmVlLSZndDtyb290KQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlfX2tob19yYWRpeF9kZXN0cm95X3RyZWUodHJlZS0mZ3Q7cm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSk7CiYjNDM7CXRyZWUtJmd0O3Jvb3QgPSBOVUxMOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfZGVzdHJveV90cmVlKTsKIAotc3RhdGljIGludCBraG9fcmFkaXhfd2Fsa19sZWFmKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGtleSwKLQkJCSAgICAgICBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpCiYjNDM7c3RhdGljIGludCBraG9fcmFkaXhfd2Fsa19sZWFmKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZiwgdW5zaWduZWQgbG9uZyBrZXksCiYjNDM7CQkJICAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilsZWFmOwotCXVuc2lnbmVkIGludCBvcmRlcjsKLQlwaHlzX2FkZHJfdCBwaHlzOwogCXVuc2lnbmVkIGludCBpOwogCWludCBlcnI7CiAKJiM0MzsJaWYgKGNiLSZndDtub2RlKSB7CiYjNDM7CQllcnIgPSBjYi0mZ3Q7bm9kZSh2aXJ0X3RvX3BoeXMobGVhZiksIGRhdGEpOwomIzQzOwkJaWYgKGVycikKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghY2ItJmd0O2xlYWYpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAlmb3JfZWFjaF9zZXRfYml0KGksIGJpdG1hcCwgUEFHRV9TSVpFICogQklUU19QRVJfQllURSkgewotCQlwaHlzID0ga2hvX3JhZGl4X2RlY29kZV9rZXkoa2V5IHwgaSwgJmFtcDtvcmRlcik7Ci0JCWVyciA9IGNiKHBoeXMsIG9yZGVyKTsKJiM0MzsJCWVyciA9IGNiLSZndDtsZWFmKGtleSB8IGksIGRhdGEpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0yOTQsNyAmIzQzOzQwNCw3IEBAIHN0YXRpYyBpbnQga2hvX3JhZGl4X3dhbGtfbGVhZihzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWYsCiAKIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCwKIAkJCQkgdW5zaWduZWQgaW50IGxldmVsLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJCSBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpCiYjNDM7CQkJCSBjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgKmNiLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZTsKIAlzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWY7CkBAIC0zMDIsNiAmIzQzOzQxMiwxMiBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsCiAJdW5zaWduZWQgaW50IHNoaWZ0OwogCWludCBlcnI7CiAKJiM0MzsJaWYgKGNiLSZndDtub2RlKSB7CiYjNDM7CQllcnIgPSBjYi0mZ3Q7bm9kZSh2aXJ0X3RvX3BoeXMocm9vdCksIGRhdGEpOwomIzQzOwkJaWYgKGVycikKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiAJZm9yIChpID0gMDsgaSAmbHQ7IFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCk7IGkmIzQzOyYjNDM7KSB7CiAJCWlmICghcm9vdC0mZ3Q7dGFibGVbaV0pCiAJCQljb250aW51ZTsKQEAgLTMxOCwxMCAmIzQzOzQzNCwxMCBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsCiAJCQkgKiBub2RlIGlzIHBvaW50aW5nIHRvIHRoZSBsZXZlbCAwIGJpdG1hcC4KIAkJCSAqLwogCQkJbGVhZiA9IChzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKilub2RlOwotCQkJZXJyID0ga2hvX3JhZGl4X3dhbGtfbGVhZihsZWFmLCBrZXksIGNiKTsKJiM0MzsJCQllcnIgPSBraG9fcmFkaXhfd2Fsa19sZWFmKGxlYWYsIGtleSwgY2IsIGRhdGEpOwogCQl9IGVsc2UgewogCQkJZXJyICA9IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShub2RlLCBsZXZlbCAtIDEsCi0JCQkJCQkgICAgIGtleSwgY2IpOwomIzQzOwkJCQkJCSAgICAga2V5LCBjYiwgZGF0YSk7CiAJCX0KIAogCQlpZiAoZXJyKQpAQCAtMzMyLDI4ICYjNDM7NDQ4LDI3IEBAIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCwKIH0KIAogLyoqCi0gKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIHByZXNlcnZlZCBwYWdlLgomIzQzOyAqIGtob19yYWRpeF93YWxrX3RyZWUgLSBUcmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNhbGxzIGEgY2FsbGJhY2sgZm9yIGVhY2gga2V5LgogICogQHRyZWU6IEEgcG9pbnRlciB0byB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gd2Fsay4KLSAqIEBjYjogQSBjYWxsYmFjayBmdW5jdGlvbiBvZiB0eXBlIGtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCB0aGF0IHdpbGwgYmUKLSAqICAgICAgaW52b2tlZCBmb3IgZWFjaCBwcmVzZXJ2ZWQgcGFnZSBmb3VuZCBpbiB0aGUgdHJlZS4gVGhlIGNhbGxiYWNrIHJlY2VpdmVzCi0gKiAgICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBvZiB0aGUgcHJlc2VydmVkIHBhZ2UuCiYjNDM7ICogQGNiOiAgIFNldCBvZiBjYWxsYmFja3MgdG8gYmUgaW52b2tlZCBkdXJpbmcgdGhlIHRyZWUgd2Fsay4KJiM0MzsgKiBAZGF0YTogT3BhcXVlIGRhdGEgcG9pbnRlciBwYXNzZWQgdG8gZWFjaCBjYWxsYmFjayBpbiBAY2IuCiAgKgotICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHNwZWNpZmllZCB0b3AgbGV2ZWwKLSAqIGRvd24gdG8gdGhlIGxvd2VzdCBsZXZlbCAobGV2ZWwgMCkuIEZvciBlYWNoIHByZXNlcnZlZCBwYWdlIGZvdW5kLCBpdCBpbnZva2VzCi0gKiB0aGUgcHJvdmlkZWQgY2FsbGJhY2ssIHBhc3NpbmcgdGhlIHBhZ2UmIzM5O3MgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuCiYjNDM7ICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHRvcCBsZXZlbCBkb3duIHRvIHRoZQomIzQzOyAqIGxvd2VzdCBsZXZlbCAobGV2ZWwgMCksIGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MuCiAgKgogICogUmV0dXJuOiAwIGlmIHRoZSB3YWxrIGNvbXBsZXRlZCB0aGUgc3BlY2lmaWVkIHRyZWUsIG9yIHRoZSBub24temVybyByZXR1cm4KICAqICAgICAgICAgdmFsdWUgZnJvbSB0aGUgY2FsbGJhY2sgdGhhdCBzdG9wcGVkIHRoZSB3YWxrLgogICovCiBpbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsCi0JCQlraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpCiYjNDM7CQkJY29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSkKIHsKIAlpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLSZndDtyb290KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlndWFyZChtdXRleCkoJmFtcDt0cmVlLSZndDtsb2NrKTsKIAotCXJldHVybiBfX2tob19yYWRpeF93YWxrX3RyZWUodHJlZS0mZ3Q7cm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSwgMCwgY2IpOwomIzQzOwlyZXR1cm4gX19raG9fcmFkaXhfd2Fsa190cmVlKHRyZWUtJmd0O3Jvb3QsIEtIT19UUkVFX01BWF9ERVBUSCAtIDEsIDAsIGNiLAomIzQzOwkJCQkgICAgIGRhdGEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X3dhbGtfdHJlZSk7CiAKQEAgLTQ4NCwxMyAmIzQzOzU5OSwxNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKl9faW5pdCBraG9fZ2V0X3ByZXNlcnZlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMsCiAJcmV0dXJuIHBmbl90b19wYWdlKHBmbik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cywKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBvcmRlcikKJiM0MztzdGF0aWMgaW50IF9faW5pdCBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKQogewogCXVuaW9uIGtob19wYWdlX2luZm8gaW5mbzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJdW5zaWduZWQgaW50IG9yZGVyOwomIzQzOwlwaHlzX2FkZHJfdCBwaHlzOwogCXU2NCBzejsKIAomIzQzOwlwaHlzID0ga2hvX2RlY29kZV9yYWRpeF9rZXkoa2V5LCAmYW1wO29yZGVyKTsKJiM0MzsKIAlzeiA9IDEgJmx0OyZsdDsgKG9yZGVyICYjNDM7IFBBR0VfU0hJRlQpOwogCXBhZ2UgPSBraG9fZ2V0X3ByZXNlcnZlZF9wYWdlKHBoeXMsIG9yZGVyKTsKIApAQCAtNTA0LDE5ICYjNDM7NjIyLDI0IEBAIHN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cywKIAlyZXR1cm4gMDsKIH0KIAotLyogUmV0dXJucyBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwcmVzZXJ2ZWQgbWVtb3J5IG1hcCBmcm9tIEZEVCAqLwotc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBraG9fZ2V0X21lbV9tYXBfcGh5cyhjb25zdCB2b2lkICpmZHQpCiYjNDM7LyogUmV0dXJucyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovCiYjNDM7c3RhdGljIF9faW5pdCB2b2lkICpraG9fZ2V0X21lbV9tYXAoY29uc3Qgdm9pZCAqZmR0KQogewogCWNvbnN0IHZvaWQgKm1lbV9wdHI7CiYjNDM7CXBoeXNfYWRkcl90IG1lbV9tYXBfcGh5czsKIAlpbnQgbGVuOwogCiAJbWVtX3B0ciA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgJmFtcDtsZW4pOwogCWlmICghbWVtX3B0ciB8fCBsZW4gIT0gc2l6ZW9mKHU2NCkpIHsKIAkJcHJfZXJyKCYjMzQ7ZmFpbGVkIHRvIGdldCBwcmVzZXJ2ZWQgbWVtb3J5IG1hcFxuJiMzNDspOwotCQlyZXR1cm4gMDsKJiM0MzsJCXJldHVybiBOVUxMOwogCX0KIAotCXJldHVybiBnZXRfdW5hbGlnbmVkKChjb25zdCB1NjQgKiltZW1fcHRyKTsKJiM0MzsJbWVtX21hcF9waHlzID0gZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTY0ICopbWVtX3B0cik7CiYjNDM7CWlmICghbWVtX21hcF9waHlzKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CXJldHVybiBwaHlzX3RvX3ZpcnQobWVtX21hcF9waHlzKTsKIH0KIAogLyoKQEAgLTYxOSwxOSAmIzQzOzc0MiwyNCBAQCBlYXJseV9wYXJhbSgmIzM0O2tob19zY3JhdGNoJiMzNDssIGtob19wYXJzZV9zY3JhdGNoX3NpemUpOwogc3RhdGljIHZvaWQgX19pbml0IHNjcmF0Y2hfc2l6ZV91cGRhdGUodm9pZCkKIHsKIAkvKgotCSAqIElmIGZpeGVkIHNpemVzIGFyZSBub3QgcHJvdmlkZWQgdmlhIGNvbW1hbmQgbGluZSwgY2FsY3VsYXRlIHRoZW0KLQkgKiBub3cuCiYjNDM7CSAqIElmIGZpeGVkIHNpemVzIGFyZSBub3QgcHJvdmlkZWQgdmlhIGNvbW1hbmQgbGluZSwgY2FsY3VsYXRlIHRoZW0gbm93LgomIzQzOwkgKiBSZW1vdmUgSHVnZVRMQiBhbGxvY2F0aW9ucyBmcm9tIGl0IGJlY2F1c2UgdGhleSBuZXZlciBnZXQgYWxsb2NhdGVkCiYjNDM7CSAqIGZyb20gc2NyYXRjaC4KIAkgKi8KIAlpZiAoc2NyYXRjaF9zY2FsZSkgewogCQlwaHlzX2FkZHJfdCBzaXplOwogCiAJCXNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoQVJDSF9MT1dfQUREUkVTU19MSU1JVCwKIAkJCQkJCSAgIE5VTUFfTk9fTk9ERSk7CiYjNDM7CQlzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShBUkNIX0xPV19BRERSRVNTX0xJTUlULAomIzQzOwkJCQkJCSAgICAgICBOVU1BX05PX05PREUpOwogCQlzaXplID0gc2l6ZSAqIHNjcmF0Y2hfc2NhbGUgLyAxMDA7CiAJCXNjcmF0Y2hfc2l6ZV9sb3dtZW0gPSBzaXplOwogCiAJCXNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsCiAJCQkJCQkgICBOVU1BX05PX05PREUpOwomIzQzOwkJc2l6ZSAtPSBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsCiYjNDM7CQkJCQkJICAgICAgIE5VTUFfTk9fTk9ERSk7CiAJCXNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMCAtIHNjcmF0Y2hfc2l6ZV9sb3dtZW07CiAJCXNjcmF0Y2hfc2l6ZV9nbG9iYWwgPSBzaXplOwogCX0KQEAgLTY1MSw2ICYjNDM7Nzc5LDkgQEAgc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBzY3JhdGNoX3NpemVfbm9kZShpbnQgbmlkKQogCWlmIChzY3JhdGNoX3NjYWxlKSB7CiAJCXNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsCiAJCQkJCQkgICBuaWQpOwomIzQzOwkJLyogRG8gbm90IGNvdW50IEh1Z2VUTEIgcGFnZXMuICovCiYjNDM7CQlzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSwKJiM0MzsJCQkJCQkgICAgICAgbmlkKTsKIAkJc2l6ZSA9IHNpemUgKiBzY3JhdGNoX3NjYWxlIC8gMTAwOwogCX0gZWxzZSB7CiAJCXNpemUgPSBzY3JhdGNoX3NpemVfcGVybm9kZTsKQEAgLTY1OSw2ICYjNDM7NzkwLDQ5IEBAIHN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgc2NyYXRjaF9zaXplX25vZGUoaW50IG5pZCkKIAlyZXR1cm4gcm91bmRfdXAoc2l6ZSwgQ01BX01JTl9BTElHTk1FTlRfQllURVMpOwogfQogCiYjNDM7Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKQomIzQzO3sKJiM0MzsJcGh5c19hZGRyX3Qgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQ7CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsga2hvX3NjcmF0Y2hfY250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJc2NyYXRjaF9zdGFydCA9IGtob19zY3JhdGNoW2ldLmFkZHI7CiYjNDM7CQlzY3JhdGNoX2VuZCA9IGtob19zY3JhdGNoW2ldLmFkZHIgJiM0Mzsga2hvX3NjcmF0Y2hbaV0uc2l6ZTsKJiM0MzsKJiM0MzsJCWlmIChwaHlzICZsdDsgc2NyYXRjaF9lbmQgJmFtcDsmYW1wOyAocGh5cyAmIzQzOyBzaXplKSAmZ3Q7IHNjcmF0Y2hfc3RhcnQpCiYjNDM7CQkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIE1hcmsgYWxsIEtITyBzY3JhdGNoIHBhZ2VibG9ja3MgYmV0d2VlbiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gYXMKJiM0MzsgKiBNSUdSQVRFX0NNQS4KJiM0MzsgKi8KJiM0Mzt2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKJiM0Mzt7CiYjNDM7CWZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpICZsdDsga2hvX3NjcmF0Y2hfY250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJdW5zaWduZWQgbG9uZyBzY3JhdGNoX3N0YXJ0LCBzY3JhdGNoX2VuZCwgcGZuOwomIzQzOwomIzQzOwkJc2NyYXRjaF9zdGFydCA9IFBIWVNfUEZOKGtob19zY3JhdGNoW2ldLmFkZHIpOwomIzQzOwkJc2NyYXRjaF9lbmQgPSBQSFlTX1BGTihraG9fc2NyYXRjaFtpXS5hZGRyICYjNDM7IGtob19zY3JhdGNoW2ldLnNpemUpOwomIzQzOwomIzQzOwkJLyogVGFyZ2V0IHJhbmdlIGRvZXNuJiMzOTt0IG92ZXJsYXAgd2l0aCBzY3JhdGNoLiAqLwomIzQzOwkJaWYgKHN0YXJ0X3BmbiAmZ3Q7PSBzY3JhdGNoX2VuZCB8fCBlbmRfcGZuICZsdDs9IHNjcmF0Y2hfc3RhcnQpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlwZm4gPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBzdGFydF9wZm4sIHNjcmF0Y2hfc3RhcnQpOwomIzQzOwkJcGZuID0gcGFnZWJsb2NrX3N0YXJ0X3BmbihwZm4pOwomIzQzOwomIzQzOwkJd2hpbGUgKHBmbiAmbHQ7IGVuZF9wZm4gJmFtcDsmYW1wOyBwZm4gJmx0OyBzY3JhdGNoX2VuZCkgewomIzQzOwkJCWluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBmbl90b19wYWdlKHBmbiksCiYjNDM7CQkJCQkJICAgTUlHUkFURV9DTUEsIGZhbHNlKTsKJiM0MzsJCQlwZm4gJiM0Mzs9IHBhZ2VibG9ja19ucl9wYWdlczsKJiM0MzsJCX0KJiM0MzsJfQomIzQzO30KJiM0MzsKIC8qKgogICoga2hvX3Jlc2VydmVfc2NyYXRjaCAtIFJlc2VydmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBmb3Iga2V4ZWMKICAqCkBAIC03NDYsNiAmIzQzOzkyMCwxMjggQEAgc3RhdGljIHZvaWQgX19pbml0IGtob19yZXNlcnZlX3NjcmF0Y2godm9pZCkKIAlraG9fZW5hYmxlID0gZmFsc2U7CiB9CiAKJiM0MzsvKgomIzQzOyAqIExvb2sgZm9yIGZyZWUgYmxvY2tzIG9mIDFHLiBUaGlzIGlzIGEgaGV1cmlzdGljIGNob3NlbiB0byB3b3JrIGVmZmljaWVudGx5CiYjNDM7ICogd2l0aCBsYXJnZSBzeXN0ZW1zIHdpdGggaHVuZHJlZHMgb2YgZ2lnYWJ5dGVzIG9mIG1lbW9yeS4gSXQgd2lsbCB3b3JrIHBvb3JseQomIzQzOyAqIG9uIHNtYWxsZXIgc3lzdGVtcy4gVGhlIGFsZ29yaXRobSBpdHNlbGYgZG9lc24mIzM5O3QgZGVwZW5kIG9uIHRoZSBhY3R1YWwgdmFsdWUsCiYjNDM7ICogc28gaXQgY2FuIGJlIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgaGV1cmlzdGljIGxhdGVyIGlmIG5lZWRlZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIEtIT19FWFRfQkxLU0laRQkJU1pfMUcKJiM0MzsjZGVmaW5lIEtIT19FWFRfU0hJRlQJCWNvbnN0X2lsb2cyKEtIT19FWFRfQkxLU0laRSkKJiM0MzsKJiM0MzsvKiBDYWxsZWQgZm9yIHRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiAqLwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfd2Fsa19sZWFmKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJLyogUmFkaXggdHJlZSB0cmFja2luZyBmcmVlIGJsb2Nrcy4gKi8KJiM0MzsJc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlID0gZGF0YTsKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKJiM0MzsJdW5zaWduZWQgaW50IG9yZGVyOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlzdGFydCA9IGtob19kZWNvZGVfcmFkaXhfa2V5KGtleSwgJmFtcDtvcmRlcik7CiYjNDM7CWVuZCA9IHN0YXJ0ICYjNDM7ICgxVUwgJmx0OyZsdDsgKG9yZGVyICYjNDM7IFBBR0VfU0hJRlQpKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHN0YXJ0ICZsdDsgZW5kKSB7CiYjNDM7CQllcnIgPSBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBzdGFydCAmZ3Q7Jmd0OyBLSE9fRVhUX1NISUZUKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJCXN0YXJ0ICYjNDM7PSAoMVVMICZsdDsmbHQ7IEtIT19FWFRfU0hJRlQpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBDYWxsZWQgZm9yIHRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiAqLwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfd2Fsa19ub2RlKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwkvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqLwomIzQzOwlzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUgPSBkYXRhOwomIzQzOwomIzQzOwlyZXR1cm4ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgcGh5cyAmZ3Q7Jmd0OyBLSE9fRVhUX1NISUZUKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ2FsbGVkIGZvciB0aGUgZnJlZSBibG9jayByYWRpeCB0cmVlLiAqLwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfbWFya19zY3JhdGNoKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJcGh5c19hZGRyX3QgKnByZXZfZW5kID0gZGF0YTsKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQgPSBrZXkgJmx0OyZsdDsgS0hPX0VYVF9TSElGVDsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKHN0YXJ0ICZndDsgKnByZXZfZW5kKSB7CiYjNDM7CQllcnIgPSBtZW1ibG9ja19tYXJrX2tob19zY3JhdGNoKCpwcmV2X2VuZCwgc3RhcnQgLSAqcHJldl9lbmQpOwomIzQzOwkJaWYgKGVycikKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CSpwcmV2X2VuZCA9IHN0YXJ0ICYjNDM7ICgxVUwgJmx0OyZsdDsgS0hPX0VYVF9TSElGVCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGtob19leHRlbmRfc2NyYXRjaCAtIEV4dGVuZCB0aGUgc2NyYXRjaCByZWdpb25zCiYjNDM7ICoKJiM0MzsgKiBUaGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZSBtaXhlcyBib3RoIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyCiYjNDM7ICogaW50byBhIHNpbmdsZSBrZXkuIFRoaXMgbWFrZXMgaXQgaGFyZCB0byBsb29rIGZvciBmcmVlIHJhbmdlcyBkaXJlY3RseS4gVGhpcwomIzQzOyAqIGZ1bmN0aW9uIGZpcnN0IHdhbGtzIHRoZSByYWRpeCB0cmVlIGFuZCBkaWdlc3RzIGl0IGRvd24gaW50byBhbm90aGVyIHJhZGl4CiYjNDM7ICogdHJlZSwgd2hvc2Uga2V5cyBpZGVudGlmeSBibG9ja3Mgb2YgS0hPX0VYVF9TSElGVCB3aGljaCBjb250YWluIHByZXNlcnZlZAomIzQzOyAqIG1lbW9yeS4KJiM0MzsgKgomIzQzOyAqIFRoZW4gaXQgd2Fsa3MgdGhlIGRpZ2VzdGVkIHJhZGl4IHRyZWUgYW5kIG1hcmtzIGV2ZXJ5dGhpbmcgdGhhdCBkb2VzbiYjMzk7dCBoYXZlCiYjNDM7ICogcHJlc2VydmVkIG1lbW9yeSBhcyBzY3JhdGNoLgomIzQzOyAqCiYjNDM7ICogTk9URTogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IHNvIGl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBzY3JhdGNoIGhhcwomIzQzOyAqIGF2YWlsYWJsZSBzcGFjZS4KJiM0MzsgKgomIzQzOyAqIE5PVEU6IFRoZSBwYWdlcyBvZiB0aGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZSB0YWJsZXMgYXJlIG5vdCBtYXJrZWQKJiM0MzsgKiBhcyBwcmVzZXJ2ZWQgaW4gdGhlIHByZXNlcnZlZCBtZW1vcnkgdHJlZS4gQnV0IHRoZXkgYXJlIGV4cGVjdGVkIHRvIHJlbWFpbgomIzQzOyAqIHVudG91Y2hlZCB1bnRpbCB0aGUgdHJlZSBpcyBmdWxseSBwYXJzZWQuIFNvIHRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMKJiM0MzsgKiB0aGVtIHRvIGJlICYjMzQ7cHJlc2VydmVkIG1lbW9yeSYjMzQ7IGFuZCBtYXJrcyB0aGVpciBibG9ja3MgYXMgYnVzeS4KJiM0MzsgKgomIzQzOyAqIE5PVEU6IGVmaV9pbml0KCk6OnJlc2VydmVfcmVnaW9ucygpIHJlbW92ZXMgYWxsIHJlZ2lvbnMgZXhjZXB0CiYjNDM7ICogTUVNQkxPQ0tfS0hPX1NDUkFUQ0guIFRoaXMgZnVuY3Rpb24gYWRkcyBzdWNoIHJlZ2lvbnMgYnV0IHRoZXkgYXJlIG5vdCBLSE8KJiM0MzsgKiBzY3JhdGNoIG1lbW9yeSwgc28gdGhleSBzaG91bGQgbm90IGJlIHJlbW92ZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyBiZQomIzQzOyAqIGNhbGxlZCBhZnRlciByZXNlcnZlX3JlZ2lvbnMoKS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBfX2luaXQga2hvX2V4dGVuZF9zY3JhdGNoKHZvaWQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2Iga2hvX2NiID0gewomIzQzOwkJLmxlYWYgPSBraG9fZXh0X3dhbGtfbGVhZiwKJiM0MzsJCS5ub2RlID0ga2hvX2V4dF93YWxrX25vZGUsCiYjNDM7CX07CiYjNDM7CWNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiBleHRfY2IgPSB7CiYjNDM7CQkubGVhZiA9IGtob19leHRfbWFya19zY3JhdGNoLAomIzQzOwl9OwomIzQzOwlzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgcmFkaXg7CiYjNDM7CXBoeXNfYWRkcl90IHByZXZfZW5kID0gMDsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CWVyciA9IGtob19yYWRpeF9pbml0X3RyZWUoJmFtcDtyYWRpeCwgTlVMTCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlnb3RvIHByaW50OwomIzQzOwomIzQzOwkvKiBXYWxrIHRoZSBLSE8gcmFkaXggdHJlZSB0byBmaW5kIGJ1c3kgYmxvY2tzLiAqLwomIzQzOwllcnIgPSBraG9fcmFkaXhfd2Fsa190cmVlKCZhbXA7a2hvX2luLnJhZGl4X3RyZWUsICZhbXA7a2hvX2NiLCAmYW1wO3JhZGl4KTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBXYWxrIHRoZSBibG9ja3MgYW5kIG1hcmsgZXZlcnl0aGluZyBiZXR3ZWVuIGtleXMgYXMgc2NyYXRjaC4gKi8KJiM0MzsJZXJyID0ga2hvX3JhZGl4X3dhbGtfdHJlZSgmYW1wO3JhZGl4LCAmYW1wO2V4dF9jYiwgJmFtcDtwcmV2X2VuZCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyogTWFyayBldmVyeXRoaW5nIGZyb20gbGFzdCBidXN5IGJsb2NrIHRvIGVuZCBvZiBEUkFNLiAqLwomIzQzOwlpZiAocHJldl9lbmQgJmx0OyBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpKQomIzQzOwkJZXJyID0gbWVtYmxvY2tfbWFya19raG9fc2NyYXRjaChwcmV2X2VuZCwgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSAtIHByZXZfZW5kKTsKJiM0MzsKJiM0MzsJLyogZmFsbHRocm91Z2ggKi8KJiM0MztvdXQ6CiYjNDM7CWtob19yYWRpeF9kZXN0cm95X3RyZWUoJmFtcDtyYWRpeCk7CiYjNDM7cHJpbnQ6CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlwcl9lcnIoJiMzNDtGYWlsZWQgdG8gZXh0ZW5kIHNjcmF0Y2g6ICVwZVxuJiMzNDssIEVSUl9QVFIoZXJyKSk7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBraG9fYWRkX3N1YnRyZWUgLSByZWNvcmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBzdWIgYmxvYiBpbiBLSE8gcm9vdCB0cmVlLgogICogQG5hbWU6IG5hbWUgb2YgdGhlIHN1YiB0cmVlLgpAQCAtODU2LDEwICYjNDM7MTE1MiwxMiBAQCBpbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJY29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBmb2xpb19wZm4oZm9saW8pOwogCWNvbnN0IHVuc2lnbmVkIGludCBvcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAotCWlmIChXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAocGZuICZsdDsmbHQ7IFBBR0VfU0hJRlQsIFBBR0VfU0laRSAmbHQ7Jmx0OyBvcmRlcikpKQomIzQzOwlpZiAoSVNfRU5BQkxFRChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpICZhbXA7JmFtcDsKJiM0MzsJICAgIFdBUk5fT04oa2hvX3NjcmF0Y2hfb3ZlcmxhcChwZm4gJmx0OyZsdDsgUEFHRV9TSElGVCwgUEFHRV9TSVpFICZsdDsmbHQ7IG9yZGVyKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGtob19yYWRpeF9hZGRfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTsKJiM0MzsJcmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksCiYjNDM7CQkJCQkJCSAgICBvcmRlcikpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3ByZXNlcnZlX2ZvbGlvKTsKIApAQCAtODc3LDcgJiM0MzsxMTc1LDcgQEAgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCWNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gZm9saW9fcGZuKGZvbGlvKTsKIAljb25zdCB1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAKLQlraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7CiYjNDM7CWtob19yYWRpeF9kZWxfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksIG9yZGVyKSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChraG9fdW5wcmVzZXJ2ZV9mb2xpbyk7CiAKQEAgLTkwNiw3ICYjNDM7MTIwNCw4IEBAIHN0YXRpYyB2b2lkIF9fa2hvX3VucHJlc2VydmUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLAogCXdoaWxlIChwZm4gJmx0OyBlbmRfcGZuKSB7CiAJCW9yZGVyID0gX19raG9fcHJlc2VydmVfcGFnZXNfb3JkZXIocGZuLCBlbmRfcGZuKTsKIAotCQlraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7CiYjNDM7CQlraG9fcmFkaXhfZGVsX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLAomIzQzOwkJCQkJCQkgICAgIG9yZGVyKSk7CiAKIAkJcGZuICYjNDM7PSAxICZsdDsmbHQ7IG9yZGVyOwogCX0KQEAgLTkzMSw3ICYjNDM7MTIzMCw4IEBAIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiAJdW5zaWduZWQgbG9uZyBmYWlsZWRfcGZuID0gMDsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAoc3RhcnRfcGZuICZsdDsmbHQ7IFBBR0VfU0hJRlQsCiYjNDM7CWlmIChJU19FTkFCTEVEKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRykgJmFtcDsmYW1wOwomIzQzOwkgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiAmbHQ7Jmx0OyBQQUdFX1NISUZULAogCQkJCQlucl9wYWdlcyAmbHQ7Jmx0OyBQQUdFX1NISUZUKSkpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTM5LDcgJiM0MzsxMjM5LDggQEAgaW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKIAl3aGlsZSAocGZuICZsdDsgZW5kX3BmbikgewogCQl1bnNpZ25lZCBpbnQgb3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pOwogCi0JCWVyciA9IGtob19yYWRpeF9hZGRfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTsKJiM0MzsJCWVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksCiYjNDM7CQkJCQkJCQkgICBvcmRlcikpOwogCQlpZiAoZXJyKSB7CiAJCQlmYWlsZWRfcGZuID0gcGZuOwogCQkJYnJlYWs7CkBAIC0xMzE1LDIyICYjNDM7MTYxNiw2IEBAIHZvaWQga2hvX3Jlc3RvcmVfZnJlZSh2b2lkICptZW0pCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChraG9fcmVzdG9yZV9mcmVlKTsKIAotc3RydWN0IGtob19pbiB7Ci0JcGh5c19hZGRyX3QgZmR0X3BoeXM7Ci0JcGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzOwotCWNoYXIgcHJldmlvdXNfcmVsZWFzZVtfX05FV19VVFNfTEVOICYjNDM7IDFdOwotCXUzMiBrZXhlY19jb3VudDsKLQlzdHJ1Y3Qga2hvX2RlYnVnZnMgZGJnOwotfTsKLQotc3RhdGljIHN0cnVjdCBraG9faW4ga2hvX2luID0gewotfTsKLQotc3RhdGljIGNvbnN0IHZvaWQgKmtob19nZXRfZmR0KHZvaWQpCi17Ci0JcmV0dXJuIGtob19pbi5mZHRfcGh5cyA/IHBoeXNfdG9fdmlydChraG9faW4uZmR0X3BoeXMpIDogTlVMTDsKLX0KLQogLyoqCiAgKiBpc19raG9fYm9vdCAtIGNoZWNrIGlmIGN1cnJlbnQga2VybmVsIHdhcyBib290ZWQgdmlhIEtITy1lbmFibGVkCiAgKiBrZXhlYwpAQCAtMTM5OCwyNiAmIzQzOzE2ODMsMjQgQEAgaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChraG9fcmV0cmlldmVfc3VidHJlZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGtob19tZW1fcmV0cmlldmUoY29uc3Qgdm9pZCAqZmR0KQomIzQzO3N0YXRpYyB2b2lkIF9faW5pdCBraG9fbWVtX3JldHJpZXZlKHZvaWQpCiB7Ci0Jc3RydWN0IGtob19yYWRpeF90cmVlIHRyZWU7Ci0JY29uc3QgcGh5c19hZGRyX3QgKm1lbTsKLQlpbnQgbGVuOwomIzQzOwljb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgY2IgPSB7CiYjNDM7CQkubGVhZiA9IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUsCiYjNDM7CX07CiAKLQkvKiBSZXRyaWV2ZSB0aGUgS0hPIHJhZGl4IHRyZWUgZnJvbSBwYXNzZWQtaW4gRkRULiAqLwotCW1lbSA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgJmFtcDtsZW4pOwomIzQzOwlpZiAoa2hvX3JhZGl4X3dhbGtfdHJlZSgmYW1wO2tob19pbi5yYWRpeF90cmVlLCAmYW1wO2NiLCBOVUxMKSkKJiM0MzsJCWdvdG8gZXJyOwogCi0JaWYgKCFtZW0gfHwgbGVuICE9IHNpemVvZigqbWVtKSkgewotCQlwcl9lcnIoJiMzNDtmYWlsZWQgdG8gZ2V0IHByZXNlcnZlZCBLSE8gbWVtb3J5IHRyZWVcbiYjMzQ7KTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JaWYgKCEqbWVtKQotCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJcmV0dXJuOwogCi0JdHJlZS5yb290ID0gcGh5c190b192aXJ0KCptZW0pOwotCW11dGV4X2luaXQoJmFtcDt0cmVlLmxvY2spOwotCXJldHVybiBraG9fcmFkaXhfd2Fsa190cmVlKCZhbXA7dHJlZSwga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSk7CiYjNDM7ZXJyOgomIzQzOwkvKgomIzQzOwkgKiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcmVzZXJ2ZWQgbWVtb3J5LiBDbGVhciBGRFQgYW5kIHJhZGl4IHNvIEtITwomIzQzOwkgKiB1c2VycyBkb24mIzM5O3QgdHJlYXQgaXQgYXMgYSBLSE8gYm9vdC4KJiM0MzsJICovCiYjNDM7CWtob19pbi5mZHRfcGh5cyA9IDA7CiYjNDM7CWtob19pbi5yYWRpeF90cmVlLnJvb3QgPSBOVUxMOwogfQogCiBzdGF0aWMgX19pbml0IGludCBraG9fb3V0X2ZkdF9zZXR1cCh2b2lkKQpAQCAtMTU0MywxNiAmIzQzOzE4MjYsMTQgQEAgc3RhdGljIF9faW5pdCBpbnQga2hvX2luaXQodm9pZCkKIAlpZiAoIWtob19lbmFibGUpCiAJCXJldHVybiAwOwogCi0JdHJlZS0mZ3Q7cm9vdCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRyZWUtJmd0O3Jvb3QpIHsKLQkJZXJyID0gLUVOT01FTTsKJiM0MzsJZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZSh0cmVlLCBOVUxMKTsKJiM0MzsJaWYgKGVycikKIAkJZ290byBlcnJfZnJlZV9zY3JhdGNoOwotCX0KIAogCWtob19vdXQuZmR0ID0ga2hvX2FsbG9jX3ByZXNlcnZlKFBBR0VfU0laRSk7CiAJaWYgKElTX0VSUihraG9fb3V0LmZkdCkpIHsKIAkJZXJyID0gUFRSX0VSUihraG9fb3V0LmZkdCk7Ci0JCWdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWVfcm9vdDsKJiM0MzsJCWdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU7CiAJfQogCiAJZXJyID0ga2hvX2RlYnVnZnNfaW5pdCgpOwpAQCAtMTYwMyw5ICYjNDM7MTg4NCw4IEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpCiAKIGVycl9mcmVlX2ZkdDoKIAlraG9fdW5wcmVzZXJ2ZV9mcmVlKGtob19vdXQuZmR0KTsKLWVycl9mcmVlX2tob19yYWRpeF90cmVlX3Jvb3Q6Ci0Ja2ZyZWUodHJlZS0mZ3Q7cm9vdCk7Ci0JdHJlZS0mZ3Q7cm9vdCA9IE5VTEw7CiYjNDM7ZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU6CiYjNDM7CWtob19yYWRpeF9kZXN0cm95X3RyZWUodHJlZSk7CiBlcnJfZnJlZV9zY3JhdGNoOgogCWtob19vdXQuZmR0ID0gTlVMTDsKIAlmb3IgKGludCBpID0gMDsgaSAmbHQ7IGtob19zY3JhdGNoX2NudDsgaSYjNDM7JiM0MzspIHsKQEAgLTE2MTksMTYgJiM0MzsxODk5LDQzIEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpCiB9CiBmc19pbml0Y2FsbChraG9faW5pdCk7CiAKLXZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdCh2b2lkKQomIzQzO3ZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKQogewotCWlmIChraG9faW4uc2NyYXRjaF9waHlzKSB7Ci0JCWtob19zY3JhdGNoID0gcGh5c190b192aXJ0KGtob19pbi5zY3JhdGNoX3BoeXMpOwomIzQzOwljb25zdCB2b2lkICpmZHQgPSBraG9fZ2V0X2ZkdCgpOwogCi0JCWlmIChraG9fbWVtX3JldHJpZXZlKGtob19nZXRfZmR0KCkpKQotCQkJa2hvX2luLmZkdF9waHlzID0gMDsKLQl9IGVsc2UgewotCQlraG9fcmVzZXJ2ZV9zY3JhdGNoKCk7CiYjNDM7CWlmICghaXNfa2hvX2Jvb3QoKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICoga2hvX3NjcmF0Y2hfb3ZlcmxhcCgpIG5lZWRzIGtob19zY3JhdGNoIHRvIGJlIGluaXRpYWxpemVkLiBJdAomIzQzOwkgKiBpcyB1c2VkIGJ5IGZyZWVfYXJlYV9pbml0KCkgb24gS0hPIGJvb3RzLCBzbyBpbml0aWFsaXplIGl0CiYjNDM7CSAqIGVhcmx5LgomIzQzOwkgKi8KJiM0MzsJa2hvX3NjcmF0Y2ggPSBwaHlzX3RvX3ZpcnQoa2hvX2luLnNjcmF0Y2hfcGh5cyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGtob19nZXRfbWVtX21hcCgpIHNob3VsZCBhbHdheXMgc3VjY2VlZC4gSWYgaXQgZmFpbHMsIGtob19wb3B1bGF0ZSgpCiYjNDM7CSAqIGNhdGNoZXMgdGhhdCBhbmQgbmV2ZXIgc2V0cyBraG9faW4uZmR0X3BoeXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoa2hvX3JhZGl4X2luaXRfdHJlZSgmYW1wO2tob19pbi5yYWRpeF90cmVlLCBraG9fZ2V0X21lbV9tYXAoZmR0KSkpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUuIENsZWFyIEZEVAomIzQzOwkJICogYW5kIHNjcmF0Y2ggc28gS0hPIHVzZXJzIGRvbiYjMzk7dCB0cmVhdCBpdCBhcyBhIEtITyBib290LgomIzQzOwkJICovCiYjNDM7CQlraG9faW4uZmR0X3BoeXMgPSAwOwomIzQzOwkJa2hvX2luLnNjcmF0Y2hfcGh5cyA9IDA7CiYjNDM7CQlyZXR1cm47CiAJfQomIzQzOwomIzQzOwlraG9fZXh0ZW5kX3NjcmF0Y2goKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpZiAoa2hvX2luLnNjcmF0Y2hfcGh5cykKJiM0MzsJCWtob19tZW1fcmV0cmlldmUoKTsKJiM0MzsJZWxzZQomIzQzOwkJa2hvX3Jlc2VydmVfc2NyYXRjaCgpOwogfQogCiB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLApAQCAtMTYzNiw5ICYjNDM7MTk0Myw4IEBAIHZvaWQgX19pbml0IGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sCiB7CiAJdW5zaWduZWQgaW50IHNjcmF0Y2hfY250ID0gc2NyYXRjaF9sZW4gLyBzaXplb2YoKmtob19zY3JhdGNoKTsKIAlzdHJ1Y3Qga2hvX3NjcmF0Y2ggKnNjcmF0Y2ggPSBOVUxMOwotCXBoeXNfYWRkcl90IG1lbV9tYXBfcGh5czsKLQl2b2lkICpmZHQgPSBOVUxMOwogCWJvb2wgcG9wdWxhdGVkID0gZmFsc2U7CiYjNDM7CXZvaWQgKmZkdCA9IE5VTEw7CiAJaW50IGVycjsKIAogCS8qIFZhbGlkYXRlIHRoZSBpbnB1dCBGRFQgKi8KQEAgLTE2NjAsOCAmIzQzOzE5NjYsMTMgQEAgdm9pZCBfX2luaXQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbiwKIAkJZ290byB1bm1hcF9mZHQ7CiAJfQogCi0JbWVtX21hcF9waHlzID0ga2hvX2dldF9tZW1fbWFwX3BoeXMoZmR0KTsKLQlpZiAoIW1lbV9tYXBfcGh5cykKJiM0MzsJLyoKJiM0MzsJICogQXQgdGhpcyBwb2ludCBwaHlzX3RvX3ZpcnQoKSBkb2VzbiYjMzk7dCB3b3JrIHByb3Blcmx5IGFuZCBzbwomIzQzOwkgKiBraG9fZ2V0X21lbV9tYXAoKSBjYW4gcmV0dXJuIGEgcHJlLUtBU0xSIHZpcnR1YWwgYWRkcmVzcy4gQnV0IGhlcmUgd2UKJiM0MzsJICogb25seSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgbWVtX21hcCBpcyB2YWxpZCBzbyB0aGUgYWN0dWFsIHZhbHVlCiYjNDM7CSAqIGRvZXNuJiMzOTt0IG1hdHRlciBhcyBsb25nIGFzIGl0IGlzbiYjMzk7dCBOVUxMLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFraG9fZ2V0X21lbV9tYXAoZmR0KSkKIAkJZ290byB1bm1hcF9mZHQ7CiAKIAlzY3JhdGNoID0gZWFybHlfbWVtcmVtYXAoc2NyYXRjaF9waHlzLCBzY3JhdGNoX2xlbik7CmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmYjY5NmY1NDI2MTIuLjAwMDAwMDAwMDAwMDAwCi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2RlYnVnLmMKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSwyNSAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIGtleGVjX2hhbmRvdmVyX2RlYnVnLmMgLSBrZXhlYyBoYW5kb3ZlciBvcHRpb25hbCBkZWJ1ZyBmdW5jdGlvbmFsaXR5Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMjUgR29vZ2xlIExMQywgUGFzaGEgVGF0YXNoaW4gJmx0O3Bhc2hhLnRhdGFzaGluQHNvbGVlbi5jb20mZ3Q7Ci0gKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSAmIzM0O0tITzogJiMzNDsgZm10Ci0KLSNpbmNsdWRlICYjMzQ7a2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaCYjMzQ7Ci0KLWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSkKLXsKLQlwaHlzX2FkZHJfdCBzY3JhdGNoX3N0YXJ0LCBzY3JhdGNoX2VuZDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgJmx0OyBraG9fc2NyYXRjaF9jbnQ7IGkmIzQzOyYjNDM7KSB7Ci0JCXNjcmF0Y2hfc3RhcnQgPSBraG9fc2NyYXRjaFtpXS5hZGRyOwotCQlzY3JhdGNoX2VuZCA9IGtob19zY3JhdGNoW2ldLmFkZHIgJiM0Mzsga2hvX3NjcmF0Y2hbaV0uc2l6ZTsKLQotCQlpZiAocGh5cyAmbHQ7IHNjcmF0Y2hfZW5kICZhbXA7JmFtcDsgKHBoeXMgJiM0Mzsgc2l6ZSkgJmd0OyBzY3JhdGNoX3N0YXJ0KQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaCBiL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2ludGVybmFsLmgKaW5kZXggMDM5OWZmMTA3Nzc1MGIuLjgwNWQyYTc2YzM4ODE4IDEwMDY0NAotLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2ludGVybmFsLmgKQEAgLTQxLDEzICYjNDM7NDEsNCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga2hvX2RlYnVnZnNfYmxvYl9yZW1vdmUoc3RydWN0IGtob19kZWJ1Z2ZzICpkYmcsCiAJCQkJCSAgIHZvaWQgKmJsb2IpIHsgfQogI2VuZGlmIC8qIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVR0ZTICovCiAKLSNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcKLWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmIC8qIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRyAqLwotCiAjZW5kaWYgLyogTElOVVhfS0VYRUNfSEFORE9WRVJfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IDU3MTIxMmI4MDgzNWVjLi5hYjRhZmM4MThlOGNiZCAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2V0bGIuYwpAQCAtMzAzMywyOSAmIzQzOzMwMzMsMjEgQEAgc3RhdGljIF9faW5pdCB2b2lkICphbGxvY19ib290bWVtKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQsIGJvb2wgbm9kZV9leGFjdCkKIAlpZiAoaHVnZXRsYl9lYXJseV9jbWEoaCkpCiAJCW0gPSBodWdldGxiX2NtYV9hbGxvY19ib290bWVtKGgsICZhbXA7bGlzdG5vZGUsIG5vZGVfZXhhY3QpOwogCWVsc2UgewotCQlpZiAobm9kZV9leGFjdCkKLQkJCW0gPSBtZW1ibG9ja19hbGxvY19leGFjdF9uaWRfcmF3KGh1Z2VfcGFnZV9zaXplKGgpLAotCQkJCWh1Z2VfcGFnZV9zaXplKGgpLCAwLAotCQkJCU1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUsIG5pZCk7Ci0JCWVsc2UgewotCQkJbSA9IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KGh1Z2VfcGFnZV9zaXplKGgpLAotCQkJCWh1Z2VfcGFnZV9zaXplKGgpLCAwLAotCQkJCU1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUsIG5pZCk7CiYjNDM7CQltID0gbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihodWdlX3BhZ2Vfc2l6ZShoKSwgbmlkLCBub2RlX2V4YWN0KTsKJiM0MzsJCWlmIChtKSB7CiYjNDM7CQkJbS0mZ3Q7ZmxhZ3MgPSAwOwomIzQzOwkJCW0tJmd0O2NtYSA9IE5VTEw7CiYjNDM7CiAJCQkvKgogCQkJICogRm9yIHByZS1IVk8gdG8gd29yayBjb3JyZWN0bHksIHBhZ2VzIG5lZWQgdG8gYmUgb24KIAkJCSAqIHRoZSBsaXN0IGZvciB0aGUgbm9kZSB0aGV5IHdlcmUgYWN0dWFsbHkgYWxsb2NhdGVkCiAJCQkgKiBmcm9tLiBUaGF0IG5vZGUgbWF5IGJlIGRpZmZlcmVudCBpbiB0aGUgY2FzZSBvZgotCQkJICogZmFsbGJhY2sgYnkgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcuIFNvLAomIzQzOwkJCSAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJfYm9vdG1lbS4gU28sCiAJCQkgKiBleHRyYWN0IHRoZSBhY3R1YWwgbm9kZSBmaXJzdC4KIAkJCSAqLwotCQkJaWYgKG0pCiYjNDM7CQkJaWYgKCFub2RlX2V4YWN0KQogCQkJCWxpc3Rub2RlID0gZWFybHlfcGZuX3RvX25pZChQSFlTX1BGTihfX3BhKG0pKSk7CiAJCX0KLQotCQlpZiAobSkgewotCQkJbS0mZ3Q7ZmxhZ3MgPSAwOwotCQkJbS0mZ3Q7Y21hID0gTlVMTDsKLQkJfQogCX0KIAogCWlmIChtKSB7CmRpZmYgLS1naXQgYS9tbS9tZW1ibG9jay5jIGIvbW0vbWVtYmxvY2suYwppbmRleCA2MzQ5YzQ4MTU0ZjRiMS4uYzEwZGZiMDU0ODA2YTcgMTAwNjQ0Ci0tLSBhL21tL21lbWJsb2NrLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtYmxvY2suYwpAQCAtMTUwNiw2ICYjNDM7MTUwNiwzMiBAQCBpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3NldF9ub2RlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUsCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgdm9pZCBtZW1ibG9ja19wcmVwX2FsbG9jYXRpb24ocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IHNpemUsCiYjNDM7CQkJCSAgICAgYm9vbCBsZWFrdHJhY2UpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBTa2lwIGttZW1sZWFrIGZvciB0aG9zZSBwbGFjZXMgbGlrZSBrYXNhbl9pbml0KCkgYW5kCiYjNDM7CSAqIGVhcmx5X3BndGFibGVfYWxsb2MoKSBkdWUgdG8gaGlnaCB2b2x1bWUuCiYjNDM7CSAqLwomIzQzOwlpZiAobGVha3RyYWNlKQomIzQzOwkJLyoKJiM0MzsJCSAqIE1lbWJsb2NrIGFsbG9jYXRlZCBibG9ja3MgYXJlIG5ldmVyIHJlcG9ydGVkIGFzCiYjNDM7CQkgKiBsZWFrcy4gVGhpcyBpcyBiZWNhdXNlIG1hbnkgb2YgdGhlc2UgYmxvY2tzIGFyZQomIzQzOwkJICogb25seSByZWZlcnJlZCB2aWEgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hpY2ggaXMKJiM0MzsJCSAqIG5vdCBsb29rZWQgdXAgYnkga21lbWxlYWsuCiYjNDM7CQkgKi8KJiM0MzsJCWttZW1sZWFrX2FsbG9jX3BoeXMoc3RhcnQsIHNpemUsIDApOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBTb21lIFZpcnR1YWwgTWFjaGluZSBwbGF0Zm9ybXMsIHN1Y2ggYXMgSW50ZWwgVERYIG9yIEFNRCBTRVYtU05QLAomIzQzOwkgKiByZXF1aXJlIG1lbW9yeSB0byBiZSBhY2NlcHRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgdGhlCiYjNDM7CSAqIGd1ZXN0LgomIzQzOwkgKgomIzQzOwkgKiBBY2NlcHQgdGhlIG1lbW9yeSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KJiM0MzsJICovCiYjNDM7CWFjY2VwdF9tZW1vcnkoc3RhcnQsIHNpemUpOwomIzQzO30KJiM0MzsKIC8qKgogICogbWVtYmxvY2tfYWxsb2NfcmFuZ2VfbmlkIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgYmxvY2sKICAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXMKQEAgLTE1ODAsMjggJiM0MzsxNjA2LDcgQEAgcGh5c19hZGRyX3QgX19pbml0IG1lbWJsb2NrX2FsbG9jX3JhbmdlX25pZChwaHlzX2FkZHJfdCBzaXplLAogCXJldHVybiAwOwogCiBkb25lOgotCS8qCi0JICogU2tpcCBrbWVtbGVhayBmb3IgdGhvc2UgcGxhY2VzIGxpa2Uga2FzYW5faW5pdCgpIGFuZAotCSAqIGVhcmx5X3BndGFibGVfYWxsb2MoKSBkdWUgdG8gaGlnaCB2b2x1bWUuCi0JICovCi0JaWYgKGVuZCAhPSBNRU1CTE9DS19BTExPQ19OT0xFQUtUUkFDRSkKLQkJLyoKLQkJICogTWVtYmxvY2sgYWxsb2NhdGVkIGJsb2NrcyBhcmUgbmV2ZXIgcmVwb3J0ZWQgYXMKLQkJICogbGVha3MuIFRoaXMgaXMgYmVjYXVzZSBtYW55IG9mIHRoZXNlIGJsb2NrcyBhcmUKLQkJICogb25seSByZWZlcnJlZCB2aWEgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hpY2ggaXMKLQkJICogbm90IGxvb2tlZCB1cCBieSBrbWVtbGVhay4KLQkJICovCi0JCWttZW1sZWFrX2FsbG9jX3BoeXMoZm91bmQsIHNpemUsIDApOwotCi0JLyoKLQkgKiBTb21lIFZpcnR1YWwgTWFjaGluZSBwbGF0Zm9ybXMsIHN1Y2ggYXMgSW50ZWwgVERYIG9yIEFNRCBTRVYtU05QLAotCSAqIHJlcXVpcmUgbWVtb3J5IHRvIGJlIGFjY2VwdGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBieSB0aGUKLQkgKiBndWVzdC4KLQkgKgotCSAqIEFjY2VwdCB0aGUgbWVtb3J5IG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgotCSAqLwotCWFjY2VwdF9tZW1vcnkoZm91bmQsIHNpemUpOwotCiYjNDM7CW1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihmb3VuZCwgc2l6ZSwgZW5kICE9IE1FTUJMT0NLX0FMTE9DX05PTEVBS1RSQUNFKTsKIAlyZXR1cm4gZm91bmQ7CiB9CiAKQEAgLTE3NTYsNiAmIzQzOzE3NjEsNjkgQEAgdm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY190cnlfbmlkX3JhdygKIAkJCQkgICAgICAgZmFsc2UpOwogfQogCiYjNDM7LyoqCiYjNDM7ICogbWVtYmxvY2tfYWxsb2NfaHVnZXRsYiAtIGFsbG9jYXRlIGJvb3QgbWVtb3J5IGZvciBIdWdlVExCIHBhZ2VzCiYjNDM7ICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlcwomIzQzOyAqIEBuaWQ6ICAgICAgIG5pZCBvZiB0aGUgZnJlZSBtZW1vcnkgdG8gZmluZCwgJU5VTUFfTk9fTk9ERSBmb3IgYW55IG5vZGUKJiM0MzsgKiBAZXhhY3RfbmlkOiBvbmx5IGFsbG9jYXRlIGZyb20gdGhlIHNwZWNpZmllZCBuaWQuIElmICVmYWxzZSwgdGhlIHNwZWNpZmllZAomIzQzOyAqICAgICAgICAgICAgIG5pZCBpcyB0cmllZCBmaXJzdCwgYW5kIHRoZW4gYWxsIG5vZGVzIGFyZSB0cmllZCBhcyBmYWxsYmFjay4KJiM0MzsgKgomIzQzOyAqIEh1Z2VUTEIgcGFnZXMgYXJlIGFsd2F5cyBhbGlnbmVkIGJ5IHRoZWlyIHNpemUsIHNvIHRoZSBhbGlnbm1lbnQgbWF0Y2hlcwomIzQzOyAqIEBzaXplLiBTaW5jZSB0aGUgbWVtb3J5IGlzIGZvciB1c2Vyc3BhY2UsIG1pcnJvcmVkIG1lbW9yeSBpcyBub3QgdXNlZC4gVGhlCiYjNDM7ICogbWVtb3J5IGlzIG5vdCB6ZXJvZWQuIERvZXMgbm90IHBhbmljIGlmIHJlcXVlc3QgY2Fubm90IGJlIHNhdGlzZmllZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvbiBzdWNjZXNzLCAlTlVMTCBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3ZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZCkKJiM0Mzt7CiYjNDM7CWVudW0gbWVtYmxvY2tfZmxhZ3MgZmxhZ3MgPSBjaG9vc2VfbWVtYmxvY2tfZmxhZ3MoKTsKJiM0MzsJcGh5c19hZGRyX3QgYWRkciwgc3RhcnQgPSAwLCBlbmQgPSBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFOwomIzQzOwomIzQzOwltZW1ibG9ja19kYmcoJiMzNDslczogJWxsdSBieXRlcywgbmlkPSVkLCBleGFjdF9uaWQ9JWQgJXBTXG4mIzM0OywgX19mdW5jX18sCiYjNDM7CQkgICAgICh1NjQpc2l6ZSwgbmlkLCBleGFjdF9uaWQsICh2b2lkICopX1JFVF9JUF8pOwomIzQzOwomIzQzOwkvKiBEb24mIzM5O3Qgd2FzdGUgbWlycm9yZWQgbWVtb3J5IG9uIEh1Z2VUTEIgcGFnZXMuICovCiYjNDM7CWZsYWdzICZhbXA7PSB+TUVNQkxPQ0tfTUlSUk9SOwomIzQzO3JldHJ5OgomIzQzOwkvKiBIdWdlVExCIHBhZ2VzIGFyZSBhbHdheXMgYWxpZ25lZCBieSB0aGVpciBzaXplLiAqLwomIzQzOwlhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZV9ub2RlKHNpemUsIHNpemUsIHN0YXJ0LCBlbmQsIG5pZCwgZmxhZ3MpOwomIzQzOwlpZiAoYWRkcikKJiM0MzsJCWdvdG8gZm91bmQ7CiYjNDM7CiYjNDM7CS8qIFRyeSBhbGwgbm9kZXMgaWYgYWxsb3dlZC4gKi8KJiM0MzsJaWYgKG51bWFfdmFsaWRfbm9kZShuaWQpICZhbXA7JmFtcDsgIWV4YWN0X25pZCkgewomIzQzOwkJbmlkID0gTlVNQV9OT19OT0RFOwomIzQzOwkJZ290byByZXRyeTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBGb3VuZCBub3RoaW5nLi4uIDotKCAqLwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0Mztmb3VuZDoKJiM0MzsJLyoKJiM0MzsJICogSHVnZVRMQiBwYWdlcyBjYW4gYmUgcHJlc2VydmVkIHdpdGggS0hPIGFuZCBubyBwcmVzZXJ2ZWQgbWVtb3J5IGNhbgomIzQzOwkgKiBiZSBpbiBzY3JhdGNoLiBTbyByZXRyeSBpZiBmb3VuZCBhZGRyZXNzIG92ZXJsYXBzIHdpdGggc2NyYXRjaC4KJiM0MzsJICoKJiM0MzsJICogU2NyYXRjaCBhcmVhcyBhcmUgbm9ybWFsbHkgbm90IHZlcnkgbGFyZ2UsIHNvIHRoaXMgc2hvdWxkbiYjMzk7dCB0YWtlIHRvbwomIzQzOwkgKiBtYW55IHJldHJpZXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoa2hvX3NjcmF0Y2hfb3ZlcmxhcChhZGRyLCBzaXplKSkgewomIzQzOwkJaWYgKG1lbWJsb2NrX2JvdHRvbV91cCgpKQomIzQzOwkJCXN0YXJ0ID0gYWRkciAmIzQzOyBzaXplOwomIzQzOwkJZWxzZQomIzQzOwkJCXN0YXJ0ID0gYWRkciAtIHNpemU7CiYjNDM7CiYjNDM7CQlnb3RvIHJldHJ5OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChfX21lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSwgbmlkLCBNRU1CTE9DS19SU1JWX0tFUk4gfCBNRU1CTE9DS19SU1JWX0hVR0VUTEIpKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CW1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihhZGRyLCBzaXplLCB0cnVlKTsKJiM0MzsJcmV0dXJuIHBoeXNfdG9fdmlydChhZGRyKTsKJiM0Mzt9CiYjNDM7CiAvKioKICAqIG1lbWJsb2NrX2FsbG9jX3RyeV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9jawogICogQHNpemU6IHNpemUgb2YgbWVtb3J5IGJsb2NrIHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlcwpAQCAtMTgyNSw2ICYjNDM7MTg5MywyOCBAQCBwaHlzX2FkZHJfdCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh2b2lkKQogCXJldHVybiBtZW1ibG9jay5yZXNlcnZlZC50b3RhbF9zaXplOwogfQogCiYjNDM7cGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7CiYjNDM7CXBoeXNfYWRkcl90IHRvdGFsID0gMDsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfcmVzZXJ2ZWRfbWVtX3JlZ2lvbihyKSB7CiYjNDM7CQlwaHlzX2FkZHJfdCBzaXplID0gci0mZ3Q7c2l6ZTsKJiM0MzsKJiM0MzsJCWlmIChyLSZndDtiYXNlICZndDsgbGltaXQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CiYjNDM7CQlpZiAoci0mZ3Q7YmFzZSAmIzQzOyByLSZndDtzaXplICZndDsgbGltaXQpCiYjNDM7CQkJc2l6ZSA9IGxpbWl0IC0gci0mZ3Q7YmFzZTsKJiM0MzsKJiM0MzsJCWlmIChuaWQgPT0gbWVtYmxvY2tfZ2V0X3JlZ2lvbl9ub2RlKHIpIHx8ICFudW1hX3ZhbGlkX25vZGUobmlkKSkKJiM0MzsJCQlpZiAoci0mZ3Q7ZmxhZ3MgJmFtcDsgTUVNQkxPQ0tfUlNSVl9IVUdFVExCKQomIzQzOwkJCQl0b3RhbCAmIzQzOz0gc2l6ZTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gdG90YWw7CiYjNDM7fQomIzQzOwogcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCkKIHsKIAlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyOwpAQCAtMjUxMSwxNiAmIzQzOzI2MDEsNiBAQCBfX2luaXQgdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpCiB7CiAJa2hvX3NjcmF0Y2hfb25seSA9IGZhbHNlOwogfQotCi1ib29sIF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19pc19raG9fc2NyYXRjaF9tZW1vcnkocGh5c19hZGRyX3QgYWRkcikKLXsKLQlpbnQgaSA9IG1lbWJsb2NrX3NlYXJjaCgmYW1wO21lbWJsb2NrLm1lbW9yeSwgYWRkcik7Ci0KLQlpZiAoaSA9PSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoKCZhbXA7bWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbaV0pOwotfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVIKZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuYwppbmRleCAwZjY0OTA5ZThkMjBlMi4uMWQyZjMwMmQ4Y2Q5YzEgMTAwNjQ0Ci0tLSBhL21tL21tX2luaXQuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9tbV9pbml0LmMKQEAgLTcwNyw5ICYjNDM7NzA3LDEwIEBAIHZvaWQgX19tZW1pbml0IF9faW5pdF9wYWdlX2Zyb21fbmlkKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKQogCV9faW5pdF9zaW5nbGVfcGFnZShwZm5fdG9fcGFnZShwZm4pLCBwZm4sIHppZCwgbmlkKTsKIAogCWlmIChwYWdlYmxvY2tfYWxpZ25lZChwZm4pKSB7Ci0JCWVudW0gbWlncmF0ZXR5cGUgbXQgPQotCQkJa2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBNSUdSQVRFX01PVkFCTEUpOwotCQlpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwZm5fdG9fcGFnZShwZm4pLCBtdCwgZmFsc2UpOwomIzQzOwkJaW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgTUlHUkFURV9NT1ZBQkxFLAomIzQzOwkJCQkJICAgZmFsc2UpOwomIzQzOwkJLyogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgaW4gY2FzZSBpdCBpcyBLSE8gc2NyYXRjaC4gKi8KJiM0MzsJCWtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBwZm4gJiM0MzsgMSk7CiAJfQogfQogCkBAIC05MzgsMTMgJiM0Mzs5MzksMjIgQEAgdm9pZCBfX21lbWluaXQgbWVtbWFwX2luaXRfcmFuZ2UodW5zaWduZWQgbG9uZyBzaXplLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHpvbmUKIAkJfQogCQlwZm4mIzQzOyYjNDM7OwogCX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgZm9yIGFueSBwYWdlYmxvY2tzIHRoYXQgZmFsbCBpbiBhIEtITyBzY3JhdGNoCiYjNDM7CSAqIGFyZWEuIERvIHRoaXMgaGVyZSBvdXRzaWRlIHRoZSBsb29wIGJlY2F1c2UgbW9zdCBwYWdlYmxvY2tzIHdpbGwgbm90CiYjNDM7CSAqIGJlIEtITyBzY3JhdGNoLCBzbyBvbmx5IHNlYXJjaCBvbmNlLgomIzQzOwkgKgomIzQzOwkgKiBPbmx5IHBhZ2VibG9ja3MgdXAgdG8gcGZuIGFyZSB1cGRhdGVkLCBkZWZlcnJlZCBwYWdlYmxvY2tzIHdpbGwgYmUKJiM0MzsJICogdXBkYXRlZCBsYXRlci4KJiM0MzsJICovCiYjNDM7CWtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBwZm4pOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSwKIAkJCQkJICB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQkJICB1bnNpZ25lZCBsb25nIGVuZF9wZm4sCi0JCQkJCSAgdW5zaWduZWQgbG9uZyAqaG9sZV9wZm4sCi0JCQkJCSAgZW51bSBtaWdyYXRldHlwZSBtdCkKJiM0MzsJCQkJCSAgdW5zaWduZWQgbG9uZyAqaG9sZV9wZm4pCiB7CiAJdW5zaWduZWQgbG9uZyB6b25lX3N0YXJ0X3BmbiA9IHpvbmUtJmd0O3pvbmVfc3RhcnRfcGZuOwogCXVuc2lnbmVkIGxvbmcgem9uZV9lbmRfcGZuID0gem9uZV9zdGFydF9wZm4gJiM0Mzsgem9uZS0mZ3Q7c3Bhbm5lZF9wYWdlczsKQEAgLTk1Nyw3ICYjNDM7OTY3LDggQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0X3pvbmVfcmFuZ2Uoc3RydWN0IHpvbmUgKnpvbmUsCiAJCXJldHVybjsKIAogCW1lbW1hcF9pbml0X3JhbmdlKGVuZF9wZm4gLSBzdGFydF9wZm4sIG5pZCwgem9uZV9pZCwgc3RhcnRfcGZuLAotCQkJICB6b25lX2VuZF9wZm4sIE1FTUlOSVRfRUFSTFksIE5VTEwsIG10LCBmYWxzZSk7CiYjNDM7CQkJICB6b25lX2VuZF9wZm4sIE1FTUlOSVRfRUFSTFksIE5VTEwsIE1JR1JBVEVfTU9WQUJMRSwKJiM0MzsJCQkgIGZhbHNlKTsKIAogCWlmICgqaG9sZV9wZm4gJmx0OyBzdGFydF9wZm4pCiAJCWluaXRfdW5hdmFpbGFibGVfcmFuZ2UoKmhvbGVfcGZuLCBzdGFydF9wZm4sIHpvbmVfaWQsIG5pZCk7CkBAIC05NzMsOCAmIzQzOzk4NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdCh2b2lkKQogCiAJZm9yX2VhY2hfbWVtX3Bmbl9yYW5nZShpLCBNQVhfTlVNTk9ERVMsICZhbXA7c3RhcnRfcGZuLCAmYW1wO2VuZF9wZm4sICZhbXA7bmlkKSB7CiAJCXN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZSA9IE5PREVfREFUQShuaWQpOwotCQllbnVtIG1pZ3JhdGV0eXBlIG10ID0KLQkJCWtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgTUlHUkFURV9NT1ZBQkxFKTsKIAogCQlmb3IgKGogPSAwOyBqICZsdDsgTUFYX05SX1pPTkVTOyBqJiM0MzsmIzQzOykgewogCQkJc3RydWN0IHpvbmUgKnpvbmUgPSBub2RlLSZndDtub2RlX3pvbmVzICYjNDM7IGo7CkBAIC05ODMsNyAmIzQzOzk5Miw3IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdCh2b2lkKQogCQkJCWNvbnRpbnVlOwogCiAJCQltZW1tYXBfaW5pdF96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgZW5kX3BmbiwKLQkJCQkJICAgICAgICZhbXA7aG9sZV9wZm4sIG10KTsKJiM0MzsJCQkJCSAgICAgICAmYW1wO2hvbGVfcGZuKTsKIAkJCXpvbmVfaWQgPSBqOwogCQl9CiAJfQpAQCAtMTk3Myw3ICYjNDM7MTk4Miw3IEBAIHVuc2lnbmVkIGxvbmcgX19pbml0IG5vZGVfbWFwX3Bmbl9hbGlnbm1lbnQodm9pZCkKIAogI2lmZGVmIENPTkZJR19ERUZFUlJFRF9TVFJVQ1RfUEFHRV9JTklUCiBzdGF0aWMgdm9pZCBfX2luaXQgZGVmZXJyZWRfZnJlZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwKLQkJdW5zaWduZWQgbG9uZyBucl9wYWdlcywgZW51bSBtaWdyYXRldHlwZSBtdCkKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBpOwpAQCAtMTk4NSw4ICYjNDM7MTk5NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLAogCiAJLyogRnJlZSBhIGxhcmdlIG5hdHVyYWxseS1hbGlnbmVkIGNodW5rIGlmIHBvc3NpYmxlICovCiAJaWYgKG5yX3BhZ2VzID09IE1BWF9PUkRFUl9OUl9QQUdFUyAmYW1wOyZhbXA7IElTX01BWF9PUkRFUl9BTElHTkVEKHBmbikpIHsKLQkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3BhZ2VzOyBpICYjNDM7PSBwYWdlYmxvY2tfbnJfcGFnZXMpCi0JCQlpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlICYjNDM7IGksIG10LCBmYWxzZSk7CiAJCV9fZnJlZV9wYWdlc19jb3JlKHBhZ2UsIE1BWF9QQUdFX09SREVSLCBNRU1JTklUX0VBUkxZKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE5OTQsMTEgJiM0MzsyMDAxLDggQEAgc3RhdGljIHZvaWQgX19pbml0IGRlZmVycmVkX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sCiAJLyogQWNjZXB0IGNodW5rcyBzbWFsbGVyIHRoYW4gTUFYX1BBR0VfT1JERVIgdXBmcm9udCAqLwogCWFjY2VwdF9tZW1vcnkoUEZOX1BIWVMocGZuKSwgbnJfcGFnZXMgKiBQQUdFX1NJWkUpOwogCi0JZm9yIChpID0gMDsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOywgcGFnZSYjNDM7JiM0MzssIHBmbiYjNDM7JiM0MzspIHsKLQkJaWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpCi0JCQlpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlLCBtdCwgZmFsc2UpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7LCBwYWdlJiM0MzsmIzQzOywgcGZuJiM0MzsmIzQzOykKIAkJX19mcmVlX3BhZ2VzX2NvcmUocGFnZSwgMCwgTUVNSU5JVF9FQVJMWSk7Ci0JfQogfQogCiAvKiBDb21wbGV0aW9uIHRyYWNraW5nIGZvciBkZWZlcnJlZF9pbml0X21lbW1hcCgpIHRocmVhZHMgKi8KQEAgLTIwMTcsMTUgJiM0MzsyMDIxLDI5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGdkYXRfaW5pdF9yZXBvcnRfb25lX2RvbmUodm9pZCkKICAqIFJldHVybiBudW1iZXIgb2YgcGFnZXMgaW5pdGlhbGl6ZWQuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkZWZlcnJlZF9pbml0X3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLAotCQl1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQomIzQzOwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKIHsKIAlpbnQgbmlkID0gem9uZV90b19uaWQoem9uZSk7Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGVuZF9wZm4gLSBwZm47CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuLCBwZm4gPSBzdGFydF9wZm47CiAJaW50IHppZCA9IHpvbmVfaWR4KHpvbmUpOwogCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKIAogCWZvciAoOyBwZm4gJmx0OyBlbmRfcGZuOyBwZm4mIzQzOyYjNDM7LCBwYWdlJiM0MzsmIzQzOykKIAkJX19pbml0X3NpbmdsZV9wYWdlKHBhZ2UsIHBmbiwgemlkLCBuaWQpOwomIzQzOwomIzQzOwkvKiBOb3cgaW5pdGlhbGl6ZSBtaWdyYXRlIHR5cGVzIGZvciB0aGVzZSBwYWdlcy4gKi8KJiM0MzsJcGZuID0gcGFnZWJsb2NrX2FsaWduKHN0YXJ0X3Bmbik7CiYjNDM7CXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwomIzQzOwlmb3IgKDsgcGZuICZsdDsgZW5kX3BmbjsgcGZuICYjNDM7PSBwYWdlYmxvY2tfbnJfcGFnZXMsIHBhZ2UgJiM0Mzs9IHBhZ2VibG9ja19ucl9wYWdlcykKJiM0MzsJCWluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIE1JR1JBVEVfTU9WQUJMRSwgZmFsc2UpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBmb3IgYW55IHBhZ2VibG9ja3MgdGhhdCBmYWxsIGluIGEgS0hPIHNjcmF0Y2gKJiM0MzsJICogYXJlYS4gU2luY2UgbW9zdCBwYWdlYmxvY2tzIHdpbGwgbm90IGJlIEtITyBzY3JhdGNoLCBkbyBpdCBvdXRzaWRlCiYjNDM7CSAqIHRoZSBsb29wIHRvIG9ubHkgZG8gdGhlIHNlYXJjaCBvbmNlLgomIzQzOwkgKi8KJiM0MzsJa2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIGVuZF9wZm4pOwomIzQzOwogCXJldHVybiBucl9wYWdlczsKIH0KIApAQCAtMjA1NCw4ICYjNDM7MjA3Miw2IEBAIGRlZmVycmVkX2luaXRfbWVtbWFwX2NodW5rKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4sCiAJZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgbmlkLCAwLCAmYW1wO3N0YXJ0LCAmYW1wO2VuZCwgTlVMTCkgewogCQl1bnNpZ25lZCBsb25nIHNwZm4gPSBQRk5fVVAoc3RhcnQpOwogCQl1bnNpZ25lZCBsb25nIGVwZm4gPSBQRk5fRE9XTihlbmQpOwotCQllbnVtIG1pZ3JhdGV0eXBlIG10ID0KLQkJCWtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHNwZm4sIE1JR1JBVEVfTU9WQUJMRSk7CiAKIAkJaWYgKHNwZm4gJmd0Oz0gZW5kX3BmbikKIAkJCWJyZWFrOwpAQCAtMjA2OCw3ICYjNDM7MjA4NCw3IEBAIGRlZmVycmVkX2luaXRfbWVtbWFwX2NodW5rKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4sCiAJCQl1bnNpZ25lZCBsb25nIGNodW5rX2VuZCA9IG1pbihtb19wZm4sIGVwZm4pOwogCiAJCQlucl9wYWdlcyAmIzQzOz0gZGVmZXJyZWRfaW5pdF9wYWdlcyh6b25lLCBzcGZuLCBjaHVua19lbmQpOwotCQkJZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZuLCBjaHVua19lbmQgLSBzcGZuLCBtdCk7CiYjNDM7CQkJZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZuLCBjaHVua19lbmQgLSBzcGZuKTsKIAogCQkJc3BmbiA9IGNodW5rX2VuZDsKIApAQCAtMjY4Nyw2ICYjNDM7MjcwMyw3IEBAIHZvaWQgX19pbml0IF9fd2VhayBtZW1faW5pdCh2b2lkKQogCiB2b2lkIF9faW5pdCBtbV9jb3JlX2luaXRfZWFybHkodm9pZCkKIHsKJiM0MzsJa2hvX21lbW9yeV9pbml0X2Vhcmx5KCk7CiAJaHVnZXRsYl9jbWFfcmVzZXJ2ZSgpOwogCWh1Z2V0bGJfYm9vdG1lbV9hbGxvYygpOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmggYi90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmgKaW5kZXggYjZiMWQxNDdmZDc1MGUuLmU4NmJiOTAwMGIyMmY4IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oCkBAIC02Niw0ICYjNDM7NjYsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKQogCiAjZGVmaW5lIF9fU2V0UGFnZVJlc2VydmVkKHApCSgodm9pZCkocCkpCiAKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiAjZW5kaWYKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA3MjgKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAyMDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBLZXhlYyBIYW5kb3ZlciBQYXRjaCBTZXJpZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIHRoYXQmIzM5O3MgdGlua2VyaW5nIHdpdGggdGhlIEtleGVjIEhhbmRvdmVyIChLSE8pIGZ1bmN0aW9uYWxpdHkuIEZyb20gdGhlIGRlc2NyaXB0aW9uLCBpdCBzZWVtcyBsaWtlIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggc29tZSBzaWduaWZpY2FudCBjaGFuZ2VzOiBrZXkgZW5jb2Rpbmcgd2l0aGluIHRoZSBLSE8gcmFkaXggdHJlZSwgdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyBlYXJseSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBga2hvX21lbW9yeV9pbml0X2Vhcmx5KClgLCBtb2RpZmljYXRpb25zIHRvIGBtZW1ibG9ja19hbGxvY19odWdldGxiKClgLCBhbmQgYSByZXZhbXAgb2YgaG93IHNjcmF0Y2ggbWVtb3J5IGlzIGV4dGVuZGVkIGFuZCBtaWdyYXRlZC4gVGhhdCYjMzk7cyBxdWl0ZSBhIHdpZGUgc2NvcGUgb2YgaW1wYWN0LgoKVGhlIHBhdGNoIHRvdWNoZXMgYSBnb29kIGNvbGxlY3Rpb24gb2YgY29yZSBmaWxlcy4gSSYjMzk7bSBzZWVpbmcgY2hhbmdlcyBpbiB0aGUgaGVhZGVyIGZpbGVzIGZvciBLZXhlYyBIYW5kb3ZlciwgdGhlIEtITyBBQkksIHRoZSBLSE8gcmFkaXggdHJlZSwgYW5kIG1lbWJsb2NrLiBUaGF0JiMzOTtzIGV4cGVjdGVkLCBnaXZlbiB0aGUgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzLiBUaGUgQyBmaWxlcyBhZmZlY3RlZCBpbmNsdWRlIGBrZXhlY19oYW5kb3Zlci5jYCwgYGh1Z2V0bGIuY2AsIGBtZW1ibG9jay5jYCwgYW5kIGBtbV9pbml0LmNgLiBUaGlzIGRlZmluaXRlbHkgYWZmZWN0cyBjcml0aWNhbCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgaGFuZG92ZXIgY29tcG9uZW50cywgc28gdGhpcyB3YXJyYW50cyBhIGNhcmVmdWwgcmV2aWV3LgoKQmVmb3JlIGRpdmluZyBkZWVwZXIgaW50byB0aGUgaW5kaXZpZHVhbCBwYXRjaCBkZXRhaWxzLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbGFyZ2VyIGNvbnRleHQuIElzIEtleGVjIEhhbmRvdmVyIGV2ZW4gZW5hYmxlZCBhbmQgaG93IGlzIGl0IGNvbmZpZ3VyZWQ/IEkmIzM5O2xsIHF1aWNrbHkgY2hlY2sgZm9yIGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIHRvIHNlZSBpZiBpdCYjMzk7cyBpbiBwbGF5LiBJJiMzOTtsbCB1c2UgYGdyZXBwZXJgIGZvciB0aGF0LCBhIHF1aWNrIHNjYW4gd2lsbCBjb25maXJtIGlmIHRoaXMgY29kZSBwYXRoIGlzIHJlbGV2YW50IG9yIGlmIGl0JiMzOTtzIGd1YXJkZWQgYnkgYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIG9wdGlvbi4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoYXQgcmV2ZWFscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgS0VYRUNfSEFORE9WRVImIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZz0zPW1lbnUgXCYjMzQ7TGl2ZSBVcGRhdGUgYW5kIEtleGVjIEhhbmRPdmVyXCYjMzQ7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTQtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnOjU6Y29uZmlnIEtFWEVDX0hBTkRPVkVSXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTYtXHRib29sIFwmIzM0O2tleGVjIGhhbmRvdmVyXCYjMzQ7XG4tLVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0xNy1cbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6MTg6Y29uZmlnIEtFWEVDX0hBTkRPVkVSX0RFQlVHXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTE5LVx0Ym9vbCBcJiMzNDtFbmFibGUgS2V4ZWMgSGFuZG92ZXIgZGVidWcgY2hlY2tzXCYjMzQ7XG4tLVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0yNi1cbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6Mjc6Y29uZmlnIEtFWEVDX0hBTkRPVkVSX0RFQlVHRlNcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctMjgtXHRib29sIFwmIzM0O2tleGVjIGhhbmRvdmVyIGRlYnVnZnMgaW50ZXJmYWNlXCYjMzQ7XG4tLVxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0zNy1cbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6Mzg6Y29uZmlnIEtFWEVDX0hBTkRPVkVSX0VOQUJMRV9ERUZBVUxUXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTM5LVx0Ym9vbCBcJiMzNDtFbmFibGUga2V4ZWMgaGFuZG92ZXIgYnkgZGVmYXVsdFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxNTIyCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjc3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2g6IEtleGVjIEhhbmRvdmVyIGFuZCBIdWdlVExCIEludGVncmF0aW9uKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgdG91Y2hpbmcgYGtleGVjX2hhbmRvdmVyLmNgIGFuZCBgbWVtYmxvY2suY2AuIEl0IGxvb2tzIGxpa2UgaXQmIzM5O3MgYSBtaXggb2YgbmV3IGZ1bmN0aW9ucyBhbmQgc29tZSBpbnRlZ3JhdGlvbiB3b3JrLiBJbiBga2V4ZWNfaGFuZG92ZXIuY2AsIEkgc2VlIGEgd2hvbGUgc2xldyBvZiByYWRpeCB0cmVlIGZ1bmN0aW9ucyBiZWluZyBhZGRlZDogYGtob19yYWRpeF9hZGRfa2V5YCwgYGtob19yYWRpeF9kZWxfa2V5YCwgdGhlIHdhbGtpbmcsIGluaXRpYWxpemF0aW9uLCBhbmQgZGVzdHJ1Y3Rpb24gZnVuY3Rpb25zIChga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgKSwgcGx1cyBzb21lIG1vcmUgc3BlY2lmaWMgdXRpbGl0eSBmdW5jdGlvbnMgbGlrZSBga2hvX2V4dGVuZF9zY3JhdGNoYCwgYGtob19tZW1vcnlfaW5pdF9lYXJseWAsIGBraG9fc2NyYXRjaF9vdmVybGFwYCwgYW5kIGBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlYC4gVGhhdCYjMzk7cyBhIHNpZ25pZmljYW50IGFkZGl0aW9uLCBjbGVhcmx5IGJ1aWxkaW5nIHNvbWUga2luZCBvZiBkYXRhIHN0cnVjdHVyZSBhbmQgcmVsYXRlZCBtYW5hZ2VtZW50IGxvZ2ljIHdpdGhpbiB0aGUga2V4ZWMgaGFuZG92ZXIgcHJvY2Vzcy4KCk5vdywgb3ZlciBpbiBgbWVtYmxvY2suY2AsIHRoZSBuZXcgZnVuY3Rpb24gYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGlzIGJlaW5nIGludHJvZHVjZWQuIEludGVyZXN0aW5nLiBBbmQgaXQgYXBwZWFycyB0aGF0IHdpdGhpbiBgbW0vaHVnZXRsYi5jYCwgYGFsbG9jX2Jvb3RtZW1gIGlzIHVzaW5nIGBtZW1ibG9ja19hbGxvY19odWdldGxiYC4KCk15IGZpcnN0IHRob3VnaHQgaXMsIGlzIGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIHRoZSBvbmx5IGNvbmZpZ3VyYXRpb24gb3B0aW9uIGFmZmVjdGVkPyBJIGFzc3VtZSB0aGF0JiMzOTtzIHRoZSBwcmltYXJ5IGRyaXZlciBoZXJlLiBPa2F5LCBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCBgQ09ORklHX0tFWEVDX0hBTkRPVkVSYCBpcyB0aGUgbWFpbiB0aGluZy4gQnV0IHdhaXQsIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCBpcyBjYWxsZWQgaW4gYG1tL2h1Z2V0bGIuY2AsIHNvIGBDT05GSUdfSFVHRVRMQl9QQUdFYCBpcyBhbHNvIGdvaW5nIHRvIGJlIHJlbGV2YW50IGhlcmUuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhvc2UgZGVwZW5kZW5jaWVzIGFyZSBwcm9wZXJseSBoYW5kbGVkLiBMZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBgbW0vaHVnZXRsYi5jYCBjb2RlIHRvIGNvbmZpcm0gdGhhdCBgYWxsb2NfYm9vdG1lbWAgaXMgaW5kZWVkIHVzaW5nIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbiBhbmQgZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBvdGhlciByZWxldmFudCBjb25maWd1cmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthbGxvY19ib290bWVtJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vaHVnZXRsYi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2V0bGIuYz0yODU1PXN0cnVjdCBmb2xpbyAqYWxsb2NfaHVnZXRsYl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdldGxiLmMtMzAyNy1cbm1tL2h1Z2V0bGIuYzozMDI4OnN0YXRpYyBfX2luaXQgdm9pZCAqYWxsb2NfYm9vdG1lbShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkLCBib29sIG5vZGVfZXhhY3QpXG5tbS9odWdldGxiLmMtMzAyOS17XG4tLVxubW0vaHVnZXRsYi5jLTMwMzMtXHRpZiAoaHVnZXRsYl9lYXJseV9jbWEoaCkpXG5tbS9odWdldGxiLmM6MzAzNDpcdFx0bSA9IGh1Z2V0bGJfY21hX2FsbG9jX2Jvb3RtZW0oaCwgXHUwMDI2bGlzdG5vZGUsIG5vZGVfZXhhY3QpO1xubW0vaHVnZXRsYi5jLTMwMzUtXHRlbHNlIHtcbi0tXG5tbS9odWdldGxiLmMtMzA2OS1cbm1tL2h1Z2V0bGIuYzozMDcwOmludCBhbGxvY19ib290bWVtX2h1Z2VfcGFnZShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkKVxubW0vaHVnZXRsYi5jOjMwNzE6XHRfX2F0dHJpYnV0ZV9fICgod2VhaywgYWxpYXMoXCYjMzQ7X19hbGxvY19ib290bWVtX2h1Z2VfcGFnZVwmIzM0OykpKTtcbm1tL2h1Z2V0bGIuYzozMDcyOmludCBfX2FsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQpXG5tbS9odWdldGxiLmMtMzA3My17XG4tLVxubW0vaHVnZXRsYi5jLTMwNzgtXHRpZiAobmlkICE9IE5VTUFfTk9fTk9ERSkge1xubW0vaHVnZXRsYi5jOjMwNzk6XHRcdG0gPSBhbGxvY19ib290bWVtKGgsIG5vZGUsIHRydWUpO1xubW0vaHVnZXRsYi5jLTMwODAtXHRcdGlmICghbSlcbi0tXG5tbS9odWdldGxiLmMtMzA4Ny1cdFx0XHRcdCAgICBcdTAwMjZodWdldGxiX2Jvb3RtZW1fbm9kZXMpIHtcbm1tL2h1Z2V0bGIuYzozMDg4Olx0XHRtID0gYWxsb2NfYm9vdG1lbShoLCBub2RlLCBmYWxzZSk7XG5tbS9odWdldGxiLmMtMzA4OS1cdFx0aWYgKCFtKVxuLS1cbm1tL2h1Z2V0bGIuYz0zMzY0PXN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX2hzdGF0ZV9hbGxvY19wYWdlc19vbmVub2RlKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQpXG4tLVxubW0vaHVnZXRsYi5jLTMzNzEtXHRcdGlmIChoc3RhdGVfaXNfZ2lnYW50aWMoaCkpIHtcbm1tL2h1Z2V0bGIuYzozMzcyOlx0XHRcdGlmICghYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2UoaCwgbmlkKSlcbm1tL2h1Z2V0bGIuYy0zMzczLVx0XHRcdFx0YnJlYWs7XG4tLVxubW0vaHVnZXRsYi5jPTM0NjU9c3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGh1Z2V0bGJfZ2lnYW50aWNfcGFnZXNfYWxsb2NfYm9vdChzdHJ1Y3QgaHN0YXRlICpoKVxuLS1cbm1tL2h1Z2V0bGIuYy0zNDY5LVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaC1cdTAwM2VtYXhfaHVnZV9wYWdlczsgJiM0MzsmIzQzO2kpIHtcbm1tL2h1Z2V0bGIuYzozNDcwOlx0XHRpZiAoIWFsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKGgsIE5VTUFfTk9fTk9ERSkpXG5tbS9odWdldGxiLmMtMzQ3MS1cdFx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjk3NQoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDE5NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbioqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIHRvdWNoaW5nIGBtbS9tZW1ibG9jay5jYCBhbmQgYG1tL2h1Z2V0bGIuY2Ag4oCTIGludGVyZXN0aW5nLiBQYXJ0aWN1bGFybHksIEkgc2VlIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCBpcyB1c2VkIGluIGBhbGxvY19ib290bWVtYCB3aGljaCBsaXZlcyBpbiBgbW0vaHVnZXRsYi5jYC4gVGhhdCBzY3JlYW1zIHBvdGVudGlhbCwgdGhpcyBsb29rcyBsaWtlIGEgZ29vZCB0YXJnZXQgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgd29ydGggaW52ZXN0aWdhdGluZyBtb3JlIGNsb3NlbHkuCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zIHdpdGhpbiB0aGF0IGFyZWEgdGhhdCB3YXJyYW50IGRlZXBlciBleGFtaW5hdGlvbi4gSSYjMzk7bSBzZWVpbmcgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcmFkaXggdHJlZXMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHRoYXQgSSBzaG91bGQgZm9jdXMgb246CgoqICAgYGtob19yYWRpeF9hZGRfa2V5YAoqICAgYGtob19yYWRpeF9kZWxfa2V5YAoqICAgYGtob19yYWRpeF93YWxrX3RyZWVgCiogICBga2hvX3JhZGl4X2luaXRfdHJlZWAKKiAgIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYAoqICAgYGtob19leHRlbmRfc2NyYXRjaGAKKiAgIGBraG9fbWVtb3J5X2luaXRfZWFybHlgCiogICBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAKKiAgIGBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlYAoqICAgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgCgpMZXQmIzM5O3MgYmVnaW4gYnkgY2hlY2tpbmcgdG8gc2VlIGlmIGBraG9fcmFkaXhfYWRkX2tleWAgaXMgZXhwb3J0ZWQgb3IgdXNlZC4gVGhpcyBjb3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2hvX3JhZGl4X2FkZF9rZXkmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oPTQ2PXN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiB7XG4tLVxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTUyLVxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oOjUzOmludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KTtcbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaC01NC12b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpO1xuLS1cbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaD01OD12b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNjEtXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg6NjI6c3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSlcbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaC02My17XG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xNzg9c3RhdGljIHZvaWQgX19yZWYga2hvX3JhZGl4X2ZyZWVfbm9kZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGUpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODYtLyoqXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjE4NzogKiBraG9fcmFkaXhfYWRkX2tleSAtIEFkZCBhIGtleSB0byB0aGUgcmFkaXggdHJlZS5cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTg4LSAqIEB0cmVlOiBUaGUgS0hPIHJhZGl4IHRyZWUuXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0yMDItICovXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjIwMzppbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSlcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMjA0LXtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTI3MS19XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjI3MjpFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTI3My1cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTkzMz1zdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbGVhZih1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTk0NC1cdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjk0NTpcdFx0ZXJyID0ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgc3RhcnQgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy05NDYtXHRcdGlmIChlcnIpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz05NTY9c3RhdGljIGludCBfX2luaXQga2hvX2V4dF93YWxrX25vZGUocGh5c19hZGRyX3QgcGh5cywgdm9pZCAqZGF0YSlcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTk2MC1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6OTYxOlx0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIHBoeXMgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy05NjItfVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTE0OT1pbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTU4LVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTU5Olx0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNjAtXHRcdFx0XHRcdFx0XHQgICAgb3JkZXIpKTtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEyMjQ9aW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNDEtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyNDI6XHRcdGVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNDMtXHRcdFx0XHRcdFx0XHRcdCAgIG9yZGVyKSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQ1MzMKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcyBvbiBjaGVja2luZyBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAsIHN1bW1hcml6ZWQgYXMgaWYgSSYjMzk7bSB0aGlua2luZyBpdDoKCioqQW5hbHl6aW5nIHRoZSBBbGxvY2F0aW9uIG9mIEh1Z2VUTEIgTWVtb3J5KioKCkFscmlnaHQsIHRpbWUgdG8gZ2V0IGludG8gdGhlIGRldGFpbHMuIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAuIE15IGluaXRpYWwgZm9jdXMgaXMgb24gKmhvdyogdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgSHVnZVRMQiBtZW1vcnkuIFRoaXMgaW1wbGllcyBhIGRlZXBlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBtYW5hZ2VtZW50IG1lY2hhbmlzbXMsIGxpa2VseSBpbnZvbHZpbmcgcGFnZSB0YWJsZSBtYW5pcHVsYXRpb24sIHBoeXNpY2FsIGFkZHJlc3MgYWxsb2NhdGlvbiwgYW5kIHBvdGVudGlhbCBjb25zaWRlcmF0aW9ucyBmb3IgTlVNQSBhcmNoaXRlY3R1cmVzLiBJJiMzOTtsbCBuZWVkIHRvIHNlZSBob3cgaXQgaW50ZWdyYXRlcyB3aXRoIHRoZSBleGlzdGluZyBgbWVtYmxvY2tgIHN5c3RlbSwgcGFydGljdWxhcmx5IGhvdyB0aGUgcmVzZXJ2ZWQgbWVtb3J5IHJlZ2lvbnMgZm9yIEh1Z2VUTEJzIGFyZSBtYW5hZ2VkIGFuZCBpZiB0aGVyZSBpcyBhbnkgb3ZlcmxhcCB3aXRoIG90aGVyIG1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZXMuIEkmIzM5O2xsIGFsc28gYmUgc2VhcmNoaW5nIGZvciBhbnkgcG90ZW50aWFsIG9wdGltaXphdGlvbiwgYW5kIHdpbGwgYmUgd2F0Y2hpbmcgaG93IGl0IGRlYWxzIHdpdGggZnJhZ21lbnRhdGlvbiBhbmQgcG90ZW50aWFsIGVycm9ycy4gTGV0JiMzOTtzIHNlZSBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHRoZSB3aG9sZSB0aGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVtYmxvY2tfYWxsb2NfaHVnZXRsYiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L21lbWJsb2NrLmg9NDIyPXZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXG4tLVxuaW5jbHVkZS9saW51eC9tZW1ibG9jay5oLTQyNC1cdFx0XHQgICAgIGludCBuaWQpO1xuaW5jbHVkZS9saW51eC9tZW1ibG9jay5oOjQyNTp2b2lkICptZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKTtcbmluY2x1ZGUvbGludXgvbWVtYmxvY2suaC00MjYtXG4tLVxubW0vaHVnZXRsYi5jPTMwMjg9c3RhdGljIF9faW5pdCB2b2lkICphbGxvY19ib290bWVtKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQsIGJvb2wgbm9kZV9leGFjdClcbi0tXG5tbS9odWdldGxiLmMtMzAzNS1cdGVsc2Uge1xubW0vaHVnZXRsYi5jOjMwMzY6XHRcdG0gPSBtZW1ibG9ja19hbGxvY19odWdldGxiKGh1Z2VfcGFnZV9zaXplKGgpLCBuaWQsIG5vZGVfZXhhY3QpO1xubW0vaHVnZXRsYi5jLTMwMzctXHRcdGlmIChtKSB7XG4tLVxubW0vaHVnZXRsYi5jLTMwNDQtXHRcdFx0ICogZnJvbS4gVGhhdCBub2RlIG1heSBiZSBkaWZmZXJlbnQgaW4gdGhlIGNhc2Ugb2Zcbm1tL2h1Z2V0bGIuYzozMDQ1Olx0XHRcdCAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJfYm9vdG1lbS4gU28sXG5tbS9odWdldGxiLmMtMzA0Ni1cdFx0XHQgKiBleHRyYWN0IHRoZSBhY3R1YWwgbm9kZSBmaXJzdC5cbi0tXG5tbS9tZW1ibG9jay5jPTE3NTE9dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY190cnlfbmlkX3Jhdyhcbi0tXG5tbS9tZW1ibG9jay5jLTE3NjQtLyoqXG5tbS9tZW1ibG9jay5jOjE3NjU6ICogbWVtYmxvY2tfYWxsb2NfaHVnZXRsYiAtIGFsbG9jYXRlIGJvb3QgbWVtb3J5IGZvciBIdWdlVExCIHBhZ2VzXG5tbS9tZW1ibG9jay5jLTE3NjYtICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xuLS1cbm1tL21lbWJsb2NrLmMtMTc3Ny0gKi9cbm1tL21lbWJsb2NrLmM6MTc3ODp2b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIocGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpXG5tbS9tZW1ibG9jay5jLTE3Nzkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTI3MAoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGFuIGV4cGVydCBpbiB0aGUgZmllbGQgYW5kIGNvbnNpZGVyaW5nIGl0IGFzIG15IG93biB0aG91Z2h0OgoKKipDaGVja2luZyBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgdG8gaXQuIEZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IGBraG9fc2NyYXRjaF9vdmVybGFwYC4gVGhpcyB2YXJpYWJsZSBvciBwcm9jZXNzIGxpa2VseSByZWxhdGVzIHRvIGEgY3JpdGljYWwgYXNwZWN0IG9mIG15IGN1cnJlbnQgcHJvamVjdCwgd2hhdGV2ZXIgdGhhdCBpcywgbGlrZWx5IGBraG9gLCB3aGljaCBiYXNlZCBvbiB0aGUgdmFyaWFibGUgbmFtZSBpcyB0aGUgb3ZlcmFyY2hpbmcgcHJvamVjdCBuYW1lLiBJIHN1c3BlY3QgdGhpcyBlaXRoZXIgcmVsYXRlcyB0byBob3cgZGlmZmVyZW50IGBraG9gIGl0ZXJhdGlvbnMgb3IgY29tcG9uZW50cyBpbnRlcmFjdC4gT3IgdGhlIGRhdGEgaXMgcmVsYXRlZCB0byBvdmVybGFwLCB3aGljaCBjb3VsZCBiZSBzcGF0aWFsLCB0ZW1wb3JhbCwgYWxnb3JpdGhtaWMsIG9yIHNlbWFudGljLiBJJiMzOTttIHByb2JhYmx5IHRyeWluZyB0byBhc3Nlc3MgaXRzIHZhbGlkaXR5LCBjb21wbGV0ZW5lc3MsIG9yIHBlcmhhcHMgaXRzIGltcGFjdCBvbiBzb21ldGhpbmcgZWxzZS4gU3BlY2lmaWNhbGx5LCAmIzM0O3NjcmF0Y2gmIzM0OyBwcm9iYWJseSBtZWFucyBpdCYjMzk7cyBhbiBpbnRlcm1lZGlhdGUgY2FsY3VsYXRpb24gb3IgdGVtcG9yYXJ5IGhvbGRpbmcgc3BvdC4gSSBoYXZlIHRvIHNlZSBob3cgaXQmIzM5O3Mgd29ya2luZyBhbmQgZnVuY3Rpb25pbmcuIFRoaXMgd2lsbCBiZSBrZXkuIERlcGVuZGluZyBvbiB3aGF0IGl0IGlzLCBJIGhhdmUgY2VydGFpbiBhc3N1bXB0aW9ucyBhYm91dCBpdHMgY2hhcmFjdGVyaXN0aWNzLCBhbmQgSSBuZWVkIHRvIHZlcmlmeSB0aGF0IHRob3NlIGhvbGQgdHJ1ZS4gVGhlICYjMzQ7b3ZlcmxhcCYjMzQ7IHBhcnQgcHJvYmFibHkgdGVsbHMgbWUgdGhlIGRhdGEgaGFzIGR1cGxpY2F0ZXMgb3IgYSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgY29uc29saWRhdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraG9fc2NyYXRjaF9vdmVybGFwJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0zOD12b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sIHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cyxcbi0tXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtNDAtXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6NDE6Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC00Mi12b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTExNz1zdGF0aWMgaW5saW5lIHZvaWQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcbi0tXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMTIxLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjEyMjpzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMjMte1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9Nzc1PXN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgc2NyYXRjaF9zaXplX25vZGUoaW50IG5pZClcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTc5Mi1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6NzkzOmJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtNzk0LXtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTExNDk9aW50IGtob19wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE1NS1cdGlmIChJU19FTkFCTEVEKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRykgXHUwMDI2XHUwMDI2XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExNTY6XHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCwgUEFHRV9TSVpFIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTU3LVx0XHRyZXR1cm4gLUVJTlZBTDtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEyMjQ9aW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMzMtXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpIFx1MDAyNlx1MDAyNlxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjM0Olx0ICAgIFdBUk5fT04oa2hvX3NjcmF0Y2hfb3ZlcmxhcChzdGFydF9wZm4gXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQsXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMzUtXHRcdFx0XHRcdG5yX3BhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSkpIHtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTE5MDI9dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xOTA5LVx0Lypcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTkxMDpcdCAqIGtob19zY3JhdGNoX292ZXJsYXAoKSBuZWVkcyBraG9fc2NyYXRjaCB0byBiZSBpbml0aWFsaXplZC4gSXRcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkxMS1cdCAqIGlzIHVzZWQgYnkgZnJlZV9hcmVhX2luaXQoKSBvbiBLSE8gYm9vdHMsIHNvIGluaXRpYWxpemUgaXRcbi0tXG5tbS9tZW1ibG9jay5jPTE3Nzg9dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxuLS1cbm1tL21lbWJsb2NrLmMtMTgxMC1cdCAqL1xubW0vbWVtYmxvY2suYzoxODExOlx0aWYgKGtob19zY3JhdGNoX292ZXJsYXAoYWRkciwgc2l6ZSkpIHtcbm1tL21lbWJsb2NrLmMtMTgxMi1cdFx0aWYgKG1lbWJsb2NrX2JvdHRvbV91cCgpKVxuLS1cbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaD02Mz1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuLS1cbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaC02OC1cbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaDo2OTpzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaC03MC17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2NTU0CgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSYjMzk7bSB0YWtpbmcgYSBsb29rIGF0IHRoaXMgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIHRoaW5nLiBCYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIGl0JiMzOTtzIHByZXR0eSBjbGVhciB0aGlzIGlzIHByb2JhYmx5IHJlbGF0ZWQgdG8gdGhlIGluaXRpYWxpemF0aW9uIG9mIGEgc2NyYXRjaCBlbnZpcm9ubWVudCBhbmQgcG9zc2libHkgc29tZXRoaW5nIHJlbGF0ZWQgdG8gbWlncmF0aW5nIHNvbWUgZGF0YSB0eXBlIG9yIHNjaGVtYS4gSSYjMzk7bSBpbW1lZGlhdGVseSB0aGlua2luZyBhYm91dCBwb3RlbnRpYWwgdXNlIGNhc2VzIGFuZCBnb3RjaGFzLiBJcyB0aGlzIGZvciBhIHNwZWNpZmljIGRhdGFiYXNlIHN5c3RlbT8gSXMgdGhlcmUgc29tZSBraW5kIG9mIHZlcnNpb25pbmcgb3IgY29tcGF0aWJpbGl0eSBjb25jZXJuIHRoYXQgSSBuZWVkIHRvIGtlZXAgaW4gbWluZD8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBzaW1wbGUgY29weSwgb3Igc29tZSBzb3J0IG9mIGRhdGEgdHJhbnNmb3JtYXRpb24/IFRoZSBpbXBsaWNhdGlvbnMgY291bGQgYmUgd2lkZS1yYW5naW5nLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgc2NyYXRjaCBlbnZpcm9ubWVudCBpcyBmb3IsIGFuZCBwcmVjaXNlbHkgd2hhdCBkYXRhIG1pZ3JhdGlvbiBpcyBpbnZvbHZlZC4gRnJvbSB0aGVyZSwgSSBjYW4gZGV0ZXJtaW5lIHRoZSBwb3RlbnRpYWwgY29tcGxleGl0eSBhbmQgcmlza3MuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLCBlcnJvciBoYW5kbGluZywgbG9nZ2luZywgYW5kIHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zLiBNeSBtaW5kIHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIHNjZW5hcmlvcyBxdWlja2x5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD00MT1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpO1xuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjQyOnZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC00My0jZWxzZVxuLS1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0xMjI9c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTEyNi1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDoxMjc6c3RhdGljIGlubGluZSB2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMTI4LVx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz03OTM9Ym9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODEyLSAqL1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzo4MTM6dm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTgxNC17XG4tLVxubW0vbW1faW5pdC5jPTY5ND12b2lkIF9fbWVtaW5pdCBfX2luaXRfcGFnZV9mcm9tX25pZCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcbi0tXG5tbS9tbV9pbml0LmMtNzEyLVx0XHQvKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBpbiBjYXNlIGl0IGlzIEtITyBzY3JhdGNoLiAqL1xubW0vbW1faW5pdC5jOjcxMzpcdFx0a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShwZm4sIHBmbiAmIzQzOyAxKTtcbm1tL21tX2luaXQuYy03MTQtXHR9XG4tLVxubW0vbW1faW5pdC5jPTg3NT12b2lkIF9fbWVtaW5pdCBtZW1tYXBfaW5pdF9yYW5nZSh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZSxcbi0tXG5tbS9tbV9pbml0LmMtOTUwLVx0ICovXG5tbS9tbV9pbml0LmM6OTUxOlx0a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIHBmbik7XG5tbS9tbV9pbml0LmMtOTUyLX1cbi0tXG5tbS9tbV9pbml0LmM9MjAyMz1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZGVmZXJyZWRfaW5pdF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSxcbi0tXG5tbS9tbV9pbml0LmMtMjA0NC1cdCAqL1xubW0vbW1faW5pdC5jOjIwNDU6XHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgZW5kX3Bmbik7XG5tbS9tbV9pbml0LmMtMjA0Ni1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjc0NjcKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCoqCgpPa2F5LCB0aW1lIHRvIGRpc3NlY3QgdGhpcy4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIGBraG9fbWVtb3J5X2luaXRfZWFybHlgLiBUaGF0IGZ1bmN0aW9uIG5hbWUgaXRzZWxmIGlzIHByZXR0eSBpbmRpY2F0aXZlLiAmIzM0O0Vhcmx5JiMzNDsgc3VnZ2VzdHMgaXQmIzM5O3MgYSBjcml0aWNhbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBsaWtlbHkgZXhlY3V0ZWQgYmVmb3JlIGEgc2lnbmlmaWNhbnQgcG9ydGlvbiBvZiB0aGUgc3lzdGVtIGlzIHVwIGFuZCBydW5uaW5nLiBJJiMzOTttIGltbWVkaWF0ZWx5IHRoaW5raW5nIGxvdy1sZXZlbCwgcHJvYmFibHkgZGVhbGluZyB3aXRoIGhhcmR3YXJlLCBtZW1vcnkgbWFwcGluZywgb3IgYXQgbGVhc3Qgc2V0dGluZyB1cCB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4KCk15IHByaW1hcnkgY29uY2VybiBub3cgaXMgdW5kZXJzdGFuZGluZyBpdHMgc2NvcGUuIERvZXMgaXQgZGVhbCB3aXRoIGp1c3QgdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnksIG9yIGlzIGl0IHNldHRpbmcgdXAgaW5pdGlhbCBtYXBwaW5ncyBmb3IgdXNlciBzcGFjZSB0b28sIGV2ZW4gYXQgdGhpcyBzdGFnZT8gVGhhdCB3b3VsZCBiZSBpbnRlcmVzdGluZywgYW5kIHBvdGVudGlhbGx5IHRyaWNreSwgcmVxdWlyaW5nIGNhcmVmdWwgYXR0ZW50aW9uIHRvIGFkZHJlc3Mgc3BhY2VzLgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBzcGVjaWZpYyBoYXJkd2FyZSBjb250ZXh0cyB0aGlzIGZ1bmN0aW9uIGlzIG9wZXJhdGluZyB1bmRlci4gRG9lcyB0aGlzIHJvdXRpbmUgZGVhbCB3aXRoIE1NVSBjb25maWd1cmF0aW9uLCBwYWdlIHRhYmxlIGluaXRpYWxpemF0aW9uLCBvciBpcyBpdCBtb3JlIHJlbGF0ZWQgdG8gYm9vdGxvYWRlci1saWtlIGFjdGl2aXRpZXMgbGlrZSByZXNlcnZpbmcgbWVtb3J5IHJlZ2lvbnM/IElzIHRoZXJlIGFueXRoaW5nIHNwZWNpZmljIGFib3V0IHRoZSBhcmNoaXRlY3R1cmUgKGUuZy4sIEFSTSwgeDg2KSB0aGF0IHNob3VsZCBkaWN0YXRlIG15IGFuYWx5c2lzPwoKSSYjMzk7bSBtZW50YWxseSBwcmVwYXJpbmcgZm9yIGEgZGVlcCBkaXZlIGludG8gdGhlIGNvZGUuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBhdCBhbnkgaW5jbHVkZWQgaGVhZGVycyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwb3RlbnRpYWwgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGluaXRpYWwgcm91dGluZXMuIEkgZXhwZWN0IHRvIGJlIGxvb2tpbmcgZm9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGVzcGVjaWFsbHkgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBtdWx0aXBsZSBwYXJ0cyBvZiB0aGUgYm9vdCBwcm9jZXNzLiBEZWJ1Z2dpbmcgdGhpcyB0eXBlIG9mIGZ1bmN0aW9uIGlzIGFsd2F5cyBmdW4hIExldCYjMzk7cyBnZXQgZ29pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tob19tZW1vcnlfaW5pdF9lYXJseSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9MzU9dm9pZCBraG9fbWVtb3J5X2luaXQodm9pZCk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MzY6dm9pZCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZCk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMzctXG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTExMz1zdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpIHsgfVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTExNC1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDoxMTU6c3RhdGljIGlubGluZSB2b2lkIGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKSB7IH1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMTYtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xOTAwPWZzX2luaXRjYWxsKGtob19pbml0KTtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkwMS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTkwMjp2b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZClcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkwMy17XG4tLVxubW0vbW1faW5pdC5jPTI3MDQ9dm9pZCBfX2luaXQgbW1fY29yZV9pbml0X2Vhcmx5KHZvaWQpXG5tbS9tbV9pbml0LmMtMjcwNS17XG5tbS9tbV9pbml0LmM6MjcwNjpcdGtob19tZW1vcnlfaW5pdF9lYXJseSgpO1xubW0vbW1faW5pdC5jLTI3MDctXHRodWdldGxiX2NtYV9yZXNlcnZlKCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MTg2CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogMjY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgS2V4ZWMgSGFuZG92ZXI6IEEgU3RyYXRlZ3kqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBpbnRyb2R1Y2luZyBLZXhlYyBIYW5kb3ZlciAoS0hPKSBmdW5jdGlvbmFsaXR5IGFuZCBtZXNzaW5nIHdpdGggaG93IHRoZSBrZXJuZWwgYWxsb2NhdGVzIG1lbW9yeSBmb3IgaHVnZSBwYWdlcyAoaHVnZXRsYikgdXNpbmcgbWVtYmxvY2suIE15IGd1dCBzYXlzOiAqKmZ1enogdGhpcyEqKiBUaGlzIGhpdHMgKmNvcmUqIGtlcm5lbCBsb2dpYyDigJMgbWVtYmxvY2ssIG1tX2luaXQsIGh1Z2V0bGIg4oCTIGFuZCwgY3J1Y2lhbGx5LCBhZGRzIGVudGlyZWx5IG5ldyBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIGR1cmluZyBib3RoIGJvb3QgYW5kIHJ1bnRpbWUuIFRoYXQmIzM5O3MgYSBmdXp6aW5nIGdvbGRtaW5lIHJpZ2h0IHRoZXJlLgoKSG1tLCBsZXQmIzM5O3Mgc2VlLCBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCBpcyBjYWxsZWQgZnJvbSBgbW1fY29yZV9pbml0X2Vhcmx5YC4gQW5kIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCBpcyBhY3R1YWxseSB1c2VkIHdpdGggYGFsbG9jX2Jvb3RtZW1gIGluIGBtbS9odWdldGxiLmNgLiBUaGVzZSBhcmUgYm9vdC10aW1lIGZ1bmN0aW9ucy4gQ2FuIHdlIGV2ZW4gZnV6eiB0aGVtIGVmZmVjdGl2ZWx5PwoKU3l6Ym90IGlzIGFtYXppbmcsIGJ1dCB0eXBpY2FsbHkgaXQgaGl0cyB0aGluZ3MgcG9zdC1ib290LiBIb3dldmVyLCB3ZSBjb3VsZCBwb3RlbnRpYWxseSBmdXp6IGJvb3QgcGFyYW1ldGVycyB0byBpbmZsdWVuY2UgdGhlc2UgZWFybHkgc3RhZ2VzLCBvciBwZXJoYXBzIFN5emJvdCBjb3VsZCB0cmlnZ2VyIEtITyBkaXJlY3RseSBpZiBpdOKAmXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UuCgpBbHJpZ2h0LCB0aGUgcGxvdCB0aGlja2Vucy4gYGtob19yYWRpeF9hZGRfa2V5YCBhbmQgYGtob19yYWRpeF9kZWxfa2V5YCBhcmUgZXhwb3J0ZWQgc3ltYm9scy4gVGhhdCYjMzk7cyBodWdlISBBbmQgdGhleeKAmXJlIGNhbGxlZCBmcm9tIGBraG9fcHJlc2VydmVfZm9saW9gLCBga2hvX3VucHJlc2VydmVfZm9saW9gLCBga2hvX3ByZXNlcnZlX3BhZ2VzYCwgYW5kIGBraG9fdW5wcmVzZXJ2ZV9wYWdlc2AuIFRob3NlIGZ1bmN0aW9ucyBhcmUgaG93IGRyaXZlcnMgYW5kIHN1YnN5c3RlbXMgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aCBwcmVzZXJ2aW5nIG1lbW9yeSBhY3Jvc3MgYSBrZXhlYyB0cmFuc2l0aW9uISBUaGF0IG1lYW5zIHJ1bnRpbWUgZXhwb3N1cmUuIEV4Y2VsbGVudC4gVGhpcyBzaWduaWZpY2FudGx5IGluY3JlYXNlcyB0aGUgZnV6emluZyBhdHRhY2sgc3VyZmFjZSwgYmVjYXVzZSBub3cgd2UgY2FuIHBvdGVudGlhbGx5IGhpdCB0aGVzZSBkdXJpbmcgcnVudGltZSEKCkkgdGhpbmsgSSB3aWxsIGNoZWNrIHRvIHNlZSBob3cgYGtob19wcmVzZXJ2ZV9mb2xpb2AgaXMgdXNlZCBlbHNld2hlcmUgaW4gdGhlIGtlcm5lbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2hvX3ByZXNlcnZlX2ZvbGlvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0xNz1ib29sIGlzX2tob19ib290KHZvaWQpO1xuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTE4LVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjE5OmludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbyk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMjAtdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9NDk9c3RhdGljIGlubGluZSBib29sIGlzX2tob19ib290KHZvaWQpXG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTUzLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjU0OnN0YXRpYyBpbmxpbmUgaW50IGtob19wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTU1LXtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTExMzg9RVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JlbW92ZV9zdWJ0cmVlKTtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNDAtLyoqXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExNDE6ICoga2hvX3ByZXNlcnZlX2ZvbGlvIC0gcHJlc2VydmUgYSBmb2xpbyBhY3Jvc3Mga2V4ZWMuXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNDItICogQGZvbGlvOiBmb2xpbyB0byBwcmVzZXJ2ZS5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNDgtICovXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExNDk6aW50IGtob19wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTUwLXtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNjEtfVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTYyOkVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9mb2xpbyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNjMtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTY4LSAqIEluc3RydWN0cyBLSE8gdG8gdW5wcmVzZXJ2ZSBhIGZvbGlvIHRoYXQgd2FzIHByZXNlcnZlZCBieVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTY5OiAqIGtob19wcmVzZXJ2ZV9mb2xpbygpIGJlZm9yZS4gVGhlIHByb3ZpZGVkIEBmb2xpbyAocGZuIGFuZCBvcmRlcilcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE3MC0gKiBtdXN0IGV4YWN0bHkgbWF0Y2ggYSBwcmV2aW91c2x5IHByZXNlcnZlZCBmb2xpby5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTE1NDc9dm9pZCAqa2hvX2FsbG9jX3ByZXNlcnZlKHNpemVfdCBzaXplKVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTU2Mi1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTU2MzpcdHJldCA9IGtob19wcmVzZXJ2ZV9mb2xpbyhmb2xpbyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTE1NjQtXHRpZiAocmV0KSB7XG4tLVxubGliL3Rlc3Rfa2hvLmM9NTQ9c3RhdGljIGludCBraG9fdGVzdF9wcmVzZXJ2ZV9kYXRhKHN0cnVjdCBraG9fdGVzdF9zdGF0ZSAqc3RhdGUpXG4tLVxubGliL3Rlc3Rfa2hvLmMtNzUtXHRcdGZvbGlvc19pbmZvW2ldID0gdmlydF90b19waHlzKGZvbGlvX2FkZHJlc3MoZm9saW8pKSB8IG9yZGVyO1xubGliL3Rlc3Rfa2hvLmM6NzY6XHRcdGVyciA9IGtob19wcmVzZXJ2ZV9mb2xpbyhmb2xpbyk7XG5saWIvdGVzdF9raG8uYy03Ny1cdFx0aWYgKGVycilcbi0tXG5saWIvdGVzdF9raG8uYz0xMjQ9c3RhdGljIGludCBraG9fdGVzdF9wcmVzZXJ2ZShzdHJ1Y3Qga2hvX3Rlc3Rfc3RhdGUgKnN0YXRlKVxuLS1cbmxpYi90ZXN0X2toby5jLTEzMy1cbmxpYi90ZXN0X2toby5jOjEzNDpcdGVyciA9IGtob19wcmVzZXJ2ZV9mb2xpbyhzdGF0ZS1cdTAwM2VmZHQpO1xubGliL3Rlc3Rfa2hvLmMtMTM1LVx0aWYgKGVycilcbi0tXG5tbS9tZW1mZF9sdW8uYz04Nz1zdGF0aWMgaW50IG1lbWZkX2x1b19wcmVzZXJ2ZV9mb2xpb3Moc3RydWN0IGZpbGUgKmZpbGUsXG4tLVxubW0vbWVtZmRfbHVvLmMtMTUxLVxubW0vbWVtZmRfbHVvLmM6MTUyOlx0XHRlcnIgPSBraG9fcHJlc2VydmVfZm9saW8oZm9saW8pO1xubW0vbWVtZmRfbHVvLmMtMTUzLVx0XHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTgxNwoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDI4MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlICYjMzk7a2hvJiMzOTsgYW5kICYjMzk7bWVtZmRfbHVvJiMzOTsgQ29kZSoqCgpPa2F5LCBzbyBgbWVtZmRfbHVvLmNgIGlzIGRlZmluaXRlbHkgbWFraW5nIHVzZSBvZiB0aGlzLCB3aGljaCBtYWtlcyBtZSB0aGluayBpdCYjMzk7cyBsaWtlbHkgYSBtZW1mZCBleHRlbnNpb24gcmVsYXRlZCB0byBsaXZlIHVwZGF0ZXMuIEludGVyZXN0aW5nLiBBbmQgdGhlbiBJIHNlZSBpdCBhZ2FpbiBpbiBgbGliL3Rlc3Rfa2hvLmNgLiAgVGhhdCBtZWFucyBga2hvX3ByZXNlcnZlX2ZvbGlvYCBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSwgd2hpY2ggaXMgYSBrZXkgcG9pbnQgdG8gcmVtZW1iZXIuCgpOb3csIGxldCYjMzk7cyB0aGluayBhYm91dCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAuICBJIGtub3cgdGhhdCYjMzk7cyBjYWxsZWQgZnJvbSBgYWxsb2NfYm9vdG1lbWAgaW4gYG1tL2h1Z2V0bGIuY2AuIFRoYXQmIzM5O3MgYWxsb2NhdGVkIGR1cmluZyBib290IHdoZW4gaHVnZXRsYiBwYWdlcyBnZXQgYWxsb2NhdGVkLiAgSGFuZyBvbi4uLiBgYWxsb2NfYm9vdG1lbWAgaXMgbGlua2VkIHdpdGggdGhlIGBodWdlcGFnZXM9YCBrZXJuZWwgY29tbWFuZC1saW5lIG9wdGlvbiwgcmlnaHQ/ICBXb3VsZCBmdXp6aW5nIGJlIHVzZWZ1bCBoZXJlPyBQcm9iYWJseSBub3QsIHNpbmNlIGBhbGxvY19ib290bWVtYCBpcyBgX19pbml0YCwgc28gaXQgd291bGQgYmUgYSBib290IHRpbWUgaXNzdWUgYW5kIGxlc3MgdXNlZnVsIHRvIHN5emJvdC4KCkJ1dCB3YWl0LCBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBhbmQgYGtob19yYWRpeF93YWxrX3RyZWVgIGFyZSByZWFjaGFibGUgZHVyaW5nIHJ1bnRpbWUhIFRoYXQmIzM5O3MgcHJvbWlzaW5nLiBBbmQgYGtob19leHRlbmRfc2NyYXRjaGAgaXMgYF9faW5pdGAsIHNvIG5vdCBpbW1lZGlhdGVseSBmdXp6YWJsZS4gIFNpbWlsYXJseSwgYGtob19tZW1vcnlfaW5pdF9lYXJseWAgaXMgbWFya2VkIGFzIGBfX2luaXRgIGFzIHdlbGwuCgpUaGUgbW9yZSBpbnRlcmVzdGluZyBmaW5kIGlzIHRoYXQgYGtob19zY3JhdGNoX292ZXJsYXBgIGlzIGNhbGxlZCBmcm9tIGBraG9fcHJlc2VydmVfZm9saW9gIGFuZCBga2hvX3ByZXNlcnZlX3BhZ2VzYCwgYW5kIHdlJiMzOTt2ZSBhbHJlYWR5IGVzdGFibGlzaGVkIHRoYXQgdGhvc2UgY2FuIGJlIGNhbGxlZCBhdCBydW50aW1lLCB3aGljaCBpcyBhIGdyZWF0IHRhcmdldC4KCkxldCYjMzk7cyBkaWcgaW50byBga2hvX3ByZXNlcnZlX3BhZ2VzYCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhhdCBjYWxsIGNoYWluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraG9fcHJlc2VydmVfcGFnZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTIwPXZvaWQga2hvX3VucHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbyk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MjE6aW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMjItdm9pZCBraG9fdW5wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTU5PXN0YXRpYyBpbmxpbmUgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKSB7IH1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC02MC1cbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDo2MTpzdGF0aWMgaW5saW5lIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBucl9wYWdlcylcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC02Mi17XG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz01NDU9RVhQT1JUX1NZTUJPTF9HUEwoa2hvX3Jlc3RvcmVfZm9saW8pO1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtNTUyLSAqIFJlc3RvcmUgYSBjb250aWd1b3VzIGxpc3Qgb2Ygb3JkZXIgMCBwYWdlcyB0aGF0IHdhcyBwcmVzZXJ2ZWQgd2l0aFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzo1NTM6ICoga2hvX3ByZXNlcnZlX3BhZ2VzKCkuXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTU1NC0gKlxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTE4MD1FWFBPUlRfU1lNQk9MX0dQTChraG9fdW5wcmVzZXJ2ZV9mb2xpbyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExODEtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExODI6c3RhdGljIHVuc2lnbmVkIGludCBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcih1bnNpZ25lZCBsb25nIHN0YXJ0X3Bmbixcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE4My1cdFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbilcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTExOTk9c3RhdGljIHZvaWQgX19raG9fdW5wcmVzZXJ2ZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjA0LVx0d2hpbGUgKHBmbiBcdTAwM2MgZW5kX3Bmbikge1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjA1Olx0XHRvcmRlciA9IF9fa2hvX3ByZXNlcnZlX3BhZ2VzX29yZGVyKHBmbiwgZW5kX3Bmbik7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMDYtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjE0LS8qKlxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjE1OiAqIGtob19wcmVzZXJ2ZV9wYWdlcyAtIHByZXNlcnZlIGNvbnRpZ3VvdXMgcGFnZXMgYWNyb3NzIGtleGVjXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMTYtICogQHBhZ2U6IGZpcnN0IHBhZ2UgaW4gdGhlIGxpc3QuXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjIzLSAqL1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjI0OmludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMjUte1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTIzOS1cdHdoaWxlIChwZm4gXHUwMDNjIGVuZF9wZm4pIHtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTI0MDpcdFx0dW5zaWduZWQgaW50IG9yZGVyID0gX19raG9fcHJlc2VydmVfcGFnZXNfb3JkZXIocGZuLCBlbmRfcGZuKTtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTI0MS1cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNTYtfVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjU3OkVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9wYWdlcyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNTgtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjY1LSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBAcGFnZSBhbmQgQG5yX3BhZ2VzIGFzIHRoZSBjb3JyZXNwb25kaW5nXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyNjY6ICoga2hvX3ByZXNlcnZlX3BhZ2VzKCkgY2FsbC4gVW5wcmVzZXJ2aW5nIGFyYml0cmFyeSBzdWItcmFuZ2VzIG9mIGxhcmdlclxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjY3LSAqIHByZXNlcnZlZCBibG9ja3MgaXMgbm90IHN1cHBvcnRlZC5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEzMTA9c3RhdGljIHN0cnVjdCBraG9fdm1hbGxvY19jaHVuayAqbmV3X3ZtYWxsb2NfY2h1bmsoc3RydWN0IGtob192bWFsbG9jX2NodW5rICpjdXIpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzE4LVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMzE5Olx0ZXJyID0ga2hvX3ByZXNlcnZlX3BhZ2VzKHZpcnRfdG9fcGFnZShjaHVuayksIDEpO1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzIwLVx0aWYgKGVycilcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEzNjA9aW50IGtob19wcmVzZXJ2ZV92bWFsbG9jKHZvaWQgKnB0ciwgc3RydWN0IGtob192bWFsbG9jICpwcmVzZXJ2YXRpb24pXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzg1LVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMzg2Olx0XHRlcnIgPSBraG9fcHJlc2VydmVfcGFnZXModm0tXHUwMDNlcGFnZXNbaV0sIG5yX2NvbnRpZ19wYWdlcyk7XG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEzODctXHRcdGlmIChlcnIpXG4tLVxubW0vbWVtYmxvY2suYz0yNjA4PXN0YXRpYyBpbnQgX19pbml0IHJlc2VydmVkX21lbV9wcmVzZXJ2ZSh2b2lkKVxuLS1cbm1tL21lbWJsb2NrLmMtMjYxNy1cbm1tL21lbWJsb2NrLmM6MjYxODpcdFx0ZXJyID0ga2hvX3ByZXNlcnZlX3BhZ2VzKHBhZ2UsIG5yX3BhZ2VzKTtcbm1tL21lbWJsb2NrLmMtMjYxOS1cdFx0aWYgKGVycilcbi0tXG5tbS9tZW1ibG9jay5jPTI2Mzc9c3RhdGljIGludCBfX2luaXQgcHJlcGFyZV9raG9fZmR0KHZvaWQpXG4tLVxubW0vbWVtYmxvY2suYy0yNjQ5LVx0ZmR0ID0gcGFnZV90b192aXJ0KGZkdF9wYWdlKTtcbm1tL21lbWJsb2NrLmM6MjY1MDpcdGVyciA9IGtob19wcmVzZXJ2ZV9wYWdlcyhmZHRfcGFnZSwgMSk7XG5tbS9tZW1ibG9jay5jLTI2NTEtXHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMTk1MQoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDQzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgdHJhY2luZyB0aGUgZnVuY3Rpb24gY2FsbHMuIEl0IGxvb2tzIGxpa2UgYGtob19wcmVzZXJ2ZV9wYWdlc2AgaXMga2V5LCBjYWxsZWQgYnkgYGtob19wcmVzZXJ2ZV92bWFsbG9jYCwgd2hpY2ggaXMgaW4gdHVybiB1c2VkIGJ5IGRyaXZlcnMgb3Igc3Vic3lzdGVtcyAtIGludGVyZXN0aW5nLiBUaGUgcGF0Y2ggbW9kaWZpZXMgYGtob19yYWRpeF9hZGRfa2V5YCBhbmQgYGtob19yYWRpeF9kZWxfa2V5YC4gVGhvc2UgYXJlIGNhbGxlZCBieSBga2hvX3ByZXNlcnZlX2ZvbGlvYCBhbmQgYGtob19wcmVzZXJ2ZV9wYWdlc2AsIHdoaWNoIG1ha2VzIHRoZW0gZ29vZCBjYW5kaWRhdGVzLiBUaGVyZSYjMzk7cyBhbHNvIHRoaXMgbmV3IGZ1bmN0aW9uLCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAsIHRoYXQmIzM5O3MgaW50cm9kdWNlZCBhbmQgYWxzbyBjYWxsZWQgYnkgYGtob19wcmVzZXJ2ZV9mb2xpb2AgYW5kIGBraG9fcHJlc2VydmVfcGFnZXNgLiBBbmQgdGhlbiB0aGVyZSYjMzk7cyBhIG1vZGlmaWNhdGlvbiB0byBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgY2FsbGVkIGJ5IGBhbGxvY19ib290bWVtYCwgZGVlcCBpbiBgbW0vaHVnZXRsYi5jYC4gUmlnaHQsIHRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBzb21lIGZ1enppbmcgZWZmb3J0LgoKTm93LCBsZXQmIzM5O3MgaWRlbnRpZnkgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyB0byBmb2N1cyBvbi4gSSYjMzk7dmUgZ290IGEgbGlzdCBmb3JtaW5nOiBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgLCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAsIGBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlYCwgYW5kIGBtZW1ibG9ja19hbGxvY19odWdldGxiYC4KCkhvbGQgb24sIEkgc2VlIGBraG9fZXh0ZW5kX3NjcmF0Y2hgIGFuZCBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCBhcmUgYF9faW5pdGAgZnVuY3Rpb25zLiBDYW4gc3l6Ym90IGV2ZW4gZnV6eiB0aG9zZT8gTm8sIG5vdCBkaXJlY3RseS4gU3l6Ym90IHRyaWdnZXJzIGBfX2luaXRgIGZ1bmN0aW9ucyBpZiB0aGV5IGFyZSBjYWxsZWQgZHVyaW5nIGJvb3QsIHNvIHRoZXkgYXJlbiYjMzk7dCBncmVhdCBjYW5kaWRhdGVzIGZvciB0aGUgYEZvY3VzU3ltYm9sc2AgbGlzdC4gVGhhdCBsaXN0IGlzIGZvciBmdXp6ZXIgdGFyZ2V0cy4gU28sIEkgd2lsbCBpbmNsdWRlIGBraG9fcmFkaXhfYWRkX2tleWAsIGBraG9fcmFkaXhfZGVsX2tleWAsIGBraG9fcmFkaXhfd2Fsa190cmVlYCwgYGtob19yYWRpeF9pbml0X3RyZWVgLCBga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZWAsIGFuZCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAuIEkgbmVlZCB0byBkb3VibGUtY2hlY2sgYGtob19yYWRpeF9pbml0X3RyZWVgIGFuZCBga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZWAgdGhvdWdoLiBUaGV5IGFyZSBleHBvcnRlZCBzeW1ib2xzLCBidXQgYXJlIHRoZXkgYWN0dWFsbHkgdXNlZCBvdXRzaWRlIHRoZWlyIG1vZHVsZT8gSSBzaG91bGQgbG9vayBpbnRvIHRoYXQgYmVmb3JlIGNvbW1pdHRpbmcgdGhpcyBhcyBhIHByb3BlciBmdXp6aW5nIHRhcmdldCBsaXN0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraG9fcmFkaXhfaW5pdF90cmVlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaD01NT1pbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNTYtXHRcdFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSk7XG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg6NTc6aW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpO1xuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTU4LXZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpO1xuLS1cbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaD03MD1zdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi0tXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNzUtXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg6NzY6c3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2luaXRfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNzctXHRcdFx0XHQgICAgICBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0zMjE9c3RhdGljIHZvaWQgX19raG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTM0MC0vKipcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MzQxOiAqIGtob19yYWRpeF9pbml0X3RyZWUgLSBpbml0aWFsaXplIHRoZSByYWRpeCB0cmVlLlxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNDItICogQHRyZWU6ICAgdGhlIHRyZWUgdG8gaW5pdGlhbGl6ZS5cbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTM1MC0gKi9cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MzUxOmludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNTIte1xuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMzYxLX1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MzYyOkVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpO1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNjMtXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMDA2PXN0YXRpYyB2b2lkIF9faW5pdCBraG9fZXh0ZW5kX3NjcmF0Y2godm9pZClcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEwMTgtXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEwMTk6XHRlcnIgPSBraG9fcmFkaXhfaW5pdF90cmVlKFx1MDAyNnJhZGl4LCBOVUxMKTtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTAyMC1cdGlmIChlcnIpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xODIwPXN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODI4LVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxODI5Olx0ZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZSh0cmVlLCBOVUxMKTtcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTgzMC1cdGlmIChlcnIpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xOTAyPXZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKVxuLS1cbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkxOS1cdCAqL1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxOTIwOlx0aWYgKGtob19yYWRpeF9pbml0X3RyZWUoXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIGtob19nZXRfbWVtX21hcChmZHQpKSkge1xua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xOTIxLVx0XHQvKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMzg0MgoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDE1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBNZW50YWwgQ2hlY2tsaXN0IGZvciBNZW1vcnkgQWxsb2NhdGlvbiBGdW5jdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSBwdXR0aW5nIHRvZ2V0aGVyIGEgbWVudGFsIG1hcCBvZiB3aGVyZSB0aGVzZSBrZXkgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFyZSB1c2VkLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZSBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcsIGVzcGVjaWFsbHkgc2luY2UgdGhlc2UgZnVuY3Rpb25zIGFyZSBzbyBmdW5kYW1lbnRhbCB0byB0aGUgc3lzdGVtJiMzOTtzIG9wZXJhdGlvbi4gIEkga25vdyB0aGV5JiMzOTtyZSBkZWZpbml0ZWx5IGV4cG9ydGVkIGFuZCB1dGlsaXplZCBpbiBga2hvX2luaXRgLCBga2hvX2V4dGVuZF9zY3JhdGNoYCwgYW5kIGBraG9fbWVtb3J5X2luaXRfZWFybHlgLgoKSSBzaG91bGQgcHJvYmFibHkgYWxzbyBpbmNsdWRlIHRoZXNlIHJhZGl4IHRyZWUgZnVuY3Rpb25zIGluIG15IHRoaW5raW5nOiBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYW5kIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYC4gSSYjMzk7bSBhbHNvIHJlbWVtYmVyaW5nIGBraG9fc2NyYXRjaF9vdmVybGFwYCBhbmQgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIGFyZSBwcm9iYWJseSB3b3J0aCBsaXN0aW5nLiBBbmQgb2YgY291cnNlLCB0aGUgYmlnIG9uZTogYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgLgoKTGV0IG1lIHF1aWNrbHkgdmVyaWZ5IHNvbWV0aGluZyBhYm91dCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAuICBBaCwgeWVzLCB0aGF0JiMzOTtzIGRlZmluZWQgYXMgYF9faW5pdGAuIE5vdywgd2hhdCBhYm91dCBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWA/IEhtbSwgaXQgbG9va3MgbGlrZSBpdCBpc24mIzM5O3QgYF9faW5pdGAuIExldCBtZSBkb3VibGUtY2hlY2sgdGhhdC4uLiBqdXN0IHRvIGJlIGNlcnRhaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDEzOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTQxPWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSk7XG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6NDI6dm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pO1xuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTQzLSNlbHNlXG4tLVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTEyMj1zdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbi0tXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMTI2LVxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjEyNzpzdGF0aWMgaW5saW5lIHZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMjgtXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcbi0tXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTc5Mz1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4tLVxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy04MTItICovXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjgxMzp2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbilcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODE0LXtcbi0tXG5tbS9tbV9pbml0LmM9Njk0PXZvaWQgX19tZW1pbml0IF9faW5pdF9wYWdlX2Zyb21fbmlkKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuLS1cbm1tL21tX2luaXQuYy03MTItXHRcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXG5tbS9tbV9pbml0LmM6NzEzOlx0XHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgcGZuICYjNDM7IDEpO1xubW0vbW1faW5pdC5jLTcxNC1cdH1cbi0tXG5tbS9tbV9pbml0LmM9ODc1PXZvaWQgX19tZW1pbml0IG1lbW1hcF9pbml0X3JhbmdlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyB6b25lLFxuLS1cbm1tL21tX2luaXQuYy05NTAtXHQgKi9cbm1tL21tX2luaXQuYzo5NTE6XHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgcGZuKTtcbm1tL21tX2luaXQuYy05NTItfVxuLS1cbm1tL21tX2luaXQuYz0yMDIzPXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkZWZlcnJlZF9pbml0X3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLFxuLS1cbm1tL21tX2luaXQuYy0yMDQ0LVx0ICovXG5tbS9tbV9pbml0LmM6MjA0NTpcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBlbmRfcGZuKTtcbm1tL21tX2luaXQuYy0yMDQ2LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMCAxMzo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDk1NAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE3OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbml0aWFsIEFzc2Vzc21lbnQgb2YgTWVtb3J5IEluaXRpYWxpemF0aW9uIEZ1bmN0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCBhbmQgYSBmZXcgdGhpbmdzIGp1bXAgb3V0LiBUaGUgZnVuY3Rpb24gYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIGlzbiYjMzk7dCBleHBsaWNpdGx5IG1hcmtlZCBhcyBhbiBgX19pbml0YCBmdW5jdGlvbiwgd2hpY2ggaXMgYSBiaXQgb2RkLCBidXQgSSBzZWUgaXQmIzM5O3MgY2FsbGVkIGZyb20gYm90aCBgX19pbml0YCBhbmQgYF9fbWVtaW5pdGAgZnVuY3Rpb25zLiBUaGF0JiMzOTtzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGBraG9fcmFkaXhfYWRkX2tleWAsIGBraG9fcmFkaXhfZGVsX2tleWAsIGFuZCBga2hvX3JhZGl4X3dhbGtfdHJlZWAgbG9vayBsaWtlIHByaW1lIGNhbmRpZGF0ZXMgZm9yIGZ1enppbmcuIFRoZXkgc2VlbSBsaWtlIGdvb2Qgc3RhcnRpbmcgcG9pbnRzIHRvIGxvb2sgZm9yIG1lbW9yeS1yZWxhdGVkIHZ1bG5lcmFiaWxpdGllcy4gYGtob19zY3JhdGNoX292ZXJsYXBgIHNlZW1zIHBvdGVudGlhbGx5IGludGVyZXN0aW5nIHRvbywgc28gSSYjMzk7bGwgaW5jbHVkZSBpdCBvbiB0aGUgbGlzdC4KCk5vdywgbGV0IG1lIHNoaWZ0IGdlYXJzIGFuZCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVudmlyb25tZW50IHRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIGluLiBJJiMzOTttIGdvaW5nIHRvIGNoZWNrIGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIGFuZCBgQ09ORklHX0hVR0VUTEJfUEFHRWAuIFJpZ2h0LCBgQ09ORklHX0tFWEVDX0hBTkRPVkVSYCBzZWVtcyB0byBiZSB0aGUgcHJpbWFyeSBjb25maWd1cmF0aW9uIGl0ZW0uIEFuZCBgQ09ORklHX0hVR0VUTEJfUEFHRWAgaXMgY3J1Y2lhbCBiZWNhdXNlIGl0JiMzOTtzIHJlcXVpcmVkIGZvciBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgdG8gYmUgdXNlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdCBjYWxsLiBXYWl0LCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgaXMgZGVmaW5lZCBpbiBgbW0vbWVtYmxvY2suY2AuIEl0JiMzOTtzIGRlZmluZWQgdGhlcmUsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGlzbiYjMzk7dCBjb21waWxlZCBjb25kaXRpb25hbGx5LiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIHRoZSBidWlsZCBjb25maWd1cmF0aW9ucyB0byB2ZXJpZnkgdGhpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVtYmxvY2tfYWxsb2NfaHVnZXRsYiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbWJsb2NrLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtYmxvY2suYz0xNzUxPXZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoXG4tLVxubW0vbWVtYmxvY2suYy0xNzY0LS8qKlxubW0vbWVtYmxvY2suYzoxNzY1OiAqIG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBmb3IgSHVnZVRMQiBwYWdlc1xubW0vbWVtYmxvY2suYy0xNzY2LSAqIEBzaXplOiAgICAgIHNpemUgb2YgdGhlIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXNcbi0tXG5tbS9tZW1ibG9jay5jLTE3NzctICovXG5tbS9tZW1ibG9jay5jOjE3Nzg6dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxubW0vbWVtYmxvY2suYy0xNzc5LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzU2ODYKCQkJCQkJCW91dHB1dDogMTk4CgkJCQkJCQl0aG91Z2h0czogMjQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRGVwZW5kZW5jaWVzIG9mIGEgQ29kZSBTbmlwcGV0KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBpZWNlIG9mIGNvZGUgYW5kIGl0JiMzOTtzIG5vdCBndWFyZGVkIGJ5IGFueSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBsaWtlIGAjaWZkZWZgLiBUaGF0JiMzOTtzIGEgbGl0dGxlIHVudXN1YWwuIEhvd2V2ZXIsIGFmdGVyIGEgcXVpY2sgY2hlY2ssIEkgY2FuIHNlZSB0aGF0IHRoaXMgY29kZSBpcyBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBgbW0vaHVnZXRsYi5jYC4gTm93LCBgbW0vaHVnZXRsYi5jYCBpdHNlbGYgaXMgb25seSBjb21waWxlZCB3aGVuIHRoZSBgQ09ORklHX0hVR0VUTEJfUEFHRWAgb3B0aW9uIGlzIGVuYWJsZWQgaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBUaGF0IG1lYW5zIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBhcmUgYEtFWEVDX0hBTkRPVkVSYCBhbmQgYEhVR0VUTEJfUEFHRWAuIFJpZ2h0LCBnb3QgaXQuCgpMZXQgbWUganVzdCBtYWtlIHN1cmUgdGhvc2UgYXJlIHByb3Blcmx5IHN1bW1hcml6ZWQ6CgoqICAgYEtFWEVDX0hBTkRPVkVSYAoqICAgYEhVR0VUTEJfUEFHRWAKCk5vdywgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGtleSBzeW1ib2xzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhpcy4gT2theSwgSSBzZWU6CgoqICAgYGtob19yYWRpeF9hZGRfa2V5YAoqICAgYGtob19yYWRpeF9kZWxfa2V5YAoqICAgYGtob19yYWRpeF93YWxrX3RyZWVgCiogICBga2hvX3JhZGl4X2luaXRfdHJlZWAKKiAgIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYAoqICAgYGtob19zY3JhdGNoX292ZXJsYXBgCiogICBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWAKKiAgIGBtZW1ibG9ja19hbGxvY19odWdldGxiYAoKSG1tLCBhZnRlciBhIHF1aWNrIGV2YWx1YXRpb24sIGBraG9fcmFkaXhfYWRkX2tleWAgYW5kIGBraG9fcmFkaXhfZGVsX2tleWAgc3RhbmQgb3V0IGFzIHRoZSBtb3N0IGNydWNpYWwgZnVuY3Rpb25zIGhlcmUsIGF0IGxlYXN0IGluIHRoZSBjb250ZXh0IG9mIHdoYXQgSSYjMzk7bSBsb29raW5nIGF0LiBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAgYWxzbyBzZWVtcyBwcmV0dHkgaW1wb3J0YW50LiBBbmQgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGxvb2tzIGxpa2UgYSByZWxldmFudCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4KCkFscmlnaHQsIEkgdGhpbmsgSSBoYXZlIGEgZ29vZCBoYW5kbGUgb24gdGhpbmdzLiBMZXQmIzM5O3Mgc2V0IHRoZSByZXN1bHRzIG5vdy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMTM6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFWEVDX0hBTkRPVkVSJiMzNDssCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2tob19yYWRpeF9hZGRfa2V5JiMzNDssCiAgICAmIzM0O2tob19yYWRpeF9kZWxfa2V5JiMzNDssCiAgICAmIzM0O2tob19yYWRpeF93YWxrX3RyZWUmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X2luaXRfdHJlZSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfZGVzdHJveV90cmVlJiMzNDssCiAgICAmIzM0O2tob19zY3JhdGNoX292ZXJsYXAmIzM0OywKICAgICYjMzQ7a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSYjMzQ7LAogICAgJiMzNDttZW1ibG9ja19hbGxvY19odWdldGxiJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBLZXhlYyBIYW5kb3ZlciAoS0hPKSByYWRpeCB0cmVlIGltcGxlbWVudGF0aW9uLCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgZm9yIEtITyBzY3JhdGNoIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgY2hhbmdlcyBob3cgSHVnZVRMQiBwYWdlcyBhcmUgYWxsb2NhdGVkIGR1cmluZyBib290IHVzaW5nIG1lbWJsb2NrLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB0aGF0IGNhbiBiZSByZWFjaGVkIGR1cmluZyBib290IGFuZCBydW50aW1lLCBtYWtpbmcgdGhlbSB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVhFQ19IQU5ET1ZFUiYjMzQ7LAogICAgJiMzNDtIVUdFVExCX1BBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtraG9fcmFkaXhfYWRkX2tleSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfZGVsX2tleSYjMzQ7LAogICAgJiMzNDtraG9fcmFkaXhfd2Fsa190cmVlJiMzNDssCiAgICAmIzM0O2tob19yYWRpeF9pbml0X3RyZWUmIzM0OywKICAgICYjMzQ7a2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZSYjMzQ7LAogICAgJiMzNDtraG9fc2NyYXRjaF9vdmVybGFwJiMzNDssCiAgICAmIzM0O2tob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUmIzM0OywKICAgICYjMzQ7bWVtYmxvY2tfYWxsb2NfaHVnZXRsYiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgS2V4ZWMgSGFuZG92ZXIgKEtITykgcmFkaXggdHJlZSBpbXBsZW1lbnRhdGlvbiwgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIGZvciBLSE8gc2NyYXRjaCBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGNoYW5nZXMgaG93IEh1Z2VUTEIgcGFnZXMgYXJlIGFsbG9jYXRlZCBkdXJpbmcgYm9vdCB1c2luZyBtZW1ibG9jay4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdGhhdCBjYW4gYmUgcmVhY2hlZCBkdXJpbmcgYm9vdCBhbmQgcnVudGltZSwgbWFraW5nIHRoZW0gd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjI2Ljg0ODQxNDc3OFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk3MjA0NjczMjU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFWEVDX0hBTkRPVkVSXCIsXG4gICAgXCJIVUdFVExCX1BBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJraG9fcmFkaXhfYWRkX2tleVwiLFxuICAgIFwia2hvX3JhZGl4X2RlbF9rZXlcIixcbiAgICBcImtob19yYWRpeF93YWxrX3RyZWVcIixcbiAgICBcImtob19yYWRpeF9pbml0X3RyZWVcIixcbiAgICBcImtob19yYWRpeF9kZXN0cm95X3RyZWVcIixcbiAgICBcImtob19zY3JhdGNoX292ZXJsYXBcIixcbiAgICBcImtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVcIixcbiAgICBcIm1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgS2V4ZWMgSGFuZG92ZXIgKEtITykgcmFkaXggdHJlZSBpbXBsZW1lbnRhdGlvbiwgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIGZvciBLSE8gc2NyYXRjaCBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGNoYW5nZXMgaG93IEh1Z2VUTEIgcGFnZXMgYXJlIGFsbG9jYXRlZCBkdXJpbmcgYm9vdCB1c2luZyBtZW1ibG9jay4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdGhhdCBjYW4gYmUgcmVhY2hlZCBkdXJpbmcgYm9vdCBhbmQgcnVudGltZSwgbWFraW5nIHRoZW0gd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDE6MjYuODQ4NDE5ODc4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTMwNTA3ODY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMTVhODk1YjI3ZDcwNjliNDNlM2IxMjhkZjg1N2ViY2NkM2UzODA5MlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIEp1bCAxMCAxMzo0MToyNCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmggYi9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmhcXG5pbmRleCA0OGE5NzkzYzJiNzZjZC4uMzBhNzE3MTA1NjVhMzIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oXFxuQEAgLTMzLDkgKzMzLDEzIEBAIHZvaWQga2hvX3JlbW92ZV9zdWJ0cmVlKHZvaWQgKmJsb2IpO1xcbiBpbnQga2hvX3JldHJpZXZlX3N1YnRyZWUoY29uc3QgY2hhciAqbmFtZSwgcGh5c19hZGRyX3QgKnBoeXMsIHNpemVfdCAqc2l6ZSk7XFxuIFxcbiB2b2lkIGtob19tZW1vcnlfaW5pdCh2b2lkKTtcXG4rdm9pZCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZCk7XFxuIFxcbiB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sIHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cyxcXG4gXFx0XFx0ICB1NjQgc2NyYXRjaF9sZW4pO1xcbitcXG4rYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcXG4rdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pO1xcbiAjZWxzZVxcbiBzdGF0aWMgaW5saW5lIGJvb2wga2hvX2lzX2VuYWJsZWQodm9pZClcXG4ge1xcbkBAIC0xMDgsMTAgKzExMiwyMiBAQCBzdGF0aWMgaW5saW5lIGludCBraG9fcmV0cmlldmVfc3VidHJlZShjb25zdCBjaGFyICpuYW1lLCBwaHlzX2FkZHJfdCAqcGh5cyxcXG4gXFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBraG9fbWVtb3J5X2luaXQodm9pZCkgeyB9XFxuIFxcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfVxcbitcXG4gc3RhdGljIGlubGluZSB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sXFxuIFxcdFxcdFxcdFxcdHBoeXNfYWRkcl90IHNjcmF0Y2hfcGh5cywgdTY0IHNjcmF0Y2hfbGVuKVxcbiB7XFxuIH1cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XFxuK3tcXG4rfVxcbiAjZW5kaWYgLyogQ09ORklHX0tFWEVDX0hBTkRPVkVSICovXFxuIFxcbiAjZW5kaWYgLyogTElOVVhfS0VYRUNfSEFORE9WRVJfSCAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oXFxuaW5kZXggNWUyZWI4NTE5YmRhNmQuLjJmNGZiOWM2Mzk0MjFhIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2tleGVjX2hhbmRvdmVyLmhcXG5AQCAtMjU3LDExICsyNTcsOCBAQCBzdHJ1Y3Qga2hvX3ZtYWxsb2Mge1xcbiAgKiBtZW1vcnkuIFRoZXNlIGNvbnN0YW50cyBnb3Zlcm4gdGhlIGluZGV4aW5nLCBzaXppbmcsIGFuZCBkZXB0aCBvZiB0aGUgdHJlZS5cXG4gICovXFxuIGVudW0ga2hvX3JhZGl4X2NvbnN0cyB7XFxuLVxcdC8qXFxuLVxcdCAqIFRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIG9yZGVyIGJpdCAoYW5kIGFsc28gdGhlIGxlbmd0aCBvZiB0aGVcXG4tXFx0ICogc2hpZnRlZCBwaHlzaWNhbCBhZGRyZXNzKSBmb3IgYW4gb3JkZXItMCBwYWdlLlxcbi1cXHQgKi9cXG4tXFx0S0hPX09SREVSXzBfTE9HMiA9IDY0IC0gUEFHRV9TSElGVCxcXG4rXFx0LyogTmVlZCB0byBzdG9yZSB0aGUgUEZOLCBwbHVzIG9uZSBiaXQgZm9yIG9yZGVyLiAqL1xcbitcXHRLSE9fUkFESVhfS0VZX1dJRFRIID0gNjQgLSBQQUdFX1NISUZUICsgMSxcXG4gXFxuIFxcdC8qIFNpemUgb2YgdGhlIHRhYmxlIGluIGtob19yYWRpeF9ub2RlLCBpbiBsb2cyICovXFxuIFxcdEtIT19UQUJMRV9TSVpFX0xPRzIgPSBjb25zdF9pbG9nMihQQUdFX1NJWkUgLyBzaXplb2YocGh5c19hZGRyX3QpKSxcXG5AQCAtMjc0LDcgKzI3MSw3IEBAIGVudW0ga2hvX3JhZGl4X2NvbnN0cyB7XFxuIFxcdCAqIGFuZCAxIGJpdG1hcCBsZXZlbC5cXG4gXFx0ICovXFxuIFxcdEtIT19UUkVFX01BWF9ERVBUSCA9XFxuLVxcdFxcdERJVl9ST1VORF9VUChLSE9fT1JERVJfMF9MT0cyIC0gS0hPX0JJVE1BUF9TSVpFX0xPRzIgKyAxLFxcbitcXHRcXHRESVZfUk9VTkRfVVAoS0hPX1JBRElYX0tFWV9XSURUSCAtIEtIT19CSVRNQVBfU0laRV9MT0cyLFxcbiBcXHRcXHRcXHQgICAgIEtIT19UQUJMRV9TSVpFX0xPRzIpICsgMSxcXG4gfTtcXG4gXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaCBiL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaFxcbmluZGV4IDg0ZTkxOGI5NmU1M2RmLi41ZDZhZTI4OTM2ODRhNCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmhcXG5AQCAtMzQsMzcgKzM0LDUzIEBAIHN0cnVjdCBraG9fcmFkaXhfdHJlZSB7XFxuIFxcdHN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0cyB0aGUgdHJlZSdzIHN0cnVjdHVyZSBhbmQgcm9vdCBwb2ludGVyICovXFxuIH07XFxuIFxcbi10eXBlZGVmIGludCAoKmtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCkocGh5c19hZGRyX3QgcGh5cyxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IG9yZGVyKTtcXG4rLyoqXFxuKyAqIHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAtIENhbGxiYWNrcyBmb3IgS0hPIHJhZGl4IHRyZWUgd2Fsay5cXG4rICogQGxlYWY6ICAgICAgQ2FsbGVkIG9uIGVhY2ggcHJlc2VudCBrZXkgaW4gdGhlIHJhZGl4IHRyZWUuXFxuKyAqIEBub2RlOiAgICAgIENhbGxlZCBvbiBlYWNoIG5vZGUgb2YgdGhlIHJhZGl4IHRyZWUgaXRzZWxmLiBSZWNlaXZlcyB0aGVcXG4rICogICAgICAgICAgICAgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBub2RlLlxcbisgKlxcbisgKiBGb3IgZWFjaCBjYWxsYmFjaywgYSByZXR1cm4gdmFsdWUgb2YgMCBjb250aW51ZXMgdGhlIHdhbGsgYW5kIGEgbm9uLXplcm9cXG4rICogcmV0dXJuIHZhbHVlIGlzIGRpcmVjdGx5IHJldHVybmVkIHRvIHRoZSBjYWxsZXIuXFxuKyAqL1xcbitzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2Ige1xcbitcXHRpbnQgKCpsZWFmKSh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSk7XFxuK1xcdGludCAoKm5vZGUpKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpO1xcbit9O1xcbiBcXG4gI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUlxcbiBcXG4taW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxcbi1cXHRcXHQgICAgICAgdW5zaWduZWQgaW50IG9yZGVyKTtcXG4tXFxuLXZvaWQga2hvX3JhZGl4X2RlbF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBwZm4sXFxuLVxcdFxcdFxcdHVuc2lnbmVkIGludCBvcmRlcik7XFxuLVxcbitpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7XFxuK3ZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7XFxuIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG4tXFx0XFx0XFx0a2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKTtcXG4rXFx0XFx0XFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSk7XFxuK2ludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KTtcXG4rdm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSk7XFxuIFxcbiAjZWxzZSAgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqL1xcbiBcXG4tc3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgbG9uZyBwZm4sXFxuLVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG9yZGVyKVxcbitzdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxcbiB7XFxuIFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLVxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgb3JkZXIpIHsgfVxcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcga2V5KSB7IH1cXG4gXFxuIHN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbi1cXHRcXHRcXHRcXHQgICAgICBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXFxuK1xcdFxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXFxuIHtcXG4gXFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIGludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpIHsgfVxcbitcXG4gI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVIgKi9cXG4gXFxuICNlbmRpZlxcdC8qIF9MSU5VWF9LSE9fUkFESVhfVFJFRV9IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaFxcbmluZGV4IDVhZmNkOTlhYThjMTQ0Li5kNjJkYjllNzc2Y2Y5NCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmhcXG5AQCAtNTEsNiArNTEsNyBAQCBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG1heF9wb3NzaWJsZV9wZm47XFxuICAqIG1lbW9yeSByZXNlcnZhdGlvbnMgeWV0LCBzbyB3ZSBnZXQgc2NyYXRjaCBtZW1vcnkgZnJvbSB0aGUgcHJldmlvdXNcXG4gICoga2VybmVsIHRoYXQgd2Uga25vdyBpcyBnb29kIHRvIHVzZS4gSXQgaXMgdGhlIG9ubHkgbWVtb3J5IHRoYXRcXG4gICogYWxsb2NhdGlvbnMgbWF5IGhhcHBlbiBmcm9tIGluIHRoaXMgcGhhc2UuXFxuKyAqIEBNRU1CTE9DS19SU1JWX0hVR0VUTEI6IG1lbW9yeSBpcyByZXNlcnZlZCBmb3IgaHVnZXRsYiBwYWdlc1xcbiAgKi9cXG4gZW51bSBtZW1ibG9ja19mbGFncyB7XFxuIFxcdE1FTUJMT0NLX05PTkVcXHRcXHQ9IDB4MCxcXHQvKiBObyBzcGVjaWFsIHJlcXVlc3QgKi9cXG5AQCAtNjEsNiArNjIsNyBAQCBlbnVtIG1lbWJsb2NrX2ZsYWdzIHtcXG4gXFx0TUVNQkxPQ0tfUlNSVl9OT0lOSVRcXHQ9IDB4MTAsXFx0LyogZG9uJ3QgaW5pdGlhbGl6ZSBzdHJ1Y3QgcGFnZXMgKi9cXG4gXFx0TUVNQkxPQ0tfUlNSVl9LRVJOXFx0PSAweDIwLFxcdC8qIG1lbW9yeSByZXNlcnZlZCBmb3Iga2VybmVsIHVzZSAqL1xcbiBcXHRNRU1CTE9DS19LSE9fU0NSQVRDSFxcdD0gMHg0MCxcXHQvKiBzY3JhdGNoIG1lbW9yeSBmb3Iga2V4ZWMgaGFuZG92ZXIgKi9cXG4rXFx0TUVNQkxPQ0tfUlNSVl9IVUdFVExCXFx0PSAweDgwLCAvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGh1Z2V0bGIgcGFnZXMgKi9cXG4gfTtcXG4gXFxuIC8qKlxcbkBAIC00MjAsNiArNDIyLDcgQEAgdm9pZCAqbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXFxuIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXFxuIFxcdFxcdFxcdCAgICAgcGh5c19hZGRyX3QgbWluX2FkZHIsIHBoeXNfYWRkcl90IG1heF9hZGRyLFxcbiBcXHRcXHRcXHQgICAgIGludCBuaWQpO1xcbit2b2lkICptZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKTtcXG4gXFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqbWVtYmxvY2tfYWxsb2MocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24pXFxuIHtcXG5AQCAtNDg0LDYgKzQ4Nyw3IEBAIHN0YXRpYyBpbmxpbmUgX19pbml0X21lbWJsb2NrIGJvb2wgbWVtYmxvY2tfYm90dG9tX3VwKHZvaWQpXFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3BoeXNfbWVtX3NpemUodm9pZCk7XFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX3NpemUodm9pZCk7XFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCk7XFxuK3BoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZCk7XFxuIHVuc2lnbmVkIGxvbmcgbWVtYmxvY2tfZXN0aW1hdGVkX25yX2ZyZWVfcGFnZXModm9pZCk7XFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3N0YXJ0X29mX0RSQU0odm9pZCk7XFxuIHBoeXNfYWRkcl90IG1lbWJsb2NrX2VuZF9vZl9EUkFNKHZvaWQpO1xcbkBAIC02MTMsMjggKzYxNyw5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW10ZXN0X3JlcG9ydF9tZW1pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkgeyB9XFxuICNpZmRlZiBDT05GSUdfTUVNQkxPQ0tfS0hPX1NDUkFUQ0hcXG4gdm9pZCBtZW1ibG9ja19zZXRfa2hvX3NjcmF0Y2hfb25seSh2b2lkKTtcXG4gdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpO1xcbi1ib29sIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShwaHlzX2FkZHJfdCBhZGRyKTtcXG4tXFxuLXN0YXRpYyBpbmxpbmUgZW51bSBtaWdyYXRldHlwZSBraG9fc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHBmbixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIGVudW0gbWlncmF0ZXR5cGUgbXQpXFxuLXtcXG4tXFx0aWYgKG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShQRk5fUEhZUyhwZm4pKSlcXG4tXFx0XFx0cmV0dXJuIE1JR1JBVEVfQ01BO1xcbi1cXHRyZXR1cm4gbXQ7XFxuLX1cXG4gI2Vsc2VcXG4gc3RhdGljIGlubGluZSB2b2lkIG1lbWJsb2NrX3NldF9raG9fc2NyYXRjaF9vbmx5KHZvaWQpIHsgfVxcbiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKSB7IH1cXG4tc3RhdGljIGlubGluZSBib29sIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoX21lbW9yeShwaHlzX2FkZHJfdCBhZGRyKVxcbi17XFxuLVxcdHJldHVybiBmYWxzZTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSBlbnVtIG1pZ3JhdGV0eXBlIGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgcGZuLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgZW51bSBtaWdyYXRldHlwZSBtdClcXG4te1xcbi1cXHRyZXR1cm4gbXQ7XFxuLX1cXG4gI2VuZGlmXFxuIFxcbiAjZW5kaWYgLyogX0xJTlVYX01FTUJMT0NLX0ggKi9cXG5kaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUvTWFrZWZpbGUgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxcbmluZGV4IGVlYzlkM2FlMDdlYjRiLi5kOWY0Njk0NjI1NTY3MyAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxcbisrKyBiL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlXFxuQEAgLTgsNyArOCw2IEBAIGx1by15IDo9XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHRcXHRsdW9fc2Vzc2lvbi5vXFxuIFxcbiBvYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVIpXFx0XFx0Kz0ga2V4ZWNfaGFuZG92ZXIub1xcbi1vYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpXFx0Kz0ga2V4ZWNfaGFuZG92ZXJfZGVidWcub1xcbiBvYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUdGUylcXHQrPSBrZXhlY19oYW5kb3Zlcl9kZWJ1Z2ZzLm9cXG4gXFxuIG9iai0kKENPTkZJR19MSVZFVVBEQVRFKVxcdFxcdCs9IGx1by5vXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jXFxuaW5kZXggNDgzNGE4MDk5ODVhYjcuLjlkYzc5YjcxMDNiZGJmIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmNcXG4rKysgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jXFxuQEAgLTg0LDggKzg0LDI1IEBAIHN0YXRpYyBzdHJ1Y3Qga2hvX291dCBraG9fb3V0ID0ge1xcbiBcXHR9LFxcbiB9O1xcbiBcXG4rc3RydWN0IGtob19pbiB7XFxuK1xcdHBoeXNfYWRkcl90IGZkdF9waHlzO1xcbitcXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXM7XFxuK1xcdGNoYXIgcHJldmlvdXNfcmVsZWFzZVtfX05FV19VVFNfTEVOICsgMV07XFxuK1xcdHUzMiBrZXhlY19jb3VudDtcXG4rXFx0c3RydWN0IGtob19kZWJ1Z2ZzIGRiZztcXG4rXFx0c3RydWN0IGtob19yYWRpeF90cmVlIHJhZGl4X3RyZWU7XFxuK307XFxuK1xcbitzdGF0aWMgc3RydWN0IGtob19pbiBraG9faW4gPSB7XFxuK307XFxuK1xcbitzdGF0aWMgY29uc3Qgdm9pZCAqa2hvX2dldF9mZHQodm9pZClcXG4re1xcbitcXHRyZXR1cm4ga2hvX2luLmZkdF9waHlzID8gcGh5c190b192aXJ0KGtob19pbi5mZHRfcGh5cykgOiBOVUxMO1xcbit9XFxuK1xcbiAvKipcXG4tICoga2hvX3JhZGl4X2VuY29kZV9rZXkgLSBFbmNvZGVzIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIgaW50byBhIHJhZGl4IGtleS5cXG4rICoga2hvX2VuY29kZV9yYWRpeF9rZXkgLSBFbmNvZGVzIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIgaW50byBhIHJhZGl4IGtleS5cXG4gICogQHBoeXM6IFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwYWdlLlxcbiAgKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS5cXG4gICpcXG5AQCAtOTUsMzUgKzExMiwzOCBAQCBzdGF0aWMgc3RydWN0IGtob19vdXQga2hvX291dCA9IHtcXG4gICpcXG4gICogUmV0dXJuOiBUaGUgZW5jb2RlZCB1bnNpZ25lZCBsb25nIHJhZGl4IGtleS5cXG4gICovXFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGtob19yYWRpeF9lbmNvZGVfa2V5KHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGludCBvcmRlcilcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX2VuY29kZV9yYWRpeF9rZXkocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgaW50IG9yZGVyKVxcbiB7XFxuLVxcdC8qIE9yZGVyIGJpdHMgcGFydCAqL1xcbi1cXHR1bnNpZ25lZCBsb25nIGggPSAxVUwgXFx1MDAzY1xcdTAwM2MgKEtIT19PUkRFUl8wX0xPRzIgLSBvcmRlcik7XFxuLVxcdC8qIFNoaWZ0ZWQgcGh5c2ljYWwgYWRkcmVzcyBwYXJ0ICovXFxuLVxcdHVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgXFx1MDAzZVxcdTAwM2UgKFBBR0VfU0hJRlQgKyBvcmRlcik7XFxuK1xcdC8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIGlzIGVuY29kZWQgYnkgc2hpZnRpbmcgdGhlIFBGTiBieSBpdHMgb3JkZXIuICovXFxuK1xcdHVuc2lnbmVkIGxvbmcgc2hpZnQgPSBQQUdFX1NISUZUICsgb3JkZXI7XFxuK1xcdC8qIE9yZGVyIGJpdCBnb2VzIHJpZ2h0IGJlZm9yZSB0aGUgc2hpZnRlZCBQRk4uICovXFxuK1xcdHVuc2lnbmVkIGxvbmcgaCA9IDFVTCBcXHUwMDNjXFx1MDAzYyAoNjQgLSBzaGlmdCk7XFxuK1xcdC8qIFNoaWZ0ZWQgUEZOLiAqL1xcbitcXHR1bnNpZ25lZCBsb25nIGwgPSBwaHlzIFxcdTAwM2VcXHUwMDNlIHNoaWZ0O1xcbiBcXG4gXFx0cmV0dXJuIGggfCBsO1xcbiB9XFxuIFxcbiAvKipcXG4tICoga2hvX3JhZGl4X2RlY29kZV9rZXkgLSBEZWNvZGVzIGEgcmFkaXgga2V5IGJhY2sgaW50byBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyLlxcbisgKiBraG9fZGVjb2RlX3JhZGl4X2tleSAtIERlY29kZXMgYSByYWRpeCBrZXkgYmFjayBpbnRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXFxuICAqIEBrZXk6IFRoZSB1bnNpZ25lZCBsb25nIGtleSB0byBkZWNvZGUuXFxuICAqIEBvcmRlcjogQW4gb3V0cHV0IHBhcmFtZXRlciwgYSBwb2ludGVyIHRvIGFuIHVuc2lnbmVkIGludCB3aGVyZSB0aGUgZGVjb2RlZFxcbiAgKiAgICAgICAgIHBhZ2Ugb3JkZXIgd2lsbCBiZSBzdG9yZWQuXFxuICAqXFxuLSAqIFRoaXMgZnVuY3Rpb24gcmV2ZXJzZXMgdGhlIGVuY29kaW5nIHBlcmZvcm1lZCBieSBraG9fcmFkaXhfZW5jb2RlX2tleSgpLFxcbisgKiBUaGlzIGZ1bmN0aW9uIHJldmVyc2VzIHRoZSBlbmNvZGluZyBwZXJmb3JtZWQgYnkga2hvX2VuY29kZV9yYWRpeF9rZXkoKSxcXG4gICogZXh0cmFjdGluZyB0aGUgb3JpZ2luYWwgcGh5c2ljYWwgYWRkcmVzcyBhbmQgcGFnZSBvcmRlciBmcm9tIGEgZ2l2ZW4ga2V5LlxcbiAgKlxcbiAgKiBSZXR1cm46IFRoZSBkZWNvZGVkIHBoeXNpY2FsIGFkZHJlc3MuXFxuICAqL1xcbi1zdGF0aWMgcGh5c19hZGRyX3Qga2hvX3JhZGl4X2RlY29kZV9rZXkodW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGludCAqb3JkZXIpXFxuK3N0YXRpYyBwaHlzX2FkZHJfdCBraG9fZGVjb2RlX3JhZGl4X2tleSh1bnNpZ25lZCBsb25nIGtleSwgdW5zaWduZWQgaW50ICpvcmRlcilcXG4ge1xcbi1cXHR1bnNpZ25lZCBpbnQgb3JkZXJfYml0ID0gZmxzNjQoa2V5KTtcXG4rXFx0LyogZmxzNjQoKSBpbmRleGVzIHN0YXJ0aW5nIGZyb20gMS4gKi9cXG4rXFx0dW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSkgLSAxO1xcbiBcXHRwaHlzX2FkZHJfdCBwaHlzO1xcbiBcXG4tXFx0Lyogb3JkZXJfYml0IGlzIG51bWJlcmVkIHN0YXJ0aW5nIGF0IDEgZnJvbSBmbHM2NCAqL1xcbi1cXHQqb3JkZXIgPSBLSE9fT1JERVJfMF9MT0cyIC0gb3JkZXJfYml0ICsgMTtcXG4tXFx0LyogVGhlIG9yZGVyIGlzIGRpc2NhcmRlZCBieSB0aGUgc2hpZnQgKi9cXG4rXFx0Lyogb3JkZXIgYml0IGdvZXMgcmlnaHQgYmVmb3JlIHRoZSBzaGlmdGVkIFBGTi4gKi9cXG4rXFx0Km9yZGVyID0gNjQgLSAoUEFHRV9TSElGVCArIG9yZGVyX2JpdCk7XFxuK1xcdC8qIFRoZSBvcmRlciBiaXQgaXMgZGlzY2FyZGVkIGJ5IHRoZSBzaGlmdCAqL1xcbiBcXHRwaHlzID0ga2V5IFxcdTAwM2NcXHUwMDNjIChQQUdFX1NISUZUICsgKm9yZGVyKTtcXG4gXFxuIFxcdHJldHVybiBwaHlzO1xcbkBAIC0xNDMsMjUgKzE2Myw0NyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBraG9fcmFkaXhfZ2V0X3RhYmxlX2luZGV4KHVuc2lnbmVkIGxvbmcga2V5LFxcbiBcXHRyZXR1cm4gKGtleSBcXHUwMDNlXFx1MDAzZSBzKSAlICgxIFxcdTAwM2NcXHUwMDNjIEtIT19UQUJMRV9TSVpFX0xPRzIpO1xcbiB9XFxuIFxcbitzdGF0aWMgdm9pZCBfX3JlZiAqa2hvX3JhZGl4X2FsbG9jX25vZGUodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGU7XFxuK1xcbitcXHRpZiAoc2xhYl9pc19hdmFpbGFibGUoKSlcXG4rXFx0XFx0bm9kZSA9IChzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0bm9kZSA9IG1lbWJsb2NrX2FsbG9jKFBBR0VfU0laRSwgUEFHRV9TSVpFKTtcXG4rXFxuK1xcdHJldHVybiBub2RlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBfX3JlZiBraG9fcmFkaXhfZnJlZV9ub2RlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSlcXG4re1xcbitcXHRpZiAoc2xhYl9pc19hdmFpbGFibGUoKSlcXG4rXFx0XFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKW5vZGUpO1xcbitcXHRlbHNlXFxuK1xcdFxcdG1lbWJsb2NrX2ZyZWUobm9kZSwgUEFHRV9TSVpFKTtcXG4rfVxcbitcXG4gLyoqXFxuLSAqIGtob19yYWRpeF9hZGRfcGFnZSAtIE1hcmtzIGEgcGFnZSBhcyBwcmVzZXJ2ZWQgaW4gdGhlIHJhZGl4IHRyZWUuXFxuKyAqIGtob19yYWRpeF9hZGRfa2V5IC0gQWRkIGEga2V5IHRvIHRoZSByYWRpeCB0cmVlLlxcbiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLlxcbi0gKiBAcGZuOiBUaGUgcGFnZSBmcmFtZSBudW1iZXIgb2YgdGhlIHBhZ2UgdG8gcHJlc2VydmUuXFxuLSAqIEBvcmRlcjogVGhlIG9yZGVyIG9mIHRoZSBwYWdlLlxcbisgKiBAa2V5OiBUaGUga2V5IHRvIGFkZC5cXG4gICpcXG4tICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYmFzZWQgb24gdGhlIGtleSBkZXJpdmVkIGZyb20gQHBmblxcbi0gKiBhbmQgQG9yZGVyLiBJdCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGVcXG4tICogcGFnZSBmb3IgcHJlc2VydmF0aW9uLiBJZiBpbnRlcm1lZGlhdGUgbm9kZXMgZG8gbm90IGV4aXN0IGFsb25nIHRoZSBwYXRoLFxcbi0gKiB0aGV5IGFyZSBhbGxvY2F0ZWQgYW5kIGFkZGVkIHRvIHRoZSB0cmVlLlxcbisgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBiYXNlZCBvbiB0aGUgQGtleSBwcm92aWRlZC4gSXQgc2V0cyB0aGVcXG4rICogY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGxlYWYgYml0bWFwIHRvIG1hcmsgdGhlIEBrZXkgYXMgcHJlc2VudC4gSWZcXG4rICogaW50ZXJtZWRpYXRlIG5vZGVzIGRvIG5vdCBleGlzdCBhbG9uZyB0aGUgcGF0aCwgdGhleSBhcmUgYWxsb2NhdGVkIGFuZCBhZGRlZFxcbisgKiB0byB0aGUgdHJlZS5cXG4rICpcXG4rICogTk9URTogQ3VycmVudGx5IG9ubHkga2V5cyBvZiB3aWR0aCB1cCB0byAlS0hPX1JBRElYX0tFWV9XSURUSCBhcmUgc3VwcG9ydGVkLlxcbisgKiBUaGlzIGxpbWl0IG9ubHkgZXhpc3RzIGJlY2F1c2UgY3VycmVudCB1c2VycyBvZiB0aGUgcmFkaXggdHJlZSBkb24ndCB1c2UgbW9yZVxcbisgKiB0aGFuIHRoYXQuIENoYW5naW5nIHRoZSBtYXhpbXVtIHdpZHRoIHJlcXVpcmVzIGNoYW5naW5nIHRoZSB0cmVlIGRlcHRoLCB3aGljaFxcbisgKiBuZWVkcyBidW1waW5nIHRoZSBBQkkgdmVyc2lvbi5cXG4gICpcXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLlxcbiAgKi9cXG4taW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLVxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgaW50IG9yZGVyKVxcbitpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSlcXG4ge1xcbiBcXHQvKiBOZXdseSBhbGxvY2F0ZWQgbm9kZXMgZm9yIGVycm9yIGNsZWFudXAgKi9cXG4gXFx0c3RydWN0IGtob19yYWRpeF9ub2RlICppbnRlcm1lZGlhdGVfbm9kZXNbS0hPX1RSRUVfTUFYX0RFUFRIXSA9IHsgMCB9O1xcbi1cXHR1bnNpZ25lZCBsb25nIGtleSA9IGtob19yYWRpeF9lbmNvZGVfa2V5KFBGTl9QSFlTKHBmbiksIG9yZGVyKTtcXG4gXFx0c3RydWN0IGtob19yYWRpeF9ub2RlICphbmNob3Jfbm9kZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSA9IHRyZWUtXFx1MDAzZXJvb3Q7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbmV3X25vZGU7XFxuQEAgLTE3Miw2ICsyMTQsOSBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG4gXFx0aWYgKFdBUk5fT05fT05DRSghdHJlZS1cXHUwMDNlcm9vdCkpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4rXFx0aWYgKHVubGlrZWx5KGZsczY0KGtleSkgXFx1MDAzZSBLSE9fUkFESVhfS0VZX1dJRFRIKSlcXG4rXFx0XFx0cmV0dXJuIC1FUkFOR0U7XFxuK1xcbiBcXHRtaWdodF9zbGVlcCgpO1xcbiBcXG4gXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZ0cmVlLVxcdTAwM2Vsb2NrKTtcXG5AQCAtMTg2LDcgKzIzMSw3IEBAIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbiBcXHRcXHR9XFxuIFxcbiBcXHRcXHQvKiBOZXh0IG5vZGUgaXMgZW1wdHksIGNyZWF0ZSBhIG5ldyBub2RlIGZvciBpdCAqL1xcbi1cXHRcXHRuZXdfbm9kZSA9IChzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdG5ld19ub2RlID0ga2hvX3JhZGl4X2FsbG9jX25vZGUoKTtcXG4gXFx0XFx0aWYgKCFuZXdfbm9kZSkge1xcbiBcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbiBcXHRcXHRcXHRnb3RvIGVycl9mcmVlX25vZGVzO1xcbkBAIC0yMTcsMjkgKzI2MiwyNiBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG4gZXJyX2ZyZWVfbm9kZXM6XFxuIFxcdGZvciAoaSA9IEtIT19UUkVFX01BWF9ERVBUSCAtIDE7IGkgXFx1MDAzZSAwOyBpLS0pIHtcXG4gXFx0XFx0aWYgKGludGVybWVkaWF0ZV9ub2Rlc1tpXSlcXG4tXFx0XFx0XFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWludGVybWVkaWF0ZV9ub2Rlc1tpXSk7XFxuK1xcdFxcdFxcdGtob19yYWRpeF9mcmVlX25vZGUoaW50ZXJtZWRpYXRlX25vZGVzW2ldKTtcXG4gXFx0fVxcbiBcXHRpZiAoYW5jaG9yX25vZGUpXFxuIFxcdFxcdGFuY2hvcl9ub2RlLVxcdTAwM2V0YWJsZVthbmNob3JfaWR4XSA9IDA7XFxuIFxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuLUVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9hZGRfcGFnZSk7XFxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9hZGRfa2V5KTtcXG4gXFxuIC8qKlxcbi0gKiBraG9fcmFkaXhfZGVsX3BhZ2UgLSBSZW1vdmVzIGEgcGFnZSdzIHByZXNlcnZhdGlvbiBzdGF0dXMgZnJvbSB0aGUgcmFkaXggdHJlZS5cXG4rICoga2hvX3JhZGl4X2RlbF9rZXkgLSBSZW1vdmVzIHRoZSBrZXkgZnJvbSB0aGUgcmFkaXggdHJlZS5cXG4gICogQHRyZWU6IFRoZSBLSE8gcmFkaXggdHJlZS5cXG4tICogQHBmbjogVGhlIHBhZ2UgZnJhbWUgbnVtYmVyIG9mIHRoZSBwYWdlIHRvIHVucHJlc2VydmUuXFxuLSAqIEBvcmRlcjogVGhlIG9yZGVyIG9mIHRoZSBwYWdlLlxcbisgKiBAa2V5OiBUaGUga2V5IHRvIHJlbW92ZS5cXG4gICpcXG4gICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNsZWFycyB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG9cXG4tICogdGhlIHBhZ2UsIGVmZmVjdGl2ZWx5IHJlbW92aW5nIGl0cyBcXFwicHJlc2VydmVkXFxcIiBzdGF0dXMuIEl0IGRvZXMgbm90IGZyZWVcXG4tICogdGhlIHRyZWUncyBpbnRlcm1lZGlhdGUgbm9kZXMsIGV2ZW4gaWYgdGhleSBiZWNvbWUgZW1wdHkuXFxuKyAqIHRoZSBAa2V5LCBlZmZlY3RpdmVseSByZW1vdmluZyBpdCBmcm9tIHRoZSB0cmVlLiBJdCBkb2VzIG5vdCBmcmVlIHRoZSB0cmVlJ3NcXG4rICogaW50ZXJtZWRpYXRlIG5vZGVzLCBldmVuIGlmIHRoZXkgYmVjb21lIGVtcHR5LlxcbiAgKi9cXG4tdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcXG4tXFx0XFx0XFx0dW5zaWduZWQgaW50IG9yZGVyKVxcbit2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpXFxuIHtcXG4tXFx0dW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSA9IHRyZWUtXFx1MDAzZXJvb3Q7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZjtcXG4gXFx0dW5zaWduZWQgaW50IGksIGlkeDtcXG5AQCAtMjQ3LDYgKzI4OSwxMCBAQCB2b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxcbiBcXHRpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLVxcdTAwM2Vyb290KSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4rXFx0LyogS2V5cyB3aWRlciB0aGFuIEtIT19SQURJWF9LRVlfV0lEVEggYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGFkZGVkLiAqL1xcbitcXHRpZiAodW5saWtlbHkoZmxzNjQoa2V5KSBcXHUwMDNlIEtIT19SQURJWF9LRVlfV0lEVEgpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbiBcXHRtaWdodF9zbGVlcCgpO1xcbiBcXG4gXFx0Z3VhcmQobXV0ZXgpKFxcdTAwMjZ0cmVlLVxcdTAwM2Vsb2NrKTtcXG5AQCAtMjcwLDIxICszMTYsODUgQEAgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcXG4gXFx0aWR4ID0ga2hvX3JhZGl4X2dldF9iaXRtYXBfaW5kZXgoa2V5KTtcXG4gXFx0X19jbGVhcl9iaXQoaWR4LCBsZWFmLVxcdTAwM2ViaXRtYXApO1xcbiB9XFxuLUVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZWxfcGFnZSk7XFxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZWxfa2V5KTtcXG4rXFxuK3N0YXRpYyB2b2lkIF9fa2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IGxldmVsKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdGlmIChsZXZlbCA9PSAwKSB7XFxuK1xcdFxcdGtob19yYWRpeF9mcmVlX25vZGUocm9vdCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFBBR0VfU0laRSAvIHNpemVvZihwaHlzX2FkZHJfdCk7IGkrKykge1xcbitcXHRcXHRpZiAocm9vdC1cXHUwMDNldGFibGVbaV0pXFxuK1xcdFxcdFxcdF9fa2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShwaHlzX3RvX3ZpcnQocm9vdC1cXHUwMDNldGFibGVbaV0pLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgbGV2ZWwgLSAxKTtcXG4rXFx0fVxcbitcXG4rXFx0a2hvX3JhZGl4X2ZyZWVfbm9kZShyb290KTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGtob19yYWRpeF9pbml0X3RyZWUgLSBpbml0aWFsaXplIHRoZSByYWRpeCB0cmVlLlxcbisgKiBAdHJlZTogICB0aGUgdHJlZSB0byBpbml0aWFsaXplLlxcbisgKiBAcm9vdDogICByb290IHRhYmxlIG9mIHRoZSByYWRpeCB0cmVlLlxcbisgKlxcbisgKiBJbml0aWFsaXplIHRoZSByYWRpeCB0cmVlIHdpdGggdGhlIGdpdmVuIHJvb3Qgbm9kZS4gSWYgcm9vdCBpcyAlTlVMTCwgYW5cXG4rICogZW1wdHkgcm9vdCB0YWJsZSBpcyBhbGxvY2F0ZWQuIElmIHJvb3QgaXMgbm90ICVOVUxMLCBpdCBpcyB0aGUgY2FsbGVyJ3NcXG4rICogcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoZSByb290IGlzIHZhbGlkIGFuZCBpbiB0aGUgY29ycmVjdCBmb3JtYXQuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS5cXG4rICovXFxuK2ludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxcbit7XFxuK1xcdGlmICghcm9vdClcXG4rXFx0XFx0cm9vdCA9IGtob19yYWRpeF9hbGxvY19ub2RlKCk7XFxuK1xcdGlmICghcm9vdClcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHR0cmVlLVxcdTAwM2Vyb290ID0gcm9vdDtcXG4rXFx0bXV0ZXhfaW5pdChcXHUwMDI2dHJlZS1cXHUwMDNlbG9jayk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpO1xcbitcXG4rLyoqXFxuKyAqIGtob19yYWRpeF9kZXN0cm95X3RyZWUgLSBEZXN0cm95IHRoZSByYWRpeCB0cmVlXFxuKyAqIEB0cmVlOiBUaGUgcmFkaXggdHJlZSB0byBkZXN0cm95XFxuKyAqXFxuKyAqIFdhbGsgQHRyZWUgYW5kIGZyZWUgYWxsIGl0cyBub2Rlcy5cXG4rICovXFxuK3ZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpXFxuK3tcXG4rXFx0aWYgKCF0cmVlLVxcdTAwM2Vyb290KVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRfX2tob19yYWRpeF9kZXN0cm95X3RyZWUodHJlZS1cXHUwMDNlcm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSk7XFxuK1xcdHRyZWUtXFx1MDAzZXJvb3QgPSBOVUxMO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZXN0cm95X3RyZWUpO1xcbiBcXG4tc3RhdGljIGludCBraG9fcmFkaXhfd2Fsa19sZWFmKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZixcXG4tXFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcga2V5LFxcbi1cXHRcXHRcXHQgICAgICAga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxcbitzdGF0aWMgaW50IGtob19yYWRpeF93YWxrX2xlYWYoc3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmLCB1bnNpZ25lZCBsb25nIGtleSxcXG4rXFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilsZWFmO1xcbi1cXHR1bnNpZ25lZCBpbnQgb3JkZXI7XFxuLVxcdHBoeXNfYWRkcl90IHBoeXM7XFxuIFxcdHVuc2lnbmVkIGludCBpO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4rXFx0aWYgKGNiLVxcdTAwM2Vub2RlKSB7XFxuK1xcdFxcdGVyciA9IGNiLVxcdTAwM2Vub2RlKHZpcnRfdG9fcGh5cyhsZWFmKSwgZGF0YSk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghY2ItXFx1MDAzZWxlYWYpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4gXFx0Zm9yX2VhY2hfc2V0X2JpdChpLCBiaXRtYXAsIFBBR0VfU0laRSAqIEJJVFNfUEVSX0JZVEUpIHtcXG4tXFx0XFx0cGh5cyA9IGtob19yYWRpeF9kZWNvZGVfa2V5KGtleSB8IGksIFxcdTAwMjZvcmRlcik7XFxuLVxcdFxcdGVyciA9IGNiKHBoeXMsIG9yZGVyKTtcXG4rXFx0XFx0ZXJyID0gY2ItXFx1MDAzZWxlYWYoa2V5IHwgaSwgZGF0YSk7XFxuIFxcdFxcdGlmIChlcnIpXFxuIFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG5AQCAtMjk0LDcgKzQwNCw3IEBAIHN0YXRpYyBpbnQga2hvX3JhZGl4X3dhbGtfbGVhZihzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWYsXFxuIFxcbiBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXFxuIFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuLVxcdFxcdFxcdFxcdCBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXFxuK1xcdFxcdFxcdFxcdCBjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgKmNiLCB2b2lkICpkYXRhKVxcbiB7XFxuIFxcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZTtcXG4gXFx0c3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmO1xcbkBAIC0zMDIsNiArNDEyLDEyIEBAIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcXG4gXFx0dW5zaWduZWQgaW50IHNoaWZ0O1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4rXFx0aWYgKGNiLVxcdTAwM2Vub2RlKSB7XFxuK1xcdFxcdGVyciA9IGNiLVxcdTAwM2Vub2RlKHZpcnRfdG9fcGh5cyhyb290KSwgZGF0YSk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBQQUdFX1NJWkUgLyBzaXplb2YocGh5c19hZGRyX3QpOyBpKyspIHtcXG4gXFx0XFx0aWYgKCFyb290LVxcdTAwM2V0YWJsZVtpXSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuQEAgLTMxOCwxMCArNDM0LDEwIEBAIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcXG4gXFx0XFx0XFx0ICogbm9kZSBpcyBwb2ludGluZyB0byB0aGUgbGV2ZWwgMCBiaXRtYXAuXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRsZWFmID0gKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqKW5vZGU7XFxuLVxcdFxcdFxcdGVyciA9IGtob19yYWRpeF93YWxrX2xlYWYobGVhZiwga2V5LCBjYik7XFxuK1xcdFxcdFxcdGVyciA9IGtob19yYWRpeF93YWxrX2xlYWYobGVhZiwga2V5LCBjYiwgZGF0YSk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuIFxcdFxcdFxcdGVyciAgPSBfX2tob19yYWRpeF93YWxrX3RyZWUobm9kZSwgbGV2ZWwgLSAxLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgICAgIGtleSwgY2IpO1xcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGtleSwgY2IsIGRhdGEpO1xcbiBcXHRcXHR9XFxuIFxcbiBcXHRcXHRpZiAoZXJyKVxcbkBAIC0zMzIsMjggKzQ0OCwyNyBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXFxuIH1cXG4gXFxuIC8qKlxcbi0gKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIHByZXNlcnZlZCBwYWdlLlxcbisgKiBraG9fcmFkaXhfd2Fsa190cmVlIC0gVHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGFuZCBjYWxscyBhIGNhbGxiYWNrIGZvciBlYWNoIGtleS5cXG4gICogQHRyZWU6IEEgcG9pbnRlciB0byB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gd2Fsay5cXG4tICogQGNiOiBBIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHR5cGUga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IHRoYXQgd2lsbCBiZVxcbi0gKiAgICAgIGludm9rZWQgZm9yIGVhY2ggcHJlc2VydmVkIHBhZ2UgZm91bmQgaW4gdGhlIHRyZWUuIFRoZSBjYWxsYmFjayByZWNlaXZlc1xcbi0gKiAgICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBvZiB0aGUgcHJlc2VydmVkIHBhZ2UuXFxuKyAqIEBjYjogICBTZXQgb2YgY2FsbGJhY2tzIHRvIGJlIGludm9rZWQgZHVyaW5nIHRoZSB0cmVlIHdhbGsuXFxuKyAqIEBkYXRhOiBPcGFxdWUgZGF0YSBwb2ludGVyIHBhc3NlZCB0byBlYWNoIGNhbGxiYWNrIGluIEBjYi5cXG4gICpcXG4tICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHNwZWNpZmllZCB0b3AgbGV2ZWxcXG4tICogZG93biB0byB0aGUgbG93ZXN0IGxldmVsIChsZXZlbCAwKS4gRm9yIGVhY2ggcHJlc2VydmVkIHBhZ2UgZm91bmQsIGl0IGludm9rZXNcXG4tICogdGhlIHByb3ZpZGVkIGNhbGxiYWNrLCBwYXNzaW5nIHRoZSBwYWdlJ3MgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXFxuKyAqIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIHJhZGl4IHRyZWUsIHNlYXJjaGluZyBmcm9tIHRoZSB0b3AgbGV2ZWwgZG93biB0byB0aGVcXG4rICogbG93ZXN0IGxldmVsIChsZXZlbCAwKSwgaW52b2tpbmcgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcy5cXG4gICpcXG4gICogUmV0dXJuOiAwIGlmIHRoZSB3YWxrIGNvbXBsZXRlZCB0aGUgc3BlY2lmaWVkIHRyZWUsIG9yIHRoZSBub24temVybyByZXR1cm5cXG4gICogICAgICAgICB2YWx1ZSBmcm9tIHRoZSBjYWxsYmFjayB0aGF0IHN0b3BwZWQgdGhlIHdhbGsuXFxuICAqL1xcbiBpbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLVxcdFxcdFxcdGtob19yYWRpeF90cmVlX3dhbGtfY2FsbGJhY2tfdCBjYilcXG4rXFx0XFx0XFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSlcXG4ge1xcbiBcXHRpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLVxcdTAwM2Vyb290KSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbiBcXHRndWFyZChtdXRleCkoXFx1MDAyNnRyZWUtXFx1MDAzZWxvY2spO1xcbiBcXG4tXFx0cmV0dXJuIF9fa2hvX3JhZGl4X3dhbGtfdHJlZSh0cmVlLVxcdTAwM2Vyb290LCBLSE9fVFJFRV9NQVhfREVQVEggLSAxLCAwLCBjYik7XFxuK1xcdHJldHVybiBfX2tob19yYWRpeF93YWxrX3RyZWUodHJlZS1cXHUwMDNlcm9vdCwgS0hPX1RSRUVfTUFYX0RFUFRIIC0gMSwgMCwgY2IsXFxuK1xcdFxcdFxcdFxcdCAgICAgZGF0YSk7XFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X3dhbGtfdHJlZSk7XFxuIFxcbkBAIC00ODQsMTMgKzU5OSwxNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKl9faW5pdCBraG9fZ2V0X3ByZXNlcnZlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMsXFxuIFxcdHJldHVybiBwZm5fdG9fcGFnZShwZm4pO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IF9faW5pdCBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlKHBoeXNfYWRkcl90IHBoeXMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXFxuK3N0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUodW5zaWduZWQgbG9uZyBrZXksIHZvaWQgKmRhdGEpXFxuIHtcXG4gXFx0dW5pb24ga2hvX3BhZ2VfaW5mbyBpbmZvO1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4rXFx0dW5zaWduZWQgaW50IG9yZGVyO1xcbitcXHRwaHlzX2FkZHJfdCBwaHlzO1xcbiBcXHR1NjQgc3o7XFxuIFxcbitcXHRwaHlzID0ga2hvX2RlY29kZV9yYWRpeF9rZXkoa2V5LCBcXHUwMDI2b3JkZXIpO1xcbitcXG4gXFx0c3ogPSAxIFxcdTAwM2NcXHUwMDNjIChvcmRlciArIFBBR0VfU0hJRlQpO1xcbiBcXHRwYWdlID0ga2hvX2dldF9wcmVzZXJ2ZWRfcGFnZShwaHlzLCBvcmRlcik7XFxuIFxcbkBAIC01MDQsMTkgKzYyMiwyNCBAQCBzdGF0aWMgaW50IF9faW5pdCBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlKHBoeXNfYWRkcl90IHBoeXMsXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi0vKiBSZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovXFxuLXN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQga2hvX2dldF9tZW1fbWFwX3BoeXMoY29uc3Qgdm9pZCAqZmR0KVxcbisvKiBSZXR1cm5zIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcHJlc2VydmVkIG1lbW9yeSBtYXAgZnJvbSBGRFQgKi9cXG4rc3RhdGljIF9faW5pdCB2b2lkICpraG9fZ2V0X21lbV9tYXAoY29uc3Qgdm9pZCAqZmR0KVxcbiB7XFxuIFxcdGNvbnN0IHZvaWQgKm1lbV9wdHI7XFxuK1xcdHBoeXNfYWRkcl90IG1lbV9tYXBfcGh5cztcXG4gXFx0aW50IGxlbjtcXG4gXFxuIFxcdG1lbV9wdHIgPSBmZHRfZ2V0cHJvcChmZHQsIDAsIEtIT19GRFRfTUVNT1JZX01BUF9QUk9QX05BTUUsIFxcdTAwMjZsZW4pO1xcbiBcXHRpZiAoIW1lbV9wdHIgfHwgbGVuICE9IHNpemVvZih1NjQpKSB7XFxuIFxcdFxcdHByX2VycihcXFwiZmFpbGVkIHRvIGdldCBwcmVzZXJ2ZWQgbWVtb3J5IG1hcFxcXFxuXFxcIik7XFxuLVxcdFxcdHJldHVybiAwO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFx0fVxcbiBcXG4tXFx0cmV0dXJuIGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKW1lbV9wdHIpO1xcbitcXHRtZW1fbWFwX3BoeXMgPSBnZXRfdW5hbGlnbmVkKChjb25zdCB1NjQgKiltZW1fcHRyKTtcXG4rXFx0aWYgKCFtZW1fbWFwX3BoeXMpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXG4rXFx0cmV0dXJuIHBoeXNfdG9fdmlydChtZW1fbWFwX3BoeXMpO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC02MTksMTkgKzc0MiwyNCBAQCBlYXJseV9wYXJhbShcXFwia2hvX3NjcmF0Y2hcXFwiLCBraG9fcGFyc2Vfc2NyYXRjaF9zaXplKTtcXG4gc3RhdGljIHZvaWQgX19pbml0IHNjcmF0Y2hfc2l6ZV91cGRhdGUodm9pZClcXG4ge1xcbiBcXHQvKlxcbi1cXHQgKiBJZiBmaXhlZCBzaXplcyBhcmUgbm90IHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUsIGNhbGN1bGF0ZSB0aGVtXFxuLVxcdCAqIG5vdy5cXG4rXFx0ICogSWYgZml4ZWQgc2l6ZXMgYXJlIG5vdCBwcm92aWRlZCB2aWEgY29tbWFuZCBsaW5lLCBjYWxjdWxhdGUgdGhlbSBub3cuXFxuK1xcdCAqIFJlbW92ZSBIdWdlVExCIGFsbG9jYXRpb25zIGZyb20gaXQgYmVjYXVzZSB0aGV5IG5ldmVyIGdldCBhbGxvY2F0ZWRcXG4rXFx0ICogZnJvbSBzY3JhdGNoLlxcbiBcXHQgKi9cXG4gXFx0aWYgKHNjcmF0Y2hfc2NhbGUpIHtcXG4gXFx0XFx0cGh5c19hZGRyX3Qgc2l6ZTtcXG4gXFxuIFxcdFxcdHNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoQVJDSF9MT1dfQUREUkVTU19MSU1JVCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgTlVNQV9OT19OT0RFKTtcXG4rXFx0XFx0c2l6ZSAtPSBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUoQVJDSF9MT1dfQUREUkVTU19MSU1JVCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XFxuIFxcdFxcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMDtcXG4gXFx0XFx0c2NyYXRjaF9zaXplX2xvd21lbSA9IHNpemU7XFxuIFxcbiBcXHRcXHRzaXplID0gbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKE1FTUJMT0NLX0FMTE9DX0FOWVdIRVJFLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgICBOVU1BX05PX05PREUpO1xcbitcXHRcXHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XFxuIFxcdFxcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMCAtIHNjcmF0Y2hfc2l6ZV9sb3dtZW07XFxuIFxcdFxcdHNjcmF0Y2hfc2l6ZV9nbG9iYWwgPSBzaXplO1xcbiBcXHR9XFxuQEAgLTY1MSw2ICs3NzksOSBAQCBzdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHNjcmF0Y2hfc2l6ZV9ub2RlKGludCBuaWQpXFxuIFxcdGlmIChzY3JhdGNoX3NjYWxlKSB7XFxuIFxcdFxcdHNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgIG5pZCk7XFxuK1xcdFxcdC8qIERvIG5vdCBjb3VudCBIdWdlVExCIHBhZ2VzLiAqL1xcbitcXHRcXHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIG5pZCk7XFxuIFxcdFxcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMDtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0c2l6ZSA9IHNjcmF0Y2hfc2l6ZV9wZXJub2RlO1xcbkBAIC02NTksNiArNzkwLDQ5IEBAIHN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgc2NyYXRjaF9zaXplX25vZGUoaW50IG5pZClcXG4gXFx0cmV0dXJuIHJvdW5kX3VwKHNpemUsIENNQV9NSU5fQUxJR05NRU5UX0JZVEVTKTtcXG4gfVxcbiBcXG4rYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxcbit7XFxuK1xcdHBoeXNfYWRkcl90IHNjcmF0Y2hfc3RhcnQsIHNjcmF0Y2hfZW5kO1xcbitcXHR1bnNpZ25lZCBpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBraG9fc2NyYXRjaF9jbnQ7IGkrKykge1xcbitcXHRcXHRzY3JhdGNoX3N0YXJ0ID0ga2hvX3NjcmF0Y2hbaV0uYWRkcjtcXG4rXFx0XFx0c2NyYXRjaF9lbmQgPSBraG9fc2NyYXRjaFtpXS5hZGRyICsga2hvX3NjcmF0Y2hbaV0uc2l6ZTtcXG4rXFxuK1xcdFxcdGlmIChwaHlzIFxcdTAwM2Mgc2NyYXRjaF9lbmQgXFx1MDAyNlxcdTAwMjYgKHBoeXMgKyBzaXplKSBcXHUwMDNlIHNjcmF0Y2hfc3RhcnQpXFxuK1xcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuKy8qXFxuKyAqIE1hcmsgYWxsIEtITyBzY3JhdGNoIHBhZ2VibG9ja3MgYmV0d2VlbiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gYXNcXG4rICogTUlHUkFURV9DTUEuXFxuKyAqL1xcbit2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4re1xcbitcXHRmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSBcXHUwMDNjIGtob19zY3JhdGNoX2NudDsgaSsrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQsIHBmbjtcXG4rXFxuK1xcdFxcdHNjcmF0Y2hfc3RhcnQgPSBQSFlTX1BGTihraG9fc2NyYXRjaFtpXS5hZGRyKTtcXG4rXFx0XFx0c2NyYXRjaF9lbmQgPSBQSFlTX1BGTihraG9fc2NyYXRjaFtpXS5hZGRyICsga2hvX3NjcmF0Y2hbaV0uc2l6ZSk7XFxuK1xcbitcXHRcXHQvKiBUYXJnZXQgcmFuZ2UgZG9lc24ndCBvdmVybGFwIHdpdGggc2NyYXRjaC4gKi9cXG4rXFx0XFx0aWYgKHN0YXJ0X3BmbiBcXHUwMDNlPSBzY3JhdGNoX2VuZCB8fCBlbmRfcGZuIFxcdTAwM2M9IHNjcmF0Y2hfc3RhcnQpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0cGZuID0gbWF4X3QodW5zaWduZWQgbG9uZywgc3RhcnRfcGZuLCBzY3JhdGNoX3N0YXJ0KTtcXG4rXFx0XFx0cGZuID0gcGFnZWJsb2NrX3N0YXJ0X3BmbihwZm4pO1xcbitcXG4rXFx0XFx0d2hpbGUgKHBmbiBcXHUwMDNjIGVuZF9wZm4gXFx1MDAyNlxcdTAwMjYgcGZuIFxcdTAwM2Mgc2NyYXRjaF9lbmQpIHtcXG4rXFx0XFx0XFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgTUlHUkFURV9DTUEsIGZhbHNlKTtcXG4rXFx0XFx0XFx0cGZuICs9IHBhZ2VibG9ja19ucl9wYWdlcztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBraG9fcmVzZXJ2ZV9zY3JhdGNoIC0gUmVzZXJ2ZSBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IGZvciBrZXhlY1xcbiAgKlxcbkBAIC03NDYsNiArOTIwLDEyOCBAQCBzdGF0aWMgdm9pZCBfX2luaXQga2hvX3Jlc2VydmVfc2NyYXRjaCh2b2lkKVxcbiBcXHRraG9fZW5hYmxlID0gZmFsc2U7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIExvb2sgZm9yIGZyZWUgYmxvY2tzIG9mIDFHLiBUaGlzIGlzIGEgaGV1cmlzdGljIGNob3NlbiB0byB3b3JrIGVmZmljaWVudGx5XFxuKyAqIHdpdGggbGFyZ2Ugc3lzdGVtcyB3aXRoIGh1bmRyZWRzIG9mIGdpZ2FieXRlcyBvZiBtZW1vcnkuIEl0IHdpbGwgd29yayBwb29ybHlcXG4rICogb24gc21hbGxlciBzeXN0ZW1zLiBUaGUgYWxnb3JpdGhtIGl0c2VsZiBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHZhbHVlLFxcbisgKiBzbyBpdCBjYW4gYmUgY2hhbmdlZCB0byBhIGRpZmZlcmVudCBoZXVyaXN0aWMgbGF0ZXIgaWYgbmVlZGVkLlxcbisgKi9cXG4rI2RlZmluZSBLSE9fRVhUX0JMS1NJWkVcXHRcXHRTWl8xR1xcbisjZGVmaW5lIEtIT19FWFRfU0hJRlRcXHRcXHRjb25zdF9pbG9nMihLSE9fRVhUX0JMS1NJWkUpXFxuK1xcbisvKiBDYWxsZWQgZm9yIHRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiAqL1xcbitzdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbGVhZih1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHQvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqL1xcbitcXHRzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUgPSBkYXRhO1xcbitcXHRwaHlzX2FkZHJfdCBzdGFydCwgZW5kO1xcbitcXHR1bnNpZ25lZCBpbnQgb3JkZXI7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRzdGFydCA9IGtob19kZWNvZGVfcmFkaXhfa2V5KGtleSwgXFx1MDAyNm9yZGVyKTtcXG4rXFx0ZW5kID0gc3RhcnQgKyAoMVVMIFxcdTAwM2NcXHUwMDNjIChvcmRlciArIFBBR0VfU0hJRlQpKTtcXG4rXFxuK1xcdHdoaWxlIChzdGFydCBcXHUwMDNjIGVuZCkge1xcbitcXHRcXHRlcnIgPSBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBzdGFydCBcXHUwMDNlXFx1MDAzZSBLSE9fRVhUX1NISUZUKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFxuK1xcdFxcdHN0YXJ0ICs9ICgxVUwgXFx1MDAzY1xcdTAwM2MgS0hPX0VYVF9TSElGVCk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKiBDYWxsZWQgZm9yIHRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiAqL1xcbitzdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbm9kZShwaHlzX2FkZHJfdCBwaHlzLCB2b2lkICpkYXRhKVxcbit7XFxuK1xcdC8qIFJhZGl4IHRyZWUgdHJhY2tpbmcgZnJlZSBibG9ja3MuICovXFxuK1xcdHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSA9IGRhdGE7XFxuK1xcbitcXHRyZXR1cm4ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgcGh5cyBcXHUwMDNlXFx1MDAzZSBLSE9fRVhUX1NISUZUKTtcXG4rfVxcbitcXG4rLyogQ2FsbGVkIGZvciB0aGUgZnJlZSBibG9jayByYWRpeCB0cmVlLiAqL1xcbitzdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X21hcmtfc2NyYXRjaCh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHRwaHlzX2FkZHJfdCAqcHJldl9lbmQgPSBkYXRhO1xcbitcXHRwaHlzX2FkZHJfdCBzdGFydCA9IGtleSBcXHUwMDNjXFx1MDAzYyBLSE9fRVhUX1NISUZUO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKHN0YXJ0IFxcdTAwM2UgKnByZXZfZW5kKSB7XFxuK1xcdFxcdGVyciA9IG1lbWJsb2NrX21hcmtfa2hvX3NjcmF0Y2goKnByZXZfZW5kLCBzdGFydCAtICpwcmV2X2VuZCk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdCpwcmV2X2VuZCA9IHN0YXJ0ICsgKDFVTCBcXHUwMDNjXFx1MDAzYyBLSE9fRVhUX1NISUZUKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qXFxuKyAqIGtob19leHRlbmRfc2NyYXRjaCAtIEV4dGVuZCB0aGUgc2NyYXRjaCByZWdpb25zXFxuKyAqXFxuKyAqIFRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlIG1peGVzIGJvdGggcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXJcXG4rICogaW50byBhIHNpbmdsZSBrZXkuIFRoaXMgbWFrZXMgaXQgaGFyZCB0byBsb29rIGZvciBmcmVlIHJhbmdlcyBkaXJlY3RseS4gVGhpc1xcbisgKiBmdW5jdGlvbiBmaXJzdCB3YWxrcyB0aGUgcmFkaXggdHJlZSBhbmQgZGlnZXN0cyBpdCBkb3duIGludG8gYW5vdGhlciByYWRpeFxcbisgKiB0cmVlLCB3aG9zZSBrZXlzIGlkZW50aWZ5IGJsb2NrcyBvZiBLSE9fRVhUX1NISUZUIHdoaWNoIGNvbnRhaW4gcHJlc2VydmVkXFxuKyAqIG1lbW9yeS5cXG4rICpcXG4rICogVGhlbiBpdCB3YWxrcyB0aGUgZGlnZXN0ZWQgcmFkaXggdHJlZSBhbmQgbWFya3MgZXZlcnl0aGluZyB0aGF0IGRvZXNuJ3QgaGF2ZVxcbisgKiBwcmVzZXJ2ZWQgbWVtb3J5IGFzIHNjcmF0Y2guXFxuKyAqXFxuKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBzbyBpdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2NyYXRjaCBoYXNcXG4rICogYXZhaWxhYmxlIHNwYWNlLlxcbisgKlxcbisgKiBOT1RFOiBUaGUgcGFnZXMgb2YgdGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUgdGFibGVzIGFyZSBub3QgbWFya2VkXFxuKyAqIGFzIHByZXNlcnZlZCBpbiB0aGUgcHJlc2VydmVkIG1lbW9yeSB0cmVlLiBCdXQgdGhleSBhcmUgZXhwZWN0ZWQgdG8gcmVtYWluXFxuKyAqIHVudG91Y2hlZCB1bnRpbCB0aGUgdHJlZSBpcyBmdWxseSBwYXJzZWQuIFNvIHRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnNcXG4rICogdGhlbSB0byBiZSBcXFwicHJlc2VydmVkIG1lbW9yeVxcXCIgYW5kIG1hcmtzIHRoZWlyIGJsb2NrcyBhcyBidXN5LlxcbisgKlxcbisgKiBOT1RFOiBlZmlfaW5pdCgpOjpyZXNlcnZlX3JlZ2lvbnMoKSByZW1vdmVzIGFsbCByZWdpb25zIGV4Y2VwdFxcbisgKiBNRU1CTE9DS19LSE9fU0NSQVRDSC4gVGhpcyBmdW5jdGlvbiBhZGRzIHN1Y2ggcmVnaW9ucyBidXQgdGhleSBhcmUgbm90IEtIT1xcbisgKiBzY3JhdGNoIG1lbW9yeSwgc28gdGhleSBzaG91bGQgbm90IGJlIHJlbW92ZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyBiZVxcbisgKiBjYWxsZWQgYWZ0ZXIgcmVzZXJ2ZV9yZWdpb25zKCkuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBfX2luaXQga2hvX2V4dGVuZF9zY3JhdGNoKHZvaWQpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGtob19jYiA9IHtcXG4rXFx0XFx0LmxlYWYgPSBraG9fZXh0X3dhbGtfbGVhZixcXG4rXFx0XFx0Lm5vZGUgPSBraG9fZXh0X3dhbGtfbm9kZSxcXG4rXFx0fTtcXG4rXFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGV4dF9jYiA9IHtcXG4rXFx0XFx0LmxlYWYgPSBraG9fZXh0X21hcmtfc2NyYXRjaCxcXG4rXFx0fTtcXG4rXFx0c3RydWN0IGtob19yYWRpeF90cmVlIHJhZGl4O1xcbitcXHRwaHlzX2FkZHJfdCBwcmV2X2VuZCA9IDA7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXG4rXFx0ZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZShcXHUwMDI2cmFkaXgsIE5VTEwpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRnb3RvIHByaW50O1xcbitcXG4rXFx0LyogV2FsayB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gZmluZCBidXN5IGJsb2Nrcy4gKi9cXG4rXFx0ZXJyID0ga2hvX3JhZGl4X3dhbGtfdHJlZShcXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIFxcdTAwMjZraG9fY2IsIFxcdTAwMjZyYWRpeCk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LyogV2FsayB0aGUgYmxvY2tzIGFuZCBtYXJrIGV2ZXJ5dGhpbmcgYmV0d2VlbiBrZXlzIGFzIHNjcmF0Y2guICovXFxuK1xcdGVyciA9IGtob19yYWRpeF93YWxrX3RyZWUoXFx1MDAyNnJhZGl4LCBcXHUwMDI2ZXh0X2NiLCBcXHUwMDI2cHJldl9lbmQpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdC8qIE1hcmsgZXZlcnl0aGluZyBmcm9tIGxhc3QgYnVzeSBibG9jayB0byBlbmQgb2YgRFJBTS4gKi9cXG4rXFx0aWYgKHByZXZfZW5kIFxcdTAwM2MgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSlcXG4rXFx0XFx0ZXJyID0gbWVtYmxvY2tfbWFya19raG9fc2NyYXRjaChwcmV2X2VuZCwgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSAtIHByZXZfZW5kKTtcXG4rXFxuK1xcdC8qIGZhbGx0aHJvdWdoICovXFxuK291dDpcXG4rXFx0a2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShcXHUwMDI2cmFkaXgpO1xcbitwcmludDpcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gZXh0ZW5kIHNjcmF0Y2g6ICVwZVxcXFxuXFxcIiwgRVJSX1BUUihlcnIpKTtcXG4rfVxcbitcXG4gLyoqXFxuICAqIGtob19hZGRfc3VidHJlZSAtIHJlY29yZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIHN1YiBibG9iIGluIEtITyByb290IHRyZWUuXFxuICAqIEBuYW1lOiBuYW1lIG9mIHRoZSBzdWIgdHJlZS5cXG5AQCAtODU2LDEwICsxMTUyLDEyIEBAIGludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBmb2xpb19wZm4oZm9saW8pO1xcbiBcXHRjb25zdCB1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcbi1cXHRpZiAoV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULCBQQUdFX1NJWkUgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpKSlcXG4rXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULCBQQUdFX1NJWkUgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbi1cXHRyZXR1cm4ga2hvX3JhZGl4X2FkZF9wYWdlKHRyZWUsIHBmbiwgb3JkZXIpO1xcbitcXHRyZXR1cm4ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwga2hvX2VuY29kZV9yYWRpeF9rZXkoUEZOX1BIWVMocGZuKSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIG9yZGVyKSk7XFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3ByZXNlcnZlX2ZvbGlvKTtcXG4gXFxuQEAgLTg3Nyw3ICsxMTc1LDcgQEAgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IGZvbGlvX3Bmbihmb2xpbyk7XFxuIFxcdGNvbnN0IHVuc2lnbmVkIGludCBvcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFxuLVxcdGtob19yYWRpeF9kZWxfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTtcXG4rXFx0a2hvX3JhZGl4X2RlbF9rZXkodHJlZSwga2hvX2VuY29kZV9yYWRpeF9rZXkoUEZOX1BIWVMocGZuKSwgb3JkZXIpKTtcXG4gfVxcbiBFWFBPUlRfU1lNQk9MX0dQTChraG9fdW5wcmVzZXJ2ZV9mb2xpbyk7XFxuIFxcbkBAIC05MDYsNyArMTIwNCw4IEBAIHN0YXRpYyB2b2lkIF9fa2hvX3VucHJlc2VydmUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbiBcXHR3aGlsZSAocGZuIFxcdTAwM2MgZW5kX3Bmbikge1xcbiBcXHRcXHRvcmRlciA9IF9fa2hvX3ByZXNlcnZlX3BhZ2VzX29yZGVyKHBmbiwgZW5kX3Bmbik7XFxuIFxcbi1cXHRcXHRraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XFxuK1xcdFxcdGtob19yYWRpeF9kZWxfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgb3JkZXIpKTtcXG4gXFxuIFxcdFxcdHBmbiArPSAxIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbiBcXHR9XFxuQEAgLTkzMSw3ICsxMjMwLDggQEAgaW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4gXFx0dW5zaWduZWQgbG9uZyBmYWlsZWRfcGZuID0gMDtcXG4gXFx0aW50IGVyciA9IDA7XFxuIFxcbi1cXHRpZiAoV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZULFxcbitcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAoc3RhcnRfcGZuIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQsXFxuIFxcdFxcdFxcdFxcdFxcdG5yX3BhZ2VzIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpKSkge1xcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0fVxcbkBAIC05MzksNyArMTIzOSw4IEBAIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuIFxcdHdoaWxlIChwZm4gXFx1MDAzYyBlbmRfcGZuKSB7XFxuIFxcdFxcdHVuc2lnbmVkIGludCBvcmRlciA9IF9fa2hvX3ByZXNlcnZlX3BhZ2VzX29yZGVyKHBmbiwgZW5kX3Bmbik7XFxuIFxcbi1cXHRcXHRlcnIgPSBraG9fcmFkaXhfYWRkX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XFxuK1xcdFxcdGVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIG9yZGVyKSk7XFxuIFxcdFxcdGlmIChlcnIpIHtcXG4gXFx0XFx0XFx0ZmFpbGVkX3BmbiA9IHBmbjtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuQEAgLTEzMTUsMjIgKzE2MTYsNiBAQCB2b2lkIGtob19yZXN0b3JlX2ZyZWUodm9pZCAqbWVtKVxcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yZXN0b3JlX2ZyZWUpO1xcbiBcXG4tc3RydWN0IGtob19pbiB7XFxuLVxcdHBoeXNfYWRkcl90IGZkdF9waHlzO1xcbi1cXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXM7XFxuLVxcdGNoYXIgcHJldmlvdXNfcmVsZWFzZVtfX05FV19VVFNfTEVOICsgMV07XFxuLVxcdHUzMiBrZXhlY19jb3VudDtcXG4tXFx0c3RydWN0IGtob19kZWJ1Z2ZzIGRiZztcXG4tfTtcXG4tXFxuLXN0YXRpYyBzdHJ1Y3Qga2hvX2luIGtob19pbiA9IHtcXG4tfTtcXG4tXFxuLXN0YXRpYyBjb25zdCB2b2lkICpraG9fZ2V0X2ZkdCh2b2lkKVxcbi17XFxuLVxcdHJldHVybiBraG9faW4uZmR0X3BoeXMgPyBwaHlzX3RvX3ZpcnQoa2hvX2luLmZkdF9waHlzKSA6IE5VTEw7XFxuLX1cXG4tXFxuIC8qKlxcbiAgKiBpc19raG9fYm9vdCAtIGNoZWNrIGlmIGN1cnJlbnQga2VybmVsIHdhcyBib290ZWQgdmlhIEtITy1lbmFibGVkXFxuICAqIGtleGVjXFxuQEAgLTEzOTgsMjYgKzE2ODMsMjQgQEAgaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpXFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JldHJpZXZlX3N1YnRyZWUpO1xcbiBcXG4tc3RhdGljIGludCBfX2luaXQga2hvX21lbV9yZXRyaWV2ZShjb25zdCB2b2lkICpmZHQpXFxuK3N0YXRpYyB2b2lkIF9faW5pdCBraG9fbWVtX3JldHJpZXZlKHZvaWQpXFxuIHtcXG4tXFx0c3RydWN0IGtob19yYWRpeF90cmVlIHRyZWU7XFxuLVxcdGNvbnN0IHBoeXNfYWRkcl90ICptZW07XFxuLVxcdGludCBsZW47XFxuK1xcdGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiBjYiA9IHtcXG4rXFx0XFx0LmxlYWYgPSBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlLFxcbitcXHR9O1xcbiBcXG4tXFx0LyogUmV0cmlldmUgdGhlIEtITyByYWRpeCB0cmVlIGZyb20gcGFzc2VkLWluIEZEVC4gKi9cXG4tXFx0bWVtID0gZmR0X2dldHByb3AoZmR0LCAwLCBLSE9fRkRUX01FTU9SWV9NQVBfUFJPUF9OQU1FLCBcXHUwMDI2bGVuKTtcXG4rXFx0aWYgKGtob19yYWRpeF93YWxrX3RyZWUoXFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBcXHUwMDI2Y2IsIE5VTEwpKVxcbitcXHRcXHRnb3RvIGVycjtcXG4gXFxuLVxcdGlmICghbWVtIHx8IGxlbiAhPSBzaXplb2YoKm1lbSkpIHtcXG4tXFx0XFx0cHJfZXJyKFxcXCJmYWlsZWQgdG8gZ2V0IHByZXNlcnZlZCBLSE8gbWVtb3J5IHRyZWVcXFxcblxcXCIpO1xcbi1cXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4tXFx0fVxcbi1cXG4tXFx0aWYgKCEqbWVtKVxcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0cmV0dXJuO1xcbiBcXG4tXFx0dHJlZS5yb290ID0gcGh5c190b192aXJ0KCptZW0pO1xcbi1cXHRtdXRleF9pbml0KFxcdTAwMjZ0cmVlLmxvY2spO1xcbi1cXHRyZXR1cm4ga2hvX3JhZGl4X3dhbGtfdHJlZShcXHUwMDI2dHJlZSwga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSk7XFxuK2VycjpcXG4rXFx0LypcXG4rXFx0ICogRmFpbGVkIHRvIGluaXRpYWxpemUgcHJlc2VydmVkIG1lbW9yeS4gQ2xlYXIgRkRUIGFuZCByYWRpeCBzbyBLSE9cXG4rXFx0ICogdXNlcnMgZG9uJ3QgdHJlYXQgaXQgYXMgYSBLSE8gYm9vdC5cXG4rXFx0ICovXFxuK1xcdGtob19pbi5mZHRfcGh5cyA9IDA7XFxuK1xcdGtob19pbi5yYWRpeF90cmVlLnJvb3QgPSBOVUxMO1xcbiB9XFxuIFxcbiBzdGF0aWMgX19pbml0IGludCBraG9fb3V0X2ZkdF9zZXR1cCh2b2lkKVxcbkBAIC0xNTQzLDE2ICsxODI2LDE0IEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXFxuIFxcdGlmICgha2hvX2VuYWJsZSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcbi1cXHR0cmVlLVxcdTAwM2Vyb290ID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpO1xcbi1cXHRpZiAoIXRyZWUtXFx1MDAzZXJvb3QpIHtcXG4tXFx0XFx0ZXJyID0gLUVOT01FTTtcXG4rXFx0ZXJyID0ga2hvX3JhZGl4X2luaXRfdHJlZSh0cmVlLCBOVUxMKTtcXG4rXFx0aWYgKGVycilcXG4gXFx0XFx0Z290byBlcnJfZnJlZV9zY3JhdGNoO1xcbi1cXHR9XFxuIFxcbiBcXHRraG9fb3V0LmZkdCA9IGtob19hbGxvY19wcmVzZXJ2ZShQQUdFX1NJWkUpO1xcbiBcXHRpZiAoSVNfRVJSKGtob19vdXQuZmR0KSkge1xcbiBcXHRcXHRlcnIgPSBQVFJfRVJSKGtob19vdXQuZmR0KTtcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9raG9fcmFkaXhfdHJlZV9yb290O1xcbitcXHRcXHRnb3RvIGVycl9mcmVlX2tob19yYWRpeF90cmVlO1xcbiBcXHR9XFxuIFxcbiBcXHRlcnIgPSBraG9fZGVidWdmc19pbml0KCk7XFxuQEAgLTE2MDMsOSArMTg4NCw4IEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXFxuIFxcbiBlcnJfZnJlZV9mZHQ6XFxuIFxcdGtob191bnByZXNlcnZlX2ZyZWUoa2hvX291dC5mZHQpO1xcbi1lcnJfZnJlZV9raG9fcmFkaXhfdHJlZV9yb290Olxcbi1cXHRrZnJlZSh0cmVlLVxcdTAwM2Vyb290KTtcXG4tXFx0dHJlZS1cXHUwMDNlcm9vdCA9IE5VTEw7XFxuK2Vycl9mcmVlX2tob19yYWRpeF90cmVlOlxcbitcXHRraG9fcmFkaXhfZGVzdHJveV90cmVlKHRyZWUpO1xcbiBlcnJfZnJlZV9zY3JhdGNoOlxcbiBcXHRraG9fb3V0LmZkdCA9IE5VTEw7XFxuIFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpKyspIHtcXG5AQCAtMTYxOSwxNiArMTg5OSw0MyBAQCBzdGF0aWMgX19pbml0IGludCBraG9faW5pdCh2b2lkKVxcbiB9XFxuIGZzX2luaXRjYWxsKGtob19pbml0KTtcXG4gXFxuLXZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdCh2b2lkKVxcbit2b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZClcXG4ge1xcbi1cXHRpZiAoa2hvX2luLnNjcmF0Y2hfcGh5cykge1xcbi1cXHRcXHRraG9fc2NyYXRjaCA9IHBoeXNfdG9fdmlydChraG9faW4uc2NyYXRjaF9waHlzKTtcXG4rXFx0Y29uc3Qgdm9pZCAqZmR0ID0ga2hvX2dldF9mZHQoKTtcXG4gXFxuLVxcdFxcdGlmIChraG9fbWVtX3JldHJpZXZlKGtob19nZXRfZmR0KCkpKVxcbi1cXHRcXHRcXHRraG9faW4uZmR0X3BoeXMgPSAwO1xcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHRraG9fcmVzZXJ2ZV9zY3JhdGNoKCk7XFxuK1xcdGlmICghaXNfa2hvX2Jvb3QoKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LypcXG4rXFx0ICoga2hvX3NjcmF0Y2hfb3ZlcmxhcCgpIG5lZWRzIGtob19zY3JhdGNoIHRvIGJlIGluaXRpYWxpemVkLiBJdFxcbitcXHQgKiBpcyB1c2VkIGJ5IGZyZWVfYXJlYV9pbml0KCkgb24gS0hPIGJvb3RzLCBzbyBpbml0aWFsaXplIGl0XFxuK1xcdCAqIGVhcmx5LlxcbitcXHQgKi9cXG4rXFx0a2hvX3NjcmF0Y2ggPSBwaHlzX3RvX3ZpcnQoa2hvX2luLnNjcmF0Y2hfcGh5cyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBraG9fZ2V0X21lbV9tYXAoKSBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuIElmIGl0IGZhaWxzLCBraG9fcG9wdWxhdGUoKVxcbitcXHQgKiBjYXRjaGVzIHRoYXQgYW5kIG5ldmVyIHNldHMga2hvX2luLmZkdF9waHlzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGtob19yYWRpeF9pbml0X3RyZWUoXFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBraG9fZ2V0X21lbV9tYXAoZmR0KSkpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogRmFpbGVkIHRvIGluaXRpYWxpemUgcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiBDbGVhciBGRFRcXG4rXFx0XFx0ICogYW5kIHNjcmF0Y2ggc28gS0hPIHVzZXJzIGRvbid0IHRyZWF0IGl0IGFzIGEgS0hPIGJvb3QuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRraG9faW4uZmR0X3BoeXMgPSAwO1xcbitcXHRcXHRraG9faW4uc2NyYXRjaF9waHlzID0gMDtcXG4rXFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuK1xcbitcXHRraG9fZXh0ZW5kX3NjcmF0Y2goKTtcXG4rfVxcbitcXG4rdm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0KHZvaWQpXFxuK3tcXG4rXFx0aWYgKGtob19pbi5zY3JhdGNoX3BoeXMpXFxuK1xcdFxcdGtob19tZW1fcmV0cmlldmUoKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRraG9fcmVzZXJ2ZV9zY3JhdGNoKCk7XFxuIH1cXG4gXFxuIHZvaWQgX19pbml0IGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sXFxuQEAgLTE2MzYsOSArMTk0Myw4IEBAIHZvaWQgX19pbml0IGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IHNjcmF0Y2hfY250ID0gc2NyYXRjaF9sZW4gLyBzaXplb2YoKmtob19zY3JhdGNoKTtcXG4gXFx0c3RydWN0IGtob19zY3JhdGNoICpzY3JhdGNoID0gTlVMTDtcXG4tXFx0cGh5c19hZGRyX3QgbWVtX21hcF9waHlzO1xcbi1cXHR2b2lkICpmZHQgPSBOVUxMO1xcbiBcXHRib29sIHBvcHVsYXRlZCA9IGZhbHNlO1xcbitcXHR2b2lkICpmZHQgPSBOVUxMO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4gXFx0LyogVmFsaWRhdGUgdGhlIGlucHV0IEZEVCAqL1xcbkBAIC0xNjYwLDggKzE5NjYsMTMgQEAgdm9pZCBfX2luaXQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcXG4gXFx0XFx0Z290byB1bm1hcF9mZHQ7XFxuIFxcdH1cXG4gXFxuLVxcdG1lbV9tYXBfcGh5cyA9IGtob19nZXRfbWVtX21hcF9waHlzKGZkdCk7XFxuLVxcdGlmICghbWVtX21hcF9waHlzKVxcbitcXHQvKlxcbitcXHQgKiBBdCB0aGlzIHBvaW50IHBoeXNfdG9fdmlydCgpIGRvZXNuJ3Qgd29yayBwcm9wZXJseSBhbmQgc29cXG4rXFx0ICoga2hvX2dldF9tZW1fbWFwKCkgY2FuIHJldHVybiBhIHByZS1LQVNMUiB2aXJ0dWFsIGFkZHJlc3MuIEJ1dCBoZXJlIHdlXFxuK1xcdCAqIG9ubHkgd2FudCB0byBtYWtlIHN1cmUgdGhlIG1lbV9tYXAgaXMgdmFsaWQgc28gdGhlIGFjdHVhbCB2YWx1ZVxcbitcXHQgKiBkb2Vzbid0IG1hdHRlciBhcyBsb25nIGFzIGl0IGlzbid0IE5VTEwuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWtob19nZXRfbWVtX21hcChmZHQpKVxcbiBcXHRcXHRnb3RvIHVubWFwX2ZkdDtcXG4gXFxuIFxcdHNjcmF0Y2ggPSBlYXJseV9tZW1yZW1hcChzY3JhdGNoX3BoeXMsIHNjcmF0Y2hfbGVuKTtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfZGVidWcuYyBiL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2RlYnVnLmNcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCA2ZWZiNjk2ZjU0MjYxMi4uMDAwMDAwMDAwMDAwMDBcXG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDI1ICswLDAgQEBcXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbi0vKlxcbi0gKiBrZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIC0ga2V4ZWMgaGFuZG92ZXIgb3B0aW9uYWwgZGVidWcgZnVuY3Rpb25hbGl0eVxcbi0gKiBDb3B5cmlnaHQgKEMpIDIwMjUgR29vZ2xlIExMQywgUGFzaGEgVGF0YXNoaW4gXFx1MDAzY3Bhc2hhLnRhdGFzaGluQHNvbGVlbi5jb21cXHUwMDNlXFxuLSAqL1xcbi1cXG4tI2RlZmluZSBwcl9mbXQoZm10KSBcXFwiS0hPOiBcXFwiIGZtdFxcbi1cXG4tI2luY2x1ZGUgXFxcImtleGVjX2hhbmRvdmVyX2ludGVybmFsLmhcXFwiXFxuLVxcbi1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxuLXtcXG4tXFx0cGh5c19hZGRyX3Qgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQ7XFxuLVxcdHVuc2lnbmVkIGludCBpO1xcbi1cXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGtob19zY3JhdGNoX2NudDsgaSsrKSB7XFxuLVxcdFxcdHNjcmF0Y2hfc3RhcnQgPSBraG9fc2NyYXRjaFtpXS5hZGRyO1xcbi1cXHRcXHRzY3JhdGNoX2VuZCA9IGtob19zY3JhdGNoW2ldLmFkZHIgKyBraG9fc2NyYXRjaFtpXS5zaXplO1xcbi1cXG4tXFx0XFx0aWYgKHBoeXMgXFx1MDAzYyBzY3JhdGNoX2VuZCBcXHUwMDI2XFx1MDAyNiAocGh5cyArIHNpemUpIFxcdTAwM2Ugc2NyYXRjaF9zdGFydClcXG4tXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcdH1cXG4tXFxuLVxcdHJldHVybiBmYWxzZTtcXG4tfVxcbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaFxcbmluZGV4IDAzOTlmZjEwNzc3NTBiLi44MDVkMmE3NmMzODgxOCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXFxuKysrIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfaW50ZXJuYWwuaFxcbkBAIC00MSwxMyArNDEsNCBAQCBzdGF0aWMgaW5saW5lIHZvaWQga2hvX2RlYnVnZnNfYmxvYl9yZW1vdmUoc3RydWN0IGtob19kZWJ1Z2ZzICpkYmcsXFxuIFxcdFxcdFxcdFxcdFxcdCAgIHZvaWQgKmJsb2IpIHsgfVxcbiAjZW5kaWYgLyogQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHRlMgKi9cXG4gXFxuLSNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUdcXG4tYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcXG4tI2Vsc2VcXG4tc3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxuLXtcXG4tXFx0cmV0dXJuIGZhbHNlO1xcbi19XFxuLSNlbmRpZiAvKiBDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcgKi9cXG4tXFxuICNlbmRpZiAvKiBMSU5VWF9LRVhFQ19IQU5ET1ZFUl9JTlRFUk5BTF9IICovXFxuZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuY1xcbmluZGV4IDU3MTIxMmI4MDgzNWVjLi5hYjRhZmM4MThlOGNiZCAxMDA2NDRcXG4tLS0gYS9tbS9odWdldGxiLmNcXG4rKysgYi9tbS9odWdldGxiLmNcXG5AQCAtMzAzMywyOSArMzAzMywyMSBAQCBzdGF0aWMgX19pbml0IHZvaWQgKmFsbG9jX2Jvb3RtZW0oc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZCwgYm9vbCBub2RlX2V4YWN0KVxcbiBcXHRpZiAoaHVnZXRsYl9lYXJseV9jbWEoaCkpXFxuIFxcdFxcdG0gPSBodWdldGxiX2NtYV9hbGxvY19ib290bWVtKGgsIFxcdTAwMjZsaXN0bm9kZSwgbm9kZV9leGFjdCk7XFxuIFxcdGVsc2Uge1xcbi1cXHRcXHRpZiAobm9kZV9leGFjdClcXG4tXFx0XFx0XFx0bSA9IG1lbWJsb2NrX2FsbG9jX2V4YWN0X25pZF9yYXcoaHVnZV9wYWdlX3NpemUoaCksXFxuLVxcdFxcdFxcdFxcdGh1Z2VfcGFnZV9zaXplKGgpLCAwLFxcbi1cXHRcXHRcXHRcXHRNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFLCBuaWQpO1xcbi1cXHRcXHRlbHNlIHtcXG4tXFx0XFx0XFx0bSA9IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KGh1Z2VfcGFnZV9zaXplKGgpLFxcbi1cXHRcXHRcXHRcXHRodWdlX3BhZ2Vfc2l6ZShoKSwgMCxcXG4tXFx0XFx0XFx0XFx0TUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRSwgbmlkKTtcXG4rXFx0XFx0bSA9IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIoaHVnZV9wYWdlX3NpemUoaCksIG5pZCwgbm9kZV9leGFjdCk7XFxuK1xcdFxcdGlmIChtKSB7XFxuK1xcdFxcdFxcdG0tXFx1MDAzZWZsYWdzID0gMDtcXG4rXFx0XFx0XFx0bS1cXHUwMDNlY21hID0gTlVMTDtcXG4rXFxuIFxcdFxcdFxcdC8qXFxuIFxcdFxcdFxcdCAqIEZvciBwcmUtSFZPIHRvIHdvcmsgY29ycmVjdGx5LCBwYWdlcyBuZWVkIHRvIGJlIG9uXFxuIFxcdFxcdFxcdCAqIHRoZSBsaXN0IGZvciB0aGUgbm9kZSB0aGV5IHdlcmUgYWN0dWFsbHkgYWxsb2NhdGVkXFxuIFxcdFxcdFxcdCAqIGZyb20uIFRoYXQgbm9kZSBtYXkgYmUgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mXFxuLVxcdFxcdFxcdCAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3LiBTbyxcXG4rXFx0XFx0XFx0ICogZmFsbGJhY2sgYnkgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYl9ib290bWVtLiBTbyxcXG4gXFx0XFx0XFx0ICogZXh0cmFjdCB0aGUgYWN0dWFsIG5vZGUgZmlyc3QuXFxuIFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAobSlcXG4rXFx0XFx0XFx0aWYgKCFub2RlX2V4YWN0KVxcbiBcXHRcXHRcXHRcXHRsaXN0bm9kZSA9IGVhcmx5X3Bmbl90b19uaWQoUEhZU19QRk4oX19wYShtKSkpO1xcbiBcXHRcXHR9XFxuLVxcbi1cXHRcXHRpZiAobSkge1xcbi1cXHRcXHRcXHRtLVxcdTAwM2VmbGFncyA9IDA7XFxuLVxcdFxcdFxcdG0tXFx1MDAzZWNtYSA9IE5VTEw7XFxuLVxcdFxcdH1cXG4gXFx0fVxcbiBcXG4gXFx0aWYgKG0pIHtcXG5kaWZmIC0tZ2l0IGEvbW0vbWVtYmxvY2suYyBiL21tL21lbWJsb2NrLmNcXG5pbmRleCA2MzQ5YzQ4MTU0ZjRiMS4uYzEwZGZiMDU0ODA2YTcgMTAwNjQ0XFxuLS0tIGEvbW0vbWVtYmxvY2suY1xcbisrKyBiL21tL21lbWJsb2NrLmNcXG5AQCAtMTUwNiw2ICsxNTA2LDMyIEBAIGludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfc2V0X25vZGUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSxcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuK3N0YXRpYyB2b2lkIG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3Qgc2l6ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICBib29sIGxlYWt0cmFjZSlcXG4re1xcbitcXHQvKlxcbitcXHQgKiBTa2lwIGttZW1sZWFrIGZvciB0aG9zZSBwbGFjZXMgbGlrZSBrYXNhbl9pbml0KCkgYW5kXFxuK1xcdCAqIGVhcmx5X3BndGFibGVfYWxsb2MoKSBkdWUgdG8gaGlnaCB2b2x1bWUuXFxuK1xcdCAqL1xcbitcXHRpZiAobGVha3RyYWNlKVxcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBNZW1ibG9jayBhbGxvY2F0ZWQgYmxvY2tzIGFyZSBuZXZlciByZXBvcnRlZCBhc1xcbitcXHRcXHQgKiBsZWFrcy4gVGhpcyBpcyBiZWNhdXNlIG1hbnkgb2YgdGhlc2UgYmxvY2tzIGFyZVxcbitcXHRcXHQgKiBvbmx5IHJlZmVycmVkIHZpYSB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGljaCBpc1xcbitcXHRcXHQgKiBub3QgbG9va2VkIHVwIGJ5IGttZW1sZWFrLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0a21lbWxlYWtfYWxsb2NfcGh5cyhzdGFydCwgc2l6ZSwgMCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBTb21lIFZpcnR1YWwgTWFjaGluZSBwbGF0Zm9ybXMsIHN1Y2ggYXMgSW50ZWwgVERYIG9yIEFNRCBTRVYtU05QLFxcbitcXHQgKiByZXF1aXJlIG1lbW9yeSB0byBiZSBhY2NlcHRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYnkgdGhlXFxuK1xcdCAqIGd1ZXN0LlxcbitcXHQgKlxcbitcXHQgKiBBY2NlcHQgdGhlIG1lbW9yeSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci5cXG4rXFx0ICovXFxuK1xcdGFjY2VwdF9tZW1vcnkoc3RhcnQsIHNpemUpO1xcbit9XFxuK1xcbiAvKipcXG4gICogbWVtYmxvY2tfYWxsb2NfcmFuZ2VfbmlkIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgYmxvY2tcXG4gICogQHNpemU6IHNpemUgb2YgbWVtb3J5IGJsb2NrIHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xcbkBAIC0xNTgwLDI4ICsxNjA2LDcgQEAgcGh5c19hZGRyX3QgX19pbml0IG1lbWJsb2NrX2FsbG9jX3JhbmdlX25pZChwaHlzX2FkZHJfdCBzaXplLFxcbiBcXHRyZXR1cm4gMDtcXG4gXFxuIGRvbmU6XFxuLVxcdC8qXFxuLVxcdCAqIFNraXAga21lbWxlYWsgZm9yIHRob3NlIHBsYWNlcyBsaWtlIGthc2FuX2luaXQoKSBhbmRcXG4tXFx0ICogZWFybHlfcGd0YWJsZV9hbGxvYygpIGR1ZSB0byBoaWdoIHZvbHVtZS5cXG4tXFx0ICovXFxuLVxcdGlmIChlbmQgIT0gTUVNQkxPQ0tfQUxMT0NfTk9MRUFLVFJBQ0UpXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIE1lbWJsb2NrIGFsbG9jYXRlZCBibG9ja3MgYXJlIG5ldmVyIHJlcG9ydGVkIGFzXFxuLVxcdFxcdCAqIGxlYWtzLiBUaGlzIGlzIGJlY2F1c2UgbWFueSBvZiB0aGVzZSBibG9ja3MgYXJlXFxuLVxcdFxcdCAqIG9ubHkgcmVmZXJyZWQgdmlhIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoaWNoIGlzXFxuLVxcdFxcdCAqIG5vdCBsb29rZWQgdXAgYnkga21lbWxlYWsuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRrbWVtbGVha19hbGxvY19waHlzKGZvdW5kLCBzaXplLCAwKTtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFNvbWUgVmlydHVhbCBNYWNoaW5lIHBsYXRmb3Jtcywgc3VjaCBhcyBJbnRlbCBURFggb3IgQU1EIFNFVi1TTlAsXFxuLVxcdCAqIHJlcXVpcmUgbWVtb3J5IHRvIGJlIGFjY2VwdGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBieSB0aGVcXG4tXFx0ICogZ3Vlc3QuXFxuLVxcdCAqXFxuLVxcdCAqIEFjY2VwdCB0aGUgbWVtb3J5IG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLlxcbi1cXHQgKi9cXG4tXFx0YWNjZXB0X21lbW9yeShmb3VuZCwgc2l6ZSk7XFxuLVxcbitcXHRtZW1ibG9ja19wcmVwX2FsbG9jYXRpb24oZm91bmQsIHNpemUsIGVuZCAhPSBNRU1CTE9DS19BTExPQ19OT0xFQUtUUkFDRSk7XFxuIFxcdHJldHVybiBmb3VuZDtcXG4gfVxcbiBcXG5AQCAtMTc1Niw2ICsxNzYxLDY5IEBAIHZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoXFxuIFxcdFxcdFxcdFxcdCAgICAgICBmYWxzZSk7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBtZW1ibG9ja19hbGxvY19odWdldGxiIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgZm9yIEh1Z2VUTEIgcGFnZXNcXG4rICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xcbisgKiBAbmlkOiAgICAgICBuaWQgb2YgdGhlIGZyZWUgbWVtb3J5IHRvIGZpbmQsICVOVU1BX05PX05PREUgZm9yIGFueSBub2RlXFxuKyAqIEBleGFjdF9uaWQ6IG9ubHkgYWxsb2NhdGUgZnJvbSB0aGUgc3BlY2lmaWVkIG5pZC4gSWYgJWZhbHNlLCB0aGUgc3BlY2lmaWVkXFxuKyAqICAgICAgICAgICAgIG5pZCBpcyB0cmllZCBmaXJzdCwgYW5kIHRoZW4gYWxsIG5vZGVzIGFyZSB0cmllZCBhcyBmYWxsYmFjay5cXG4rICpcXG4rICogSHVnZVRMQiBwYWdlcyBhcmUgYWx3YXlzIGFsaWduZWQgYnkgdGhlaXIgc2l6ZSwgc28gdGhlIGFsaWdubWVudCBtYXRjaGVzXFxuKyAqIEBzaXplLiBTaW5jZSB0aGUgbWVtb3J5IGlzIGZvciB1c2Vyc3BhY2UsIG1pcnJvcmVkIG1lbW9yeSBpcyBub3QgdXNlZC4gVGhlXFxuKyAqIG1lbW9yeSBpcyBub3QgemVyb2VkLiBEb2VzIG5vdCBwYW5pYyBpZiByZXF1ZXN0IGNhbm5vdCBiZSBzYXRpc2ZpZWQuXFxuKyAqXFxuKyAqIFJldHVybjpcXG4rICogVmlydHVhbCBhZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb24gc3VjY2VzcywgJU5VTEwgb24gZmFpbHVyZS5cXG4rICovXFxuK3ZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYihwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkLCBib29sIGV4YWN0X25pZClcXG4re1xcbitcXHRlbnVtIG1lbWJsb2NrX2ZsYWdzIGZsYWdzID0gY2hvb3NlX21lbWJsb2NrX2ZsYWdzKCk7XFxuK1xcdHBoeXNfYWRkcl90IGFkZHIsIHN0YXJ0ID0gMCwgZW5kID0gTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRTtcXG4rXFxuK1xcdG1lbWJsb2NrX2RiZyhcXFwiJXM6ICVsbHUgYnl0ZXMsIG5pZD0lZCwgZXhhY3RfbmlkPSVkICVwU1xcXFxuXFxcIiwgX19mdW5jX18sXFxuK1xcdFxcdCAgICAgKHU2NClzaXplLCBuaWQsIGV4YWN0X25pZCwgKHZvaWQgKilfUkVUX0lQXyk7XFxuK1xcbitcXHQvKiBEb24ndCB3YXN0ZSBtaXJyb3JlZCBtZW1vcnkgb24gSHVnZVRMQiBwYWdlcy4gKi9cXG4rXFx0ZmxhZ3MgXFx1MDAyNj0gfk1FTUJMT0NLX01JUlJPUjtcXG4rcmV0cnk6XFxuK1xcdC8qIEh1Z2VUTEIgcGFnZXMgYXJlIGFsd2F5cyBhbGlnbmVkIGJ5IHRoZWlyIHNpemUuICovXFxuK1xcdGFkZHIgPSBtZW1ibG9ja19maW5kX2luX3JhbmdlX25vZGUoc2l6ZSwgc2l6ZSwgc3RhcnQsIGVuZCwgbmlkLCBmbGFncyk7XFxuK1xcdGlmIChhZGRyKVxcbitcXHRcXHRnb3RvIGZvdW5kO1xcbitcXG4rXFx0LyogVHJ5IGFsbCBub2RlcyBpZiBhbGxvd2VkLiAqL1xcbitcXHRpZiAobnVtYV92YWxpZF9ub2RlKG5pZCkgXFx1MDAyNlxcdTAwMjYgIWV4YWN0X25pZCkge1xcbitcXHRcXHRuaWQgPSBOVU1BX05PX05PREU7XFxuK1xcdFxcdGdvdG8gcmV0cnk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEZvdW5kIG5vdGhpbmcuLi4gOi0oICovXFxuK1xcdHJldHVybiBOVUxMO1xcbitcXG4rZm91bmQ6XFxuK1xcdC8qXFxuK1xcdCAqIEh1Z2VUTEIgcGFnZXMgY2FuIGJlIHByZXNlcnZlZCB3aXRoIEtITyBhbmQgbm8gcHJlc2VydmVkIG1lbW9yeSBjYW5cXG4rXFx0ICogYmUgaW4gc2NyYXRjaC4gU28gcmV0cnkgaWYgZm91bmQgYWRkcmVzcyBvdmVybGFwcyB3aXRoIHNjcmF0Y2guXFxuK1xcdCAqXFxuK1xcdCAqIFNjcmF0Y2ggYXJlYXMgYXJlIG5vcm1hbGx5IG5vdCB2ZXJ5IGxhcmdlLCBzbyB0aGlzIHNob3VsZG4ndCB0YWtlIHRvb1xcbitcXHQgKiBtYW55IHJldHJpZXMuXFxuK1xcdCAqL1xcbitcXHRpZiAoa2hvX3NjcmF0Y2hfb3ZlcmxhcChhZGRyLCBzaXplKSkge1xcbitcXHRcXHRpZiAobWVtYmxvY2tfYm90dG9tX3VwKCkpXFxuK1xcdFxcdFxcdHN0YXJ0ID0gYWRkciArIHNpemU7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0c3RhcnQgPSBhZGRyIC0gc2l6ZTtcXG4rXFxuK1xcdFxcdGdvdG8gcmV0cnk7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChfX21lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSwgbmlkLCBNRU1CTE9DS19SU1JWX0tFUk4gfCBNRU1CTE9DS19SU1JWX0hVR0VUTEIpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihhZGRyLCBzaXplLCB0cnVlKTtcXG4rXFx0cmV0dXJuIHBoeXNfdG9fdmlydChhZGRyKTtcXG4rfVxcbitcXG4gLyoqXFxuICAqIG1lbWJsb2NrX2FsbG9jX3RyeV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9ja1xcbiAgKiBAc2l6ZTogc2l6ZSBvZiBtZW1vcnkgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzXFxuQEAgLTE4MjUsNiArMTg5MywyOCBAQCBwaHlzX2FkZHJfdCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfcmVzZXJ2ZWRfc2l6ZSh2b2lkKVxcbiBcXHRyZXR1cm4gbWVtYmxvY2sucmVzZXJ2ZWQudG90YWxfc2l6ZTtcXG4gfVxcbiBcXG4rcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcXG4re1xcbitcXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xcbitcXHRwaHlzX2FkZHJfdCB0b3RhbCA9IDA7XFxuK1xcbitcXHRmb3JfZWFjaF9yZXNlcnZlZF9tZW1fcmVnaW9uKHIpIHtcXG4rXFx0XFx0cGh5c19hZGRyX3Qgc2l6ZSA9IHItXFx1MDAzZXNpemU7XFxuK1xcbitcXHRcXHRpZiAoci1cXHUwMDNlYmFzZSBcXHUwMDNlIGxpbWl0KVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdGlmIChyLVxcdTAwM2ViYXNlICsgci1cXHUwMDNlc2l6ZSBcXHUwMDNlIGxpbWl0KVxcbitcXHRcXHRcXHRzaXplID0gbGltaXQgLSByLVxcdTAwM2ViYXNlO1xcbitcXG4rXFx0XFx0aWYgKG5pZCA9PSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocikgfHwgIW51bWFfdmFsaWRfbm9kZShuaWQpKVxcbitcXHRcXHRcXHRpZiAoci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNRU1CTE9DS19SU1JWX0hVR0VUTEIpXFxuK1xcdFxcdFxcdFxcdHRvdGFsICs9IHNpemU7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiB0b3RhbDtcXG4rfVxcbitcXG4gcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcXG4ge1xcbiBcXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xcbkBAIC0yNTExLDE2ICsyNjAxLDYgQEAgX19pbml0IHZvaWQgbWVtYmxvY2tfY2xlYXJfa2hvX3NjcmF0Y2hfb25seSh2b2lkKVxcbiB7XFxuIFxcdGtob19zY3JhdGNoX29ubHkgPSBmYWxzZTtcXG4gfVxcbi1cXG4tYm9vbCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpXFxuLXtcXG4tXFx0aW50IGkgPSBtZW1ibG9ja19zZWFyY2goXFx1MDAyNm1lbWJsb2NrLm1lbW9yeSwgYWRkcik7XFxuLVxcbi1cXHRpZiAoaSA9PSAtMSlcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXG4tXFx0cmV0dXJuIG1lbWJsb2NrX2lzX2tob19zY3JhdGNoKFxcdTAwMjZtZW1ibG9jay5tZW1vcnkucmVnaW9uc1tpXSk7XFxuLX1cXG4gI2VuZGlmXFxuIFxcbiAjaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSXFxuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuY1xcbmluZGV4IDBmNjQ5MDllOGQyMGUyLi4xZDJmMzAyZDhjZDljMSAxMDA2NDRcXG4tLS0gYS9tbS9tbV9pbml0LmNcXG4rKysgYi9tbS9tbV9pbml0LmNcXG5AQCAtNzA3LDkgKzcwNywxMCBAQCB2b2lkIF9fbWVtaW5pdCBfX2luaXRfcGFnZV9mcm9tX25pZCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcXG4gXFx0X19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBmbiwgemlkLCBuaWQpO1xcbiBcXG4gXFx0aWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpIHtcXG4tXFx0XFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XFxuLVxcdFxcdFxcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgTUlHUkFURV9NT1ZBQkxFKTtcXG4tXFx0XFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgbXQsIGZhbHNlKTtcXG4rXFx0XFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgTUlHUkFURV9NT1ZBQkxFLFxcbitcXHRcXHRcXHRcXHRcXHQgICBmYWxzZSk7XFxuK1xcdFxcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXFxuK1xcdFxcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBwZm4gKyAxKTtcXG4gXFx0fVxcbiB9XFxuIFxcbkBAIC05MzgsMTMgKzkzOSwyMiBAQCB2b2lkIF9fbWVtaW5pdCBtZW1tYXBfaW5pdF9yYW5nZSh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZVxcbiBcXHRcXHR9XFxuIFxcdFxcdHBmbisrO1xcbiBcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBmb3IgYW55IHBhZ2VibG9ja3MgdGhhdCBmYWxsIGluIGEgS0hPIHNjcmF0Y2hcXG4rXFx0ICogYXJlYS4gRG8gdGhpcyBoZXJlIG91dHNpZGUgdGhlIGxvb3AgYmVjYXVzZSBtb3N0IHBhZ2VibG9ja3Mgd2lsbCBub3RcXG4rXFx0ICogYmUgS0hPIHNjcmF0Y2gsIHNvIG9ubHkgc2VhcmNoIG9uY2UuXFxuK1xcdCAqXFxuK1xcdCAqIE9ubHkgcGFnZWJsb2NrcyB1cCB0byBwZm4gYXJlIHVwZGF0ZWQsIGRlZmVycmVkIHBhZ2VibG9ja3Mgd2lsbCBiZVxcbitcXHQgKiB1cGRhdGVkIGxhdGVyLlxcbitcXHQgKi9cXG4rXFx0a2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZShzdGFydF9wZm4sIHBmbik7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdF96b25lX3JhbmdlKHN0cnVjdCB6b25lICp6b25lLFxcbiBcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbiBcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcXG4tXFx0XFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nICpob2xlX3BmbixcXG4tXFx0XFx0XFx0XFx0XFx0ICBlbnVtIG1pZ3JhdGV0eXBlIG10KVxcbitcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgKmhvbGVfcGZuKVxcbiB7XFxuIFxcdHVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4gPSB6b25lLVxcdTAwM2V6b25lX3N0YXJ0X3BmbjtcXG4gXFx0dW5zaWduZWQgbG9uZyB6b25lX2VuZF9wZm4gPSB6b25lX3N0YXJ0X3BmbiArIHpvbmUtXFx1MDAzZXNwYW5uZWRfcGFnZXM7XFxuQEAgLTk1Nyw3ICs5NjcsOCBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSxcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4gXFx0bWVtbWFwX2luaXRfcmFuZ2UoZW5kX3BmbiAtIHN0YXJ0X3BmbiwgbmlkLCB6b25lX2lkLCBzdGFydF9wZm4sXFxuLVxcdFxcdFxcdCAgem9uZV9lbmRfcGZuLCBNRU1JTklUX0VBUkxZLCBOVUxMLCBtdCwgZmFsc2UpO1xcbitcXHRcXHRcXHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxcbitcXHRcXHRcXHQgIGZhbHNlKTtcXG4gXFxuIFxcdGlmICgqaG9sZV9wZm4gXFx1MDAzYyBzdGFydF9wZm4pXFxuIFxcdFxcdGluaXRfdW5hdmFpbGFibGVfcmFuZ2UoKmhvbGVfcGZuLCBzdGFydF9wZm4sIHpvbmVfaWQsIG5pZCk7XFxuQEAgLTk3Myw4ICs5ODQsNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXQodm9pZClcXG4gXFxuIFxcdGZvcl9lYWNoX21lbV9wZm5fcmFuZ2UoaSwgTUFYX05VTU5PREVTLCBcXHUwMDI2c3RhcnRfcGZuLCBcXHUwMDI2ZW5kX3BmbiwgXFx1MDAyNm5pZCkge1xcbiBcXHRcXHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGUgPSBOT0RFX0RBVEEobmlkKTtcXG4tXFx0XFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XFxuLVxcdFxcdFxcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgTUlHUkFURV9NT1ZBQkxFKTtcXG4gXFxuIFxcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBNQVhfTlJfWk9ORVM7IGorKykge1xcbiBcXHRcXHRcXHRzdHJ1Y3Qgem9uZSAqem9uZSA9IG5vZGUtXFx1MDAzZW5vZGVfem9uZXMgKyBqO1xcbkBAIC05ODMsNyArOTkyLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0KHZvaWQpXFxuIFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4gXFx0XFx0XFx0bWVtbWFwX2luaXRfem9uZV9yYW5nZSh6b25lLCBzdGFydF9wZm4sIGVuZF9wZm4sXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2aG9sZV9wZm4sIG10KTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZob2xlX3Bmbik7XFxuIFxcdFxcdFxcdHpvbmVfaWQgPSBqO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG5AQCAtMTk3Myw3ICsxOTgyLDcgQEAgdW5zaWduZWQgbG9uZyBfX2luaXQgbm9kZV9tYXBfcGZuX2FsaWdubWVudCh2b2lkKVxcbiBcXG4gI2lmZGVmIENPTkZJR19ERUZFUlJFRF9TVFJVQ1RfUEFHRV9JTklUXFxuIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxcbi1cXHRcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBlbnVtIG1pZ3JhdGV0eXBlIG10KVxcbitcXHRcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbiB7XFxuIFxcdHN0cnVjdCBwYWdlICpwYWdlO1xcbiBcXHR1bnNpZ25lZCBsb25nIGk7XFxuQEAgLTE5ODUsOCArMTk5NCw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxcbiBcXG4gXFx0LyogRnJlZSBhIGxhcmdlIG5hdHVyYWxseS1hbGlnbmVkIGNodW5rIGlmIHBvc3NpYmxlICovXFxuIFxcdGlmIChucl9wYWdlcyA9PSBNQVhfT1JERVJfTlJfUEFHRVMgXFx1MDAyNlxcdTAwMjYgSVNfTUFYX09SREVSX0FMSUdORUQocGZuKSkge1xcbi1cXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkgKz0gcGFnZWJsb2NrX25yX3BhZ2VzKVxcbi1cXHRcXHRcXHRpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlICsgaSwgbXQsIGZhbHNlKTtcXG4gXFx0XFx0X19mcmVlX3BhZ2VzX2NvcmUocGFnZSwgTUFYX1BBR0VfT1JERVIsIE1FTUlOSVRfRUFSTFkpO1xcbiBcXHRcXHRyZXR1cm47XFxuIFxcdH1cXG5AQCAtMTk5NCwxMSArMjAwMSw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBkZWZlcnJlZF9mcmVlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLFxcbiBcXHQvKiBBY2NlcHQgY2h1bmtzIHNtYWxsZXIgdGhhbiBNQVhfUEFHRV9PUkRFUiB1cGZyb250ICovXFxuIFxcdGFjY2VwdF9tZW1vcnkoUEZOX1BIWVMocGZuKSwgbnJfcGFnZXMgKiBQQUdFX1NJWkUpO1xcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyssIHBhZ2UrKywgcGZuKyspIHtcXG4tXFx0XFx0aWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpXFxuLVxcdFxcdFxcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIG10LCBmYWxzZSk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrLCBwYWdlKyssIHBmbisrKVxcbiBcXHRcXHRfX2ZyZWVfcGFnZXNfY29yZShwYWdlLCAwLCBNRU1JTklUX0VBUkxZKTtcXG4tXFx0fVxcbiB9XFxuIFxcbiAvKiBDb21wbGV0aW9uIHRyYWNraW5nIGZvciBkZWZlcnJlZF9pbml0X21lbW1hcCgpIHRocmVhZHMgKi9cXG5AQCAtMjAxNywxNSArMjAyMSwyOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBnZGF0X2luaXRfcmVwb3J0X29uZV9kb25lKHZvaWQpXFxuICAqIFJldHVybiBudW1iZXIgb2YgcGFnZXMgaW5pdGlhbGl6ZWQuXFxuICAqL1xcbiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZGVmZXJyZWRfaW5pdF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSxcXG4tXFx0XFx0dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4ge1xcbiBcXHRpbnQgbmlkID0gem9uZV90b19uaWQoem9uZSk7XFxuLVxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfcGZuIC0gcGZuO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX3BmbiAtIHN0YXJ0X3BmbiwgcGZuID0gc3RhcnRfcGZuO1xcbiBcXHRpbnQgemlkID0gem9uZV9pZHgoem9uZSk7XFxuIFxcdHN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTtcXG4gXFxuIFxcdGZvciAoOyBwZm4gXFx1MDAzYyBlbmRfcGZuOyBwZm4rKywgcGFnZSsrKVxcbiBcXHRcXHRfX2luaXRfc2luZ2xlX3BhZ2UocGFnZSwgcGZuLCB6aWQsIG5pZCk7XFxuK1xcbitcXHQvKiBOb3cgaW5pdGlhbGl6ZSBtaWdyYXRlIHR5cGVzIGZvciB0aGVzZSBwYWdlcy4gKi9cXG4rXFx0cGZuID0gcGFnZWJsb2NrX2FsaWduKHN0YXJ0X3Bmbik7XFxuK1xcdHBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pO1xcbitcXHRmb3IgKDsgcGZuIFxcdTAwM2MgZW5kX3BmbjsgcGZuICs9IHBhZ2VibG9ja19ucl9wYWdlcywgcGFnZSArPSBwYWdlYmxvY2tfbnJfcGFnZXMpXFxuK1xcdFxcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIE1JR1JBVEVfTU9WQUJMRSwgZmFsc2UpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVXBkYXRlIHRoZSBtaWdyYXRlIHR5cGUgZm9yIGFueSBwYWdlYmxvY2tzIHRoYXQgZmFsbCBpbiBhIEtITyBzY3JhdGNoXFxuK1xcdCAqIGFyZWEuIFNpbmNlIG1vc3QgcGFnZWJsb2NrcyB3aWxsIG5vdCBiZSBLSE8gc2NyYXRjaCwgZG8gaXQgb3V0c2lkZVxcbitcXHQgKiB0aGUgbG9vcCB0byBvbmx5IGRvIHRoZSBzZWFyY2ggb25jZS5cXG4rXFx0ICovXFxuK1xcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBlbmRfcGZuKTtcXG4rXFxuIFxcdHJldHVybiBucl9wYWdlcztcXG4gfVxcbiBcXG5AQCAtMjA1NCw4ICsyMDcyLDYgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcXG4gXFx0Zm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgbmlkLCAwLCBcXHUwMDI2c3RhcnQsIFxcdTAwMjZlbmQsIE5VTEwpIHtcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBzcGZuID0gUEZOX1VQKHN0YXJ0KTtcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBlcGZuID0gUEZOX0RPV04oZW5kKTtcXG4tXFx0XFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XFxuLVxcdFxcdFxcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHNwZm4sIE1JR1JBVEVfTU9WQUJMRSk7XFxuIFxcbiBcXHRcXHRpZiAoc3BmbiBcXHUwMDNlPSBlbmRfcGZuKVxcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtMjA2OCw3ICsyMDg0LDcgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcXG4gXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBjaHVua19lbmQgPSBtaW4obW9fcGZuLCBlcGZuKTtcXG4gXFxuIFxcdFxcdFxcdG5yX3BhZ2VzICs9IGRlZmVycmVkX2luaXRfcGFnZXMoem9uZSwgc3BmbiwgY2h1bmtfZW5kKTtcXG4tXFx0XFx0XFx0ZGVmZXJyZWRfZnJlZV9wYWdlcyhzcGZuLCBjaHVua19lbmQgLSBzcGZuLCBtdCk7XFxuK1xcdFxcdFxcdGRlZmVycmVkX2ZyZWVfcGFnZXMoc3BmbiwgY2h1bmtfZW5kIC0gc3Bmbik7XFxuIFxcbiBcXHRcXHRcXHRzcGZuID0gY2h1bmtfZW5kO1xcbiBcXG5AQCAtMjY4Nyw2ICsyNzAzLDcgQEAgdm9pZCBfX2luaXQgX193ZWFrIG1lbV9pbml0KHZvaWQpXFxuIFxcbiB2b2lkIF9faW5pdCBtbV9jb3JlX2luaXRfZWFybHkodm9pZClcXG4ge1xcbitcXHRraG9fbWVtb3J5X2luaXRfZWFybHkoKTtcXG4gXFx0aHVnZXRsYl9jbWFfcmVzZXJ2ZSgpO1xcbiBcXHRodWdldGxiX2Jvb3RtZW1fYWxsb2MoKTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaCBiL3Rvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaFxcbmluZGV4IGI2YjFkMTQ3ZmQ3NTBlLi5lODZiYjkwMDBiMjJmOCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmhcXG5AQCAtNjYsNCArNjYsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxcbiBcXG4gI2RlZmluZSBfX1NldFBhZ2VSZXNlcnZlZChwKVxcdCgodm9pZCkocCkpXFxuIFxcbitzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcXG4re1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuICNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MToyNy45Nzk3MzE5NTZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjk2MDczMzQ3NTM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFWEVDX0hBTkRPVkVSXCIsXG4gICAgXCJIVUdFVExCX1BBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJraG9fcmFkaXhfYWRkX2tleVwiLFxuICAgIFwia2hvX3JhZGl4X2RlbF9rZXlcIixcbiAgICBcImtob19yYWRpeF93YWxrX3RyZWVcIixcbiAgICBcImtob19yYWRpeF9pbml0X3RyZWVcIixcbiAgICBcImtob19yYWRpeF9kZXN0cm95X3RyZWVcIixcbiAgICBcImtob19zY3JhdGNoX292ZXJsYXBcIixcbiAgICBcImtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVcIixcbiAgICBcIm1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgS2V4ZWMgSGFuZG92ZXIgKEtITykgcmFkaXggdHJlZSBpbXBsZW1lbnRhdGlvbiwgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIGZvciBLSE8gc2NyYXRjaCBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGNoYW5nZXMgaG93IEh1Z2VUTEIgcGFnZXMgYXJlIGFsbG9jYXRlZCBkdXJpbmcgYm9vdCB1c2luZyBtZW1ibG9jay4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdGhhdCBjYW4gYmUgcmVhY2hlZCBkdXJpbmcgYm9vdCBhbmQgcnVudGltZSwgbWFraW5nIHRoZW0gd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAxNWE4OTViMjdkNzA2OWI0M2UzYjEyOGRmODU3ZWJjY2QzZTM4MDkyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBKdWwgMTAgMTM6NDE6MjQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmggYi9pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmhcbmluZGV4IDQ4YTk3OTNjMmI3NmNkLi4zMGE3MTcxMDU2NWEzMiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaFxuKysrIGIvaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oXG5AQCAtMzMsOSArMzMsMTMgQEAgdm9pZCBraG9fcmVtb3ZlX3N1YnRyZWUodm9pZCAqYmxvYik7XG4gaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpO1xuIFxuIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpO1xuK3ZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpO1xuIFxuIHZvaWQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbiwgcGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzLFxuIFx0XHQgIHU2NCBzY3JhdGNoX2xlbik7XG4rXG4rYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcbit2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIGJvb2wga2hvX2lzX2VuYWJsZWQodm9pZClcbiB7XG5AQCAtMTA4LDEwICsxMTIsMjIgQEAgc3RhdGljIGlubGluZSBpbnQga2hvX3JldHJpZXZlX3N1YnRyZWUoY29uc3QgY2hhciAqbmFtZSwgcGh5c19hZGRyX3QgKnBoeXMsXG4gXG4gc3RhdGljIGlubGluZSB2b2lkIGtob19tZW1vcnlfaW5pdCh2b2lkKSB7IH1cbiBcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfVxuK1xuIHN0YXRpYyBpbmxpbmUgdm9pZCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuIFx0XHRcdFx0cGh5c19hZGRyX3Qgc2NyYXRjaF9waHlzLCB1NjQgc2NyYXRjaF9sZW4pXG4ge1xuIH1cbitcbitzdGF0aWMgaW5saW5lIGJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcbit7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XG4re1xuK31cbiAjZW5kaWYgLyogQ09ORklHX0tFWEVDX0hBTkRPVkVSICovXG4gXG4gI2VuZGlmIC8qIExJTlVYX0tFWEVDX0hBTkRPVkVSX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaCBiL2luY2x1ZGUvbGludXgva2hvL2FiaS9rZXhlY19oYW5kb3Zlci5oXG5pbmRleCA1ZTJlYjg1MTliZGE2ZC4uMmY0ZmI5YzYzOTQyMWEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2toby9hYmkva2V4ZWNfaGFuZG92ZXIuaFxuKysrIGIvaW5jbHVkZS9saW51eC9raG8vYWJpL2tleGVjX2hhbmRvdmVyLmhcbkBAIC0yNTcsMTEgKzI1Nyw4IEBAIHN0cnVjdCBraG9fdm1hbGxvYyB7XG4gICogbWVtb3J5LiBUaGVzZSBjb25zdGFudHMgZ292ZXJuIHRoZSBpbmRleGluZywgc2l6aW5nLCBhbmQgZGVwdGggb2YgdGhlIHRyZWUuXG4gICovXG4gZW51bSBraG9fcmFkaXhfY29uc3RzIHtcbi1cdC8qXG4tXHQgKiBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSBvcmRlciBiaXQgKGFuZCBhbHNvIHRoZSBsZW5ndGggb2YgdGhlXG4tXHQgKiBzaGlmdGVkIHBoeXNpY2FsIGFkZHJlc3MpIGZvciBhbiBvcmRlci0wIHBhZ2UuXG4tXHQgKi9cbi1cdEtIT19PUkRFUl8wX0xPRzIgPSA2NCAtIFBBR0VfU0hJRlQsXG4rXHQvKiBOZWVkIHRvIHN0b3JlIHRoZSBQRk4sIHBsdXMgb25lIGJpdCBmb3Igb3JkZXIuICovXG4rXHRLSE9fUkFESVhfS0VZX1dJRFRIID0gNjQgLSBQQUdFX1NISUZUICsgMSxcbiBcbiBcdC8qIFNpemUgb2YgdGhlIHRhYmxlIGluIGtob19yYWRpeF9ub2RlLCBpbiBsb2cyICovXG4gXHRLSE9fVEFCTEVfU0laRV9MT0cyID0gY29uc3RfaWxvZzIoUEFHRV9TSVpFIC8gc2l6ZW9mKHBoeXNfYWRkcl90KSksXG5AQCAtMjc0LDcgKzI3MSw3IEBAIGVudW0ga2hvX3JhZGl4X2NvbnN0cyB7XG4gXHQgKiBhbmQgMSBiaXRtYXAgbGV2ZWwuXG4gXHQgKi9cbiBcdEtIT19UUkVFX01BWF9ERVBUSCA9XG4tXHRcdERJVl9ST1VORF9VUChLSE9fT1JERVJfMF9MT0cyIC0gS0hPX0JJVE1BUF9TSVpFX0xPRzIgKyAxLFxuK1x0XHRESVZfUk9VTkRfVVAoS0hPX1JBRElYX0tFWV9XSURUSCAtIEtIT19CSVRNQVBfU0laRV9MT0cyLFxuIFx0XHRcdCAgICAgS0hPX1RBQkxFX1NJWkVfTE9HMikgKyAxLFxuIH07XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oIGIvaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oXG5pbmRleCA4NGU5MThiOTZlNTNkZi4uNWQ2YWUyODkzNjg0YTQgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmhcbisrKyBiL2luY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaFxuQEAgLTM0LDM3ICszNCw1MyBAQCBzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUge1xuIFx0c3RydWN0IG11dGV4IGxvY2s7IC8qIHByb3RlY3RzIHRoZSB0cmVlJ3Mgc3RydWN0dXJlIGFuZCByb290IHBvaW50ZXIgKi9cbiB9O1xuIFxuLXR5cGVkZWYgaW50ICgqa2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190KShwaHlzX2FkZHJfdCBwaHlzLFxuLVx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpO1xuKy8qKlxuKyAqIHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAtIENhbGxiYWNrcyBmb3IgS0hPIHJhZGl4IHRyZWUgd2Fsay5cbisgKiBAbGVhZjogICAgICBDYWxsZWQgb24gZWFjaCBwcmVzZW50IGtleSBpbiB0aGUgcmFkaXggdHJlZS5cbisgKiBAbm9kZTogICAgICBDYWxsZWQgb24gZWFjaCBub2RlIG9mIHRoZSByYWRpeCB0cmVlIGl0c2VsZi4gUmVjZWl2ZXMgdGhlXG4rICogICAgICAgICAgICAgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBub2RlLlxuKyAqXG4rICogRm9yIGVhY2ggY2FsbGJhY2ssIGEgcmV0dXJuIHZhbHVlIG9mIDAgY29udGludWVzIHRoZSB3YWxrIGFuZCBhIG5vbi16ZXJvXG4rICogcmV0dXJuIHZhbHVlIGlzIGRpcmVjdGx5IHJldHVybmVkIHRvIHRoZSBjYWxsZXIuXG4rICovXG4rc3RydWN0IGtob19yYWRpeF93YWxrX2NiIHtcbitcdGludCAoKmxlYWYpKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKTtcbitcdGludCAoKm5vZGUpKHBoeXNfYWRkcl90IHBoeXMsIHZvaWQgKmRhdGEpO1xuK307XG4gXG4gI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUlxuIFxuLWludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0ICAgICAgIHVuc2lnbmVkIGludCBvcmRlcik7XG4tXG4tdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIpO1xuLVxuK2ludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KTtcbit2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpO1xuIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0XHRraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpO1xuK1x0XHRcdGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpO1xuK2ludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KTtcbit2b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKTtcbiBcbiAjZWxzZSAgLyogI2lmZGVmIENPTkZJR19LRVhFQ19IQU5ET1ZFUiAqL1xuIFxuLXN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIGxvbmcgcGZuLFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4rc3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSlcbiB7XG4gXHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuLVx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGludCBvcmRlcikgeyB9XG4rc3RhdGljIGlubGluZSB2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBrZXkpIHsgfVxuIFxuIHN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuLVx0XHRcdFx0ICAgICAga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuK1x0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSlcbiB7XG4gXHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxuK3tcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUpIHsgfVxuK1xuICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSICovXG4gXG4gI2VuZGlmXHQvKiBfTElOVVhfS0hPX1JBRElYX1RSRUVfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaFxuaW5kZXggNWFmY2Q5OWFhOGMxNDQuLmQ2MmRiOWU3NzZjZjk0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmhcbkBAIC01MSw2ICs1MSw3IEBAIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbWF4X3Bvc3NpYmxlX3BmbjtcbiAgKiBtZW1vcnkgcmVzZXJ2YXRpb25zIHlldCwgc28gd2UgZ2V0IHNjcmF0Y2ggbWVtb3J5IGZyb20gdGhlIHByZXZpb3VzXG4gICoga2VybmVsIHRoYXQgd2Uga25vdyBpcyBnb29kIHRvIHVzZS4gSXQgaXMgdGhlIG9ubHkgbWVtb3J5IHRoYXRcbiAgKiBhbGxvY2F0aW9ucyBtYXkgaGFwcGVuIGZyb20gaW4gdGhpcyBwaGFzZS5cbisgKiBATUVNQkxPQ0tfUlNSVl9IVUdFVExCOiBtZW1vcnkgaXMgcmVzZXJ2ZWQgZm9yIGh1Z2V0bGIgcGFnZXNcbiAgKi9cbiBlbnVtIG1lbWJsb2NrX2ZsYWdzIHtcbiBcdE1FTUJMT0NLX05PTkVcdFx0PSAweDAsXHQvKiBObyBzcGVjaWFsIHJlcXVlc3QgKi9cbkBAIC02MSw2ICs2Miw3IEBAIGVudW0gbWVtYmxvY2tfZmxhZ3Mge1xuIFx0TUVNQkxPQ0tfUlNSVl9OT0lOSVRcdD0gMHgxMCxcdC8qIGRvbid0IGluaXRpYWxpemUgc3RydWN0IHBhZ2VzICovXG4gXHRNRU1CTE9DS19SU1JWX0tFUk5cdD0gMHgyMCxcdC8qIG1lbW9yeSByZXNlcnZlZCBmb3Iga2VybmVsIHVzZSAqL1xuIFx0TUVNQkxPQ0tfS0hPX1NDUkFUQ0hcdD0gMHg0MCxcdC8qIHNjcmF0Y2ggbWVtb3J5IGZvciBrZXhlYyBoYW5kb3ZlciAqL1xuK1x0TUVNQkxPQ0tfUlNSVl9IVUdFVExCXHQ9IDB4ODAsIC8qIG1lbW9yeSByZXNlcnZlZCBmb3IgaHVnZXRsYiBwYWdlcyAqL1xuIH07XG4gXG4gLyoqXG5AQCAtNDIwLDYgKzQyMiw3IEBAIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLFxuIHZvaWQgKm1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sXG4gXHRcdFx0ICAgICBwaHlzX2FkZHJfdCBtaW5fYWRkciwgcGh5c19hZGRyX3QgbWF4X2FkZHIsXG4gXHRcdFx0ICAgICBpbnQgbmlkKTtcbit2b2lkICptZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKTtcbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKm1lbWJsb2NrX2FsbG9jKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduKVxuIHtcbkBAIC00ODQsNiArNDg3LDcgQEAgc3RhdGljIGlubGluZSBfX2luaXRfbWVtYmxvY2sgYm9vbCBtZW1ibG9ja19ib3R0b21fdXAodm9pZClcbiBwaHlzX2FkZHJfdCBtZW1ibG9ja19waHlzX21lbV9zaXplKHZvaWQpO1xuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3Jlc2VydmVkX3NpemUodm9pZCk7XG4gcGh5c19hZGRyX3QgbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKHBoeXNfYWRkcl90IGxpbWl0LCBpbnQgbmlkKTtcbitwaHlzX2FkZHJfdCBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUocGh5c19hZGRyX3QgbGltaXQsIGludCBuaWQpO1xuIHVuc2lnbmVkIGxvbmcgbWVtYmxvY2tfZXN0aW1hdGVkX25yX2ZyZWVfcGFnZXModm9pZCk7XG4gcGh5c19hZGRyX3QgbWVtYmxvY2tfc3RhcnRfb2ZfRFJBTSh2b2lkKTtcbiBwaHlzX2FkZHJfdCBtZW1ibG9ja19lbmRfb2ZfRFJBTSh2b2lkKTtcbkBAIC02MTMsMjggKzYxNyw5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW10ZXN0X3JlcG9ydF9tZW1pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkgeyB9XG4gI2lmZGVmIENPTkZJR19NRU1CTE9DS19LSE9fU0NSQVRDSFxuIHZvaWQgbWVtYmxvY2tfc2V0X2tob19zY3JhdGNoX29ubHkodm9pZCk7XG4gdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpO1xuLWJvb2wgbWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpO1xuLVxuLXN0YXRpYyBpbmxpbmUgZW51bSBtaWdyYXRldHlwZSBraG9fc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0XHRcdFx0XHQgICAgICAgZW51bSBtaWdyYXRldHlwZSBtdClcbi17XG4tXHRpZiAobWVtYmxvY2tfaXNfa2hvX3NjcmF0Y2hfbWVtb3J5KFBGTl9QSFlTKHBmbikpKVxuLVx0XHRyZXR1cm4gTUlHUkFURV9DTUE7XG4tXHRyZXR1cm4gbXQ7XG4tfVxuICNlbHNlXG4gc3RhdGljIGlubGluZSB2b2lkIG1lbWJsb2NrX3NldF9raG9fc2NyYXRjaF9vbmx5KHZvaWQpIHsgfVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpIHsgfVxuLXN0YXRpYyBpbmxpbmUgYm9vbCBtZW1ibG9ja19pc19raG9fc2NyYXRjaF9tZW1vcnkocGh5c19hZGRyX3QgYWRkcilcbi17XG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgZW51bSBtaWdyYXRldHlwZSBraG9fc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHBmbixcbi1cdFx0XHRcdFx0XHQgICAgICAgZW51bSBtaWdyYXRldHlwZSBtdClcbi17XG4tXHRyZXR1cm4gbXQ7XG4tfVxuICNlbmRpZlxuIFxuICNlbmRpZiAvKiBfTElOVVhfTUVNQkxPQ0tfSCAqL1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlIGIva2VybmVsL2xpdmV1cGRhdGUvTWFrZWZpbGVcbmluZGV4IGVlYzlkM2FlMDdlYjRiLi5kOWY0Njk0NjI1NTY3MyAxMDA2NDRcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL01ha2VmaWxlXG4rKysgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9NYWtlZmlsZVxuQEAgLTgsNyArOCw2IEBAIGx1by15IDo9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHRcdGx1b19zZXNzaW9uLm9cbiBcbiBvYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVIpXHRcdCs9IGtleGVjX2hhbmRvdmVyLm9cbi1vYmotJChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpXHQrPSBrZXhlY19oYW5kb3Zlcl9kZWJ1Zy5vXG4gb2JqLSQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHRlMpXHQrPSBrZXhlY19oYW5kb3Zlcl9kZWJ1Z2ZzLm9cbiBcbiBvYmotJChDT05GSUdfTElWRVVQREFURSlcdFx0Kz0gbHVvLm9cbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuaW5kZXggNDgzNGE4MDk5ODVhYjcuLjlkYzc5YjcxMDNiZGJmIDEwMDY0NFxuLS0tIGEva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuKysrIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuY1xuQEAgLTg0LDggKzg0LDI1IEBAIHN0YXRpYyBzdHJ1Y3Qga2hvX291dCBraG9fb3V0ID0ge1xuIFx0fSxcbiB9O1xuIFxuK3N0cnVjdCBraG9faW4ge1xuK1x0cGh5c19hZGRyX3QgZmR0X3BoeXM7XG4rXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXM7XG4rXHRjaGFyIHByZXZpb3VzX3JlbGVhc2VbX19ORVdfVVRTX0xFTiArIDFdO1xuK1x0dTMyIGtleGVjX2NvdW50O1xuK1x0c3RydWN0IGtob19kZWJ1Z2ZzIGRiZztcbitcdHN0cnVjdCBraG9fcmFkaXhfdHJlZSByYWRpeF90cmVlO1xuK307XG4rXG4rc3RhdGljIHN0cnVjdCBraG9faW4ga2hvX2luID0ge1xuK307XG4rXG4rc3RhdGljIGNvbnN0IHZvaWQgKmtob19nZXRfZmR0KHZvaWQpXG4re1xuK1x0cmV0dXJuIGtob19pbi5mZHRfcGh5cyA/IHBoeXNfdG9fdmlydChraG9faW4uZmR0X3BoeXMpIDogTlVMTDtcbit9XG4rXG4gLyoqXG4tICoga2hvX3JhZGl4X2VuY29kZV9rZXkgLSBFbmNvZGVzIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIgaW50byBhIHJhZGl4IGtleS5cbisgKiBraG9fZW5jb2RlX3JhZGl4X2tleSAtIEVuY29kZXMgYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBpbnRvIGEgcmFkaXgga2V5LlxuICAqIEBwaHlzOiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZS5cbiAgKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS5cbiAgKlxuQEAgLTk1LDM1ICsxMTIsMzggQEAgc3RhdGljIHN0cnVjdCBraG9fb3V0IGtob19vdXQgPSB7XG4gICpcbiAgKiBSZXR1cm46IFRoZSBlbmNvZGVkIHVuc2lnbmVkIGxvbmcgcmFkaXgga2V5LlxuICAqL1xuLXN0YXRpYyB1bnNpZ25lZCBsb25nIGtob19yYWRpeF9lbmNvZGVfa2V5KHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGludCBvcmRlcilcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBraG9fZW5jb2RlX3JhZGl4X2tleShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBpbnQgb3JkZXIpXG4ge1xuLVx0LyogT3JkZXIgYml0cyBwYXJ0ICovXG4tXHR1bnNpZ25lZCBsb25nIGggPSAxVUwgXHUwMDNjXHUwMDNjIChLSE9fT1JERVJfMF9MT0cyIC0gb3JkZXIpO1xuLVx0LyogU2hpZnRlZCBwaHlzaWNhbCBhZGRyZXNzIHBhcnQgKi9cbi1cdHVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgXHUwMDNlXHUwMDNlIChQQUdFX1NISUZUICsgb3JkZXIpO1xuK1x0LyogVGhlIHBoeXNpY2FsIGFkZHJlc3MgaXMgZW5jb2RlZCBieSBzaGlmdGluZyB0aGUgUEZOIGJ5IGl0cyBvcmRlci4gKi9cbitcdHVuc2lnbmVkIGxvbmcgc2hpZnQgPSBQQUdFX1NISUZUICsgb3JkZXI7XG4rXHQvKiBPcmRlciBiaXQgZ29lcyByaWdodCBiZWZvcmUgdGhlIHNoaWZ0ZWQgUEZOLiAqL1xuK1x0dW5zaWduZWQgbG9uZyBoID0gMVVMIFx1MDAzY1x1MDAzYyAoNjQgLSBzaGlmdCk7XG4rXHQvKiBTaGlmdGVkIFBGTi4gKi9cbitcdHVuc2lnbmVkIGxvbmcgbCA9IHBoeXMgXHUwMDNlXHUwMDNlIHNoaWZ0O1xuIFxuIFx0cmV0dXJuIGggfCBsO1xuIH1cbiBcbiAvKipcbi0gKiBraG9fcmFkaXhfZGVjb2RlX2tleSAtIERlY29kZXMgYSByYWRpeCBrZXkgYmFjayBpbnRvIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXG4rICoga2hvX2RlY29kZV9yYWRpeF9rZXkgLSBEZWNvZGVzIGEgcmFkaXgga2V5IGJhY2sgaW50byBhIHBoeXNpY2FsIGFkZHJlc3MgYW5kIG9yZGVyLlxuICAqIEBrZXk6IFRoZSB1bnNpZ25lZCBsb25nIGtleSB0byBkZWNvZGUuXG4gICogQG9yZGVyOiBBbiBvdXRwdXQgcGFyYW1ldGVyLCBhIHBvaW50ZXIgdG8gYW4gdW5zaWduZWQgaW50IHdoZXJlIHRoZSBkZWNvZGVkXG4gICogICAgICAgICBwYWdlIG9yZGVyIHdpbGwgYmUgc3RvcmVkLlxuICAqXG4tICogVGhpcyBmdW5jdGlvbiByZXZlcnNlcyB0aGUgZW5jb2RpbmcgcGVyZm9ybWVkIGJ5IGtob19yYWRpeF9lbmNvZGVfa2V5KCksXG4rICogVGhpcyBmdW5jdGlvbiByZXZlcnNlcyB0aGUgZW5jb2RpbmcgcGVyZm9ybWVkIGJ5IGtob19lbmNvZGVfcmFkaXhfa2V5KCksXG4gICogZXh0cmFjdGluZyB0aGUgb3JpZ2luYWwgcGh5c2ljYWwgYWRkcmVzcyBhbmQgcGFnZSBvcmRlciBmcm9tIGEgZ2l2ZW4ga2V5LlxuICAqXG4gICogUmV0dXJuOiBUaGUgZGVjb2RlZCBwaHlzaWNhbCBhZGRyZXNzLlxuICAqL1xuLXN0YXRpYyBwaHlzX2FkZHJfdCBraG9fcmFkaXhfZGVjb2RlX2tleSh1bnNpZ25lZCBsb25nIGtleSwgdW5zaWduZWQgaW50ICpvcmRlcilcbitzdGF0aWMgcGh5c19hZGRyX3Qga2hvX2RlY29kZV9yYWRpeF9rZXkodW5zaWduZWQgbG9uZyBrZXksIHVuc2lnbmVkIGludCAqb3JkZXIpXG4ge1xuLVx0dW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSk7XG4rXHQvKiBmbHM2NCgpIGluZGV4ZXMgc3RhcnRpbmcgZnJvbSAxLiAqL1xuK1x0dW5zaWduZWQgaW50IG9yZGVyX2JpdCA9IGZsczY0KGtleSkgLSAxO1xuIFx0cGh5c19hZGRyX3QgcGh5cztcbiBcbi1cdC8qIG9yZGVyX2JpdCBpcyBudW1iZXJlZCBzdGFydGluZyBhdCAxIGZyb20gZmxzNjQgKi9cbi1cdCpvcmRlciA9IEtIT19PUkRFUl8wX0xPRzIgLSBvcmRlcl9iaXQgKyAxO1xuLVx0LyogVGhlIG9yZGVyIGlzIGRpc2NhcmRlZCBieSB0aGUgc2hpZnQgKi9cbitcdC8qIG9yZGVyIGJpdCBnb2VzIHJpZ2h0IGJlZm9yZSB0aGUgc2hpZnRlZCBQRk4uICovXG4rXHQqb3JkZXIgPSA2NCAtIChQQUdFX1NISUZUICsgb3JkZXJfYml0KTtcbitcdC8qIFRoZSBvcmRlciBiaXQgaXMgZGlzY2FyZGVkIGJ5IHRoZSBzaGlmdCAqL1xuIFx0cGh5cyA9IGtleSBcdTAwM2NcdTAwM2MgKFBBR0VfU0hJRlQgKyAqb3JkZXIpO1xuIFxuIFx0cmV0dXJuIHBoeXM7XG5AQCAtMTQzLDI1ICsxNjMsNDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcga2hvX3JhZGl4X2dldF90YWJsZV9pbmRleCh1bnNpZ25lZCBsb25nIGtleSxcbiBcdHJldHVybiAoa2V5IFx1MDAzZVx1MDAzZSBzKSAlICgxIFx1MDAzY1x1MDAzYyBLSE9fVEFCTEVfU0laRV9MT0cyKTtcbiB9XG4gXG4rc3RhdGljIHZvaWQgX19yZWYgKmtob19yYWRpeF9hbGxvY19ub2RlKHZvaWQpXG4re1xuK1x0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlO1xuK1xuK1x0aWYgKHNsYWJfaXNfYXZhaWxhYmxlKCkpXG4rXHRcdG5vZGUgPSAoc3RydWN0IGtob19yYWRpeF9ub2RlICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpO1xuK1x0ZWxzZVxuK1x0XHRub2RlID0gbWVtYmxvY2tfYWxsb2MoUEFHRV9TSVpFLCBQQUdFX1NJWkUpO1xuK1xuK1x0cmV0dXJuIG5vZGU7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIF9fcmVmIGtob19yYWRpeF9mcmVlX25vZGUoc3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlKVxuK3tcbitcdGlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKVxuK1x0XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpbm9kZSk7XG4rXHRlbHNlXG4rXHRcdG1lbWJsb2NrX2ZyZWUobm9kZSwgUEFHRV9TSVpFKTtcbit9XG4rXG4gLyoqXG4tICoga2hvX3JhZGl4X2FkZF9wYWdlIC0gTWFya3MgYSBwYWdlIGFzIHByZXNlcnZlZCBpbiB0aGUgcmFkaXggdHJlZS5cbisgKiBraG9fcmFkaXhfYWRkX2tleSAtIEFkZCBhIGtleSB0byB0aGUgcmFkaXggdHJlZS5cbiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLlxuLSAqIEBwZm46IFRoZSBwYWdlIGZyYW1lIG51bWJlciBvZiB0aGUgcGFnZSB0byBwcmVzZXJ2ZS5cbi0gKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgcGFnZS5cbisgKiBAa2V5OiBUaGUga2V5IHRvIGFkZC5cbiAgKlxuLSAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSByYWRpeCB0cmVlIGJhc2VkIG9uIHRoZSBrZXkgZGVyaXZlZCBmcm9tIEBwZm5cbi0gKiBhbmQgQG9yZGVyLiBJdCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGVcbi0gKiBwYWdlIGZvciBwcmVzZXJ2YXRpb24uIElmIGludGVybWVkaWF0ZSBub2RlcyBkbyBub3QgZXhpc3QgYWxvbmcgdGhlIHBhdGgsXG4tICogdGhleSBhcmUgYWxsb2NhdGVkIGFuZCBhZGRlZCB0byB0aGUgdHJlZS5cbisgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBiYXNlZCBvbiB0aGUgQGtleSBwcm92aWRlZC4gSXQgc2V0cyB0aGVcbisgKiBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbGVhZiBiaXRtYXAgdG8gbWFyayB0aGUgQGtleSBhcyBwcmVzZW50LiBJZlxuKyAqIGludGVybWVkaWF0ZSBub2RlcyBkbyBub3QgZXhpc3QgYWxvbmcgdGhlIHBhdGgsIHRoZXkgYXJlIGFsbG9jYXRlZCBhbmQgYWRkZWRcbisgKiB0byB0aGUgdHJlZS5cbisgKlxuKyAqIE5PVEU6IEN1cnJlbnRseSBvbmx5IGtleXMgb2Ygd2lkdGggdXAgdG8gJUtIT19SQURJWF9LRVlfV0lEVEggYXJlIHN1cHBvcnRlZC5cbisgKiBUaGlzIGxpbWl0IG9ubHkgZXhpc3RzIGJlY2F1c2UgY3VycmVudCB1c2VycyBvZiB0aGUgcmFkaXggdHJlZSBkb24ndCB1c2UgbW9yZVxuKyAqIHRoYW4gdGhhdC4gQ2hhbmdpbmcgdGhlIG1heGltdW0gd2lkdGggcmVxdWlyZXMgY2hhbmdpbmcgdGhlIHRyZWUgZGVwdGgsIHdoaWNoXG4rICogbmVlZHMgYnVtcGluZyB0aGUgQUJJIHZlcnNpb24uXG4gICpcbiAgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuXG4gICovXG4taW50IGtob19yYWRpeF9hZGRfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXG4tXHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgaW50IG9yZGVyKVxuK2ludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxuIHtcbiBcdC8qIE5ld2x5IGFsbG9jYXRlZCBub2RlcyBmb3IgZXJyb3IgY2xlYW51cCAqL1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICppbnRlcm1lZGlhdGVfbm9kZXNbS0hPX1RSRUVfTUFYX0RFUFRIXSA9IHsgMCB9O1xuLVx0dW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7XG4gXHRzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKmFuY2hvcl9ub2RlID0gTlVMTDtcbiBcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbm9kZSA9IHRyZWUtXHUwMDNlcm9vdDtcbiBcdHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqbmV3X25vZGU7XG5AQCAtMTcyLDYgKzIxNCw5IEBAIGludCBraG9fcmFkaXhfYWRkX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxuIFx0aWYgKFdBUk5fT05fT05DRSghdHJlZS1cdTAwM2Vyb290KSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4rXHRpZiAodW5saWtlbHkoZmxzNjQoa2V5KSBcdTAwM2UgS0hPX1JBRElYX0tFWV9XSURUSCkpXG4rXHRcdHJldHVybiAtRVJBTkdFO1xuK1xuIFx0bWlnaHRfc2xlZXAoKTtcbiBcbiBcdGd1YXJkKG11dGV4KShcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuQEAgLTE4Niw3ICsyMzEsNyBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBcdFx0fVxuIFxuIFx0XHQvKiBOZXh0IG5vZGUgaXMgZW1wdHksIGNyZWF0ZSBhIG5ldyBub2RlIGZvciBpdCAqL1xuLVx0XHRuZXdfbm9kZSA9IChzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4rXHRcdG5ld19ub2RlID0ga2hvX3JhZGl4X2FsbG9jX25vZGUoKTtcbiBcdFx0aWYgKCFuZXdfbm9kZSkge1xuIFx0XHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdFx0Z290byBlcnJfZnJlZV9ub2RlcztcbkBAIC0yMTcsMjkgKzI2MiwyNiBAQCBpbnQga2hvX3JhZGl4X2FkZF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBlcnJfZnJlZV9ub2RlczpcbiBcdGZvciAoaSA9IEtIT19UUkVFX01BWF9ERVBUSCAtIDE7IGkgXHUwMDNlIDA7IGktLSkge1xuIFx0XHRpZiAoaW50ZXJtZWRpYXRlX25vZGVzW2ldKVxuLVx0XHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylpbnRlcm1lZGlhdGVfbm9kZXNbaV0pO1xuK1x0XHRcdGtob19yYWRpeF9mcmVlX25vZGUoaW50ZXJtZWRpYXRlX25vZGVzW2ldKTtcbiBcdH1cbiBcdGlmIChhbmNob3Jfbm9kZSlcbiBcdFx0YW5jaG9yX25vZGUtXHUwMDNldGFibGVbYW5jaG9yX2lkeF0gPSAwO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG4tRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X2FkZF9wYWdlKTtcbitFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7XG4gXG4gLyoqXG4tICoga2hvX3JhZGl4X2RlbF9wYWdlIC0gUmVtb3ZlcyBhIHBhZ2UncyBwcmVzZXJ2YXRpb24gc3RhdHVzIGZyb20gdGhlIHJhZGl4IHRyZWUuXG4rICoga2hvX3JhZGl4X2RlbF9rZXkgLSBSZW1vdmVzIHRoZSBrZXkgZnJvbSB0aGUgcmFkaXggdHJlZS5cbiAgKiBAdHJlZTogVGhlIEtITyByYWRpeCB0cmVlLlxuLSAqIEBwZm46IFRoZSBwYWdlIGZyYW1lIG51bWJlciBvZiB0aGUgcGFnZSB0byB1bnByZXNlcnZlLlxuLSAqIEBvcmRlcjogVGhlIG9yZGVyIG9mIHRoZSBwYWdlLlxuKyAqIEBrZXk6IFRoZSBrZXkgdG8gcmVtb3ZlLlxuICAqXG4gICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNsZWFycyB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG9cbi0gKiB0aGUgcGFnZSwgZWZmZWN0aXZlbHkgcmVtb3ZpbmcgaXRzIFwicHJlc2VydmVkXCIgc3RhdHVzLiBJdCBkb2VzIG5vdCBmcmVlXG4tICogdGhlIHRyZWUncyBpbnRlcm1lZGlhdGUgbm9kZXMsIGV2ZW4gaWYgdGhleSBiZWNvbWUgZW1wdHkuXG4rICogdGhlIEBrZXksIGVmZmVjdGl2ZWx5IHJlbW92aW5nIGl0IGZyb20gdGhlIHRyZWUuIEl0IGRvZXMgbm90IGZyZWUgdGhlIHRyZWUnc1xuKyAqIGludGVybWVkaWF0ZSBub2RlcywgZXZlbiBpZiB0aGV5IGJlY29tZSBlbXB0eS5cbiAgKi9cbi12b2lkIGtob19yYWRpeF9kZWxfcGFnZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcgcGZuLFxuLVx0XHRcdHVuc2lnbmVkIGludCBvcmRlcilcbit2b2lkIGtob19yYWRpeF9kZWxfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpXG4ge1xuLVx0dW5zaWduZWQgbG9uZyBrZXkgPSBraG9fcmFkaXhfZW5jb2RlX2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcik7XG4gXHRzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKm5vZGUgPSB0cmVlLVx1MDAzZXJvb3Q7XG4gXHRzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWY7XG4gXHR1bnNpZ25lZCBpbnQgaSwgaWR4O1xuQEAgLTI0Nyw2ICsyODksMTAgQEAgdm9pZCBraG9fcmFkaXhfZGVsX3BhZ2Uoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIHBmbixcbiBcdGlmIChXQVJOX09OX09OQ0UoIXRyZWUtXHUwMDNlcm9vdCkpXG4gXHRcdHJldHVybjtcbiBcbitcdC8qIEtleXMgd2lkZXIgdGhhbiBLSE9fUkFESVhfS0VZX1dJRFRIIGFyZSBub3QgYWxsb3dlZCB0byBiZSBhZGRlZC4gKi9cbitcdGlmICh1bmxpa2VseShmbHM2NChrZXkpIFx1MDAzZSBLSE9fUkFESVhfS0VZX1dJRFRIKSlcbitcdFx0cmV0dXJuO1xuK1xuIFx0bWlnaHRfc2xlZXAoKTtcbiBcbiBcdGd1YXJkKG11dGV4KShcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuQEAgLTI3MCwyMSArMzE2LDg1IEBAIHZvaWQga2hvX3JhZGl4X2RlbF9wYWdlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBwZm4sXG4gXHRpZHggPSBraG9fcmFkaXhfZ2V0X2JpdG1hcF9pbmRleChrZXkpO1xuIFx0X19jbGVhcl9iaXQoaWR4LCBsZWFmLVx1MDAzZWJpdG1hcCk7XG4gfVxuLUVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZWxfcGFnZSk7XG4rRVhQT1JUX1NZTUJPTF9HUEwoa2hvX3JhZGl4X2RlbF9rZXkpO1xuK1xuK3N0YXRpYyB2b2lkIF9fa2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGludCBsZXZlbClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRpZiAobGV2ZWwgPT0gMCkge1xuK1x0XHRraG9fcmFkaXhfZnJlZV9ub2RlKHJvb3QpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBQQUdFX1NJWkUgLyBzaXplb2YocGh5c19hZGRyX3QpOyBpKyspIHtcbitcdFx0aWYgKHJvb3QtXHUwMDNldGFibGVbaV0pXG4rXHRcdFx0X19raG9fcmFkaXhfZGVzdHJveV90cmVlKHBoeXNfdG9fdmlydChyb290LVx1MDAzZXRhYmxlW2ldKSxcbitcdFx0XHRcdFx0XHQgbGV2ZWwgLSAxKTtcbitcdH1cbitcbitcdGtob19yYWRpeF9mcmVlX25vZGUocm9vdCk7XG4rfVxuK1xuKy8qKlxuKyAqIGtob19yYWRpeF9pbml0X3RyZWUgLSBpbml0aWFsaXplIHRoZSByYWRpeCB0cmVlLlxuKyAqIEB0cmVlOiAgIHRoZSB0cmVlIHRvIGluaXRpYWxpemUuXG4rICogQHJvb3Q6ICAgcm9vdCB0YWJsZSBvZiB0aGUgcmFkaXggdHJlZS5cbisgKlxuKyAqIEluaXRpYWxpemUgdGhlIHJhZGl4IHRyZWUgd2l0aCB0aGUgZ2l2ZW4gcm9vdCBub2RlLiBJZiByb290IGlzICVOVUxMLCBhblxuKyAqIGVtcHR5IHJvb3QgdGFibGUgaXMgYWxsb2NhdGVkLiBJZiByb290IGlzIG5vdCAlTlVMTCwgaXQgaXMgdGhlIGNhbGxlcidzXG4rICogcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoZSByb290IGlzIHZhbGlkIGFuZCBpbiB0aGUgY29ycmVjdCBmb3JtYXQuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuXG4rICovXG4raW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpXG4re1xuK1x0aWYgKCFyb290KVxuK1x0XHRyb290ID0ga2hvX3JhZGl4X2FsbG9jX25vZGUoKTtcbitcdGlmICghcm9vdClcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHR0cmVlLVx1MDAzZXJvb3QgPSByb290O1xuK1x0bXV0ZXhfaW5pdChcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuK1x0cmV0dXJuIDA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9pbml0X3RyZWUpO1xuK1xuKy8qKlxuKyAqIGtob19yYWRpeF9kZXN0cm95X3RyZWUgLSBEZXN0cm95IHRoZSByYWRpeCB0cmVlXG4rICogQHRyZWU6IFRoZSByYWRpeCB0cmVlIHRvIGRlc3Ryb3lcbisgKlxuKyAqIFdhbGsgQHRyZWUgYW5kIGZyZWUgYWxsIGl0cyBub2Rlcy5cbisgKi9cbit2b2lkIGtob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlKVxuK3tcbitcdGlmICghdHJlZS1cdTAwM2Vyb290KVxuK1x0XHRyZXR1cm47XG4rXG4rXHRfX2tob19yYWRpeF9kZXN0cm95X3RyZWUodHJlZS1cdTAwM2Vyb290LCBLSE9fVFJFRV9NQVhfREVQVEggLSAxKTtcbitcdHRyZWUtXHUwMDNlcm9vdCA9IE5VTEw7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF9kZXN0cm95X3RyZWUpO1xuIFxuLXN0YXRpYyBpbnQga2hvX3JhZGl4X3dhbGtfbGVhZihzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKmxlYWYsXG4tXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcga2V5LFxuLVx0XHRcdCAgICAgICBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXG4rc3RhdGljIGludCBraG9fcmFkaXhfd2Fsa19sZWFmKHN0cnVjdCBraG9fcmFkaXhfbGVhZiAqbGVhZiwgdW5zaWduZWQgbG9uZyBrZXksXG4rXHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyAqYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilsZWFmO1xuLVx0dW5zaWduZWQgaW50IG9yZGVyO1xuLVx0cGh5c19hZGRyX3QgcGh5cztcbiBcdHVuc2lnbmVkIGludCBpO1xuIFx0aW50IGVycjtcbiBcbitcdGlmIChjYi1cdTAwM2Vub2RlKSB7XG4rXHRcdGVyciA9IGNiLVx1MDAzZW5vZGUodmlydF90b19waHlzKGxlYWYpLCBkYXRhKTtcbitcdFx0aWYgKGVycilcbitcdFx0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuK1x0aWYgKCFjYi1cdTAwM2VsZWFmKVxuK1x0XHRyZXR1cm4gMDtcbitcbiBcdGZvcl9lYWNoX3NldF9iaXQoaSwgYml0bWFwLCBQQUdFX1NJWkUgKiBCSVRTX1BFUl9CWVRFKSB7XG4tXHRcdHBoeXMgPSBraG9fcmFkaXhfZGVjb2RlX2tleShrZXkgfCBpLCBcdTAwMjZvcmRlcik7XG4tXHRcdGVyciA9IGNiKHBoeXMsIG9yZGVyKTtcbitcdFx0ZXJyID0gY2ItXHUwMDNlbGVhZihrZXkgfCBpLCBkYXRhKTtcbiBcdFx0aWYgKGVycilcbiBcdFx0XHRyZXR1cm4gZXJyO1xuIFx0fVxuQEAgLTI5NCw3ICs0MDQsNyBAQCBzdGF0aWMgaW50IGtob19yYWRpeF93YWxrX2xlYWYoc3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmLFxuIFxuIHN0YXRpYyBpbnQgX19raG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfbm9kZSAqcm9vdCxcbiBcdFx0XHRcdCB1bnNpZ25lZCBpbnQgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tXHRcdFx0XHQga2hvX3JhZGl4X3RyZWVfd2Fsa19jYWxsYmFja190IGNiKVxuK1x0XHRcdFx0IGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiAqY2IsIHZvaWQgKmRhdGEpXG4ge1xuIFx0c3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlO1xuIFx0c3RydWN0IGtob19yYWRpeF9sZWFmICpsZWFmO1xuQEAgLTMwMiw2ICs0MTIsMTIgQEAgc3RhdGljIGludCBfX2tob19yYWRpeF93YWxrX3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxuIFx0dW5zaWduZWQgaW50IHNoaWZ0O1xuIFx0aW50IGVycjtcbiBcbitcdGlmIChjYi1cdTAwM2Vub2RlKSB7XG4rXHRcdGVyciA9IGNiLVx1MDAzZW5vZGUodmlydF90b19waHlzKHJvb3QpLCBkYXRhKTtcbitcdFx0aWYgKGVycilcbitcdFx0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUEFHRV9TSVpFIC8gc2l6ZW9mKHBoeXNfYWRkcl90KTsgaSsrKSB7XG4gXHRcdGlmICghcm9vdC1cdTAwM2V0YWJsZVtpXSlcbiBcdFx0XHRjb250aW51ZTtcbkBAIC0zMTgsMTAgKzQzNCwxMCBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXG4gXHRcdFx0ICogbm9kZSBpcyBwb2ludGluZyB0byB0aGUgbGV2ZWwgMCBiaXRtYXAuXG4gXHRcdFx0ICovXG4gXHRcdFx0bGVhZiA9IChzdHJ1Y3Qga2hvX3JhZGl4X2xlYWYgKilub2RlO1xuLVx0XHRcdGVyciA9IGtob19yYWRpeF93YWxrX2xlYWYobGVhZiwga2V5LCBjYik7XG4rXHRcdFx0ZXJyID0ga2hvX3JhZGl4X3dhbGtfbGVhZihsZWFmLCBrZXksIGNiLCBkYXRhKTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRlcnIgID0gX19raG9fcmFkaXhfd2Fsa190cmVlKG5vZGUsIGxldmVsIC0gMSxcbi1cdFx0XHRcdFx0XHQgICAgIGtleSwgY2IpO1xuK1x0XHRcdFx0XHRcdCAgICAga2V5LCBjYiwgZGF0YSk7XG4gXHRcdH1cbiBcbiBcdFx0aWYgKGVycilcbkBAIC0zMzIsMjggKzQ0OCwyNyBAQCBzdGF0aWMgaW50IF9fa2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QsXG4gfVxuIFxuIC8qKlxuLSAqIGtob19yYWRpeF93YWxrX3RyZWUgLSBUcmF2ZXJzZXMgdGhlIHJhZGl4IHRyZWUgYW5kIGNhbGxzIGEgY2FsbGJhY2sgZm9yIGVhY2ggcHJlc2VydmVkIHBhZ2UuXG4rICoga2hvX3JhZGl4X3dhbGtfdHJlZSAtIFRyYXZlcnNlcyB0aGUgcmFkaXggdHJlZSBhbmQgY2FsbHMgYSBjYWxsYmFjayBmb3IgZWFjaCBrZXkuXG4gICogQHRyZWU6IEEgcG9pbnRlciB0byB0aGUgS0hPIHJhZGl4IHRyZWUgdG8gd2Fsay5cbi0gKiBAY2I6IEEgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdHlwZSBraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgdGhhdCB3aWxsIGJlXG4tICogICAgICBpbnZva2VkIGZvciBlYWNoIHByZXNlcnZlZCBwYWdlIGZvdW5kIGluIHRoZSB0cmVlLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXNcbi0gKiAgICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBvcmRlciBvZiB0aGUgcHJlc2VydmVkIHBhZ2UuXG4rICogQGNiOiAgIFNldCBvZiBjYWxsYmFja3MgdG8gYmUgaW52b2tlZCBkdXJpbmcgdGhlIHRyZWUgd2Fsay5cbisgKiBAZGF0YTogT3BhcXVlIGRhdGEgcG9pbnRlciBwYXNzZWQgdG8gZWFjaCBjYWxsYmFjayBpbiBAY2IuXG4gICpcbi0gKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIHRoZSByYWRpeCB0cmVlLCBzZWFyY2hpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHRvcCBsZXZlbFxuLSAqIGRvd24gdG8gdGhlIGxvd2VzdCBsZXZlbCAobGV2ZWwgMCkuIEZvciBlYWNoIHByZXNlcnZlZCBwYWdlIGZvdW5kLCBpdCBpbnZva2VzXG4tICogdGhlIHByb3ZpZGVkIGNhbGxiYWNrLCBwYXNzaW5nIHRoZSBwYWdlJ3MgcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXIuXG4rICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcmFkaXggdHJlZSwgc2VhcmNoaW5nIGZyb20gdGhlIHRvcCBsZXZlbCBkb3duIHRvIHRoZVxuKyAqIGxvd2VzdCBsZXZlbCAobGV2ZWwgMCksIGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MuXG4gICpcbiAgKiBSZXR1cm46IDAgaWYgdGhlIHdhbGsgY29tcGxldGVkIHRoZSBzcGVjaWZpZWQgdHJlZSwgb3IgdGhlIG5vbi16ZXJvIHJldHVyblxuICAqICAgICAgICAgdmFsdWUgZnJvbSB0aGUgY2FsbGJhY2sgdGhhdCBzdG9wcGVkIHRoZSB3YWxrLlxuICAqL1xuIGludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbi1cdFx0XHRraG9fcmFkaXhfdHJlZV93YWxrX2NhbGxiYWNrX3QgY2IpXG4rXHRcdFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSlcbiB7XG4gXHRpZiAoV0FSTl9PTl9PTkNFKCF0cmVlLVx1MDAzZXJvb3QpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiBcdGd1YXJkKG11dGV4KShcdTAwMjZ0cmVlLVx1MDAzZWxvY2spO1xuIFxuLVx0cmV0dXJuIF9fa2hvX3JhZGl4X3dhbGtfdHJlZSh0cmVlLVx1MDAzZXJvb3QsIEtIT19UUkVFX01BWF9ERVBUSCAtIDEsIDAsIGNiKTtcbitcdHJldHVybiBfX2tob19yYWRpeF93YWxrX3RyZWUodHJlZS1cdTAwM2Vyb290LCBLSE9fVFJFRV9NQVhfREVQVEggLSAxLCAwLCBjYixcbitcdFx0XHRcdCAgICAgZGF0YSk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yYWRpeF93YWxrX3RyZWUpO1xuIFxuQEAgLTQ4NCwxMyArNTk5LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqX19pbml0IGtob19nZXRfcHJlc2VydmVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyxcbiBcdHJldHVybiBwZm5fdG9fcGFnZShwZm4pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9faW5pdCBraG9fcHJlc2VydmVkX21lbW9yeV9yZXNlcnZlKHBoeXNfYWRkcl90IHBoeXMsXG4tXHRcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4rc3RhdGljIGludCBfX2luaXQga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSh1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcbiB7XG4gXHR1bmlvbiBraG9fcGFnZV9pbmZvIGluZm87XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdHVuc2lnbmVkIGludCBvcmRlcjtcbitcdHBoeXNfYWRkcl90IHBoeXM7XG4gXHR1NjQgc3o7XG4gXG4rXHRwaHlzID0ga2hvX2RlY29kZV9yYWRpeF9rZXkoa2V5LCBcdTAwMjZvcmRlcik7XG4rXG4gXHRzeiA9IDEgXHUwMDNjXHUwMDNjIChvcmRlciArIFBBR0VfU0hJRlQpO1xuIFx0cGFnZSA9IGtob19nZXRfcHJlc2VydmVkX3BhZ2UocGh5cywgb3JkZXIpO1xuIFxuQEAgLTUwNCwxOSArNjIyLDI0IEBAIHN0YXRpYyBpbnQgX19pbml0IGtob19wcmVzZXJ2ZWRfbWVtb3J5X3Jlc2VydmUocGh5c19hZGRyX3QgcGh5cyxcbiBcdHJldHVybiAwO1xuIH1cbiBcbi0vKiBSZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovXG4tc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBraG9fZ2V0X21lbV9tYXBfcGh5cyhjb25zdCB2b2lkICpmZHQpXG4rLyogUmV0dXJucyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHByZXNlcnZlZCBtZW1vcnkgbWFwIGZyb20gRkRUICovXG4rc3RhdGljIF9faW5pdCB2b2lkICpraG9fZ2V0X21lbV9tYXAoY29uc3Qgdm9pZCAqZmR0KVxuIHtcbiBcdGNvbnN0IHZvaWQgKm1lbV9wdHI7XG4rXHRwaHlzX2FkZHJfdCBtZW1fbWFwX3BoeXM7XG4gXHRpbnQgbGVuO1xuIFxuIFx0bWVtX3B0ciA9IGZkdF9nZXRwcm9wKGZkdCwgMCwgS0hPX0ZEVF9NRU1PUllfTUFQX1BST1BfTkFNRSwgXHUwMDI2bGVuKTtcbiBcdGlmICghbWVtX3B0ciB8fCBsZW4gIT0gc2l6ZW9mKHU2NCkpIHtcbiBcdFx0cHJfZXJyKFwiZmFpbGVkIHRvIGdldCBwcmVzZXJ2ZWQgbWVtb3J5IG1hcFxcblwiKTtcbi1cdFx0cmV0dXJuIDA7XG4rXHRcdHJldHVybiBOVUxMO1xuIFx0fVxuIFxuLVx0cmV0dXJuIGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKW1lbV9wdHIpO1xuK1x0bWVtX21hcF9waHlzID0gZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTY0ICopbWVtX3B0cik7XG4rXHRpZiAoIW1lbV9tYXBfcGh5cylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRyZXR1cm4gcGh5c190b192aXJ0KG1lbV9tYXBfcGh5cyk7XG4gfVxuIFxuIC8qXG5AQCAtNjE5LDE5ICs3NDIsMjQgQEAgZWFybHlfcGFyYW0oXCJraG9fc2NyYXRjaFwiLCBraG9fcGFyc2Vfc2NyYXRjaF9zaXplKTtcbiBzdGF0aWMgdm9pZCBfX2luaXQgc2NyYXRjaF9zaXplX3VwZGF0ZSh2b2lkKVxuIHtcbiBcdC8qXG4tXHQgKiBJZiBmaXhlZCBzaXplcyBhcmUgbm90IHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUsIGNhbGN1bGF0ZSB0aGVtXG4tXHQgKiBub3cuXG4rXHQgKiBJZiBmaXhlZCBzaXplcyBhcmUgbm90IHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUsIGNhbGN1bGF0ZSB0aGVtIG5vdy5cbitcdCAqIFJlbW92ZSBIdWdlVExCIGFsbG9jYXRpb25zIGZyb20gaXQgYmVjYXVzZSB0aGV5IG5ldmVyIGdldCBhbGxvY2F0ZWRcbitcdCAqIGZyb20gc2NyYXRjaC5cbiBcdCAqL1xuIFx0aWYgKHNjcmF0Y2hfc2NhbGUpIHtcbiBcdFx0cGh5c19hZGRyX3Qgc2l6ZTtcbiBcbiBcdFx0c2l6ZSA9IG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShBUkNIX0xPV19BRERSRVNTX0xJTUlULFxuIFx0XHRcdFx0XHRcdCAgIE5VTUFfTk9fTk9ERSk7XG4rXHRcdHNpemUgLT0gbWVtYmxvY2tfcmVzZXJ2ZWRfaHVnZXRsYl9zaXplKEFSQ0hfTE9XX0FERFJFU1NfTElNSVQsXG4rXHRcdFx0XHRcdFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XG4gXHRcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMDtcbiBcdFx0c2NyYXRjaF9zaXplX2xvd21lbSA9IHNpemU7XG4gXG4gXHRcdHNpemUgPSBtZW1ibG9ja19yZXNlcnZlZF9rZXJuX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsXG4gXHRcdFx0XHRcdFx0ICAgTlVNQV9OT19OT0RFKTtcbitcdFx0c2l6ZSAtPSBtZW1ibG9ja19yZXNlcnZlZF9odWdldGxiX3NpemUoTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsXG4rXHRcdFx0XHRcdFx0ICAgICAgIE5VTUFfTk9fTk9ERSk7XG4gXHRcdHNpemUgPSBzaXplICogc2NyYXRjaF9zY2FsZSAvIDEwMCAtIHNjcmF0Y2hfc2l6ZV9sb3dtZW07XG4gXHRcdHNjcmF0Y2hfc2l6ZV9nbG9iYWwgPSBzaXplO1xuIFx0fVxuQEAgLTY1MSw2ICs3NzksOSBAQCBzdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHNjcmF0Y2hfc2l6ZV9ub2RlKGludCBuaWQpXG4gXHRpZiAoc2NyYXRjaF9zY2FsZSkge1xuIFx0XHRzaXplID0gbWVtYmxvY2tfcmVzZXJ2ZWRfa2Vybl9zaXplKE1FTUJMT0NLX0FMTE9DX0FOWVdIRVJFLFxuIFx0XHRcdFx0XHRcdCAgIG5pZCk7XG4rXHRcdC8qIERvIG5vdCBjb3VudCBIdWdlVExCIHBhZ2VzLiAqL1xuK1x0XHRzaXplIC09IG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShNRU1CTE9DS19BTExPQ19BTllXSEVSRSxcbitcdFx0XHRcdFx0XHQgICAgICAgbmlkKTtcbiBcdFx0c2l6ZSA9IHNpemUgKiBzY3JhdGNoX3NjYWxlIC8gMTAwO1xuIFx0fSBlbHNlIHtcbiBcdFx0c2l6ZSA9IHNjcmF0Y2hfc2l6ZV9wZXJub2RlO1xuQEAgLTY1OSw2ICs3OTAsNDkgQEAgc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBzY3JhdGNoX3NpemVfbm9kZShpbnQgbmlkKVxuIFx0cmV0dXJuIHJvdW5kX3VwKHNpemUsIENNQV9NSU5fQUxJR05NRU5UX0JZVEVTKTtcbiB9XG4gXG4rYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxuK3tcbitcdHBoeXNfYWRkcl90IHNjcmF0Y2hfc3RhcnQsIHNjcmF0Y2hfZW5kO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBraG9fc2NyYXRjaF9jbnQ7IGkrKykge1xuK1x0XHRzY3JhdGNoX3N0YXJ0ID0ga2hvX3NjcmF0Y2hbaV0uYWRkcjtcbitcdFx0c2NyYXRjaF9lbmQgPSBraG9fc2NyYXRjaFtpXS5hZGRyICsga2hvX3NjcmF0Y2hbaV0uc2l6ZTtcbitcbitcdFx0aWYgKHBoeXMgXHUwMDNjIHNjcmF0Y2hfZW5kIFx1MDAyNlx1MDAyNiAocGh5cyArIHNpemUpIFx1MDAzZSBzY3JhdGNoX3N0YXJ0KVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisvKlxuKyAqIE1hcmsgYWxsIEtITyBzY3JhdGNoIHBhZ2VibG9ja3MgYmV0d2VlbiBzdGFydF9wZm4gYW5kIGVuZF9wZm4gYXNcbisgKiBNSUdSQVRFX0NNQS5cbisgKi9cbit2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbilcbit7XG4rXHRmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSBcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyBzY3JhdGNoX3N0YXJ0LCBzY3JhdGNoX2VuZCwgcGZuO1xuK1xuK1x0XHRzY3JhdGNoX3N0YXJ0ID0gUEhZU19QRk4oa2hvX3NjcmF0Y2hbaV0uYWRkcik7XG4rXHRcdHNjcmF0Y2hfZW5kID0gUEhZU19QRk4oa2hvX3NjcmF0Y2hbaV0uYWRkciArIGtob19zY3JhdGNoW2ldLnNpemUpO1xuK1xuK1x0XHQvKiBUYXJnZXQgcmFuZ2UgZG9lc24ndCBvdmVybGFwIHdpdGggc2NyYXRjaC4gKi9cbitcdFx0aWYgKHN0YXJ0X3BmbiBcdTAwM2U9IHNjcmF0Y2hfZW5kIHx8IGVuZF9wZm4gXHUwMDNjPSBzY3JhdGNoX3N0YXJ0KVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRwZm4gPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBzdGFydF9wZm4sIHNjcmF0Y2hfc3RhcnQpO1xuK1x0XHRwZm4gPSBwYWdlYmxvY2tfc3RhcnRfcGZuKHBmbik7XG4rXG4rXHRcdHdoaWxlIChwZm4gXHUwMDNjIGVuZF9wZm4gXHUwMDI2XHUwMDI2IHBmbiBcdTAwM2Mgc2NyYXRjaF9lbmQpIHtcbitcdFx0XHRpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwZm5fdG9fcGFnZShwZm4pLFxuK1x0XHRcdFx0XHRcdCAgIE1JR1JBVEVfQ01BLCBmYWxzZSk7XG4rXHRcdFx0cGZuICs9IHBhZ2VibG9ja19ucl9wYWdlcztcbitcdFx0fVxuK1x0fVxuK31cbitcbiAvKipcbiAgKiBraG9fcmVzZXJ2ZV9zY3JhdGNoIC0gUmVzZXJ2ZSBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IGZvciBrZXhlY1xuICAqXG5AQCAtNzQ2LDYgKzkyMCwxMjggQEAgc3RhdGljIHZvaWQgX19pbml0IGtob19yZXNlcnZlX3NjcmF0Y2godm9pZClcbiBcdGtob19lbmFibGUgPSBmYWxzZTtcbiB9XG4gXG4rLypcbisgKiBMb29rIGZvciBmcmVlIGJsb2NrcyBvZiAxRy4gVGhpcyBpcyBhIGhldXJpc3RpYyBjaG9zZW4gdG8gd29yayBlZmZpY2llbnRseVxuKyAqIHdpdGggbGFyZ2Ugc3lzdGVtcyB3aXRoIGh1bmRyZWRzIG9mIGdpZ2FieXRlcyBvZiBtZW1vcnkuIEl0IHdpbGwgd29yayBwb29ybHlcbisgKiBvbiBzbWFsbGVyIHN5c3RlbXMuIFRoZSBhbGdvcml0aG0gaXRzZWxmIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBhY3R1YWwgdmFsdWUsXG4rICogc28gaXQgY2FuIGJlIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgaGV1cmlzdGljIGxhdGVyIGlmIG5lZWRlZC5cbisgKi9cbisjZGVmaW5lIEtIT19FWFRfQkxLU0laRVx0XHRTWl8xR1xuKyNkZWZpbmUgS0hPX0VYVF9TSElGVFx0XHRjb25zdF9pbG9nMihLSE9fRVhUX0JMS1NJWkUpXG4rXG4rLyogQ2FsbGVkIGZvciB0aGUgS0hPIHByZXNlcnZlZCBtZW1vcnkgcmFkaXggdHJlZS4gKi9cbitzdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbGVhZih1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcbit7XG4rXHQvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqL1xuK1x0c3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlID0gZGF0YTtcbitcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4rXHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4rXHRpbnQgZXJyO1xuK1xuK1x0c3RhcnQgPSBraG9fZGVjb2RlX3JhZGl4X2tleShrZXksIFx1MDAyNm9yZGVyKTtcbitcdGVuZCA9IHN0YXJ0ICsgKDFVTCBcdTAwM2NcdTAwM2MgKG9yZGVyICsgUEFHRV9TSElGVCkpO1xuK1xuK1x0d2hpbGUgKHN0YXJ0IFx1MDAzYyBlbmQpIHtcbitcdFx0ZXJyID0ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwgc3RhcnQgXHUwMDNlXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdHJldHVybiBlcnI7XG4rXG4rXHRcdHN0YXJ0ICs9ICgxVUwgXHUwMDNjXHUwMDNjIEtIT19FWFRfU0hJRlQpO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIENhbGxlZCBmb3IgdGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUuICovXG4rc3RhdGljIGludCBfX2luaXQga2hvX2V4dF93YWxrX25vZGUocGh5c19hZGRyX3QgcGh5cywgdm9pZCAqZGF0YSlcbit7XG4rXHQvKiBSYWRpeCB0cmVlIHRyYWNraW5nIGZyZWUgYmxvY2tzLiAqL1xuK1x0c3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlID0gZGF0YTtcbitcbitcdHJldHVybiBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBwaHlzIFx1MDAzZVx1MDAzZSBLSE9fRVhUX1NISUZUKTtcbit9XG4rXG4rLyogQ2FsbGVkIGZvciB0aGUgZnJlZSBibG9jayByYWRpeCB0cmVlLiAqL1xuK3N0YXRpYyBpbnQgX19pbml0IGtob19leHRfbWFya19zY3JhdGNoKHVuc2lnbmVkIGxvbmcga2V5LCB2b2lkICpkYXRhKVxuK3tcbitcdHBoeXNfYWRkcl90ICpwcmV2X2VuZCA9IGRhdGE7XG4rXHRwaHlzX2FkZHJfdCBzdGFydCA9IGtleSBcdTAwM2NcdTAwM2MgS0hPX0VYVF9TSElGVDtcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoc3RhcnQgXHUwMDNlICpwcmV2X2VuZCkge1xuK1x0XHRlcnIgPSBtZW1ibG9ja19tYXJrX2tob19zY3JhdGNoKCpwcmV2X2VuZCwgc3RhcnQgLSAqcHJldl9lbmQpO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHQqcHJldl9lbmQgPSBzdGFydCArICgxVUwgXHUwMDNjXHUwMDNjIEtIT19FWFRfU0hJRlQpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qXG4rICoga2hvX2V4dGVuZF9zY3JhdGNoIC0gRXh0ZW5kIHRoZSBzY3JhdGNoIHJlZ2lvbnNcbisgKlxuKyAqIFRoZSBLSE8gcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlIG1peGVzIGJvdGggcGh5c2ljYWwgYWRkcmVzcyBhbmQgb3JkZXJcbisgKiBpbnRvIGEgc2luZ2xlIGtleS4gVGhpcyBtYWtlcyBpdCBoYXJkIHRvIGxvb2sgZm9yIGZyZWUgcmFuZ2VzIGRpcmVjdGx5LiBUaGlzXG4rICogZnVuY3Rpb24gZmlyc3Qgd2Fsa3MgdGhlIHJhZGl4IHRyZWUgYW5kIGRpZ2VzdHMgaXQgZG93biBpbnRvIGFub3RoZXIgcmFkaXhcbisgKiB0cmVlLCB3aG9zZSBrZXlzIGlkZW50aWZ5IGJsb2NrcyBvZiBLSE9fRVhUX1NISUZUIHdoaWNoIGNvbnRhaW4gcHJlc2VydmVkXG4rICogbWVtb3J5LlxuKyAqXG4rICogVGhlbiBpdCB3YWxrcyB0aGUgZGlnZXN0ZWQgcmFkaXggdHJlZSBhbmQgbWFya3MgZXZlcnl0aGluZyB0aGF0IGRvZXNuJ3QgaGF2ZVxuKyAqIHByZXNlcnZlZCBtZW1vcnkgYXMgc2NyYXRjaC5cbisgKlxuKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBzbyBpdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2NyYXRjaCBoYXNcbisgKiBhdmFpbGFibGUgc3BhY2UuXG4rICpcbisgKiBOT1RFOiBUaGUgcGFnZXMgb2YgdGhlIEtITyBwcmVzZXJ2ZWQgbWVtb3J5IHJhZGl4IHRyZWUgdGFibGVzIGFyZSBub3QgbWFya2VkXG4rICogYXMgcHJlc2VydmVkIGluIHRoZSBwcmVzZXJ2ZWQgbWVtb3J5IHRyZWUuIEJ1dCB0aGV5IGFyZSBleHBlY3RlZCB0byByZW1haW5cbisgKiB1bnRvdWNoZWQgdW50aWwgdGhlIHRyZWUgaXMgZnVsbHkgcGFyc2VkLiBTbyB0aGlzIGZ1bmN0aW9uIGFsc28gY29uc2lkZXJzXG4rICogdGhlbSB0byBiZSBcInByZXNlcnZlZCBtZW1vcnlcIiBhbmQgbWFya3MgdGhlaXIgYmxvY2tzIGFzIGJ1c3kuXG4rICpcbisgKiBOT1RFOiBlZmlfaW5pdCgpOjpyZXNlcnZlX3JlZ2lvbnMoKSByZW1vdmVzIGFsbCByZWdpb25zIGV4Y2VwdFxuKyAqIE1FTUJMT0NLX0tIT19TQ1JBVENILiBUaGlzIGZ1bmN0aW9uIGFkZHMgc3VjaCByZWdpb25zIGJ1dCB0aGV5IGFyZSBub3QgS0hPXG4rICogc2NyYXRjaCBtZW1vcnksIHNvIHRoZXkgc2hvdWxkIG5vdCBiZSByZW1vdmVkLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbHdheXMgYmVcbisgKiBjYWxsZWQgYWZ0ZXIgcmVzZXJ2ZV9yZWdpb25zKCkuXG4rICovXG4rc3RhdGljIHZvaWQgX19pbml0IGtob19leHRlbmRfc2NyYXRjaCh2b2lkKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBraG9fcmFkaXhfd2Fsa19jYiBraG9fY2IgPSB7XG4rXHRcdC5sZWFmID0ga2hvX2V4dF93YWxrX2xlYWYsXG4rXHRcdC5ub2RlID0ga2hvX2V4dF93YWxrX25vZGUsXG4rXHR9O1xuK1x0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiIGV4dF9jYiA9IHtcbitcdFx0LmxlYWYgPSBraG9fZXh0X21hcmtfc2NyYXRjaCxcbitcdH07XG4rXHRzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgcmFkaXg7XG4rXHRwaHlzX2FkZHJfdCBwcmV2X2VuZCA9IDA7XG4rXHRpbnQgZXJyID0gMDtcbitcbitcdGVyciA9IGtob19yYWRpeF9pbml0X3RyZWUoXHUwMDI2cmFkaXgsIE5VTEwpO1xuK1x0aWYgKGVycilcbitcdFx0Z290byBwcmludDtcbitcbitcdC8qIFdhbGsgdGhlIEtITyByYWRpeCB0cmVlIHRvIGZpbmQgYnVzeSBibG9ja3MuICovXG4rXHRlcnIgPSBraG9fcmFkaXhfd2Fsa190cmVlKFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBcdTAwMjZraG9fY2IsIFx1MDAyNnJhZGl4KTtcbitcdGlmIChlcnIpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LyogV2FsayB0aGUgYmxvY2tzIGFuZCBtYXJrIGV2ZXJ5dGhpbmcgYmV0d2VlbiBrZXlzIGFzIHNjcmF0Y2guICovXG4rXHRlcnIgPSBraG9fcmFkaXhfd2Fsa190cmVlKFx1MDAyNnJhZGl4LCBcdTAwMjZleHRfY2IsIFx1MDAyNnByZXZfZW5kKTtcbitcdGlmIChlcnIpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LyogTWFyayBldmVyeXRoaW5nIGZyb20gbGFzdCBidXN5IGJsb2NrIHRvIGVuZCBvZiBEUkFNLiAqL1xuK1x0aWYgKHByZXZfZW5kIFx1MDAzYyBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpKVxuK1x0XHRlcnIgPSBtZW1ibG9ja19tYXJrX2tob19zY3JhdGNoKHByZXZfZW5kLCBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpIC0gcHJldl9lbmQpO1xuK1xuK1x0LyogZmFsbHRocm91Z2ggKi9cbitvdXQ6XG4rXHRraG9fcmFkaXhfZGVzdHJveV90cmVlKFx1MDAyNnJhZGl4KTtcbitwcmludDpcbitcdGlmIChlcnIpXG4rXHRcdHByX2VycihcIkZhaWxlZCB0byBleHRlbmQgc2NyYXRjaDogJXBlXFxuXCIsIEVSUl9QVFIoZXJyKSk7XG4rfVxuK1xuIC8qKlxuICAqIGtob19hZGRfc3VidHJlZSAtIHJlY29yZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIHN1YiBibG9iIGluIEtITyByb290IHRyZWUuXG4gICogQG5hbWU6IG5hbWUgb2YgdGhlIHN1YiB0cmVlLlxuQEAgLTg1NiwxMCArMTE1MiwxMiBAQCBpbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IGZvbGlvX3Bmbihmb2xpbyk7XG4gXHRjb25zdCB1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXG4tXHRpZiAoV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHBmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCwgUEFHRV9TSVpFIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuK1x0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHKSBcdTAwMjZcdTAwMjZcbitcdCAgICBXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAocGZuIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZULCBQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIG9yZGVyKSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0cmV0dXJuIGtob19yYWRpeF9hZGRfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTtcbitcdHJldHVybiBraG9fcmFkaXhfYWRkX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLFxuK1x0XHRcdFx0XHRcdFx0ICAgIG9yZGVyKSk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9mb2xpbyk7XG4gXG5AQCAtODc3LDcgKzExNzUsNyBAQCB2b2lkIGtob191bnByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IGZvbGlvX3Bmbihmb2xpbyk7XG4gXHRjb25zdCB1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXG4tXHRraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4rXHRraG9fcmFkaXhfZGVsX2tleSh0cmVlLCBraG9fZW5jb2RlX3JhZGl4X2tleShQRk5fUEhZUyhwZm4pLCBvcmRlcikpO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChraG9fdW5wcmVzZXJ2ZV9mb2xpbyk7XG4gXG5AQCAtOTA2LDcgKzEyMDQsOCBAQCBzdGF0aWMgdm9pZCBfX2tob191bnByZXNlcnZlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcbiBcdHdoaWxlIChwZm4gXHUwMDNjIGVuZF9wZm4pIHtcbiBcdFx0b3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xuIFxuLVx0XHRraG9fcmFkaXhfZGVsX3BhZ2UodHJlZSwgcGZuLCBvcmRlcik7XG4rXHRcdGtob19yYWRpeF9kZWxfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXG4rXHRcdFx0XHRcdFx0XHQgICAgIG9yZGVyKSk7XG4gXG4gXHRcdHBmbiArPSAxIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiBcdH1cbkBAIC05MzEsNyArMTIzMCw4IEBAIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4gXHR1bnNpZ25lZCBsb25nIGZhaWxlZF9wZm4gPSAwO1xuIFx0aW50IGVyciA9IDA7XG4gXG4tXHRpZiAoV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbitcdGlmIChJU19FTkFCTEVEKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRykgXHUwMDI2XHUwMDI2XG4rXHQgICAgV0FSTl9PTihraG9fc2NyYXRjaF9vdmVybGFwKHN0YXJ0X3BmbiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbiBcdFx0XHRcdFx0bnJfcGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpKSkge1xuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdH1cbkBAIC05MzksNyArMTIzOSw4IEBAIGludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4gXHR3aGlsZSAocGZuIFx1MDAzYyBlbmRfcGZuKSB7XG4gXHRcdHVuc2lnbmVkIGludCBvcmRlciA9IF9fa2hvX3ByZXNlcnZlX3BhZ2VzX29yZGVyKHBmbiwgZW5kX3Bmbik7XG4gXG4tXHRcdGVyciA9IGtob19yYWRpeF9hZGRfcGFnZSh0cmVlLCBwZm4sIG9yZGVyKTtcbitcdFx0ZXJyID0ga2hvX3JhZGl4X2FkZF9rZXkodHJlZSwga2hvX2VuY29kZV9yYWRpeF9rZXkoUEZOX1BIWVMocGZuKSxcbitcdFx0XHRcdFx0XHRcdFx0ICAgb3JkZXIpKTtcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGZhaWxlZF9wZm4gPSBwZm47XG4gXHRcdFx0YnJlYWs7XG5AQCAtMTMxNSwyMiArMTYxNiw2IEBAIHZvaWQga2hvX3Jlc3RvcmVfZnJlZSh2b2lkICptZW0pXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yZXN0b3JlX2ZyZWUpO1xuIFxuLXN0cnVjdCBraG9faW4ge1xuLVx0cGh5c19hZGRyX3QgZmR0X3BoeXM7XG4tXHRwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXM7XG4tXHRjaGFyIHByZXZpb3VzX3JlbGVhc2VbX19ORVdfVVRTX0xFTiArIDFdO1xuLVx0dTMyIGtleGVjX2NvdW50O1xuLVx0c3RydWN0IGtob19kZWJ1Z2ZzIGRiZztcbi19O1xuLVxuLXN0YXRpYyBzdHJ1Y3Qga2hvX2luIGtob19pbiA9IHtcbi19O1xuLVxuLXN0YXRpYyBjb25zdCB2b2lkICpraG9fZ2V0X2ZkdCh2b2lkKVxuLXtcbi1cdHJldHVybiBraG9faW4uZmR0X3BoeXMgPyBwaHlzX3RvX3ZpcnQoa2hvX2luLmZkdF9waHlzKSA6IE5VTEw7XG4tfVxuLVxuIC8qKlxuICAqIGlzX2tob19ib290IC0gY2hlY2sgaWYgY3VycmVudCBrZXJuZWwgd2FzIGJvb3RlZCB2aWEgS0hPLWVuYWJsZWRcbiAgKiBrZXhlY1xuQEAgLTEzOTgsMjYgKzE2ODMsMjQgQEAgaW50IGtob19yZXRyaWV2ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKm5hbWUsIHBoeXNfYWRkcl90ICpwaHlzLCBzaXplX3QgKnNpemUpXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGtob19yZXRyaWV2ZV9zdWJ0cmVlKTtcbiBcbi1zdGF0aWMgaW50IF9faW5pdCBraG9fbWVtX3JldHJpZXZlKGNvbnN0IHZvaWQgKmZkdClcbitzdGF0aWMgdm9pZCBfX2luaXQga2hvX21lbV9yZXRyaWV2ZSh2b2lkKVxuIHtcbi1cdHN0cnVjdCBraG9fcmFkaXhfdHJlZSB0cmVlO1xuLVx0Y29uc3QgcGh5c19hZGRyX3QgKm1lbTtcbi1cdGludCBsZW47XG4rXHRjb25zdCBzdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2IgY2IgPSB7XG4rXHRcdC5sZWFmID0ga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSxcbitcdH07XG4gXG4tXHQvKiBSZXRyaWV2ZSB0aGUgS0hPIHJhZGl4IHRyZWUgZnJvbSBwYXNzZWQtaW4gRkRULiAqL1xuLVx0bWVtID0gZmR0X2dldHByb3AoZmR0LCAwLCBLSE9fRkRUX01FTU9SWV9NQVBfUFJPUF9OQU1FLCBcdTAwMjZsZW4pO1xuK1x0aWYgKGtob19yYWRpeF93YWxrX3RyZWUoXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIFx1MDAyNmNiLCBOVUxMKSlcbitcdFx0Z290byBlcnI7XG4gXG4tXHRpZiAoIW1lbSB8fCBsZW4gIT0gc2l6ZW9mKCptZW0pKSB7XG4tXHRcdHByX2VycihcImZhaWxlZCB0byBnZXQgcHJlc2VydmVkIEtITyBtZW1vcnkgdHJlZVxcblwiKTtcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4tXHR9XG4tXG4tXHRpZiAoISptZW0pXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0cmV0dXJuO1xuIFxuLVx0dHJlZS5yb290ID0gcGh5c190b192aXJ0KCptZW0pO1xuLVx0bXV0ZXhfaW5pdChcdTAwMjZ0cmVlLmxvY2spO1xuLVx0cmV0dXJuIGtob19yYWRpeF93YWxrX3RyZWUoXHUwMDI2dHJlZSwga2hvX3ByZXNlcnZlZF9tZW1vcnlfcmVzZXJ2ZSk7XG4rZXJyOlxuK1x0LypcbitcdCAqIEZhaWxlZCB0byBpbml0aWFsaXplIHByZXNlcnZlZCBtZW1vcnkuIENsZWFyIEZEVCBhbmQgcmFkaXggc28gS0hPXG4rXHQgKiB1c2VycyBkb24ndCB0cmVhdCBpdCBhcyBhIEtITyBib290LlxuK1x0ICovXG4rXHRraG9faW4uZmR0X3BoeXMgPSAwO1xuK1x0a2hvX2luLnJhZGl4X3RyZWUucm9vdCA9IE5VTEw7XG4gfVxuIFxuIHN0YXRpYyBfX2luaXQgaW50IGtob19vdXRfZmR0X3NldHVwKHZvaWQpXG5AQCAtMTU0MywxNiArMTgyNiwxNCBAQCBzdGF0aWMgX19pbml0IGludCBraG9faW5pdCh2b2lkKVxuIFx0aWYgKCFraG9fZW5hYmxlKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHRyZWUtXHUwMDNlcm9vdCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghdHJlZS1cdTAwM2Vyb290KSB7XG4tXHRcdGVyciA9IC1FTk9NRU07XG4rXHRlcnIgPSBraG9fcmFkaXhfaW5pdF90cmVlKHRyZWUsIE5VTEwpO1xuK1x0aWYgKGVycilcbiBcdFx0Z290byBlcnJfZnJlZV9zY3JhdGNoO1xuLVx0fVxuIFxuIFx0a2hvX291dC5mZHQgPSBraG9fYWxsb2NfcHJlc2VydmUoUEFHRV9TSVpFKTtcbiBcdGlmIChJU19FUlIoa2hvX291dC5mZHQpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoa2hvX291dC5mZHQpO1xuLVx0XHRnb3RvIGVycl9mcmVlX2tob19yYWRpeF90cmVlX3Jvb3Q7XG4rXHRcdGdvdG8gZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU7XG4gXHR9XG4gXG4gXHRlcnIgPSBraG9fZGVidWdmc19pbml0KCk7XG5AQCAtMTYwMyw5ICsxODg0LDggQEAgc3RhdGljIF9faW5pdCBpbnQga2hvX2luaXQodm9pZClcbiBcbiBlcnJfZnJlZV9mZHQ6XG4gXHRraG9fdW5wcmVzZXJ2ZV9mcmVlKGtob19vdXQuZmR0KTtcbi1lcnJfZnJlZV9raG9fcmFkaXhfdHJlZV9yb290OlxuLVx0a2ZyZWUodHJlZS1cdTAwM2Vyb290KTtcbi1cdHRyZWUtXHUwMDNlcm9vdCA9IE5VTEw7XG4rZXJyX2ZyZWVfa2hvX3JhZGl4X3RyZWU6XG4rXHRraG9fcmFkaXhfZGVzdHJveV90cmVlKHRyZWUpO1xuIGVycl9mcmVlX3NjcmF0Y2g6XG4gXHRraG9fb3V0LmZkdCA9IE5VTEw7XG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mga2hvX3NjcmF0Y2hfY250OyBpKyspIHtcbkBAIC0xNjE5LDE2ICsxODk5LDQzIEBAIHN0YXRpYyBfX2luaXQgaW50IGtob19pbml0KHZvaWQpXG4gfVxuIGZzX2luaXRjYWxsKGtob19pbml0KTtcbiBcbi12b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXQodm9pZClcbit2b2lkIF9faW5pdCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZClcbiB7XG4tXHRpZiAoa2hvX2luLnNjcmF0Y2hfcGh5cykge1xuLVx0XHRraG9fc2NyYXRjaCA9IHBoeXNfdG9fdmlydChraG9faW4uc2NyYXRjaF9waHlzKTtcbitcdGNvbnN0IHZvaWQgKmZkdCA9IGtob19nZXRfZmR0KCk7XG4gXG4tXHRcdGlmIChraG9fbWVtX3JldHJpZXZlKGtob19nZXRfZmR0KCkpKVxuLVx0XHRcdGtob19pbi5mZHRfcGh5cyA9IDA7XG4tXHR9IGVsc2Uge1xuLVx0XHRraG9fcmVzZXJ2ZV9zY3JhdGNoKCk7XG4rXHRpZiAoIWlzX2tob19ib290KCkpXG4rXHRcdHJldHVybjtcbitcbitcdC8qXG4rXHQgKiBraG9fc2NyYXRjaF9vdmVybGFwKCkgbmVlZHMga2hvX3NjcmF0Y2ggdG8gYmUgaW5pdGlhbGl6ZWQuIEl0XG4rXHQgKiBpcyB1c2VkIGJ5IGZyZWVfYXJlYV9pbml0KCkgb24gS0hPIGJvb3RzLCBzbyBpbml0aWFsaXplIGl0XG4rXHQgKiBlYXJseS5cbitcdCAqL1xuK1x0a2hvX3NjcmF0Y2ggPSBwaHlzX3RvX3ZpcnQoa2hvX2luLnNjcmF0Y2hfcGh5cyk7XG4rXG4rXHQvKlxuK1x0ICoga2hvX2dldF9tZW1fbWFwKCkgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLiBJZiBpdCBmYWlscywga2hvX3BvcHVsYXRlKClcbitcdCAqIGNhdGNoZXMgdGhhdCBhbmQgbmV2ZXIgc2V0cyBraG9faW4uZmR0X3BoeXMuXG4rXHQgKi9cbitcdGlmIChraG9fcmFkaXhfaW5pdF90cmVlKFx1MDAyNmtob19pbi5yYWRpeF90cmVlLCBraG9fZ2V0X21lbV9tYXAoZmR0KSkpIHtcbitcdFx0LypcbitcdFx0ICogRmFpbGVkIHRvIGluaXRpYWxpemUgcHJlc2VydmVkIG1lbW9yeSByYWRpeCB0cmVlLiBDbGVhciBGRFRcbitcdFx0ICogYW5kIHNjcmF0Y2ggc28gS0hPIHVzZXJzIGRvbid0IHRyZWF0IGl0IGFzIGEgS0hPIGJvb3QuXG4rXHRcdCAqL1xuK1x0XHRraG9faW4uZmR0X3BoeXMgPSAwO1xuK1x0XHRraG9faW4uc2NyYXRjaF9waHlzID0gMDtcbitcdFx0cmV0dXJuO1xuIFx0fVxuK1xuK1x0a2hvX2V4dGVuZF9zY3JhdGNoKCk7XG4rfVxuK1xuK3ZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdCh2b2lkKVxuK3tcbitcdGlmIChraG9faW4uc2NyYXRjaF9waHlzKVxuK1x0XHRraG9fbWVtX3JldHJpZXZlKCk7XG4rXHRlbHNlXG4rXHRcdGtob19yZXNlcnZlX3NjcmF0Y2goKTtcbiB9XG4gXG4gdm9pZCBfX2luaXQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcbkBAIC0xNjM2LDkgKzE5NDMsOCBAQCB2b2lkIF9faW5pdCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLFxuIHtcbiBcdHVuc2lnbmVkIGludCBzY3JhdGNoX2NudCA9IHNjcmF0Y2hfbGVuIC8gc2l6ZW9mKCpraG9fc2NyYXRjaCk7XG4gXHRzdHJ1Y3Qga2hvX3NjcmF0Y2ggKnNjcmF0Y2ggPSBOVUxMO1xuLVx0cGh5c19hZGRyX3QgbWVtX21hcF9waHlzO1xuLVx0dm9pZCAqZmR0ID0gTlVMTDtcbiBcdGJvb2wgcG9wdWxhdGVkID0gZmFsc2U7XG4rXHR2b2lkICpmZHQgPSBOVUxMO1xuIFx0aW50IGVycjtcbiBcbiBcdC8qIFZhbGlkYXRlIHRoZSBpbnB1dCBGRFQgKi9cbkBAIC0xNjYwLDggKzE5NjYsMTMgQEAgdm9pZCBfX2luaXQga2hvX3BvcHVsYXRlKHBoeXNfYWRkcl90IGZkdF9waHlzLCB1NjQgZmR0X2xlbixcbiBcdFx0Z290byB1bm1hcF9mZHQ7XG4gXHR9XG4gXG4tXHRtZW1fbWFwX3BoeXMgPSBraG9fZ2V0X21lbV9tYXBfcGh5cyhmZHQpO1xuLVx0aWYgKCFtZW1fbWFwX3BoeXMpXG4rXHQvKlxuK1x0ICogQXQgdGhpcyBwb2ludCBwaHlzX3RvX3ZpcnQoKSBkb2Vzbid0IHdvcmsgcHJvcGVybHkgYW5kIHNvXG4rXHQgKiBraG9fZ2V0X21lbV9tYXAoKSBjYW4gcmV0dXJuIGEgcHJlLUtBU0xSIHZpcnR1YWwgYWRkcmVzcy4gQnV0IGhlcmUgd2VcbitcdCAqIG9ubHkgd2FudCB0byBtYWtlIHN1cmUgdGhlIG1lbV9tYXAgaXMgdmFsaWQgc28gdGhlIGFjdHVhbCB2YWx1ZVxuK1x0ICogZG9lc24ndCBtYXR0ZXIgYXMgbG9uZyBhcyBpdCBpc24ndCBOVUxMLlxuK1x0ICovXG4rXHRpZiAoIWtob19nZXRfbWVtX21hcChmZHQpKVxuIFx0XHRnb3RvIHVubWFwX2ZkdDtcbiBcbiBcdHNjcmF0Y2ggPSBlYXJseV9tZW1yZW1hcChzY3JhdGNoX3BoeXMsIHNjcmF0Y2hfbGVuKTtcbmRpZmYgLS1naXQgYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIGIva2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXJfZGVidWcuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA2ZWZiNjk2ZjU0MjYxMi4uMDAwMDAwMDAwMDAwMDBcbi0tLSBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2RlYnVnLmNcbisrKyAvZGV2L251bGxcbkBAIC0xLDI1ICswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBrZXhlY19oYW5kb3Zlcl9kZWJ1Zy5jIC0ga2V4ZWMgaGFuZG92ZXIgb3B0aW9uYWwgZGVidWcgZnVuY3Rpb25hbGl0eVxuLSAqIENvcHlyaWdodCAoQykgMjAyNSBHb29nbGUgTExDLCBQYXNoYSBUYXRhc2hpbiBcdTAwM2NwYXNoYS50YXRhc2hpbkBzb2xlZW4uY29tXHUwMDNlXG4tICovXG4tXG4tI2RlZmluZSBwcl9mbXQoZm10KSBcIktITzogXCIgZm10XG4tXG4tI2luY2x1ZGUgXCJrZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXCJcbi1cbi1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4te1xuLVx0cGh5c19hZGRyX3Qgc2NyYXRjaF9zdGFydCwgc2NyYXRjaF9lbmQ7XG4tXHR1bnNpZ25lZCBpbnQgaTtcbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIGtob19zY3JhdGNoX2NudDsgaSsrKSB7XG4tXHRcdHNjcmF0Y2hfc3RhcnQgPSBraG9fc2NyYXRjaFtpXS5hZGRyO1xuLVx0XHRzY3JhdGNoX2VuZCA9IGtob19zY3JhdGNoW2ldLmFkZHIgKyBraG9fc2NyYXRjaFtpXS5zaXplO1xuLVxuLVx0XHRpZiAocGh5cyBcdTAwM2Mgc2NyYXRjaF9lbmQgXHUwMDI2XHUwMDI2IChwaHlzICsgc2l6ZSkgXHUwMDNlIHNjcmF0Y2hfc3RhcnQpXG4tXHRcdFx0cmV0dXJuIHRydWU7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyX2ludGVybmFsLmggYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG5pbmRleCAwMzk5ZmYxMDc3NzUwYi4uODA1ZDJhNzZjMzg4MTggMTAwNjQ0XG4tLS0gYS9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG4rKysgYi9rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlcl9pbnRlcm5hbC5oXG5AQCAtNDEsMTMgKzQxLDQgQEAgc3RhdGljIGlubGluZSB2b2lkIGtob19kZWJ1Z2ZzX2Jsb2JfcmVtb3ZlKHN0cnVjdCBraG9fZGVidWdmcyAqZGJnLFxuIFx0XHRcdFx0XHQgICB2b2lkICpibG9iKSB7IH1cbiAjZW5kaWYgLyogQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHRlMgKi9cbiBcbi0jaWZkZWYgQ09ORklHX0tFWEVDX0hBTkRPVkVSX0RFQlVHXG4tYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKTtcbi0jZWxzZVxuLXN0YXRpYyBpbmxpbmUgYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxuLXtcbi1cdHJldHVybiBmYWxzZTtcbi19XG4tI2VuZGlmIC8qIENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRyAqL1xuLVxuICNlbmRpZiAvKiBMSU5VWF9LRVhFQ19IQU5ET1ZFUl9JTlRFUk5BTF9IICovXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jXG5pbmRleCA1NzEyMTJiODA4MzVlYy4uYWI0YWZjODE4ZThjYmQgMTAwNjQ0XG4tLS0gYS9tbS9odWdldGxiLmNcbisrKyBiL21tL2h1Z2V0bGIuY1xuQEAgLTMwMzMsMjkgKzMwMzMsMjEgQEAgc3RhdGljIF9faW5pdCB2b2lkICphbGxvY19ib290bWVtKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQsIGJvb2wgbm9kZV9leGFjdClcbiBcdGlmIChodWdldGxiX2Vhcmx5X2NtYShoKSlcbiBcdFx0bSA9IGh1Z2V0bGJfY21hX2FsbG9jX2Jvb3RtZW0oaCwgXHUwMDI2bGlzdG5vZGUsIG5vZGVfZXhhY3QpO1xuIFx0ZWxzZSB7XG4tXHRcdGlmIChub2RlX2V4YWN0KVxuLVx0XHRcdG0gPSBtZW1ibG9ja19hbGxvY19leGFjdF9uaWRfcmF3KGh1Z2VfcGFnZV9zaXplKGgpLFxuLVx0XHRcdFx0aHVnZV9wYWdlX3NpemUoaCksIDAsXG4tXHRcdFx0XHRNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFLCBuaWQpO1xuLVx0XHRlbHNlIHtcbi1cdFx0XHRtID0gbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoaHVnZV9wYWdlX3NpemUoaCksXG4tXHRcdFx0XHRodWdlX3BhZ2Vfc2l6ZShoKSwgMCxcbi1cdFx0XHRcdE1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUsIG5pZCk7XG4rXHRcdG0gPSBtZW1ibG9ja19hbGxvY19odWdldGxiKGh1Z2VfcGFnZV9zaXplKGgpLCBuaWQsIG5vZGVfZXhhY3QpO1xuK1x0XHRpZiAobSkge1xuK1x0XHRcdG0tXHUwMDNlZmxhZ3MgPSAwO1xuK1x0XHRcdG0tXHUwMDNlY21hID0gTlVMTDtcbitcbiBcdFx0XHQvKlxuIFx0XHRcdCAqIEZvciBwcmUtSFZPIHRvIHdvcmsgY29ycmVjdGx5LCBwYWdlcyBuZWVkIHRvIGJlIG9uXG4gXHRcdFx0ICogdGhlIGxpc3QgZm9yIHRoZSBub2RlIHRoZXkgd2VyZSBhY3R1YWxseSBhbGxvY2F0ZWRcbiBcdFx0XHQgKiBmcm9tLiBUaGF0IG5vZGUgbWF5IGJlIGRpZmZlcmVudCBpbiB0aGUgY2FzZSBvZlxuLVx0XHRcdCAqIGZhbGxiYWNrIGJ5IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3LiBTbyxcbitcdFx0XHQgKiBmYWxsYmFjayBieSBtZW1ibG9ja19hbGxvY19odWdldGxiX2Jvb3RtZW0uIFNvLFxuIFx0XHRcdCAqIGV4dHJhY3QgdGhlIGFjdHVhbCBub2RlIGZpcnN0LlxuIFx0XHRcdCAqL1xuLVx0XHRcdGlmIChtKVxuK1x0XHRcdGlmICghbm9kZV9leGFjdClcbiBcdFx0XHRcdGxpc3Rub2RlID0gZWFybHlfcGZuX3RvX25pZChQSFlTX1BGTihfX3BhKG0pKSk7XG4gXHRcdH1cbi1cbi1cdFx0aWYgKG0pIHtcbi1cdFx0XHRtLVx1MDAzZWZsYWdzID0gMDtcbi1cdFx0XHRtLVx1MDAzZWNtYSA9IE5VTEw7XG4tXHRcdH1cbiBcdH1cbiBcbiBcdGlmIChtKSB7XG5kaWZmIC0tZ2l0IGEvbW0vbWVtYmxvY2suYyBiL21tL21lbWJsb2NrLmNcbmluZGV4IDYzNDljNDgxNTRmNGIxLi5jMTBkZmIwNTQ4MDZhNyAxMDA2NDRcbi0tLSBhL21tL21lbWJsb2NrLmNcbisrKyBiL21tL21lbWJsb2NrLmNcbkBAIC0xNTA2LDYgKzE1MDYsMzIgQEAgaW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19zZXRfbm9kZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyB2b2lkIG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3Qgc2l6ZSxcbitcdFx0XHRcdCAgICAgYm9vbCBsZWFrdHJhY2UpXG4re1xuK1x0LypcbitcdCAqIFNraXAga21lbWxlYWsgZm9yIHRob3NlIHBsYWNlcyBsaWtlIGthc2FuX2luaXQoKSBhbmRcbitcdCAqIGVhcmx5X3BndGFibGVfYWxsb2MoKSBkdWUgdG8gaGlnaCB2b2x1bWUuXG4rXHQgKi9cbitcdGlmIChsZWFrdHJhY2UpXG4rXHRcdC8qXG4rXHRcdCAqIE1lbWJsb2NrIGFsbG9jYXRlZCBibG9ja3MgYXJlIG5ldmVyIHJlcG9ydGVkIGFzXG4rXHRcdCAqIGxlYWtzLiBUaGlzIGlzIGJlY2F1c2UgbWFueSBvZiB0aGVzZSBibG9ja3MgYXJlXG4rXHRcdCAqIG9ubHkgcmVmZXJyZWQgdmlhIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoaWNoIGlzXG4rXHRcdCAqIG5vdCBsb29rZWQgdXAgYnkga21lbWxlYWsuXG4rXHRcdCAqL1xuK1x0XHRrbWVtbGVha19hbGxvY19waHlzKHN0YXJ0LCBzaXplLCAwKTtcbitcbitcdC8qXG4rXHQgKiBTb21lIFZpcnR1YWwgTWFjaGluZSBwbGF0Zm9ybXMsIHN1Y2ggYXMgSW50ZWwgVERYIG9yIEFNRCBTRVYtU05QLFxuK1x0ICogcmVxdWlyZSBtZW1vcnkgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGJ5IHRoZVxuK1x0ICogZ3Vlc3QuXG4rXHQgKlxuK1x0ICogQWNjZXB0IHRoZSBtZW1vcnkgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuXG4rXHQgKi9cbitcdGFjY2VwdF9tZW1vcnkoc3RhcnQsIHNpemUpO1xuK31cbitcbiAvKipcbiAgKiBtZW1ibG9ja19hbGxvY19yYW5nZV9uaWQgLSBhbGxvY2F0ZSBib290IG1lbW9yeSBibG9ja1xuICAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgaW4gYnl0ZXNcbkBAIC0xNTgwLDI4ICsxNjA2LDcgQEAgcGh5c19hZGRyX3QgX19pbml0IG1lbWJsb2NrX2FsbG9jX3JhbmdlX25pZChwaHlzX2FkZHJfdCBzaXplLFxuIFx0cmV0dXJuIDA7XG4gXG4gZG9uZTpcbi1cdC8qXG4tXHQgKiBTa2lwIGttZW1sZWFrIGZvciB0aG9zZSBwbGFjZXMgbGlrZSBrYXNhbl9pbml0KCkgYW5kXG4tXHQgKiBlYXJseV9wZ3RhYmxlX2FsbG9jKCkgZHVlIHRvIGhpZ2ggdm9sdW1lLlxuLVx0ICovXG4tXHRpZiAoZW5kICE9IE1FTUJMT0NLX0FMTE9DX05PTEVBS1RSQUNFKVxuLVx0XHQvKlxuLVx0XHQgKiBNZW1ibG9jayBhbGxvY2F0ZWQgYmxvY2tzIGFyZSBuZXZlciByZXBvcnRlZCBhc1xuLVx0XHQgKiBsZWFrcy4gVGhpcyBpcyBiZWNhdXNlIG1hbnkgb2YgdGhlc2UgYmxvY2tzIGFyZVxuLVx0XHQgKiBvbmx5IHJlZmVycmVkIHZpYSB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGljaCBpc1xuLVx0XHQgKiBub3QgbG9va2VkIHVwIGJ5IGttZW1sZWFrLlxuLVx0XHQgKi9cbi1cdFx0a21lbWxlYWtfYWxsb2NfcGh5cyhmb3VuZCwgc2l6ZSwgMCk7XG4tXG4tXHQvKlxuLVx0ICogU29tZSBWaXJ0dWFsIE1hY2hpbmUgcGxhdGZvcm1zLCBzdWNoIGFzIEludGVsIFREWCBvciBBTUQgU0VWLVNOUCxcbi1cdCAqIHJlcXVpcmUgbWVtb3J5IHRvIGJlIGFjY2VwdGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBieSB0aGVcbi1cdCAqIGd1ZXN0LlxuLVx0ICpcbi1cdCAqIEFjY2VwdCB0aGUgbWVtb3J5IG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLlxuLVx0ICovXG4tXHRhY2NlcHRfbWVtb3J5KGZvdW5kLCBzaXplKTtcbi1cbitcdG1lbWJsb2NrX3ByZXBfYWxsb2NhdGlvbihmb3VuZCwgc2l6ZSwgZW5kICE9IE1FTUJMT0NLX0FMTE9DX05PTEVBS1RSQUNFKTtcbiBcdHJldHVybiBmb3VuZDtcbiB9XG4gXG5AQCAtMTc1Niw2ICsxNzYxLDY5IEBAIHZvaWQgKiBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZF9yYXcoXG4gXHRcdFx0XHQgICAgICAgZmFsc2UpO1xuIH1cbiBcbisvKipcbisgKiBtZW1ibG9ja19hbGxvY19odWdldGxiIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgZm9yIEh1Z2VUTEIgcGFnZXNcbisgKiBAc2l6ZTogICAgICBzaXplIG9mIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzXG4rICogQG5pZDogICAgICAgbmlkIG9mIHRoZSBmcmVlIG1lbW9yeSB0byBmaW5kLCAlTlVNQV9OT19OT0RFIGZvciBhbnkgbm9kZVxuKyAqIEBleGFjdF9uaWQ6IG9ubHkgYWxsb2NhdGUgZnJvbSB0aGUgc3BlY2lmaWVkIG5pZC4gSWYgJWZhbHNlLCB0aGUgc3BlY2lmaWVkXG4rICogICAgICAgICAgICAgbmlkIGlzIHRyaWVkIGZpcnN0LCBhbmQgdGhlbiBhbGwgbm9kZXMgYXJlIHRyaWVkIGFzIGZhbGxiYWNrLlxuKyAqXG4rICogSHVnZVRMQiBwYWdlcyBhcmUgYWx3YXlzIGFsaWduZWQgYnkgdGhlaXIgc2l6ZSwgc28gdGhlIGFsaWdubWVudCBtYXRjaGVzXG4rICogQHNpemUuIFNpbmNlIHRoZSBtZW1vcnkgaXMgZm9yIHVzZXJzcGFjZSwgbWlycm9yZWQgbWVtb3J5IGlzIG5vdCB1c2VkLiBUaGVcbisgKiBtZW1vcnkgaXMgbm90IHplcm9lZC4gRG9lcyBub3QgcGFuaWMgaWYgcmVxdWVzdCBjYW5ub3QgYmUgc2F0aXNmaWVkLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqIFZpcnR1YWwgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIG9uIHN1Y2Nlc3MsICVOVUxMIG9uIGZhaWx1cmUuXG4rICovXG4rdm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxuK3tcbitcdGVudW0gbWVtYmxvY2tfZmxhZ3MgZmxhZ3MgPSBjaG9vc2VfbWVtYmxvY2tfZmxhZ3MoKTtcbitcdHBoeXNfYWRkcl90IGFkZHIsIHN0YXJ0ID0gMCwgZW5kID0gTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRTtcbitcbitcdG1lbWJsb2NrX2RiZyhcIiVzOiAlbGx1IGJ5dGVzLCBuaWQ9JWQsIGV4YWN0X25pZD0lZCAlcFNcXG5cIiwgX19mdW5jX18sXG4rXHRcdCAgICAgKHU2NClzaXplLCBuaWQsIGV4YWN0X25pZCwgKHZvaWQgKilfUkVUX0lQXyk7XG4rXG4rXHQvKiBEb24ndCB3YXN0ZSBtaXJyb3JlZCBtZW1vcnkgb24gSHVnZVRMQiBwYWdlcy4gKi9cbitcdGZsYWdzIFx1MDAyNj0gfk1FTUJMT0NLX01JUlJPUjtcbityZXRyeTpcbitcdC8qIEh1Z2VUTEIgcGFnZXMgYXJlIGFsd2F5cyBhbGlnbmVkIGJ5IHRoZWlyIHNpemUuICovXG4rXHRhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZV9ub2RlKHNpemUsIHNpemUsIHN0YXJ0LCBlbmQsIG5pZCwgZmxhZ3MpO1xuK1x0aWYgKGFkZHIpXG4rXHRcdGdvdG8gZm91bmQ7XG4rXG4rXHQvKiBUcnkgYWxsIG5vZGVzIGlmIGFsbG93ZWQuICovXG4rXHRpZiAobnVtYV92YWxpZF9ub2RlKG5pZCkgXHUwMDI2XHUwMDI2ICFleGFjdF9uaWQpIHtcbitcdFx0bmlkID0gTlVNQV9OT19OT0RFO1xuK1x0XHRnb3RvIHJldHJ5O1xuK1x0fVxuK1xuK1x0LyogRm91bmQgbm90aGluZy4uLiA6LSggKi9cbitcdHJldHVybiBOVUxMO1xuK1xuK2ZvdW5kOlxuK1x0LypcbitcdCAqIEh1Z2VUTEIgcGFnZXMgY2FuIGJlIHByZXNlcnZlZCB3aXRoIEtITyBhbmQgbm8gcHJlc2VydmVkIG1lbW9yeSBjYW5cbitcdCAqIGJlIGluIHNjcmF0Y2guIFNvIHJldHJ5IGlmIGZvdW5kIGFkZHJlc3Mgb3ZlcmxhcHMgd2l0aCBzY3JhdGNoLlxuK1x0ICpcbitcdCAqIFNjcmF0Y2ggYXJlYXMgYXJlIG5vcm1hbGx5IG5vdCB2ZXJ5IGxhcmdlLCBzbyB0aGlzIHNob3VsZG4ndCB0YWtlIHRvb1xuK1x0ICogbWFueSByZXRyaWVzLlxuK1x0ICovXG4rXHRpZiAoa2hvX3NjcmF0Y2hfb3ZlcmxhcChhZGRyLCBzaXplKSkge1xuK1x0XHRpZiAobWVtYmxvY2tfYm90dG9tX3VwKCkpXG4rXHRcdFx0c3RhcnQgPSBhZGRyICsgc2l6ZTtcbitcdFx0ZWxzZVxuK1x0XHRcdHN0YXJ0ID0gYWRkciAtIHNpemU7XG4rXG4rXHRcdGdvdG8gcmV0cnk7XG4rXHR9XG4rXG4rXHRpZiAoX19tZW1ibG9ja19yZXNlcnZlKGFkZHIsIHNpemUsIG5pZCwgTUVNQkxPQ0tfUlNSVl9LRVJOIHwgTUVNQkxPQ0tfUlNSVl9IVUdFVExCKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRtZW1ibG9ja19wcmVwX2FsbG9jYXRpb24oYWRkciwgc2l6ZSwgdHJ1ZSk7XG4rXHRyZXR1cm4gcGh5c190b192aXJ0KGFkZHIpO1xuK31cbitcbiAvKipcbiAgKiBtZW1ibG9ja19hbGxvY190cnlfbmlkIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgYmxvY2tcbiAgKiBAc2l6ZTogc2l6ZSBvZiBtZW1vcnkgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIGluIGJ5dGVzXG5AQCAtMTgyNSw2ICsxODkzLDI4IEBAIHBoeXNfYWRkcl90IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19yZXNlcnZlZF9zaXplKHZvaWQpXG4gXHRyZXR1cm4gbWVtYmxvY2sucmVzZXJ2ZWQudG90YWxfc2l6ZTtcbiB9XG4gXG4rcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2h1Z2V0bGJfc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcbit7XG4rXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuK1x0cGh5c19hZGRyX3QgdG90YWwgPSAwO1xuK1xuK1x0Zm9yX2VhY2hfcmVzZXJ2ZWRfbWVtX3JlZ2lvbihyKSB7XG4rXHRcdHBoeXNfYWRkcl90IHNpemUgPSByLVx1MDAzZXNpemU7XG4rXG4rXHRcdGlmIChyLVx1MDAzZWJhc2UgXHUwMDNlIGxpbWl0KVxuK1x0XHRcdGJyZWFrO1xuK1xuK1x0XHRpZiAoci1cdTAwM2ViYXNlICsgci1cdTAwM2VzaXplIFx1MDAzZSBsaW1pdClcbitcdFx0XHRzaXplID0gbGltaXQgLSByLVx1MDAzZWJhc2U7XG4rXG4rXHRcdGlmIChuaWQgPT0gbWVtYmxvY2tfZ2V0X3JlZ2lvbl9ub2RlKHIpIHx8ICFudW1hX3ZhbGlkX25vZGUobmlkKSlcbitcdFx0XHRpZiAoci1cdTAwM2VmbGFncyBcdTAwMjYgTUVNQkxPQ0tfUlNSVl9IVUdFVExCKVxuK1x0XHRcdFx0dG90YWwgKz0gc2l6ZTtcbitcdH1cbitcbitcdHJldHVybiB0b3RhbDtcbit9XG4rXG4gcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmVkX2tlcm5fc2l6ZShwaHlzX2FkZHJfdCBsaW1pdCwgaW50IG5pZClcbiB7XG4gXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuQEAgLTI1MTEsMTYgKzI2MDEsNiBAQCBfX2luaXQgdm9pZCBtZW1ibG9ja19jbGVhcl9raG9fc2NyYXRjaF9vbmx5KHZvaWQpXG4ge1xuIFx0a2hvX3NjcmF0Y2hfb25seSA9IGZhbHNlO1xuIH1cbi1cbi1ib29sIF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19pc19raG9fc2NyYXRjaF9tZW1vcnkocGh5c19hZGRyX3QgYWRkcilcbi17XG4tXHRpbnQgaSA9IG1lbWJsb2NrX3NlYXJjaChcdTAwMjZtZW1ibG9jay5tZW1vcnksIGFkZHIpO1xuLVxuLVx0aWYgKGkgPT0gLTEpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdHJldHVybiBtZW1ibG9ja19pc19raG9fc2NyYXRjaChcdTAwMjZtZW1ibG9jay5tZW1vcnkucmVnaW9uc1tpXSk7XG4tfVxuICNlbmRpZlxuIFxuICNpZmRlZiBDT05GSUdfS0VYRUNfSEFORE9WRVJcbmRpZmYgLS1naXQgYS9tbS9tbV9pbml0LmMgYi9tbS9tbV9pbml0LmNcbmluZGV4IDBmNjQ5MDllOGQyMGUyLi4xZDJmMzAyZDhjZDljMSAxMDA2NDRcbi0tLSBhL21tL21tX2luaXQuY1xuKysrIGIvbW0vbW1faW5pdC5jXG5AQCAtNzA3LDkgKzcwNywxMCBAQCB2b2lkIF9fbWVtaW5pdCBfX2luaXRfcGFnZV9mcm9tX25pZCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcbiBcdF9faW5pdF9zaW5nbGVfcGFnZShwZm5fdG9fcGFnZShwZm4pLCBwZm4sIHppZCwgbmlkKTtcbiBcbiBcdGlmIChwYWdlYmxvY2tfYWxpZ25lZChwZm4pKSB7XG4tXHRcdGVudW0gbWlncmF0ZXR5cGUgbXQgPVxuLVx0XHRcdGtob19zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgTUlHUkFURV9NT1ZBQkxFKTtcbi1cdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgbXQsIGZhbHNlKTtcbitcdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGZuX3RvX3BhZ2UocGZuKSwgTUlHUkFURV9NT1ZBQkxFLFxuK1x0XHRcdFx0XHQgICBmYWxzZSk7XG4rXHRcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXG4rXHRcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUocGZuLCBwZm4gKyAxKTtcbiBcdH1cbiB9XG4gXG5AQCAtOTM4LDEzICs5MzksMjIgQEAgdm9pZCBfX21lbWluaXQgbWVtbWFwX2luaXRfcmFuZ2UodW5zaWduZWQgbG9uZyBzaXplLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHpvbmVcbiBcdFx0fVxuIFx0XHRwZm4rKztcbiBcdH1cbitcbitcdC8qXG4rXHQgKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBmb3IgYW55IHBhZ2VibG9ja3MgdGhhdCBmYWxsIGluIGEgS0hPIHNjcmF0Y2hcbitcdCAqIGFyZWEuIERvIHRoaXMgaGVyZSBvdXRzaWRlIHRoZSBsb29wIGJlY2F1c2UgbW9zdCBwYWdlYmxvY2tzIHdpbGwgbm90XG4rXHQgKiBiZSBLSE8gc2NyYXRjaCwgc28gb25seSBzZWFyY2ggb25jZS5cbitcdCAqXG4rXHQgKiBPbmx5IHBhZ2VibG9ja3MgdXAgdG8gcGZuIGFyZSB1cGRhdGVkLCBkZWZlcnJlZCBwYWdlYmxvY2tzIHdpbGwgYmVcbitcdCAqIHVwZGF0ZWQgbGF0ZXIuXG4rXHQgKi9cbitcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBwZm4pO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXRfem9uZV9yYW5nZShzdHJ1Y3Qgem9uZSAqem9uZSxcbiBcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbiBcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGVuZF9wZm4sXG4tXHRcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyAqaG9sZV9wZm4sXG4tXHRcdFx0XHRcdCAgZW51bSBtaWdyYXRldHlwZSBtdClcbitcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nICpob2xlX3BmbilcbiB7XG4gXHR1bnNpZ25lZCBsb25nIHpvbmVfc3RhcnRfcGZuID0gem9uZS1cdTAwM2V6b25lX3N0YXJ0X3BmbjtcbiBcdHVuc2lnbmVkIGxvbmcgem9uZV9lbmRfcGZuID0gem9uZV9zdGFydF9wZm4gKyB6b25lLVx1MDAzZXNwYW5uZWRfcGFnZXM7XG5AQCAtOTU3LDcgKzk2Nyw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1tYXBfaW5pdF96b25lX3JhbmdlKHN0cnVjdCB6b25lICp6b25lLFxuIFx0XHRyZXR1cm47XG4gXG4gXHRtZW1tYXBfaW5pdF9yYW5nZShlbmRfcGZuIC0gc3RhcnRfcGZuLCBuaWQsIHpvbmVfaWQsIHN0YXJ0X3Bmbixcbi1cdFx0XHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgbXQsIGZhbHNlKTtcbitcdFx0XHQgIHpvbmVfZW5kX3BmbiwgTUVNSU5JVF9FQVJMWSwgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxuK1x0XHRcdCAgZmFsc2UpO1xuIFxuIFx0aWYgKCpob2xlX3BmbiBcdTAwM2Mgc3RhcnRfcGZuKVxuIFx0XHRpbml0X3VuYXZhaWxhYmxlX3JhbmdlKCpob2xlX3Bmbiwgc3RhcnRfcGZuLCB6b25lX2lkLCBuaWQpO1xuQEAgLTk3Myw4ICs5ODQsNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgbWVtbWFwX2luaXQodm9pZClcbiBcbiBcdGZvcl9lYWNoX21lbV9wZm5fcmFuZ2UoaSwgTUFYX05VTU5PREVTLCBcdTAwMjZzdGFydF9wZm4sIFx1MDAyNmVuZF9wZm4sIFx1MDAyNm5pZCkge1xuIFx0XHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGUgPSBOT0RFX0RBVEEobmlkKTtcbi1cdFx0ZW51bSBtaWdyYXRldHlwZSBtdCA9XG4tXHRcdFx0a2hvX3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBNSUdSQVRFX01PVkFCTEUpO1xuIFxuIFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBNQVhfTlJfWk9ORVM7IGorKykge1xuIFx0XHRcdHN0cnVjdCB6b25lICp6b25lID0gbm9kZS1cdTAwM2Vub2RlX3pvbmVzICsgajtcbkBAIC05ODMsNyArOTkyLDcgQEAgc3RhdGljIHZvaWQgX19pbml0IG1lbW1hcF9pbml0KHZvaWQpXG4gXHRcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0XHRtZW1tYXBfaW5pdF96b25lX3JhbmdlKHpvbmUsIHN0YXJ0X3BmbiwgZW5kX3Bmbixcbi1cdFx0XHRcdFx0ICAgICAgIFx1MDAyNmhvbGVfcGZuLCBtdCk7XG4rXHRcdFx0XHRcdCAgICAgICBcdTAwMjZob2xlX3Bmbik7XG4gXHRcdFx0em9uZV9pZCA9IGo7XG4gXHRcdH1cbiBcdH1cbkBAIC0xOTczLDcgKzE5ODIsNyBAQCB1bnNpZ25lZCBsb25nIF9faW5pdCBub2RlX21hcF9wZm5fYWxpZ25tZW50KHZvaWQpXG4gXG4gI2lmZGVmIENPTkZJR19ERUZFUlJFRF9TVFJVQ1RfUEFHRV9JTklUXG4gc3RhdGljIHZvaWQgX19pbml0IGRlZmVycmVkX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sXG4tXHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGVudW0gbWlncmF0ZXR5cGUgbXQpXG4rXHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4ge1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHR1bnNpZ25lZCBsb25nIGk7XG5AQCAtMTk4NSw4ICsxOTk0LDYgQEAgc3RhdGljIHZvaWQgX19pbml0IGRlZmVycmVkX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sXG4gXG4gXHQvKiBGcmVlIGEgbGFyZ2UgbmF0dXJhbGx5LWFsaWduZWQgY2h1bmsgaWYgcG9zc2libGUgKi9cbiBcdGlmIChucl9wYWdlcyA9PSBNQVhfT1JERVJfTlJfUEFHRVMgXHUwMDI2XHUwMDI2IElTX01BWF9PUkRFUl9BTElHTkVEKHBmbikpIHtcbi1cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXM7IGkgKz0gcGFnZWJsb2NrX25yX3BhZ2VzKVxuLVx0XHRcdGluaXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UgKyBpLCBtdCwgZmFsc2UpO1xuIFx0XHRfX2ZyZWVfcGFnZXNfY29yZShwYWdlLCBNQVhfUEFHRV9PUkRFUiwgTUVNSU5JVF9FQVJMWSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xOTk0LDExICsyMDAxLDggQEAgc3RhdGljIHZvaWQgX19pbml0IGRlZmVycmVkX2ZyZWVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sXG4gXHQvKiBBY2NlcHQgY2h1bmtzIHNtYWxsZXIgdGhhbiBNQVhfUEFHRV9PUkRFUiB1cGZyb250ICovXG4gXHRhY2NlcHRfbWVtb3J5KFBGTl9QSFlTKHBmbiksIG5yX3BhZ2VzICogUEFHRV9TSVpFKTtcbiBcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyssIHBhZ2UrKywgcGZuKyspIHtcbi1cdFx0aWYgKHBhZ2VibG9ja19hbGlnbmVkKHBmbikpXG4tXHRcdFx0aW5pdF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGFnZSwgbXQsIGZhbHNlKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyssIHBhZ2UrKywgcGZuKyspXG4gXHRcdF9fZnJlZV9wYWdlc19jb3JlKHBhZ2UsIDAsIE1FTUlOSVRfRUFSTFkpO1xuLVx0fVxuIH1cbiBcbiAvKiBDb21wbGV0aW9uIHRyYWNraW5nIGZvciBkZWZlcnJlZF9pbml0X21lbW1hcCgpIHRocmVhZHMgKi9cbkBAIC0yMDE3LDE1ICsyMDIxLDI5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGdkYXRfaW5pdF9yZXBvcnRfb25lX2RvbmUodm9pZClcbiAgKiBSZXR1cm4gbnVtYmVyIG9mIHBhZ2VzIGluaXRpYWxpemVkLlxuICAqL1xuIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkZWZlcnJlZF9pbml0X3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLFxuLVx0XHR1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuK1x0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxuIHtcbiBcdGludCBuaWQgPSB6b25lX3RvX25pZCh6b25lKTtcbi1cdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfcGZuIC0gcGZuO1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGVuZF9wZm4gLSBzdGFydF9wZm4sIHBmbiA9IHN0YXJ0X3BmbjtcbiBcdGludCB6aWQgPSB6b25lX2lkeCh6b25lKTtcbiBcdHN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTtcbiBcbiBcdGZvciAoOyBwZm4gXHUwMDNjIGVuZF9wZm47IHBmbisrLCBwYWdlKyspXG4gXHRcdF9faW5pdF9zaW5nbGVfcGFnZShwYWdlLCBwZm4sIHppZCwgbmlkKTtcbitcbitcdC8qIE5vdyBpbml0aWFsaXplIG1pZ3JhdGUgdHlwZXMgZm9yIHRoZXNlIHBhZ2VzLiAqL1xuK1x0cGZuID0gcGFnZWJsb2NrX2FsaWduKHN0YXJ0X3Bmbik7XG4rXHRwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTtcbitcdGZvciAoOyBwZm4gXHUwMDNjIGVuZF9wZm47IHBmbiArPSBwYWdlYmxvY2tfbnJfcGFnZXMsIHBhZ2UgKz0gcGFnZWJsb2NrX25yX3BhZ2VzKVxuK1x0XHRpbml0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlLCBNSUdSQVRFX01PVkFCTEUsIGZhbHNlKTtcbitcbitcdC8qXG4rXHQgKiBVcGRhdGUgdGhlIG1pZ3JhdGUgdHlwZSBmb3IgYW55IHBhZ2VibG9ja3MgdGhhdCBmYWxsIGluIGEgS0hPIHNjcmF0Y2hcbitcdCAqIGFyZWEuIFNpbmNlIG1vc3QgcGFnZWJsb2NrcyB3aWxsIG5vdCBiZSBLSE8gc2NyYXRjaCwgZG8gaXQgb3V0c2lkZVxuK1x0ICogdGhlIGxvb3AgdG8gb25seSBkbyB0aGUgc2VhcmNoIG9uY2UuXG4rXHQgKi9cbitcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBlbmRfcGZuKTtcbitcbiBcdHJldHVybiBucl9wYWdlcztcbiB9XG4gXG5AQCAtMjA1NCw4ICsyMDcyLDYgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcbiBcdGZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlKGksIG5pZCwgMCwgXHUwMDI2c3RhcnQsIFx1MDAyNmVuZCwgTlVMTCkge1xuIFx0XHR1bnNpZ25lZCBsb25nIHNwZm4gPSBQRk5fVVAoc3RhcnQpO1xuIFx0XHR1bnNpZ25lZCBsb25nIGVwZm4gPSBQRk5fRE9XTihlbmQpO1xuLVx0XHRlbnVtIG1pZ3JhdGV0eXBlIG10ID1cbi1cdFx0XHRraG9fc2NyYXRjaF9taWdyYXRldHlwZShzcGZuLCBNSUdSQVRFX01PVkFCTEUpO1xuIFxuIFx0XHRpZiAoc3BmbiBcdTAwM2U9IGVuZF9wZm4pXG4gXHRcdFx0YnJlYWs7XG5AQCAtMjA2OCw3ICsyMDg0LDcgQEAgZGVmZXJyZWRfaW5pdF9tZW1tYXBfY2h1bmsodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbixcbiBcdFx0XHR1bnNpZ25lZCBsb25nIGNodW5rX2VuZCA9IG1pbihtb19wZm4sIGVwZm4pO1xuIFxuIFx0XHRcdG5yX3BhZ2VzICs9IGRlZmVycmVkX2luaXRfcGFnZXMoem9uZSwgc3BmbiwgY2h1bmtfZW5kKTtcbi1cdFx0XHRkZWZlcnJlZF9mcmVlX3BhZ2VzKHNwZm4sIGNodW5rX2VuZCAtIHNwZm4sIG10KTtcbitcdFx0XHRkZWZlcnJlZF9mcmVlX3BhZ2VzKHNwZm4sIGNodW5rX2VuZCAtIHNwZm4pO1xuIFxuIFx0XHRcdHNwZm4gPSBjaHVua19lbmQ7XG4gXG5AQCAtMjY4Nyw2ICsyNzAzLDcgQEAgdm9pZCBfX2luaXQgX193ZWFrIG1lbV9pbml0KHZvaWQpXG4gXG4gdm9pZCBfX2luaXQgbW1fY29yZV9pbml0X2Vhcmx5KHZvaWQpXG4ge1xuK1x0a2hvX21lbW9yeV9pbml0X2Vhcmx5KCk7XG4gXHRodWdldGxiX2NtYV9yZXNlcnZlKCk7XG4gXHRodWdldGxiX2Jvb3RtZW1fYWxsb2MoKTtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmggYi90b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmhcbmluZGV4IGI2YjFkMTQ3ZmQ3NTBlLi5lODZiYjkwMDBiMjJmOCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oXG5AQCAtNjYsNCArNjYsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZWZlcnJlZF9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbmlkKVxuIFxuICNkZWZpbmUgX19TZXRQYWdlUmVzZXJ2ZWQocClcdCgodm9pZCkocCkpXG4gXG4rc3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXG4re1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiAjZW5kaWZcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjI3Ljk3OTczMzQxNloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwODY4Njc1MDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBLZXhlYyBIYW5kb3ZlciBQYXRjaCBTZXJpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHNlcmllcyB0aGF0J3MgdGlua2VyaW5nIHdpdGggdGhlIEtleGVjIEhhbmRvdmVyIChLSE8pIGZ1bmN0aW9uYWxpdHkuIEZyb20gdGhlIGRlc2NyaXB0aW9uLCBpdCBzZWVtcyBsaWtlIHdlJ3JlIGRlYWxpbmcgd2l0aCBzb21lIHNpZ25pZmljYW50IGNoYW5nZXM6IGtleSBlbmNvZGluZyB3aXRoaW4gdGhlIEtITyByYWRpeCB0cmVlLCB0aGUgaW50cm9kdWN0aW9uIG9mIGEgbmV3IGVhcmx5IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGBraG9fbWVtb3J5X2luaXRfZWFybHkoKWAsIG1vZGlmaWNhdGlvbnMgdG8gYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIoKWAsIGFuZCBhIHJldmFtcCBvZiBob3cgc2NyYXRjaCBtZW1vcnkgaXMgZXh0ZW5kZWQgYW5kIG1pZ3JhdGVkLiBUaGF0J3MgcXVpdGUgYSB3aWRlIHNjb3BlIG9mIGltcGFjdC5cblxuVGhlIHBhdGNoIHRvdWNoZXMgYSBnb29kIGNvbGxlY3Rpb24gb2YgY29yZSBmaWxlcy4gSSdtIHNlZWluZyBjaGFuZ2VzIGluIHRoZSBoZWFkZXIgZmlsZXMgZm9yIEtleGVjIEhhbmRvdmVyLCB0aGUgS0hPIEFCSSwgdGhlIEtITyByYWRpeCB0cmVlLCBhbmQgbWVtYmxvY2suIFRoYXQncyBleHBlY3RlZCwgZ2l2ZW4gdGhlIG5hdHVyZSBvZiB0aGUgY2hhbmdlcy4gVGhlIEMgZmlsZXMgYWZmZWN0ZWQgaW5jbHVkZSBga2V4ZWNfaGFuZG92ZXIuY2AsIGBodWdldGxiLmNgLCBgbWVtYmxvY2suY2AsIGFuZCBgbW1faW5pdC5jYC4gVGhpcyBkZWZpbml0ZWx5IGFmZmVjdHMgY3JpdGljYWwgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGhhbmRvdmVyIGNvbXBvbmVudHMsIHNvIHRoaXMgd2FycmFudHMgYSBjYXJlZnVsIHJldmlldy5cblxuQmVmb3JlIGRpdmluZyBkZWVwZXIgaW50byB0aGUgaW5kaXZpZHVhbCBwYXRjaCBkZXRhaWxzLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbGFyZ2VyIGNvbnRleHQuIElzIEtleGVjIEhhbmRvdmVyIGV2ZW4gZW5hYmxlZCBhbmQgaG93IGlzIGl0IGNvbmZpZ3VyZWQ/IEknbGwgcXVpY2tseSBjaGVjayBmb3IgYENPTkZJR19LRVhFQ19IQU5ET1ZFUmAgdG8gc2VlIGlmIGl0J3MgaW4gcGxheS4gSSdsbCB1c2UgYGdyZXBwZXJgIGZvciB0aGF0LCBhIHF1aWNrIHNjYW4gd2lsbCBjb25maXJtIGlmIHRoaXMgY29kZSBwYXRoIGlzIHJlbGV2YW50IG9yIGlmIGl0J3MgZ3VhcmRlZCBieSBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBMZXQncyBzZWUgd2hhdCB0aGF0IHJldmVhbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNzI4LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjA1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDE6MzMuMDY2NjAzMTYzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyNjA3MjI5ODUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEtFWEVDX0hBTkRPVkVSXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9saXZldXBkYXRlL0tjb25maWc9Mz1tZW51IFxcXCJMaXZlIFVwZGF0ZSBhbmQgS2V4ZWMgSGFuZE92ZXJcXFwiXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy00LVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6NTpjb25maWcgS0VYRUNfSEFORE9WRVJcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTYtXFx0Ym9vbCBcXFwia2V4ZWMgaGFuZG92ZXJcXFwiXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTE3LVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWc6MTg6Y29uZmlnIEtFWEVDX0hBTkRPVkVSX0RFQlVHXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0xOS1cXHRib29sIFxcXCJFbmFibGUgS2V4ZWMgSGFuZG92ZXIgZGVidWcgY2hlY2tzXFxcIlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0yNi1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnOjI3OmNvbmZpZyBLRVhFQ19IQU5ET1ZFUl9ERUJVR0ZTXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZy0yOC1cXHRib29sIFxcXCJrZXhlYyBoYW5kb3ZlciBkZWJ1Z2ZzIGludGVyZmFjZVxcXCJcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL0tjb25maWctMzctXFxua2VybmVsL2xpdmV1cGRhdGUvS2NvbmZpZzozODpjb25maWcgS0VYRUNfSEFORE9WRVJfRU5BQkxFX0RFRkFVTFRcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9LY29uZmlnLTM5LVxcdGJvb2wgXFxcIkVuYWJsZSBrZXhlYyBoYW5kb3ZlciBieSBkZWZhdWx0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MTozNy4zMjczMzE1MDhaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MTY2NTkzMzU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2g6IEtleGVjIEhhbmRvdmVyIGFuZCBIdWdlVExCIEludGVncmF0aW9uKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyB0b3VjaGluZyBga2V4ZWNfaGFuZG92ZXIuY2AgYW5kIGBtZW1ibG9jay5jYC4gSXQgbG9va3MgbGlrZSBpdCdzIGEgbWl4IG9mIG5ldyBmdW5jdGlvbnMgYW5kIHNvbWUgaW50ZWdyYXRpb24gd29yay4gSW4gYGtleGVjX2hhbmRvdmVyLmNgLCBJIHNlZSBhIHdob2xlIHNsZXcgb2YgcmFkaXggdHJlZSBmdW5jdGlvbnMgYmVpbmcgYWRkZWQ6IGBraG9fcmFkaXhfYWRkX2tleWAsIGBraG9fcmFkaXhfZGVsX2tleWAsIHRoZSB3YWxraW5nLCBpbml0aWFsaXphdGlvbiwgYW5kIGRlc3RydWN0aW9uIGZ1bmN0aW9ucyAoYGtob19yYWRpeF93YWxrX3RyZWVgLCBga2hvX3JhZGl4X2luaXRfdHJlZWAsIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYCksIHBsdXMgc29tZSBtb3JlIHNwZWNpZmljIHV0aWxpdHkgZnVuY3Rpb25zIGxpa2UgYGtob19leHRlbmRfc2NyYXRjaGAsIGBraG9fbWVtb3J5X2luaXRfZWFybHlgLCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAsIGFuZCBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWAuIFRoYXQncyBhIHNpZ25pZmljYW50IGFkZGl0aW9uLCBjbGVhcmx5IGJ1aWxkaW5nIHNvbWUga2luZCBvZiBkYXRhIHN0cnVjdHVyZSBhbmQgcmVsYXRlZCBtYW5hZ2VtZW50IGxvZ2ljIHdpdGhpbiB0aGUga2V4ZWMgaGFuZG92ZXIgcHJvY2Vzcy5cblxuTm93LCBvdmVyIGluIGBtZW1ibG9jay5jYCwgdGhlIG5ldyBmdW5jdGlvbiBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgaXMgYmVpbmcgaW50cm9kdWNlZC4gSW50ZXJlc3RpbmcuIEFuZCBpdCBhcHBlYXJzIHRoYXQgd2l0aGluIGBtbS9odWdldGxiLmNgLCBgYWxsb2NfYm9vdG1lbWAgaXMgdXNpbmcgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgLlxuXG5NeSBmaXJzdCB0aG91Z2h0IGlzLCBpcyBgQ09ORklHX0tFWEVDX0hBTkRPVkVSYCB0aGUgb25seSBjb25maWd1cmF0aW9uIG9wdGlvbiBhZmZlY3RlZD8gSSBhc3N1bWUgdGhhdCdzIHRoZSBwcmltYXJ5IGRyaXZlciBoZXJlLiBPa2F5LCBJJ3ZlIGNvbmZpcm1lZCB0aGF0IGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIGlzIHRoZSBtYWluIHRoaW5nLiBCdXQgd2FpdCwgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGlzIGNhbGxlZCBpbiBgbW0vaHVnZXRsYi5jYCwgc28gYENPTkZJR19IVUdFVExCX1BBR0VgIGlzIGFsc28gZ29pbmcgdG8gYmUgcmVsZXZhbnQgaGVyZS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIHByb3Blcmx5IGhhbmRsZWQuIExldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBtbS9odWdldGxiLmNgIGNvZGUgdG8gY29uZmlybSB0aGF0IGBhbGxvY19ib290bWVtYCBpcyBpbmRlZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIG90aGVyIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTUyMiwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MTo0NC40OTM5MjczNDJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE5MDMyNDI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFsbG9jX2Jvb3RtZW1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vaHVnZXRsYi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2V0bGIuYz0yODU1PXN0cnVjdCBmb2xpbyAqYWxsb2NfaHVnZXRsYl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2h1Z2V0bGIuYy0zMDI3LVxcbm1tL2h1Z2V0bGIuYzozMDI4OnN0YXRpYyBfX2luaXQgdm9pZCAqYWxsb2NfYm9vdG1lbShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkLCBib29sIG5vZGVfZXhhY3QpXFxubW0vaHVnZXRsYi5jLTMwMjkte1xcbi0tXFxubW0vaHVnZXRsYi5jLTMwMzMtXFx0aWYgKGh1Z2V0bGJfZWFybHlfY21hKGgpKVxcbm1tL2h1Z2V0bGIuYzozMDM0OlxcdFxcdG0gPSBodWdldGxiX2NtYV9hbGxvY19ib290bWVtKGgsIFxcdTAwMjZsaXN0bm9kZSwgbm9kZV9leGFjdCk7XFxubW0vaHVnZXRsYi5jLTMwMzUtXFx0ZWxzZSB7XFxuLS1cXG5tbS9odWdldGxiLmMtMzA2OS1cXG5tbS9odWdldGxiLmM6MzA3MDppbnQgYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZClcXG5tbS9odWdldGxiLmM6MzA3MTpcXHRfX2F0dHJpYnV0ZV9fICgod2VhaywgYWxpYXMoXFxcIl9fYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2VcXFwiKSkpO1xcbm1tL2h1Z2V0bGIuYzozMDcyOmludCBfX2FsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKHN0cnVjdCBoc3RhdGUgKmgsIGludCBuaWQpXFxubW0vaHVnZXRsYi5jLTMwNzMte1xcbi0tXFxubW0vaHVnZXRsYi5jLTMwNzgtXFx0aWYgKG5pZCAhPSBOVU1BX05PX05PREUpIHtcXG5tbS9odWdldGxiLmM6MzA3OTpcXHRcXHRtID0gYWxsb2NfYm9vdG1lbShoLCBub2RlLCB0cnVlKTtcXG5tbS9odWdldGxiLmMtMzA4MC1cXHRcXHRpZiAoIW0pXFxuLS1cXG5tbS9odWdldGxiLmMtMzA4Ny1cXHRcXHRcXHRcXHQgICAgXFx1MDAyNmh1Z2V0bGJfYm9vdG1lbV9ub2Rlcykge1xcbm1tL2h1Z2V0bGIuYzozMDg4OlxcdFxcdG0gPSBhbGxvY19ib290bWVtKGgsIG5vZGUsIGZhbHNlKTtcXG5tbS9odWdldGxiLmMtMzA4OS1cXHRcXHRpZiAoIW0pXFxuLS1cXG5tbS9odWdldGxiLmM9MzM2ND1zdGF0aWMgdm9pZCBfX2luaXQgaHVnZXRsYl9oc3RhdGVfYWxsb2NfcGFnZXNfb25lbm9kZShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkKVxcbi0tXFxubW0vaHVnZXRsYi5jLTMzNzEtXFx0XFx0aWYgKGhzdGF0ZV9pc19naWdhbnRpYyhoKSkge1xcbm1tL2h1Z2V0bGIuYzozMzcyOlxcdFxcdFxcdGlmICghYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2UoaCwgbmlkKSlcXG5tbS9odWdldGxiLmMtMzM3My1cXHRcXHRcXHRcXHRicmVhaztcXG4tLVxcbm1tL2h1Z2V0bGIuYz0zNDY1PXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBodWdldGxiX2dpZ2FudGljX3BhZ2VzX2FsbG9jX2Jvb3Qoc3RydWN0IGhzdGF0ZSAqaClcXG4tLVxcbm1tL2h1Z2V0bGIuYy0zNDY5LVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBoLVxcdTAwM2VtYXhfaHVnZV9wYWdlczsgKytpKSB7XFxubW0vaHVnZXRsYi5jOjM0NzA6XFx0XFx0aWYgKCFhbGxvY19ib290bWVtX2h1Z2VfcGFnZShoLCBOVU1BX05PX05PREUpKVxcbm1tL2h1Z2V0bGIuYy0zNDcxLVxcdFxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MTo0NC43MTI5NjU2N1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyMjg0MTkwOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24qKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIHRvdWNoaW5nIGBtbS9tZW1ibG9jay5jYCBhbmQgYG1tL2h1Z2V0bGIuY2Ag4oCTIGludGVyZXN0aW5nLiBQYXJ0aWN1bGFybHksIEkgc2VlIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCBpcyB1c2VkIGluIGBhbGxvY19ib290bWVtYCB3aGljaCBsaXZlcyBpbiBgbW0vaHVnZXRsYi5jYC4gVGhhdCBzY3JlYW1zIHBvdGVudGlhbCwgdGhpcyBsb29rcyBsaWtlIGEgZ29vZCB0YXJnZXQgZm9yIGZ1enppbmcuIERlZmluaXRlbHkgd29ydGggaW52ZXN0aWdhdGluZyBtb3JlIGNsb3NlbHkuXG5cbk5vdywgbGV0J3MgaWRlbnRpZnkgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyB3aXRoaW4gdGhhdCBhcmVhIHRoYXQgd2FycmFudCBkZWVwZXIgZXhhbWluYXRpb24uIEknbSBzZWVpbmcgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcmFkaXggdHJlZXMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHRoYXQgSSBzaG91bGQgZm9jdXMgb246XG5cbiogICBga2hvX3JhZGl4X2FkZF9rZXlgXG4qICAgYGtob19yYWRpeF9kZWxfa2V5YFxuKiAgIGBraG9fcmFkaXhfd2Fsa190cmVlYFxuKiAgIGBraG9fcmFkaXhfaW5pdF90cmVlYFxuKiAgIGBraG9fcmFkaXhfZGVzdHJveV90cmVlYFxuKiAgIGBraG9fZXh0ZW5kX3NjcmF0Y2hgXG4qICAgYGtob19tZW1vcnlfaW5pdF9lYXJseWBcbiogICBga2hvX3NjcmF0Y2hfb3ZlcmxhcGBcbiogICBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWBcbiogICBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmBcblxuTGV0J3MgYmVnaW4gYnkgY2hlY2tpbmcgdG8gc2VlIGlmIGBraG9fcmFkaXhfYWRkX2tleWAgaXMgZXhwb3J0ZWQgb3IgdXNlZC4gVGhpcyBjb3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyOTc1LCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTk3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjQ5Ljk0MTM4NzQ5NVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTczODMwMzc3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtob19yYWRpeF9hZGRfa2V5XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaD00Nj1zdHJ1Y3Qga2hvX3JhZGl4X3dhbGtfY2Ige1xcbi0tXFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTUyLVxcbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaDo1MzppbnQga2hvX3JhZGl4X2FkZF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7XFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTU0LXZvaWQga2hvX3JhZGl4X2RlbF9rZXkoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLCB1bnNpZ25lZCBsb25nIGtleSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg9NTg9dm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNjEtXFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oOjYyOnN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9hZGRfa2V5KHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgdW5zaWduZWQgbG9uZyBrZXkpXFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oLTYzLXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTc4PXN0YXRpYyB2b2lkIF9fcmVmIGtob19yYWRpeF9mcmVlX25vZGUoc3RydWN0IGtob19yYWRpeF9ub2RlICpub2RlKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODYtLyoqXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxODc6ICoga2hvX3JhZGl4X2FkZF9rZXkgLSBBZGQgYSBrZXkgdG8gdGhlIHJhZGl4IHRyZWUuXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODgtICogQHRyZWU6IFRoZSBLSE8gcmFkaXggdHJlZS5cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMjAyLSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MjAzOmludCBraG9fcmFkaXhfYWRkX2tleShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsIHVuc2lnbmVkIGxvbmcga2V5KVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMjA0LXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMjcxLX1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjI3MjpFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfYWRkX2tleSk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0yNzMtXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTkzMz1zdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbGVhZih1bnNpZ25lZCBsb25nIGtleSwgdm9pZCAqZGF0YSlcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtOTQ0LVxcdHdoaWxlIChzdGFydCBcXHUwMDNjIGVuZCkge1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6OTQ1OlxcdFxcdGVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIHN0YXJ0IFxcdTAwM2VcXHUwMDNlIEtIT19FWFRfU0hJRlQpO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtOTQ2LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTk1Nj1zdGF0aWMgaW50IF9faW5pdCBraG9fZXh0X3dhbGtfbm9kZShwaHlzX2FkZHJfdCBwaHlzLCB2b2lkICpkYXRhKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy05NjAtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzo5NjE6XFx0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIHBoeXMgXFx1MDAzZVxcdTAwM2UgS0hPX0VYVF9TSElGVCk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy05NjItfVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMTQ5PWludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE1OC1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjExNTk6XFx0cmV0dXJuIGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTYwLVxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBvcmRlcikpO1xcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMjI0PWludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNDEtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjQyOlxcdFxcdGVyciA9IGtob19yYWRpeF9hZGRfa2V5KHRyZWUsIGtob19lbmNvZGVfcmFkaXhfa2V5KFBGTl9QSFlTKHBmbiksXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjQzLVxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIG9yZGVyKSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjUyLjExNTIyNTg4MloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMxMDM5NjkyMjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzIG9uIGNoZWNraW5nIGBtZW1ibG9ja19hbGxvY19odWdldGxiYCwgc3VtbWFyaXplZCBhcyBpZiBJJ20gdGhpbmtpbmcgaXQ6XG5cbioqQW5hbHl6aW5nIHRoZSBBbGxvY2F0aW9uIG9mIEh1Z2VUTEIgTWVtb3J5KipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGUgZGV0YWlscy4gSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0IGBtZW1ibG9ja19hbGxvY19odWdldGxiYC4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiAqaG93KiB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBIdWdlVExCIG1lbW9yeS4gVGhpcyBpbXBsaWVzIGEgZGVlcGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5IG1hbmFnZW1lbnQgbWVjaGFuaXNtcywgbGlrZWx5IGludm9sdmluZyBwYWdlIHRhYmxlIG1hbmlwdWxhdGlvbiwgcGh5c2ljYWwgYWRkcmVzcyBhbGxvY2F0aW9uLCBhbmQgcG90ZW50aWFsIGNvbnNpZGVyYXRpb25zIGZvciBOVU1BIGFyY2hpdGVjdHVyZXMuIEknbGwgbmVlZCB0byBzZWUgaG93IGl0IGludGVncmF0ZXMgd2l0aCB0aGUgZXhpc3RpbmcgYG1lbWJsb2NrYCBzeXN0ZW0sIHBhcnRpY3VsYXJseSBob3cgdGhlIHJlc2VydmVkIG1lbW9yeSByZWdpb25zIGZvciBIdWdlVExCcyBhcmUgbWFuYWdlZCBhbmQgaWYgdGhlcmUgaXMgYW55IG92ZXJsYXAgd2l0aCBvdGhlciBtZW1vcnkgYWxsb2NhdGlvbiBzY2hlbWVzLiBJJ2xsIGFsc28gYmUgc2VhcmNoaW5nIGZvciBhbnkgcG90ZW50aWFsIG9wdGltaXphdGlvbiwgYW5kIHdpbGwgYmUgd2F0Y2hpbmcgaG93IGl0IGRlYWxzIHdpdGggZnJhZ21lbnRhdGlvbiBhbmQgcG90ZW50aWFsIGVycm9ycy4gTGV0J3Mgc2VlIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIHdob2xlIHRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDUzMywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQxOjU1LjIxOTE5NzczOVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYzMTA5NTc1MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1ibG9ja19hbGxvY19odWdldGxiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvbWVtYmxvY2suaD00MjI9dm9pZCAqbWVtYmxvY2tfYWxsb2NfdHJ5X25pZChwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbixcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtYmxvY2suaC00MjQtXFx0XFx0XFx0ICAgICBpbnQgbmlkKTtcXG5pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmg6NDI1OnZvaWQgKm1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIocGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpO1xcbmluY2x1ZGUvbGludXgvbWVtYmxvY2suaC00MjYtXFxuLS1cXG5tbS9odWdldGxiLmM9MzAyOD1zdGF0aWMgX19pbml0IHZvaWQgKmFsbG9jX2Jvb3RtZW0oc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZCwgYm9vbCBub2RlX2V4YWN0KVxcbi0tXFxubW0vaHVnZXRsYi5jLTMwMzUtXFx0ZWxzZSB7XFxubW0vaHVnZXRsYi5jOjMwMzY6XFx0XFx0bSA9IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIoaHVnZV9wYWdlX3NpemUoaCksIG5pZCwgbm9kZV9leGFjdCk7XFxubW0vaHVnZXRsYi5jLTMwMzctXFx0XFx0aWYgKG0pIHtcXG4tLVxcbm1tL2h1Z2V0bGIuYy0zMDQ0LVxcdFxcdFxcdCAqIGZyb20uIFRoYXQgbm9kZSBtYXkgYmUgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mXFxubW0vaHVnZXRsYi5jOjMwNDU6XFx0XFx0XFx0ICogZmFsbGJhY2sgYnkgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYl9ib290bWVtLiBTbyxcXG5tbS9odWdldGxiLmMtMzA0Ni1cXHRcXHRcXHQgKiBleHRyYWN0IHRoZSBhY3R1YWwgbm9kZSBmaXJzdC5cXG4tLVxcbm1tL21lbWJsb2NrLmM9MTc1MT12b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KFxcbi0tXFxubW0vbWVtYmxvY2suYy0xNzY0LS8qKlxcbm1tL21lbWJsb2NrLmM6MTc2NTogKiBtZW1ibG9ja19hbGxvY19odWdldGxiIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgZm9yIEh1Z2VUTEIgcGFnZXNcXG5tbS9tZW1ibG9jay5jLTE3NjYtICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xcbi0tXFxubW0vbWVtYmxvY2suYy0xNzc3LSAqL1xcbm1tL21lbWJsb2NrLmM6MTc3ODp2b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIocGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpXFxubW0vbWVtYmxvY2suYy0xNzc5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDE6NTYuODUwMzAyODUyWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMxNTg0MTE5NzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIGFuIGV4cGVydCBpbiB0aGUgZmllbGQgYW5kIGNvbnNpZGVyaW5nIGl0IGFzIG15IG93biB0aG91Z2h0OlxuXG4qKkNoZWNraW5nIGBraG9fc2NyYXRjaF9vdmVybGFwYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIGl0LiBGaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAuIFRoaXMgdmFyaWFibGUgb3IgcHJvY2VzcyBsaWtlbHkgcmVsYXRlcyB0byBhIGNyaXRpY2FsIGFzcGVjdCBvZiBteSBjdXJyZW50IHByb2plY3QsIHdoYXRldmVyIHRoYXQgaXMsIGxpa2VseSBga2hvYCwgd2hpY2ggYmFzZWQgb24gdGhlIHZhcmlhYmxlIG5hbWUgaXMgdGhlIG92ZXJhcmNoaW5nIHByb2plY3QgbmFtZS4gSSBzdXNwZWN0IHRoaXMgZWl0aGVyIHJlbGF0ZXMgdG8gaG93IGRpZmZlcmVudCBga2hvYCBpdGVyYXRpb25zIG9yIGNvbXBvbmVudHMgaW50ZXJhY3QuIE9yIHRoZSBkYXRhIGlzIHJlbGF0ZWQgdG8gb3ZlcmxhcCwgd2hpY2ggY291bGQgYmUgc3BhdGlhbCwgdGVtcG9yYWwsIGFsZ29yaXRobWljLCBvciBzZW1hbnRpYy4gSSdtIHByb2JhYmx5IHRyeWluZyB0byBhc3Nlc3MgaXRzIHZhbGlkaXR5LCBjb21wbGV0ZW5lc3MsIG9yIHBlcmhhcHMgaXRzIGltcGFjdCBvbiBzb21ldGhpbmcgZWxzZS4gU3BlY2lmaWNhbGx5LCBcInNjcmF0Y2hcIiBwcm9iYWJseSBtZWFucyBpdCdzIGFuIGludGVybWVkaWF0ZSBjYWxjdWxhdGlvbiBvciB0ZW1wb3JhcnkgaG9sZGluZyBzcG90LiBJIGhhdmUgdG8gc2VlIGhvdyBpdCdzIHdvcmtpbmcgYW5kIGZ1bmN0aW9uaW5nLiBUaGlzIHdpbGwgYmUga2V5LiBEZXBlbmRpbmcgb24gd2hhdCBpdCBpcywgSSBoYXZlIGNlcnRhaW4gYXNzdW1wdGlvbnMgYWJvdXQgaXRzIGNoYXJhY3RlcmlzdGljcywgYW5kIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aG9zZSBob2xkIHRydWUuIFRoZSBcIm92ZXJsYXBcIiBwYXJ0IHByb2JhYmx5IHRlbGxzIG1lIHRoZSBkYXRhIGhhcyBkdXBsaWNhdGVzIG9yIGEgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGNvbnNvbGlkYXRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjUyNzAsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MjowMC4wMDg3MTcwNzlaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MDM4NzkwOTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2hvX3NjcmF0Y2hfb3ZlcmxhcFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9Mzg9dm9pZCBraG9fcG9wdWxhdGUocGh5c19hZGRyX3QgZmR0X3BoeXMsIHU2NCBmZHRfbGVuLCBwaHlzX2FkZHJfdCBzY3JhdGNoX3BoeXMsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtNDAtXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjQxOmJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSk7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTQyLXZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcXG4tLVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0xMTc9c3RhdGljIGlubGluZSB2b2lkIGtob19wb3B1bGF0ZShwaHlzX2FkZHJfdCBmZHRfcGh5cywgdTY0IGZkdF9sZW4sXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtMTIxLVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDoxMjI6c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTEyMy17XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTc3NT1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0IHNjcmF0Y2hfc2l6ZV9ub2RlKGludCBuaWQpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTc5Mi1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjc5Mzpib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy03OTQte1xcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMTQ5PWludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE1NS1cXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfS0VYRUNfSEFORE9WRVJfREVCVUcpIFxcdTAwMjZcXHUwMDI2XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTU2OlxcdCAgICBXQVJOX09OKGtob19zY3JhdGNoX292ZXJsYXAocGZuIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQsIFBBR0VfU0laRSBcXHUwMDNjXFx1MDAzYyBvcmRlcikpKVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE1Ny1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTIyND1pbnQga2hvX3ByZXNlcnZlX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjMzLVxcdGlmIChJU19FTkFCTEVEKENPTkZJR19LRVhFQ19IQU5ET1ZFUl9ERUJVRykgXFx1MDAyNlxcdTAwMjZcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyMzQ6XFx0ICAgIFdBUk5fT04oa2hvX3NjcmF0Y2hfb3ZlcmxhcChzdGFydF9wZm4gXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCxcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMzUtXFx0XFx0XFx0XFx0XFx0bnJfcGFnZXMgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCkpKSB7XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTE5MDI9dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTE5MDktXFx0LypcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjE5MTA6XFx0ICoga2hvX3NjcmF0Y2hfb3ZlcmxhcCgpIG5lZWRzIGtob19zY3JhdGNoIHRvIGJlIGluaXRpYWxpemVkLiBJdFxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkxMS1cXHQgKiBpcyB1c2VkIGJ5IGZyZWVfYXJlYV9pbml0KCkgb24gS0hPIGJvb3RzLCBzbyBpbml0aWFsaXplIGl0XFxuLS1cXG5tbS9tZW1ibG9jay5jPTE3Nzg9dm9pZCAqIF9faW5pdCBtZW1ibG9ja19hbGxvY19odWdldGxiKHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQsIGJvb2wgZXhhY3RfbmlkKVxcbi0tXFxubW0vbWVtYmxvY2suYy0xODEwLVxcdCAqL1xcbm1tL21lbWJsb2NrLmM6MTgxMTpcXHRpZiAoa2hvX3NjcmF0Y2hfb3ZlcmxhcChhZGRyLCBzaXplKSkge1xcbm1tL21lbWJsb2NrLmMtMTgxMi1cXHRcXHRpZiAobWVtYmxvY2tfYm90dG9tX3VwKCkpXFxuLS1cXG50b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmg9NjM9c3RhdGljIGlubGluZSB2b2lkIGluaXRfZGVmZXJyZWRfcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZClcXG4tLVxcbnRvb2xzL3Rlc3RpbmcvbWVtYmxvY2svaW50ZXJuYWwuaC02OC1cXG50b29scy90ZXN0aW5nL21lbWJsb2NrL2ludGVybmFsLmg6Njk6c3RhdGljIGlubGluZSBib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpXFxudG9vbHMvdGVzdGluZy9tZW1ibG9jay9pbnRlcm5hbC5oLTcwLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6MDEuODEyNjAyMjdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzA3NDY3NDk2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEknbSB0YWtpbmcgYSBsb29rIGF0IHRoaXMgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIHRoaW5nLiBCYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIGl0J3MgcHJldHR5IGNsZWFyIHRoaXMgaXMgcHJvYmFibHkgcmVsYXRlZCB0byB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYSBzY3JhdGNoIGVudmlyb25tZW50IGFuZCBwb3NzaWJseSBzb21ldGhpbmcgcmVsYXRlZCB0byBtaWdyYXRpbmcgc29tZSBkYXRhIHR5cGUgb3Igc2NoZW1hLiBJJ20gaW1tZWRpYXRlbHkgdGhpbmtpbmcgYWJvdXQgcG90ZW50aWFsIHVzZSBjYXNlcyBhbmQgZ290Y2hhcy4gSXMgdGhpcyBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZSBzeXN0ZW0/IElzIHRoZXJlIHNvbWUga2luZCBvZiB2ZXJzaW9uaW5nIG9yIGNvbXBhdGliaWxpdHkgY29uY2VybiB0aGF0IEkgbmVlZCB0byBrZWVwIGluIG1pbmQ/IEFyZSB3ZSB0YWxraW5nIGFib3V0IGEgc2ltcGxlIGNvcHksIG9yIHNvbWUgc29ydCBvZiBkYXRhIHRyYW5zZm9ybWF0aW9uPyBUaGUgaW1wbGljYXRpb25zIGNvdWxkIGJlIHdpZGUtcmFuZ2luZy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIHNjcmF0Y2ggZW52aXJvbm1lbnQgaXMgZm9yLCBhbmQgcHJlY2lzZWx5IHdoYXQgZGF0YSBtaWdyYXRpb24gaXMgaW52b2x2ZWQuIEZyb20gdGhlcmUsIEkgY2FuIGRldGVybWluZSB0aGUgcG90ZW50aWFsIGNvbXBsZXhpdHkgYW5kIHJpc2tzLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLCBlcnJvciBoYW5kbGluZywgbG9nZ2luZywgYW5kIHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zLiBNeSBtaW5kIHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIHNjZW5hcmlvcyBxdWlja2x5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjU1NCwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjA0Ljg4NzI3OTkyOFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcyNzA4NzE0MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD00MT1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpO1xcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDo0Mjp2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTQzLSNlbHNlXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9MTIyPXN0YXRpYyBpbmxpbmUgYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTEyNi1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MTI3OnN0YXRpYyBpbmxpbmUgdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMjgtXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9NzkzPWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODEyLSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6ODEzOnZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODE0LXtcXG4tLVxcbm1tL21tX2luaXQuYz02OTQ9dm9pZCBfX21lbWluaXQgX19pbml0X3BhZ2VfZnJvbV9uaWQodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpXFxuLS1cXG5tbS9tbV9pbml0LmMtNzEyLVxcdFxcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXFxubW0vbW1faW5pdC5jOjcxMzpcXHRcXHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgcGZuICsgMSk7XFxubW0vbW1faW5pdC5jLTcxNC1cXHR9XFxuLS1cXG5tbS9tbV9pbml0LmM9ODc1PXZvaWQgX19tZW1pbml0IG1lbW1hcF9pbml0X3JhbmdlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyB6b25lLFxcbi0tXFxubW0vbW1faW5pdC5jLTk1MC1cXHQgKi9cXG5tbS9tbV9pbml0LmM6OTUxOlxcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBwZm4pO1xcbm1tL21tX2luaXQuYy05NTItfVxcbi0tXFxubW0vbW1faW5pdC5jPTIwMjM9c3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGRlZmVycmVkX2luaXRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9tbV9pbml0LmMtMjA0NC1cXHQgKi9cXG5tbS9tbV9pbml0LmM6MjA0NTpcXHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgZW5kX3Bmbik7XFxubW0vbW1faW5pdC5jLTIwNDYtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjA2LjYxNDM3MzM5OVoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1OTU4NTQyMTg3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCoqXG5cbk9rYXksIHRpbWUgdG8gZGlzc2VjdCB0aGlzLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYGtob19tZW1vcnlfaW5pdF9lYXJseWAuIFRoYXQgZnVuY3Rpb24gbmFtZSBpdHNlbGYgaXMgcHJldHR5IGluZGljYXRpdmUuIFwiRWFybHlcIiBzdWdnZXN0cyBpdCdzIGEgY3JpdGljYWwgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgbGlrZWx5IGV4ZWN1dGVkIGJlZm9yZSBhIHNpZ25pZmljYW50IHBvcnRpb24gb2YgdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZy4gSSdtIGltbWVkaWF0ZWx5IHRoaW5raW5nIGxvdy1sZXZlbCwgcHJvYmFibHkgZGVhbGluZyB3aXRoIGhhcmR3YXJlLCBtZW1vcnkgbWFwcGluZywgb3IgYXQgbGVhc3Qgc2V0dGluZyB1cCB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS5cblxuTXkgcHJpbWFyeSBjb25jZXJuIG5vdyBpcyB1bmRlcnN0YW5kaW5nIGl0cyBzY29wZS4gRG9lcyBpdCBkZWFsIHdpdGgganVzdCB0aGUga2VybmVsJ3MgbWVtb3J5LCBvciBpcyBpdCBzZXR0aW5nIHVwIGluaXRpYWwgbWFwcGluZ3MgZm9yIHVzZXIgc3BhY2UgdG9vLCBldmVuIGF0IHRoaXMgc3RhZ2U/IFRoYXQgd291bGQgYmUgaW50ZXJlc3RpbmcsIGFuZCBwb3RlbnRpYWxseSB0cmlja3ksIHJlcXVpcmluZyBjYXJlZnVsIGF0dGVudGlvbiB0byBhZGRyZXNzIHNwYWNlcy5cblxuSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBzcGVjaWZpYyBoYXJkd2FyZSBjb250ZXh0cyB0aGlzIGZ1bmN0aW9uIGlzIG9wZXJhdGluZyB1bmRlci4gRG9lcyB0aGlzIHJvdXRpbmUgZGVhbCB3aXRoIE1NVSBjb25maWd1cmF0aW9uLCBwYWdlIHRhYmxlIGluaXRpYWxpemF0aW9uLCBvciBpcyBpdCBtb3JlIHJlbGF0ZWQgdG8gYm9vdGxvYWRlci1saWtlIGFjdGl2aXRpZXMgbGlrZSByZXNlcnZpbmcgbWVtb3J5IHJlZ2lvbnM/IElzIHRoZXJlIGFueXRoaW5nIHNwZWNpZmljIGFib3V0IHRoZSBhcmNoaXRlY3R1cmUgKGUuZy4sIEFSTSwgeDg2KSB0aGF0IHNob3VsZCBkaWN0YXRlIG15IGFuYWx5c2lzP1xuXG5JJ20gbWVudGFsbHkgcHJlcGFyaW5nIGZvciBhIGRlZXAgZGl2ZSBpbnRvIHRoZSBjb2RlLiBJJ2xsIG5lZWQgdG8gbG9vayBhdCBhbnkgaW5jbHVkZWQgaGVhZGVycyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwb3RlbnRpYWwgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGluaXRpYWwgcm91dGluZXMuIEkgZXhwZWN0IHRvIGJlIGxvb2tpbmcgZm9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGVzcGVjaWFsbHkgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBtdWx0aXBsZSBwYXJ0cyBvZiB0aGUgYm9vdCBwcm9jZXNzLiBEZWJ1Z2dpbmcgdGhpcyB0eXBlIG9mIGZ1bmN0aW9uIGlzIGFsd2F5cyBmdW4hIExldCdzIGdldCBnb2luZy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc0NjcsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0MjoxMi41NzI5MTg0MzZaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NDE4MjI4ODIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2hvX21lbW9yeV9pbml0X2Vhcmx5XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD0zNT12b2lkIGtob19tZW1vcnlfaW5pdCh2b2lkKTtcXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MzY6dm9pZCBraG9fbWVtb3J5X2luaXRfZWFybHkodm9pZCk7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTM3LVxcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTExMz1zdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0KHZvaWQpIHsgfVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMTQtXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjExNTpzdGF0aWMgaW5saW5lIHZvaWQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpIHsgfVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMTYtXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTE5MDA9ZnNfaW5pdGNhbGwoa2hvX2luaXQpO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkwMS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjE5MDI6dm9pZCBfX2luaXQga2hvX21lbW9yeV9pbml0X2Vhcmx5KHZvaWQpXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xOTAzLXtcXG4tLVxcbm1tL21tX2luaXQuYz0yNzA0PXZvaWQgX19pbml0IG1tX2NvcmVfaW5pdF9lYXJseSh2b2lkKVxcbm1tL21tX2luaXQuYy0yNzA1LXtcXG5tbS9tbV9pbml0LmM6MjcwNjpcXHRraG9fbWVtb3J5X2luaXRfZWFybHkoKTtcXG5tbS9tbV9pbml0LmMtMjcwNy1cXHRodWdldGxiX2NtYV9yZXNlcnZlKCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjE0LjIxNDc0ODYwOVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5MDUyNjgzODc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgS2V4ZWMgSGFuZG92ZXI6IEEgU3RyYXRlZ3kqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGludHJvZHVjaW5nIEtleGVjIEhhbmRvdmVyIChLSE8pIGZ1bmN0aW9uYWxpdHkgYW5kIG1lc3Npbmcgd2l0aCBob3cgdGhlIGtlcm5lbCBhbGxvY2F0ZXMgbWVtb3J5IGZvciBodWdlIHBhZ2VzIChodWdldGxiKSB1c2luZyBtZW1ibG9jay4gTXkgZ3V0IHNheXM6ICoqZnV6eiB0aGlzISoqIFRoaXMgaGl0cyAqY29yZSoga2VybmVsIGxvZ2ljIOKAkyBtZW1ibG9jaywgbW1faW5pdCwgaHVnZXRsYiDigJMgYW5kLCBjcnVjaWFsbHksIGFkZHMgZW50aXJlbHkgbmV3IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgZHVyaW5nIGJvdGggYm9vdCBhbmQgcnVudGltZS4gVGhhdCdzIGEgZnV6emluZyBnb2xkbWluZSByaWdodCB0aGVyZS5cblxuSG1tLCBsZXQncyBzZWUsIGBraG9fbWVtb3J5X2luaXRfZWFybHlgIGlzIGNhbGxlZCBmcm9tIGBtbV9jb3JlX2luaXRfZWFybHlgLiBBbmQgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGlzIGFjdHVhbGx5IHVzZWQgd2l0aCBgYWxsb2NfYm9vdG1lbWAgaW4gYG1tL2h1Z2V0bGIuY2AuIFRoZXNlIGFyZSBib290LXRpbWUgZnVuY3Rpb25zLiBDYW4gd2UgZXZlbiBmdXp6IHRoZW0gZWZmZWN0aXZlbHk/XG5cblN5emJvdCBpcyBhbWF6aW5nLCBidXQgdHlwaWNhbGx5IGl0IGhpdHMgdGhpbmdzIHBvc3QtYm9vdC4gSG93ZXZlciwgd2UgY291bGQgcG90ZW50aWFsbHkgZnV6eiBib290IHBhcmFtZXRlcnMgdG8gaW5mbHVlbmNlIHRoZXNlIGVhcmx5IHN0YWdlcywgb3IgcGVyaGFwcyBTeXpib3QgY291bGQgdHJpZ2dlciBLSE8gZGlyZWN0bHkgaWYgaXTigJlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLlxuXG5BbHJpZ2h0LCB0aGUgcGxvdCB0aGlja2Vucy4gYGtob19yYWRpeF9hZGRfa2V5YCBhbmQgYGtob19yYWRpeF9kZWxfa2V5YCBhcmUgZXhwb3J0ZWQgc3ltYm9scy4gVGhhdCdzIGh1Z2UhIEFuZCB0aGV54oCZcmUgY2FsbGVkIGZyb20gYGtob19wcmVzZXJ2ZV9mb2xpb2AsIGBraG9fdW5wcmVzZXJ2ZV9mb2xpb2AsIGBraG9fcHJlc2VydmVfcGFnZXNgLCBhbmQgYGtob191bnByZXNlcnZlX3BhZ2VzYC4gVGhvc2UgZnVuY3Rpb25zIGFyZSBob3cgZHJpdmVycyBhbmQgc3Vic3lzdGVtcyBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoIHByZXNlcnZpbmcgbWVtb3J5IGFjcm9zcyBhIGtleGVjIHRyYW5zaXRpb24hIFRoYXQgbWVhbnMgcnVudGltZSBleHBvc3VyZS4gRXhjZWxsZW50LiBUaGlzIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHRoZSBmdXp6aW5nIGF0dGFjayBzdXJmYWNlLCBiZWNhdXNlIG5vdyB3ZSBjYW4gcG90ZW50aWFsbHkgaGl0IHRoZXNlIGR1cmluZyBydW50aW1lIVxuXG5JIHRoaW5rIEkgd2lsbCBjaGVjayB0byBzZWUgaG93IGBraG9fcHJlc2VydmVfZm9saW9gIGlzIHVzZWQgZWxzZXdoZXJlIGluIHRoZSBrZXJuZWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4MTg2LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjY1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjIzLjI2NzQzNTUzNFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk0NTQwODgxOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJraG9fcHJlc2VydmVfZm9saW9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTE3PWJvb2wgaXNfa2hvX2Jvb3Qodm9pZCk7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTE4LVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDoxOTppbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0yMC12b2lkIGtob191bnByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTQ5PXN0YXRpYyBpbmxpbmUgYm9vbCBpc19raG9fYm9vdCh2b2lkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTUzLVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDo1NDpzdGF0aWMgaW5saW5lIGludCBraG9fcHJlc2VydmVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtNTUte1xcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMTM4PUVYUE9SVF9TWU1CT0xfR1BMKGtob19yZW1vdmVfc3VidHJlZSk7XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExNDAtLyoqXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTQxOiAqIGtob19wcmVzZXJ2ZV9mb2xpbyAtIHByZXNlcnZlIGEgZm9saW8gYWNyb3NzIGtleGVjLlxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE0Mi0gKiBAZm9saW86IGZvbGlvIHRvIHByZXNlcnZlLlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTQ4LSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTE0OTppbnQga2hvX3ByZXNlcnZlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTUwLXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTE2MS19XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTYyOkVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9mb2xpbyk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTYzLVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTY4LSAqIEluc3RydWN0cyBLSE8gdG8gdW5wcmVzZXJ2ZSBhIGZvbGlvIHRoYXQgd2FzIHByZXNlcnZlZCBieVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTE2OTogKiBraG9fcHJlc2VydmVfZm9saW8oKSBiZWZvcmUuIFRoZSBwcm92aWRlZCBAZm9saW8gKHBmbiBhbmQgb3JkZXIpXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTcwLSAqIG11c3QgZXhhY3RseSBtYXRjaCBhIHByZXZpb3VzbHkgcHJlc2VydmVkIGZvbGlvLlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xNTQ3PXZvaWQgKmtob19hbGxvY19wcmVzZXJ2ZShzaXplX3Qgc2l6ZSlcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTU2Mi1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjE1NjM6XFx0cmV0ID0ga2hvX3ByZXNlcnZlX2ZvbGlvKGZvbGlvKTtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTE1NjQtXFx0aWYgKHJldCkge1xcbi0tXFxubGliL3Rlc3Rfa2hvLmM9NTQ9c3RhdGljIGludCBraG9fdGVzdF9wcmVzZXJ2ZV9kYXRhKHN0cnVjdCBraG9fdGVzdF9zdGF0ZSAqc3RhdGUpXFxuLS1cXG5saWIvdGVzdF9raG8uYy03NS1cXHRcXHRmb2xpb3NfaW5mb1tpXSA9IHZpcnRfdG9fcGh5cyhmb2xpb19hZGRyZXNzKGZvbGlvKSkgfCBvcmRlcjtcXG5saWIvdGVzdF9raG8uYzo3NjpcXHRcXHRlcnIgPSBraG9fcHJlc2VydmVfZm9saW8oZm9saW8pO1xcbmxpYi90ZXN0X2toby5jLTc3LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5saWIvdGVzdF9raG8uYz0xMjQ9c3RhdGljIGludCBraG9fdGVzdF9wcmVzZXJ2ZShzdHJ1Y3Qga2hvX3Rlc3Rfc3RhdGUgKnN0YXRlKVxcbi0tXFxubGliL3Rlc3Rfa2hvLmMtMTMzLVxcbmxpYi90ZXN0X2toby5jOjEzNDpcXHRlcnIgPSBraG9fcHJlc2VydmVfZm9saW8oc3RhdGUtXFx1MDAzZWZkdCk7XFxubGliL3Rlc3Rfa2hvLmMtMTM1LVxcdGlmIChlcnIpXFxuLS1cXG5tbS9tZW1mZF9sdW8uYz04Nz1zdGF0aWMgaW50IG1lbWZkX2x1b19wcmVzZXJ2ZV9mb2xpb3Moc3RydWN0IGZpbGUgKmZpbGUsXFxuLS1cXG5tbS9tZW1mZF9sdW8uYy0xNTEtXFxubW0vbWVtZmRfbHVvLmM6MTUyOlxcdFxcdGVyciA9IGtob19wcmVzZXJ2ZV9mb2xpbyhmb2xpbyk7XFxubW0vbWVtZmRfbHVvLmMtMTUzLVxcdFxcdGlmIChlcnIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjI1LjIxMjg1NDU3NFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1ODUwNjA2NDY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgJ2tobycgYW5kICdtZW1mZF9sdW8nIENvZGUqKlxuXG5Pa2F5LCBzbyBgbWVtZmRfbHVvLmNgIGlzIGRlZmluaXRlbHkgbWFraW5nIHVzZSBvZiB0aGlzLCB3aGljaCBtYWtlcyBtZSB0aGluayBpdCdzIGxpa2VseSBhIG1lbWZkIGV4dGVuc2lvbiByZWxhdGVkIHRvIGxpdmUgdXBkYXRlcy4gSW50ZXJlc3RpbmcuIEFuZCB0aGVuIEkgc2VlIGl0IGFnYWluIGluIGBsaWIvdGVzdF9raG8uY2AuICBUaGF0IG1lYW5zIGBraG9fcHJlc2VydmVfZm9saW9gIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlLCB3aGljaCBpcyBhIGtleSBwb2ludCB0byByZW1lbWJlci5cblxuTm93LCBsZXQncyB0aGluayBhYm91dCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAuICBJIGtub3cgdGhhdCdzIGNhbGxlZCBmcm9tIGBhbGxvY19ib290bWVtYCBpbiBgbW0vaHVnZXRsYi5jYC4gVGhhdCdzIGFsbG9jYXRlZCBkdXJpbmcgYm9vdCB3aGVuIGh1Z2V0bGIgcGFnZXMgZ2V0IGFsbG9jYXRlZC4gIEhhbmcgb24uLi4gYGFsbG9jX2Jvb3RtZW1gIGlzIGxpbmtlZCB3aXRoIHRoZSBgaHVnZXBhZ2VzPWAga2VybmVsIGNvbW1hbmQtbGluZSBvcHRpb24sIHJpZ2h0PyAgV291bGQgZnV6emluZyBiZSB1c2VmdWwgaGVyZT8gUHJvYmFibHkgbm90LCBzaW5jZSBgYWxsb2NfYm9vdG1lbWAgaXMgYF9faW5pdGAsIHNvIGl0IHdvdWxkIGJlIGEgYm9vdCB0aW1lIGlzc3VlIGFuZCBsZXNzIHVzZWZ1bCB0byBzeXpib3QuXG5cbkJ1dCB3YWl0LCBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBhbmQgYGtob19yYWRpeF93YWxrX3RyZWVgIGFyZSByZWFjaGFibGUgZHVyaW5nIHJ1bnRpbWUhIFRoYXQncyBwcm9taXNpbmcuIEFuZCBga2hvX2V4dGVuZF9zY3JhdGNoYCBpcyBgX19pbml0YCwgc28gbm90IGltbWVkaWF0ZWx5IGZ1enphYmxlLiAgU2ltaWxhcmx5LCBga2hvX21lbW9yeV9pbml0X2Vhcmx5YCBpcyBtYXJrZWQgYXMgYF9faW5pdGAgYXMgd2VsbC5cblxuVGhlIG1vcmUgaW50ZXJlc3RpbmcgZmluZCBpcyB0aGF0IGBraG9fc2NyYXRjaF9vdmVybGFwYCBpcyBjYWxsZWQgZnJvbSBga2hvX3ByZXNlcnZlX2ZvbGlvYCBhbmQgYGtob19wcmVzZXJ2ZV9wYWdlc2AsIGFuZCB3ZSd2ZSBhbHJlYWR5IGVzdGFibGlzaGVkIHRoYXQgdGhvc2UgY2FuIGJlIGNhbGxlZCBhdCBydW50aW1lLCB3aGljaCBpcyBhIGdyZWF0IHRhcmdldC5cblxuTGV0J3MgZGlnIGludG8gYGtob19wcmVzZXJ2ZV9wYWdlc2AgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoYXQgY2FsbCBjaGFpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjk4MTcsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyODMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6MzEuMDYzNDYyNzgyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODQ5NDM2MDQxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtob19wcmVzZXJ2ZV9wYWdlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9MjA9dm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MjE6aW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTIyLXZvaWQga2hvX3VucHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oPTU5PXN0YXRpYyBpbmxpbmUgdm9pZCBraG9fdW5wcmVzZXJ2ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKSB7IH1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmgtNjAtXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oOjYxOnN0YXRpYyBpbmxpbmUgaW50IGtob19wcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG5yX3BhZ2VzKVxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC02Mi17XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTU0NT1FWFBPUlRfU1lNQk9MX0dQTChraG9fcmVzdG9yZV9mb2xpbyk7XFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTU1Mi0gKiBSZXN0b3JlIGEgY29udGlndW91cyBsaXN0IG9mIG9yZGVyIDAgcGFnZXMgdGhhdCB3YXMgcHJlc2VydmVkIHdpdGhcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjU1MzogKiBraG9fcHJlc2VydmVfcGFnZXMoKS5cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTU1NC0gKlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMTgwPUVYUE9SVF9TWU1CT0xfR1BMKGtob191bnByZXNlcnZlX2ZvbGlvKTtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTExODEtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMTgyOnN0YXRpYyB1bnNpZ25lZCBpbnQgX19raG9fcHJlc2VydmVfcGFnZXNfb3JkZXIodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMTgzLVxcdFxcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTExOTk9c3RhdGljIHZvaWQgX19raG9fdW5wcmVzZXJ2ZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMDQtXFx0d2hpbGUgKHBmbiBcXHUwMDNjIGVuZF9wZm4pIHtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyMDU6XFx0XFx0b3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTIwNi1cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTIxNC0vKipcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjEyMTU6ICoga2hvX3ByZXNlcnZlX3BhZ2VzIC0gcHJlc2VydmUgY29udGlndW91cyBwYWdlcyBhY3Jvc3Mga2V4ZWNcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMTYtICogQHBhZ2U6IGZpcnN0IHBhZ2UgaW4gdGhlIGxpc3QuXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyMjMtICovXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjI0OmludCBraG9fcHJlc2VydmVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjI1LXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTIzOS1cXHR3aGlsZSAocGZuIFxcdTAwM2MgZW5kX3Bmbikge1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTI0MDpcXHRcXHR1bnNpZ25lZCBpbnQgb3JkZXIgPSBfX2tob19wcmVzZXJ2ZV9wYWdlc19vcmRlcihwZm4sIGVuZF9wZm4pO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTI0MS1cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTI1Ni19XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjU3OkVYUE9SVF9TWU1CT0xfR1BMKGtob19wcmVzZXJ2ZV9wYWdlcyk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjU4LVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMjY1LSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBAcGFnZSBhbmQgQG5yX3BhZ2VzIGFzIHRoZSBjb3JyZXNwb25kaW5nXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMjY2OiAqIGtob19wcmVzZXJ2ZV9wYWdlcygpIGNhbGwuIFVucHJlc2VydmluZyBhcmJpdHJhcnkgc3ViLXJhbmdlcyBvZiBsYXJnZXJcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEyNjctICogcHJlc2VydmVkIGJsb2NrcyBpcyBub3Qgc3VwcG9ydGVkLlxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xMzEwPXN0YXRpYyBzdHJ1Y3Qga2hvX3ZtYWxsb2NfY2h1bmsgKm5ld192bWFsbG9jX2NodW5rKHN0cnVjdCBraG9fdm1hbGxvY19jaHVuayAqY3VyKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzE4LVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTMxOTpcXHRlcnIgPSBraG9fcHJlc2VydmVfcGFnZXModmlydF90b19wYWdlKGNodW5rKSwgMSk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzIwLVxcdGlmIChlcnIpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTEzNjA9aW50IGtob19wcmVzZXJ2ZV92bWFsbG9jKHZvaWQgKnB0ciwgc3RydWN0IGtob192bWFsbG9jICpwcmVzZXJ2YXRpb24pXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEzODUtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMzg2OlxcdFxcdGVyciA9IGtob19wcmVzZXJ2ZV9wYWdlcyh2bS1cXHUwMDNlcGFnZXNbaV0sIG5yX2NvbnRpZ19wYWdlcyk7XFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xMzg3LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS9tZW1ibG9jay5jPTI2MDg9c3RhdGljIGludCBfX2luaXQgcmVzZXJ2ZWRfbWVtX3ByZXNlcnZlKHZvaWQpXFxuLS1cXG5tbS9tZW1ibG9jay5jLTI2MTctXFxubW0vbWVtYmxvY2suYzoyNjE4OlxcdFxcdGVyciA9IGtob19wcmVzZXJ2ZV9wYWdlcyhwYWdlLCBucl9wYWdlcyk7XFxubW0vbWVtYmxvY2suYy0yNjE5LVxcdFxcdGlmIChlcnIpXFxuLS1cXG5tbS9tZW1ibG9jay5jPTI2Mzc9c3RhdGljIGludCBfX2luaXQgcHJlcGFyZV9raG9fZmR0KHZvaWQpXFxuLS1cXG5tbS9tZW1ibG9jay5jLTI2NDktXFx0ZmR0ID0gcGFnZV90b192aXJ0KGZkdF9wYWdlKTtcXG5tbS9tZW1ibG9jay5jOjI2NTA6XFx0ZXJyID0ga2hvX3ByZXNlcnZlX3BhZ2VzKGZkdF9wYWdlLCAxKTtcXG5tbS9tZW1ibG9jay5jLTI2NTEtXFx0aWYgKGVycilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6MzIuOTEyOTA1MzMzWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwODQ0NDkzNzk1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgdHJhY2luZyB0aGUgZnVuY3Rpb24gY2FsbHMuIEl0IGxvb2tzIGxpa2UgYGtob19wcmVzZXJ2ZV9wYWdlc2AgaXMga2V5LCBjYWxsZWQgYnkgYGtob19wcmVzZXJ2ZV92bWFsbG9jYCwgd2hpY2ggaXMgaW4gdHVybiB1c2VkIGJ5IGRyaXZlcnMgb3Igc3Vic3lzdGVtcyAtIGludGVyZXN0aW5nLiBUaGUgcGF0Y2ggbW9kaWZpZXMgYGtob19yYWRpeF9hZGRfa2V5YCBhbmQgYGtob19yYWRpeF9kZWxfa2V5YC4gVGhvc2UgYXJlIGNhbGxlZCBieSBga2hvX3ByZXNlcnZlX2ZvbGlvYCBhbmQgYGtob19wcmVzZXJ2ZV9wYWdlc2AsIHdoaWNoIG1ha2VzIHRoZW0gZ29vZCBjYW5kaWRhdGVzLiBUaGVyZSdzIGFsc28gdGhpcyBuZXcgZnVuY3Rpb24sIGBraG9fc2NyYXRjaF9vdmVybGFwYCwgdGhhdCdzIGludHJvZHVjZWQgYW5kIGFsc28gY2FsbGVkIGJ5IGBraG9fcHJlc2VydmVfZm9saW9gIGFuZCBga2hvX3ByZXNlcnZlX3BhZ2VzYC4gQW5kIHRoZW4gdGhlcmUncyBhIG1vZGlmaWNhdGlvbiB0byBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgY2FsbGVkIGJ5IGBhbGxvY19ib290bWVtYCwgZGVlcCBpbiBgbW0vaHVnZXRsYi5jYC4gUmlnaHQsIHRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBzb21lIGZ1enppbmcgZWZmb3J0LlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdG8gZm9jdXMgb24uIEkndmUgZ290IGEgbGlzdCBmb3JtaW5nOiBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgLCBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAsIGBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlYCwgYW5kIGBtZW1ibG9ja19hbGxvY19odWdldGxiYC5cblxuSG9sZCBvbiwgSSBzZWUgYGtob19leHRlbmRfc2NyYXRjaGAgYW5kIGBraG9fbWVtb3J5X2luaXRfZWFybHlgIGFyZSBgX19pbml0YCBmdW5jdGlvbnMuIENhbiBzeXpib3QgZXZlbiBmdXp6IHRob3NlPyBObywgbm90IGRpcmVjdGx5LiBTeXpib3QgdHJpZ2dlcnMgYF9faW5pdGAgZnVuY3Rpb25zIGlmIHRoZXkgYXJlIGNhbGxlZCBkdXJpbmcgYm9vdCwgc28gdGhleSBhcmVuJ3QgZ3JlYXQgY2FuZGlkYXRlcyBmb3IgdGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QuIFRoYXQgbGlzdCBpcyBmb3IgZnV6emVyIHRhcmdldHMuIFNvLCBJIHdpbGwgaW5jbHVkZSBga2hvX3JhZGl4X2FkZF9rZXlgLCBga2hvX3JhZGl4X2RlbF9rZXlgLCBga2hvX3JhZGl4X3dhbGtfdHJlZWAsIGBraG9fcmFkaXhfaW5pdF90cmVlYCwgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgLCBhbmQgYGtob19zY3JhdGNoX292ZXJsYXBgLiBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIGBraG9fcmFkaXhfaW5pdF90cmVlYCBhbmQgYGtob19yYWRpeF9kZXN0cm95X3RyZWVgIHRob3VnaC4gVGhleSBhcmUgZXhwb3J0ZWQgc3ltYm9scywgYnV0IGFyZSB0aGV5IGFjdHVhbGx5IHVzZWQgb3V0c2lkZSB0aGVpciBtb2R1bGU/IEkgc2hvdWxkIGxvb2sgaW50byB0aGF0IGJlZm9yZSBjb21taXR0aW5nIHRoaXMgYXMgYSBwcm9wZXIgZnV6emluZyB0YXJnZXQgbGlzdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE5NTEsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6NDMuNzU3NDAxMTU4WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODAzMDU1NzUxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtob19yYWRpeF9pbml0X3RyZWVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oPTU1PWludCBraG9fcmFkaXhfd2Fsa190cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSxcXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNTYtXFx0XFx0XFx0Y29uc3Qgc3RydWN0IGtob19yYWRpeF93YWxrX2NiICpjYiwgdm9pZCAqZGF0YSk7XFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oOjU3OmludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KTtcXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNTgtdm9pZCBraG9fcmFkaXhfZGVzdHJveV90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmg9NzA9c3RhdGljIGlubGluZSBpbnQga2hvX3JhZGl4X3dhbGtfdHJlZShzdHJ1Y3Qga2hvX3JhZGl4X3RyZWUgKnRyZWUsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tob19yYWRpeF90cmVlLmgtNzUtXFxuaW5jbHVkZS9saW51eC9raG9fcmFkaXhfdHJlZS5oOjc2OnN0YXRpYyBpbmxpbmUgaW50IGtob19yYWRpeF9pbml0X3RyZWUoc3RydWN0IGtob19yYWRpeF90cmVlICp0cmVlLFxcbmluY2x1ZGUvbGludXgva2hvX3JhZGl4X3RyZWUuaC03Ny1cXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3Qga2hvX3JhZGl4X25vZGUgKnJvb3QpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jPTMyMT1zdGF0aWMgdm9pZCBfX2tob19yYWRpeF9kZXN0cm95X3RyZWUoc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290LFxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNDAtLyoqXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzozNDE6ICoga2hvX3JhZGl4X2luaXRfdHJlZSAtIGluaXRpYWxpemUgdGhlIHJhZGl4IHRyZWUuXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0zNDItICogQHRyZWU6ICAgdGhlIHRyZWUgdG8gaW5pdGlhbGl6ZS5cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMzUwLSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MzUxOmludCBraG9fcmFkaXhfaW5pdF90cmVlKHN0cnVjdCBraG9fcmFkaXhfdHJlZSAqdHJlZSwgc3RydWN0IGtob19yYWRpeF9ub2RlICpyb290KVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMzUyLXtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMzYxLX1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jOjM2MjpFWFBPUlRfU1lNQk9MX0dQTChraG9fcmFkaXhfaW5pdF90cmVlKTtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTM2My1cXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTAwNj1zdGF0aWMgdm9pZCBfX2luaXQga2hvX2V4dGVuZF9zY3JhdGNoKHZvaWQpXFxuLS1cXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEwMTgtXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYzoxMDE5OlxcdGVyciA9IGtob19yYWRpeF9pbml0X3RyZWUoXFx1MDAyNnJhZGl4LCBOVUxMKTtcXG5rZXJuZWwvbGl2ZXVwZGF0ZS9rZXhlY19oYW5kb3Zlci5jLTEwMjAtXFx0aWYgKGVycilcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9MTgyMD1zdGF0aWMgX19pbml0IGludCBraG9faW5pdCh2b2lkKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xODI4LVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTgyOTpcXHRlcnIgPSBraG9fcmFkaXhfaW5pdF90cmVlKHRyZWUsIE5VTEwpO1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTgzMC1cXHRpZiAoZXJyKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYz0xOTAyPXZvaWQgX19pbml0IGtob19tZW1vcnlfaW5pdF9lYXJseSh2b2lkKVxcbi0tXFxua2VybmVsL2xpdmV1cGRhdGUva2V4ZWNfaGFuZG92ZXIuYy0xOTE5LVxcdCAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6MTkyMDpcXHRpZiAoa2hvX3JhZGl4X2luaXRfdHJlZShcXHUwMDI2a2hvX2luLnJhZGl4X3RyZWUsIGtob19nZXRfbWVtX21hcChmZHQpKSkge1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtMTkyMS1cXHRcXHQvKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQxMzo0Mjo0NS41NjA0NjQ0MzlaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ3NDcyNDYzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBNZW50YWwgQ2hlY2tsaXN0IGZvciBNZW1vcnkgQWxsb2NhdGlvbiBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gcHV0dGluZyB0b2dldGhlciBhIG1lbnRhbCBtYXAgb2Ygd2hlcmUgdGhlc2Uga2V5IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhcmUgdXNlZC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGhhdmUgYSBjb21wcmVoZW5zaXZlIG92ZXJ2aWV3LCBlc3BlY2lhbGx5IHNpbmNlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgc28gZnVuZGFtZW50YWwgdG8gdGhlIHN5c3RlbSdzIG9wZXJhdGlvbi4gIEkga25vdyB0aGV5J3JlIGRlZmluaXRlbHkgZXhwb3J0ZWQgYW5kIHV0aWxpemVkIGluIGBraG9faW5pdGAsIGBraG9fZXh0ZW5kX3NjcmF0Y2hgLCBhbmQgYGtob19tZW1vcnlfaW5pdF9lYXJseWAuXG5cbkkgc2hvdWxkIHByb2JhYmx5IGFsc28gaW5jbHVkZSB0aGVzZSByYWRpeCB0cmVlIGZ1bmN0aW9ucyBpbiBteSB0aGlua2luZzogYGtob19yYWRpeF9hZGRfa2V5YCwgYGtob19yYWRpeF9kZWxfa2V5YCwgYGtob19yYWRpeF93YWxrX3RyZWVgLCBga2hvX3JhZGl4X2luaXRfdHJlZWAsIGFuZCBga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZWAuIEknbSBhbHNvIHJlbWVtYmVyaW5nIGBraG9fc2NyYXRjaF9vdmVybGFwYCBhbmQgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIGFyZSBwcm9iYWJseSB3b3J0aCBsaXN0aW5nLiBBbmQgb2YgY291cnNlLCB0aGUgYmlnIG9uZTogYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgLlxuXG5MZXQgbWUgcXVpY2tseSB2ZXJpZnkgc29tZXRoaW5nIGFib3V0IGBtZW1ibG9ja19hbGxvY19odWdldGxiYC4gIEFoLCB5ZXMsIHRoYXQncyBkZWZpbmVkIGFzIGBfX2luaXRgLiBOb3csIHdoYXQgYWJvdXQgYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgPyBIbW0sIGl0IGxvb2tzIGxpa2UgaXQgaXNuJ3QgYF9faW5pdGAuIExldCBtZSBkb3VibGUtY2hlY2sgdGhhdC4uLiBqdXN0IHRvIGJlIGNlcnRhaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzODQyLCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjUwLjAzNTE5MTM4MloiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgyMTI0ODE4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaD00MT1ib29sIGtob19zY3JhdGNoX292ZXJsYXAocGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUpO1xcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaDo0Mjp2b2lkIGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7XFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTQzLSNlbHNlXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg9MTIyPXN0YXRpYyBpbmxpbmUgYm9vbCBraG9fc2NyYXRjaF9vdmVybGFwKHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplKVxcbi0tXFxuaW5jbHVkZS9saW51eC9rZXhlY19oYW5kb3Zlci5oLTEyNi1cXG5pbmNsdWRlL2xpbnV4L2tleGVjX2hhbmRvdmVyLmg6MTI3OnN0YXRpYyBpbmxpbmUgdm9pZCBraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxcbmluY2x1ZGUvbGludXgva2V4ZWNfaGFuZG92ZXIuaC0xMjgtXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBlbmRfcGZuKTtcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM9NzkzPWJvb2wga2hvX3NjcmF0Y2hfb3ZlcmxhcChwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSlcXG4tLVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODEyLSAqL1xcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmM6ODEzOnZvaWQga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKVxcbmtlcm5lbC9saXZldXBkYXRlL2tleGVjX2hhbmRvdmVyLmMtODE0LXtcXG4tLVxcbm1tL21tX2luaXQuYz02OTQ9dm9pZCBfX21lbWluaXQgX19pbml0X3BhZ2VfZnJvbV9uaWQodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpXFxuLS1cXG5tbS9tbV9pbml0LmMtNzEyLVxcdFxcdC8qIFVwZGF0ZSB0aGUgbWlncmF0ZSB0eXBlIGluIGNhc2UgaXQgaXMgS0hPIHNjcmF0Y2guICovXFxubW0vbW1faW5pdC5jOjcxMzpcXHRcXHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHBmbiwgcGZuICsgMSk7XFxubW0vbW1faW5pdC5jLTcxNC1cXHR9XFxuLS1cXG5tbS9tbV9pbml0LmM9ODc1PXZvaWQgX19tZW1pbml0IG1lbW1hcF9pbml0X3JhbmdlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyB6b25lLFxcbi0tXFxubW0vbW1faW5pdC5jLTk1MC1cXHQgKi9cXG5tbS9tbV9pbml0LmM6OTUxOlxcdGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGUoc3RhcnRfcGZuLCBwZm4pO1xcbm1tL21tX2luaXQuYy05NTItfVxcbi0tXFxubW0vbW1faW5pdC5jPTIwMjM9c3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGRlZmVycmVkX2luaXRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsXFxuLS1cXG5tbS9tbV9pbml0LmMtMjA0NC1cXHQgKi9cXG5tbS9tbV9pbml0LmM6MjA0NTpcXHRraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlKHN0YXJ0X3BmbiwgZW5kX3Bmbik7XFxubW0vbW1faW5pdC5jLTIwNDYtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjUxLjg1NjQ0NDc0M1oiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTk5Mzk5OTc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkluaXRpYWwgQXNzZXNzbWVudCBvZiBNZW1vcnkgSW5pdGlhbGl6YXRpb24gRnVuY3Rpb25zKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCBhbmQgYSBmZXcgdGhpbmdzIGp1bXAgb3V0LiBUaGUgZnVuY3Rpb24gYGtob19pbml0X3NjcmF0Y2hfbWlncmF0ZXR5cGVgIGlzbid0IGV4cGxpY2l0bHkgbWFya2VkIGFzIGFuIGBfX2luaXRgIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGJpdCBvZGQsIGJ1dCBJIHNlZSBpdCdzIGNhbGxlZCBmcm9tIGJvdGggYF9faW5pdGAgYW5kIGBfX21lbWluaXRgIGZ1bmN0aW9ucy4gVGhhdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgYGtob19yYWRpeF9hZGRfa2V5YCwgYGtob19yYWRpeF9kZWxfa2V5YCwgYW5kIGBraG9fcmFkaXhfd2Fsa190cmVlYCBsb29rIGxpa2UgcHJpbWUgY2FuZGlkYXRlcyBmb3IgZnV6emluZy4gVGhleSBzZWVtIGxpa2UgZ29vZCBzdGFydGluZyBwb2ludHMgdG8gbG9vayBmb3IgbWVtb3J5LXJlbGF0ZWQgdnVsbmVyYWJpbGl0aWVzLiBga2hvX3NjcmF0Y2hfb3ZlcmxhcGAgc2VlbXMgcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgdG9vLCBzbyBJJ2xsIGluY2x1ZGUgaXQgb24gdGhlIGxpc3QuXG5cbk5vdywgbGV0IG1lIHNoaWZ0IGdlYXJzIGFuZCBjaGVjayBmb3IgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVudmlyb25tZW50IHRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIGluLiBJJ20gZ29pbmcgdG8gY2hlY2sgYENPTkZJR19LRVhFQ19IQU5ET1ZFUmAgYW5kIGBDT05GSUdfSFVHRVRMQl9QQUdFYC4gUmlnaHQsIGBDT05GSUdfS0VYRUNfSEFORE9WRVJgIHNlZW1zIHRvIGJlIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gaXRlbS4gQW5kIGBDT05GSUdfSFVHRVRMQl9QQUdFYCBpcyBjcnVjaWFsIGJlY2F1c2UgaXQncyByZXF1aXJlZCBmb3IgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIHRvIGJlIHVzZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoYXQgY2FsbC4gV2FpdCwgYG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGJgIGlzIGRlZmluZWQgaW4gYG1tL21lbWJsb2NrLmNgLiBJdCdzIGRlZmluZWQgdGhlcmUsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGlzbid0IGNvbXBpbGVkIGNvbmRpdGlvbmFsbHkuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgYnVpbGQgY29uZmlndXJhdGlvbnMgdG8gdmVyaWZ5IHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0OTU0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQyOjU3LjA1NTg0NzgzOFoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTc0NzAxMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWVtYmxvY2tfYWxsb2NfaHVnZXRsYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1ibG9jay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbWJsb2NrLmM9MTc1MT12b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWRfcmF3KFxcbi0tXFxubW0vbWVtYmxvY2suYy0xNzY0LS8qKlxcbm1tL21lbWJsb2NrLmM6MTc2NTogKiBtZW1ibG9ja19hbGxvY19odWdldGxiIC0gYWxsb2NhdGUgYm9vdCBtZW1vcnkgZm9yIEh1Z2VUTEIgcGFnZXNcXG5tbS9tZW1ibG9jay5jLTE3NjYtICogQHNpemU6ICAgICAgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBpbiBieXRlc1xcbi0tXFxubW0vbWVtYmxvY2suYy0xNzc3LSAqL1xcbm1tL21lbWJsb2NrLmM6MTc3ODp2b2lkICogX19pbml0IG1lbWJsb2NrX2FsbG9jX2h1Z2V0bGIocGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCwgYm9vbCBleGFjdF9uaWQpXFxubW0vbWVtYmxvY2suYy0xNzc5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMTM6NDI6NTcuMTEzMzIxNzc4WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY4NTY3OTUyNjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBEZXBlbmRlbmNpZXMgb2YgYSBDb2RlIFNuaXBwZXQqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBpZWNlIG9mIGNvZGUgYW5kIGl0J3Mgbm90IGd1YXJkZWQgYnkgYW55IHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGxpa2UgYCNpZmRlZmAuIFRoYXQncyBhIGxpdHRsZSB1bnVzdWFsLiBIb3dldmVyLCBhZnRlciBhIHF1aWNrIGNoZWNrLCBJIGNhbiBzZWUgdGhhdCB0aGlzIGNvZGUgaXMgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gYG1tL2h1Z2V0bGIuY2AuIE5vdywgYG1tL2h1Z2V0bGIuY2AgaXRzZWxmIGlzIG9ubHkgY29tcGlsZWQgd2hlbiB0aGUgYENPTkZJR19IVUdFVExCX1BBR0VgIG9wdGlvbiBpcyBlbmFibGVkIGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gVGhhdCBtZWFucyB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgYXJlIGBLRVhFQ19IQU5ET1ZFUmAgYW5kIGBIVUdFVExCX1BBR0VgLiBSaWdodCwgZ290IGl0LlxuXG5MZXQgbWUganVzdCBtYWtlIHN1cmUgdGhvc2UgYXJlIHByb3Blcmx5IHN1bW1hcml6ZWQ6XG5cbiogICBgS0VYRUNfSEFORE9WRVJgXG4qICAgYEhVR0VUTEJfUEFHRWBcblxuTm93LCBsZXQncyBsb29rIGF0IHRoZSBrZXkgc3ltYm9scyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoaXMuIE9rYXksIEkgc2VlOlxuXG4qICAgYGtob19yYWRpeF9hZGRfa2V5YFxuKiAgIGBraG9fcmFkaXhfZGVsX2tleWBcbiogICBga2hvX3JhZGl4X3dhbGtfdHJlZWBcbiogICBga2hvX3JhZGl4X2luaXRfdHJlZWBcbiogICBga2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZWBcbiogICBga2hvX3NjcmF0Y2hfb3ZlcmxhcGBcbiogICBga2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZWBcbiogICBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmBcblxuSG1tLCBhZnRlciBhIHF1aWNrIGV2YWx1YXRpb24sIGBraG9fcmFkaXhfYWRkX2tleWAgYW5kIGBraG9fcmFkaXhfZGVsX2tleWAgc3RhbmQgb3V0IGFzIHRoZSBtb3N0IGNydWNpYWwgZnVuY3Rpb25zIGhlcmUsIGF0IGxlYXN0IGluIHRoZSBjb250ZXh0IG9mIHdoYXQgSSdtIGxvb2tpbmcgYXQuIGBraG9fc2NyYXRjaF9vdmVybGFwYCBhbHNvIHNlZW1zIHByZXR0eSBpbXBvcnRhbnQuIEFuZCBgbWVtYmxvY2tfYWxsb2NfaHVnZXRsYmAgbG9va3MgbGlrZSBhIHJlbGV2YW50IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLlxuXG5BbHJpZ2h0LCBJIHRoaW5rIEkgaGF2ZSBhIGdvb2QgaGFuZGxlIG9uIHRoaW5ncy4gTGV0J3Mgc2V0IHRoZSByZXN1bHRzIG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzU2ODYsIk91dHB1dFRva2VucyI6MTk4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQ1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDEzOjQzOjAzLjk3MDExOTE0NVoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgyOTU2OTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLRVhFQ19IQU5ET1ZFUlwiLFxuICAgIFwiSFVHRVRMQl9QQUdFXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia2hvX3JhZGl4X2FkZF9rZXlcIixcbiAgICBcImtob19yYWRpeF9kZWxfa2V5XCIsXG4gICAgXCJraG9fcmFkaXhfd2Fsa190cmVlXCIsXG4gICAgXCJraG9fcmFkaXhfaW5pdF90cmVlXCIsXG4gICAgXCJraG9fcmFkaXhfZGVzdHJveV90cmVlXCIsXG4gICAgXCJraG9fc2NyYXRjaF9vdmVybGFwXCIsXG4gICAgXCJraG9faW5pdF9zY3JhdGNoX21pZ3JhdGV0eXBlXCIsXG4gICAgXCJtZW1ibG9ja19hbGxvY19odWdldGxiXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIEtleGVjIEhhbmRvdmVyIChLSE8pIHJhZGl4IHRyZWUgaW1wbGVtZW50YXRpb24sIGludHJvZHVjZXMgbmV3IGZ1bmN0aW9ucyBmb3IgS0hPIHNjcmF0Y2ggbWVtb3J5IG1hbmFnZW1lbnQsIGFuZCBjaGFuZ2VzIGhvdyBIdWdlVExCIHBhZ2VzIGFyZSBhbGxvY2F0ZWQgZHVyaW5nIGJvb3QgdXNpbmcgbWVtYmxvY2suIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gY29yZSBrZXJuZWwgbG9naWMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHRoYXQgY2FuIGJlIHJlYWNoZWQgZHVyaW5nIGJvb3QgYW5kIHJ1bnRpbWUsIG1ha2luZyB0aGVtIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS0VYRUNfSEFORE9WRVJcIixcbiAgICBcIkhVR0VUTEJfUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImtob19yYWRpeF9hZGRfa2V5XCIsXG4gICAgXCJraG9fcmFkaXhfZGVsX2tleVwiLFxuICAgIFwia2hvX3JhZGl4X3dhbGtfdHJlZVwiLFxuICAgIFwia2hvX3JhZGl4X2luaXRfdHJlZVwiLFxuICAgIFwia2hvX3JhZGl4X2Rlc3Ryb3lfdHJlZVwiLFxuICAgIFwia2hvX3NjcmF0Y2hfb3ZlcmxhcFwiLFxuICAgIFwia2hvX2luaXRfc2NyYXRjaF9taWdyYXRldHlwZVwiLFxuICAgIFwibWVtYmxvY2tfYWxsb2NfaHVnZXRsYlwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBLZXhlYyBIYW5kb3ZlciAoS0hPKSByYWRpeCB0cmVlIGltcGxlbWVudGF0aW9uLCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgZm9yIEtITyBzY3JhdGNoIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgY2hhbmdlcyBob3cgSHVnZVRMQiBwYWdlcyBhcmUgYWxsb2NhdGVkIGR1cmluZyBib290IHVzaW5nIG1lbWJsb2NrLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBtZW1vcnkgbWFuYWdlbWVudCB0aGF0IGNhbiBiZSByZWFjaGVkIGR1cmluZyBib290IGFuZCBydW50aW1lLCBtYWtpbmcgdGhlbSB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflowd5694[1] Phase: Succeeded StartedAt: 2026-07-10 13:44:20 +0000 UTC FinishedAt: 2026-07-10 13:44:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-10 13:44:20 +0000 UTC FinishedAt: 2026-07-10 13:44:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2] Phase: Succeeded StartedAt: 2026-07-10 13:44:20 +0000 UTC FinishedAt: 2026-07-10 18:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-10 13:44:20 +0000 UTC FinishedAt: 2026-07-10 18:25:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-10 13:44:20 +0000 UTC FinishedAt: 2026-07-10 13:44:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-10 13:44:20 +0000 UTC FinishedAt: 2026-07-10 13:44:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflowd5694/series-workflowd5694-convert-artifact-2287133699/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-10 13:44:40 +0000 UTC FinishedAt: 2026-07-10 14:24:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-10 13:44:40 +0000 UTC FinishedAt: 2026-07-10 14:24:24 +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:*3c0bb1dc-91f7-4cb6-b558-fd447a54a771,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-workflowd5694/series-workflowd5694-convert-artifact-2287133699/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": "7d3835ef-d8c9-4163-b070-4003b4cceff1", "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-workflowd5694/series-workflowd5694-build-action-377853041/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-10 13:44:40 +0000 UTC FinishedAt: 2026-07-10 14:24:14 +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:*3c0bb1dc-91f7-4cb6-b558-fd447a54a771,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-workflowd5694/series-workflowd5694-convert-artifact-2287133699/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": "7d3835ef-d8c9-4163-b070-4003b4cceff1", "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-workflowd5694/series-workflowd5694-build-action-377853041/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-10 14:24:24 +0000 UTC FinishedAt: 2026-07-10 14:24:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-10 14:24:24 +0000 UTC FinishedAt: 2026-07-10 14:24:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-10 14:24:24 +0000 UTC FinishedAt: 2026-07-10 14:24:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-10 14:24:24 +0000 UTC FinishedAt: 2026-07-10 14:24:34 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflowd5694/series-workflowd5694-convert-artifact-450926266/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-10 14:24:46 +0000 UTC FinishedAt: 2026-07-10 14:26:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-10 14:24:46 +0000 UTC FinishedAt: 2026-07-10 14:26:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7d3835ef-d8c9-4163-b070-4003b4cceff1,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-workflowd5694/series-workflowd5694-build-action-377853041/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-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-10 14:26:48 +0000 UTC FinishedAt: 2026-07-10 14:26:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-10 14:26:48 +0000 UTC FinishedAt: 2026-07-10 14:26:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-10 14:26:48 +0000 UTC FinishedAt: 2026-07-10 15:15:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-10 14:26:48 +0000 UTC FinishedAt: 2026-07-10 15:15:32 +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:*3c0bb1dc-91f7-4cb6-b558-fd447a54a771,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-workflowd5694/series-workflowd5694-convert-artifact-450926266/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": "c6c1d8d0-3b77-4bff-9c3e-9388b3f39e8d", "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-workflowd5694/series-workflowd5694-build-action-2920236318/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-10 14:26:48 +0000 UTC FinishedAt: 2026-07-10 15:15:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*3c0bb1dc-91f7-4cb6-b558-fd447a54a771,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-workflowd5694/series-workflowd5694-convert-artifact-450926266/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": "c6c1d8d0-3b77-4bff-9c3e-9388b3f39e8d", "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-workflowd5694/series-workflowd5694-build-action-2920236318/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-10 15:15:32 +0000 UTC FinishedAt: 2026-07-10 15:15:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-10 15:15:32 +0000 UTC FinishedAt: 2026-07-10 15:15:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-10 15:15:32 +0000 UTC FinishedAt: 2026-07-10 15:17:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-10 15:15:32 +0000 UTC FinishedAt: 2026-07-10 15:17:23 +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:*c6c1d8d0-3b77-4bff-9c3e-9388b3f39e8d,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-workflowd5694/series-workflowd5694-build-action-2920236318/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-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-10 15:17:33 +0000 UTC FinishedAt: 2026-07-10 18:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-10 15:17:33 +0000 UTC FinishedAt: 2026-07-10 18:25:23 +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":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"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:*7d3835ef-d8c9-4163-b070-4003b4cceff1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*c6c1d8d0-3b77-4bff-9c3e-9388b3f39e8d,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-workflowd5694/series-workflowd5694-build-action-377853041/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-workflowd5694/series-workflowd5694-build-action-2920236318/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-10 15:17:33 +0000 UTC FinishedAt: 2026-07-10 15:17:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-10 15:17:33 +0000 UTC FinishedAt: 2026-07-10 15:17:37 +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":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"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-workflowd5694/series-workflowd5694-convert-artifact-3228513519/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-10 15:17:33 +0000 UTC FinishedAt: 2026-07-10 15:17:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-10 15:17:33 +0000 UTC FinishedAt: 2026-07-10 15:17:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-10 15:17:33 +0000 UTC FinishedAt: 2026-07-10 15:17:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-10 15:17:43 +0000 UTC FinishedAt: 2026-07-10 18:25:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowd5694[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["kho_radix_add_key","kho_radix_del_key","kho_radix_walk_tree","kho_radix_init_tree","kho_radix_destroy_tree","kho_scratch_overlap","kho_init_scratch_migratetype","memblock_alloc_hugetlb"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"08412b8c707fdbccb7bf2116f0554fe09113cd53","config_name":"upstream-apparmor-kasan.config","enable_configs":["KEXEC_HANDOVER","HUGETLB_PAGE"],"series_id":"9791f6fe-efb5-4860-88aa-32474db3dd03","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-10 15:17:43 +0000 UTC FinishedAt: 2026-07-10 18:25:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7d3835ef-d8c9-4163-b070-4003b4cceff1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*c6c1d8d0-3b77-4bff-9c3e-9388b3f39e8d,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-workflowd5694/series-workflowd5694-build-action-377853041/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-workflowd5694/series-workflowd5694-build-action-2920236318/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-workflowd5694/series-workflowd5694-convert-artifact-3228513519/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,}