Name: series-workflowft9df Phase: Succeeded StartedAt: 2026-08-20 18:59:03 +0000 UTC FinishedAt: 2026-08-20 22:45:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[0] Phase: Succeeded StartedAt: 2026-08-20 18:59:03 +0000 UTC FinishedAt: 2026-08-20 19:04:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[0].run-triage Phase: Succeeded StartedAt: 2026-08-20 18:59:03 +0000 UTC FinishedAt: 2026-08-20 19:04:52 +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": "4b2ae13f3393ef4b4bce0021e8762790354f369f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "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": "4b2ae13f3393ef4b4bce0021e8762790354f369f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "series_id": "4b03c31f-5176-4b89-ab75-977f5f471d85" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__split_huge_page_to_list_to_order", "folio_split_unmapped", "folio_check_splittable", "__swap_cache_replace_folio" ], "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+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O2ZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChzcGVjaWZpY2FsbHkgZm9yIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zKS4gSXQgbW9kaWZpZXMgaG93IGZvbGlvcyBhcmUgdW5tYXBwZWQsIGZyb3plbiwgYW5kIHNwbGl0LCB1cGRhdGluZyBwYWdlIGNhY2hlIGFuZCBzd2FwIGNhY2hlIHJlZmVyZW5jZXMuIFRoZXNlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHhhcnJheSBtYW5pcHVsYXRpb25zLiBUaGV5IGRvIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiBtZW1vcnkgYnVmZmVycy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIHdvdWxkIG1hbmlmZXN0IGFzIHVzZS1hZnRlci1mcmVlLCBtZW1vcnkgY29ycnVwdGlvbiwgb3IgbG9ja2luZyBpc3N1ZXMsIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBmaXhlcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL2h1Z2VfbWVtb3J5LmMgYW5kIG1tL3N3YXBfc3RhdGUuYywgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCBoYXMgZnVuY3Rpb25hbCBpbXBhY3QuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGNlZDQwMGY3MmQ0M2EuLmNjOWY3ZTBkNDE5NGUgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtMzU4OSw5ICYjNDM7MzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG5AQCAtMzc1NSw4ICYjNDM7Mzc1Miw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiB9XG4gXG4gLyoqXG4tICogX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIC0gc3BsaXRzIGFuIHVubWFwcGVkIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MgaW5cbi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cbiYjNDM7ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zXG4mIzQzOyAqIGluIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XG4gICogICAgICAgICAgICAgYWxsb2NhdG9yIGxpa2Ugc3BsaXQgZ2VuZXJhdGVzIGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tIEBmb2xpbyYjMzk7c1xuQEAgLTM3NjQsNyAmIzQzOzM3NjEsNiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsXG4gICogQHNwbGl0X2F0OiBpbiBidWRkeSBhbGxvY2F0b3IgbGlrZSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0XG4gICogICAgICAgICAgICB3aWxsIGJlIHNwbGl0IHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIuXG4gICogQHhhczogeGFfc3RhdGUgcG9pbnRpbmcgdG8gZm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzIGFuZCBsb2NrZWQgYnkgY2FsbGVyXG4tICogQG1hcHBpbmc6IEBmb2xpby1cdTAwM2VtYXBwaW5nXG4gICogQHNwbGl0X3R5cGU6IGlmIHRoZSBzcGxpdCBpcyB1bmlmb3JtIG9yIG5vdCAoYnVkZHkgYWxsb2NhdG9yIGxpa2Ugc3BsaXQpXG4gICpcbiAgKlxuQEAgLTM3OTUsMTEgJiM0MzszNzkxLDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4mIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcbi1cdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuJiM0MztcdFx0ZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsMTEgJiM0MzszODExLDExIEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XG4gXHRcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFx1MDAzY1x1MDAzYyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpO1xuIFxuLVx0XHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4tXHRcdGlmIChpc19hbm9uIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuJiM0MztcdFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbiYjNDM7XHRcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRpZiAobWFwcGluZykge1xuJiM0MztcdFx0aWYgKHhhcykge1xuIFx0XHRcdC8qXG4gXHRcdFx0ICogdW5pZm9ybSBzcGxpdCBoYXMgeGFzX3NwbGl0X2FsbG9jKCkgY2FsbGVkIGJlZm9yZVxuIFx0XHRcdCAqIGlycSBpcyBkaXNhYmxlZCB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LCB3aGVyZWFzXG5AQCAtMzg3OCwzMiAmIzQzOzM4NzUsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4mIzQzO1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiYjNDM7XG4gXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbiBcdC8qXG4gXHQgKiBGb2xpb3MgdGhhdCBqdXN0IGdvdCB0cnVuY2F0ZWQgY2Fubm90IGdldCBzcGxpdC4gU2lnbmFsIHRvIHRoZVxuLVx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS5cbi1cdCAqXG4tXHQgKiBUT0RPOiB0aGlzIHdpbGwgYWxzbyBjdXJyZW50bHkgcmVmdXNlIGZvbGlvcyB3aXRob3V0IGEgbWFwcGluZyBpbiB0aGVcbi1cdCAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLlxuJiM0MztcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuJiM0MztcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxuIFx0ICovXG4tXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuJiM0MztcdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWlzX3N3YXBjYWNoZSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbi1cdC8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi9cbi1cdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4gXHQvKlxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMFxuLVx0ICpcbi1cdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cbi1cdCAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnlcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWRcbi1cdCAqIGhlcmUuXG4mIzQzO1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuJiM0MztcdCAqIGRlZmVycmVkIHNwbGl0IGxpc3QsIGh5YnJpZCBzaG1lbSBcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxuJiM0MztcdCAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZFxuJiM0MztcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4mIzQzO1x0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdH1cbiBcbiBcdGlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0zOTExLDM5ICYjNDM7MzkwMiw5NyBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXG4mIzQzO1x0ICogc2htZW0gZm9saW8gdW5kZXIgU1dBUCBJTywgaXQmIzM5O3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXG4mIzQzO1x0ICogc2htZW0gbWFwcGluZyBhZnRlcndhcmQuIFRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZyB0aGVtXG4mIzQzO1x0ICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghaXNfYW5vbiBcdTAwMjZcdTAwMjYgaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiBmb2xpby1cdTAwM2VtYXBwaW5nKVxuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqL1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4mIzQzOy8qKlxuJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpb1xuJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZFxuJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4mIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG9cbiYjNDM7ICogICAgICAgICAgdGhlIExSVSBsaXN0XG4mIzQzOyAqIEBhbm9uX3VubWFwOiBpZiB0cnVlLCB1bm1hcCBAZm9saW8gYmVmb3JlIHRoZSBzcGxpdCBhbmQgcmVtYXAgaXQgYWZ0ZXJcbiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4mIzQzOyAqXG4mIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzXG4mIzQzOyAqIEBhbm9uX3VubWFwIGlzIGZhbHNlKSwgZnJlZXplcyBpdHMgcmVmY291bnQsIGFuZCBwZXJmb3JtcyB0aGUgc3BsaXQsIHVwZGF0ZXNcbiYjNDM7ICogdGhlIHN3YXAgY2FjaGUgZW50cmllcy4gU3BsaXQgZm9saW9zIGFyZSB1bmZyb3plbiBhbmQgcmVtYXBwZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuJiM0MztcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4mIzQzO1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuJiM0MztcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuJiM0MztcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4gXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XG4mIzQzO1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xuIFx0aW50IHJldCA9IDA7XG4gXG4tXHRWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgXHUwMDI2XHUwMDI2IGVuZCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcbiYjNDM7XHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cbiYjNDM7XHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbiYjNDM7XHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xuJiM0MztcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4mIzQzO1x0XHRpZiAoIWFub25fdm1hKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi9cbiYjNDM7XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChhbm9uX3VubWFwKVxuJiM0MztcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuJiM0MztcbiYjNDM7XHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCxcbiYjNDM7XHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4mIzQzO1x0ZGVxdWV1ZV9kZWZlcnJlZCA9IG9sZF9vcmRlciBcdTAwM2UgMSBcdTAwMjZcdTAwMjYgaXNfYW5vbjtcbiBcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4gXHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiBcbkBAIC0zOTUyLDEyOCAmIzQzOzQwMDEsMjU2IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gXHRcdGxydSA9IGxpc3RfbHJ1X2xvY2soXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxuIFx0XHRcdFx0ICAgIGZvbGlvX25pZChmb2xpbyksIFx1MDAyNm1lbWNnKTtcbiBcdH1cbi1cdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4mIzQzO1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkge1xuIFx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuLVx0XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuLVx0XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4tXHRcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbi1cdFx0XHRcdFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuLVx0XHRcdH1cbiBcdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbiBcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0fVxuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gb3V0X25vX3NwbGl0O1xuJiM0MztcdH1cbiBcbi1cdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4tXG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX1NITUVNX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9GSUxFX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuJiM0MztcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4mIzQzO1x0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbiYjNDM7XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbiYjNDM7XHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4mIzQzO1x0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuJiM0MztcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbiYjNDM7XHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbiYjNDM7XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4mIzQzO1x0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiYjNDM7XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4gXG4tXHRcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbi1cdFx0fVxuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4gXG4tXHRcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuJiM0MztcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4mIzQzO1x0ICogcGxhY2UuIEtlZXAgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kOiBzdWIgZW50cmllc1xuJiM0MztcdCAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnRcbiYjNDM7XHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXG4mIzQzO1x0ICogZW50cnkgKGZvbGlvX3RyeV9nZXQoKSB3aWxsIGZhaWwgb24gdGhlIGhlYWQgQGZvbGlvIHVudGlsIHVuZnJlZXplKS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuJiM0MztcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuJiM0MztcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbiYjNDM7XHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4mIzQzO1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuJiM0MztcdFx0XHRcdCAgIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTtcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4mIzQzO1x0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbiYjNDM7XHRcdGlmIChjaSlcbiYjNDM7XHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuJiM0MztcdH1cbiBcbi1cdFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxuLVx0XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuJiM0MztcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xuJiM0MztcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbi1cdFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlXG4tXHRcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuLVx0XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4tXHRcdCAqIEBmb2xpby5cbi1cdFx0ICovXG4tXHRcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4tXHRcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4mIzQzO1x0aWYgKGNpKVxuJiM0MztcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4mIzQzO291dF9ub19zcGxpdDpcbiYjNDM7XHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4mIzQzO1x0aWYgKGFub25fdm1hKSB7XG4mIzQzO1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbiYjNDM7XHRcdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4mIzQzO1x0XHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4mIzQzO1x0fVxuJiM0MztvdXRfdW5sb2NrOlxuJiM0MztcdGlmIChhbm9uX3ZtYSkge1xuJiM0MztcdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcbiYjNDM7XHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4mIzQzO1x0fVxuIFxuLVx0XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuIFxuLVx0XHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4mIzQzOy8qKlxuJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpb1xuJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZCBhbmQgZmlsZS1iYWNrZWRcbiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcbiYjNDM7ICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4mIzQzOyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxuJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcbiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4mIzQzOyAqXG4mIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzXG4mIzQzOyAqIHJlZmNvdW50LCBhbmQgcGVyZm9ybSB0aGUgc3BsaXQsIHVwZGF0ZXMgdGhlIHBhZ2UgY2FjaGUgZW50cmllcy4gU3BsaXRcbiYjNDM7ICogZm9saW9zIGFyZSB1bmZyb3plbiBidXQgbm90IHJlbWFwcGVkLCB0aGV5IGFyZSBmYXVsdGVkIGJhY2sgaW4gb24gZGVtYW5kLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4gKGlmIC1FTk9NRU1cbiYjNDM7ICogaXMgcmV0dXJuZWQsIEBmb2xpbyBtaWdodCBiZSBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIpXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cdTAwM2VtYXBwaW5nO1xuJiM0MztcdFhBX1NUQVRFKHhhcywgXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4mIzQzO1x0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbiYjNDM7XHRsb25nIG9sZF9ucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbiYjNDM7XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuJiM0MztcdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgbWluX29yZGVyO1xuJiM0MztcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiYjNDM7XHRwZ29mZl90IGVuZCA9IDA7XG4mIzQzO1x0Z2ZwX3QgZ2ZwO1xuJiM0MztcdGludCByZXQgPSAwO1xuIFxuLVx0XHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4tXHRcdFx0XHRcdCAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuJiM0MztcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcilcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0XHRcdGlmIChkb19scnUpXG4tXHRcdFx0XHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuJiM0MztcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuJiM0MztcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cbi1cdFx0XHQgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChjaSkge1xuLVx0XHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuJiM0MztcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjYgR0ZQX1JFQ0xBSU1fTUFTSyk7XG4mIzQzO1x0aWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHtcbiYjNDM7XHRcdHJldCA9IC1FQlVTWTtcbiYjNDM7XHRcdGdvdG8gZmFpbF9mcmVlO1xuJiM0MztcdH1cbiBcbi1cdFx0XHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXG4tXHRcdFx0aWYgKCFtYXBwaW5nKVxuLVx0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0bWFwcGluZ19zZXRfdXBkYXRlKFx1MDAyNnhhcywgbWFwcGluZyk7XG4gXG4tXHRcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4tXHRcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4tXHRcdFx0XHRfX3hhX3N0b3JlKFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgbmV3X2ZvbGlvLVx1MDAzZWluZGV4LFxuLVx0XHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuJiM0MztcdGlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkge1xuJiM0MztcdFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcbi1cdFx0XHRWTV9XQVJOX09OX09OQ0UoIW5yX3NobWVtX2Ryb3BwZWQpO1xuLVx0XHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4tXHRcdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXHUwMDI2XHUwMDI2IG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdFx0XHQqbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7XG4tXHRcdFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxuLVx0XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxuLVx0XHRcdFx0XHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuLVx0XHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbi1cdFx0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiYjNDM7XHRcdHhhc19zZXRfb3JkZXIoXHUwMDI2eGFzLCBmb2xpby1cdTAwM2VpbmRleCwgbmV3X29yZGVyKTtcbiYjNDM7XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4mIzQzO1x0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbiYjNDM7XHRcdFx0cmV0ID0geGFzX2Vycm9yKFx1MDAyNnhhcyk7XG4mIzQzO1x0XHRcdGdvdG8gZmFpbF9mcmVlO1xuIFx0XHR9XG4mIzQzO1x0fVxuIFxuLVx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbi1cdFx0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuLVx0XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuLVx0XHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICovXG4tXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTtcbiYjNDM7XHRpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpO1xuIFxuLVx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbiYjNDM7XHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbiYjNDM7XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbiYjNDM7XHR9XG4gXG4tXHRcdGlmIChjaSlcbi1cdFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdH0gZWxzZSB7XG4tXHRcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4tXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuJiM0MztcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4mIzQzO1x0ICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLlxuJiM0MztcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuJiM0MztcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4mIzQzO1x0ICovXG4mIzQzO1x0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4mIzQzO1x0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4mIzQzO1x0XHRlbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy1cdTAwM2Vob3N0LCBlbmQpO1xuJiM0MztcbiYjNDM7XHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4mIzQzO1xuJiM0MztcdHhhc19sb2NrX2lycShcdTAwMjZ4YXMpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4mIzQzO1x0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHhhc19sb2FkKFx1MDAyNnhhcykgIT0gZm9saW8pIHtcbiYjNDM7XHRcdHJldCA9IC1FQUdBSU47XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIG9sZF9ucl9wYWdlcyAmIzQzOyAxKSkge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2IG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4mIzQzO1x0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcbiYjNDM7XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovXG4mIzQzO1x0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuJiM0MztcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIHNwbGl0X3R5cGUpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbiYjNDM7XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbiYjNDM7XHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3NcbiYjNDM7XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuJiM0MztcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbiYjNDM7XHQgKiBAZm9saW8uXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbiYjNDM7XHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuJiM0MztcbiYjNDM7XHRcdC8qIGNvbXB1dGUgbmV4dCBiZWZvcmUgdGhlIGZvbGlvIGNhbiBiZSBmcmVlZCBiZWxvdyAqL1xuJiM0MztcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuJiM0MztcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgJiM0MzsgMSk7XG4mIzQzO1xuJiM0MztcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuJiM0MztcbiYjNDM7XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuJiM0MztcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4mIzQzO1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4mIzQzO1x0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4mIzQzO1xuJiM0MztcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbiYjNDM7XHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuJiM0MztcdFx0XHRucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlcztcbiYjNDM7XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbiYjNDM7XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuJiM0MztcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuJiM0MztcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuJiM0MztcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbiYjNDM7XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuJiM0MztcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbiYjNDM7ZmFpbDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbiYjNDM7XHQgKiByZW1lbWJlciB0byBhZGQgcmVtYXBfcGFnZSgpIGFuZCBhZGFwdCBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuJiM0MztmYWlsX21tYXBfdW5sb2NrOlxuJiM0MztcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuJiM0MztcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4mIzQzO1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuJiM0MztcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcbiYjNDM7XHQgKiB0aGUgbWFwcGluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4mIzQzO2ZhaWxfZnJlZTpcbiYjNDM7XHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuJiM0MztcdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcbiYjNDM7XHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4mIzQzO1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSAmIzQzOzQyNjMsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuICAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbiAgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4gICpcbi0gKiBJdCBjYWxscyBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiYjNDM7ICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cbiYjNDM7ICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICYjNDM7NDI3OSwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCxcbiBcdFx0c3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuLVx0WEFfU1RBVEUoeGFzLCBcdTAwMjZmb2xpby1cdTAwM2VtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbiYjNDM7XHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICYjNDM7NDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuJiM0MztcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRpZiAobmV3X29yZGVyIFx1MDAzZT0gb2xkX29yZGVyKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuJiM0MztcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIHN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbiYjNDM7XHRpZiAoaXNfYW5vbilcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbiYjNDM7XHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXG4mIzQzO1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgJiM0Mzs0MzI0LDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpXG4gXHRcdFx0Y29udGludWU7XG4gXG4tXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuIFx0XHQvKlxuIFx0XHQgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWRcbiBcdFx0ICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlXG4tXHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWxcbiYjNDM7XHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4mIzQzO1x0XHRpZiAoaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiAhZm9saW9fbWFwcGVkKG5ld19mb2xpbykpXG4mIzQzO1x0XHRcdGZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XG4mIzQzO1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJiMzOTtzIG9sZF9tZW1jZyAqL1xuLVx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuLVx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuLW91dF9ub19tZW1jZzpcbi1cdHhhc19kZXN0cm95KFx1MDAyNnhhcyk7XG4gXHRpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpXG4gXHRcdGNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7XG4gXHRjb3VudF9tdGhwX3N0YXQob2xkX29yZGVyLCAhcmV0ID8gTVRIUF9TVEFUX1NQTElUIDogTVRIUF9TVEFUX1NQTElUX0ZBSUxFRCk7XG5AQCAtNDMxMSwyOSAmIzQzOzQzNjAsMjAgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gICogaXNvbGF0ZWQgZnJvbSBMUlUgKGlmIGFwcGxpY2FibGUpXG4gICpcbiAgKiBVcG9uIHJldHVybiwgdGhlIGZvbGlvIGlzIG5vdCByZW1hcHBlZCwgc3BsaXQgZm9saW9zIGFyZSBub3QgYWRkZWQgdG8gTFJVLFxuLSAqIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuJiM0MzsgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIGZhbHNlLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSk7XG4gfVxuIFxuIC8qXG5AQCAtNDM1MiwxMCAmIzQzOzQzOTIsOSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXG4gICpcbi0gKiA0KSBAbmV3X29yZGVyIFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxuLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxuLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4mIzQzOyAqIDQpIEBuZXdfb3JkZXIgIT0gMSBmb3IgYW5vbiBvciBzd2FwY2FjaGUuIEFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvclxuJiM0MzsgKiAgICBfZGVmZXJyZWRfbGlzdCwgd2hpY2ggb3JkZXItMSBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heVxuJiM0MzsgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJiMzOTtzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLFxuQEAgLTQzODQsNyAmIzQzOzQ0MjMsNyBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiB3aXRoIHRoZSBmb2xpby4gU3BsaXR0aW5nIHRvIG9yZGVyIDAgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBmb2xpb3MuXG4gICovXG4gaW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG4tXHRcdFx0XHQgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0zODksOCAmIzQzOzM4OSw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdCAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHtcbiBcdFx0Y2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC1cdTAwM2Vzd2FwKTtcbiBcdFx0Y2lfZW5kID0gY2lfb2ZmICYjNDM7IGZvbGlvX25yX3BhZ2VzKG9sZCk7XG4tXHRcdHdoaWxlIChjaV9vZmYmIzQzOyYjNDM7IFx1MDAzYyBjaV9lbmQpXG4mIzQzO1x0XHRkbyB7XG4gXHRcdFx0V0FSTl9PTl9PTkNFKHN3cF90Yl90b19mb2xpbyhfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSAhPSBvbGQpO1xuJiM0MztcdFx0fSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiBcdTAwM2MgY2lfZW5kKTtcbiBcdH1cbiB9XG4gXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O2ZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBmaXhlcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL2h1Z2VfbWVtb3J5LmMgYW5kIG1tL3N3YXBfc3RhdGUuYywgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCBoYXMgZnVuY3Rpb25hbCBpbXBhY3QuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBjZWQ0MDBmNzJkNDNhLi5jYzlmN2UwZDQxOTRlIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTM1ODksOSAmIzQzOzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncykKIHsKIAlpbnQgaSA9IDA7CiAKLQkvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqLwotCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKLQkJcmV0dXJuOwogCWZvciAoOzspIHsKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpOwogCQlpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CkBAIC0zNzU1LDggJiM0MzszNzUyLDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLAogfQogCiAvKioKLSAqIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSAtIHNwbGl0cyBhbiB1bm1hcHBlZCBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zIGluCi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC4KJiM0MzsgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIC0gc3BsaXRzIGEgZnJvemVuIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MKJiM0MzsgKiBpbiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC4KICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvCiAgKiBAbmV3X29yZGVyOiB0aGUgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyIHNwbGl0IGZvbGlvcyAoc2luY2UgYnVkZHkKICAqICAgICAgICAgICAgIGFsbG9jYXRvciBsaWtlIHNwbGl0IGdlbmVyYXRlcyBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbSBAZm9saW8mIzM5O3MKQEAgLTM3NjQsNyAmIzQzOzM3NjEsNiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBAc3BsaXRfYXQ6IGluIGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQKICAqICAgICAgICAgICAgd2lsbCBiZSBzcGxpdCB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyLgogICogQHhhczogeGFfc3RhdGUgcG9pbnRpbmcgdG8gZm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMgYW5kIGxvY2tlZCBieSBjYWxsZXIKLSAqIEBtYXBwaW5nOiBAZm9saW8tJmd0O21hcHBpbmcKICAqIEBzcGxpdF90eXBlOiBpZiB0aGUgc3BsaXQgaXMgdW5pZm9ybSBvciBub3QgKGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0KQogICoKICAqCkBAIC0zNzk1LDExICYjNDM7Mzc5MSwxMiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCAmbHQ7MCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlCiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spCiAgKi8KLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAomIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQomIzQzOwkJZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiAJY29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKJiM0MzsJY29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAlpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7CiAJc3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbzsKQEAgLTM4MTQsMTEgJiM0MzszODExLDExIEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogCSAgICAgc3BsaXRfb3JkZXItLSkgewogCQlpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCAmbHQ7Jmx0OyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpOwogCi0JCS8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJaWYgKGlzX2Fub24gJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQomIzQzOwkJLyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KJiM0MzsJCWlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpICZhbXA7JmFtcDsgc3BsaXRfb3JkZXIgPT0gMSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChtYXBwaW5nKSB7CiYjNDM7CQlpZiAoeGFzKSB7CiAJCQkvKgogCQkJICogdW5pZm9ybSBzcGxpdCBoYXMgeGFzX3NwbGl0X2FsbG9jKCkgY2FsbGVkIGJlZm9yZQogCQkJICogaXJxIGlzIGRpc2FibGVkIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnksIHdoZXJlYXMKQEAgLTM4NzgsMzIgJiM0MzszODc1LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJCSAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKJiM0MzsKIAlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAkvKgogCSAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlCi0JICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4KLQkgKgotCSAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZQotCSAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLgomIzQzOwkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8KJiM0MzsJICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuCiAJICovCi0JaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWlzX3N3YXBjYWNoZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi8KLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qCi0JICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMAotCSAqCi0JICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbQotCSAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnkKLQkgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkCi0JICogaGVyZS4KJiM0MzsJICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZQomIzQzOwkgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gJmFtcDsgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdAomIzQzOwkgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGQKJiM0MzsJICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LgogCSAqLwotCWlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgJmFtcDsmYW1wOyBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKJiM0MzsJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkxMSwzOSAmIzQzOzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAlpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKQogCQlyZXR1cm4gLUVCVVNZOwogCiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhCiYjNDM7CSAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0JiMzOTtzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvcgomIzQzOwkgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW0KJiM0MzsJICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkCiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGUKJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXQKJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIKJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG8KJiM0MzsgKiAgICAgICAgICB0aGUgTFJVIGxpc3QKJiM0MzsgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzCiYjNDM7ICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlcwomIzQzOyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLAomIzQzOwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7NDAwMSwyNTYgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiAKLQkJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIHBvc3Qtc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzCiYjNDM7CSAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnQKJiM0MzsJICogc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvIGZvciBhIHN1YgomIzQzOwkgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLgomIzQzOwkgKi8KJiM0MzsJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKJiM0MzsJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7CiYjNDM7CQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sCiYjNDM7CQkJCSAgIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKIAkJaWYgKGRvX2xydSkKLQkJCWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CQlpZiAoY2kpCiYjNDM7CQkJX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pOwomIzQzOwl9CiAKLQkJcmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLAotCQkJCQkgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpOwomIzQzOwl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKIAotCQkvKgotCQkgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0Ci0JCSAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZQotCQkgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3MKLQkJICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZgotCQkgKiBAZm9saW8uCi0JCSAqLwotCQlmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvOwotCQkgICAgIG5ld19mb2xpbyA9IG5leHQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pOwomIzQzOwlpZiAoZG9fbHJ1KQomIzQzOwkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwlpZiAoY2kpCiYjNDM7CQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKJiM0MztvdXRfbm9fc3BsaXQ6CiYjNDM7CWxvY2FsX2lycV9lbmFibGUoKTsKJiM0MzsJaWYgKGFub25fdm1hKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3ZtYSkgewomIzQzOwkJYW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTsKJiM0MzsJCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7CiYjNDM7CX0KIAotCQkJbmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiAKLQkJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7LyoqCiYjNDM7ICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW8KJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZCBhbmQgZmlsZS1iYWNrZWQKJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZQomIzQzOyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KQomIzQzOyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdAomIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlcgomIzQzOyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTEwKJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpCiYjNDM7ICoKJiM0MzsgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0cwomIzQzOyAqIHJlZmNvdW50LCBhbmQgcGVyZm9ybSB0aGUgc3BsaXQsIHVwZGF0ZXMgdGhlIHBhZ2UgY2FjaGUgZW50cmllcy4gU3BsaXQKJiM0MzsgKiBmb2xpb3MgYXJlIHVuZnJvemVuIGJ1dCBub3QgcmVtYXBwZWQsIHRoZXkgYXJlIGZhdWx0ZWQgYmFjayBpbiBvbiBkZW1hbmQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4gKGlmIC1FTk9NRU0KJiM0MzsgKiBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlcikKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiYjNDM7CQkJCQkgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAomIzQzOwkJCQkJICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQomIzQzO3sKJiM0MzsJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby0mZ3Q7bWFwcGluZzsKJiM0MzsJWEFfU1RBVEUoeGFzLCAmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiYjNDM7CWxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7CiYjNDM7CXN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDsKJiM0MzsJaW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgbWluX29yZGVyOwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiYjNDM7CXBnb2ZmX3QgZW5kID0gMDsKJiM0MzsJZ2ZwX3QgZ2ZwOwomIzQzOwlpbnQgcmV0ID0gMDsKIAotCQkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKLQkJCQkJICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiYjNDM7CW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwomIzQzOwlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWlmIChkb19scnUpCi0JCQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkvKgomIzQzOwkgKiBTd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAomIzQzOwkgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuCiYjNDM7CSAqLwomIzQzOwltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwomIzQzOwlvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTsKIAotCQkJLyoKLQkJCSAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuCi0JCQkgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJICovCi0JCQlpZiAoY2kpIHsKLQkJCQlfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmYW1wOyBHRlBfUkVDTEFJTV9NQVNLKTsKJiM0MzsJaWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHsKJiM0MzsJCXJldCA9IC1FQlVTWTsKJiM0MzsJCWdvdG8gZmFpbF9mcmVlOwomIzQzOwl9CiAKLQkJCS8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi8KLQkJCWlmICghbWFwcGluZykKLQkJCQljb250aW51ZTsKJiM0MzsJbWFwcGluZ19zZXRfdXBkYXRlKCZhbXA7eGFzLCBtYXBwaW5nKTsKIAotCQkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCi0JCQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewotCQkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAotCQkJCQkgICBuZXdfZm9saW8sIDApOwotCQkJCWNvbnRpbnVlOwotCQkJfQomIzQzOwlpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHsKJiM0MzsJCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAKLQkJCVZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7Ci0JCQkvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC0mZ3Q7aW5kZXggJmd0Oz0gZW5kICovCi0JCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSAmYW1wOyZhbXA7IG5yX3NobWVtX2Ryb3BwZWQpCi0JCQkJKm5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwotCQkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQotCQkJCWZvbGlvX2FjY291bnRfY2xlYW5lZCgKLQkJCQkJbmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7Ci0JCQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7Ci0JCQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKJiM0MzsJCXhhc19zZXRfb3JkZXIoJmFtcDt4YXMsIGZvbGlvLSZndDtpbmRleCwgbmV3X29yZGVyKTsKJiM0MzsJCXhhc19zcGxpdF9hbGxvYygmYW1wO3hhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTsKJiM0MzsJCWlmICh4YXNfZXJyb3IoJmFtcDt4YXMpKSB7CiYjNDM7CQkJcmV0ID0geGFzX2Vycm9yKCZhbXA7eGFzKTsKJiM0MzsJCQlnb3RvIGZhaWxfZnJlZTsKIAkJfQomIzQzOwl9CiAKLQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7Ci0JCS8qCi0JCSAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoCi0JCSAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy4KLQkJICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW8KLQkJICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqLwotCQlmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiYjNDM7CWlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7CiAKLQkJaWYgKGRvX2xydSkKLQkJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsX21tYXBfdW5sb2NrOwomIzQzOwl9CiAKLQkJaWYgKGNpKQotCQkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGRlcXVldWVfZGVmZXJyZWQpIHsKLQkJCWxpc3RfbHJ1X3VubG9jayhscnUpOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CS8qCiYjNDM7CSAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kCiYjNDM7CSAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlCiYjNDM7CSAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay4KJiM0MzsJICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsCiYjNDM7CSAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuCiYjNDM7CSAqLwomIzQzOwllbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy0mZ3Q7aG9zdCksIFBBR0VfU0laRSk7CiYjNDM7CWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctJmd0O2hvc3QsIGVuZCk7CiYjNDM7CiYjNDM7CXVubWFwX2ZvbGlvKGZvbGlvKTsKJiM0MzsKJiM0MzsJeGFzX2xvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KJiM0MzsJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCiYjNDM7CSAqLwomIzQzOwlpZiAoeGFzX2xvYWQoJmFtcDt4YXMpICE9IGZvbGlvKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICYjNDM7IDEpKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgJmFtcDsmYW1wOyBuZXdfb3JkZXIgJmx0OyBIUEFHRV9QTURfT1JERVIpIHsKJiM0MzsJCWlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKQomIzQzOwkJCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqLwomIzQzOwlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgc3BsaXRfdHlwZSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKJiM0MzsJICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlCiYjNDM7CSAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvcwomIzQzOwkgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mCiYjNDM7CSAqIEBmb2xpby4KJiM0MzsJICovCiYjNDM7CWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87CiYjNDM7CSAgICAgbmV3X2ZvbGlvID0gbmV4dCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQkvKiBjb21wdXRlIG5leHQgYmVmb3JlIHRoZSBmb2xpbyBjYW4gYmUgZnJlZWQgYmVsb3cgKi8KJiM0MzsJCW5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICYjNDM7IDEpOwomIzQzOwomIzQzOwkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwomIzQzOwkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCiYjNDM7CQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewomIzQzOwkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAomIzQzOwkJCQkgICBuZXdfZm9saW8sIDApOwomIzQzOwkJCWNvbnRpbnVlOwogCQl9Ci0JCXJldHVybiAtRUFHQUlOOwomIzQzOwomIzQzOwkJLyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtJmd0O2luZGV4ICZndDs9IGVuZCAqLwomIzQzOwkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQkJbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7CiYjNDM7CQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCiYjNDM7CQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbywKJiM0MzsJCQkJCSAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKJiM0MzsJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKJiM0MzsJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaAomIzQzOwkgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuCiYjNDM7CSAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvCiYjNDM7CSAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKi8KJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgJiM0MzsgMSk7CiYjNDM7CWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MztmYWlsOgomIzQzOwkvKgomIzQzOwkgKiBJZiB3ZSB3YW50IHRvIHVzZSB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUgaW4gdW5tYXBfZm9saW8sCiYjNDM7CSAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LgomIzQzOwkgKi8KJiM0MzsJeGFzX3VubG9ja19pcnEoJmFtcDt4YXMpOwomIzQzO2ZhaWxfbW1hcF91bmxvY2s6CiYjNDM7CWlmIChucl9zaG1lbV9kcm9wcGVkKQomIzQzOwkJc2htZW1fdW5jaGFyZ2UobWFwcGluZy0mZ3Q7aG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7CiYjNDM7CS8qCiYjNDM7CSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCiYjNDM7CSAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSwgc28gZXZpY3Rpb24gY2Fubm90IGZyZWUKJiM0MzsJICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvcgomIzQzOwkgKiB0aGUgbWFwcGluZy4KJiM0MzsJICovCiYjNDM7CWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKJiM0MztmYWlsX2ZyZWU6CiYjNDM7CS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovCiYjNDM7CXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKJiM0MzsJbWVtX2Nncm91cF9wdXQobWVtY2cpOwomIzQzOwl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDA4Niw5ICYjNDM7NDI2Myw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuCiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMCiAgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpCiAgKgotICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuCiYjNDM7ICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LgogICogSXQgaXMgaW4gY2hhcmdlIG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlIHNwbGl0IGlzIHN1cHBvcnRlZCBvciBub3QgYW5kCi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuCiYjNDM7ICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS4KICAqCiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBhZnRlci1zcGxpdCBmb2xpbyBjb250YWluaW5nIEBsb2NrX2F0IHJlbWFpbnMgbG9ja2VkCiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDoKQEAgLTQxMDIsMTcgJiM0Mzs0Mjc5LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKLQlYQV9TVEFURSh4YXMsICZhbXA7Zm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CWJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiAJYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMOwotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwotCWludCBucl9zaG1lbV9kcm9wcGVkID0gMDsKLQllbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwOwotCXBnb2ZmX3QgZW5kID0gMDsKIAlpbnQgcmV0OwogCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKQEAgLTQxMjAsMTQxICYjNDM7NDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAogCWlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG5ld19vcmRlciAmZ3Q7PSBvbGRfb3JkZXIpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfbm9fbWVtY2c7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpOwogCWlmIChyZXQpIHsKIAkJVk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCAmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpbyYjMzQ7KTsKLQkJZ290byBvdXRfbm9fbWVtY2c7Ci0JfQotCi0JLyoKLQkgKiBzd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAotCSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KLQkgKi8KLQltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwotCW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwotCi0JaWYgKGlzX2Fub24pIHsKLQkJLyoKLQkJICogVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkCi0JCSAqIHByZXZlbnQgdGhlIGFub25fdm1hIGRpc2FwcGVhcmluZyBzbyB3ZSBmaXJzdCB3ZSB0YWtlIGEKLQkJICogcmVmZXJlbmNlIHRvIGl0IGFuZCB0aGVuIGxvY2sgdGhlIGFub25fdm1hIGZvciB3cml0ZS4gVGhpcwotCQkgKiBpcyBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCBleGNlcHQgdGhlIHdyaXRlIGxvY2sKLQkJICogaXMgdGFrZW4gdG8gc2VyaWFsaXNlIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UKLQkJICogb3BlcmF0aW9ucy4KLQkJICovCi0JCWFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTsKLQkJaWYgKCFhbm9uX3ZtYSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBtaW5fb3JkZXI7Ci0JCWdmcF90IGdmcDsKLQotCQltYXBwaW5nID0gZm9saW8tJmd0O21hcHBpbmc7Ci0JCW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwotCQlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJmFtcDsKLQkJCQkJCQlHRlBfUkVDTEFJTV9NQVNLKTsKLQotCQlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwotCi0JCWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewotCQkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwotCQkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwotCQkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKLQkJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJYW5vbl92bWEgPSBOVUxMOwotCQlpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpOwotCi0JCS8qCi0JCSAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZAotCQkgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZQotCQkgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suCi0JCSAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LAotCQkgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLgotCQkgKi8KLQkJZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctJmd0O2hvc3QpLCBQQUdFX1NJWkUpOwotCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSkKLQkJCWVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLSZndDtob3N0LCBlbmQpOwotCX0KLQotCS8qCi0JICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGwKLQkgKiBzcGxpdCBQTURzCi0JICovCi0JaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXVubWFwX2ZvbGlvKGZvbGlvKTsKLQotCS8qIGJsb2NrIGludGVycnVwdCByZWVudHJ5IGluIHhhX2xvY2sgYW5kIHNwaW5sb2NrICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAobWFwcGluZykgewotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgotCQkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KLQkJICovCi0JCXhhc19sb2NrKCZhbXA7eGFzKTsKLQkJeGFzX3Jlc2V0KCZhbXA7eGFzKTsKLQkJaWYgKHhhc19sb2FkKCZhbXA7eGFzKSAhPSBmb2xpbykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWdvdG8gZmFpbDsKLQkJfQomIzQzOwkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgbWFwcGluZywKLQkJCQkJCXRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgJmFtcDtucl9zaG1lbV9kcm9wcGVkKTsKLWZhaWw6Ci0JaWYgKG1hcHBpbmcpCi0JCXhhc191bmxvY2soJmFtcDt4YXMpOwotCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JaWYgKG5yX3NobWVtX2Ryb3BwZWQpCi0JCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwotCi0JaWYgKCFyZXQgJmFtcDsmYW1wOyBpc19hbm9uICZhbXA7JmFtcDsgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkKLQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7Ci0KLQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKLQotCS8qCi0JICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXMKLQkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvCi0JICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5Ci0JICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2UKLQkgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy4KLQkgKi8KLQlpZiAobWFwcGluZykgewotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0KJiM0MzsJaWYgKGlzX2Fub24pCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsCiYjNDM7CQkJCQkJICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZSBpZiAoaXNfc3dhcGNhY2hlKQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpOwomIzQzOwllbHNlCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwKJiM0MzsJCQkJCQkJICBsaXN0LCBzcGxpdF90eXBlKTsKIAogCS8qCiAJICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZwpAQCAtNDI2NSwyOSAmIzQzOzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCWlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkKIAkJCWNvbnRpbnVlOwogCi0JCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwogCQkvKgogCQkgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWQKIAkJICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlCi0JCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWwKJiM0MzsJCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiAJCSAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuCiAJCSAqLwotCQlmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7CiYjNDM7CQlpZiAoaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgIWZvbGlvX21hcHBlZChuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fdW5sb2NrKG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19wdXQobmV3X2ZvbGlvKTsKIAl9CiAKLW91dF91bmxvY2s6Ci0JaWYgKGFub25fdm1hKSB7Ci0JCWFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7Ci0JfQotCWlmIChtYXBwaW5nKQotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiBvdXQ6Ci0JLyogcmVzdG9yZSB0byBjYWxsZXImIzM5O3Mgb2xkX21lbWNnICovCi0Jc2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpOwotCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKLW91dF9ub19tZW1jZzoKLQl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJaWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKQogCQljb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpOwogCWNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTsKQEAgLTQzMTEsMjkgJiM0Mzs0MzYwLDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogICogaXNvbGF0ZWQgZnJvbSBMUlUgKGlmIGFwcGxpY2FibGUpCiAgKgogICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSwKLSAqIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLgomIzQzOyAqIGZvbGlvX2ZyZWVfc3dhcCgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvCiAgKiAgICAgICAgIGluc3VmZmljaWVudCByZWZlcmVuY2UgY291bnQgb3IgZXh0cmEgcGlucykuCiAgKi8KIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewotCWludCByZXQgPSAwOwotCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sYXJnZShmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKIAotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIE5VTEwsCi0JCQkJCQlOVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLAotCQkJCQkJMCwgTlVMTCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJldHVybiByZXQ7CiYjNDM7CXJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgJmFtcDtmb2xpby0mZ3Q7cGFnZSwgZmFsc2UsCiYjNDM7CQkJCQkgICAgICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTsKIH0KIAogLyoKQEAgLTQzNTIsMTAgJiM0Mzs0MzkyLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyCiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi4KICAqCi0gKiA0KSBAbmV3X29yZGVyICZndDsgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3QKLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIHdoaWNoCi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMQotICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKJiM0MzsgKiA0KSBAbmV3X29yZGVyICE9IDEgZm9yIGFub24gb3Igc3dhcGNhY2hlLiBBbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IKJiM0MzsgKiAgICBfZGVmZXJyZWRfbGlzdCwgd2hpY2ggb3JkZXItMSBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heQomIzQzOyAqICAgIGJlY29tZSBhbm9uIG9uY2UgZmF1bHRlZCBpbi4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKICAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC4KICAqCiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBjYWxsZXImIzM5O3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsCkBAIC00Mzg0LDcgJiM0Mzs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiB3aXRoIHRoZSBmb2xpby4gU3BsaXR0aW5nIHRvIG9yZGVyIDAgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBmb2xpb3MuCiAgKi8KIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotCQkJCSAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcikKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiB7CiAJc3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiAKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0zODksOCAmIzQzOzM4OSw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7CiAJCWNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtJmd0O3N3YXApOwogCQljaV9lbmQgPSBjaV9vZmYgJiM0MzsgZm9saW9fbnJfcGFnZXMob2xkKTsKLQkJd2hpbGUgKGNpX29mZiYjNDM7JiM0MzsgJmx0OyBjaV9lbmQpCiYjNDM7CQlkbyB7CiAJCQlXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7CiYjNDM7CQl9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmICZsdDsgY2lfZW5kKTsKIAl9CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI4NzkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA0OTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgS2VybmVsIE1lbW9yeSBNYW5hZ2VtZW50IFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQmIzM5O3MgdG91Y2hlZCBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBJdCBsb29rcyBsaWtlIHRoZXkmIzM5O3JlIHJld29ya2luZyB0aGUgZm9saW8gc3BsaXR0aW5nIGxvZ2ljLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gU3BlY2lmaWNhbGx5LCBpdCYjMzk7cyBhYm91dCBob3cgd2UgaGFuZGxlIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBUaGV5JiMzOTt2ZSByZW5hbWVkIGBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCB0byBgX19zcGxpdF9mcm96ZW5fZm9saW9gLCB3aGljaCBpcyBhIGdvb2QgaW5kaWNhdG9yIG9mIHNvbWUgdW5kZXJseWluZyBjaGFuZ2UgaW4gc2VtYW50aWNzLCBhbmQgdGhleSYjMzk7dmUgYWRkZWQgbmV3IGhlbHBlcnMgbGlrZSBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCBhbmQgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlYC4gYF9fZm9saW9fc3BsaXRgIGhhcyBhbHNvIGJlZW4gcmVmYWN0b3JlZCB0byB1c2UgdGhlIG5ldyBoZWxwZXJzLiBUaGUgcGF0Y2ggYWxzbyBtb2RpZmllcyBob3cgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGhhbmRsZXMgc3dhcGNhY2hlIGZvbGlvcy4gQW5kLCBpbXBvcnRhbnRseSwgdGhlcmUmIzM5O3MgYSBjaGFuZ2UgaW4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCB0b28uCgpNeSBndXQgc2F5cyB0aGlzIGlzIGRlZmluaXRlbHkgd29ydGggYSBjbG9zZXIgbG9vaywgZXNwZWNpYWxseSBmb3IgZnV6emluZy4gVGhpcyB0b3VjaGVzICpjb3JlKiBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIOKAkyBUSFAsIGZvbGlvIHNwbGl0dGluZywgYW5kIHN3YXAuIFRoZXNlIGFyZSBwcmltZSB0YXJnZXRzIGZvciBleHBvc2luZyBzdWJ0bGUgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWVzLiBJdCYjMzk7cyBoaWdoLXZhbHVlLCBwb3RlbnRpYWxseSBoaWdoLXJpc2ssIHNvIGxldCYjMzk7cyBkaWcgZGVlcGVyLgoKU28sIGxldCYjMzk7cyBpZGVudGlmeSB0aGUga2V5IHN5bWJvbHMgaW4gdGhpcyBwYXRjaC4gSSYjMzk7dmUgZ290OiBgcmVtYXBfcGFnZWAsIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnRgLCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCwgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlYCwgYF9fZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLgoKTm93LCB0aGUgaW1wb3J0YW50IG9uZXMgZm9yIGEgZnV6emluZyBwZXJzcGVjdGl2ZSBhcmUgdGhvc2UgdGhhdCBhcmUgZ2xvYmFsbHkgYWNjZXNzaWJsZSBvciBleHRlcm5hbGx5IHZpc2libGUgYW5kIG5vdCBpbmxpbmVkOiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCwgYW5kIG1heWJlIGV2ZW4gYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gSXQgd291bGQgYmUgd2lzZSB0byBzZWFyY2ggZm9yIHVzYWdlcyBvZiB0aGVzZSB0byB1bmRlcnN0YW5kIHJlYWNoYWJpbGl0eSBhbmQgY3JlYXRlIHRlc3RzLgoKQWxyaWdodCwgdGltZSB0byBnZXQgc2VhcmNoaW5nIGFuZCB1bmRlcnN0YW5kIGhvdyB0aGVzZSBmaXQgaW50byB0aGUgbGFyZ2VyIG1lbW9yeSBtYW5hZ2VtZW50IHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XihpbnR8dm9pZHxib29sKSAuKmZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDA3PWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA4OmludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDktXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9Mzc5ND1zdGF0aWMgaW50IF9fc3BsaXRfZnJvemVuX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zODc0LSAqL1xubW0vaHVnZV9tZW1vcnkuYzozODc1OmludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5tbS9odWdlX21lbW9yeS5jLTM4NzYtXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQxMzYKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiA5MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSBtZW50YWwgbWFwcGluZyBwcm9jZXNzLCBhcyBJIHVuZGVyc3RhbmQgaXQ6CgoqKk1hcHBpbmcgS2V5IEZ1bmN0aW9ucyB0byBNZW1vcnkgTWFuYWdlbWVudCBTdHJ1Y3R1cmVzKioKCk9rYXksIHNvIEkmIzM5O20gZHJpbGxpbmcgZG93biBpbnRvIHNvbWUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuIEkmIzM5O20gbm90aW5nIHRoYXQgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGFyZSBhbGwgY2x1c3RlcmVkIGluIGBtbS9odWdlX21lbW9yeS5jYC4gVGhhdCBwbGFjZW1lbnQgaXMgZXhhY3RseSB3aGF0IEkgd291bGQgZXhwZWN0LCB0aGV5IGFyZSBhbGwgd29ya2luZyBvbiBvcGVyYXRpb25zIHJlbGF0ZWQgdG8gc3BsaXR0aW5nIGFuZCBtYW5hZ2luZyBodWdlIHBhZ2VzLCBzbyBjbGVhcmx5IHRoZXkgYXJlIG9yZ2FuaXplZCBsb2dpY2FsbHkgaW4gdGhlIGh1Z2UgbWVtb3J5IG1hbmFnZW1lbnQgYXJlYS4gVGhlIGNvbW1vbiBkaXJlY3RvcnkgbWFrZXMgcGVyZmVjdCBzZW5zZS4KClRoZW4gdGhlcmUmIzM5O3MgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhhdCBvbmUmIzM5O3MgaW4gYG1tL3N3YXBfc3RhdGUuY2AuIEhtbSwgcmlnaHQsIHRoYXQmIzM5O3MgcmVsYXRlZCB0byBzd2FwcGluZywgd2hpY2ggbWFrZXMgdG90YWwgc2Vuc2UuIEkmIzM5O20gbWVudGFsbHkgZmlsaW5nIHRoaXMgdW5kZXIgJiMzNDtzd2FwIGNhY2hlIGludGVyYWN0aW9uLiYjMzQ7IEl0IHNlZW1zIHRvIGJlIGEgZnVuY3Rpb24gZGVhbGluZyB3aXRoIHJlcGxhY2luZyBhIGZvbGlvIGluIHRoZSBzd2FwIGNhY2hlLCB3aGljaCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBodWdlIHBhZ2Ugc3BsaXR0aW5nL21hbmFnZW1lbnQsIGhlbmNlIHRoZSBkaWZmZXJlbnQgZmlsZS4gR29vZCBvcmdhbml6YXRpb24gdGhlcmUsIHRvby4gSSBhcHByZWNpYXRlIHRoZSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLCB0aGUgbW9kdWxlIG9yZ2FuaXphdGlvbiBpcyBzYW5lIGFuZCBsb2dpY2FsLiBJIGNhbiBxdWlja2x5IGRldGVybWluZSB0aGUgY29udGV4dCBmb3IgYSBnaXZlbiBmdW5jdGlvbiBieSBrbm93aW5nIGl0cyBsb2NhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKGludHx2b2lkfGJvb2wpIC4qZm9saW9fc3BsaXRfdW5tYXBwZWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwNTppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00Mjc4PXN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDM2Ny0gKi9cbm1tL2h1Z2VfbWVtb3J5LmM6NDM2ODppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbm1tL2h1Z2VfbWVtb3J5LmMtNDM2OS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ3NTYKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgKioKCk9rYXksIHRpbWUgdG8gZGl2ZSBpbnRvIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gVGhpcyBmdW5jdGlvbiBpcyBsaWtlbHkgYSBjcml0aWNhbCBwaWVjZSBvZiBtZW1vcnkgbWFuYWdlbWVudCwgcHJvYmFibHkgd2l0aGluIGEgdmlydHVhbCBtZW1vcnkgc3lzdGVtLiBHaXZlbiB0aGUgbmFtZSwgSSYjMzk7bSBndWVzc2luZyBpdCBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIGJyZWFraW5nIGRvd24gYSBsYXJnZSwgJiMzNDtodWdlJiMzNDsgcGFnZSBpbnRvIHNtYWxsZXIsIG1vcmUgbWFuYWdlYWJsZSB1bml0cywgYW5kIHRoZW4sIGNydWNpYWxseSwgcGxhY2luZyB0aG9zZSBzbWFsbGVyIHBhZ2VzIGludG8gc29tZSBraW5kIG9mIG9yZGVyZWQgc3RydWN0dXJlIOKAkyBwcm9iYWJseSBhIGxpbmtlZCBsaXN0LCBxdWV1ZSwgb3IgcGVyaGFwcyBldmVuIGEgdHJlZSBpZiB0aGUgb3JkZXIgaXMgY29tcGxleC4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBsb29rIGZvciBob3cgdGhlIGZ1bmN0aW9uIGRldGVybWluZXMgKndoeSogaXQgbmVlZHMgdG8gc3BsaXQgdGhlIHBhZ2UuIElzIGl0IGR1ZSB0byBmcmFnbWVudGF0aW9uLCBtZW1vcnkgcHJlc3N1cmUsIGEgc3BlY2lmaWMgYWxsb2NhdGlvbiByZXF1ZXN0IHRoYXQgZG9lc24mIzM5O3QgYWxpZ24gd2l0aCBhIGh1Z2UgcGFnZSBib3VuZGFyeSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFRoZSAmIzM5O3RvX29yZGVyJiMzOTsgcGFydCBzdWdnZXN0cyB0aGF0IHRoZSBzcGxpdCBpc24mIzM5O3QganVzdCBhIGJhc2ljIGRlY29tcG9zaXRpb247IHRoZXJlJiMzOTtzIGFuIG9yZGVyaW5nIHJlcXVpcmVtZW50IGludm9sdmVkLiBUaGF0IG1ha2VzIG1lIHdvbmRlciB3aGF0IHRoZSBvcmRlcmluZyBjcml0ZXJpYSBhcmUg4oCTIGFyZSB3ZSB0YWxraW5nIGFib3V0IHBoeXNpY2FsIGFkZHJlc3MsIHZpcnR1YWwgYWRkcmVzcywgb3Igc29tZXRoaW5nIG1vcmUgbnVhbmNlZCBsaWtlIHVzYWdlIHBhdHRlcm5zIG9yIGFjY2VzcyBmcmVxdWVuY3k/CgpJIG5lZWQgdG8gcXVpY2tseSBncmFzcCB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBvcmRlcmluZy4gV2hhdCBraW5kIG9mIG92ZXJoZWFkIGlzIGludHJvZHVjZWQgYnkgdGhpcyBvcmRlcmVkIHN0cnVjdHVyZT8gV2hhdCBhbGdvcml0aG1zIGFyZSBiZWluZyB1c2VkIHRvIG1haW50YWluIHRoaXMgb3JkZXIgZWZmaWNpZW50bHk/IEFuZCwgb2YgY291cnNlLCB3aGF0IGFyZSB0aGUgaW1wbGljYXRpb25zIG9uIHBlcmZvcm1hbmNlPyBBcmUgd2Ugb3B0aW1pemluZyBmb3IgYWxsb2NhdGlvbiBzcGVlZCwgZGVhbGxvY2F0aW9uIHNwZWVkLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gSG93IGRvZXMgdGhlIGNob3NlbiBkYXRhIHN0cnVjdHVyZSBzY2FsZSB3aXRoIHRoZSBudW1iZXIgb2Ygc3BsaXQgcGFnZXM/IFRoaXMgYWxzbyBiZWdzIHRoZSBxdWVzdGlvbiBvZiBob3cgdGhlIGh1Z2UgcGFnZSBpdHNlbGYgaXMgbWFuYWdlZCAqYmVmb3JlKiBhbmQgKmFmdGVyKiB0aGUgc3BsaXQg4oCTIGRvIHdlIG5lZWQgdG8gdHJhY2sgaXQgYXMgYSBwYXJ0aWFsbHktdXNlZCBlbnRpdHk/IElzIHRoZXJlIGFueSBtZWNoYW5pc20gZm9yICYjMzQ7cmUtbWVyZ2luZyYjMzQ7IHNtYWxsZXIgcGFnZXMgYmFjayBpbnRvIGEgaHVnZSBwYWdlIGxhdGVyIG9uPyBUaGlzIGlzIGNyaXRpY2FsIGZvciBhdm9pZGluZyBmdXJ0aGVyIGZyYWdtZW50YXRpb24uIEkgYWxzbyB3YW50IHRvIGNoZWNrIGZvciBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBoZXJlLiBUaGUgZnVuY3Rpb24gbGlrZWx5IHdpbGwgb3BlcmF0ZSBvbiBzaGFyZWQgbWVtb3J5IHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBhIHJhY2UgY29uZGl0aW9uLgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgbGFyZ2VyIGNvZGUgY29udGV4dCBpcy4gV2hhdCBwcm9jZXNzIG9yIHN1YnN5c3RlbSBjYWxscyB0aGlzIGZ1bmN0aW9uPyBUaGUgY29udGV4dCB3aWxsIHNoZWQgbGlnaHQgb24gd2hhdCB0aGUgZGVzaWduIGdvYWxzIGFuZCB0cmFkZS1vZmZzIGFyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKGludHx2b2lkfGJvb2wpIC4qX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXHRcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDM2OD1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MjQtICovXG5tbS9odWdlX21lbW9yeS5jOjQ0MjU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5tbS9odWdlX21lbW9yeS5jLTQ0MjYtXHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTQ5MAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipEaXZpbmcgaW50byBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGd1dHMgb2YgdGhlIHN3YXAgY2FjaGUgcmVwbGFjZW1lbnQgbG9naWMuIExldCYjMzk7cyBzZWUgaG93IGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgaXMgaGFuZGxpbmcgdGhpbmdzLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgZXhhY3QgbWVjaGFuaWNzIG9mIHRoaXMgZnVuY3Rpb24gaW4gcGFydGljdWxhci4gV2hhdCYjMzk7cyBpdCBkb2luZyB3aGVuIGEgZm9saW8gbmVlZHMgdG8gYmUgc3dhcHBlZCBvdXQ/IEhvdyYjMzk7cyBpdCBtYWtpbmcgcmVwbGFjZW1lbnQgZGVjaXNpb25zPyBXZSBrbm93IGhvdyBjcml0aWNhbCB0aGlzIGlzIGZvciBwZXJmb3JtYW5jZSwgc28gSSYjMzk7bSBob3BpbmcgdG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIGl0cyBpbXBhY3QgYW5kIHBvdGVudGlhbCBib3R0bGVuZWNrcy4gTm8gdGltZSB0byB3YXN0ZSwgbGV0JiMzOTtzIGxvb2sgdW5kZXIgdGhlIGhvb2QhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O14oaW50fHZvaWR8Ym9vbCkgLipfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zd2FwLmg9MzIxPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcC5oLTMyMi1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XG5tbS9zd2FwLmg6MzIzOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zMjQtXHRcdFx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpO1xuLS1cbm1tL3N3YXBfc3RhdGUuYz0zMzY9dm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3N3YXBfc3RhdGUuYy0zNjEtICovXG5tbS9zd2FwX3N0YXRlLmM6MzYyOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXBfc3RhdGUuYy0zNjMtXHRcdFx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1OTA4CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipDaGVja2luZyBhIFBvdGVudGlhbCBCb3R0bGVuZWNrKioKCk9rYXksIHNvIEkmIzM5O20ganVzdCBxdWlja2x5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgbWVudGFsIGNoZWNrbGlzdCBoZXJlLiBJJiMzOTttIGZvY3VzaW5nIGluIG9uIHRoZSBkYXRhIHByb2Nlc3Npbmcgc2lkZSBvZiB0aGluZ3MsIHNwZWNpZmljYWxseSBvbiB0aGlzIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgZnVuY3Rpb24uIEl0JiMzOTtzIGEgcHJpbWUgc3VzcGVjdCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzIGdpdmVuIHRoZSBzY2FsZSBvZiBkYXRhIHdlJiMzOTtyZSBsaWtlbHkgZGVhbGluZyB3aXRoLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBlZmZpY2llbnQsIHBhcnRpY3VsYXJseSBjb25jZXJuaW5nIG1lbW9yeSBhbGxvY2F0aW9uLCBpdGVyYXRpb24sIGFuZCBhbnkgcG90ZW50aWFsIGluZWZmaWNpZW5jaWVzIHdpdGhpbiBzb3J0aW5nIG9yIGluZGV4aW5nLiBFdmVuIHRob3VnaCBJIGhhdmUgYSBwcmV0dHkgc3Ryb25nIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHN5c3RlbSwgaXQmIzM5O3Mgd2lzZSB0byByZXZpc2l0IGFueSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgYSBsYXJnZSBpbnB1dCBzcGFjZSBqdXN0IHRvIGJlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgc3VidGxlLCBlYXNpbHkgb3Zlcmxvb2tlZCwgYm90dGxlbmVja3MuIFRpbWUgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O14oaW50fHZvaWR8Ym9vbCkgLipzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXHRcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDM2OD1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MjQtICovXG5tbS9odWdlX21lbW9yeS5jOjQ0MjU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5tbS9odWdlX21lbW9yeS5jLTQ0MjYtXHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYzNzEKCQkJCQkJCW91dHB1dDogNDIKCQkJCQkJCXRob3VnaHRzOiA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBpbiB0aGUgZmlyc3QgcGVyc29uLCBhcyByZXF1ZXN0ZWQ6CgoqKkRlY29uc3RydWN0aW5nIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAqKgoKUmlnaHQsIGxldCBtZSBzZWUuLi5gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGF0JiMzOTtzIGEgbW91dGhmdWwsIGFuZCBiYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIGl0JiMzOTtzIGFsbW9zdCBjZXJ0YWlubHkgYW4gaW5saW5lIGZ1bmN0aW9uIG9yIGEgbWFjcm8sIGRlc2lnbmVkIGZvciBlZmZpY2llbmN5LiBHaXZlbiB0aGUgY29udGV4dCwgaXQmIzM5O3MgbGlrZWx5IGRlYWxpbmcgd2l0aCBzb21lIGFzcGVjdCBvZiBodWdlIHBhZ2UgbWFuYWdlbWVudCwgcHJvYmFibHkgcmVsYXRlZCB0byBmcmFnbWVudGF0aW9uIG9yIGNvYWxlc2NpbmcuIE9rYXksIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBNeSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGRlZmluaXRpb24uIFRoZSBrZXJuZWwmIzM5O3MgbmFtaW5nIGNvbnZlbnRpb25zIGFyZSB1c3VhbGx5IHByZXR0eSBjb25zaXN0ZW50LCBzbyB0aGUgaGVhZGVyIGZpbGUgZGVmaW5pbmcgaXQgc2hvdWxkIGJlIGluIHRoZSBvYnZpb3VzIHBsYWNlLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCBgaW5jbHVkZS9saW51eC9odWdlX21tLmhgLiBUaGF0JiMzOTtzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgdGhlIG1hZ2ljIGJlaGluZCB0aGlzIGZ1bmN0aW9uLiBUaW1lIHRvIGNoZWNrIGl0IG91dC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXHRcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQxMD1pbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDEyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDEzOnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE1LXtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxNjpcdHJldHVybiBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIGxpc3QsIG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTctfVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDE4PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxOS17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MjA6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyMS19XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDIzPXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyNC17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MjU6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgMCk7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjYtfVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY0NT1zdGF0aWMgaW5saW5lIGludFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjQ2OnNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjQ3LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTgyNj1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyKVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI3LXtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjgyODpcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBOVUxMLCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI5LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTczNTAKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSByZXZpZXdpbmcgdGhpcyBjb2RlOgoKKipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBGdW5jdGlvbnMqKgoKQWxyaWdodCwgc28gYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGRlZmluaXRlbHkgdGhlIGtleSBub24taW5saW5lZCBmdW5jdGlvbiBpbnZvbHZlZCBpbiB0aGlzIGh1Z2UgcGFnZSBzcGxpdHRpbmcgcHJvY2Vzcy4gVGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgbGV0JiMzOTtzIHF1aWNrbHkgc2VlIGlmIHRoZXJlIGFyZSBvdGhlciBwbGF5ZXJzIGluIHRoaXMgcGFydGljdWxhciBkb21haW4uIEFoLCB5ZXMsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgLSBhbGwgb2YgdGhlbSB3YXJyYW50IGEgY2xvc2VyIGxvb2sgdG8gdW5kZXJzdGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgbWFpbiBzcGxpdCBmdW5jdGlvbiwgYW5kIGhvdyBlYWNoIGlzIGludm9sdmVkIGluIHRoZSBvdmVyYWxsIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LgoKTmV4dCwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGNvbmRpdGlvbmFsIGxvZ2ljIGZvciBodWdlIHBhZ2Ugc3BsaXR0aW5nOyBzcGVjaWZpY2FsbHksIEkgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBmZWF0dXJlIGlzLCBpbmRlZWQsIGFjdGl2ZSBhbmQgcmVxdWlyZWQgaW4gdGhpcyBjb2RlIHBhdGguIFRoYXQgd2lsbCBiZSBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyAqd2h5KiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9ODMyPWNvbmZpZyBNTV9JRFxuLS1cbm1tL0tjb25maWctODM0LVxubW0vS2NvbmZpZzo4MzU6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy04MzYtXHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg1Mz1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg1OC1cbm1tL0tjb25maWc6ODU5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NjAtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NjUtXG5tbS9LY29uZmlnOjg2NjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg2Ny1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzQtXG5tbS9LY29uZmlnOjg3NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04NzYtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg4Mj1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg5MS1cbm1tL0tjb25maWc6ODkyOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctODkzLVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDEtXG5tbS9LY29uZmlnOjkwMjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MDMtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDktXG5tbS9LY29uZmlnOjkxMDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkxMS1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTE3LVxubW0vS2NvbmZpZzo5MTg6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTE5LVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTI3PWNob2ljZVxuLS1cbm1tL0tjb25maWctOTM2LVxubW0vS2NvbmZpZzo5Mzc6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05MzgtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk0NS1cbm1tL0tjb25maWc6OTQ2Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk0Ny1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1My1cbm1tL0tjb25maWc6OTU0Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTU1LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NjEtXG5tbS9LY29uZmlnOjk2MjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NjMtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4Mzc5CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiBIdWdlIFBhZ2UgRGVwZW5kZW5jaWVzKioKCk9rYXksIHNvIEkmIzM5O20gZGVhbGluZyB3aXRoIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgaW1tZWRpYXRlbHksIG15IGJyYWluIGZsYWdzIHRoYXQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBkZWZpbml0ZWx5IGEgcmVxdWlyZW1lbnQuIE1ha2VzIHNlbnNlLCBvYnZpb3VzbHkuIE5vdywgdGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byBgbW0vTWFrZWZpbGVgLiBUaGF0JiMzOTtzIHdoZXJlIEkgbmVlZCB0byBjb25maXJtIHRoZSBidWlsZCBkZXBlbmRlbmNpZXMgYW5kIGVuc3VyZSBldmVyeXRoaW5nIGlzIGxpbmtpbmcgY29ycmVjdGx5IGFuZCBhcyBleHBlY3RlZC4gSXQmIzM5O3MgdGhlIHN0YW5kYXJkLCBlZmZpY2llbnQgYXBwcm9hY2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2h1Z2VfbWVtb3J5Lm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSAmIzQzOz0gaHVnZV9tZW1vcnkubyBraHVnZXBhZ2VkLm9cbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSAmIzQzOz0gcGFnZV9jb3VudGVyLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg2MzcKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIE1lbW9yeSBNYW5hZ2VtZW50IERlcGVuZGVuY2llcyoqCgpBbHJpZ2h0LCBzbyB0aGUgZGlzY3Vzc2lvbiBoYXMgY2xlYXJseSBwb2ludGVkIG91dCB0aGF0IHdlIGFic29sdXRlbHkgbmVlZCB0byBpbmNsdWRlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAg4oCTIG5vIHF1ZXN0aW9uIGFib3V0IHRoYXQuIEl0JiMzOTtzIHRoZSBseW5jaHBpbi4gQnV0IG5vdyBJJiMzOTttIHN0YXJ0aW5nIHRvIHRoaW5rIGFib3V0IGRlcGVuZGVuY2llcyBmdXJ0aGVyIGRvd24gdGhlIGxpbmUuIFdoYXQmIzM5O3MgdGhlIGltcGFjdCBvZiB0aGlzIGNoYW5nZSBvbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUga2VybmVsPyBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjb25zaWRlciBgbW0vc3dhcF9zdGF0ZS5jYC4gSG93IHdpbGwgdGhpcyBuZXcgdHJhbnNwYXJlbnQgaHVnZXBhZ2UgaW1wbGVtZW50YXRpb24gaW50ZXJhY3Qgd2l0aCB0aGUgc3dhcCBtZWNoYW5pc21zPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBjb25mbGljdHMsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLCBvciByYWNlIGNvbmRpdGlvbnMgSSBuZWVkIHRvIGFudGljaXBhdGU/IFRoaXMgaXMgYSBrZXkgYXJlYSB0byBleHBsb3JlIGZ1cnRoZXIsIHNvIEkmIzM5O20gZmlsaW5nIHRoYXQgZm9yIGRlZXBlciBpbnZlc3RpZ2F0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzd2FwX3N0YXRlLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT03Nj1lbmRpZlxubW0vTWFrZWZpbGUtNzctXG5tbS9NYWtlZmlsZTo3ODpvYmotJChDT05GSUdfU1dBUClcdCYjNDM7PSBwYWdlX2lvLm8gc3dhcF9zdGF0ZS5vIHN3YXBmaWxlLm9cbm1tL01ha2VmaWxlLTc5LW9iai0kKENPTkZJR19aU1dBUClcdCYjNDM7PSB6c3dhcC5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4OTM3CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUG90ZW50aWFsIEltcGFjdCBvZiBhIFN3YXAgTW9kaWZpY2F0aW9uKioKCk9rYXksIHNvIGl0IGxvb2tzIGxpa2UgdGhpcyBwYXRjaCBuZWNlc3NpdGF0ZXMgc29tZSBmb3JtIG9mIGBTV0FQYCBoYW5kbGluZy4gTXkgZmlyc3QgaW5zdGluY3QgaXMgYWx3YXlzIHRvIGxvb2sgZm9yIGNvbnRleHQsIHNvIGxldCYjMzk7cyBzZWUgd2hhdCBvdGhlciBjb25maWd1cmF0aW9ucyBtaWdodCBiZSBpbXBhY3RlZC4gTG9va2luZyB0aHJvdWdoIHRoZSBwcm9wb3NlZCBjaGFuZ2VzLCBJIHNlZSB0aGF0IHRoZSBwYXRjaCB0b3VjaGVzIHNldmVyYWwga2V5IGZ1bmN0aW9ucyB0aGF0IGFyZSBhbGwgdmVyeSBpbnRlcmVzdGluZyB0byBtZTogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaGV5IGFsbCBzZWVtIGhpZ2hseSByZWxldmFudC4KCk15IGltbWVkaWF0ZSBmb2N1cywgZ2l2ZW4gbXkgZXhwZXJ0aXNlLCBpcyB0byBjYXJlZnVsbHkgZXhhbWluZSB0aG9zZSBzcGVjaWZpYyBzeW1ib2xzLiBJIG5lZWQgdG8gY29uZmlybSB0aGVzZSBmdW5jdGlvbnMgYXJlIHByZXNlbnQgaW4gdGhlIGtlcm5lbCBhbmQsIGNyaXRpY2FsbHksIGFyZW4mIzM5O3QgZGVjbGFyZWQgYXMgc3RhdGljLiBUaGlzIGNvbmZpcm1zIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBleHRlcm5hbGx5IGF2YWlsYWJsZSBhbmQgY2FuIGJlIHBhdGNoZWQuIEkgbmVlZCB0byBjb25maXJtIHRoZSBkZWZpbml0aW9ucyBhbmQgdXNhZ2Ugb2YgdGhvc2UgZnVuY3Rpb25zLCB3aGF0IGZpbGVzIHVzZSB0aGVtLCBhbmQgd2hhdCB0aGUgZWZmZWN0IHdpbGwgYmUgb2YgbW9kaWZ5aW5nIHRoZW0uIEZyb20gdGhlcmUgSSBjYW4gZGV0ZXJtaW5lIHRoZSBpbXBhY3Qgb2YgdGhlc2UgY2hhbmdlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XihpbnR8dm9pZHxib29sKSAuKl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXImIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDAyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQzNjg9aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00NDI0LSAqL1xubW0vaHVnZV9tZW1vcnkuYzo0NDI1OmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxubW0vaHVnZV9tZW1vcnkuYy00NDI2LVx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5NTUzCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEb3VibGUtQ2hlY2tpbmcgdGhlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgRnVuY3Rpb25hbGl0eSoqCgpPa2F5LCBzbyB0aGUgY29uY2VwdCBvZiB1bm1hcHBlZCBmb2xpb3PigJR0aG9zZSB0aGF0IGRvbiYjMzk7dCBuZWF0bHkgYWxpZ24gd2l0aCBvdXIgc3RhbmRhcmQgaW5kZXhpbmfigJRpcyBkZWZpbml0ZWx5IHNvbWV0aGluZyB3ZSBuZWVkIHRvIGFjY291bnQgZm9yLiBObyBkZWJhdGUgdGhlcmUsIHRoZXkgKmRvKiBleGlzdCwgYW5kIHRoZSBzeXN0ZW0gbmVlZHMgdG8gaGFuZGxlIHRoZW0uIFRoZSBrZXkgbm93IGlzIHRvIGVuc3VyZSB0aGF0IHRoZSBsb2dpYyB3aXRoaW4gYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyByb2J1c3QuIElzIGl0IGFjY291bnRpbmcgZm9yIGFsbCBlZGdlIGNhc2VzPyBBcmUgdGhlcmUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzPyBBcmUgdGhlIGFzc3VtcHRpb25zIGFib3V0IHRoZSB1bm1hcHBlZCBkYXRhIHN0aWxsIHZhbGlkIGdpdmVuIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UgbWF0ZXJpYWw/IEJlZm9yZSBJIG1vdmUgb24sIEkgd2FudCB0byBjb25maXJtIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBzdGlsbCBwZXJmb3JtaW5nIGFzIGludGVuZGVkLiBMZXQmIzM5O3Mgc2VlIGlmIHRoZSBoYW5kbGluZyBvZiBmb2xpbyBzcGxpdCBpcyBnb29kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKGludHx2b2lkfGJvb2wpIC4qZm9saW9fc3BsaXRfdW5tYXBwZWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwNTppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00Mjc4PXN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDM2Ny0gKi9cbm1tL2h1Z2VfbWVtb3J5LmM6NDM2ODppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbm1tL2h1Z2VfbWVtb3J5LmMtNDM2OS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMDA5CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkRvdWJsZS1DaGVja2luZyBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAqKgoKQWxyaWdodCwgdGltZSB0byByZXZpc2l0IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYC4gSSYjMzk7bSBnb2luZyBiYWNrIG92ZXIgdGhpcyBiZWNhdXNlLCBsZXQmIzM5O3MgYmUgaG9uZXN0LCBldmVuIGFmdGVyIHRoZSBpbml0aWFsIHJldmlldywgdGhlcmUmIzM5O3MgYWx3YXlzIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgc29tZXRoaW5nIGNvdWxkIGhhdmUgYmVlbiBvdmVybG9va2VkLCBlc3BlY2lhbGx5IHdpdGggYSBmdW5jdGlvbiBhcyBjcml0aWNhbCBhcyB0aGlzLiBNeSBjb25jZXJuIGlzLCBpcyBpdCB0cnVseSByb2J1c3QgZW5vdWdoIHRvIGhhbmRsZSB0aGUgZWRnZSBjYXNlcz8gRG9lcyBpdCBjb3ZlciBhbGwgdGhlIHBlcm11dGF0aW9ucyBvZiBkYXRhIHN0cnVjdHVyZXMgYW5kIHN0YXRlcyB3ZSYjMzk7cmUgbGlrZWx5IHRvIGVuY291bnRlciBpbiBhIHJlYWwtd29ybGQgc2NlbmFyaW8/CgpJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWFkZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGRhdGEgdGhhdCBhcmVuJiMzOTt0IGV4cGxpY2l0bHkgdmFsaWRhdGVkIHdpdGhpbiB0aGUgZnVuY3Rpb24uIFRoaW5raW5nIGFib3V0IGl0LCBJIHNob3VsZCBydW4gdGhyb3VnaCBhIG1lbnRhbCBjaGVja2xpc3Qgb2YgcG9zc2libGUgZmFpbHVyZSBwb2ludHM6IG51bGwgdmFsdWVzLCBlbXB0eSBzdHJ1Y3R1cmVzLCBleGNlcHRpb25hbGx5IGxhcmdlIGRhdGFzZXRzLCBhbmQgZXZlbiBjb25jdXJyZW50IGFjY2VzcyBpc3N1ZXMsIGlmIGFwcGxpY2FibGUuIEkgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBsb2dpYyBhbGlnbnMgcGVyZmVjdGx5IHdpdGggdGhlIHVuZGVybHlpbmcgcmVxdWlyZW1lbnRzIG9mIHRoZSBzcGxpdHRpbmcgcHJvY2Vzcywgc3BlY2lmaWNhbGx5IGFkZHJlc3NpbmcgaG93IHBhcnRpYWwgc3BsaXRzIHNob3VsZCBiZSBldmFsdWF0ZWQuCgpJIGFtIGdvaW5nIHRvIGNoZWNrIHRoZSB1bml0IHRlc3RzLCBvYnZpb3VzbHksIGJ1dCBzb21ldGltZXMgdGhvc2UgdGVzdHMgYXJlIHdyaXR0ZW4gdG8gY292ZXIgdGhlIG9idmlvdXMgY2FzZXMgYW5kIHRoZXJlIGFyZSBzdGlsbCBpc3N1ZXMgbHVya2luZyBpbiB0aGUgY29kZS4gSSBhbSBnb2luZyB0byBoYXZlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSByaWdvcm91cy4gQW5kIEkgbWF5IG5lZWQgdG8gd3JpdGUgc29tZSBuZXcgb25lcyB0byBlbnN1cmUgYWxsIHNjZW5hcmlvcyBhcmUgY292ZXJlZCwgcG90ZW50aWFsbHkgZ2VuZXJhdGluZyBzb21lIHJhbmRvbSBkYXRhIGZvciBhIGRlZXBlciBkaXZlLiBUaGUgZ29hbCBpcyB0byBiZSBhYnNvbHV0ZWx5IGNvbmZpZGVudCB0aGF0IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCB3b24mIzM5O3QgaW50cm9kdWNlIGFueSB1bmV4cGVjdGVkIGJlaGF2aW9yIGRvd24gdGhlIGxpbmUsIHBvdGVudGlhbGx5IGNhdXNpbmcgZGF0YSBjb3JydXB0aW9uIG9yLCBldmVuIHdvcnNlLCBzeXN0ZW0gaW5zdGFiaWxpdHkuIEkgYW0gZ29pbmcgdG8gYmUgZXh0cmEgdmlnaWxhbnQgYW5kIHRoaW5rIHRocm91Z2ggdGhlIGNvZGUgYXMgdGhvdWdoIEkgYW0gZ29pbmcgdG8gYmUgdGhlIHBlcnNvbiB3aG8gd2lsbCBiZSBkZWJ1Z2dpbmcgaXQgYXQgMyBhbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XihpbnR8dm9pZHxib29sKSAuKmZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDA3PWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA4OmludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDktXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9Mzc5ND1zdGF0aWMgaW50IF9fc3BsaXRfZnJvemVuX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zODc0LSAqL1xubW0vaHVnZV9tZW1vcnkuYzozODc1OmludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5tbS9odWdlX21lbW9yeS5jLTM4NzYtXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNjM4CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkRvdWJsZS1DaGVja2luZyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gKioKCkFscmlnaHQsIHRpbWUgdG8gcmV2aXNpdCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2ljIHdpdGhpbiBpdCBpcyBzdGlsbCBzb3VuZC4gSXQmIzM5O3MgYSBjcml0aWNhbCBmdW5jdGlvbiwgYW5kIGEgc3VidGxlIGJ1ZyBoZXJlIGNvdWxkIGhhdmUgY2FzY2FkaW5nIGFuZCBkZXZhc3RhdGluZyBlZmZlY3RzLCBwYXJ0aWN1bGFybHkgb24gbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHN3YXAgcGVyZm9ybWFuY2UuIEkgbmVlZCB0byBydW4gdGhyb3VnaCB0aGUgcmVwbGFjZSBzdHJhdGVneSB0byBlbnN1cmUgdGhhdCB0aGUgY29uZGl0aW9ucyB3aXRoaW4gdGhhdCBmdW5jdGlvbiBhcmUgc3RpbGwgc2FmZSwgYW5kIGhhdmUgbm90IGJlZW4gYWZmZWN0ZWQgYnkgc3Vic2VxdWVudCBpbXByb3ZlbWVudHMuCgpTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGVkZ2UgY2FzZXMuIEFtIEkgc3RpbGwgaGFuZGxpbmcgdGhlIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcmVwbGFjZW1lbnQgc2NlbmFyaW9zIGNvcnJlY3RseT8gRG9lcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhdm9pZCBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucywgZXNwZWNpYWxseSBnaXZlbiBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgc3dhcCBjYWNoZT8gQXJlIHRoZSBsb2NraW5nIHByaW1pdGl2ZXMgYXBwcm9wcmlhdGUgYW5kIGVmZmVjdGl2ZT8gQXJlIHRoZSBtZW1vcnkgYmFycmllcnMgaW4gcGxhY2Ugd2hlcmUgdGhleSBuZWVkIHRvIGJlLCBvciBhcmUgdGhlcmUgYW55IG9wcG9ydHVuaXRpZXMgdG8gb3B0aW1pemUgdGhlbSB3aXRob3V0IGludHJvZHVjaW5nIHJpc2s/IEkgbmVlZCB0byByZXZpZXcgaXQgdW5kZXIgaGlnaCBsb2FkLCB0b28uIEkgd2FudCB0byBtYWtlIHN1cmUgaXQmIzM5O3Mgd29ya2luZyBhcyBleHBlY3RlZC4KCkkgYWxzbyB3YW50IHRvIGNoZWNrIGl0cyBpbnRlcmFjdGlvbiB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEFyZSB0aGVyZSBhbnkgdW5leHBlY3RlZCBkZXBlbmRlbmNpZXMgb3IgaW50ZXJhY3Rpb25zIHdpdGggcGFnZSByZWNsYWltLCBkaXJ0eSBwYWdlIGhhbmRsaW5nLCBvciBOVU1BIG9wdGltaXphdGlvbnMgdGhhdCBtaWdodCBpbnRyb2R1Y2Ugc3VidGxlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIGV2ZW4gY29ycmVjdG5lc3MgaXNzdWVzPyBJJiMzOTtsbCBwcm9iYWJseSBhbHNvIG5lZWQgdG8gcnVuIGl0IHRocm91Z2ggYSBiYXR0ZXJ5IG9mIHRlc3RzLCBjb3ZlcmluZyBib3RoIHR5cGljYWwgYW5kIHBhdGhvbG9naWNhbCBzY2VuYXJpb3MsIHRvIGJ1aWxkIHNvbWUgY29uZmlkZW5jZS4gT3ZlcmFsbCwgSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGlzIGlzIHNvbGlkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKGludHx2b2lkfGJvb2wpIC4qX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcC5oPTMyMT12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zMjItXHRcdFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LCB2b2lkICpzaGFkb3cpO1xubW0vc3dhcC5oOjMyMzp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwLmgtMzI0LVx0XHRcdFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KTtcbi0tXG5tbS9zd2FwX3N0YXRlLmM9MzM2PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9zd2FwX3N0YXRlLmMtMzYxLSAqL1xubW0vc3dhcF9zdGF0ZS5jOjM2Mjp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwX3N0YXRlLmMtMzYzLVx0XHRcdFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTIxNgoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDE3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgTWVtb3J5IE1hbmFnZW1lbnQgU3ltYm9scyBhbmQgRGVwZW5kZW5jaWVzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgZm9jdXMgc3ltYm9scyBhcmU6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gSSYjMzk7bSBzdGFydGluZyB0byBnZXQgYSBmZWVsIGZvciBob3cgdGhlc2UgcmVsYXRlIHRvIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy4KCkkmIzM5O3ZlIGdvdCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgaW4gbXkgbWVudGFsIHN0YWNrIGZvciB0aGUgcmVxdWlyZWQgY29uZmlncy4gV2FpdCwgaG9sZCBvbi4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBkZWZpbml0ZWx5IHRpZWQgdG8gYG1tL3N3YXBfc3RhdGUuY2AsIHdoaWNoLCBhcyBJIHJlY2FsbCwgbmVlZHMgYENPTkZJR19TV0FQYC4gTWFrZXMgc2Vuc2UuIEFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLCBjbGVhcmx5IGltcGxpY2F0aW5nIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBObyBzdXJwcmlzZXMgdGhlcmUuCgpCdXQgSSYjMzk7bSBub3QgZG9uZSB5ZXQuIEkgbmVlZCB0byBiZSB0aG9yb3VnaC4gSSB3b25kZXIgaWYgdGhlcmUmIzM5O3MgYW55IG90aGVyIHJlbGV2YW50IGNvbmZpZyBpbiBwbGF5PyBMZXQgbWUgY2hlY2sgZm9yIGBDT05GSUdfVEhQX1NXQVBgLiBHb3R0YSBjb25zaWRlciB0aGUgaW50ZXJwbGF5IGJldHdlZW4gdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIGFuZCBzd2FwIHNwYWNlLiBJJiMzOTtsbCBuZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kIGFzIEkgZGVsdmUgZnVydGhlciBpbnRvIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUSFBfU1dBUCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTk2OT1lbmRjaG9pY2Vcbm1tL0tjb25maWctOTcwLVxubW0vS2NvbmZpZzo5NzE6Y29uZmlnIFRIUF9TV0FQXG5tbS9LY29uZmlnLTk3Mi1cdGRlZl9ib29sIHlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE3NTEKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA1MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgcHJlc2VudGVkIGFzIGEgZmlyc3QtcGVyc29uIGV4cGVydCBzdW1tYXJ5OgoKKipUaGlua2luZyBUaHJvdWdoIFRIUF9TV0FQJiMzOTtzIERlcGVuZGVuY2llcyoqCgpBbHJpZ2h0LCBzbyBgVEhQX1NXQVBgLi4uIHRoYXQmIzM5O3MgYSBib29sZWFuIG9wdGlvbiwgYW5kIGl0JiMzOTtzIGRlZmluZWQgYXMgYGRlZl9ib29sIHlgLiBUaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB3aGF0IGRldGVybWluZXMgdGhhdCBkZWZhdWx0IHZhbHVlLiBUaGUgbG9naWMgc3RhdGVzIHRoYXQgaXQmIzM5O3MgY29udGluZ2VudCBvbiB0d28gdGhpbmdzOiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAuIFRoYXQgbWFrZXMgcGVyZmVjdCBzZW5zZTsgdGhlIGFiaWxpdHkgdG8gc3dhcCBvdXQgaHVnZSBwYWdlcywgd2VsbCwgb2J2aW91c2x5IHRoYXQgZGVwZW5kcyBvbiBoYXZpbmcgYm90aCB0aGUgdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIGZlYXR1cmUgZW5hYmxlZCBhbmQgc3dhcCBzcGFjZSBhdmFpbGFibGUuCgpUbyBjbGFyaWZ5IHRoZSBmdWxsIGltcGFjdCBvZiB0aGVzZSBjb25kaXRpb25zLCBJIG5lZWQgdG8gbG9vayBpbnRvIGhvdyBleGFjdGx5IHRoaXMgZGVwZW5kZW5jeSBjaGFpbiBpcyBzZXQgdXAuIEJlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY2hlY2sgdGhlIGBtbS9LY29uZmlnYCBmaWxlIGluIHRoZSBrZXJuZWwgc291cmNlLiBUaGF0IGZpbGUgd2lsbCBkZXRhaWwgdGhlIGV4YWN0IHJlbGF0aW9uc2hpcHMgYW5kIGNvbnN0cmFpbnRzIGluIHBsYWNlIGFyb3VuZCB0aGUgYFRIUF9TV0FQYCBvcHRpb24uIEkmIzM5O2xsIHRha2UgYSBsb29rIHRoZXJlIHRvIGNvbmZpcm0gbXkgdW5kZXJzdGFuZGluZyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciBzdWJ0bGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGlzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtUSFBfU1dBUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz04MTA9Y29uZmlnIEFSQ0hfV0FOVF9HRU5FUkFMX0hVR0VUTEJcbi0tXG5tbS9LY29uZmlnLTgxMi1cbm1tL0tjb25maWc6ODEzOmNvbmZpZyBBUkNIX1dBTlRTX1RIUF9TV0FQXG5tbS9LY29uZmlnLTgxNC1cdGRlZl9ib29sIG5cbi0tXG5tbS9LY29uZmlnPTk2OT1lbmRjaG9pY2Vcbm1tL0tjb25maWctOTcwLVxubW0vS2NvbmZpZzo5NzE6Y29uZmlnIFRIUF9TV0FQXG5tbS9LY29uZmlnLTk3Mi1cdGRlZl9ib29sIHlcbm1tL0tjb25maWc6OTczOlx0ZGVwZW5kcyBvbiBBUkNIX1dBTlRTX1RIUF9TV0FQIFx1MDAyNlx1MDAyNiBTV0FQIFx1MDAyNlx1MDAyNiA2NEJJVFxubW0vS2NvbmZpZy05NzQtXHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyMjM2CgkJCQkJCQlvdXRwdXQ6IDE1MAoJCQkJCQkJdGhvdWdodHM6IDI5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBUSFBfU1dBUCBEZXBlbmRlbmN5IGFuZCBDb2RlIENoYW5nZXMqKgoKT2theSwgc28gYFRIUF9TV0FQYCBoaW5nZXMgb24gYEFSQ0hfV0FOVFNfVEhQX1NXQVBgLCBgU1dBUGAsIGFuZCBhIDY0LWJpdCBhcmNoaXRlY3R1cmUuIFRoYXQmIzM5O3MgdGhlIGdhdGUuIE5vdywgbG9va2luZyBhdCB0aGUgY29kZSwgdGhlIG1vZGlmaWNhdGlvbnMgYXJlIGNvbmNlbnRyYXRlZCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBSaWdodCBhd2F5LCBJIHNlZSB0aGF0IGBtbS9odWdlX21lbW9yeS5jYCBpcyBnb2luZyB0byBiZSBwYXJ0IG9mIHRoZSBidWlsZCAqb25seSogaWYgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZW5hYmxlZCwgYW5kIGBtbS9zd2FwX3N0YXRlLmNgIHJlbGllcyBvbiBgQ09ORklHX1NXQVBgLiBTbywgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFNXQVBgIGFyZSB0aGUga2V5IGNvbmZpZ3VyYXRpb25zIHRvIGtlZXAgaW4gbWluZC4gVGhvc2UgYXJlIHRoZSBiaWcga25vYnMgaGVyZS4KCk5vdywgbGV0IG1lIGdvIGJhY2sgb3ZlciB0aGUgY2hhbmdlcyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kICpleGFjdGx5KiB3aGF0JiMzOTtzIGJlaW5nIHRvdWNoZWQuIEFoLCB0aGV5JiMzOTt2ZSBtb2RpZmllZCBgX19zcGxpdF91bm1hcHBlZF9mb2xpb2AgKHJlbmFtZWQgdG8gYF9fc3BsaXRfZnJvemVuX2ZvbGlvYCksIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZGAgKHJlcGxhY2VkIGJ5IGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVgIGFuZCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGVgKSwgYF9fZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBJdCBsb29rcyBsaWtlIGl0IGlzIGFsbCBhYm91dCByZWZhY3RvcmluZyB0aGUgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIHRvIGhhbmRsZSBzd2FwY2FjaGUgYW5kIGFub255bW91cyBmb2xpb3MgbW9yZSBlZmZlY3RpdmVseS4gVGhpcyBpcyBhIGZ1bmRhbWVudGFsIGNoYW5nZSBpbiB0aGUgd2F5IFRIUCBpbnRlcmFjdHMgd2l0aCBzd2FwLiBUaGlzIGlzIGRlZmluaXRlbHkgYSBzcG90IHdvcnRoIGEgZGVlcCBmdXp6aW5nIGNhbXBhaWduLgoKQWxyaWdodCwgSSYjMzk7bSByZWFkeSB0byBtb3ZlIGZvcndhcmQuIExldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZml4ZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS9odWdlX21lbW9yeS5jIGFuZCBtbS9zd2FwX3N0YXRlLmMsIHdoaWNoIGlzIHJlYWNoYWJsZSBhbmQgaGFzIGZ1bmN0aW9uYWwgaW1wYWN0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZml4ZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS9odWdlX21lbW9yeS5jIGFuZCBtbS9zd2FwX3N0YXRlLmMsIHdoaWNoIGlzIHJlYWNoYWJsZSBhbmQgaGFzIGZ1bmN0aW9uYWwgaW1wYWN0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKHNwZWNpZmljYWxseSBmb3IgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MpLiBJdCBtb2RpZmllcyBob3cgZm9saW9zIGFyZSB1bm1hcHBlZCwgZnJvemVuLCBhbmQgc3BsaXQsIHVwZGF0aW5nIHBhZ2UgY2FjaGUgYW5kIHN3YXAgY2FjaGUgcmVmZXJlbmNlcy4gVGhlc2UgY2hhbmdlcyBpbnZvbHZlIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgeGFycmF5IG1hbmlwdWxhdGlvbnMuIFRoZXkgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWx0ZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIG1lbW9yeSBidWZmZXJzLiBBbnkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgd291bGQgbWFuaWZlc3QgYXMgdXNlLWFmdGVyLWZyZWUsIG1lbW9yeSBjb3JydXB0aW9uLCBvciBsb2NraW5nIGlzc3Vlcywgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBjZWQ0MDBmNzJkNDNhLi5jYzlmN2UwZDQxOTRlIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTM1ODksOSAmIzQzOzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncykKIHsKIAlpbnQgaSA9IDA7CiAKLQkvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqLwotCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKLQkJcmV0dXJuOwogCWZvciAoOzspIHsKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpOwogCQlpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CkBAIC0zNzU1LDggJiM0MzszNzUyLDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLAogfQogCiAvKioKLSAqIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSAtIHNwbGl0cyBhbiB1bm1hcHBlZCBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zIGluCi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC4KJiM0MzsgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIC0gc3BsaXRzIGEgZnJvemVuIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MKJiM0MzsgKiBpbiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC4KICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvCiAgKiBAbmV3X29yZGVyOiB0aGUgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyIHNwbGl0IGZvbGlvcyAoc2luY2UgYnVkZHkKICAqICAgICAgICAgICAgIGFsbG9jYXRvciBsaWtlIHNwbGl0IGdlbmVyYXRlcyBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbSBAZm9saW8mIzM5O3MKQEAgLTM3NjQsNyAmIzQzOzM3NjEsNiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBAc3BsaXRfYXQ6IGluIGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQKICAqICAgICAgICAgICAgd2lsbCBiZSBzcGxpdCB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyLgogICogQHhhczogeGFfc3RhdGUgcG9pbnRpbmcgdG8gZm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMgYW5kIGxvY2tlZCBieSBjYWxsZXIKLSAqIEBtYXBwaW5nOiBAZm9saW8tJmd0O21hcHBpbmcKICAqIEBzcGxpdF90eXBlOiBpZiB0aGUgc3BsaXQgaXMgdW5pZm9ybSBvciBub3QgKGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0KQogICoKICAqCkBAIC0zNzk1LDExICYjNDM7Mzc5MSwxMiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCAmbHQ7MCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlCiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spCiAgKi8KLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAomIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQomIzQzOwkJZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiAJY29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKJiM0MzsJY29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAlpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7CiAJc3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbzsKQEAgLTM4MTQsMTEgJiM0MzszODExLDExIEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogCSAgICAgc3BsaXRfb3JkZXItLSkgewogCQlpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCAmbHQ7Jmx0OyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpOwogCi0JCS8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJaWYgKGlzX2Fub24gJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQomIzQzOwkJLyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KJiM0MzsJCWlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpICZhbXA7JmFtcDsgc3BsaXRfb3JkZXIgPT0gMSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChtYXBwaW5nKSB7CiYjNDM7CQlpZiAoeGFzKSB7CiAJCQkvKgogCQkJICogdW5pZm9ybSBzcGxpdCBoYXMgeGFzX3NwbGl0X2FsbG9jKCkgY2FsbGVkIGJlZm9yZQogCQkJICogaXJxIGlzIGRpc2FibGVkIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnksIHdoZXJlYXMKQEAgLTM4NzgsMzIgJiM0MzszODc1LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJCSAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKJiM0MzsKIAlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAkvKgogCSAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlCi0JICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4KLQkgKgotCSAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZQotCSAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLgomIzQzOwkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8KJiM0MzsJICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuCiAJICovCi0JaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWlzX3N3YXBjYWNoZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi8KLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qCi0JICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMAotCSAqCi0JICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbQotCSAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnkKLQkgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkCi0JICogaGVyZS4KJiM0MzsJICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZQomIzQzOwkgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gJmFtcDsgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdAomIzQzOwkgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGQKJiM0MzsJICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LgogCSAqLwotCWlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgJmFtcDsmYW1wOyBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKJiM0MzsJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkxMSwzOSAmIzQzOzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAlpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKQogCQlyZXR1cm4gLUVCVVNZOwogCiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhCiYjNDM7CSAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0JiMzOTtzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvcgomIzQzOwkgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW0KJiM0MzsJICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkCiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGUKJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXQKJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIKJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG8KJiM0MzsgKiAgICAgICAgICB0aGUgTFJVIGxpc3QKJiM0MzsgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzCiYjNDM7ICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlcwomIzQzOyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLAomIzQzOwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7NDAwMSwyNTYgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiAKLQkJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIHBvc3Qtc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzCiYjNDM7CSAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnQKJiM0MzsJICogc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvIGZvciBhIHN1YgomIzQzOwkgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLgomIzQzOwkgKi8KJiM0MzsJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKJiM0MzsJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7CiYjNDM7CQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sCiYjNDM7CQkJCSAgIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKIAkJaWYgKGRvX2xydSkKLQkJCWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CQlpZiAoY2kpCiYjNDM7CQkJX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pOwomIzQzOwl9CiAKLQkJcmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLAotCQkJCQkgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpOwomIzQzOwl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKIAotCQkvKgotCQkgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0Ci0JCSAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZQotCQkgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3MKLQkJICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZgotCQkgKiBAZm9saW8uCi0JCSAqLwotCQlmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvOwotCQkgICAgIG5ld19mb2xpbyA9IG5leHQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pOwomIzQzOwlpZiAoZG9fbHJ1KQomIzQzOwkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwlpZiAoY2kpCiYjNDM7CQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKJiM0MztvdXRfbm9fc3BsaXQ6CiYjNDM7CWxvY2FsX2lycV9lbmFibGUoKTsKJiM0MzsJaWYgKGFub25fdm1hKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3ZtYSkgewomIzQzOwkJYW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTsKJiM0MzsJCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7CiYjNDM7CX0KIAotCQkJbmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiAKLQkJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7LyoqCiYjNDM7ICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW8KJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZCBhbmQgZmlsZS1iYWNrZWQKJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZQomIzQzOyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KQomIzQzOyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdAomIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlcgomIzQzOyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTEwKJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpCiYjNDM7ICoKJiM0MzsgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0cwomIzQzOyAqIHJlZmNvdW50LCBhbmQgcGVyZm9ybSB0aGUgc3BsaXQsIHVwZGF0ZXMgdGhlIHBhZ2UgY2FjaGUgZW50cmllcy4gU3BsaXQKJiM0MzsgKiBmb2xpb3MgYXJlIHVuZnJvemVuIGJ1dCBub3QgcmVtYXBwZWQsIHRoZXkgYXJlIGZhdWx0ZWQgYmFjayBpbiBvbiBkZW1hbmQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4gKGlmIC1FTk9NRU0KJiM0MzsgKiBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlcikKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiYjNDM7CQkJCQkgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAomIzQzOwkJCQkJICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQomIzQzO3sKJiM0MzsJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby0mZ3Q7bWFwcGluZzsKJiM0MzsJWEFfU1RBVEUoeGFzLCAmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiYjNDM7CWxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7CiYjNDM7CXN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDsKJiM0MzsJaW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgbWluX29yZGVyOwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiYjNDM7CXBnb2ZmX3QgZW5kID0gMDsKJiM0MzsJZ2ZwX3QgZ2ZwOwomIzQzOwlpbnQgcmV0ID0gMDsKIAotCQkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKLQkJCQkJICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiYjNDM7CW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwomIzQzOwlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWlmIChkb19scnUpCi0JCQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkvKgomIzQzOwkgKiBTd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAomIzQzOwkgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuCiYjNDM7CSAqLwomIzQzOwltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwomIzQzOwlvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTsKIAotCQkJLyoKLQkJCSAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuCi0JCQkgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJICovCi0JCQlpZiAoY2kpIHsKLQkJCQlfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmYW1wOyBHRlBfUkVDTEFJTV9NQVNLKTsKJiM0MzsJaWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHsKJiM0MzsJCXJldCA9IC1FQlVTWTsKJiM0MzsJCWdvdG8gZmFpbF9mcmVlOwomIzQzOwl9CiAKLQkJCS8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi8KLQkJCWlmICghbWFwcGluZykKLQkJCQljb250aW51ZTsKJiM0MzsJbWFwcGluZ19zZXRfdXBkYXRlKCZhbXA7eGFzLCBtYXBwaW5nKTsKIAotCQkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCi0JCQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewotCQkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAotCQkJCQkgICBuZXdfZm9saW8sIDApOwotCQkJCWNvbnRpbnVlOwotCQkJfQomIzQzOwlpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHsKJiM0MzsJCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAKLQkJCVZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7Ci0JCQkvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC0mZ3Q7aW5kZXggJmd0Oz0gZW5kICovCi0JCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSAmYW1wOyZhbXA7IG5yX3NobWVtX2Ryb3BwZWQpCi0JCQkJKm5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwotCQkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQotCQkJCWZvbGlvX2FjY291bnRfY2xlYW5lZCgKLQkJCQkJbmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7Ci0JCQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7Ci0JCQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKJiM0MzsJCXhhc19zZXRfb3JkZXIoJmFtcDt4YXMsIGZvbGlvLSZndDtpbmRleCwgbmV3X29yZGVyKTsKJiM0MzsJCXhhc19zcGxpdF9hbGxvYygmYW1wO3hhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTsKJiM0MzsJCWlmICh4YXNfZXJyb3IoJmFtcDt4YXMpKSB7CiYjNDM7CQkJcmV0ID0geGFzX2Vycm9yKCZhbXA7eGFzKTsKJiM0MzsJCQlnb3RvIGZhaWxfZnJlZTsKIAkJfQomIzQzOwl9CiAKLQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7Ci0JCS8qCi0JCSAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoCi0JCSAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy4KLQkJICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW8KLQkJICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqLwotCQlmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiYjNDM7CWlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7CiAKLQkJaWYgKGRvX2xydSkKLQkJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsX21tYXBfdW5sb2NrOwomIzQzOwl9CiAKLQkJaWYgKGNpKQotCQkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGRlcXVldWVfZGVmZXJyZWQpIHsKLQkJCWxpc3RfbHJ1X3VubG9jayhscnUpOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CS8qCiYjNDM7CSAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kCiYjNDM7CSAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlCiYjNDM7CSAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay4KJiM0MzsJICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsCiYjNDM7CSAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuCiYjNDM7CSAqLwomIzQzOwllbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy0mZ3Q7aG9zdCksIFBBR0VfU0laRSk7CiYjNDM7CWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctJmd0O2hvc3QsIGVuZCk7CiYjNDM7CiYjNDM7CXVubWFwX2ZvbGlvKGZvbGlvKTsKJiM0MzsKJiM0MzsJeGFzX2xvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KJiM0MzsJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCiYjNDM7CSAqLwomIzQzOwlpZiAoeGFzX2xvYWQoJmFtcDt4YXMpICE9IGZvbGlvKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICYjNDM7IDEpKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgJmFtcDsmYW1wOyBuZXdfb3JkZXIgJmx0OyBIUEFHRV9QTURfT1JERVIpIHsKJiM0MzsJCWlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKQomIzQzOwkJCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqLwomIzQzOwlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgc3BsaXRfdHlwZSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKJiM0MzsJICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlCiYjNDM7CSAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvcwomIzQzOwkgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mCiYjNDM7CSAqIEBmb2xpby4KJiM0MzsJICovCiYjNDM7CWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87CiYjNDM7CSAgICAgbmV3X2ZvbGlvID0gbmV4dCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQkvKiBjb21wdXRlIG5leHQgYmVmb3JlIHRoZSBmb2xpbyBjYW4gYmUgZnJlZWQgYmVsb3cgKi8KJiM0MzsJCW5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICYjNDM7IDEpOwomIzQzOwomIzQzOwkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwomIzQzOwkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCiYjNDM7CQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewomIzQzOwkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAomIzQzOwkJCQkgICBuZXdfZm9saW8sIDApOwomIzQzOwkJCWNvbnRpbnVlOwogCQl9Ci0JCXJldHVybiAtRUFHQUlOOwomIzQzOwomIzQzOwkJLyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtJmd0O2luZGV4ICZndDs9IGVuZCAqLwomIzQzOwkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQkJbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7CiYjNDM7CQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCiYjNDM7CQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbywKJiM0MzsJCQkJCSAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKJiM0MzsJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKJiM0MzsJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaAomIzQzOwkgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuCiYjNDM7CSAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvCiYjNDM7CSAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKi8KJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgJiM0MzsgMSk7CiYjNDM7CWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MztmYWlsOgomIzQzOwkvKgomIzQzOwkgKiBJZiB3ZSB3YW50IHRvIHVzZSB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUgaW4gdW5tYXBfZm9saW8sCiYjNDM7CSAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LgomIzQzOwkgKi8KJiM0MzsJeGFzX3VubG9ja19pcnEoJmFtcDt4YXMpOwomIzQzO2ZhaWxfbW1hcF91bmxvY2s6CiYjNDM7CWlmIChucl9zaG1lbV9kcm9wcGVkKQomIzQzOwkJc2htZW1fdW5jaGFyZ2UobWFwcGluZy0mZ3Q7aG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7CiYjNDM7CS8qCiYjNDM7CSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCiYjNDM7CSAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSwgc28gZXZpY3Rpb24gY2Fubm90IGZyZWUKJiM0MzsJICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvcgomIzQzOwkgKiB0aGUgbWFwcGluZy4KJiM0MzsJICovCiYjNDM7CWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKJiM0MztmYWlsX2ZyZWU6CiYjNDM7CS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovCiYjNDM7CXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKJiM0MzsJbWVtX2Nncm91cF9wdXQobWVtY2cpOwomIzQzOwl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDA4Niw5ICYjNDM7NDI2Myw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuCiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMCiAgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpCiAgKgotICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuCiYjNDM7ICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LgogICogSXQgaXMgaW4gY2hhcmdlIG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlIHNwbGl0IGlzIHN1cHBvcnRlZCBvciBub3QgYW5kCi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuCiYjNDM7ICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS4KICAqCiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBhZnRlci1zcGxpdCBmb2xpbyBjb250YWluaW5nIEBsb2NrX2F0IHJlbWFpbnMgbG9ja2VkCiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDoKQEAgLTQxMDIsMTcgJiM0Mzs0Mjc5LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKLQlYQV9TVEFURSh4YXMsICZhbXA7Zm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CWJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiAJYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMOwotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwotCWludCBucl9zaG1lbV9kcm9wcGVkID0gMDsKLQllbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwOwotCXBnb2ZmX3QgZW5kID0gMDsKIAlpbnQgcmV0OwogCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKQEAgLTQxMjAsMTQxICYjNDM7NDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAogCWlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG5ld19vcmRlciAmZ3Q7PSBvbGRfb3JkZXIpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfbm9fbWVtY2c7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpOwogCWlmIChyZXQpIHsKIAkJVk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCAmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpbyYjMzQ7KTsKLQkJZ290byBvdXRfbm9fbWVtY2c7Ci0JfQotCi0JLyoKLQkgKiBzd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAotCSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KLQkgKi8KLQltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwotCW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwotCi0JaWYgKGlzX2Fub24pIHsKLQkJLyoKLQkJICogVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkCi0JCSAqIHByZXZlbnQgdGhlIGFub25fdm1hIGRpc2FwcGVhcmluZyBzbyB3ZSBmaXJzdCB3ZSB0YWtlIGEKLQkJICogcmVmZXJlbmNlIHRvIGl0IGFuZCB0aGVuIGxvY2sgdGhlIGFub25fdm1hIGZvciB3cml0ZS4gVGhpcwotCQkgKiBpcyBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCBleGNlcHQgdGhlIHdyaXRlIGxvY2sKLQkJICogaXMgdGFrZW4gdG8gc2VyaWFsaXNlIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UKLQkJICogb3BlcmF0aW9ucy4KLQkJICovCi0JCWFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTsKLQkJaWYgKCFhbm9uX3ZtYSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBtaW5fb3JkZXI7Ci0JCWdmcF90IGdmcDsKLQotCQltYXBwaW5nID0gZm9saW8tJmd0O21hcHBpbmc7Ci0JCW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwotCQlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJmFtcDsKLQkJCQkJCQlHRlBfUkVDTEFJTV9NQVNLKTsKLQotCQlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwotCi0JCWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewotCQkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwotCQkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwotCQkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKLQkJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJYW5vbl92bWEgPSBOVUxMOwotCQlpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpOwotCi0JCS8qCi0JCSAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZAotCQkgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZQotCQkgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suCi0JCSAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LAotCQkgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLgotCQkgKi8KLQkJZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctJmd0O2hvc3QpLCBQQUdFX1NJWkUpOwotCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSkKLQkJCWVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLSZndDtob3N0LCBlbmQpOwotCX0KLQotCS8qCi0JICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGwKLQkgKiBzcGxpdCBQTURzCi0JICovCi0JaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXVubWFwX2ZvbGlvKGZvbGlvKTsKLQotCS8qIGJsb2NrIGludGVycnVwdCByZWVudHJ5IGluIHhhX2xvY2sgYW5kIHNwaW5sb2NrICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAobWFwcGluZykgewotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgotCQkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KLQkJICovCi0JCXhhc19sb2NrKCZhbXA7eGFzKTsKLQkJeGFzX3Jlc2V0KCZhbXA7eGFzKTsKLQkJaWYgKHhhc19sb2FkKCZhbXA7eGFzKSAhPSBmb2xpbykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWdvdG8gZmFpbDsKLQkJfQomIzQzOwkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgbWFwcGluZywKLQkJCQkJCXRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgJmFtcDtucl9zaG1lbV9kcm9wcGVkKTsKLWZhaWw6Ci0JaWYgKG1hcHBpbmcpCi0JCXhhc191bmxvY2soJmFtcDt4YXMpOwotCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JaWYgKG5yX3NobWVtX2Ryb3BwZWQpCi0JCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwotCi0JaWYgKCFyZXQgJmFtcDsmYW1wOyBpc19hbm9uICZhbXA7JmFtcDsgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkKLQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7Ci0KLQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKLQotCS8qCi0JICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXMKLQkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvCi0JICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5Ci0JICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2UKLQkgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy4KLQkgKi8KLQlpZiAobWFwcGluZykgewotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0KJiM0MzsJaWYgKGlzX2Fub24pCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsCiYjNDM7CQkJCQkJICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZSBpZiAoaXNfc3dhcGNhY2hlKQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpOwomIzQzOwllbHNlCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwKJiM0MzsJCQkJCQkJICBsaXN0LCBzcGxpdF90eXBlKTsKIAogCS8qCiAJICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZwpAQCAtNDI2NSwyOSAmIzQzOzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCWlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkKIAkJCWNvbnRpbnVlOwogCi0JCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwogCQkvKgogCQkgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWQKIAkJICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlCi0JCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWwKJiM0MzsJCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiAJCSAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuCiAJCSAqLwotCQlmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7CiYjNDM7CQlpZiAoaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgIWZvbGlvX21hcHBlZChuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fdW5sb2NrKG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19wdXQobmV3X2ZvbGlvKTsKIAl9CiAKLW91dF91bmxvY2s6Ci0JaWYgKGFub25fdm1hKSB7Ci0JCWFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7Ci0JfQotCWlmIChtYXBwaW5nKQotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiBvdXQ6Ci0JLyogcmVzdG9yZSB0byBjYWxsZXImIzM5O3Mgb2xkX21lbWNnICovCi0Jc2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpOwotCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKLW91dF9ub19tZW1jZzoKLQl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJaWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKQogCQljb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpOwogCWNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTsKQEAgLTQzMTEsMjkgJiM0Mzs0MzYwLDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogICogaXNvbGF0ZWQgZnJvbSBMUlUgKGlmIGFwcGxpY2FibGUpCiAgKgogICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSwKLSAqIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLgomIzQzOyAqIGZvbGlvX2ZyZWVfc3dhcCgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvCiAgKiAgICAgICAgIGluc3VmZmljaWVudCByZWZlcmVuY2UgY291bnQgb3IgZXh0cmEgcGlucykuCiAgKi8KIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewotCWludCByZXQgPSAwOwotCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sYXJnZShmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKIAotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIE5VTEwsCi0JCQkJCQlOVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLAotCQkJCQkJMCwgTlVMTCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJldHVybiByZXQ7CiYjNDM7CXJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgJmFtcDtmb2xpby0mZ3Q7cGFnZSwgZmFsc2UsCiYjNDM7CQkJCQkgICAgICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTsKIH0KIAogLyoKQEAgLTQzNTIsMTAgJiM0Mzs0MzkyLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyCiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi4KICAqCi0gKiA0KSBAbmV3X29yZGVyICZndDsgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3QKLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIHdoaWNoCi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMQotICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKJiM0MzsgKiA0KSBAbmV3X29yZGVyICE9IDEgZm9yIGFub24gb3Igc3dhcGNhY2hlLiBBbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IKJiM0MzsgKiAgICBfZGVmZXJyZWRfbGlzdCwgd2hpY2ggb3JkZXItMSBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heQomIzQzOyAqICAgIGJlY29tZSBhbm9uIG9uY2UgZmF1bHRlZCBpbi4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKICAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC4KICAqCiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBjYWxsZXImIzM5O3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsCkBAIC00Mzg0LDcgJiM0Mzs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiB3aXRoIHRoZSBmb2xpby4gU3BsaXR0aW5nIHRvIG9yZGVyIDAgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBmb2xpb3MuCiAgKi8KIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotCQkJCSAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcikKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiB7CiAJc3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiAKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0zODksOCAmIzQzOzM4OSw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7CiAJCWNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtJmd0O3N3YXApOwogCQljaV9lbmQgPSBjaV9vZmYgJiM0MzsgZm9saW9fbnJfcGFnZXMob2xkKTsKLQkJd2hpbGUgKGNpX29mZiYjNDM7JiM0MzsgJmx0OyBjaV9lbmQpCiYjNDM7CQlkbyB7CiAJCQlXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7CiYjNDM7CQl9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmICZsdDsgY2lfZW5kKTsKIAl9CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyODc2CgkJCQkJCQlvdXRwdXQ6IDE2NgoJCQkJCQkJdGhvdWdodHM6IDQ2OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBGb2xpbyBTcGxpdHRpbmcgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgbG9va2VkIG92ZXIgdGhpcyBwYXRjaC4gSXQmIzM5O3MgdG91Y2hpbmcgYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYCwgd2hpY2ggaW1tZWRpYXRlbHkgdGVsbHMgbWUgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCB0aGUgbml0dHktZ3JpdHR5IG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBzcGVjaWZpY2FsbHkgaG93IHdlJiMzOTtyZSBoYW5kbGluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGFuZCB0aGVpciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBzd2FwIGNhY2hlIGFuZCBwYWdlIGNhY2hlLiBUaGUgY29yZSBvZiB0aGUgY2hhbmdlcyBpcyBhIHJlZmFjdG9yaW5nIG9mIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMuIFRoZXkmIzM5O3JlIHJlbmFtaW5nIGZ1bmN0aW9ucywgbGlrZSBgX19zcGxpdF91bm1hcHBlZF9mb2xpb2AgdG8gYF9fc3BsaXRfZnJvemVuX2ZvbGlvYCBhbmQgc2ltaWxhciB2YXJpYXRpb25zLCBidXQgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBzZWVtcyB0aGUgc2FtZTogdW5tYXBwaW5nLCBmcmVlemluZywgYW5kIHNwbGl0dGluZyB0aGVzZSBmb2xpb3MuCgpNeSBpbml0aWFsIHNjYW4gdGVsbHMgbWUgdGhpcyBpcyBhbGwgcHVyZWx5IGludGVybmFsIG1lbW9yeSBtYW5hZ2VtZW50LiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBpbnRyb2R1Y2VkIHRoYXQgd291bGQgZ2V0IGV4cG9zZWQgdG8gdXNlciBzcGFjZS4gSXQmIzM5O3MgYWxsIGFib3V0IGhvdyB3ZSBtYW5hZ2UgcGFnZSByZWZjb3VudHMsIGRlYWwgd2l0aCBsb2NraW5nLCBhbmQgdXBkYXRlIHRob3NlIHhhcnJheXMgYW5kIExSVSBsaXN0cyB3aGVuIHNwbGl0dGluZyBhIGZvbGlvLgoKU2luY2UgaXQmIzM5O3MgbWVtb3J5IG1hbmFnZW1lbnQsIHRoZSB0eXBpY2FsIHJpc2tzIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHM6IHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIGFuZCBkZWFkbG9ja3MuIEJ1dCwgc2luY2UgdGhlcmUgaXMgbm8gZGF0YSBjb3BpZWQgdG8gb3IgZnJvbSB1c2VyIHNwYWNlIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBLTVNBTiBkb2VzbiYjMzk7dCBzZWVtIHRvIGJlIHJlcXVpcmVkIGZvciB0aGVzZSBjaGFuZ2VzLiBXZSYjMzk7cmUgYWxyZWFkeSBwcm90ZWN0ZWQgYnkgS0FTQU4sIEtDU0FOLCBhbmQgTE9DS0RFUCBmb3IgdGhlIHVzdWFsIG1lbW9yeSBjb3JydXB0aW9uIGFuZCBsb2NraW5nIHByb2JsZW1zLgoKSSB0b29rIGEgY2xvc2VyIGxvb2sgdG8gZG91YmxlLWNoZWNrIG15IGluaXRpYWwgYXNzZXNzbWVudC4gSSBzZWUgYHhhc19zcGxpdF9hbGxvY2AgYmVpbmcgdXNlZCwgYnV0IHRob3NlIGFyZSBqdXN0IGFsbG9jYXRpbmcgeGFycmF5IG5vZGVzLCBub3QgdXNlci12aXNpYmxlIGRhdGEuIE5vdGhpbmcgbmV3IGlzIGJlaW5nIGV4cG9zZWQgdG8gdXNlcnNwYWNlLiBNZW1vcnkgaW5pdGlhbGl6YXRpb24gZG9lc24mIzM5O3Qgc2VlbSB0byBiZSBhIGZhY3RvciBoZXJlOyB3ZSYjMzk7cmUganVzdCBzcGxpdHRpbmcgZXhpc3RpbmcgZm9saW9zLgoKVGhlcmVmb3JlLCAqTmVlZHNLTVNBTiogaXMgZGVmaW5pdGVseSBmYWxzZS4gVGhpcyBwYXRjaCBpcyBhIGdvb2QgZXhhbXBsZSBvZiBpbnRlcm5hbCBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIHRoYXQgc2hvdWxkICpub3QqIHJlcXVpcmUgS01TQU4gc2NydXRpbnkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKHNwZWNpZmljYWxseSBmb3IgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MpLiBJdCBtb2RpZmllcyBob3cgZm9saW9zIGFyZSB1bm1hcHBlZCwgZnJvemVuLCBhbmQgc3BsaXQsIHVwZGF0aW5nIHBhZ2UgY2FjaGUgYW5kIHN3YXAgY2FjaGUgcmVmZXJlbmNlcy4gVGhlc2UgY2hhbmdlcyBpbnZvbHZlIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgeGFycmF5IG1hbmlwdWxhdGlvbnMuIFRoZXkgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWx0ZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIG1lbW9yeSBidWZmZXJzLiBBbnkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgd291bGQgbWFuaWZlc3QgYXMgdXNlLWFmdGVyLWZyZWUsIG1lbW9yeSBjb3JydXB0aW9uLCBvciBsb2NraW5nIGlzc3Vlcywgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGZvciBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcykuIEl0IG1vZGlmaWVzIGhvdyBmb2xpb3MgYXJlIHVubWFwcGVkLCBmcm96ZW4sIGFuZCBzcGxpdCwgdXBkYXRpbmcgcGFnZSBjYWNoZSBhbmQgc3dhcCBjYWNoZSByZWZlcmVuY2VzLiBUaGVzZSBjaGFuZ2VzIGludm9sdmUgcGFnZSByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCB4YXJyYXkgbWFuaXB1bGF0aW9ucy4gVGhleSBkbyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbHRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJ1ZmZlcnMuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyB3b3VsZCBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGxvY2tpbmcgaXNzdWVzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjM4LjUwMjk0MjkxOFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMzI5MDY2MDU1NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGZvciBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcykuIEl0IG1vZGlmaWVzIGhvdyBmb2xpb3MgYXJlIHVubWFwcGVkLCBmcm96ZW4sIGFuZCBzcGxpdCwgdXBkYXRpbmcgcGFnZSBjYWNoZSBhbmQgc3dhcCBjYWNoZSByZWZlcmVuY2VzLiBUaGVzZSBjaGFuZ2VzIGludm9sdmUgcGFnZSByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCB4YXJyYXkgbWFuaXB1bGF0aW9ucy4gVGhleSBkbyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbHRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJ1ZmZlcnMuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyB3b3VsZCBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGxvY2tpbmcgaXNzdWVzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBmaXhlcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL2h1Z2VfbWVtb3J5LmMgYW5kIG1tL3N3YXBfc3RhdGUuYywgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCBoYXMgZnVuY3Rpb25hbCBpbXBhY3QuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjM4LjUwMjk0ODE3OFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI3MjAwMjAxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDZkYWUzZTc4MzkyNzY4MDUyYTE0MjZhZGJkN2IzOWM3YTJhMjE3ZDJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi5jYzlmN2UwZDQxOTRlIDEwMDY0NFxcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXFxuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxcbiB7XFxuIFxcdGludCBpID0gMDtcXG4gXFxuLVxcdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXFxuLVxcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4tXFx0XFx0cmV0dXJuO1xcbiBcXHRmb3IgKDs7KSB7XFxuIFxcdFxcdHJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTtcXG4gXFx0XFx0aSArPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuQEAgLTM3NTUsOCArMzc1Miw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSAtIHNwbGl0cyBhbiB1bm1hcHBlZCBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zIGluXFxuLSAqIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxcbisgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIC0gc3BsaXRzIGEgZnJvemVuIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3NcXG4rICogaW4gdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuXFxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXFxuICAqIEBuZXdfb3JkZXI6IHRoZSBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXIgc3BsaXQgZm9saW9zIChzaW5jZSBidWRkeVxcbiAgKiAgICAgICAgICAgICBhbGxvY2F0b3IgbGlrZSBzcGxpdCBnZW5lcmF0ZXMgZm9saW9zIHdpdGggb3JkZXJzIGZyb20gQGZvbGlvJ3NcXG5AQCAtMzc2NCw3ICszNzYxLDYgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxcbiAgKiBAc3BsaXRfYXQ6IGluIGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXRcXG4gICogICAgICAgICAgICB3aWxsIGJlIHNwbGl0IHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIuXFxuICAqIEB4YXM6IHhhX3N0YXRlIHBvaW50aW5nIHRvIGZvbGlvLVxcdTAwM2VtYXBwaW5nLVxcdTAwM2VpX3BhZ2VzIGFuZCBsb2NrZWQgYnkgY2FsbGVyXFxuLSAqIEBtYXBwaW5nOiBAZm9saW8tXFx1MDAzZW1hcHBpbmdcXG4gICogQHNwbGl0X3R5cGU6IGlmIHRoZSBzcGxpdCBpcyB1bmlmb3JtIG9yIG5vdCAoYnVkZHkgYWxsb2NhdG9yIGxpa2Ugc3BsaXQpXFxuICAqXFxuICAqXFxuQEAgLTM3OTUsMTEgKzM3OTEsMTIgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcXHUwMDNjMCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlXFxuICAqIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlciwgdGhlIGNhbGxlciBuZWVkcyB0byBjaGVjaylcXG4gICovXFxuLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxcbitzdGF0aWMgaW50IF9fc3BsaXRfZnJvemVuX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXFxuLVxcdFxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4rXFx0XFx0ZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4gXFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4rXFx0Y29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcdGludCBzdGFydF9vcmRlciA9IHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNID8gbmV3X29yZGVyIDogb2xkX29yZGVyIC0gMTtcXG4gXFx0c3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbztcXG5AQCAtMzgxNCwxMSArMzgxMSwxMSBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4gXFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XFxuIFxcdFxcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFxcdTAwM2NcXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XFxuIFxcbi1cXHRcXHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXFxuLVxcdFxcdGlmIChpc19hbm9uIFxcdTAwMjZcXHUwMDI2IHNwbGl0X29yZGVyID09IDEpXFxuK1xcdFxcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXFxuK1xcdFxcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFxcdTAwMjZcXHUwMDI2IHNwbGl0X29yZGVyID09IDEpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4tXFx0XFx0aWYgKG1hcHBpbmcpIHtcXG4rXFx0XFx0aWYgKHhhcykge1xcbiBcXHRcXHRcXHQvKlxcbiBcXHRcXHRcXHQgKiB1bmlmb3JtIHNwbGl0IGhhcyB4YXNfc3BsaXRfYWxsb2MoKSBjYWxsZWQgYmVmb3JlXFxuIFxcdFxcdFxcdCAqIGlycSBpcyBkaXNhYmxlZCB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LCB3aGVyZWFzXFxuQEAgLTM4NzgsMzIgKzM4NzUsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdFxcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxcbiB7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbitcXG4gXFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XFxuIFxcdC8qXFxuIFxcdCAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlXFxuLVxcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXFxuLVxcdCAqXFxuLVxcdCAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZVxcbi1cXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cXG4rXFx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvXFxuK1xcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFmb2xpby1cXHUwMDNlbWFwcGluZyBcXHUwMDI2XFx1MDAyNiAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4rXFx0aWYgKCFmb2xpby1cXHUwMDNlbWFwcGluZyBcXHUwMDI2XFx1MDAyNiAhaXNfc3dhcGNhY2hlKVxcbiBcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbiBcXG4tXFx0Lyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqL1xcbi1cXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcXG4tXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcbiBcXHQvKlxcbi1cXHQgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwXFxuLVxcdCAqXFxuLVxcdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cXG4tXFx0ICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueVxcbi1cXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXFxuLVxcdCAqIGhlcmUuXFxuK1xcdCAqIE9yZGVyLTEgaXMgdW5zdXBwb3J0ZWQ6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciB0aGVcXG4rXFx0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFxcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxcbitcXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcXG4rXFx0ICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcXHUwMDI2XFx1MDAyNiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcXG4rXFx0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXFx1MDAyNlxcdTAwMjYgbmV3X29yZGVyID09IDEpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHR9XFxuIFxcbiBcXHRpZiAoaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuQEAgLTM5MTEsMzkgKzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcXG4gXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXFxuK1xcdCAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0J3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXFxuK1xcdCAqIHNobWVtIG1hcHBpbmcgYWZ0ZXJ3YXJkLiBUaGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmcgdGhlbVxcbitcXHQgKiBoZW5jZSByZWplY3QgaXQgaGVyZSB1cCBmcm9udCBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWlzX2Fub24gXFx1MDAyNlxcdTAwMjYgaXNfc3dhcGNhY2hlIFxcdTAwMjZcXHUwMDI2IGZvbGlvLVxcdTAwM2VtYXBwaW5nKVxcbitcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLS8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHBhZ2VjYWNoZSBvciB0aGUgc3dhcGNhY2hlLiAqL1xcbi1zdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX2NhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiB7XFxuLVxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuK1xcdGlmICghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFx0cmV0dXJuIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBib29sIGRvX2xydSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBwZ29mZl90IGVuZCwgaW50ICpucl9zaG1lbV9kcm9wcGVkKVxcbisvKipcXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKCkgLSBzcGxpdCBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW9cXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWRcXG4rICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXFxuKyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxcbisgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcXG4rICogQGRvX2xydTogaWYgdHJ1ZSwgYWRkIGFmdGVyLXNwbGl0IGZvbGlvcyB0byBAbGlzdCBpZiBub24gTlVMTCwgb3RoZXJ3aXNlIHRvXFxuKyAqICAgICAgICAgIHRoZSBMUlUgbGlzdFxcbisgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyXFxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKlxcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW8uIEl0IHVubWFwcyBAZm9saW8gKHVubGVzc1xcbisgKiBAYW5vbl91bm1hcCBpcyBmYWxzZSksIGZyZWV6ZXMgaXRzIHJlZmNvdW50LCBhbmQgcGVyZm9ybXMgdGhlIHNwbGl0LCB1cGRhdGVzXFxuKyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC5cXG4rICovXFxuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxcbitcXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxcbiB7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuK1xcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xcbitcXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xcbiBcXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4gXFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xcbiBcXHRpbnQgcmV0ID0gMDtcXG4gXFxuLVxcdFZNX1dBUk5fT05fT05DRSghbWFwcGluZyBcXHUwMDI2XFx1MDAyNiBlbmQpO1xcbitcXHQvKlxcbitcXHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcXG4rXFx0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXFxuK1xcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xcbitcXHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xcbitcXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhbm9uX3VubWFwKSB7XFxuK1xcdFxcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcXG4rXFx0XFx0aWYgKCFhbm9uX3ZtYSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0XFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdGhlIG9wdGlvbmFsIHVubWFwLiAqL1xcbitcXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChhbm9uX3VubWFwKVxcbitcXHRcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xcbitcXG4gXFx0LypcXG4gXFx0ICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dFxcbiBcXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXFxuIFxcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxcbiBcXHQgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlXFxuIFxcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXFxuK1xcdCAqXFxuK1xcdCAqIE9ubHkgYW5vbiBmb2xpb3MgYXJlIGV2ZXIgcXVldWVkIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBsaXN0LFxcbitcXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXFxuIFxcdCAqL1xcbi1cXHRkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBvbGRfb3JkZXIgXFx1MDAzZSAxO1xcbitcXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFxcdTAwM2UgMSBcXHUwMDI2XFx1MDAyNiBpc19hbm9uO1xcbiBcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbiBcXHRcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XFxuIFxcbkBAIC0zOTUyLDEyOCArNDAwMSwyNTYgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cXG4gXFx0XFx0bHJ1ID0gbGlzdF9scnVfbG9jayhcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxcbiBcXHRcXHRcXHRcXHQgICAgZm9saW9fbmlkKGZvbGlvKSwgXFx1MDAyNm1lbWNnKTtcXG4gXFx0fVxcbi1cXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XFxuLVxcdFxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbi1cXHRcXHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XFxuIFxcbitcXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcXG4gXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0X19saXN0X2xydV9kZWwoXFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxcbi1cXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmZvbGlvLVxcdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XFxuLVxcdFxcdFxcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xcbi1cXHRcXHRcXHRcXHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xcbi1cXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xcbiBcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFx0XFx0fVxcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIG91dF9ub19zcGxpdDtcXG4rXFx0fVxcbiBcXG4tXFx0XFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0XFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbi1cXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHQgICAgbmV3X29yZGVyIFxcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XFxuLVxcdFxcdFxcdFxcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdFxcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0TlJfU0hNRU1fVEhQUywgLW5yKTtcXG4tXFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHROUl9GSUxFX1RIUFMsIC1ucik7XFxuLVxcdFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbitcXHRcXHRfX2xpc3RfbHJ1X2RlbChcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXFxuK1xcdFxcdFxcdCAgICAgICBcXHUwMDI2Zm9saW8tXFx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcXG4rXFx0XFx0XFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XFxuK1xcdFxcdFxcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XFxuIFxcdFxcdH1cXG4rXFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGlmIChtYXBwaW5nKSB7XFxuLVxcdFxcdFxcdFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XFxuLVxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuK1xcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XFxuIFxcbi1cXHRcXHRcXHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xcbi1cXHRcXHR9XFxuK1xcdGlmIChkb19scnUpXFxuK1xcdFxcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcXG4gXFxuLVxcdFxcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHRyZXQgPSBfX3NwbGl0X2Zyb3plbl9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCwgc3BsaXRfdHlwZSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XFxuK1xcdCAqIHBsYWNlLiBLZWVwIHRoZSBoZWFkIEBmb2xpbyBmcm96ZW4gdW50aWwgdGhlIGVuZDogc3ViIGVudHJpZXNcXG4rXFx0ICogaW4gc3dhcCBjYWNoZSBtdXN0IGJlIHVwZGF0ZWQgZmlyc3QsIHNvIGEgY29uY3VycmVudFxcbitcXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXFxuK1xcdCAqIGVudHJ5IChmb2xpb190cnlfZ2V0KCkgd2lsbCBmYWlsIG9uIHRoZSBoZWFkIEBmb2xpbyB1bnRpbCB1bmZyZWV6ZSkuXFxuK1xcdCAqL1xcbitcXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xcbitcXHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcXG4rXFx0XFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcXG4rXFx0XFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4rXFx0XFx0XFx0XFx0ICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XFxuIFxcdFxcdGlmIChkb19scnUpXFxuLVxcdFxcdFxcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcXG4rXFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXHRcXHRpZiAoY2kpXFxuK1xcdFxcdFxcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcXG4rXFx0fVxcbiBcXG4tXFx0XFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xcbitcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcXG4rXFx0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpO1xcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxcbi1cXHRcXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGVcXG4tXFx0XFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXFxuLVxcdFxcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuLVxcdFxcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcXG4tXFx0XFx0ICogQGZvbGlvLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcXG4tXFx0XFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XFxuLVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xcbitcXHRpZiAoZG9fbHJ1KVxcbitcXHRcXHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XFxuK1xcdGlmIChjaSlcXG4rXFx0XFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XFxuK291dF9ub19zcGxpdDpcXG4rXFx0bG9jYWxfaXJxX2VuYWJsZSgpO1xcbitcXHRpZiAoYW5vbl92bWEpIHtcXG4rXFx0XFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcXG4rXFx0XFx0XFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XFxuK1xcdFxcdHJlbWFwX3BhZ2UoZm9saW8sIDEgXFx1MDAzY1xcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xcbitcXHR9XFxuK291dF91bmxvY2s6XFxuK1xcdGlmIChhbm9uX3ZtYSkge1xcbitcXHRcXHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xcbitcXHRcXHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuIFxcbi1cXHRcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbisvKipcXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW9cXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWQgYW5kIGZpbGUtYmFja2VkXFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXFxuKyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXRcXG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXFxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKlxcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0c1xcbisgKiByZWZjb3VudCwgYW5kIHBlcmZvcm0gdGhlIHNwbGl0LCB1cGRhdGVzIHRoZSBwYWdlIGNhY2hlIGVudHJpZXMuIFNwbGl0XFxuKyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuIChpZiAtRU5PTUVNXFxuKyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKVxcbisgKi9cXG4rc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuK3tcXG4rXFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4rXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2bWFwcGluZy1cXHUwMDNlaV9wYWdlcywgZm9saW8tXFx1MDAzZWluZGV4KTtcXG4rXFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcXG4rXFx0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcXG4rXFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xcbitcXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4rXFx0cGdvZmZfdCBlbmQgPSAwO1xcbitcXHRnZnBfdCBnZnA7XFxuK1xcdGludCByZXQgPSAwO1xcbiBcXG4tXFx0XFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4rXFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuK1xcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0XFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXHQvKlxcbitcXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXFxuK1xcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cXG4rXFx0ICovXFxuK1xcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuK1xcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cXG4tXFx0XFx0XFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChjaSkge1xcbi1cXHRcXHRcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spO1xcbitcXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gZmFpbF9mcmVlO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXFxuLVxcdFxcdFxcdGlmICghbWFwcGluZylcXG4tXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdG1hcHBpbmdfc2V0X3VwZGF0ZShcXHUwMDI2eGFzLCBtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdFxcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xcbi1cXHRcXHRcXHRpZiAobmV3X2ZvbGlvLVxcdTAwM2VpbmRleCBcXHUwMDNjIGVuZCkge1xcbi1cXHRcXHRcXHRcXHRfX3hhX3N0b3JlKFxcdTAwMjZtYXBwaW5nLVxcdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXFx1MDAzZWluZGV4LFxcbi1cXHRcXHRcXHRcXHRcXHQgICBuZXdfZm9saW8sIDApO1xcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcXG4rXFx0XFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XFxuLVxcdFxcdFxcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVxcdTAwM2VpbmRleCBcXHUwMDNlPSBlbmQgKi9cXG4tXFx0XFx0XFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXFx1MDAyNlxcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcXG4tXFx0XFx0XFx0XFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxcbi1cXHRcXHRcXHRcXHRcXHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXFx1MDAzZWhvc3QpKTtcXG4tXFx0XFx0XFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xcbi1cXHRcXHRcXHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcXG4rXFx0XFx0eGFzX3NldF9vcmRlcihcXHUwMDI2eGFzLCBmb2xpby1cXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XFxuK1xcdFxcdHhhc19zcGxpdF9hbGxvYyhcXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xcbitcXHRcXHRpZiAoeGFzX2Vycm9yKFxcdTAwMjZ4YXMpKSB7XFxuK1xcdFxcdFxcdHJldCA9IHhhc19lcnJvcihcXHUwMDI2eGFzKTtcXG4rXFx0XFx0XFx0Z290byBmYWlsX2ZyZWU7XFxuIFxcdFxcdH1cXG4rXFx0fVxcbiBcXG4tXFx0XFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuLVxcdFxcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4tXFx0XFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4tXFx0XFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcXG4rXFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdGlmIChkb19scnUpXFxuLVxcdFxcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovXFxuK1xcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuK1xcdFxcdHJldCA9IC1FQUdBSU47XFxuK1xcdFxcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcXG4rXFx0fVxcbiBcXG4tXFx0XFx0aWYgKGNpKVxcbi1cXHRcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHQvKlxcbitcXHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbitcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbitcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuK1xcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbitcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbitcXHQgKi9cXG4rXFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbitcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuK1xcbitcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHR4YXNfbG9ja19pcnEoXFx1MDAyNnhhcyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxcbitcXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cXG4rXFx0ICovXFxuK1xcdGlmICh4YXNfbG9hZChcXHUwMDI2eGFzKSAhPSBmb2xpbykge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcXG4rXFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2IG5ld19vcmRlciBcXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcXG4rXFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XFxuK1xcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcXHUwMDI2eGFzLCBzcGxpdF90eXBlKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcXG4rXFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlXFxuK1xcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xcbitcXHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxcbitcXHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXFxuK1xcdCAqIEBmb2xpby5cXG4rXFx0ICovXFxuK1xcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XFxuK1xcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcXG4rXFxuK1xcdFxcdC8qIGNvbXB1dGUgbmV4dCBiZWZvcmUgdGhlIGZvbGlvIGNhbiBiZSBmcmVlZCBiZWxvdyAqL1xcbitcXHRcXHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xcbitcXG4rXFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4rXFx0XFx0XFx0XFx0ICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSArIDEpO1xcbitcXG4rXFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXG4rXFx0XFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXFxuK1xcdFxcdGlmIChuZXdfZm9saW8tXFx1MDAzZWluZGV4IFxcdTAwM2MgZW5kKSB7XFxuK1xcdFxcdFxcdF9feGFfc3RvcmUoXFx1MDAyNm1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cXHUwMDNlaW5kZXgsXFxuK1xcdFxcdFxcdFxcdCAgIG5ld19mb2xpbywgMCk7XFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHR9XFxuLVxcdFxcdHJldHVybiAtRUFHQUlOO1xcbitcXG4rXFx0XFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXFx1MDAzZWluZGV4IFxcdTAwM2U9IGVuZCAqL1xcbitcXHRcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0XFx0bnJfc2htZW1fZHJvcHBlZCArPSBucl9wYWdlcztcXG4rXFx0XFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxcbitcXHRcXHRcXHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVxcdTAwM2Vob3N0KSk7XFxuK1xcdFxcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcXG4rXFx0XFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XFxuIFxcdH1cXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuK1xcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4rXFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4rXFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuK1xcdCAqL1xcbitcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xcbitcXHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XFxuK2ZhaWw6XFxuK1xcdC8qXFxuK1xcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcXG4rXFx0ICogcmVtZW1iZXIgdG8gYWRkIHJlbWFwX3BhZ2UoKSBhbmQgYWRhcHQgaXQuXFxuK1xcdCAqL1xcbitcXHR4YXNfdW5sb2NrX2lycShcXHUwMDI2eGFzKTtcXG4rZmFpbF9tbWFwX3VubG9jazpcXG4rXFx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXFxuK1xcdFxcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXFx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xcbitcXHQvKlxcbitcXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xcbitcXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXFxuK1xcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcXG4rXFx0ICogdGhlIG1hcHBpbmcuXFxuK1xcdCAqL1xcbitcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuK2ZhaWxfZnJlZTpcXG4rXFx0LyogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbWVtY2cgKi9cXG4rXFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbitcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuK1xcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbkBAIC00MDg2LDkgKzQyNjMsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxcbiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcXG4gICpcXG4tICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuXFxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cXG4gICogSXQgaXMgaW4gY2hhcmdlIG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlIHNwbGl0IGlzIHN1cHBvcnRlZCBvciBub3QgYW5kXFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cXG4gICpcXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZFxcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcXG5AQCAtNDEwMiwxNyArNDI3OSwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0XFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCxcXG4gXFx0XFx0c3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4tXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2Zm9saW8tXFx1MDAzZW1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIGZvbGlvLVxcdTAwM2VpbmRleCk7XFxuK1xcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xcbiBcXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xcbi1cXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XFxuLVxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcXG4tXFx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcXG4tXFx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xcbi1cXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xcbi1cXHRwZ29mZl90IGVuZCA9IDA7XFxuIFxcdGludCByZXQ7XFxuIFxcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xcbkBAIC00MTIwLDE0MSArNDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFxuIFxcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XFxuIFxcdFxcdHJldCA9IC1FSU5WQUw7XFxuLVxcdFxcdGdvdG8gb3V0X25vX21lbWNnO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4gXFx0aWYgKG5ld19vcmRlciBcXHUwMDNlPSBvbGRfb3JkZXIpIHtcXG4gXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0Z290byBvdXRfbm9fbWVtY2c7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xcbiBcXHRpZiAocmV0KSB7XFxuIFxcdFxcdFZNX1dBUk5fT05DRShyZXQgPT0gLUVJTlZBTCwgXFxcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1xcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF9ub19tZW1jZztcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxcbi1cXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXFxuLVxcdCAqL1xcbi1cXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xcbi1cXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcXG4tXFxuLVxcdGlmIChpc19hbm9uKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxcbi1cXHRcXHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXFxuLVxcdFxcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcXG4tXFx0XFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXFxuLVxcdFxcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXFxuLVxcdFxcdCAqIG9wZXJhdGlvbnMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XFxuLVxcdFxcdGlmICghYW5vbl92bWEpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVCVVNZO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4tXFx0XFx0bWFwcGluZyA9IE5VTEw7XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuLVxcdFxcdGdmcF90IGdmcDtcXG4tXFxuLVxcdFxcdG1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4tXFx0XFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuLVxcdFxcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2XFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdEdGUF9SRUNMQUlNX01BU0spO1xcbi1cXG4tXFx0XFx0aWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVCVVNZO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0bWFwcGluZ19zZXRfdXBkYXRlKFxcdTAwMjZ4YXMsIG1hcHBpbmcpO1xcbi1cXG4tXFx0XFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XFxuLVxcdFxcdFxcdHhhc19zZXRfb3JkZXIoXFx1MDAyNnhhcywgZm9saW8tXFx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xcbi1cXHRcXHRcXHR4YXNfc3BsaXRfYWxsb2MoXFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcXG4tXFx0XFx0XFx0aWYgKHhhc19lcnJvcihcXHUwMDI2eGFzKSkge1xcbi1cXHRcXHRcXHRcXHRyZXQgPSB4YXNfZXJyb3IoXFx1MDAyNnhhcyk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGFub25fdm1hID0gTlVMTDtcXG4tXFx0XFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbi1cXHRcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbi1cXHRcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuLVxcdFxcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbi1cXHRcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbi1cXHRcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4tXFx0XFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuLVxcdH1cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSB3aWxsXFxuLVxcdCAqIHNwbGl0IFBNRHNcXG4tXFx0ICovXFxuLVxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuLVxcdFxcdHJldCA9IC1FQUdBSU47XFxuLVxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4tXFx0fVxcbi1cXG4tXFx0dW5tYXBfZm9saW8oZm9saW8pO1xcbi1cXG4tXFx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cXG4tXFx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcXG4tXFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS5cXG4tXFx0XFx0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHR4YXNfbG9jayhcXHUwMDI2eGFzKTtcXG4tXFx0XFx0eGFzX3Jlc2V0KFxcdTAwMjZ4YXMpO1xcbi1cXHRcXHRpZiAoeGFzX2xvYWQoXFx1MDAyNnhhcykgIT0gZm9saW8pIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4tXFx0XFx0XFx0Z290byBmYWlsO1xcbi1cXHRcXHR9XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbi1cXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFxcdTAwMjZ4YXMsIG1hcHBpbmcsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdHRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgXFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xcbi1mYWlsOlxcbi1cXHRpZiAobWFwcGluZylcXG4tXFx0XFx0eGFzX3VubG9jayhcXHUwMDI2eGFzKTtcXG4tXFxuLVxcdGxvY2FsX2lycV9lbmFibGUoKTtcXG4tXFxuLVxcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxcbi1cXHRcXHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVxcdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcXG4tXFxuLVxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2IGlzX2Fub24gXFx1MDAyNlxcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcXG4tXFx0XFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XFxuLVxcbi1cXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFxcdTAwM2NcXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXFxuLVxcdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cXG4tXFx0ICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5XFxuLVxcdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXFxuLVxcdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxcbi1cXHQgKi9cXG4tXFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xcbi1cXHRcXHRtYXBwaW5nID0gTlVMTDtcXG4tXFx0fVxcbitcXHRpZiAoaXNfYW5vbilcXG4rXFx0XFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbitcXHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXFxuK1xcdFxcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBmYWxzZSwgbGlzdCwgc3BsaXRfdHlwZSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXFxuQEAgLTQyNjUsMjkgKzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXFxuIFxcdFxcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxcbi1cXHRcXHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXFxuK1xcdFxcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXFxuIFxcdFxcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XFxuK1xcdFxcdGlmIChpc19zd2FwY2FjaGUgXFx1MDAyNlxcdTAwMjYgIWZvbGlvX21hcHBlZChuZXdfZm9saW8pKVxcbitcXHRcXHRcXHRmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XFxuK1xcdFxcdGZvbGlvX3B1dChuZXdfZm9saW8pO1xcbiBcXHR9XFxuIFxcbi1vdXRfdW5sb2NrOlxcbi1cXHRpZiAoYW5vbl92bWEpIHtcXG4tXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4tXFx0XFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcXG4tXFx0fVxcbi1cXHRpZiAobWFwcGluZylcXG4tXFx0XFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xcbiBvdXQ6XFxuLVxcdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXFxuLVxcdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcXG4tXFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbi1vdXRfbm9fbWVtY2c6XFxuLVxcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpXFxuIFxcdFxcdGNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7XFxuIFxcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcXG5AQCAtNDMxMSwyOSArNDM2MCwyMCBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gICogaXNvbGF0ZWQgZnJvbSBMUlUgKGlmIGFwcGxpY2FibGUpXFxuICAqXFxuICAqIFVwb24gcmV0dXJuLCB0aGUgZm9saW8gaXMgbm90IHJlbWFwcGVkLCBzcGxpdCBmb2xpb3MgYXJlIG5vdCBhZGRlZCB0byBMUlUsXFxuLSAqIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxcbisgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxcbiAgKlxcbiAgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVBR0FJTiBpZiB0aGUgZm9saW8gY2Fubm90IGJlIHNwbGl0IChlLmcuLCBkdWUgdG9cXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxcbiAgKi9cXG4gaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuIHtcXG4tXFx0aW50IHJldCA9IDA7XFxuLVxcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oZm9saW9fbWFwcGVkKGZvbGlvKSwgZm9saW8pO1xcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xcbiBcXG4tXFx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpXFxuLVxcdFxcdHJldHVybiAtRUFHQUlOO1xcbi1cXG4tXFx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcXG4tXFx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgTlVMTCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0TlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0MCwgTlVMTCk7XFxuLVxcdGxvY2FsX2lycV9lbmFibGUoKTtcXG4tXFx0cmV0dXJuIHJldDtcXG4rXFx0cmV0dXJuIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIGZhbHNlLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTtcXG4gfVxcbiBcXG4gLypcXG5AQCAtNDM1MiwxMCArNDM5Miw5IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXFxuICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLlxcbiAgKlxcbi0gKiA0KSBAbmV3X29yZGVyIFxcdTAwM2UgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3RcXG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVxcdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcXG4tICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTFcXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcXG4rICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yXFxuKyAqICAgIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xIGZvbGlvcyBsYWNrLCBhbmQgYSBzd2FwY2FjaGUgZm9saW8gbWF5XFxuKyAqICAgIGJlY29tZSBhbm9uIG9uY2UgZmF1bHRlZCBpbi4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxcbiAgKlxcbiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBjYWxsZXIncyBmb2xpbyByZWZlcmVuY2Ugd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byBAcGFnZSxcXG5AQCAtNDM4NCw3ICs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuICAqIHdpdGggdGhlIGZvbGlvLiBTcGxpdHRpbmcgdG8gb3JkZXIgMCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIGZvbGlvcy5cXG4gICovXFxuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbi1cXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbiB7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbiBcXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXFxuaW5kZXggYjc2ZWIzZDg3NmZkNy4uNTlhNTc3ZjY4NWI1YiAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcXG5AQCAtMzg5LDggKzM4OSw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gXFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xcbiBcXHRcXHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVxcdTAwM2Vzd2FwKTtcXG4gXFx0XFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcXG4tXFx0XFx0d2hpbGUgKGNpX29mZisrIFxcdTAwM2MgY2lfZW5kKVxcbitcXHRcXHRkbyB7XFxuIFxcdFxcdFxcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcXG4rXFx0XFx0fSB3aGlsZSAoKytjaV9vZmYgXFx1MDAzYyBjaV9lbmQpO1xcbiBcXHR9XFxuIH1cXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjM5Ljc3NTU4MzU2OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjExMzA3Mzk1MDYwNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZml4ZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS9odWdlX21lbW9yeS5jIGFuZCBtbS9zd2FwX3N0YXRlLmMsIHdoaWNoIGlzIHJlYWNoYWJsZSBhbmQgaGFzIGZ1bmN0aW9uYWwgaW1wYWN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggY2VkNDAwZjcyZDQzYS4uY2M5ZjdlMGQ0MTk0ZSAxMDA2NDRcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcbisrKyBiL21tL2h1Z2VfbWVtb3J5LmNcbkBAIC0zNTg5LDkgKzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncylcbiB7XG4gXHRpbnQgaSA9IDA7XG4gXG4tXHQvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqL1xuLVx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuLVx0XHRyZXR1cm47XG4gXHRmb3IgKDs7KSB7XG4gXHRcdHJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTtcbiBcdFx0aSArPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG5AQCAtMzc1NSw4ICszNzUyLDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuIH1cbiBcbiAvKipcbi0gKiBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgLSBzcGxpdHMgYW4gdW5tYXBwZWQgQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvcyBpblxuLSAqIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgLSBzcGxpdHMgYSBmcm96ZW4gQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvc1xuKyAqIGluIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XG4gICogICAgICAgICAgICAgYWxsb2NhdG9yIGxpa2Ugc3BsaXQgZ2VuZXJhdGVzIGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tIEBmb2xpbydzXG5AQCAtMzc2NCw3ICszNzYxLDYgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuICAqIEBzcGxpdF9hdDogaW4gYnVkZHkgYWxsb2NhdG9yIGxpa2Ugc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdFxuICAqICAgICAgICAgICAgd2lsbCBiZSBzcGxpdCB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyLlxuICAqIEB4YXM6IHhhX3N0YXRlIHBvaW50aW5nIHRvIGZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcyBhbmQgbG9ja2VkIGJ5IGNhbGxlclxuLSAqIEBtYXBwaW5nOiBAZm9saW8tXHUwMDNlbWFwcGluZ1xuICAqIEBzcGxpdF90eXBlOiBpZiB0aGUgc3BsaXQgaXMgdW5pZm9ybSBvciBub3QgKGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0KVxuICAqXG4gICpcbkBAIC0zNzk1LDExICszNzkxLDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4rc3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuLVx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4rXHRcdGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsMTEgKzM4MTEsMTEgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHQgICAgIHNwbGl0X29yZGVyLS0pIHtcbiBcdFx0aW50IG5yX25ld19mb2xpb3MgPSAxVUwgXHUwMDNjXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XG4gXG4tXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbi1cdFx0aWYgKGlzX2Fub24gXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4rXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4rXHRcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRpZiAobWFwcGluZykge1xuK1x0XHRpZiAoeGFzKSB7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiB1bmlmb3JtIHNwbGl0IGhhcyB4YXNfc3BsaXRfYWxsb2MoKSBjYWxsZWQgYmVmb3JlXG4gXHRcdFx0ICogaXJxIGlzIGRpc2FibGVkIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnksIHdoZXJlYXNcbkBAIC0zODc4LDMyICszODc1LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHQvKlxuIFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcbi1cdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXG4tXHQgKlxuLVx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXG4tXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cbitcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuK1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFpc19zd2FwY2FjaGUpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4tXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuIFx0Lypcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcbi1cdCAqXG4tXHQgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tXG4tXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXG4tXHQgKiBoZXJlLlxuK1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuK1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4rXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcbitcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4rXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgKzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdGlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4rXHQvKlxuK1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIGNhbiBvbmx5IGJlIGFcbitcdCAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0J3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXG4rXHQgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW1cbitcdCAqIGhlbmNlIHJlamVjdCBpdCBoZXJlIHVwIGZyb250IGJlZm9yZSB0b3VjaGluZyBhbnl0aGluZy5cbitcdCAqL1xuK1x0aWYgKCFpc19hbm9uIFx1MDAyNlx1MDAyNiBpc19zd2FwY2FjaGUgXHUwMDI2XHUwMDI2IGZvbGlvLVx1MDAzZW1hcHBpbmcpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4rLyoqXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKCkgLSBzcGxpdCBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW9cbisgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXG4rICogQGRvX2xydTogaWYgdHJ1ZSwgYWRkIGFmdGVyLXNwbGl0IGZvbGlvcyB0byBAbGlzdCBpZiBub24gTlVMTCwgb3RoZXJ3aXNlIHRvXG4rICogICAgICAgICAgdGhlIExSVSBsaXN0XG4rICogQGFub25fdW5tYXA6IGlmIHRydWUsIHVubWFwIEBmb2xpbyBiZWZvcmUgdGhlIHNwbGl0IGFuZCByZW1hcCBpdCBhZnRlclxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbisgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICpcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW8uIEl0IHVubWFwcyBAZm9saW8gKHVubGVzc1xuKyAqIEBhbm9uX3VubWFwIGlzIGZhbHNlKSwgZnJlZXplcyBpdHMgcmVmY291bnQsIGFuZCBwZXJmb3JtcyB0aGUgc3BsaXQsIHVwZGF0ZXNcbisgKiB0aGUgc3dhcCBjYWNoZSBlbnRyaWVzLiBTcGxpdCBmb2xpb3MgYXJlIHVuZnJvemVuIGFuZCByZW1hcHBlZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLlxuKyAqL1xuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4rXHRcdFx0XHRcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4rXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuK1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuK1x0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4rXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xuIFx0c3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1O1xuK1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xuIFx0aW50IHJldCA9IDA7XG4gXG4tXHRWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgXHUwMDI2XHUwMDI2IGVuZCk7XG4rXHQvKlxuK1x0ICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5XG4rXHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cbitcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xuK1x0ICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXNcbitcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxuK1x0ICovXG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4rXHRcdGlmICghYW5vbl92bWEpXG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4rXHR9XG4rXG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gb3V0X3VubG9jaztcbitcdH1cbitcbitcdGlmIChhbm9uX3VubWFwKVxuK1x0XHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuK1xuIFx0LypcbiBcdCAqIElmIHRoaXMgZm9saW8gY2FuIGJlIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBxdWV1ZSwgbG9jayBvdXRcbiBcdCAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXNcbiBcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxuIFx0ICogbG9jayBhbmQgbXVzdCBjbGVhbiB1cCB0aGUgTFJVIHN0YXRlIC0gdGhlIHNhbWUgZGVxdWV1ZSB3ZVxuIFx0ICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC5cbitcdCAqXG4rXHQgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCxcbitcdCAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy5cbiBcdCAqL1xuLVx0ZGVxdWV1ZV9kZWZlcnJlZCA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG9sZF9vcmRlciBcdTAwM2UgMTtcbitcdGRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgXHUwMDNlIDEgXHUwMDI2XHUwMDI2IGlzX2Fub247XG4gXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuIFx0XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4gXG5AQCAtMzk1MiwxMjggKzQwMDEsMjU2IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gXHRcdGxydSA9IGxpc3RfbHJ1X2xvY2soXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxuIFx0XHRcdFx0ICAgIGZvbGlvX25pZChmb2xpbyksIFx1MDAyNm1lbWNnKTtcbiBcdH1cbi1cdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbi1cdFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4tXHRcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKSkge1xuIFx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuLVx0XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuLVx0XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4tXHRcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbi1cdFx0XHRcdFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuLVx0XHRcdH1cbiBcdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbiBcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0fVxuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF9ub19zcGxpdDtcbitcdH1cbiBcbi1cdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4tXG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX1NITUVNX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9GSUxFX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuK1x0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbitcdFx0X19saXN0X2xydV9kZWwoXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXG4rXHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbitcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbitcdFx0XHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcbitcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbitcdFx0XHRcdCAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbiBcdFx0fVxuK1x0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHR9XG4gXG4tXHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbi1cdFx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRcdH1cbitcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4gXG4tXHRcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbi1cdFx0fVxuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzXG4rXHQgKiBpbiBzd2FwIGNhY2hlIG11c3QgYmUgdXBkYXRlZCBmaXJzdCwgc28gYSBjb25jdXJyZW50XG4rXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXG4rXHQgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLlxuK1x0ICovXG4rXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuK1x0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4rXHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0XHRpZiAoY2kpXG4rXHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0fVxuIFxuLVx0XHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXG4tXHRcdFx0XHRcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XG4rXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbitcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuLVx0XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGVcbi1cdFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4tXHRcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2Zcbi1cdFx0ICogQGZvbGlvLlxuLVx0XHQgKi9cbi1cdFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbi1cdFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XG4rXHRpZiAoZG9fbHJ1KVxuK1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRpZiAoY2kpXG4rXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuK291dF9ub19zcGxpdDpcbitcdGxvY2FsX2lycV9lbmFibGUoKTtcbitcdGlmIChhbm9uX3ZtYSkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl92bWEpIHtcbitcdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcbitcdFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcbitcdH1cbiBcbi1cdFx0XHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xuK1x0cmV0dXJuIHJldDtcbit9XG4gXG4tXHRcdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcbisvKipcbisgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpb1xuKyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXG4rICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuKyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbisgKlxuKyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzXG4rICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdFxuKyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTVxuKyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKVxuKyAqL1xuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbitcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbitcdFx0XHRcdFx0ICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuK3tcbitcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbitcdFhBX1NUQVRFKHhhcywgXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuK1x0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XG4rXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4rXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XG4rXHR1bnNpZ25lZCBpbnQgbWluX29yZGVyO1xuK1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuK1x0cGdvZmZfdCBlbmQgPSAwO1xuK1x0Z2ZwX3QgZ2ZwO1xuK1x0aW50IHJldCA9IDA7XG4gXG4tXHRcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbi1cdFx0XHRcdFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbitcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuK1x0aWYgKG5ld19vcmRlciBcdTAwM2MgbWluX29yZGVyKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbi1cdFx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0LypcbitcdCAqIFN3aXRjaCB0byBmb2xpbydzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmRcbitcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cbitcdCAqL1xuK1x0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTtcbitcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cbi1cdFx0XHQgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChjaSkge1xuLVx0XHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuK1x0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKTtcbitcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdFx0Z290byBmYWlsX2ZyZWU7XG4rXHR9XG4gXG4tXHRcdFx0LyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqL1xuLVx0XHRcdGlmICghbWFwcGluZylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuK1x0bWFwcGluZ19zZXRfdXBkYXRlKFx1MDAyNnhhcywgbWFwcGluZyk7XG4gXG4tXHRcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4tXHRcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4tXHRcdFx0XHRfX3hhX3N0b3JlKFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgbmV3X2ZvbGlvLVx1MDAzZWluZGV4LFxuLVx0XHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuK1x0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4rXHRcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXG4tXHRcdFx0Vk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTtcbi1cdFx0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuLVx0XHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpIFx1MDAyNlx1MDAyNiBucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRcdFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4tXHRcdFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxuLVx0XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxuLVx0XHRcdFx0XHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuLVx0XHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbi1cdFx0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbitcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuK1x0XHR4YXNfc3BsaXRfYWxsb2MoXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xuK1x0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbitcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbitcdFx0XHRnb3RvIGZhaWxfZnJlZTtcbiBcdFx0fVxuK1x0fVxuIFxuLVx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbi1cdFx0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuLVx0XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuLVx0XHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICovXG4tXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpO1xuK1x0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbiBcbi1cdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbitcdH1cbiBcbi1cdFx0aWYgKGNpKVxuLVx0XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0fSBlbHNlIHtcbi1cdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdC8qXG4rXHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuK1x0ICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmVcbitcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbitcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuK1x0ICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy5cbitcdCAqL1xuK1x0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4rXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbitcbitcdHVubWFwX2ZvbGlvKGZvbGlvKTtcbitcbitcdHhhc19sb2NrX2lycShcdTAwMjZ4YXMpO1xuK1xuK1x0LypcbitcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4rXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbitcdCAqL1xuK1x0aWYgKHhhc19sb2FkKFx1MDAyNnhhcykgIT0gZm9saW8pIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgKyAxKSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuK1x0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcbitcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NITUVNX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuK1x0XHRlbHNlXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuK1x0fVxuK1xuK1x0LyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovXG4rXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRyZXQgPSBfX3NwbGl0X2Zyb3plbl9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbitcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0LyogY29tcHV0ZSBuZXh0IGJlZm9yZSB0aGUgZm9saW8gY2FuIGJlIGZyZWVkIGJlbG93ICovXG4rXHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICsgMSk7XG4rXG4rXHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcbitcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4rXHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuK1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4rXHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuK1x0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4tXHRcdHJldHVybiAtRUFHQUlOO1xuK1xuK1x0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuK1x0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0XHRucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuK1x0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbitcdFx0XHRcdFx0ICAgICAgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4rXHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbitcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4rXHQvKlxuK1x0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbitcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbitcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4rXHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqL1xuK1x0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgKyAxKTtcbitcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbitmYWlsOlxuK1x0LypcbitcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbitcdCAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LlxuK1x0ICovXG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSArNDI2Myw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbiAgKlxuLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiAgKiBJdCBpcyBpbiBjaGFyZ2Ugb2YgY2hlY2tpbmcgd2hldGhlciB0aGUgc3BsaXQgaXMgc3VwcG9ydGVkIG9yIG5vdCBhbmRcbi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICs0Mjc5LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxuIFx0XHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4tXHRYQV9TVEFURSh4YXMsIFx1MDAyNmZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuIFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbi1cdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbi1cdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcbi1cdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbi1cdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbi1cdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4tXHRwZ29mZl90IGVuZCA9IDA7XG4gXHRpbnQgcmV0O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbkBAIC00MTIwLDE0MSArNDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuK1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdGlmIChuZXdfb3JkZXIgXHUwMDNlPSBvbGRfb3JkZXIpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbiBcdGlmIChyZXQpIHtcbiBcdFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wiKTtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuLVx0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuLVx0ICovXG4tXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuLVx0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4tXG4tXHRpZiAoaXNfYW5vbikge1xuLVx0XHQvKlxuLVx0XHQgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGRcbi1cdFx0ICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYVxuLVx0XHQgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzXG4tXHRcdCAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9ja1xuLVx0XHQgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZVxuLVx0XHQgKiBvcGVyYXRpb25zLlxuLVx0XHQgKi9cbi1cdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuLVx0XHRpZiAoIWFub25fdm1hKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH0gZWxzZSB7XG4tXHRcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4tXHRcdGdmcF90IGdmcDtcbi1cbi1cdFx0bWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4tXHRcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuLVx0XHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpIHtcbi1cdFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjZcbi1cdFx0XHRcdFx0XHRcdEdGUF9SRUNMQUlNX01BU0spO1xuLVxuLVx0XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuLVx0XHRcdHJldCA9IC1FQlVTWTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbi1cbi1cdFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4tXHRcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuLVx0XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4tXHRcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4tXHRcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuLVxuLVx0XHRhbm9uX3ZtYSA9IE5VTEw7XG4tXHRcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuLVx0XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuLVx0XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4tXHRcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuLVx0XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuLVx0XHQgKi9cbi1cdFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4tXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuLVx0XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcbi1cdCAqIHNwbGl0IFBNRHNcbi1cdCAqL1xuLVx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbi1cdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0dW5tYXBfZm9saW8oZm9saW8pO1xuLVxuLVx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRpZiAobWFwcGluZykge1xuLVx0XHQvKlxuLVx0XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuLVx0XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbi1cdFx0ICovXG4tXHRcdHhhc19sb2NrKFx1MDAyNnhhcyk7XG4tXHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuLVx0XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuLVx0XHRcdHJldCA9IC1FQUdBSU47XG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHR9XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbitcdGlmIChpc19hbm9uKVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuK1x0ZWxzZVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgKzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XG4gXHRcdC8qXG4gXHRcdCAqIFN1YnBhZ2VzIHdob3NlIG1hcHBpbmcgaGFzIGJlZW4gemFwcGVkIG1heSBiZSBmcmVlZFxuIFx0XHQgKiBlYXJsaWVyLCBidXQgZnJlZWluZyB0aGVtIHJlcXVpcmVzIHRha2luZyB0aGVcbi1cdFx0ICogbHJ1X2xvY2ssIHNvIHdlIGRlZmVyIHB1dF9wYWdlKCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuK1x0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuIFx0XHQgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLlxuIFx0XHQgKi9cbi1cdFx0ZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pO1xuK1x0XHRpZiAoaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiAhZm9saW9fbWFwcGVkKG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzExLDI5ICs0MzYwLDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKVxuICAqXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcbi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbisgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgZmFsc2UsXG4rXHRcdFx0XHRcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTAgKzQzOTIsOSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXG4gICpcbi0gKiA0KSBAbmV3X29yZGVyIFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxuLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxuLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4rICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yXG4rICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcbisgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG5AQCAtNDM4NCw3ICs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxuICAqL1xuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0zODksOCArMzg5LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xuIFx0XHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVx1MDAzZXN3YXApO1xuIFx0XHRjaV9lbmQgPSBjaV9vZmYgKyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmKysgXHUwMDNjIGNpX2VuZClcbitcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbitcdFx0fSB3aGlsZSAoKytjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDI6MzkuNzc1NTg0OTc4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODM3NzUzMTA0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLZXJuZWwgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQncyB0b3VjaGVkIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AuIEl0IGxvb2tzIGxpa2UgdGhleSdyZSByZXdvcmtpbmcgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIFNwZWNpZmljYWxseSwgaXQncyBhYm91dCBob3cgd2UgaGFuZGxlIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBUaGV5J3ZlIHJlbmFtZWQgYF9fc3BsaXRfdW5tYXBwZWRfZm9saW9gIHRvIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AsIHdoaWNoIGlzIGEgZ29vZCBpbmRpY2F0b3Igb2Ygc29tZSB1bmRlcmx5aW5nIGNoYW5nZSBpbiBzZW1hbnRpY3MsIGFuZCB0aGV5J3ZlIGFkZGVkIG5ldyBoZWxwZXJzIGxpa2UgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAuIGBfX2ZvbGlvX3NwbGl0YCBoYXMgYWxzbyBiZWVuIHJlZmFjdG9yZWQgdG8gdXNlIHRoZSBuZXcgaGVscGVycy4gVGhlIHBhdGNoIGFsc28gbW9kaWZpZXMgaG93IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBoYW5kbGVzIHN3YXBjYWNoZSBmb2xpb3MuIEFuZCwgaW1wb3J0YW50bHksIHRoZXJlJ3MgYSBjaGFuZ2UgaW4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCB0b28uXG5cbk15IGd1dCBzYXlzIHRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBhIGNsb3NlciBsb29rLCBlc3BlY2lhbGx5IGZvciBmdXp6aW5nLiBUaGlzIHRvdWNoZXMgKmNvcmUqIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUg4oCTIFRIUCwgZm9saW8gc3BsaXR0aW5nLCBhbmQgc3dhcC4gVGhlc2UgYXJlIHByaW1lIHRhcmdldHMgZm9yIGV4cG9zaW5nIHN1YnRsZSBtZW1vcnkgY29ycnVwdGlvbiBpc3N1ZXMuIEl0J3MgaGlnaC12YWx1ZSwgcG90ZW50aWFsbHkgaGlnaC1yaXNrLCBzbyBsZXQncyBkaWcgZGVlcGVyLlxuXG5TbywgbGV0J3MgaWRlbnRpZnkgdGhlIGtleSBzeW1ib2xzIGluIHRoaXMgcGF0Y2guIEkndmUgZ290OiBgcmVtYXBfcGFnZWAsIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnRgLCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCwgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlYCwgYF9fZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLlxuXG5Ob3csIHRoZSBpbXBvcnRhbnQgb25lcyBmb3IgYSBmdXp6aW5nIHBlcnNwZWN0aXZlIGFyZSB0aG9zZSB0aGF0IGFyZSBnbG9iYWxseSBhY2Nlc3NpYmxlIG9yIGV4dGVybmFsbHkgdmlzaWJsZSBhbmQgbm90IGlubGluZWQ6IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLCBhbmQgbWF5YmUgZXZlbiBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBJdCB3b3VsZCBiZSB3aXNlIHRvIHNlYXJjaCBmb3IgdXNhZ2VzIG9mIHRoZXNlIHRvIHVuZGVyc3RhbmQgcmVhY2hhYmlsaXR5IGFuZCBjcmVhdGUgdGVzdHMuXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHNlYXJjaGluZyBhbmQgdW5kZXJzdGFuZCBob3cgdGhlc2UgZml0IGludG8gdGhlIGxhcmdlciBtZW1vcnkgbWFuYWdlbWVudCBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjg3OSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ5MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjQ4LjE1MzExNzkyOVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTA0MTY4ODEzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl4oaW50fHZvaWR8Ym9vbCkgLipmb2xpb19jaGVja19zcGxpdHRhYmxlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwNz1pbnQgc3BsaXRfZm9saW9fdG9fbGlzdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDg6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDktXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zNzk0PXN0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3NC0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjM4NzU6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5tbS9odWdlX21lbW9yeS5jLTM4NzYtXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjUxLjA1NzI5MjI4MloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUzODMxODg4MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSBtZW50YWwgbWFwcGluZyBwcm9jZXNzLCBhcyBJIHVuZGVyc3RhbmQgaXQ6XG5cbioqTWFwcGluZyBLZXkgRnVuY3Rpb25zIHRvIE1lbW9yeSBNYW5hZ2VtZW50IFN0cnVjdHVyZXMqKlxuXG5Pa2F5LCBzbyBJJ20gZHJpbGxpbmcgZG93biBpbnRvIHNvbWUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuIEknbSBub3RpbmcgdGhhdCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgYXJlIGFsbCBjbHVzdGVyZWQgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBUaGF0IHBsYWNlbWVudCBpcyBleGFjdGx5IHdoYXQgSSB3b3VsZCBleHBlY3QsIHRoZXkgYXJlIGFsbCB3b3JraW5nIG9uIG9wZXJhdGlvbnMgcmVsYXRlZCB0byBzcGxpdHRpbmcgYW5kIG1hbmFnaW5nIGh1Z2UgcGFnZXMsIHNvIGNsZWFybHkgdGhleSBhcmUgb3JnYW5pemVkIGxvZ2ljYWxseSBpbiB0aGUgaHVnZSBtZW1vcnkgbWFuYWdlbWVudCBhcmVhLiBUaGUgY29tbW9uIGRpcmVjdG9yeSBtYWtlcyBwZXJmZWN0IHNlbnNlLlxuXG5UaGVuIHRoZXJlJ3MgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhhdCBvbmUncyBpbiBgbW0vc3dhcF9zdGF0ZS5jYC4gSG1tLCByaWdodCwgdGhhdCdzIHJlbGF0ZWQgdG8gc3dhcHBpbmcsIHdoaWNoIG1ha2VzIHRvdGFsIHNlbnNlLiBJJ20gbWVudGFsbHkgZmlsaW5nIHRoaXMgdW5kZXIgXCJzd2FwIGNhY2hlIGludGVyYWN0aW9uLlwiIEl0IHNlZW1zIHRvIGJlIGEgZnVuY3Rpb24gZGVhbGluZyB3aXRoIHJlcGxhY2luZyBhIGZvbGlvIGluIHRoZSBzd2FwIGNhY2hlLCB3aGljaCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBodWdlIHBhZ2Ugc3BsaXR0aW5nL21hbmFnZW1lbnQsIGhlbmNlIHRoZSBkaWZmZXJlbnQgZmlsZS4gR29vZCBvcmdhbml6YXRpb24gdGhlcmUsIHRvby4gSSBhcHByZWNpYXRlIHRoZSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLCB0aGUgbW9kdWxlIG9yZ2FuaXphdGlvbiBpcyBzYW5lIGFuZCBsb2dpY2FsLiBJIGNhbiBxdWlja2x5IGRldGVybWluZSB0aGUgY29udGV4dCBmb3IgYSBnaXZlbiBmdW5jdGlvbiBieSBrbm93aW5nIGl0cyBsb2NhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQxMzYsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMjo1Ni40NDA0ODM3NDFaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzAwNzcxOTkwMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKGludHx2b2lkfGJvb2wpIC4qZm9saW9fc3BsaXRfdW5tYXBwZWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDU6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNi11bnNpZ25lZCBpbnQgbWluX29yZGVyX2Zvcl9zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDI3OD1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM2Ny0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzNjg6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxubW0vaHVnZV9tZW1vcnkuYy00MzY5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDI6NTkuNDQ4MjEwNDU0WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjI3NTU5MTQyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCoqXG5cbk9rYXksIHRpbWUgdG8gZGl2ZSBpbnRvIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gVGhpcyBmdW5jdGlvbiBpcyBsaWtlbHkgYSBjcml0aWNhbCBwaWVjZSBvZiBtZW1vcnkgbWFuYWdlbWVudCwgcHJvYmFibHkgd2l0aGluIGEgdmlydHVhbCBtZW1vcnkgc3lzdGVtLiBHaXZlbiB0aGUgbmFtZSwgSSdtIGd1ZXNzaW5nIGl0IGhhbmRsZXMgdGhlIHByb2Nlc3Mgb2YgYnJlYWtpbmcgZG93biBhIGxhcmdlLCBcImh1Z2VcIiBwYWdlIGludG8gc21hbGxlciwgbW9yZSBtYW5hZ2VhYmxlIHVuaXRzLCBhbmQgdGhlbiwgY3J1Y2lhbGx5LCBwbGFjaW5nIHRob3NlIHNtYWxsZXIgcGFnZXMgaW50byBzb21lIGtpbmQgb2Ygb3JkZXJlZCBzdHJ1Y3R1cmUg4oCTIHByb2JhYmx5IGEgbGlua2VkIGxpc3QsIHF1ZXVlLCBvciBwZXJoYXBzIGV2ZW4gYSB0cmVlIGlmIHRoZSBvcmRlciBpcyBjb21wbGV4LlxuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gbG9vayBmb3IgaG93IHRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzICp3aHkqIGl0IG5lZWRzIHRvIHNwbGl0IHRoZSBwYWdlLiBJcyBpdCBkdWUgdG8gZnJhZ21lbnRhdGlvbiwgbWVtb3J5IHByZXNzdXJlLCBhIHNwZWNpZmljIGFsbG9jYXRpb24gcmVxdWVzdCB0aGF0IGRvZXNuJ3QgYWxpZ24gd2l0aCBhIGh1Z2UgcGFnZSBib3VuZGFyeSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFRoZSAndG9fb3JkZXInIHBhcnQgc3VnZ2VzdHMgdGhhdCB0aGUgc3BsaXQgaXNuJ3QganVzdCBhIGJhc2ljIGRlY29tcG9zaXRpb247IHRoZXJlJ3MgYW4gb3JkZXJpbmcgcmVxdWlyZW1lbnQgaW52b2x2ZWQuIFRoYXQgbWFrZXMgbWUgd29uZGVyIHdoYXQgdGhlIG9yZGVyaW5nIGNyaXRlcmlhIGFyZSDigJMgYXJlIHdlIHRhbGtpbmcgYWJvdXQgcGh5c2ljYWwgYWRkcmVzcywgdmlydHVhbCBhZGRyZXNzLCBvciBzb21ldGhpbmcgbW9yZSBudWFuY2VkIGxpa2UgdXNhZ2UgcGF0dGVybnMgb3IgYWNjZXNzIGZyZXF1ZW5jeT9cblxuSSBuZWVkIHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgb3JkZXJpbmcuIFdoYXQga2luZCBvZiBvdmVyaGVhZCBpcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgb3JkZXJlZCBzdHJ1Y3R1cmU/IFdoYXQgYWxnb3JpdGhtcyBhcmUgYmVpbmcgdXNlZCB0byBtYWludGFpbiB0aGlzIG9yZGVyIGVmZmljaWVudGx5PyBBbmQsIG9mIGNvdXJzZSwgd2hhdCBhcmUgdGhlIGltcGxpY2F0aW9ucyBvbiBwZXJmb3JtYW5jZT8gQXJlIHdlIG9wdGltaXppbmcgZm9yIGFsbG9jYXRpb24gc3BlZWQsIGRlYWxsb2NhdGlvbiBzcGVlZCwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IEhvdyBkb2VzIHRoZSBjaG9zZW4gZGF0YSBzdHJ1Y3R1cmUgc2NhbGUgd2l0aCB0aGUgbnVtYmVyIG9mIHNwbGl0IHBhZ2VzPyBUaGlzIGFsc28gYmVncyB0aGUgcXVlc3Rpb24gb2YgaG93IHRoZSBodWdlIHBhZ2UgaXRzZWxmIGlzIG1hbmFnZWQgKmJlZm9yZSogYW5kICphZnRlciogdGhlIHNwbGl0IOKAkyBkbyB3ZSBuZWVkIHRvIHRyYWNrIGl0IGFzIGEgcGFydGlhbGx5LXVzZWQgZW50aXR5PyBJcyB0aGVyZSBhbnkgbWVjaGFuaXNtIGZvciBcInJlLW1lcmdpbmdcIiBzbWFsbGVyIHBhZ2VzIGJhY2sgaW50byBhIGh1Z2UgcGFnZSBsYXRlciBvbj8gVGhpcyBpcyBjcml0aWNhbCBmb3IgYXZvaWRpbmcgZnVydGhlciBmcmFnbWVudGF0aW9uLiBJIGFsc28gd2FudCB0byBjaGVjayBmb3IgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgaGVyZS4gVGhlIGZ1bmN0aW9uIGxpa2VseSB3aWxsIG9wZXJhdGUgb24gc2hhcmVkIG1lbW9yeSB3aGljaCBjb3VsZCByZXN1bHQgaW4gYSByYWNlIGNvbmRpdGlvbi5cblxuSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgbGFyZ2VyIGNvZGUgY29udGV4dCBpcy4gV2hhdCBwcm9jZXNzIG9yIHN1YnN5c3RlbSBjYWxscyB0aGlzIGZ1bmN0aW9uPyBUaGUgY29udGV4dCB3aWxsIHNoZWQgbGlnaHQgb24gd2hhdCB0aGUgZGVzaWduIGdvYWxzIGFuZCB0cmFkZS1vZmZzIGFyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ3NTYsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzowNS43MjM4MDQ3MDZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjczNzE3NzE5NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKGludHx2b2lkfGJvb2wpIC4qX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwMi1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVxcdFxcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00MzY4PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDI0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQyNTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQ0MjYtXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjA4LjQ2MDk4ODMzM1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMzI2MzU1NzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEaXZpbmcgaW50byBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gKipcblxuQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUgZ3V0cyBvZiB0aGUgc3dhcCBjYWNoZSByZXBsYWNlbWVudCBsb2dpYy4gTGV0J3Mgc2VlIGhvdyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGlzIGhhbmRsaW5nIHRoaW5ncy4gSSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGV4YWN0IG1lY2hhbmljcyBvZiB0aGlzIGZ1bmN0aW9uIGluIHBhcnRpY3VsYXIuIFdoYXQncyBpdCBkb2luZyB3aGVuIGEgZm9saW8gbmVlZHMgdG8gYmUgc3dhcHBlZCBvdXQ/IEhvdydzIGl0IG1ha2luZyByZXBsYWNlbWVudCBkZWNpc2lvbnM/IFdlIGtub3cgaG93IGNyaXRpY2FsIHRoaXMgaXMgZm9yIHBlcmZvcm1hbmNlLCBzbyBJJ20gaG9waW5nIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiBpdHMgaW1wYWN0IGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MuIE5vIHRpbWUgdG8gd2FzdGUsIGxldCdzIGxvb2sgdW5kZXIgdGhlIGhvb2QhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1NDkwLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MTEuNzkzNjI2OTY3WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzY4NDEzMTcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl4oaW50fHZvaWR8Ym9vbCkgLipfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwLmg9MzIxPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXAuaC0zMjItXFx0XFx0XFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LCB2b2lkICpzaGFkb3cpO1xcbm1tL3N3YXAuaDozMjM6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXAuaC0zMjQtXFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KTtcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYz0zMzY9dm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vc3dhcF9zdGF0ZS5jLTM2MS0gKi9cXG5tbS9zd2FwX3N0YXRlLmM6MzYyOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwX3N0YXRlLmMtMzYzLVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MTQuNTYyMDU1MDg4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NTA4OTU0NTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQ2hlY2tpbmcgYSBQb3RlbnRpYWwgQm90dGxlbmVjayoqXG5cbk9rYXksIHNvIEknbSBqdXN0IHF1aWNrbHkgcnVubmluZyB0aHJvdWdoIHRoZSBtZW50YWwgY2hlY2tsaXN0IGhlcmUuIEknbSBmb2N1c2luZyBpbiBvbiB0aGUgZGF0YSBwcm9jZXNzaW5nIHNpZGUgb2YgdGhpbmdzLCBzcGVjaWZpY2FsbHkgb24gdGhpcyBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGZ1bmN0aW9uLiBJdCdzIGEgcHJpbWUgc3VzcGVjdCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzIGdpdmVuIHRoZSBzY2FsZSBvZiBkYXRhIHdlJ3JlIGxpa2VseSBkZWFsaW5nIHdpdGguIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGltcGxlbWVudGF0aW9uIGlzIGVmZmljaWVudCwgcGFydGljdWxhcmx5IGNvbmNlcm5pbmcgbWVtb3J5IGFsbG9jYXRpb24sIGl0ZXJhdGlvbiwgYW5kIGFueSBwb3RlbnRpYWwgaW5lZmZpY2llbmNpZXMgd2l0aGluIHNvcnRpbmcgb3IgaW5kZXhpbmcuIEV2ZW4gdGhvdWdoIEkgaGF2ZSBhIHByZXR0eSBzdHJvbmcgdW5kZXJzdGFuZGluZyBvZiB0aGUgc3lzdGVtLCBpdCdzIHdpc2UgdG8gcmV2aXNpdCBhbnkgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIGEgbGFyZ2UgaW5wdXQgc3BhY2UganVzdCB0byBiZSBzdXJlIHRoZXJlIGFyZW4ndCBhbnkgc3VidGxlLCBlYXNpbHkgb3Zlcmxvb2tlZCwgYm90dGxlbmVja3MuIFRpbWUgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1OTA4LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MTguMDEyOTUzOTU0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzUwNDY4OTQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl4oaW50fHZvaWR8Ym9vbCkgLipzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwMi1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVxcdFxcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00MzY4PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDI0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQyNTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQ0MjYtXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjIwLjc2MzQyODUzMloiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNTcxNzYyNTQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgc3VtbWFyeSwgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXMgcmVxdWVzdGVkOlxuXG4qKkRlY29uc3RydWN0aW5nIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAqKlxuXG5SaWdodCwgbGV0IG1lIHNlZS4uLmBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIFRoYXQncyBhIG1vdXRoZnVsLCBhbmQgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uLCBpdCdzIGFsbW9zdCBjZXJ0YWlubHkgYW4gaW5saW5lIGZ1bmN0aW9uIG9yIGEgbWFjcm8sIGRlc2lnbmVkIGZvciBlZmZpY2llbmN5LiBHaXZlbiB0aGUgY29udGV4dCwgaXQncyBsaWtlbHkgZGVhbGluZyB3aXRoIHNvbWUgYXNwZWN0IG9mIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LCBwcm9iYWJseSByZWxhdGVkIHRvIGZyYWdtZW50YXRpb24gb3IgY29hbGVzY2luZy4gT2theSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBiZXR0ZXIuIE15IG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byB0aGUgZGVmaW5pdGlvbi4gVGhlIGtlcm5lbCdzIG5hbWluZyBjb252ZW50aW9ucyBhcmUgdXN1YWxseSBwcmV0dHkgY29uc2lzdGVudCwgc28gdGhlIGhlYWRlciBmaWxlIGRlZmluaW5nIGl0IHNob3VsZCBiZSBpbiB0aGUgb2J2aW91cyBwbGFjZS4gTGV0J3Mgc3RhcnQgd2l0aCBgaW5jbHVkZS9saW51eC9odWdlX21tLmhgLiBUaGF0J3Mgd2hlcmUgSSBleHBlY3QgdG8gZmluZCB0aGUgbWFnaWMgYmVoaW5kIHRoaXMgZnVuY3Rpb24uIFRpbWUgdG8gY2hlY2sgaXQgb3V0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjM3MSwiT3V0cHV0VG9rZW5zIjo0MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjI0LjMzNTE5MzYyOVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTY5Mjg3MDYxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTM5OD1lbnVtIHNwbGl0X3R5cGUge1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDAyLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwMzppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcik7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MTA9aW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsIHN0cnVjdCBwYWdlICpwYWdlLFxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDEyLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMzpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTQtXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTUte1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxNjpcXHRyZXR1cm4gX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBsaXN0LCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNy19XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDE4PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTkte1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQyMDpcXHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjEtfVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDIzPXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjQte1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQyNTpcXHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgMCk7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDI2LX1cXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY0NT1zdGF0aWMgaW5saW5lIGludFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjY0NjpzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NDctXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTgyNj1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTgyNy17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6ODI4OlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIE5VTEwsIG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI5LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MjUuMzA0NDg3NDNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDU1MzI2MDM1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHJldmlld2luZyB0aGlzIGNvZGU6XG5cbioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBTcGxpdHRpbmcgRnVuY3Rpb25zKipcblxuQWxyaWdodCwgc28gYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGRlZmluaXRlbHkgdGhlIGtleSBub24taW5saW5lZCBmdW5jdGlvbiBpbnZvbHZlZCBpbiB0aGlzIGh1Z2UgcGFnZSBzcGxpdHRpbmcgcHJvY2Vzcy4gVGhhdCdzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTm93LCBsZXQncyBxdWlja2x5IHNlZSBpZiB0aGVyZSBhcmUgb3RoZXIgcGxheWVycyBpbiB0aGlzIHBhcnRpY3VsYXIgZG9tYWluLiBBaCwgeWVzLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIC0gYWxsIG9mIHRoZW0gd2FycmFudCBhIGNsb3NlciBsb29rIHRvIHVuZGVyc3RhbmQgdGhlaXIgaW50ZXJhY3Rpb25zIHdpdGggdGhlIG1haW4gc3BsaXQgZnVuY3Rpb24sIGFuZCBob3cgZWFjaCBpcyBpbnZvbHZlZCBpbiB0aGUgb3ZlcmFsbCBodWdlIHBhZ2UgbWFuYWdlbWVudC5cblxuTmV4dCwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGNvbmRpdGlvbmFsIGxvZ2ljIGZvciBodWdlIHBhZ2Ugc3BsaXR0aW5nOyBzcGVjaWZpY2FsbHksIEkgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBmZWF0dXJlIGlzLCBpbmRlZWQsIGFjdGl2ZSBhbmQgcmVxdWlyZWQgaW4gdGhpcyBjb2RlIHBhdGguIFRoYXQgd2lsbCBiZSBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyAqd2h5KiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTczNTAsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzoyOS44NTc3NTAzNloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyNDc2NzYwMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04MzI9Y29uZmlnIE1NX0lEXFxuLS1cXG5tbS9LY29uZmlnLTgzNC1cXG5tbS9LY29uZmlnOjgzNTptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vS2NvbmZpZy04MzYtXFx0Ym9vbCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODUzPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04NTgtXFxubW0vS2NvbmZpZzo4NTk6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xcbm1tL0tjb25maWctODYwLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctODY1LVxcbm1tL0tjb25maWc6ODY2OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXFxubW0vS2NvbmZpZy04NjctXFx0XFx0Ym9vbCBcXFwibWFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODc0LVxcbm1tL0tjb25maWc6ODc1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxcbm1tL0tjb25maWctODc2LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZz04ODI9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg5MS1cXG5tbS9LY29uZmlnOjg5MjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxcbm1tL0tjb25maWctODkzLVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDEtXFxubW0vS2NvbmZpZzo5MDI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05MDMtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDktXFxubW0vS2NvbmZpZzo5MTA6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTkxMS1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTE3LVxcbm1tL0tjb25maWc6OTE4OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTE5LVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWc9OTI3PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy05MzYtXFxubW0vS2NvbmZpZzo5Mzc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTkzOC1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTQ1LVxcbm1tL0tjb25maWc6OTQ2OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTQ3LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTUzLVxcbm1tL0tjb25maWc6OTU0OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05NTUtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk2MS1cXG5tbS9LY29uZmlnOjk2MjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTk2My1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjMxLjM4MjUyNDkxM1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDQ4MTEwMDYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgSHVnZSBQYWdlIERlcGVuZGVuY2llcyoqXG5cbk9rYXksIHNvIEknbSBkZWFsaW5nIHdpdGggYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBpbW1lZGlhdGVseSwgbXkgYnJhaW4gZmxhZ3MgdGhhdCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGRlZmluaXRlbHkgYSByZXF1aXJlbWVudC4gTWFrZXMgc2Vuc2UsIG9idmlvdXNseS4gTm93LCB0aGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gZGl2ZSBpbnRvIGBtbS9NYWtlZmlsZWAuIFRoYXQncyB3aGVyZSBJIG5lZWQgdG8gY29uZmlybSB0aGUgYnVpbGQgZGVwZW5kZW5jaWVzIGFuZCBlbnN1cmUgZXZlcnl0aGluZyBpcyBsaW5raW5nIGNvcnJlY3RseSBhbmQgYXMgZXhwZWN0ZWQuIEl0J3MgdGhlIHN0YW5kYXJkLCBlZmZpY2llbnQgYXBwcm9hY2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4Mzc5LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MzUuNDMwNjM4NzQ1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDA3MjY5MjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaHVnZV9tZW1vcnkub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzozNS43NzEzNzc0MzdaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTU0NDAxOTgxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgTWFuYWdlbWVudCBEZXBlbmRlbmNpZXMqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgZGlzY3Vzc2lvbiBoYXMgY2xlYXJseSBwb2ludGVkIG91dCB0aGF0IHdlIGFic29sdXRlbHkgbmVlZCB0byBpbmNsdWRlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAg4oCTIG5vIHF1ZXN0aW9uIGFib3V0IHRoYXQuIEl0J3MgdGhlIGx5bmNocGluLiBCdXQgbm93IEknbSBzdGFydGluZyB0byB0aGluayBhYm91dCBkZXBlbmRlbmNpZXMgZnVydGhlciBkb3duIHRoZSBsaW5lLiBXaGF0J3MgdGhlIGltcGFjdCBvZiB0aGlzIGNoYW5nZSBvbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUga2VybmVsPyBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjb25zaWRlciBgbW0vc3dhcF9zdGF0ZS5jYC4gSG93IHdpbGwgdGhpcyBuZXcgdHJhbnNwYXJlbnQgaHVnZXBhZ2UgaW1wbGVtZW50YXRpb24gaW50ZXJhY3Qgd2l0aCB0aGUgc3dhcCBtZWNoYW5pc21zPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBjb25mbGljdHMsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLCBvciByYWNlIGNvbmRpdGlvbnMgSSBuZWVkIHRvIGFudGljaXBhdGU/IFRoaXMgaXMgYSBrZXkgYXJlYSB0byBleHBsb3JlIGZ1cnRoZXIsIHNvIEknbSBmaWxpbmcgdGhhdCBmb3IgZGVlcGVyIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NjM3LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6NDEuMzE1NDAwMTJaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4ODI2MDQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN3YXBfc3RhdGUub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT03Nj1lbmRpZlxcbm1tL01ha2VmaWxlLTc3LVxcbm1tL01ha2VmaWxlOjc4Om9iai0kKENPTkZJR19TV0FQKVxcdCs9IHBhZ2VfaW8ubyBzd2FwX3N0YXRlLm8gc3dhcGZpbGUub1xcbm1tL01ha2VmaWxlLTc5LW9iai0kKENPTkZJR19aU1dBUClcXHQrPSB6c3dhcC5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjQxLjM2NDIzMTk0NVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MzQyODA1MTczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUG90ZW50aWFsIEltcGFjdCBvZiBhIFN3YXAgTW9kaWZpY2F0aW9uKipcblxuT2theSwgc28gaXQgbG9va3MgbGlrZSB0aGlzIHBhdGNoIG5lY2Vzc2l0YXRlcyBzb21lIGZvcm0gb2YgYFNXQVBgIGhhbmRsaW5nLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyBhbHdheXMgdG8gbG9vayBmb3IgY29udGV4dCwgc28gbGV0J3Mgc2VlIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbnMgbWlnaHQgYmUgaW1wYWN0ZWQuIExvb2tpbmcgdGhyb3VnaCB0aGUgcHJvcG9zZWQgY2hhbmdlcywgSSBzZWUgdGhhdCB0aGUgcGF0Y2ggdG91Y2hlcyBzZXZlcmFsIGtleSBmdW5jdGlvbnMgdGhhdCBhcmUgYWxsIHZlcnkgaW50ZXJlc3RpbmcgdG8gbWU6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhleSBhbGwgc2VlbSBoaWdobHkgcmVsZXZhbnQuXG5cbk15IGltbWVkaWF0ZSBmb2N1cywgZ2l2ZW4gbXkgZXhwZXJ0aXNlLCBpcyB0byBjYXJlZnVsbHkgZXhhbWluZSB0aG9zZSBzcGVjaWZpYyBzeW1ib2xzLiBJIG5lZWQgdG8gY29uZmlybSB0aGVzZSBmdW5jdGlvbnMgYXJlIHByZXNlbnQgaW4gdGhlIGtlcm5lbCBhbmQsIGNyaXRpY2FsbHksIGFyZW4ndCBkZWNsYXJlZCBhcyBzdGF0aWMuIFRoaXMgY29uZmlybXMgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGV4dGVybmFsbHkgYXZhaWxhYmxlIGFuZCBjYW4gYmUgcGF0Y2hlZC4gSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGRlZmluaXRpb25zIGFuZCB1c2FnZSBvZiB0aG9zZSBmdW5jdGlvbnMsIHdoYXQgZmlsZXMgdXNlIHRoZW0sIGFuZCB3aGF0IHRoZSBlZmZlY3Qgd2lsbCBiZSBvZiBtb2RpZnlpbmcgdGhlbS4gRnJvbSB0aGVyZSBJIGNhbiBkZXRlcm1pbmUgdGhlIGltcGFjdCBvZiB0aGVzZSBjaGFuZ2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODkzNywiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzo0Ni43MDcwNDIyNzhaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NTQwODY0NDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXihpbnR8dm9pZHxib29sKSAuKl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDM2OD1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQyNC0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQ0MjU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxubW0vaHVnZV9tZW1vcnkuYy00NDI2LVxcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzo0OS40NjExMzQyMTdaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzc3NTI2NzM1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEb3VibGUtQ2hlY2tpbmcgdGhlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgRnVuY3Rpb25hbGl0eSoqXG5cbk9rYXksIHNvIHRoZSBjb25jZXB0IG9mIHVubWFwcGVkIGZvbGlvc+KAlHRob3NlIHRoYXQgZG9uJ3QgbmVhdGx5IGFsaWduIHdpdGggb3VyIHN0YW5kYXJkIGluZGV4aW5n4oCUaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgd2UgbmVlZCB0byBhY2NvdW50IGZvci4gTm8gZGViYXRlIHRoZXJlLCB0aGV5ICpkbyogZXhpc3QsIGFuZCB0aGUgc3lzdGVtIG5lZWRzIHRvIGhhbmRsZSB0aGVtLiBUaGUga2V5IG5vdyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgbG9naWMgd2l0aGluIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgcm9idXN0LiBJcyBpdCBhY2NvdW50aW5nIGZvciBhbGwgZWRnZSBjYXNlcz8gQXJlIHRoZXJlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcz8gQXJlIHRoZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgdW5tYXBwZWQgZGF0YSBzdGlsbCB2YWxpZCBnaXZlbiByZWNlbnQgY2hhbmdlcyB0byB0aGUgc291cmNlIG1hdGVyaWFsPyBCZWZvcmUgSSBtb3ZlIG9uLCBJIHdhbnQgdG8gY29uZmlybSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgc3RpbGwgcGVyZm9ybWluZyBhcyBpbnRlbmRlZC4gTGV0J3Mgc2VlIGlmIHRoZSBoYW5kbGluZyBvZiBmb2xpbyBzcGxpdCBpcyBnb29kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTU1MywiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjUzLjIzNjQwNTcxM1oiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjcyNzA5Nzg2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKGludHx2b2lkfGJvb2wpIC4qZm9saW9fc3BsaXRfdW5tYXBwZWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDU6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNi11bnNpZ25lZCBpbnQgbWluX29yZGVyX2Zvcl9zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDI3OD1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM2Ny0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzNjg6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxubW0vaHVnZV9tZW1vcnkuYy00MzY5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6NTUuOTYzNTExMzg5WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU5MzU4ODk5NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEb3VibGUtQ2hlY2tpbmcgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgKipcblxuQWxyaWdodCwgdGltZSB0byByZXZpc2l0IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYC4gSSdtIGdvaW5nIGJhY2sgb3ZlciB0aGlzIGJlY2F1c2UsIGxldCdzIGJlIGhvbmVzdCwgZXZlbiBhZnRlciB0aGUgaW5pdGlhbCByZXZpZXcsIHRoZXJlJ3MgYWx3YXlzIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgc29tZXRoaW5nIGNvdWxkIGhhdmUgYmVlbiBvdmVybG9va2VkLCBlc3BlY2lhbGx5IHdpdGggYSBmdW5jdGlvbiBhcyBjcml0aWNhbCBhcyB0aGlzLiBNeSBjb25jZXJuIGlzLCBpcyBpdCB0cnVseSByb2J1c3QgZW5vdWdoIHRvIGhhbmRsZSB0aGUgZWRnZSBjYXNlcz8gRG9lcyBpdCBjb3ZlciBhbGwgdGhlIHBlcm11dGF0aW9ucyBvZiBkYXRhIHN0cnVjdHVyZXMgYW5kIHN0YXRlcyB3ZSdyZSBsaWtlbHkgdG8gZW5jb3VudGVyIGluIGEgcmVhbC13b3JsZCBzY2VuYXJpbz9cblxuSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJ3QgbWFkZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGRhdGEgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSB2YWxpZGF0ZWQgd2l0aGluIHRoZSBmdW5jdGlvbi4gVGhpbmtpbmcgYWJvdXQgaXQsIEkgc2hvdWxkIHJ1biB0aHJvdWdoIGEgbWVudGFsIGNoZWNrbGlzdCBvZiBwb3NzaWJsZSBmYWlsdXJlIHBvaW50czogbnVsbCB2YWx1ZXMsIGVtcHR5IHN0cnVjdHVyZXMsIGV4Y2VwdGlvbmFsbHkgbGFyZ2UgZGF0YXNldHMsIGFuZCBldmVuIGNvbmN1cnJlbnQgYWNjZXNzIGlzc3VlcywgaWYgYXBwbGljYWJsZS4gSSBhbHNvIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2ljIGFsaWducyBwZXJmZWN0bHkgd2l0aCB0aGUgdW5kZXJseWluZyByZXF1aXJlbWVudHMgb2YgdGhlIHNwbGl0dGluZyBwcm9jZXNzLCBzcGVjaWZpY2FsbHkgYWRkcmVzc2luZyBob3cgcGFydGlhbCBzcGxpdHMgc2hvdWxkIGJlIGV2YWx1YXRlZC5cblxuSSBhbSBnb2luZyB0byBjaGVjayB0aGUgdW5pdCB0ZXN0cywgb2J2aW91c2x5LCBidXQgc29tZXRpbWVzIHRob3NlIHRlc3RzIGFyZSB3cml0dGVuIHRvIGNvdmVyIHRoZSBvYnZpb3VzIGNhc2VzIGFuZCB0aGVyZSBhcmUgc3RpbGwgaXNzdWVzIGx1cmtpbmcgaW4gdGhlIGNvZGUuIEkgYW0gZ29pbmcgdG8gaGF2ZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgcmlnb3JvdXMuIEFuZCBJIG1heSBuZWVkIHRvIHdyaXRlIHNvbWUgbmV3IG9uZXMgdG8gZW5zdXJlIGFsbCBzY2VuYXJpb3MgYXJlIGNvdmVyZWQsIHBvdGVudGlhbGx5IGdlbmVyYXRpbmcgc29tZSByYW5kb20gZGF0YSBmb3IgYSBkZWVwZXIgZGl2ZS4gVGhlIGdvYWwgaXMgdG8gYmUgYWJzb2x1dGVseSBjb25maWRlbnQgdGhhdCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAgd29uJ3QgaW50cm9kdWNlIGFueSB1bmV4cGVjdGVkIGJlaGF2aW9yIGRvd24gdGhlIGxpbmUsIHBvdGVudGlhbGx5IGNhdXNpbmcgZGF0YSBjb3JydXB0aW9uIG9yLCBldmVuIHdvcnNlLCBzeXN0ZW0gaW5zdGFiaWxpdHkuIEkgYW0gZ29pbmcgdG8gYmUgZXh0cmEgdmlnaWxhbnQgYW5kIHRoaW5rIHRocm91Z2ggdGhlIGNvZGUgYXMgdGhvdWdoIEkgYW0gZ29pbmcgdG8gYmUgdGhlIHBlcnNvbiB3aG8gd2lsbCBiZSBkZWJ1Z2dpbmcgaXQgYXQgMyBhbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAwMDksIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowNDowMS44OTk0MDQzMjdaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NDYzMzc5MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXihpbnR8dm9pZHxib29sKSAuKmZvbGlvX2NoZWNrX3NwbGl0dGFibGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDA3PWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwODppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwOS1cXHRcXHRcXHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTM3OTQ9c3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zODc0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg3NTppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3Ni1cXHRcXHRcXHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MDQuNjQ1NzQ5NzA1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY2ODUxMzYxODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEb3VibGUtQ2hlY2tpbmcgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gcmV2aXNpdCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2ljIHdpdGhpbiBpdCBpcyBzdGlsbCBzb3VuZC4gSXQncyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBhbmQgYSBzdWJ0bGUgYnVnIGhlcmUgY291bGQgaGF2ZSBjYXNjYWRpbmcgYW5kIGRldmFzdGF0aW5nIGVmZmVjdHMsIHBhcnRpY3VsYXJseSBvbiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgc3dhcCBwZXJmb3JtYW5jZS4gSSBuZWVkIHRvIHJ1biB0aHJvdWdoIHRoZSByZXBsYWNlIHN0cmF0ZWd5IHRvIGVuc3VyZSB0aGF0IHRoZSBjb25kaXRpb25zIHdpdGhpbiB0aGF0IGZ1bmN0aW9uIGFyZSBzdGlsbCBzYWZlLCBhbmQgaGF2ZSBub3QgYmVlbiBhZmZlY3RlZCBieSBzdWJzZXF1ZW50IGltcHJvdmVtZW50cy5cblxuU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGVkZ2UgY2FzZXMuIEFtIEkgc3RpbGwgaGFuZGxpbmcgdGhlIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcmVwbGFjZW1lbnQgc2NlbmFyaW9zIGNvcnJlY3RseT8gRG9lcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhdm9pZCBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucywgZXNwZWNpYWxseSBnaXZlbiBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgc3dhcCBjYWNoZT8gQXJlIHRoZSBsb2NraW5nIHByaW1pdGl2ZXMgYXBwcm9wcmlhdGUgYW5kIGVmZmVjdGl2ZT8gQXJlIHRoZSBtZW1vcnkgYmFycmllcnMgaW4gcGxhY2Ugd2hlcmUgdGhleSBuZWVkIHRvIGJlLCBvciBhcmUgdGhlcmUgYW55IG9wcG9ydHVuaXRpZXMgdG8gb3B0aW1pemUgdGhlbSB3aXRob3V0IGludHJvZHVjaW5nIHJpc2s/IEkgbmVlZCB0byByZXZpZXcgaXQgdW5kZXIgaGlnaCBsb2FkLCB0b28uIEkgd2FudCB0byBtYWtlIHN1cmUgaXQncyB3b3JraW5nIGFzIGV4cGVjdGVkLlxuXG5JIGFsc28gd2FudCB0byBjaGVjayBpdHMgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBBcmUgdGhlcmUgYW55IHVuZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIG9yIGludGVyYWN0aW9ucyB3aXRoIHBhZ2UgcmVjbGFpbSwgZGlydHkgcGFnZSBoYW5kbGluZywgb3IgTlVNQSBvcHRpbWl6YXRpb25zIHRoYXQgbWlnaHQgaW50cm9kdWNlIHN1YnRsZSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBldmVuIGNvcnJlY3RuZXNzIGlzc3Vlcz8gSSdsbCBwcm9iYWJseSBhbHNvIG5lZWQgdG8gcnVuIGl0IHRocm91Z2ggYSBiYXR0ZXJ5IG9mIHRlc3RzLCBjb3ZlcmluZyBib3RoIHR5cGljYWwgYW5kIHBhdGhvbG9naWNhbCBzY2VuYXJpb3MsIHRvIGJ1aWxkIHNvbWUgY29uZmlkZW5jZS4gT3ZlcmFsbCwgSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGlzIGlzIHNvbGlkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDYzOCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjExLjMzMDg4OTQ2NloiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjcyODQ0MTk2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKGludHx2b2lkfGJvb2wpIC4qX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcC5oPTMyMT12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzIyLVxcdFxcdFxcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTtcXG5tbS9zd2FwLmg6MzIzOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzI0LVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldyk7XFxuLS1cXG5tbS9zd2FwX3N0YXRlLmM9MzM2PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYy0zNjEtICovXFxubW0vc3dhcF9zdGF0ZS5jOjM2Mjp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxubW0vc3dhcF9zdGF0ZS5jLTM2My1cXHRcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjE0LjA1OTM0MDM1M1oiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NDU3ODM1NzA1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNZW1vcnkgTWFuYWdlbWVudCBTeW1ib2xzIGFuZCBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgZm9jdXMgc3ltYm9scyBhcmU6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gSSdtIHN0YXJ0aW5nIHRvIGdldCBhIGZlZWwgZm9yIGhvdyB0aGVzZSByZWxhdGUgdG8gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLlxuXG5JJ3ZlIGdvdCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgaW4gbXkgbWVudGFsIHN0YWNrIGZvciB0aGUgcmVxdWlyZWQgY29uZmlncy4gV2FpdCwgaG9sZCBvbi4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBkZWZpbml0ZWx5IHRpZWQgdG8gYG1tL3N3YXBfc3RhdGUuY2AsIHdoaWNoLCBhcyBJIHJlY2FsbCwgbmVlZHMgYENPTkZJR19TV0FQYC4gTWFrZXMgc2Vuc2UuIEFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLCBjbGVhcmx5IGltcGxpY2F0aW5nIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBObyBzdXJwcmlzZXMgdGhlcmUuXG5cbkJ1dCBJJ20gbm90IGRvbmUgeWV0LiBJIG5lZWQgdG8gYmUgdGhvcm91Z2guIEkgd29uZGVyIGlmIHRoZXJlJ3MgYW55IG90aGVyIHJlbGV2YW50IGNvbmZpZyBpbiBwbGF5PyBMZXQgbWUgY2hlY2sgZm9yIGBDT05GSUdfVEhQX1NXQVBgLiBHb3R0YSBjb25zaWRlciB0aGUgaW50ZXJwbGF5IGJldHdlZW4gdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIGFuZCBzd2FwIHNwYWNlLiBJJ2xsIG5lZWQgdG8ga2VlcCB0aGF0IGluIG1pbmQgYXMgSSBkZWx2ZSBmdXJ0aGVyIGludG8gdGhpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEyMTYsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MTkuNTE3MTc5MTg4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTY1NTIwNTU3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUSFBfU1dBUFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTk2OT1lbmRjaG9pY2VcXG5tbS9LY29uZmlnLTk3MC1cXG5tbS9LY29uZmlnOjk3MTpjb25maWcgVEhQX1NXQVBcXG5tbS9LY29uZmlnLTk3Mi1cXHRkZWZfYm9vbCB5XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjIxLjA4MjcxMTM4NVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODc0MzQyNzU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHByZXNlbnRlZCBhcyBhIGZpcnN0LXBlcnNvbiBleHBlcnQgc3VtbWFyeTpcblxuKipUaGlua2luZyBUaHJvdWdoIFRIUF9TV0FQJ3MgRGVwZW5kZW5jaWVzKipcblxuQWxyaWdodCwgc28gYFRIUF9TV0FQYC4uLiB0aGF0J3MgYSBib29sZWFuIG9wdGlvbiwgYW5kIGl0J3MgZGVmaW5lZCBhcyBgZGVmX2Jvb2wgeWAuIFRoZSBpbnRlcmVzdGluZyBwYXJ0IGlzIHdoYXQgZGV0ZXJtaW5lcyB0aGF0IGRlZmF1bHQgdmFsdWUuIFRoZSBsb2dpYyBzdGF0ZXMgdGhhdCBpdCdzIGNvbnRpbmdlbnQgb24gdHdvIHRoaW5nczogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFNXQVBgLiBUaGF0IG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IHRoZSBhYmlsaXR5IHRvIHN3YXAgb3V0IGh1Z2UgcGFnZXMsIHdlbGwsIG9idmlvdXNseSB0aGF0IGRlcGVuZHMgb24gaGF2aW5nIGJvdGggdGhlIHRyYW5zcGFyZW50IGh1Z2VwYWdlcyBmZWF0dXJlIGVuYWJsZWQgYW5kIHN3YXAgc3BhY2UgYXZhaWxhYmxlLlxuXG5UbyBjbGFyaWZ5IHRoZSBmdWxsIGltcGFjdCBvZiB0aGVzZSBjb25kaXRpb25zLCBJIG5lZWQgdG8gbG9vayBpbnRvIGhvdyBleGFjdGx5IHRoaXMgZGVwZW5kZW5jeSBjaGFpbiBpcyBzZXQgdXAuIEJlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY2hlY2sgdGhlIGBtbS9LY29uZmlnYCBmaWxlIGluIHRoZSBrZXJuZWwgc291cmNlLiBUaGF0IGZpbGUgd2lsbCBkZXRhaWwgdGhlIGV4YWN0IHJlbGF0aW9uc2hpcHMgYW5kIGNvbnN0cmFpbnRzIGluIHBsYWNlIGFyb3VuZCB0aGUgYFRIUF9TV0FQYCBvcHRpb24uIEknbGwgdGFrZSBhIGxvb2sgdGhlcmUgdG8gY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIHN1YnRsZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNzUxLCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MjQuOTU3MDU4NjNaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxNjI4NTU2NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJUSFBfU1dBUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9ODEwPWNvbmZpZyBBUkNIX1dBTlRfR0VORVJBTF9IVUdFVExCXFxuLS1cXG5tbS9LY29uZmlnLTgxMi1cXG5tbS9LY29uZmlnOjgxMzpjb25maWcgQVJDSF9XQU5UU19USFBfU1dBUFxcbm1tL0tjb25maWctODE0LVxcdGRlZl9ib29sIG5cXG4tLVxcbm1tL0tjb25maWc9OTY5PWVuZGNob2ljZVxcbm1tL0tjb25maWctOTcwLVxcbm1tL0tjb25maWc6OTcxOmNvbmZpZyBUSFBfU1dBUFxcbm1tL0tjb25maWctOTcyLVxcdGRlZl9ib29sIHlcXG5tbS9LY29uZmlnOjk3MzpcXHRkZXBlbmRzIG9uIEFSQ0hfV0FOVFNfVEhQX1NXQVAgXFx1MDAyNlxcdTAwMjYgU1dBUCBcXHUwMDI2XFx1MDAyNiA2NEJJVFxcbm1tL0tjb25maWctOTc0LVxcdGhlbHBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MjUuODczMzU2NTE2WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY5MDA2NTAwNTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgVEhQX1NXQVAgRGVwZW5kZW5jeSBhbmQgQ29kZSBDaGFuZ2VzKipcblxuT2theSwgc28gYFRIUF9TV0FQYCBoaW5nZXMgb24gYEFSQ0hfV0FOVFNfVEhQX1NXQVBgLCBgU1dBUGAsIGFuZCBhIDY0LWJpdCBhcmNoaXRlY3R1cmUuIFRoYXQncyB0aGUgZ2F0ZS4gTm93LCBsb29raW5nIGF0IHRoZSBjb2RlLCB0aGUgbW9kaWZpY2F0aW9ucyBhcmUgY29uY2VudHJhdGVkIGluIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AuIFJpZ2h0IGF3YXksIEkgc2VlIHRoYXQgYG1tL2h1Z2VfbWVtb3J5LmNgIGlzIGdvaW5nIHRvIGJlIHBhcnQgb2YgdGhlIGJ1aWxkICpvbmx5KiBpZiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlbmFibGVkLCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AgcmVsaWVzIG9uIGBDT05GSUdfU1dBUGAuIFNvLCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgYXJlIHRoZSBrZXkgY29uZmlndXJhdGlvbnMgdG8ga2VlcCBpbiBtaW5kLiBUaG9zZSBhcmUgdGhlIGJpZyBrbm9icyBoZXJlLlxuXG5Ob3csIGxldCBtZSBnbyBiYWNrIG92ZXIgdGhlIGNoYW5nZXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCAqZXhhY3RseSogd2hhdCdzIGJlaW5nIHRvdWNoZWQuIEFoLCB0aGV5J3ZlIG1vZGlmaWVkIGBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCAocmVuYW1lZCB0byBgX19zcGxpdF9mcm96ZW5fZm9saW9gKSwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYCAocmVwbGFjZWQgYnkgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWApLCBgX19mb2xpb19zcGxpdGAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIEl0IGxvb2tzIGxpa2UgaXQgaXMgYWxsIGFib3V0IHJlZmFjdG9yaW5nIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgdG8gaGFuZGxlIHN3YXBjYWNoZSBhbmQgYW5vbnltb3VzIGZvbGlvcyBtb3JlIGVmZmVjdGl2ZWx5LiBUaGlzIGlzIGEgZnVuZGFtZW50YWwgY2hhbmdlIGluIHRoZSB3YXkgVEhQIGludGVyYWN0cyB3aXRoIHN3YXAuIFRoaXMgaXMgZGVmaW5pdGVseSBhIHNwb3Qgd29ydGggYSBkZWVwIGZ1enppbmcgY2FtcGFpZ24uXG5cbkFscmlnaHQsIEknbSByZWFkeSB0byBtb3ZlIGZvcndhcmQuIExldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjIyMzYsIk91dHB1dFRva2VucyI6MTUwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjkzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjMyLjc3NDAxMDAxN1oiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc1NTIxMzA3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZml4ZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS9odWdlX21lbW9yeS5jIGFuZCBtbS9zd2FwX3N0YXRlLmMsIHdoaWNoIGlzIHJlYWNoYWJsZSBhbmQgaGFzIGZ1bmN0aW9uYWwgaW1wYWN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRfdW5tYXBwZWRcIixcbiAgICBcImZvbGlvX2NoZWNrX3NwbGl0dGFibGVcIixcbiAgICBcIl9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBmaXhlcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL2h1Z2VfbWVtb3J5LmMgYW5kIG1tL3N3YXBfc3RhdGUuYywgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCBoYXMgZnVuY3Rpb25hbCBpbXBhY3QuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjMyLjg0OTUzODMwNFoiLCJTZXEiOjM1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODk0NDA1NDY4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjMyLjg1MDE2MTIxNFoiLCJTZXEiOjM2LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo4OTQzNDI2MzAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChzcGVjaWZpY2FsbHkgZm9yIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zKS4gSXQgbW9kaWZpZXMgaG93IGZvbGlvcyBhcmUgdW5tYXBwZWQsIGZyb3plbiwgYW5kIHNwbGl0LCB1cGRhdGluZyBwYWdlIGNhY2hlIGFuZCBzd2FwIGNhY2hlIHJlZmVyZW5jZXMuIFRoZXNlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHhhcnJheSBtYW5pcHVsYXRpb25zLiBUaGV5IGRvIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiBtZW1vcnkgYnVmZmVycy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIHdvdWxkIG1hbmlmZXN0IGFzIHVzZS1hZnRlci1mcmVlLCBtZW1vcnkgY29ycnVwdGlvbiwgb3IgbG9ja2luZyBpc3N1ZXMsIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggY2VkNDAwZjcyZDQzYS4uY2M5ZjdlMGQ0MTk0ZSAxMDA2NDRcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcbisrKyBiL21tL2h1Z2VfbWVtb3J5LmNcbkBAIC0zNTg5LDkgKzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncylcbiB7XG4gXHRpbnQgaSA9IDA7XG4gXG4tXHQvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqL1xuLVx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuLVx0XHRyZXR1cm47XG4gXHRmb3IgKDs7KSB7XG4gXHRcdHJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTtcbiBcdFx0aSArPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG5AQCAtMzc1NSw4ICszNzUyLDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuIH1cbiBcbiAvKipcbi0gKiBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgLSBzcGxpdHMgYW4gdW5tYXBwZWQgQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvcyBpblxuLSAqIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgLSBzcGxpdHMgYSBmcm96ZW4gQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvc1xuKyAqIGluIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XG4gICogICAgICAgICAgICAgYWxsb2NhdG9yIGxpa2Ugc3BsaXQgZ2VuZXJhdGVzIGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tIEBmb2xpbydzXG5AQCAtMzc2NCw3ICszNzYxLDYgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuICAqIEBzcGxpdF9hdDogaW4gYnVkZHkgYWxsb2NhdG9yIGxpa2Ugc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdFxuICAqICAgICAgICAgICAgd2lsbCBiZSBzcGxpdCB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyLlxuICAqIEB4YXM6IHhhX3N0YXRlIHBvaW50aW5nIHRvIGZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcyBhbmQgbG9ja2VkIGJ5IGNhbGxlclxuLSAqIEBtYXBwaW5nOiBAZm9saW8tXHUwMDNlbWFwcGluZ1xuICAqIEBzcGxpdF90eXBlOiBpZiB0aGUgc3BsaXQgaXMgdW5pZm9ybSBvciBub3QgKGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0KVxuICAqXG4gICpcbkBAIC0zNzk1LDExICszNzkxLDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4rc3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuLVx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4rXHRcdGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsMTEgKzM4MTEsMTEgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHQgICAgIHNwbGl0X29yZGVyLS0pIHtcbiBcdFx0aW50IG5yX25ld19mb2xpb3MgPSAxVUwgXHUwMDNjXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XG4gXG4tXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbi1cdFx0aWYgKGlzX2Fub24gXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4rXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4rXHRcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRpZiAobWFwcGluZykge1xuK1x0XHRpZiAoeGFzKSB7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiB1bmlmb3JtIHNwbGl0IGhhcyB4YXNfc3BsaXRfYWxsb2MoKSBjYWxsZWQgYmVmb3JlXG4gXHRcdFx0ICogaXJxIGlzIGRpc2FibGVkIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnksIHdoZXJlYXNcbkBAIC0zODc4LDMyICszODc1LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHQvKlxuIFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcbi1cdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXG4tXHQgKlxuLVx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXG4tXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cbitcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuK1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFpc19zd2FwY2FjaGUpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4tXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuIFx0Lypcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcbi1cdCAqXG4tXHQgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tXG4tXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXG4tXHQgKiBoZXJlLlxuK1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuK1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4rXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcbitcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4rXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgKzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdGlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4rXHQvKlxuK1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIGNhbiBvbmx5IGJlIGFcbitcdCAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0J3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXG4rXHQgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW1cbitcdCAqIGhlbmNlIHJlamVjdCBpdCBoZXJlIHVwIGZyb250IGJlZm9yZSB0b3VjaGluZyBhbnl0aGluZy5cbitcdCAqL1xuK1x0aWYgKCFpc19hbm9uIFx1MDAyNlx1MDAyNiBpc19zd2FwY2FjaGUgXHUwMDI2XHUwMDI2IGZvbGlvLVx1MDAzZW1hcHBpbmcpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4rLyoqXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKCkgLSBzcGxpdCBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW9cbisgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXG4rICogQGRvX2xydTogaWYgdHJ1ZSwgYWRkIGFmdGVyLXNwbGl0IGZvbGlvcyB0byBAbGlzdCBpZiBub24gTlVMTCwgb3RoZXJ3aXNlIHRvXG4rICogICAgICAgICAgdGhlIExSVSBsaXN0XG4rICogQGFub25fdW5tYXA6IGlmIHRydWUsIHVubWFwIEBmb2xpbyBiZWZvcmUgdGhlIHNwbGl0IGFuZCByZW1hcCBpdCBhZnRlclxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbisgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICpcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW8uIEl0IHVubWFwcyBAZm9saW8gKHVubGVzc1xuKyAqIEBhbm9uX3VubWFwIGlzIGZhbHNlKSwgZnJlZXplcyBpdHMgcmVmY291bnQsIGFuZCBwZXJmb3JtcyB0aGUgc3BsaXQsIHVwZGF0ZXNcbisgKiB0aGUgc3dhcCBjYWNoZSBlbnRyaWVzLiBTcGxpdCBmb2xpb3MgYXJlIHVuZnJvemVuIGFuZCByZW1hcHBlZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLlxuKyAqL1xuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4rXHRcdFx0XHRcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4rXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuK1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuK1x0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4rXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xuIFx0c3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1O1xuK1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xuIFx0aW50IHJldCA9IDA7XG4gXG4tXHRWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgXHUwMDI2XHUwMDI2IGVuZCk7XG4rXHQvKlxuK1x0ICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5XG4rXHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cbitcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xuK1x0ICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXNcbitcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxuK1x0ICovXG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4rXHRcdGlmICghYW5vbl92bWEpXG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4rXHR9XG4rXG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gb3V0X3VubG9jaztcbitcdH1cbitcbitcdGlmIChhbm9uX3VubWFwKVxuK1x0XHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuK1xuIFx0LypcbiBcdCAqIElmIHRoaXMgZm9saW8gY2FuIGJlIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBxdWV1ZSwgbG9jayBvdXRcbiBcdCAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXNcbiBcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxuIFx0ICogbG9jayBhbmQgbXVzdCBjbGVhbiB1cCB0aGUgTFJVIHN0YXRlIC0gdGhlIHNhbWUgZGVxdWV1ZSB3ZVxuIFx0ICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC5cbitcdCAqXG4rXHQgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCxcbitcdCAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy5cbiBcdCAqL1xuLVx0ZGVxdWV1ZV9kZWZlcnJlZCA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG9sZF9vcmRlciBcdTAwM2UgMTtcbitcdGRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgXHUwMDNlIDEgXHUwMDI2XHUwMDI2IGlzX2Fub247XG4gXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuIFx0XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4gXG5AQCAtMzk1MiwxMjggKzQwMDEsMjU2IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gXHRcdGxydSA9IGxpc3RfbHJ1X2xvY2soXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxuIFx0XHRcdFx0ICAgIGZvbGlvX25pZChmb2xpbyksIFx1MDAyNm1lbWNnKTtcbiBcdH1cbi1cdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbi1cdFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4tXHRcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKSkge1xuIFx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuLVx0XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuLVx0XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4tXHRcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbi1cdFx0XHRcdFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuLVx0XHRcdH1cbiBcdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbiBcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0fVxuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF9ub19zcGxpdDtcbitcdH1cbiBcbi1cdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4tXG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX1NITUVNX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9GSUxFX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuK1x0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbitcdFx0X19saXN0X2xydV9kZWwoXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXG4rXHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbitcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbitcdFx0XHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcbitcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbitcdFx0XHRcdCAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbiBcdFx0fVxuK1x0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHR9XG4gXG4tXHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbi1cdFx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRcdH1cbitcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4gXG4tXHRcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbi1cdFx0fVxuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzXG4rXHQgKiBpbiBzd2FwIGNhY2hlIG11c3QgYmUgdXBkYXRlZCBmaXJzdCwgc28gYSBjb25jdXJyZW50XG4rXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXG4rXHQgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLlxuK1x0ICovXG4rXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuK1x0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4rXHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0XHRpZiAoY2kpXG4rXHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0fVxuIFxuLVx0XHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXG4tXHRcdFx0XHRcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XG4rXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbitcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuLVx0XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGVcbi1cdFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4tXHRcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2Zcbi1cdFx0ICogQGZvbGlvLlxuLVx0XHQgKi9cbi1cdFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbi1cdFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XG4rXHRpZiAoZG9fbHJ1KVxuK1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRpZiAoY2kpXG4rXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuK291dF9ub19zcGxpdDpcbitcdGxvY2FsX2lycV9lbmFibGUoKTtcbitcdGlmIChhbm9uX3ZtYSkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl92bWEpIHtcbitcdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcbitcdFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcbitcdH1cbiBcbi1cdFx0XHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xuK1x0cmV0dXJuIHJldDtcbit9XG4gXG4tXHRcdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcbisvKipcbisgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpb1xuKyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXG4rICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuKyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbisgKlxuKyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzXG4rICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdFxuKyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTVxuKyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKVxuKyAqL1xuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbitcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbitcdFx0XHRcdFx0ICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuK3tcbitcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbitcdFhBX1NUQVRFKHhhcywgXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuK1x0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XG4rXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4rXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XG4rXHR1bnNpZ25lZCBpbnQgbWluX29yZGVyO1xuK1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuK1x0cGdvZmZfdCBlbmQgPSAwO1xuK1x0Z2ZwX3QgZ2ZwO1xuK1x0aW50IHJldCA9IDA7XG4gXG4tXHRcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbi1cdFx0XHRcdFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbitcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuK1x0aWYgKG5ld19vcmRlciBcdTAwM2MgbWluX29yZGVyKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbi1cdFx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0LypcbitcdCAqIFN3aXRjaCB0byBmb2xpbydzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmRcbitcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cbitcdCAqL1xuK1x0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTtcbitcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cbi1cdFx0XHQgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChjaSkge1xuLVx0XHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuK1x0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKTtcbitcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdFx0Z290byBmYWlsX2ZyZWU7XG4rXHR9XG4gXG4tXHRcdFx0LyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqL1xuLVx0XHRcdGlmICghbWFwcGluZylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuK1x0bWFwcGluZ19zZXRfdXBkYXRlKFx1MDAyNnhhcywgbWFwcGluZyk7XG4gXG4tXHRcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4tXHRcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4tXHRcdFx0XHRfX3hhX3N0b3JlKFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgbmV3X2ZvbGlvLVx1MDAzZWluZGV4LFxuLVx0XHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuK1x0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4rXHRcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXG4tXHRcdFx0Vk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTtcbi1cdFx0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuLVx0XHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpIFx1MDAyNlx1MDAyNiBucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRcdFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4tXHRcdFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxuLVx0XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxuLVx0XHRcdFx0XHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuLVx0XHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbi1cdFx0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbitcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuK1x0XHR4YXNfc3BsaXRfYWxsb2MoXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xuK1x0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbitcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbitcdFx0XHRnb3RvIGZhaWxfZnJlZTtcbiBcdFx0fVxuK1x0fVxuIFxuLVx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbi1cdFx0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuLVx0XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuLVx0XHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICovXG4tXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpO1xuK1x0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbiBcbi1cdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbitcdH1cbiBcbi1cdFx0aWYgKGNpKVxuLVx0XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0fSBlbHNlIHtcbi1cdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdC8qXG4rXHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuK1x0ICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmVcbitcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbitcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuK1x0ICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy5cbitcdCAqL1xuK1x0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4rXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbitcbitcdHVubWFwX2ZvbGlvKGZvbGlvKTtcbitcbitcdHhhc19sb2NrX2lycShcdTAwMjZ4YXMpO1xuK1xuK1x0LypcbitcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4rXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbitcdCAqL1xuK1x0aWYgKHhhc19sb2FkKFx1MDAyNnhhcykgIT0gZm9saW8pIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgKyAxKSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuK1x0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcbitcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NITUVNX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuK1x0XHRlbHNlXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuK1x0fVxuK1xuK1x0LyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovXG4rXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRyZXQgPSBfX3NwbGl0X2Zyb3plbl9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbitcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0LyogY29tcHV0ZSBuZXh0IGJlZm9yZSB0aGUgZm9saW8gY2FuIGJlIGZyZWVkIGJlbG93ICovXG4rXHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICsgMSk7XG4rXG4rXHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcbitcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4rXHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuK1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4rXHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuK1x0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4tXHRcdHJldHVybiAtRUFHQUlOO1xuK1xuK1x0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuK1x0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0XHRucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuK1x0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbitcdFx0XHRcdFx0ICAgICAgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4rXHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbitcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4rXHQvKlxuK1x0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbitcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbitcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4rXHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqL1xuK1x0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgKyAxKTtcbitcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbitmYWlsOlxuK1x0LypcbitcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbitcdCAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LlxuK1x0ICovXG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSArNDI2Myw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbiAgKlxuLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiAgKiBJdCBpcyBpbiBjaGFyZ2Ugb2YgY2hlY2tpbmcgd2hldGhlciB0aGUgc3BsaXQgaXMgc3VwcG9ydGVkIG9yIG5vdCBhbmRcbi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICs0Mjc5LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxuIFx0XHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4tXHRYQV9TVEFURSh4YXMsIFx1MDAyNmZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuIFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbi1cdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbi1cdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcbi1cdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbi1cdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbi1cdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4tXHRwZ29mZl90IGVuZCA9IDA7XG4gXHRpbnQgcmV0O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbkBAIC00MTIwLDE0MSArNDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuK1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdGlmIChuZXdfb3JkZXIgXHUwMDNlPSBvbGRfb3JkZXIpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbiBcdGlmIChyZXQpIHtcbiBcdFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wiKTtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuLVx0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuLVx0ICovXG4tXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuLVx0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4tXG4tXHRpZiAoaXNfYW5vbikge1xuLVx0XHQvKlxuLVx0XHQgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGRcbi1cdFx0ICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYVxuLVx0XHQgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzXG4tXHRcdCAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9ja1xuLVx0XHQgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZVxuLVx0XHQgKiBvcGVyYXRpb25zLlxuLVx0XHQgKi9cbi1cdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuLVx0XHRpZiAoIWFub25fdm1hKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH0gZWxzZSB7XG4tXHRcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4tXHRcdGdmcF90IGdmcDtcbi1cbi1cdFx0bWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4tXHRcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuLVx0XHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpIHtcbi1cdFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjZcbi1cdFx0XHRcdFx0XHRcdEdGUF9SRUNMQUlNX01BU0spO1xuLVxuLVx0XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuLVx0XHRcdHJldCA9IC1FQlVTWTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbi1cbi1cdFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4tXHRcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuLVx0XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4tXHRcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4tXHRcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuLVxuLVx0XHRhbm9uX3ZtYSA9IE5VTEw7XG4tXHRcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuLVx0XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuLVx0XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4tXHRcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuLVx0XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuLVx0XHQgKi9cbi1cdFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4tXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuLVx0XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcbi1cdCAqIHNwbGl0IFBNRHNcbi1cdCAqL1xuLVx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbi1cdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0dW5tYXBfZm9saW8oZm9saW8pO1xuLVxuLVx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRpZiAobWFwcGluZykge1xuLVx0XHQvKlxuLVx0XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuLVx0XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbi1cdFx0ICovXG4tXHRcdHhhc19sb2NrKFx1MDAyNnhhcyk7XG4tXHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuLVx0XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuLVx0XHRcdHJldCA9IC1FQUdBSU47XG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHR9XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbitcdGlmIChpc19hbm9uKVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuK1x0ZWxzZVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgKzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XG4gXHRcdC8qXG4gXHRcdCAqIFN1YnBhZ2VzIHdob3NlIG1hcHBpbmcgaGFzIGJlZW4gemFwcGVkIG1heSBiZSBmcmVlZFxuIFx0XHQgKiBlYXJsaWVyLCBidXQgZnJlZWluZyB0aGVtIHJlcXVpcmVzIHRha2luZyB0aGVcbi1cdFx0ICogbHJ1X2xvY2ssIHNvIHdlIGRlZmVyIHB1dF9wYWdlKCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuK1x0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuIFx0XHQgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLlxuIFx0XHQgKi9cbi1cdFx0ZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pO1xuK1x0XHRpZiAoaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiAhZm9saW9fbWFwcGVkKG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzExLDI5ICs0MzYwLDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKVxuICAqXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcbi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbisgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgZmFsc2UsXG4rXHRcdFx0XHRcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTAgKzQzOTIsOSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXG4gICpcbi0gKiA0KSBAbmV3X29yZGVyIFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxuLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxuLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4rICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yXG4rICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcbisgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG5AQCAtNDM4NCw3ICs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxuICAqL1xuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0zODksOCArMzg5LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xuIFx0XHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVx1MDAzZXN3YXApO1xuIFx0XHRjaV9lbmQgPSBjaV9vZmYgKyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmKysgXHUwMDNjIGNpX2VuZClcbitcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbitcdFx0fSB3aGlsZSAoKytjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MzIuODUwMTYxOTQ0WiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg5NDMzOTc3NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgRm9saW8gU3BsaXR0aW5nIFBhdGNoKipcblxuT2theSwgc28gSSd2ZSBsb29rZWQgb3ZlciB0aGlzIHBhdGNoLiBJdCdzIHRvdWNoaW5nIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AsIHdoaWNoIGltbWVkaWF0ZWx5IHRlbGxzIG1lIHdlJ3JlIGRlYWxpbmcgd2l0aCB0aGUgbml0dHktZ3JpdHR5IG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBzcGVjaWZpY2FsbHkgaG93IHdlJ3JlIGhhbmRsaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgYW5kIHRoZWlyIGludGVyYWN0aW9uIHdpdGggdGhlIHN3YXAgY2FjaGUgYW5kIHBhZ2UgY2FjaGUuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2VzIGlzIGEgcmVmYWN0b3Jpbmcgb2YgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYy4gVGhleSdyZSByZW5hbWluZyBmdW5jdGlvbnMsIGxpa2UgYF9fc3BsaXRfdW5tYXBwZWRfZm9saW9gIHRvIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AgYW5kIHNpbWlsYXIgdmFyaWF0aW9ucywgYnV0IHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgc2VlbXMgdGhlIHNhbWU6IHVubWFwcGluZywgZnJlZXppbmcsIGFuZCBzcGxpdHRpbmcgdGhlc2UgZm9saW9zLlxuXG5NeSBpbml0aWFsIHNjYW4gdGVsbHMgbWUgdGhpcyBpcyBhbGwgcHVyZWx5IGludGVybmFsIG1lbW9yeSBtYW5hZ2VtZW50LiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBpbnRyb2R1Y2VkIHRoYXQgd291bGQgZ2V0IGV4cG9zZWQgdG8gdXNlciBzcGFjZS4gSXQncyBhbGwgYWJvdXQgaG93IHdlIG1hbmFnZSBwYWdlIHJlZmNvdW50cywgZGVhbCB3aXRoIGxvY2tpbmcsIGFuZCB1cGRhdGUgdGhvc2UgeGFycmF5cyBhbmQgTFJVIGxpc3RzIHdoZW4gc3BsaXR0aW5nIGEgZm9saW8uXG5cblNpbmNlIGl0J3MgbWVtb3J5IG1hbmFnZW1lbnQsIHRoZSB0eXBpY2FsIHJpc2tzIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHM6IHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIGFuZCBkZWFkbG9ja3MuIEJ1dCwgc2luY2UgdGhlcmUgaXMgbm8gZGF0YSBjb3BpZWQgdG8gb3IgZnJvbSB1c2VyIHNwYWNlIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBLTVNBTiBkb2Vzbid0IHNlZW0gdG8gYmUgcmVxdWlyZWQgZm9yIHRoZXNlIGNoYW5nZXMuIFdlJ3JlIGFscmVhZHkgcHJvdGVjdGVkIGJ5IEtBU0FOLCBLQ1NBTiwgYW5kIExPQ0tERVAgZm9yIHRoZSB1c3VhbCBtZW1vcnkgY29ycnVwdGlvbiBhbmQgbG9ja2luZyBwcm9ibGVtcy5cblxuSSB0b29rIGEgY2xvc2VyIGxvb2sgdG8gZG91YmxlLWNoZWNrIG15IGluaXRpYWwgYXNzZXNzbWVudC4gSSBzZWUgYHhhc19zcGxpdF9hbGxvY2AgYmVpbmcgdXNlZCwgYnV0IHRob3NlIGFyZSBqdXN0IGFsbG9jYXRpbmcgeGFycmF5IG5vZGVzLCBub3QgdXNlci12aXNpYmxlIGRhdGEuIE5vdGhpbmcgbmV3IGlzIGJlaW5nIGV4cG9zZWQgdG8gdXNlcnNwYWNlLiBNZW1vcnkgaW5pdGlhbGl6YXRpb24gZG9lc24ndCBzZWVtIHRvIGJlIGEgZmFjdG9yIGhlcmU7IHdlJ3JlIGp1c3Qgc3BsaXR0aW5nIGV4aXN0aW5nIGZvbGlvcy5cblxuVGhlcmVmb3JlLCAqTmVlZHNLTVNBTiogaXMgZGVmaW5pdGVseSBmYWxzZS4gVGhpcyBwYXRjaCBpcyBhIGdvb2QgZXhhbXBsZSBvZiBpbnRlcm5hbCBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIHRoYXQgc2hvdWxkICpub3QqIHJlcXVpcmUgS01TQU4gc2NydXRpbnkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyODc2LCJPdXRwdXRUb2tlbnMiOjE2NiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjQxLjc5MzU2NDQ2NVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGZvciBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcykuIEl0IG1vZGlmaWVzIGhvdyBmb2xpb3MgYXJlIHVubWFwcGVkLCBmcm96ZW4sIGFuZCBzcGxpdCwgdXBkYXRpbmcgcGFnZSBjYWNoZSBhbmQgc3dhcCBjYWNoZSByZWZlcmVuY2VzLiBUaGVzZSBjaGFuZ2VzIGludm9sdmUgcGFnZSByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCB4YXJyYXkgbWFuaXB1bGF0aW9ucy4gVGhleSBkbyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbHRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJ1ZmZlcnMuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyB3b3VsZCBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGxvY2tpbmcgaXNzdWVzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGZvciBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcykuIEl0IG1vZGlmaWVzIGhvdyBmb2xpb3MgYXJlIHVubWFwcGVkLCBmcm96ZW4sIGFuZCBzcGxpdCwgdXBkYXRpbmcgcGFnZSBjYWNoZSBhbmQgc3dhcCBjYWNoZSByZWZlcmVuY2VzLiBUaGVzZSBjaGFuZ2VzIGludm9sdmUgcGFnZSByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCB4YXJyYXkgbWFuaXB1bGF0aW9ucy4gVGhleSBkbyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbHRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJ1ZmZlcnMuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyB3b3VsZCBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGxvY2tpbmcgaXNzdWVzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowft9df[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-20 18:59:03 +0000 UTC FinishedAt: 2026-08-20 19:04:43 +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": "4b2ae13f3393ef4b4bce0021e8762790354f369f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "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": "4b2ae13f3393ef4b4bce0021e8762790354f369f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "series_id": "4b03c31f-5176-4b89-ab75-977f5f471d85" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__split_huge_page_to_list_to_order", "folio_split_unmapped", "folio_check_splittable", "__swap_cache_replace_folio" ], "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+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O2ZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChzcGVjaWZpY2FsbHkgZm9yIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zKS4gSXQgbW9kaWZpZXMgaG93IGZvbGlvcyBhcmUgdW5tYXBwZWQsIGZyb3plbiwgYW5kIHNwbGl0LCB1cGRhdGluZyBwYWdlIGNhY2hlIGFuZCBzd2FwIGNhY2hlIHJlZmVyZW5jZXMuIFRoZXNlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHhhcnJheSBtYW5pcHVsYXRpb25zLiBUaGV5IGRvIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiBtZW1vcnkgYnVmZmVycy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIHdvdWxkIG1hbmlmZXN0IGFzIHVzZS1hZnRlci1mcmVlLCBtZW1vcnkgY29ycnVwdGlvbiwgb3IgbG9ja2luZyBpc3N1ZXMsIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBmaXhlcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL2h1Z2VfbWVtb3J5LmMgYW5kIG1tL3N3YXBfc3RhdGUuYywgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCBoYXMgZnVuY3Rpb25hbCBpbXBhY3QuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGNlZDQwMGY3MmQ0M2EuLmNjOWY3ZTBkNDE5NGUgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtMzU4OSw5ICYjNDM7MzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG5AQCAtMzc1NSw4ICYjNDM7Mzc1Miw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiB9XG4gXG4gLyoqXG4tICogX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIC0gc3BsaXRzIGFuIHVubWFwcGVkIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MgaW5cbi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cbiYjNDM7ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zXG4mIzQzOyAqIGluIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XG4gICogICAgICAgICAgICAgYWxsb2NhdG9yIGxpa2Ugc3BsaXQgZ2VuZXJhdGVzIGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tIEBmb2xpbyYjMzk7c1xuQEAgLTM3NjQsNyAmIzQzOzM3NjEsNiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsXG4gICogQHNwbGl0X2F0OiBpbiBidWRkeSBhbGxvY2F0b3IgbGlrZSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0XG4gICogICAgICAgICAgICB3aWxsIGJlIHNwbGl0IHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIuXG4gICogQHhhczogeGFfc3RhdGUgcG9pbnRpbmcgdG8gZm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzIGFuZCBsb2NrZWQgYnkgY2FsbGVyXG4tICogQG1hcHBpbmc6IEBmb2xpby1cdTAwM2VtYXBwaW5nXG4gICogQHNwbGl0X3R5cGU6IGlmIHRoZSBzcGxpdCBpcyB1bmlmb3JtIG9yIG5vdCAoYnVkZHkgYWxsb2NhdG9yIGxpa2Ugc3BsaXQpXG4gICpcbiAgKlxuQEAgLTM3OTUsMTEgJiM0MzszNzkxLDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4mIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcbi1cdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuJiM0MztcdFx0ZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsMTEgJiM0MzszODExLDExIEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XG4gXHRcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFx1MDAzY1x1MDAzYyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpO1xuIFxuLVx0XHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4tXHRcdGlmIChpc19hbm9uIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuJiM0MztcdFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbiYjNDM7XHRcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRpZiAobWFwcGluZykge1xuJiM0MztcdFx0aWYgKHhhcykge1xuIFx0XHRcdC8qXG4gXHRcdFx0ICogdW5pZm9ybSBzcGxpdCBoYXMgeGFzX3NwbGl0X2FsbG9jKCkgY2FsbGVkIGJlZm9yZVxuIFx0XHRcdCAqIGlycSBpcyBkaXNhYmxlZCB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LCB3aGVyZWFzXG5AQCAtMzg3OCwzMiAmIzQzOzM4NzUsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4mIzQzO1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiYjNDM7XG4gXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbiBcdC8qXG4gXHQgKiBGb2xpb3MgdGhhdCBqdXN0IGdvdCB0cnVuY2F0ZWQgY2Fubm90IGdldCBzcGxpdC4gU2lnbmFsIHRvIHRoZVxuLVx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS5cbi1cdCAqXG4tXHQgKiBUT0RPOiB0aGlzIHdpbGwgYWxzbyBjdXJyZW50bHkgcmVmdXNlIGZvbGlvcyB3aXRob3V0IGEgbWFwcGluZyBpbiB0aGVcbi1cdCAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLlxuJiM0MztcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuJiM0MztcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxuIFx0ICovXG4tXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuJiM0MztcdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWlzX3N3YXBjYWNoZSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbi1cdC8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi9cbi1cdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4gXHQvKlxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMFxuLVx0ICpcbi1cdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cbi1cdCAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnlcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWRcbi1cdCAqIGhlcmUuXG4mIzQzO1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuJiM0MztcdCAqIGRlZmVycmVkIHNwbGl0IGxpc3QsIGh5YnJpZCBzaG1lbSBcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxuJiM0MztcdCAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZFxuJiM0MztcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4mIzQzO1x0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdH1cbiBcbiBcdGlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0zOTExLDM5ICYjNDM7MzkwMiw5NyBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXG4mIzQzO1x0ICogc2htZW0gZm9saW8gdW5kZXIgU1dBUCBJTywgaXQmIzM5O3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXG4mIzQzO1x0ICogc2htZW0gbWFwcGluZyBhZnRlcndhcmQuIFRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZyB0aGVtXG4mIzQzO1x0ICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghaXNfYW5vbiBcdTAwMjZcdTAwMjYgaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiBmb2xpby1cdTAwM2VtYXBwaW5nKVxuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqL1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4mIzQzOy8qKlxuJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpb1xuJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZFxuJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4mIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG9cbiYjNDM7ICogICAgICAgICAgdGhlIExSVSBsaXN0XG4mIzQzOyAqIEBhbm9uX3VubWFwOiBpZiB0cnVlLCB1bm1hcCBAZm9saW8gYmVmb3JlIHRoZSBzcGxpdCBhbmQgcmVtYXAgaXQgYWZ0ZXJcbiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4mIzQzOyAqXG4mIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzXG4mIzQzOyAqIEBhbm9uX3VubWFwIGlzIGZhbHNlKSwgZnJlZXplcyBpdHMgcmVmY291bnQsIGFuZCBwZXJmb3JtcyB0aGUgc3BsaXQsIHVwZGF0ZXNcbiYjNDM7ICogdGhlIHN3YXAgY2FjaGUgZW50cmllcy4gU3BsaXQgZm9saW9zIGFyZSB1bmZyb3plbiBhbmQgcmVtYXBwZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuJiM0MztcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4mIzQzO1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuJiM0MztcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuJiM0MztcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4gXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XG4mIzQzO1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xuIFx0aW50IHJldCA9IDA7XG4gXG4tXHRWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgXHUwMDI2XHUwMDI2IGVuZCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcbiYjNDM7XHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cbiYjNDM7XHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbiYjNDM7XHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xuJiM0MztcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4mIzQzO1x0XHRpZiAoIWFub25fdm1hKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi9cbiYjNDM7XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChhbm9uX3VubWFwKVxuJiM0MztcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuJiM0MztcbiYjNDM7XHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCxcbiYjNDM7XHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4mIzQzO1x0ZGVxdWV1ZV9kZWZlcnJlZCA9IG9sZF9vcmRlciBcdTAwM2UgMSBcdTAwMjZcdTAwMjYgaXNfYW5vbjtcbiBcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4gXHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiBcbkBAIC0zOTUyLDEyOCAmIzQzOzQwMDEsMjU2IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gXHRcdGxydSA9IGxpc3RfbHJ1X2xvY2soXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxuIFx0XHRcdFx0ICAgIGZvbGlvX25pZChmb2xpbyksIFx1MDAyNm1lbWNnKTtcbiBcdH1cbi1cdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4mIzQzO1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkge1xuIFx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuLVx0XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuLVx0XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4tXHRcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbi1cdFx0XHRcdFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuLVx0XHRcdH1cbiBcdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbiBcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0fVxuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gb3V0X25vX3NwbGl0O1xuJiM0MztcdH1cbiBcbi1cdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4tXG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX1NITUVNX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9GSUxFX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuJiM0MztcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4mIzQzO1x0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbiYjNDM7XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbiYjNDM7XHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4mIzQzO1x0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuJiM0MztcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbiYjNDM7XHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbiYjNDM7XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4mIzQzO1x0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiYjNDM7XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4gXG4tXHRcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbi1cdFx0fVxuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4gXG4tXHRcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuJiM0MztcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4mIzQzO1x0ICogcGxhY2UuIEtlZXAgdGhlIGhlYWQgQGZvbGlvIGZyb3plbiB1bnRpbCB0aGUgZW5kOiBzdWIgZW50cmllc1xuJiM0MztcdCAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnRcbiYjNDM7XHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXG4mIzQzO1x0ICogZW50cnkgKGZvbGlvX3RyeV9nZXQoKSB3aWxsIGZhaWwgb24gdGhlIGhlYWQgQGZvbGlvIHVudGlsIHVuZnJlZXplKS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuJiM0MztcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuJiM0MztcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbiYjNDM7XHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4mIzQzO1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuJiM0MztcdFx0XHRcdCAgIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTtcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4mIzQzO1x0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbiYjNDM7XHRcdGlmIChjaSlcbiYjNDM7XHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuJiM0MztcdH1cbiBcbi1cdFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxuLVx0XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuJiM0MztcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xuJiM0MztcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbi1cdFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlXG4tXHRcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuLVx0XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4tXHRcdCAqIEBmb2xpby5cbi1cdFx0ICovXG4tXHRcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4tXHRcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4mIzQzO1x0aWYgKGNpKVxuJiM0MztcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4mIzQzO291dF9ub19zcGxpdDpcbiYjNDM7XHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4mIzQzO1x0aWYgKGFub25fdm1hKSB7XG4mIzQzO1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbiYjNDM7XHRcdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4mIzQzO1x0XHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4mIzQzO1x0fVxuJiM0MztvdXRfdW5sb2NrOlxuJiM0MztcdGlmIChhbm9uX3ZtYSkge1xuJiM0MztcdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcbiYjNDM7XHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4mIzQzO1x0fVxuIFxuLVx0XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuIFxuLVx0XHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4mIzQzOy8qKlxuJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpb1xuJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZCBhbmQgZmlsZS1iYWNrZWRcbiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcbiYjNDM7ICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4mIzQzOyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxuJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcbiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4mIzQzOyAqXG4mIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzXG4mIzQzOyAqIHJlZmNvdW50LCBhbmQgcGVyZm9ybSB0aGUgc3BsaXQsIHVwZGF0ZXMgdGhlIHBhZ2UgY2FjaGUgZW50cmllcy4gU3BsaXRcbiYjNDM7ICogZm9saW9zIGFyZSB1bmZyb3plbiBidXQgbm90IHJlbWFwcGVkLCB0aGV5IGFyZSBmYXVsdGVkIGJhY2sgaW4gb24gZGVtYW5kLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4gKGlmIC1FTk9NRU1cbiYjNDM7ICogaXMgcmV0dXJuZWQsIEBmb2xpbyBtaWdodCBiZSBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIpXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cdTAwM2VtYXBwaW5nO1xuJiM0MztcdFhBX1NUQVRFKHhhcywgXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4mIzQzO1x0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbiYjNDM7XHRsb25nIG9sZF9ucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbiYjNDM7XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuJiM0MztcdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgbWluX29yZGVyO1xuJiM0MztcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiYjNDM7XHRwZ29mZl90IGVuZCA9IDA7XG4mIzQzO1x0Z2ZwX3QgZ2ZwO1xuJiM0MztcdGludCByZXQgPSAwO1xuIFxuLVx0XHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4tXHRcdFx0XHRcdCAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuJiM0MztcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcilcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0XHRcdGlmIChkb19scnUpXG4tXHRcdFx0XHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuJiM0MztcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuJiM0MztcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cbi1cdFx0XHQgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChjaSkge1xuLVx0XHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuJiM0MztcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjYgR0ZQX1JFQ0xBSU1fTUFTSyk7XG4mIzQzO1x0aWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHtcbiYjNDM7XHRcdHJldCA9IC1FQlVTWTtcbiYjNDM7XHRcdGdvdG8gZmFpbF9mcmVlO1xuJiM0MztcdH1cbiBcbi1cdFx0XHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXG4tXHRcdFx0aWYgKCFtYXBwaW5nKVxuLVx0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0bWFwcGluZ19zZXRfdXBkYXRlKFx1MDAyNnhhcywgbWFwcGluZyk7XG4gXG4tXHRcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4tXHRcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4tXHRcdFx0XHRfX3hhX3N0b3JlKFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgbmV3X2ZvbGlvLVx1MDAzZWluZGV4LFxuLVx0XHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuJiM0MztcdGlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkge1xuJiM0MztcdFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcbi1cdFx0XHRWTV9XQVJOX09OX09OQ0UoIW5yX3NobWVtX2Ryb3BwZWQpO1xuLVx0XHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4tXHRcdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXHUwMDI2XHUwMDI2IG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdFx0XHQqbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7XG4tXHRcdFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxuLVx0XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxuLVx0XHRcdFx0XHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuLVx0XHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbi1cdFx0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiYjNDM7XHRcdHhhc19zZXRfb3JkZXIoXHUwMDI2eGFzLCBmb2xpby1cdTAwM2VpbmRleCwgbmV3X29yZGVyKTtcbiYjNDM7XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4mIzQzO1x0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbiYjNDM7XHRcdFx0cmV0ID0geGFzX2Vycm9yKFx1MDAyNnhhcyk7XG4mIzQzO1x0XHRcdGdvdG8gZmFpbF9mcmVlO1xuIFx0XHR9XG4mIzQzO1x0fVxuIFxuLVx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbi1cdFx0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuLVx0XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuLVx0XHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICovXG4tXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTtcbiYjNDM7XHRpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpO1xuIFxuLVx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbiYjNDM7XHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbiYjNDM7XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbiYjNDM7XHR9XG4gXG4tXHRcdGlmIChjaSlcbi1cdFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdH0gZWxzZSB7XG4tXHRcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4tXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuJiM0MztcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4mIzQzO1x0ICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLlxuJiM0MztcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuJiM0MztcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4mIzQzO1x0ICovXG4mIzQzO1x0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4mIzQzO1x0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4mIzQzO1x0XHRlbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy1cdTAwM2Vob3N0LCBlbmQpO1xuJiM0MztcbiYjNDM7XHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4mIzQzO1xuJiM0MztcdHhhc19sb2NrX2lycShcdTAwMjZ4YXMpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4mIzQzO1x0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHhhc19sb2FkKFx1MDAyNnhhcykgIT0gZm9saW8pIHtcbiYjNDM7XHRcdHJldCA9IC1FQUdBSU47XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIG9sZF9ucl9wYWdlcyAmIzQzOyAxKSkge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2IG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4mIzQzO1x0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcbiYjNDM7XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovXG4mIzQzO1x0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuJiM0MztcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIHNwbGl0X3R5cGUpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbiYjNDM7XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbiYjNDM7XHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3NcbiYjNDM7XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuJiM0MztcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbiYjNDM7XHQgKiBAZm9saW8uXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbiYjNDM7XHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuJiM0MztcbiYjNDM7XHRcdC8qIGNvbXB1dGUgbmV4dCBiZWZvcmUgdGhlIGZvbGlvIGNhbiBiZSBmcmVlZCBiZWxvdyAqL1xuJiM0MztcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuJiM0MztcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgJiM0MzsgMSk7XG4mIzQzO1xuJiM0MztcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuJiM0MztcbiYjNDM7XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuJiM0MztcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4mIzQzO1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4mIzQzO1x0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4mIzQzO1xuJiM0MztcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbiYjNDM7XHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuJiM0MztcdFx0XHRucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlcztcbiYjNDM7XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbiYjNDM7XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuJiM0MztcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuJiM0MztcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuJiM0MztcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbiYjNDM7XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuJiM0MztcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbiYjNDM7ZmFpbDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbiYjNDM7XHQgKiByZW1lbWJlciB0byBhZGQgcmVtYXBfcGFnZSgpIGFuZCBhZGFwdCBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuJiM0MztmYWlsX21tYXBfdW5sb2NrOlxuJiM0MztcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuJiM0MztcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4mIzQzO1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuJiM0MztcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcbiYjNDM7XHQgKiB0aGUgbWFwcGluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4mIzQzO2ZhaWxfZnJlZTpcbiYjNDM7XHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuJiM0MztcdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcbiYjNDM7XHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4mIzQzO1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSAmIzQzOzQyNjMsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuICAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbiAgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4gICpcbi0gKiBJdCBjYWxscyBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiYjNDM7ICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cbiYjNDM7ICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICYjNDM7NDI3OSwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCxcbiBcdFx0c3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuLVx0WEFfU1RBVEUoeGFzLCBcdTAwMjZmb2xpby1cdTAwM2VtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbiYjNDM7XHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICYjNDM7NDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuJiM0MztcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRpZiAobmV3X29yZGVyIFx1MDAzZT0gb2xkX29yZGVyKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuJiM0MztcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIHN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbiYjNDM7XHRpZiAoaXNfYW5vbilcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbiYjNDM7XHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXG4mIzQzO1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgJiM0Mzs0MzI0LDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpXG4gXHRcdFx0Y29udGludWU7XG4gXG4tXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuIFx0XHQvKlxuIFx0XHQgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWRcbiBcdFx0ICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlXG4tXHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWxcbiYjNDM7XHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4mIzQzO1x0XHRpZiAoaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiAhZm9saW9fbWFwcGVkKG5ld19mb2xpbykpXG4mIzQzO1x0XHRcdGZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XG4mIzQzO1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJiMzOTtzIG9sZF9tZW1jZyAqL1xuLVx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuLVx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuLW91dF9ub19tZW1jZzpcbi1cdHhhc19kZXN0cm95KFx1MDAyNnhhcyk7XG4gXHRpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpXG4gXHRcdGNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7XG4gXHRjb3VudF9tdGhwX3N0YXQob2xkX29yZGVyLCAhcmV0ID8gTVRIUF9TVEFUX1NQTElUIDogTVRIUF9TVEFUX1NQTElUX0ZBSUxFRCk7XG5AQCAtNDMxMSwyOSAmIzQzOzQzNjAsMjAgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gICogaXNvbGF0ZWQgZnJvbSBMUlUgKGlmIGFwcGxpY2FibGUpXG4gICpcbiAgKiBVcG9uIHJldHVybiwgdGhlIGZvbGlvIGlzIG5vdCByZW1hcHBlZCwgc3BsaXQgZm9saW9zIGFyZSBub3QgYWRkZWQgdG8gTFJVLFxuLSAqIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuJiM0MzsgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIGZhbHNlLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSk7XG4gfVxuIFxuIC8qXG5AQCAtNDM1MiwxMCAmIzQzOzQzOTIsOSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXG4gICpcbi0gKiA0KSBAbmV3X29yZGVyIFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxuLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxuLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4mIzQzOyAqIDQpIEBuZXdfb3JkZXIgIT0gMSBmb3IgYW5vbiBvciBzd2FwY2FjaGUuIEFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvclxuJiM0MzsgKiAgICBfZGVmZXJyZWRfbGlzdCwgd2hpY2ggb3JkZXItMSBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heVxuJiM0MzsgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJiMzOTtzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLFxuQEAgLTQzODQsNyAmIzQzOzQ0MjMsNyBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiB3aXRoIHRoZSBmb2xpby4gU3BsaXR0aW5nIHRvIG9yZGVyIDAgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBmb2xpb3MuXG4gICovXG4gaW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG4tXHRcdFx0XHQgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4mIzQzO1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0zODksOCAmIzQzOzM4OSw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdCAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHtcbiBcdFx0Y2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC1cdTAwM2Vzd2FwKTtcbiBcdFx0Y2lfZW5kID0gY2lfb2ZmICYjNDM7IGZvbGlvX25yX3BhZ2VzKG9sZCk7XG4tXHRcdHdoaWxlIChjaV9vZmYmIzQzOyYjNDM7IFx1MDAzYyBjaV9lbmQpXG4mIzQzO1x0XHRkbyB7XG4gXHRcdFx0V0FSTl9PTl9PTkNFKHN3cF90Yl90b19mb2xpbyhfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSAhPSBvbGQpO1xuJiM0MztcdFx0fSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiBcdTAwM2MgY2lfZW5kKTtcbiBcdH1cbiB9XG4gXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O2ZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBmaXhlcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL2h1Z2VfbWVtb3J5LmMgYW5kIG1tL3N3YXBfc3RhdGUuYywgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCBoYXMgZnVuY3Rpb25hbCBpbXBhY3QuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBjZWQ0MDBmNzJkNDNhLi5jYzlmN2UwZDQxOTRlIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTM1ODksOSAmIzQzOzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncykKIHsKIAlpbnQgaSA9IDA7CiAKLQkvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqLwotCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKLQkJcmV0dXJuOwogCWZvciAoOzspIHsKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpOwogCQlpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CkBAIC0zNzU1LDggJiM0MzszNzUyLDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLAogfQogCiAvKioKLSAqIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSAtIHNwbGl0cyBhbiB1bm1hcHBlZCBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zIGluCi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC4KJiM0MzsgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIC0gc3BsaXRzIGEgZnJvemVuIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MKJiM0MzsgKiBpbiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC4KICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvCiAgKiBAbmV3X29yZGVyOiB0aGUgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyIHNwbGl0IGZvbGlvcyAoc2luY2UgYnVkZHkKICAqICAgICAgICAgICAgIGFsbG9jYXRvciBsaWtlIHNwbGl0IGdlbmVyYXRlcyBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbSBAZm9saW8mIzM5O3MKQEAgLTM3NjQsNyAmIzQzOzM3NjEsNiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBAc3BsaXRfYXQ6IGluIGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQKICAqICAgICAgICAgICAgd2lsbCBiZSBzcGxpdCB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyLgogICogQHhhczogeGFfc3RhdGUgcG9pbnRpbmcgdG8gZm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMgYW5kIGxvY2tlZCBieSBjYWxsZXIKLSAqIEBtYXBwaW5nOiBAZm9saW8tJmd0O21hcHBpbmcKICAqIEBzcGxpdF90eXBlOiBpZiB0aGUgc3BsaXQgaXMgdW5pZm9ybSBvciBub3QgKGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0KQogICoKICAqCkBAIC0zNzk1LDExICYjNDM7Mzc5MSwxMiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCAmbHQ7MCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlCiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spCiAgKi8KLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAomIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQomIzQzOwkJZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiAJY29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKJiM0MzsJY29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAlpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7CiAJc3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbzsKQEAgLTM4MTQsMTEgJiM0MzszODExLDExIEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogCSAgICAgc3BsaXRfb3JkZXItLSkgewogCQlpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCAmbHQ7Jmx0OyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpOwogCi0JCS8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJaWYgKGlzX2Fub24gJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQomIzQzOwkJLyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KJiM0MzsJCWlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpICZhbXA7JmFtcDsgc3BsaXRfb3JkZXIgPT0gMSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChtYXBwaW5nKSB7CiYjNDM7CQlpZiAoeGFzKSB7CiAJCQkvKgogCQkJICogdW5pZm9ybSBzcGxpdCBoYXMgeGFzX3NwbGl0X2FsbG9jKCkgY2FsbGVkIGJlZm9yZQogCQkJICogaXJxIGlzIGRpc2FibGVkIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnksIHdoZXJlYXMKQEAgLTM4NzgsMzIgJiM0MzszODc1LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJCSAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKJiM0MzsKIAlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAkvKgogCSAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlCi0JICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4KLQkgKgotCSAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZQotCSAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLgomIzQzOwkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8KJiM0MzsJICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuCiAJICovCi0JaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWlzX3N3YXBjYWNoZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi8KLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qCi0JICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMAotCSAqCi0JICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbQotCSAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnkKLQkgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkCi0JICogaGVyZS4KJiM0MzsJICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZQomIzQzOwkgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gJmFtcDsgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdAomIzQzOwkgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGQKJiM0MzsJICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LgogCSAqLwotCWlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgJmFtcDsmYW1wOyBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKJiM0MzsJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkxMSwzOSAmIzQzOzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAlpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKQogCQlyZXR1cm4gLUVCVVNZOwogCiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhCiYjNDM7CSAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0JiMzOTtzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvcgomIzQzOwkgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW0KJiM0MzsJICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkCiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGUKJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXQKJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIKJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG8KJiM0MzsgKiAgICAgICAgICB0aGUgTFJVIGxpc3QKJiM0MzsgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzCiYjNDM7ICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlcwomIzQzOyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLAomIzQzOwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7NDAwMSwyNTYgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiAKLQkJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIHBvc3Qtc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzCiYjNDM7CSAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnQKJiM0MzsJICogc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvIGZvciBhIHN1YgomIzQzOwkgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLgomIzQzOwkgKi8KJiM0MzsJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKJiM0MzsJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7CiYjNDM7CQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sCiYjNDM7CQkJCSAgIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKIAkJaWYgKGRvX2xydSkKLQkJCWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CQlpZiAoY2kpCiYjNDM7CQkJX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pOwomIzQzOwl9CiAKLQkJcmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLAotCQkJCQkgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpOwomIzQzOwl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKIAotCQkvKgotCQkgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0Ci0JCSAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZQotCQkgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3MKLQkJICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZgotCQkgKiBAZm9saW8uCi0JCSAqLwotCQlmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvOwotCQkgICAgIG5ld19mb2xpbyA9IG5leHQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pOwomIzQzOwlpZiAoZG9fbHJ1KQomIzQzOwkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwlpZiAoY2kpCiYjNDM7CQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKJiM0MztvdXRfbm9fc3BsaXQ6CiYjNDM7CWxvY2FsX2lycV9lbmFibGUoKTsKJiM0MzsJaWYgKGFub25fdm1hKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3ZtYSkgewomIzQzOwkJYW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTsKJiM0MzsJCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7CiYjNDM7CX0KIAotCQkJbmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiAKLQkJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7LyoqCiYjNDM7ICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW8KJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZCBhbmQgZmlsZS1iYWNrZWQKJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZQomIzQzOyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KQomIzQzOyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdAomIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlcgomIzQzOyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTEwKJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpCiYjNDM7ICoKJiM0MzsgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0cwomIzQzOyAqIHJlZmNvdW50LCBhbmQgcGVyZm9ybSB0aGUgc3BsaXQsIHVwZGF0ZXMgdGhlIHBhZ2UgY2FjaGUgZW50cmllcy4gU3BsaXQKJiM0MzsgKiBmb2xpb3MgYXJlIHVuZnJvemVuIGJ1dCBub3QgcmVtYXBwZWQsIHRoZXkgYXJlIGZhdWx0ZWQgYmFjayBpbiBvbiBkZW1hbmQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4gKGlmIC1FTk9NRU0KJiM0MzsgKiBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlcikKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiYjNDM7CQkJCQkgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAomIzQzOwkJCQkJICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQomIzQzO3sKJiM0MzsJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby0mZ3Q7bWFwcGluZzsKJiM0MzsJWEFfU1RBVEUoeGFzLCAmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiYjNDM7CWxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7CiYjNDM7CXN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDsKJiM0MzsJaW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgbWluX29yZGVyOwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiYjNDM7CXBnb2ZmX3QgZW5kID0gMDsKJiM0MzsJZ2ZwX3QgZ2ZwOwomIzQzOwlpbnQgcmV0ID0gMDsKIAotCQkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKLQkJCQkJICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiYjNDM7CW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwomIzQzOwlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWlmIChkb19scnUpCi0JCQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkvKgomIzQzOwkgKiBTd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAomIzQzOwkgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuCiYjNDM7CSAqLwomIzQzOwltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwomIzQzOwlvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTsKIAotCQkJLyoKLQkJCSAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuCi0JCQkgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJICovCi0JCQlpZiAoY2kpIHsKLQkJCQlfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmYW1wOyBHRlBfUkVDTEFJTV9NQVNLKTsKJiM0MzsJaWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHsKJiM0MzsJCXJldCA9IC1FQlVTWTsKJiM0MzsJCWdvdG8gZmFpbF9mcmVlOwomIzQzOwl9CiAKLQkJCS8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi8KLQkJCWlmICghbWFwcGluZykKLQkJCQljb250aW51ZTsKJiM0MzsJbWFwcGluZ19zZXRfdXBkYXRlKCZhbXA7eGFzLCBtYXBwaW5nKTsKIAotCQkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCi0JCQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewotCQkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAotCQkJCQkgICBuZXdfZm9saW8sIDApOwotCQkJCWNvbnRpbnVlOwotCQkJfQomIzQzOwlpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHsKJiM0MzsJCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAKLQkJCVZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7Ci0JCQkvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC0mZ3Q7aW5kZXggJmd0Oz0gZW5kICovCi0JCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSAmYW1wOyZhbXA7IG5yX3NobWVtX2Ryb3BwZWQpCi0JCQkJKm5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwotCQkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQotCQkJCWZvbGlvX2FjY291bnRfY2xlYW5lZCgKLQkJCQkJbmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7Ci0JCQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7Ci0JCQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKJiM0MzsJCXhhc19zZXRfb3JkZXIoJmFtcDt4YXMsIGZvbGlvLSZndDtpbmRleCwgbmV3X29yZGVyKTsKJiM0MzsJCXhhc19zcGxpdF9hbGxvYygmYW1wO3hhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTsKJiM0MzsJCWlmICh4YXNfZXJyb3IoJmFtcDt4YXMpKSB7CiYjNDM7CQkJcmV0ID0geGFzX2Vycm9yKCZhbXA7eGFzKTsKJiM0MzsJCQlnb3RvIGZhaWxfZnJlZTsKIAkJfQomIzQzOwl9CiAKLQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7Ci0JCS8qCi0JCSAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoCi0JCSAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy4KLQkJICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW8KLQkJICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqLwotCQlmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiYjNDM7CWlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7CiAKLQkJaWYgKGRvX2xydSkKLQkJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsX21tYXBfdW5sb2NrOwomIzQzOwl9CiAKLQkJaWYgKGNpKQotCQkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGRlcXVldWVfZGVmZXJyZWQpIHsKLQkJCWxpc3RfbHJ1X3VubG9jayhscnUpOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CS8qCiYjNDM7CSAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kCiYjNDM7CSAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlCiYjNDM7CSAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay4KJiM0MzsJICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsCiYjNDM7CSAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuCiYjNDM7CSAqLwomIzQzOwllbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy0mZ3Q7aG9zdCksIFBBR0VfU0laRSk7CiYjNDM7CWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctJmd0O2hvc3QsIGVuZCk7CiYjNDM7CiYjNDM7CXVubWFwX2ZvbGlvKGZvbGlvKTsKJiM0MzsKJiM0MzsJeGFzX2xvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KJiM0MzsJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCiYjNDM7CSAqLwomIzQzOwlpZiAoeGFzX2xvYWQoJmFtcDt4YXMpICE9IGZvbGlvKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICYjNDM7IDEpKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgJmFtcDsmYW1wOyBuZXdfb3JkZXIgJmx0OyBIUEFHRV9QTURfT1JERVIpIHsKJiM0MzsJCWlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKQomIzQzOwkJCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqLwomIzQzOwlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgc3BsaXRfdHlwZSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKJiM0MzsJICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlCiYjNDM7CSAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvcwomIzQzOwkgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mCiYjNDM7CSAqIEBmb2xpby4KJiM0MzsJICovCiYjNDM7CWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87CiYjNDM7CSAgICAgbmV3X2ZvbGlvID0gbmV4dCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQkvKiBjb21wdXRlIG5leHQgYmVmb3JlIHRoZSBmb2xpbyBjYW4gYmUgZnJlZWQgYmVsb3cgKi8KJiM0MzsJCW5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICYjNDM7IDEpOwomIzQzOwomIzQzOwkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwomIzQzOwkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCiYjNDM7CQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewomIzQzOwkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAomIzQzOwkJCQkgICBuZXdfZm9saW8sIDApOwomIzQzOwkJCWNvbnRpbnVlOwogCQl9Ci0JCXJldHVybiAtRUFHQUlOOwomIzQzOwomIzQzOwkJLyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtJmd0O2luZGV4ICZndDs9IGVuZCAqLwomIzQzOwkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQkJbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7CiYjNDM7CQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCiYjNDM7CQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbywKJiM0MzsJCQkJCSAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKJiM0MzsJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKJiM0MzsJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaAomIzQzOwkgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuCiYjNDM7CSAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvCiYjNDM7CSAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKi8KJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgJiM0MzsgMSk7CiYjNDM7CWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MztmYWlsOgomIzQzOwkvKgomIzQzOwkgKiBJZiB3ZSB3YW50IHRvIHVzZSB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUgaW4gdW5tYXBfZm9saW8sCiYjNDM7CSAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LgomIzQzOwkgKi8KJiM0MzsJeGFzX3VubG9ja19pcnEoJmFtcDt4YXMpOwomIzQzO2ZhaWxfbW1hcF91bmxvY2s6CiYjNDM7CWlmIChucl9zaG1lbV9kcm9wcGVkKQomIzQzOwkJc2htZW1fdW5jaGFyZ2UobWFwcGluZy0mZ3Q7aG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7CiYjNDM7CS8qCiYjNDM7CSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCiYjNDM7CSAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSwgc28gZXZpY3Rpb24gY2Fubm90IGZyZWUKJiM0MzsJICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvcgomIzQzOwkgKiB0aGUgbWFwcGluZy4KJiM0MzsJICovCiYjNDM7CWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKJiM0MztmYWlsX2ZyZWU6CiYjNDM7CS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovCiYjNDM7CXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKJiM0MzsJbWVtX2Nncm91cF9wdXQobWVtY2cpOwomIzQzOwl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDA4Niw5ICYjNDM7NDI2Myw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuCiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMCiAgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpCiAgKgotICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuCiYjNDM7ICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LgogICogSXQgaXMgaW4gY2hhcmdlIG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlIHNwbGl0IGlzIHN1cHBvcnRlZCBvciBub3QgYW5kCi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuCiYjNDM7ICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS4KICAqCiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBhZnRlci1zcGxpdCBmb2xpbyBjb250YWluaW5nIEBsb2NrX2F0IHJlbWFpbnMgbG9ja2VkCiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDoKQEAgLTQxMDIsMTcgJiM0Mzs0Mjc5LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKLQlYQV9TVEFURSh4YXMsICZhbXA7Zm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CWJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiAJYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMOwotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwotCWludCBucl9zaG1lbV9kcm9wcGVkID0gMDsKLQllbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwOwotCXBnb2ZmX3QgZW5kID0gMDsKIAlpbnQgcmV0OwogCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKQEAgLTQxMjAsMTQxICYjNDM7NDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAogCWlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG5ld19vcmRlciAmZ3Q7PSBvbGRfb3JkZXIpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfbm9fbWVtY2c7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpOwogCWlmIChyZXQpIHsKIAkJVk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCAmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpbyYjMzQ7KTsKLQkJZ290byBvdXRfbm9fbWVtY2c7Ci0JfQotCi0JLyoKLQkgKiBzd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAotCSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KLQkgKi8KLQltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwotCW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwotCi0JaWYgKGlzX2Fub24pIHsKLQkJLyoKLQkJICogVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkCi0JCSAqIHByZXZlbnQgdGhlIGFub25fdm1hIGRpc2FwcGVhcmluZyBzbyB3ZSBmaXJzdCB3ZSB0YWtlIGEKLQkJICogcmVmZXJlbmNlIHRvIGl0IGFuZCB0aGVuIGxvY2sgdGhlIGFub25fdm1hIGZvciB3cml0ZS4gVGhpcwotCQkgKiBpcyBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCBleGNlcHQgdGhlIHdyaXRlIGxvY2sKLQkJICogaXMgdGFrZW4gdG8gc2VyaWFsaXNlIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UKLQkJICogb3BlcmF0aW9ucy4KLQkJICovCi0JCWFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTsKLQkJaWYgKCFhbm9uX3ZtYSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBtaW5fb3JkZXI7Ci0JCWdmcF90IGdmcDsKLQotCQltYXBwaW5nID0gZm9saW8tJmd0O21hcHBpbmc7Ci0JCW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwotCQlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJmFtcDsKLQkJCQkJCQlHRlBfUkVDTEFJTV9NQVNLKTsKLQotCQlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwotCi0JCWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewotCQkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwotCQkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwotCQkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKLQkJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJYW5vbl92bWEgPSBOVUxMOwotCQlpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpOwotCi0JCS8qCi0JCSAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZAotCQkgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZQotCQkgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suCi0JCSAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LAotCQkgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLgotCQkgKi8KLQkJZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctJmd0O2hvc3QpLCBQQUdFX1NJWkUpOwotCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSkKLQkJCWVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLSZndDtob3N0LCBlbmQpOwotCX0KLQotCS8qCi0JICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGwKLQkgKiBzcGxpdCBQTURzCi0JICovCi0JaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXVubWFwX2ZvbGlvKGZvbGlvKTsKLQotCS8qIGJsb2NrIGludGVycnVwdCByZWVudHJ5IGluIHhhX2xvY2sgYW5kIHNwaW5sb2NrICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAobWFwcGluZykgewotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgotCQkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KLQkJICovCi0JCXhhc19sb2NrKCZhbXA7eGFzKTsKLQkJeGFzX3Jlc2V0KCZhbXA7eGFzKTsKLQkJaWYgKHhhc19sb2FkKCZhbXA7eGFzKSAhPSBmb2xpbykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWdvdG8gZmFpbDsKLQkJfQomIzQzOwkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgbWFwcGluZywKLQkJCQkJCXRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgJmFtcDtucl9zaG1lbV9kcm9wcGVkKTsKLWZhaWw6Ci0JaWYgKG1hcHBpbmcpCi0JCXhhc191bmxvY2soJmFtcDt4YXMpOwotCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JaWYgKG5yX3NobWVtX2Ryb3BwZWQpCi0JCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwotCi0JaWYgKCFyZXQgJmFtcDsmYW1wOyBpc19hbm9uICZhbXA7JmFtcDsgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkKLQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7Ci0KLQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKLQotCS8qCi0JICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXMKLQkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvCi0JICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5Ci0JICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2UKLQkgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy4KLQkgKi8KLQlpZiAobWFwcGluZykgewotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0KJiM0MzsJaWYgKGlzX2Fub24pCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsCiYjNDM7CQkJCQkJICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZSBpZiAoaXNfc3dhcGNhY2hlKQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpOwomIzQzOwllbHNlCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwKJiM0MzsJCQkJCQkJICBsaXN0LCBzcGxpdF90eXBlKTsKIAogCS8qCiAJICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZwpAQCAtNDI2NSwyOSAmIzQzOzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCWlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkKIAkJCWNvbnRpbnVlOwogCi0JCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwogCQkvKgogCQkgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWQKIAkJICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlCi0JCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWwKJiM0MzsJCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiAJCSAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuCiAJCSAqLwotCQlmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7CiYjNDM7CQlpZiAoaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgIWZvbGlvX21hcHBlZChuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fdW5sb2NrKG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19wdXQobmV3X2ZvbGlvKTsKIAl9CiAKLW91dF91bmxvY2s6Ci0JaWYgKGFub25fdm1hKSB7Ci0JCWFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7Ci0JfQotCWlmIChtYXBwaW5nKQotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiBvdXQ6Ci0JLyogcmVzdG9yZSB0byBjYWxsZXImIzM5O3Mgb2xkX21lbWNnICovCi0Jc2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpOwotCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKLW91dF9ub19tZW1jZzoKLQl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJaWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKQogCQljb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpOwogCWNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTsKQEAgLTQzMTEsMjkgJiM0Mzs0MzYwLDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogICogaXNvbGF0ZWQgZnJvbSBMUlUgKGlmIGFwcGxpY2FibGUpCiAgKgogICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSwKLSAqIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLgomIzQzOyAqIGZvbGlvX2ZyZWVfc3dhcCgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvCiAgKiAgICAgICAgIGluc3VmZmljaWVudCByZWZlcmVuY2UgY291bnQgb3IgZXh0cmEgcGlucykuCiAgKi8KIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewotCWludCByZXQgPSAwOwotCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sYXJnZShmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKIAotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIE5VTEwsCi0JCQkJCQlOVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLAotCQkJCQkJMCwgTlVMTCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJldHVybiByZXQ7CiYjNDM7CXJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgJmFtcDtmb2xpby0mZ3Q7cGFnZSwgZmFsc2UsCiYjNDM7CQkJCQkgICAgICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTsKIH0KIAogLyoKQEAgLTQzNTIsMTAgJiM0Mzs0MzkyLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyCiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi4KICAqCi0gKiA0KSBAbmV3X29yZGVyICZndDsgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3QKLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIHdoaWNoCi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMQotICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKJiM0MzsgKiA0KSBAbmV3X29yZGVyICE9IDEgZm9yIGFub24gb3Igc3dhcGNhY2hlLiBBbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IKJiM0MzsgKiAgICBfZGVmZXJyZWRfbGlzdCwgd2hpY2ggb3JkZXItMSBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heQomIzQzOyAqICAgIGJlY29tZSBhbm9uIG9uY2UgZmF1bHRlZCBpbi4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKICAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC4KICAqCiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBjYWxsZXImIzM5O3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsCkBAIC00Mzg0LDcgJiM0Mzs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiB3aXRoIHRoZSBmb2xpby4gU3BsaXR0aW5nIHRvIG9yZGVyIDAgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBmb2xpb3MuCiAgKi8KIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotCQkJCSAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcikKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiB7CiAJc3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiAKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0zODksOCAmIzQzOzM4OSw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7CiAJCWNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtJmd0O3N3YXApOwogCQljaV9lbmQgPSBjaV9vZmYgJiM0MzsgZm9saW9fbnJfcGFnZXMob2xkKTsKLQkJd2hpbGUgKGNpX29mZiYjNDM7JiM0MzsgJmx0OyBjaV9lbmQpCiYjNDM7CQlkbyB7CiAJCQlXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7CiYjNDM7CQl9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmICZsdDsgY2lfZW5kKTsKIAl9CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI4NzkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA0OTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgS2VybmVsIE1lbW9yeSBNYW5hZ2VtZW50IFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQmIzM5O3MgdG91Y2hlZCBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBJdCBsb29rcyBsaWtlIHRoZXkmIzM5O3JlIHJld29ya2luZyB0aGUgZm9saW8gc3BsaXR0aW5nIGxvZ2ljLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gU3BlY2lmaWNhbGx5LCBpdCYjMzk7cyBhYm91dCBob3cgd2UgaGFuZGxlIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBUaGV5JiMzOTt2ZSByZW5hbWVkIGBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCB0byBgX19zcGxpdF9mcm96ZW5fZm9saW9gLCB3aGljaCBpcyBhIGdvb2QgaW5kaWNhdG9yIG9mIHNvbWUgdW5kZXJseWluZyBjaGFuZ2UgaW4gc2VtYW50aWNzLCBhbmQgdGhleSYjMzk7dmUgYWRkZWQgbmV3IGhlbHBlcnMgbGlrZSBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCBhbmQgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlYC4gYF9fZm9saW9fc3BsaXRgIGhhcyBhbHNvIGJlZW4gcmVmYWN0b3JlZCB0byB1c2UgdGhlIG5ldyBoZWxwZXJzLiBUaGUgcGF0Y2ggYWxzbyBtb2RpZmllcyBob3cgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGhhbmRsZXMgc3dhcGNhY2hlIGZvbGlvcy4gQW5kLCBpbXBvcnRhbnRseSwgdGhlcmUmIzM5O3MgYSBjaGFuZ2UgaW4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCB0b28uCgpNeSBndXQgc2F5cyB0aGlzIGlzIGRlZmluaXRlbHkgd29ydGggYSBjbG9zZXIgbG9vaywgZXNwZWNpYWxseSBmb3IgZnV6emluZy4gVGhpcyB0b3VjaGVzICpjb3JlKiBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIOKAkyBUSFAsIGZvbGlvIHNwbGl0dGluZywgYW5kIHN3YXAuIFRoZXNlIGFyZSBwcmltZSB0YXJnZXRzIGZvciBleHBvc2luZyBzdWJ0bGUgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWVzLiBJdCYjMzk7cyBoaWdoLXZhbHVlLCBwb3RlbnRpYWxseSBoaWdoLXJpc2ssIHNvIGxldCYjMzk7cyBkaWcgZGVlcGVyLgoKU28sIGxldCYjMzk7cyBpZGVudGlmeSB0aGUga2V5IHN5bWJvbHMgaW4gdGhpcyBwYXRjaC4gSSYjMzk7dmUgZ290OiBgcmVtYXBfcGFnZWAsIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnRgLCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCwgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlYCwgYF9fZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLgoKTm93LCB0aGUgaW1wb3J0YW50IG9uZXMgZm9yIGEgZnV6emluZyBwZXJzcGVjdGl2ZSBhcmUgdGhvc2UgdGhhdCBhcmUgZ2xvYmFsbHkgYWNjZXNzaWJsZSBvciBleHRlcm5hbGx5IHZpc2libGUgYW5kIG5vdCBpbmxpbmVkOiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCwgYW5kIG1heWJlIGV2ZW4gYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gSXQgd291bGQgYmUgd2lzZSB0byBzZWFyY2ggZm9yIHVzYWdlcyBvZiB0aGVzZSB0byB1bmRlcnN0YW5kIHJlYWNoYWJpbGl0eSBhbmQgY3JlYXRlIHRlc3RzLgoKQWxyaWdodCwgdGltZSB0byBnZXQgc2VhcmNoaW5nIGFuZCB1bmRlcnN0YW5kIGhvdyB0aGVzZSBmaXQgaW50byB0aGUgbGFyZ2VyIG1lbW9yeSBtYW5hZ2VtZW50IHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XihpbnR8dm9pZHxib29sKSAuKmZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDA3PWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA4OmludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDktXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9Mzc5ND1zdGF0aWMgaW50IF9fc3BsaXRfZnJvemVuX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zODc0LSAqL1xubW0vaHVnZV9tZW1vcnkuYzozODc1OmludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5tbS9odWdlX21lbW9yeS5jLTM4NzYtXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQxMzYKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiA5MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSBtZW50YWwgbWFwcGluZyBwcm9jZXNzLCBhcyBJIHVuZGVyc3RhbmQgaXQ6CgoqKk1hcHBpbmcgS2V5IEZ1bmN0aW9ucyB0byBNZW1vcnkgTWFuYWdlbWVudCBTdHJ1Y3R1cmVzKioKCk9rYXksIHNvIEkmIzM5O20gZHJpbGxpbmcgZG93biBpbnRvIHNvbWUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuIEkmIzM5O20gbm90aW5nIHRoYXQgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGFyZSBhbGwgY2x1c3RlcmVkIGluIGBtbS9odWdlX21lbW9yeS5jYC4gVGhhdCBwbGFjZW1lbnQgaXMgZXhhY3RseSB3aGF0IEkgd291bGQgZXhwZWN0LCB0aGV5IGFyZSBhbGwgd29ya2luZyBvbiBvcGVyYXRpb25zIHJlbGF0ZWQgdG8gc3BsaXR0aW5nIGFuZCBtYW5hZ2luZyBodWdlIHBhZ2VzLCBzbyBjbGVhcmx5IHRoZXkgYXJlIG9yZ2FuaXplZCBsb2dpY2FsbHkgaW4gdGhlIGh1Z2UgbWVtb3J5IG1hbmFnZW1lbnQgYXJlYS4gVGhlIGNvbW1vbiBkaXJlY3RvcnkgbWFrZXMgcGVyZmVjdCBzZW5zZS4KClRoZW4gdGhlcmUmIzM5O3MgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhhdCBvbmUmIzM5O3MgaW4gYG1tL3N3YXBfc3RhdGUuY2AuIEhtbSwgcmlnaHQsIHRoYXQmIzM5O3MgcmVsYXRlZCB0byBzd2FwcGluZywgd2hpY2ggbWFrZXMgdG90YWwgc2Vuc2UuIEkmIzM5O20gbWVudGFsbHkgZmlsaW5nIHRoaXMgdW5kZXIgJiMzNDtzd2FwIGNhY2hlIGludGVyYWN0aW9uLiYjMzQ7IEl0IHNlZW1zIHRvIGJlIGEgZnVuY3Rpb24gZGVhbGluZyB3aXRoIHJlcGxhY2luZyBhIGZvbGlvIGluIHRoZSBzd2FwIGNhY2hlLCB3aGljaCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBodWdlIHBhZ2Ugc3BsaXR0aW5nL21hbmFnZW1lbnQsIGhlbmNlIHRoZSBkaWZmZXJlbnQgZmlsZS4gR29vZCBvcmdhbml6YXRpb24gdGhlcmUsIHRvby4gSSBhcHByZWNpYXRlIHRoZSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLCB0aGUgbW9kdWxlIG9yZ2FuaXphdGlvbiBpcyBzYW5lIGFuZCBsb2dpY2FsLiBJIGNhbiBxdWlja2x5IGRldGVybWluZSB0aGUgY29udGV4dCBmb3IgYSBnaXZlbiBmdW5jdGlvbiBieSBrbm93aW5nIGl0cyBsb2NhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKGludHx2b2lkfGJvb2wpIC4qZm9saW9fc3BsaXRfdW5tYXBwZWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwNTppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00Mjc4PXN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDM2Ny0gKi9cbm1tL2h1Z2VfbWVtb3J5LmM6NDM2ODppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbm1tL2h1Z2VfbWVtb3J5LmMtNDM2OS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ3NTYKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgKioKCk9rYXksIHRpbWUgdG8gZGl2ZSBpbnRvIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gVGhpcyBmdW5jdGlvbiBpcyBsaWtlbHkgYSBjcml0aWNhbCBwaWVjZSBvZiBtZW1vcnkgbWFuYWdlbWVudCwgcHJvYmFibHkgd2l0aGluIGEgdmlydHVhbCBtZW1vcnkgc3lzdGVtLiBHaXZlbiB0aGUgbmFtZSwgSSYjMzk7bSBndWVzc2luZyBpdCBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIGJyZWFraW5nIGRvd24gYSBsYXJnZSwgJiMzNDtodWdlJiMzNDsgcGFnZSBpbnRvIHNtYWxsZXIsIG1vcmUgbWFuYWdlYWJsZSB1bml0cywgYW5kIHRoZW4sIGNydWNpYWxseSwgcGxhY2luZyB0aG9zZSBzbWFsbGVyIHBhZ2VzIGludG8gc29tZSBraW5kIG9mIG9yZGVyZWQgc3RydWN0dXJlIOKAkyBwcm9iYWJseSBhIGxpbmtlZCBsaXN0LCBxdWV1ZSwgb3IgcGVyaGFwcyBldmVuIGEgdHJlZSBpZiB0aGUgb3JkZXIgaXMgY29tcGxleC4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBsb29rIGZvciBob3cgdGhlIGZ1bmN0aW9uIGRldGVybWluZXMgKndoeSogaXQgbmVlZHMgdG8gc3BsaXQgdGhlIHBhZ2UuIElzIGl0IGR1ZSB0byBmcmFnbWVudGF0aW9uLCBtZW1vcnkgcHJlc3N1cmUsIGEgc3BlY2lmaWMgYWxsb2NhdGlvbiByZXF1ZXN0IHRoYXQgZG9lc24mIzM5O3QgYWxpZ24gd2l0aCBhIGh1Z2UgcGFnZSBib3VuZGFyeSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFRoZSAmIzM5O3RvX29yZGVyJiMzOTsgcGFydCBzdWdnZXN0cyB0aGF0IHRoZSBzcGxpdCBpc24mIzM5O3QganVzdCBhIGJhc2ljIGRlY29tcG9zaXRpb247IHRoZXJlJiMzOTtzIGFuIG9yZGVyaW5nIHJlcXVpcmVtZW50IGludm9sdmVkLiBUaGF0IG1ha2VzIG1lIHdvbmRlciB3aGF0IHRoZSBvcmRlcmluZyBjcml0ZXJpYSBhcmUg4oCTIGFyZSB3ZSB0YWxraW5nIGFib3V0IHBoeXNpY2FsIGFkZHJlc3MsIHZpcnR1YWwgYWRkcmVzcywgb3Igc29tZXRoaW5nIG1vcmUgbnVhbmNlZCBsaWtlIHVzYWdlIHBhdHRlcm5zIG9yIGFjY2VzcyBmcmVxdWVuY3k/CgpJIG5lZWQgdG8gcXVpY2tseSBncmFzcCB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBvcmRlcmluZy4gV2hhdCBraW5kIG9mIG92ZXJoZWFkIGlzIGludHJvZHVjZWQgYnkgdGhpcyBvcmRlcmVkIHN0cnVjdHVyZT8gV2hhdCBhbGdvcml0aG1zIGFyZSBiZWluZyB1c2VkIHRvIG1haW50YWluIHRoaXMgb3JkZXIgZWZmaWNpZW50bHk/IEFuZCwgb2YgY291cnNlLCB3aGF0IGFyZSB0aGUgaW1wbGljYXRpb25zIG9uIHBlcmZvcm1hbmNlPyBBcmUgd2Ugb3B0aW1pemluZyBmb3IgYWxsb2NhdGlvbiBzcGVlZCwgZGVhbGxvY2F0aW9uIHNwZWVkLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gSG93IGRvZXMgdGhlIGNob3NlbiBkYXRhIHN0cnVjdHVyZSBzY2FsZSB3aXRoIHRoZSBudW1iZXIgb2Ygc3BsaXQgcGFnZXM/IFRoaXMgYWxzbyBiZWdzIHRoZSBxdWVzdGlvbiBvZiBob3cgdGhlIGh1Z2UgcGFnZSBpdHNlbGYgaXMgbWFuYWdlZCAqYmVmb3JlKiBhbmQgKmFmdGVyKiB0aGUgc3BsaXQg4oCTIGRvIHdlIG5lZWQgdG8gdHJhY2sgaXQgYXMgYSBwYXJ0aWFsbHktdXNlZCBlbnRpdHk/IElzIHRoZXJlIGFueSBtZWNoYW5pc20gZm9yICYjMzQ7cmUtbWVyZ2luZyYjMzQ7IHNtYWxsZXIgcGFnZXMgYmFjayBpbnRvIGEgaHVnZSBwYWdlIGxhdGVyIG9uPyBUaGlzIGlzIGNyaXRpY2FsIGZvciBhdm9pZGluZyBmdXJ0aGVyIGZyYWdtZW50YXRpb24uIEkgYWxzbyB3YW50IHRvIGNoZWNrIGZvciBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBoZXJlLiBUaGUgZnVuY3Rpb24gbGlrZWx5IHdpbGwgb3BlcmF0ZSBvbiBzaGFyZWQgbWVtb3J5IHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBhIHJhY2UgY29uZGl0aW9uLgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgbGFyZ2VyIGNvZGUgY29udGV4dCBpcy4gV2hhdCBwcm9jZXNzIG9yIHN1YnN5c3RlbSBjYWxscyB0aGlzIGZ1bmN0aW9uPyBUaGUgY29udGV4dCB3aWxsIHNoZWQgbGlnaHQgb24gd2hhdCB0aGUgZGVzaWduIGdvYWxzIGFuZCB0cmFkZS1vZmZzIGFyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKGludHx2b2lkfGJvb2wpIC4qX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXHRcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDM2OD1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MjQtICovXG5tbS9odWdlX21lbW9yeS5jOjQ0MjU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5tbS9odWdlX21lbW9yeS5jLTQ0MjYtXHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTQ5MAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipEaXZpbmcgaW50byBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGd1dHMgb2YgdGhlIHN3YXAgY2FjaGUgcmVwbGFjZW1lbnQgbG9naWMuIExldCYjMzk7cyBzZWUgaG93IGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgaXMgaGFuZGxpbmcgdGhpbmdzLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgZXhhY3QgbWVjaGFuaWNzIG9mIHRoaXMgZnVuY3Rpb24gaW4gcGFydGljdWxhci4gV2hhdCYjMzk7cyBpdCBkb2luZyB3aGVuIGEgZm9saW8gbmVlZHMgdG8gYmUgc3dhcHBlZCBvdXQ/IEhvdyYjMzk7cyBpdCBtYWtpbmcgcmVwbGFjZW1lbnQgZGVjaXNpb25zPyBXZSBrbm93IGhvdyBjcml0aWNhbCB0aGlzIGlzIGZvciBwZXJmb3JtYW5jZSwgc28gSSYjMzk7bSBob3BpbmcgdG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIGl0cyBpbXBhY3QgYW5kIHBvdGVudGlhbCBib3R0bGVuZWNrcy4gTm8gdGltZSB0byB3YXN0ZSwgbGV0JiMzOTtzIGxvb2sgdW5kZXIgdGhlIGhvb2QhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O14oaW50fHZvaWR8Ym9vbCkgLipfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zd2FwLmg9MzIxPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcC5oLTMyMi1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XG5tbS9zd2FwLmg6MzIzOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zMjQtXHRcdFx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpO1xuLS1cbm1tL3N3YXBfc3RhdGUuYz0zMzY9dm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3N3YXBfc3RhdGUuYy0zNjEtICovXG5tbS9zd2FwX3N0YXRlLmM6MzYyOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXBfc3RhdGUuYy0zNjMtXHRcdFx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1OTA4CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipDaGVja2luZyBhIFBvdGVudGlhbCBCb3R0bGVuZWNrKioKCk9rYXksIHNvIEkmIzM5O20ganVzdCBxdWlja2x5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgbWVudGFsIGNoZWNrbGlzdCBoZXJlLiBJJiMzOTttIGZvY3VzaW5nIGluIG9uIHRoZSBkYXRhIHByb2Nlc3Npbmcgc2lkZSBvZiB0aGluZ3MsIHNwZWNpZmljYWxseSBvbiB0aGlzIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgZnVuY3Rpb24uIEl0JiMzOTtzIGEgcHJpbWUgc3VzcGVjdCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzIGdpdmVuIHRoZSBzY2FsZSBvZiBkYXRhIHdlJiMzOTtyZSBsaWtlbHkgZGVhbGluZyB3aXRoLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBlZmZpY2llbnQsIHBhcnRpY3VsYXJseSBjb25jZXJuaW5nIG1lbW9yeSBhbGxvY2F0aW9uLCBpdGVyYXRpb24sIGFuZCBhbnkgcG90ZW50aWFsIGluZWZmaWNpZW5jaWVzIHdpdGhpbiBzb3J0aW5nIG9yIGluZGV4aW5nLiBFdmVuIHRob3VnaCBJIGhhdmUgYSBwcmV0dHkgc3Ryb25nIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHN5c3RlbSwgaXQmIzM5O3Mgd2lzZSB0byByZXZpc2l0IGFueSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgYSBsYXJnZSBpbnB1dCBzcGFjZSBqdXN0IHRvIGJlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgc3VidGxlLCBlYXNpbHkgb3Zlcmxvb2tlZCwgYm90dGxlbmVja3MuIFRpbWUgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O14oaW50fHZvaWR8Ym9vbCkgLipzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXHRcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9NDM2OD1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MjQtICovXG5tbS9odWdlX21lbW9yeS5jOjQ0MjU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5tbS9odWdlX21lbW9yeS5jLTQ0MjYtXHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYzNzEKCQkJCQkJCW91dHB1dDogNDIKCQkJCQkJCXRob3VnaHRzOiA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBpbiB0aGUgZmlyc3QgcGVyc29uLCBhcyByZXF1ZXN0ZWQ6CgoqKkRlY29uc3RydWN0aW5nIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAqKgoKUmlnaHQsIGxldCBtZSBzZWUuLi5gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGF0JiMzOTtzIGEgbW91dGhmdWwsIGFuZCBiYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIGl0JiMzOTtzIGFsbW9zdCBjZXJ0YWlubHkgYW4gaW5saW5lIGZ1bmN0aW9uIG9yIGEgbWFjcm8sIGRlc2lnbmVkIGZvciBlZmZpY2llbmN5LiBHaXZlbiB0aGUgY29udGV4dCwgaXQmIzM5O3MgbGlrZWx5IGRlYWxpbmcgd2l0aCBzb21lIGFzcGVjdCBvZiBodWdlIHBhZ2UgbWFuYWdlbWVudCwgcHJvYmFibHkgcmVsYXRlZCB0byBmcmFnbWVudGF0aW9uIG9yIGNvYWxlc2NpbmcuIE9rYXksIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBNeSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGRlZmluaXRpb24uIFRoZSBrZXJuZWwmIzM5O3MgbmFtaW5nIGNvbnZlbnRpb25zIGFyZSB1c3VhbGx5IHByZXR0eSBjb25zaXN0ZW50LCBzbyB0aGUgaGVhZGVyIGZpbGUgZGVmaW5pbmcgaXQgc2hvdWxkIGJlIGluIHRoZSBvYnZpb3VzIHBsYWNlLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCBgaW5jbHVkZS9saW51eC9odWdlX21tLmhgLiBUaGF0JiMzOTtzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgdGhlIG1hZ2ljIGJlaGluZCB0aGlzIGZ1bmN0aW9uLiBUaW1lIHRvIGNoZWNrIGl0IG91dC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXHRcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQxMD1pbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDEyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDEzOnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE1LXtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxNjpcdHJldHVybiBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIGxpc3QsIG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTctfVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDE4PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxOS17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MjA6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyMS19XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDIzPXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyNC17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MjU6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgMCk7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjYtfVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY0NT1zdGF0aWMgaW5saW5lIGludFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjQ2OnNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjQ3LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTgyNj1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyKVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI3LXtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjgyODpcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBOVUxMLCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI5LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTczNTAKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSByZXZpZXdpbmcgdGhpcyBjb2RlOgoKKipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBGdW5jdGlvbnMqKgoKQWxyaWdodCwgc28gYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGRlZmluaXRlbHkgdGhlIGtleSBub24taW5saW5lZCBmdW5jdGlvbiBpbnZvbHZlZCBpbiB0aGlzIGh1Z2UgcGFnZSBzcGxpdHRpbmcgcHJvY2Vzcy4gVGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgbGV0JiMzOTtzIHF1aWNrbHkgc2VlIGlmIHRoZXJlIGFyZSBvdGhlciBwbGF5ZXJzIGluIHRoaXMgcGFydGljdWxhciBkb21haW4uIEFoLCB5ZXMsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgLSBhbGwgb2YgdGhlbSB3YXJyYW50IGEgY2xvc2VyIGxvb2sgdG8gdW5kZXJzdGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgbWFpbiBzcGxpdCBmdW5jdGlvbiwgYW5kIGhvdyBlYWNoIGlzIGludm9sdmVkIGluIHRoZSBvdmVyYWxsIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LgoKTmV4dCwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGNvbmRpdGlvbmFsIGxvZ2ljIGZvciBodWdlIHBhZ2Ugc3BsaXR0aW5nOyBzcGVjaWZpY2FsbHksIEkgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBmZWF0dXJlIGlzLCBpbmRlZWQsIGFjdGl2ZSBhbmQgcmVxdWlyZWQgaW4gdGhpcyBjb2RlIHBhdGguIFRoYXQgd2lsbCBiZSBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyAqd2h5KiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9ODMyPWNvbmZpZyBNTV9JRFxuLS1cbm1tL0tjb25maWctODM0LVxubW0vS2NvbmZpZzo4MzU6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy04MzYtXHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg1Mz1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg1OC1cbm1tL0tjb25maWc6ODU5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NjAtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NjUtXG5tbS9LY29uZmlnOjg2NjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg2Ny1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzQtXG5tbS9LY29uZmlnOjg3NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04NzYtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg4Mj1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg5MS1cbm1tL0tjb25maWc6ODkyOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctODkzLVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDEtXG5tbS9LY29uZmlnOjkwMjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MDMtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDktXG5tbS9LY29uZmlnOjkxMDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkxMS1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTE3LVxubW0vS2NvbmZpZzo5MTg6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTE5LVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTI3PWNob2ljZVxuLS1cbm1tL0tjb25maWctOTM2LVxubW0vS2NvbmZpZzo5Mzc6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05MzgtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk0NS1cbm1tL0tjb25maWc6OTQ2Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk0Ny1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1My1cbm1tL0tjb25maWc6OTU0Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTU1LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NjEtXG5tbS9LY29uZmlnOjk2MjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NjMtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4Mzc5CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiBIdWdlIFBhZ2UgRGVwZW5kZW5jaWVzKioKCk9rYXksIHNvIEkmIzM5O20gZGVhbGluZyB3aXRoIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgaW1tZWRpYXRlbHksIG15IGJyYWluIGZsYWdzIHRoYXQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBkZWZpbml0ZWx5IGEgcmVxdWlyZW1lbnQuIE1ha2VzIHNlbnNlLCBvYnZpb3VzbHkuIE5vdywgdGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byBgbW0vTWFrZWZpbGVgLiBUaGF0JiMzOTtzIHdoZXJlIEkgbmVlZCB0byBjb25maXJtIHRoZSBidWlsZCBkZXBlbmRlbmNpZXMgYW5kIGVuc3VyZSBldmVyeXRoaW5nIGlzIGxpbmtpbmcgY29ycmVjdGx5IGFuZCBhcyBleHBlY3RlZC4gSXQmIzM5O3MgdGhlIHN0YW5kYXJkLCBlZmZpY2llbnQgYXBwcm9hY2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2h1Z2VfbWVtb3J5Lm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICYjNDM7PSBtaWdyYXRlX2RldmljZS5vXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSAmIzQzOz0gaHVnZV9tZW1vcnkubyBraHVnZXBhZ2VkLm9cbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSAmIzQzOz0gcGFnZV9jb3VudGVyLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg2MzcKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIE1lbW9yeSBNYW5hZ2VtZW50IERlcGVuZGVuY2llcyoqCgpBbHJpZ2h0LCBzbyB0aGUgZGlzY3Vzc2lvbiBoYXMgY2xlYXJseSBwb2ludGVkIG91dCB0aGF0IHdlIGFic29sdXRlbHkgbmVlZCB0byBpbmNsdWRlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAg4oCTIG5vIHF1ZXN0aW9uIGFib3V0IHRoYXQuIEl0JiMzOTtzIHRoZSBseW5jaHBpbi4gQnV0IG5vdyBJJiMzOTttIHN0YXJ0aW5nIHRvIHRoaW5rIGFib3V0IGRlcGVuZGVuY2llcyBmdXJ0aGVyIGRvd24gdGhlIGxpbmUuIFdoYXQmIzM5O3MgdGhlIGltcGFjdCBvZiB0aGlzIGNoYW5nZSBvbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUga2VybmVsPyBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjb25zaWRlciBgbW0vc3dhcF9zdGF0ZS5jYC4gSG93IHdpbGwgdGhpcyBuZXcgdHJhbnNwYXJlbnQgaHVnZXBhZ2UgaW1wbGVtZW50YXRpb24gaW50ZXJhY3Qgd2l0aCB0aGUgc3dhcCBtZWNoYW5pc21zPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBjb25mbGljdHMsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLCBvciByYWNlIGNvbmRpdGlvbnMgSSBuZWVkIHRvIGFudGljaXBhdGU/IFRoaXMgaXMgYSBrZXkgYXJlYSB0byBleHBsb3JlIGZ1cnRoZXIsIHNvIEkmIzM5O20gZmlsaW5nIHRoYXQgZm9yIGRlZXBlciBpbnZlc3RpZ2F0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzd2FwX3N0YXRlLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT03Nj1lbmRpZlxubW0vTWFrZWZpbGUtNzctXG5tbS9NYWtlZmlsZTo3ODpvYmotJChDT05GSUdfU1dBUClcdCYjNDM7PSBwYWdlX2lvLm8gc3dhcF9zdGF0ZS5vIHN3YXBmaWxlLm9cbm1tL01ha2VmaWxlLTc5LW9iai0kKENPTkZJR19aU1dBUClcdCYjNDM7PSB6c3dhcC5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4OTM3CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUG90ZW50aWFsIEltcGFjdCBvZiBhIFN3YXAgTW9kaWZpY2F0aW9uKioKCk9rYXksIHNvIGl0IGxvb2tzIGxpa2UgdGhpcyBwYXRjaCBuZWNlc3NpdGF0ZXMgc29tZSBmb3JtIG9mIGBTV0FQYCBoYW5kbGluZy4gTXkgZmlyc3QgaW5zdGluY3QgaXMgYWx3YXlzIHRvIGxvb2sgZm9yIGNvbnRleHQsIHNvIGxldCYjMzk7cyBzZWUgd2hhdCBvdGhlciBjb25maWd1cmF0aW9ucyBtaWdodCBiZSBpbXBhY3RlZC4gTG9va2luZyB0aHJvdWdoIHRoZSBwcm9wb3NlZCBjaGFuZ2VzLCBJIHNlZSB0aGF0IHRoZSBwYXRjaCB0b3VjaGVzIHNldmVyYWwga2V5IGZ1bmN0aW9ucyB0aGF0IGFyZSBhbGwgdmVyeSBpbnRlcmVzdGluZyB0byBtZTogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaGV5IGFsbCBzZWVtIGhpZ2hseSByZWxldmFudC4KCk15IGltbWVkaWF0ZSBmb2N1cywgZ2l2ZW4gbXkgZXhwZXJ0aXNlLCBpcyB0byBjYXJlZnVsbHkgZXhhbWluZSB0aG9zZSBzcGVjaWZpYyBzeW1ib2xzLiBJIG5lZWQgdG8gY29uZmlybSB0aGVzZSBmdW5jdGlvbnMgYXJlIHByZXNlbnQgaW4gdGhlIGtlcm5lbCBhbmQsIGNyaXRpY2FsbHksIGFyZW4mIzM5O3QgZGVjbGFyZWQgYXMgc3RhdGljLiBUaGlzIGNvbmZpcm1zIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBleHRlcm5hbGx5IGF2YWlsYWJsZSBhbmQgY2FuIGJlIHBhdGNoZWQuIEkgbmVlZCB0byBjb25maXJtIHRoZSBkZWZpbml0aW9ucyBhbmQgdXNhZ2Ugb2YgdGhvc2UgZnVuY3Rpb25zLCB3aGF0IGZpbGVzIHVzZSB0aGVtLCBhbmQgd2hhdCB0aGUgZWZmZWN0IHdpbGwgYmUgb2YgbW9kaWZ5aW5nIHRoZW0uIEZyb20gdGhlcmUgSSBjYW4gZGV0ZXJtaW5lIHRoZSBpbXBhY3Qgb2YgdGhlc2UgY2hhbmdlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XihpbnR8dm9pZHxib29sKSAuKl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXImIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDAyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQzNjg9aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00NDI0LSAqL1xubW0vaHVnZV9tZW1vcnkuYzo0NDI1OmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxubW0vaHVnZV9tZW1vcnkuYy00NDI2LVx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5NTUzCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEb3VibGUtQ2hlY2tpbmcgdGhlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgRnVuY3Rpb25hbGl0eSoqCgpPa2F5LCBzbyB0aGUgY29uY2VwdCBvZiB1bm1hcHBlZCBmb2xpb3PigJR0aG9zZSB0aGF0IGRvbiYjMzk7dCBuZWF0bHkgYWxpZ24gd2l0aCBvdXIgc3RhbmRhcmQgaW5kZXhpbmfigJRpcyBkZWZpbml0ZWx5IHNvbWV0aGluZyB3ZSBuZWVkIHRvIGFjY291bnQgZm9yLiBObyBkZWJhdGUgdGhlcmUsIHRoZXkgKmRvKiBleGlzdCwgYW5kIHRoZSBzeXN0ZW0gbmVlZHMgdG8gaGFuZGxlIHRoZW0uIFRoZSBrZXkgbm93IGlzIHRvIGVuc3VyZSB0aGF0IHRoZSBsb2dpYyB3aXRoaW4gYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyByb2J1c3QuIElzIGl0IGFjY291bnRpbmcgZm9yIGFsbCBlZGdlIGNhc2VzPyBBcmUgdGhlcmUgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzPyBBcmUgdGhlIGFzc3VtcHRpb25zIGFib3V0IHRoZSB1bm1hcHBlZCBkYXRhIHN0aWxsIHZhbGlkIGdpdmVuIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UgbWF0ZXJpYWw/IEJlZm9yZSBJIG1vdmUgb24sIEkgd2FudCB0byBjb25maXJtIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBzdGlsbCBwZXJmb3JtaW5nIGFzIGludGVuZGVkLiBMZXQmIzM5O3Mgc2VlIGlmIHRoZSBoYW5kbGluZyBvZiBmb2xpbyBzcGxpdCBpcyBnb29kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKGludHx2b2lkfGJvb2wpIC4qZm9saW9fc3BsaXRfdW5tYXBwZWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwNTppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDYtdW5zaWduZWQgaW50IG1pbl9vcmRlcl9mb3Jfc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYz00Mjc4PXN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDM2Ny0gKi9cbm1tL2h1Z2VfbWVtb3J5LmM6NDM2ODppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbm1tL2h1Z2VfbWVtb3J5LmMtNDM2OS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMDA5CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkRvdWJsZS1DaGVja2luZyBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAqKgoKQWxyaWdodCwgdGltZSB0byByZXZpc2l0IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYC4gSSYjMzk7bSBnb2luZyBiYWNrIG92ZXIgdGhpcyBiZWNhdXNlLCBsZXQmIzM5O3MgYmUgaG9uZXN0LCBldmVuIGFmdGVyIHRoZSBpbml0aWFsIHJldmlldywgdGhlcmUmIzM5O3MgYWx3YXlzIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgc29tZXRoaW5nIGNvdWxkIGhhdmUgYmVlbiBvdmVybG9va2VkLCBlc3BlY2lhbGx5IHdpdGggYSBmdW5jdGlvbiBhcyBjcml0aWNhbCBhcyB0aGlzLiBNeSBjb25jZXJuIGlzLCBpcyBpdCB0cnVseSByb2J1c3QgZW5vdWdoIHRvIGhhbmRsZSB0aGUgZWRnZSBjYXNlcz8gRG9lcyBpdCBjb3ZlciBhbGwgdGhlIHBlcm11dGF0aW9ucyBvZiBkYXRhIHN0cnVjdHVyZXMgYW5kIHN0YXRlcyB3ZSYjMzk7cmUgbGlrZWx5IHRvIGVuY291bnRlciBpbiBhIHJlYWwtd29ybGQgc2NlbmFyaW8/CgpJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWFkZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGRhdGEgdGhhdCBhcmVuJiMzOTt0IGV4cGxpY2l0bHkgdmFsaWRhdGVkIHdpdGhpbiB0aGUgZnVuY3Rpb24uIFRoaW5raW5nIGFib3V0IGl0LCBJIHNob3VsZCBydW4gdGhyb3VnaCBhIG1lbnRhbCBjaGVja2xpc3Qgb2YgcG9zc2libGUgZmFpbHVyZSBwb2ludHM6IG51bGwgdmFsdWVzLCBlbXB0eSBzdHJ1Y3R1cmVzLCBleGNlcHRpb25hbGx5IGxhcmdlIGRhdGFzZXRzLCBhbmQgZXZlbiBjb25jdXJyZW50IGFjY2VzcyBpc3N1ZXMsIGlmIGFwcGxpY2FibGUuIEkgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBsb2dpYyBhbGlnbnMgcGVyZmVjdGx5IHdpdGggdGhlIHVuZGVybHlpbmcgcmVxdWlyZW1lbnRzIG9mIHRoZSBzcGxpdHRpbmcgcHJvY2Vzcywgc3BlY2lmaWNhbGx5IGFkZHJlc3NpbmcgaG93IHBhcnRpYWwgc3BsaXRzIHNob3VsZCBiZSBldmFsdWF0ZWQuCgpJIGFtIGdvaW5nIHRvIGNoZWNrIHRoZSB1bml0IHRlc3RzLCBvYnZpb3VzbHksIGJ1dCBzb21ldGltZXMgdGhvc2UgdGVzdHMgYXJlIHdyaXR0ZW4gdG8gY292ZXIgdGhlIG9idmlvdXMgY2FzZXMgYW5kIHRoZXJlIGFyZSBzdGlsbCBpc3N1ZXMgbHVya2luZyBpbiB0aGUgY29kZS4gSSBhbSBnb2luZyB0byBoYXZlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSByaWdvcm91cy4gQW5kIEkgbWF5IG5lZWQgdG8gd3JpdGUgc29tZSBuZXcgb25lcyB0byBlbnN1cmUgYWxsIHNjZW5hcmlvcyBhcmUgY292ZXJlZCwgcG90ZW50aWFsbHkgZ2VuZXJhdGluZyBzb21lIHJhbmRvbSBkYXRhIGZvciBhIGRlZXBlciBkaXZlLiBUaGUgZ29hbCBpcyB0byBiZSBhYnNvbHV0ZWx5IGNvbmZpZGVudCB0aGF0IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCB3b24mIzM5O3QgaW50cm9kdWNlIGFueSB1bmV4cGVjdGVkIGJlaGF2aW9yIGRvd24gdGhlIGxpbmUsIHBvdGVudGlhbGx5IGNhdXNpbmcgZGF0YSBjb3JydXB0aW9uIG9yLCBldmVuIHdvcnNlLCBzeXN0ZW0gaW5zdGFiaWxpdHkuIEkgYW0gZ29pbmcgdG8gYmUgZXh0cmEgdmlnaWxhbnQgYW5kIHRoaW5rIHRocm91Z2ggdGhlIGNvZGUgYXMgdGhvdWdoIEkgYW0gZ29pbmcgdG8gYmUgdGhlIHBlcnNvbiB3aG8gd2lsbCBiZSBkZWJ1Z2dpbmcgaXQgYXQgMyBhbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XihpbnR8dm9pZHxib29sKSAuKmZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NDA3PWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA4OmludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDktXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpO1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9Mzc5ND1zdGF0aWMgaW50IF9fc3BsaXRfZnJvemVuX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zODc0LSAqL1xubW0vaHVnZV9tZW1vcnkuYzozODc1OmludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG5tbS9odWdlX21lbW9yeS5jLTM4NzYtXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNjM4CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkRvdWJsZS1DaGVja2luZyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gKioKCkFscmlnaHQsIHRpbWUgdG8gcmV2aXNpdCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2ljIHdpdGhpbiBpdCBpcyBzdGlsbCBzb3VuZC4gSXQmIzM5O3MgYSBjcml0aWNhbCBmdW5jdGlvbiwgYW5kIGEgc3VidGxlIGJ1ZyBoZXJlIGNvdWxkIGhhdmUgY2FzY2FkaW5nIGFuZCBkZXZhc3RhdGluZyBlZmZlY3RzLCBwYXJ0aWN1bGFybHkgb24gbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHN3YXAgcGVyZm9ybWFuY2UuIEkgbmVlZCB0byBydW4gdGhyb3VnaCB0aGUgcmVwbGFjZSBzdHJhdGVneSB0byBlbnN1cmUgdGhhdCB0aGUgY29uZGl0aW9ucyB3aXRoaW4gdGhhdCBmdW5jdGlvbiBhcmUgc3RpbGwgc2FmZSwgYW5kIGhhdmUgbm90IGJlZW4gYWZmZWN0ZWQgYnkgc3Vic2VxdWVudCBpbXByb3ZlbWVudHMuCgpTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGVkZ2UgY2FzZXMuIEFtIEkgc3RpbGwgaGFuZGxpbmcgdGhlIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcmVwbGFjZW1lbnQgc2NlbmFyaW9zIGNvcnJlY3RseT8gRG9lcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhdm9pZCBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucywgZXNwZWNpYWxseSBnaXZlbiBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgc3dhcCBjYWNoZT8gQXJlIHRoZSBsb2NraW5nIHByaW1pdGl2ZXMgYXBwcm9wcmlhdGUgYW5kIGVmZmVjdGl2ZT8gQXJlIHRoZSBtZW1vcnkgYmFycmllcnMgaW4gcGxhY2Ugd2hlcmUgdGhleSBuZWVkIHRvIGJlLCBvciBhcmUgdGhlcmUgYW55IG9wcG9ydHVuaXRpZXMgdG8gb3B0aW1pemUgdGhlbSB3aXRob3V0IGludHJvZHVjaW5nIHJpc2s/IEkgbmVlZCB0byByZXZpZXcgaXQgdW5kZXIgaGlnaCBsb2FkLCB0b28uIEkgd2FudCB0byBtYWtlIHN1cmUgaXQmIzM5O3Mgd29ya2luZyBhcyBleHBlY3RlZC4KCkkgYWxzbyB3YW50IHRvIGNoZWNrIGl0cyBpbnRlcmFjdGlvbiB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEFyZSB0aGVyZSBhbnkgdW5leHBlY3RlZCBkZXBlbmRlbmNpZXMgb3IgaW50ZXJhY3Rpb25zIHdpdGggcGFnZSByZWNsYWltLCBkaXJ0eSBwYWdlIGhhbmRsaW5nLCBvciBOVU1BIG9wdGltaXphdGlvbnMgdGhhdCBtaWdodCBpbnRyb2R1Y2Ugc3VidGxlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIGV2ZW4gY29ycmVjdG5lc3MgaXNzdWVzPyBJJiMzOTtsbCBwcm9iYWJseSBhbHNvIG5lZWQgdG8gcnVuIGl0IHRocm91Z2ggYSBiYXR0ZXJ5IG9mIHRlc3RzLCBjb3ZlcmluZyBib3RoIHR5cGljYWwgYW5kIHBhdGhvbG9naWNhbCBzY2VuYXJpb3MsIHRvIGJ1aWxkIHNvbWUgY29uZmlkZW5jZS4gT3ZlcmFsbCwgSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGlzIGlzIHNvbGlkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKGludHx2b2lkfGJvb2wpIC4qX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcC5oPTMyMT12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zMjItXHRcdFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LCB2b2lkICpzaGFkb3cpO1xubW0vc3dhcC5oOjMyMzp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwLmgtMzI0LVx0XHRcdFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KTtcbi0tXG5tbS9zd2FwX3N0YXRlLmM9MzM2PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9zd2FwX3N0YXRlLmMtMzYxLSAqL1xubW0vc3dhcF9zdGF0ZS5jOjM2Mjp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwX3N0YXRlLmMtMzYzLVx0XHRcdFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTIxNgoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDE3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgTWVtb3J5IE1hbmFnZW1lbnQgU3ltYm9scyBhbmQgRGVwZW5kZW5jaWVzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgZm9jdXMgc3ltYm9scyBhcmU6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gSSYjMzk7bSBzdGFydGluZyB0byBnZXQgYSBmZWVsIGZvciBob3cgdGhlc2UgcmVsYXRlIHRvIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy4KCkkmIzM5O3ZlIGdvdCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgaW4gbXkgbWVudGFsIHN0YWNrIGZvciB0aGUgcmVxdWlyZWQgY29uZmlncy4gV2FpdCwgaG9sZCBvbi4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBkZWZpbml0ZWx5IHRpZWQgdG8gYG1tL3N3YXBfc3RhdGUuY2AsIHdoaWNoLCBhcyBJIHJlY2FsbCwgbmVlZHMgYENPTkZJR19TV0FQYC4gTWFrZXMgc2Vuc2UuIEFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLCBjbGVhcmx5IGltcGxpY2F0aW5nIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBObyBzdXJwcmlzZXMgdGhlcmUuCgpCdXQgSSYjMzk7bSBub3QgZG9uZSB5ZXQuIEkgbmVlZCB0byBiZSB0aG9yb3VnaC4gSSB3b25kZXIgaWYgdGhlcmUmIzM5O3MgYW55IG90aGVyIHJlbGV2YW50IGNvbmZpZyBpbiBwbGF5PyBMZXQgbWUgY2hlY2sgZm9yIGBDT05GSUdfVEhQX1NXQVBgLiBHb3R0YSBjb25zaWRlciB0aGUgaW50ZXJwbGF5IGJldHdlZW4gdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIGFuZCBzd2FwIHNwYWNlLiBJJiMzOTtsbCBuZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kIGFzIEkgZGVsdmUgZnVydGhlciBpbnRvIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUSFBfU1dBUCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTk2OT1lbmRjaG9pY2Vcbm1tL0tjb25maWctOTcwLVxubW0vS2NvbmZpZzo5NzE6Y29uZmlnIFRIUF9TV0FQXG5tbS9LY29uZmlnLTk3Mi1cdGRlZl9ib29sIHlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjAgMTk6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE3NTEKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA1MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgcHJlc2VudGVkIGFzIGEgZmlyc3QtcGVyc29uIGV4cGVydCBzdW1tYXJ5OgoKKipUaGlua2luZyBUaHJvdWdoIFRIUF9TV0FQJiMzOTtzIERlcGVuZGVuY2llcyoqCgpBbHJpZ2h0LCBzbyBgVEhQX1NXQVBgLi4uIHRoYXQmIzM5O3MgYSBib29sZWFuIG9wdGlvbiwgYW5kIGl0JiMzOTtzIGRlZmluZWQgYXMgYGRlZl9ib29sIHlgLiBUaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB3aGF0IGRldGVybWluZXMgdGhhdCBkZWZhdWx0IHZhbHVlLiBUaGUgbG9naWMgc3RhdGVzIHRoYXQgaXQmIzM5O3MgY29udGluZ2VudCBvbiB0d28gdGhpbmdzOiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAuIFRoYXQgbWFrZXMgcGVyZmVjdCBzZW5zZTsgdGhlIGFiaWxpdHkgdG8gc3dhcCBvdXQgaHVnZSBwYWdlcywgd2VsbCwgb2J2aW91c2x5IHRoYXQgZGVwZW5kcyBvbiBoYXZpbmcgYm90aCB0aGUgdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIGZlYXR1cmUgZW5hYmxlZCBhbmQgc3dhcCBzcGFjZSBhdmFpbGFibGUuCgpUbyBjbGFyaWZ5IHRoZSBmdWxsIGltcGFjdCBvZiB0aGVzZSBjb25kaXRpb25zLCBJIG5lZWQgdG8gbG9vayBpbnRvIGhvdyBleGFjdGx5IHRoaXMgZGVwZW5kZW5jeSBjaGFpbiBpcyBzZXQgdXAuIEJlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY2hlY2sgdGhlIGBtbS9LY29uZmlnYCBmaWxlIGluIHRoZSBrZXJuZWwgc291cmNlLiBUaGF0IGZpbGUgd2lsbCBkZXRhaWwgdGhlIGV4YWN0IHJlbGF0aW9uc2hpcHMgYW5kIGNvbnN0cmFpbnRzIGluIHBsYWNlIGFyb3VuZCB0aGUgYFRIUF9TV0FQYCBvcHRpb24uIEkmIzM5O2xsIHRha2UgYSBsb29rIHRoZXJlIHRvIGNvbmZpcm0gbXkgdW5kZXJzdGFuZGluZyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciBzdWJ0bGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGlzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtUSFBfU1dBUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz04MTA9Y29uZmlnIEFSQ0hfV0FOVF9HRU5FUkFMX0hVR0VUTEJcbi0tXG5tbS9LY29uZmlnLTgxMi1cbm1tL0tjb25maWc6ODEzOmNvbmZpZyBBUkNIX1dBTlRTX1RIUF9TV0FQXG5tbS9LY29uZmlnLTgxNC1cdGRlZl9ib29sIG5cbi0tXG5tbS9LY29uZmlnPTk2OT1lbmRjaG9pY2Vcbm1tL0tjb25maWctOTcwLVxubW0vS2NvbmZpZzo5NzE6Y29uZmlnIFRIUF9TV0FQXG5tbS9LY29uZmlnLTk3Mi1cdGRlZl9ib29sIHlcbm1tL0tjb25maWc6OTczOlx0ZGVwZW5kcyBvbiBBUkNIX1dBTlRTX1RIUF9TV0FQIFx1MDAyNlx1MDAyNiBTV0FQIFx1MDAyNlx1MDAyNiA2NEJJVFxubW0vS2NvbmZpZy05NzQtXHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyMjM2CgkJCQkJCQlvdXRwdXQ6IDE1MAoJCQkJCQkJdGhvdWdodHM6IDI5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBUSFBfU1dBUCBEZXBlbmRlbmN5IGFuZCBDb2RlIENoYW5nZXMqKgoKT2theSwgc28gYFRIUF9TV0FQYCBoaW5nZXMgb24gYEFSQ0hfV0FOVFNfVEhQX1NXQVBgLCBgU1dBUGAsIGFuZCBhIDY0LWJpdCBhcmNoaXRlY3R1cmUuIFRoYXQmIzM5O3MgdGhlIGdhdGUuIE5vdywgbG9va2luZyBhdCB0aGUgY29kZSwgdGhlIG1vZGlmaWNhdGlvbnMgYXJlIGNvbmNlbnRyYXRlZCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBSaWdodCBhd2F5LCBJIHNlZSB0aGF0IGBtbS9odWdlX21lbW9yeS5jYCBpcyBnb2luZyB0byBiZSBwYXJ0IG9mIHRoZSBidWlsZCAqb25seSogaWYgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZW5hYmxlZCwgYW5kIGBtbS9zd2FwX3N0YXRlLmNgIHJlbGllcyBvbiBgQ09ORklHX1NXQVBgLiBTbywgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFNXQVBgIGFyZSB0aGUga2V5IGNvbmZpZ3VyYXRpb25zIHRvIGtlZXAgaW4gbWluZC4gVGhvc2UgYXJlIHRoZSBiaWcga25vYnMgaGVyZS4KCk5vdywgbGV0IG1lIGdvIGJhY2sgb3ZlciB0aGUgY2hhbmdlcyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kICpleGFjdGx5KiB3aGF0JiMzOTtzIGJlaW5nIHRvdWNoZWQuIEFoLCB0aGV5JiMzOTt2ZSBtb2RpZmllZCBgX19zcGxpdF91bm1hcHBlZF9mb2xpb2AgKHJlbmFtZWQgdG8gYF9fc3BsaXRfZnJvemVuX2ZvbGlvYCksIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZGAgKHJlcGxhY2VkIGJ5IGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVgIGFuZCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGVgKSwgYF9fZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBJdCBsb29rcyBsaWtlIGl0IGlzIGFsbCBhYm91dCByZWZhY3RvcmluZyB0aGUgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIHRvIGhhbmRsZSBzd2FwY2FjaGUgYW5kIGFub255bW91cyBmb2xpb3MgbW9yZSBlZmZlY3RpdmVseS4gVGhpcyBpcyBhIGZ1bmRhbWVudGFsIGNoYW5nZSBpbiB0aGUgd2F5IFRIUCBpbnRlcmFjdHMgd2l0aCBzd2FwLiBUaGlzIGlzIGRlZmluaXRlbHkgYSBzcG90IHdvcnRoIGEgZGVlcCBmdXp6aW5nIGNhbXBhaWduLgoKQWxyaWdodCwgSSYjMzk7bSByZWFkeSB0byBtb3ZlIGZvcndhcmQuIExldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZml4ZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS9odWdlX21lbW9yeS5jIGFuZCBtbS9zd2FwX3N0YXRlLmMsIHdoaWNoIGlzIHJlYWNoYWJsZSBhbmQgaGFzIGZ1bmN0aW9uYWwgaW1wYWN0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZml4ZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS9odWdlX21lbW9yeS5jIGFuZCBtbS9zd2FwX3N0YXRlLmMsIHdoaWNoIGlzIHJlYWNoYWJsZSBhbmQgaGFzIGZ1bmN0aW9uYWwgaW1wYWN0LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMCAxOTowNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKHNwZWNpZmljYWxseSBmb3IgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MpLiBJdCBtb2RpZmllcyBob3cgZm9saW9zIGFyZSB1bm1hcHBlZCwgZnJvemVuLCBhbmQgc3BsaXQsIHVwZGF0aW5nIHBhZ2UgY2FjaGUgYW5kIHN3YXAgY2FjaGUgcmVmZXJlbmNlcy4gVGhlc2UgY2hhbmdlcyBpbnZvbHZlIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgeGFycmF5IG1hbmlwdWxhdGlvbnMuIFRoZXkgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWx0ZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIG1lbW9yeSBidWZmZXJzLiBBbnkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgd291bGQgbWFuaWZlc3QgYXMgdXNlLWFmdGVyLWZyZWUsIG1lbW9yeSBjb3JydXB0aW9uLCBvciBsb2NraW5nIGlzc3Vlcywgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBjZWQ0MDBmNzJkNDNhLi5jYzlmN2UwZDQxOTRlIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTM1ODksOSAmIzQzOzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncykKIHsKIAlpbnQgaSA9IDA7CiAKLQkvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqLwotCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKLQkJcmV0dXJuOwogCWZvciAoOzspIHsKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpOwogCQlpICYjNDM7PSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CkBAIC0zNzU1LDggJiM0MzszNzUyLDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLAogfQogCiAvKioKLSAqIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSAtIHNwbGl0cyBhbiB1bm1hcHBlZCBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zIGluCi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC4KJiM0MzsgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIC0gc3BsaXRzIGEgZnJvemVuIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MKJiM0MzsgKiBpbiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC4KICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvCiAgKiBAbmV3X29yZGVyOiB0aGUgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyIHNwbGl0IGZvbGlvcyAoc2luY2UgYnVkZHkKICAqICAgICAgICAgICAgIGFsbG9jYXRvciBsaWtlIHNwbGl0IGdlbmVyYXRlcyBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbSBAZm9saW8mIzM5O3MKQEAgLTM3NjQsNyAmIzQzOzM3NjEsNiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBAc3BsaXRfYXQ6IGluIGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQKICAqICAgICAgICAgICAgd2lsbCBiZSBzcGxpdCB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyLgogICogQHhhczogeGFfc3RhdGUgcG9pbnRpbmcgdG8gZm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMgYW5kIGxvY2tlZCBieSBjYWxsZXIKLSAqIEBtYXBwaW5nOiBAZm9saW8tJmd0O21hcHBpbmcKICAqIEBzcGxpdF90eXBlOiBpZiB0aGUgc3BsaXQgaXMgdW5pZm9ybSBvciBub3QgKGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0KQogICoKICAqCkBAIC0zNzk1LDExICYjNDM7Mzc5MSwxMiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCAmbHQ7MCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlCiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spCiAgKi8KLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAomIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQomIzQzOwkJZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7CiAJY29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKJiM0MzsJY29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAlpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7CiAJc3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbzsKQEAgLTM4MTQsMTEgJiM0MzszODExLDExIEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogCSAgICAgc3BsaXRfb3JkZXItLSkgewogCQlpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCAmbHQ7Jmx0OyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpOwogCi0JCS8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJaWYgKGlzX2Fub24gJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQomIzQzOwkJLyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi8KJiM0MzsJCWlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpICZhbXA7JmFtcDsgc3BsaXRfb3JkZXIgPT0gMSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChtYXBwaW5nKSB7CiYjNDM7CQlpZiAoeGFzKSB7CiAJCQkvKgogCQkJICogdW5pZm9ybSBzcGxpdCBoYXMgeGFzX3NwbGl0X2FsbG9jKCkgY2FsbGVkIGJlZm9yZQogCQkJICogaXJxIGlzIGRpc2FibGVkIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnksIHdoZXJlYXMKQEAgLTM4NzgsMzIgJiM0MzszODc1LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJCSAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKJiM0MzsKIAlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAkvKgogCSAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlCi0JICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4KLQkgKgotCSAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZQotCSAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLgomIzQzOwkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8KJiM0MzsJICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuCiAJICovCi0JaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWlzX3N3YXBjYWNoZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi8KLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qCi0JICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMAotCSAqCi0JICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbQotCSAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnkKLQkgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkCi0JICogaGVyZS4KJiM0MzsJICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZQomIzQzOwkgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gJmFtcDsgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdAomIzQzOwkgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGQKJiM0MzsJICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LgogCSAqLwotCWlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgJmFtcDsmYW1wOyBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKJiM0MzsJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkxMSwzOSAmIzQzOzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAlpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKQogCQlyZXR1cm4gLUVCVVNZOwogCiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhCiYjNDM7CSAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0JiMzOTtzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvcgomIzQzOwkgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW0KJiM0MzsJICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkCiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGUKJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXQKJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIKJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG8KJiM0MzsgKiAgICAgICAgICB0aGUgTFJVIGxpc3QKJiM0MzsgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzCiYjNDM7ICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlcwomIzQzOyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLAomIzQzOwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7NDAwMSwyNTYgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiAKLQkJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIHBvc3Qtc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzCiYjNDM7CSAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnQKJiM0MzsJICogc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvIGZvciBhIHN1YgomIzQzOwkgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLgomIzQzOwkgKi8KJiM0MzsJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKJiM0MzsJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7CiYjNDM7CQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sCiYjNDM7CQkJCSAgIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKIAkJaWYgKGRvX2xydSkKLQkJCWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CQlpZiAoY2kpCiYjNDM7CQkJX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pOwomIzQzOwl9CiAKLQkJcmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLAotCQkJCQkgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpOwomIzQzOwl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKIAotCQkvKgotCQkgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0Ci0JCSAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZQotCQkgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3MKLQkJICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZgotCQkgKiBAZm9saW8uCi0JCSAqLwotCQlmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvOwotCQkgICAgIG5ld19mb2xpbyA9IG5leHQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pOwomIzQzOwlpZiAoZG9fbHJ1KQomIzQzOwkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwlpZiAoY2kpCiYjNDM7CQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKJiM0MztvdXRfbm9fc3BsaXQ6CiYjNDM7CWxvY2FsX2lycV9lbmFibGUoKTsKJiM0MzsJaWYgKGFub25fdm1hKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3ZtYSkgewomIzQzOwkJYW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTsKJiM0MzsJCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7CiYjNDM7CX0KIAotCQkJbmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiAKLQkJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7LyoqCiYjNDM7ICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW8KJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZCBhbmQgZmlsZS1iYWNrZWQKJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZQomIzQzOyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KQomIzQzOyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdAomIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlcgomIzQzOyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTEwKJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpCiYjNDM7ICoKJiM0MzsgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0cwomIzQzOyAqIHJlZmNvdW50LCBhbmQgcGVyZm9ybSB0aGUgc3BsaXQsIHVwZGF0ZXMgdGhlIHBhZ2UgY2FjaGUgZW50cmllcy4gU3BsaXQKJiM0MzsgKiBmb2xpb3MgYXJlIHVuZnJvemVuIGJ1dCBub3QgcmVtYXBwZWQsIHRoZXkgYXJlIGZhdWx0ZWQgYmFjayBpbiBvbiBkZW1hbmQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4gKGlmIC1FTk9NRU0KJiM0MzsgKiBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlcikKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiYjNDM7CQkJCQkgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAomIzQzOwkJCQkJICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQomIzQzO3sKJiM0MzsJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby0mZ3Q7bWFwcGluZzsKJiM0MzsJWEFfU1RBVEUoeGFzLCAmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiYjNDM7CWxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7CiYjNDM7CXN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDsKJiM0MzsJaW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgbWluX29yZGVyOwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiYjNDM7CXBnb2ZmX3QgZW5kID0gMDsKJiM0MzsJZ2ZwX3QgZ2ZwOwomIzQzOwlpbnQgcmV0ID0gMDsKIAotCQkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKLQkJCQkJICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiYjNDM7CW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwomIzQzOwlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWlmIChkb19scnUpCi0JCQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkvKgomIzQzOwkgKiBTd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAomIzQzOwkgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuCiYjNDM7CSAqLwomIzQzOwltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwomIzQzOwlvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTsKIAotCQkJLyoKLQkJCSAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuCi0JCQkgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJICovCi0JCQlpZiAoY2kpIHsKLQkJCQlfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmYW1wOyBHRlBfUkVDTEFJTV9NQVNLKTsKJiM0MzsJaWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHsKJiM0MzsJCXJldCA9IC1FQlVTWTsKJiM0MzsJCWdvdG8gZmFpbF9mcmVlOwomIzQzOwl9CiAKLQkJCS8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi8KLQkJCWlmICghbWFwcGluZykKLQkJCQljb250aW51ZTsKJiM0MzsJbWFwcGluZ19zZXRfdXBkYXRlKCZhbXA7eGFzLCBtYXBwaW5nKTsKIAotCQkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCi0JCQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewotCQkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAotCQkJCQkgICBuZXdfZm9saW8sIDApOwotCQkJCWNvbnRpbnVlOwotCQkJfQomIzQzOwlpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHsKJiM0MzsJCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAKLQkJCVZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7Ci0JCQkvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC0mZ3Q7aW5kZXggJmd0Oz0gZW5kICovCi0JCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSAmYW1wOyZhbXA7IG5yX3NobWVtX2Ryb3BwZWQpCi0JCQkJKm5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwotCQkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQotCQkJCWZvbGlvX2FjY291bnRfY2xlYW5lZCgKLQkJCQkJbmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7Ci0JCQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7Ci0JCQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKJiM0MzsJCXhhc19zZXRfb3JkZXIoJmFtcDt4YXMsIGZvbGlvLSZndDtpbmRleCwgbmV3X29yZGVyKTsKJiM0MzsJCXhhc19zcGxpdF9hbGxvYygmYW1wO3hhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTsKJiM0MzsJCWlmICh4YXNfZXJyb3IoJmFtcDt4YXMpKSB7CiYjNDM7CQkJcmV0ID0geGFzX2Vycm9yKCZhbXA7eGFzKTsKJiM0MzsJCQlnb3RvIGZhaWxfZnJlZTsKIAkJfQomIzQzOwl9CiAKLQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7Ci0JCS8qCi0JCSAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoCi0JCSAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy4KLQkJICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW8KLQkJICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqLwotCQlmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiYjNDM7CWlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7CiAKLQkJaWYgKGRvX2xydSkKLQkJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsX21tYXBfdW5sb2NrOwomIzQzOwl9CiAKLQkJaWYgKGNpKQotCQkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGRlcXVldWVfZGVmZXJyZWQpIHsKLQkJCWxpc3RfbHJ1X3VubG9jayhscnUpOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CS8qCiYjNDM7CSAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kCiYjNDM7CSAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlCiYjNDM7CSAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay4KJiM0MzsJICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsCiYjNDM7CSAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuCiYjNDM7CSAqLwomIzQzOwllbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy0mZ3Q7aG9zdCksIFBBR0VfU0laRSk7CiYjNDM7CWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctJmd0O2hvc3QsIGVuZCk7CiYjNDM7CiYjNDM7CXVubWFwX2ZvbGlvKGZvbGlvKTsKJiM0MzsKJiM0MzsJeGFzX2xvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KJiM0MzsJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCiYjNDM7CSAqLwomIzQzOwlpZiAoeGFzX2xvYWQoJmFtcDt4YXMpICE9IGZvbGlvKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICYjNDM7IDEpKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgJmFtcDsmYW1wOyBuZXdfb3JkZXIgJmx0OyBIUEFHRV9QTURfT1JERVIpIHsKJiM0MzsJCWlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKQomIzQzOwkJCWxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqLwomIzQzOwlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgc3BsaXRfdHlwZSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHQKJiM0MzsJICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlCiYjNDM7CSAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvcwomIzQzOwkgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mCiYjNDM7CSAqIEBmb2xpby4KJiM0MzsJICovCiYjNDM7CWZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87CiYjNDM7CSAgICAgbmV3X2ZvbGlvID0gbmV4dCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQkvKiBjb21wdXRlIG5leHQgYmVmb3JlIHRoZSBmb2xpbyBjYW4gYmUgZnJlZWQgYmVsb3cgKi8KJiM0MzsJCW5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7CiYjNDM7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICYjNDM7IDEpOwomIzQzOwomIzQzOwkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwomIzQzOwkJLyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovCiYjNDM7CQlpZiAobmV3X2ZvbGlvLSZndDtpbmRleCAmbHQ7IGVuZCkgewomIzQzOwkJCV9feGFfc3RvcmUoJmFtcDttYXBwaW5nLSZndDtpX3BhZ2VzLCBuZXdfZm9saW8tJmd0O2luZGV4LAomIzQzOwkJCQkgICBuZXdfZm9saW8sIDApOwomIzQzOwkJCWNvbnRpbnVlOwogCQl9Ci0JCXJldHVybiAtRUFHQUlOOwomIzQzOwomIzQzOwkJLyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtJmd0O2luZGV4ICZndDs9IGVuZCAqLwomIzQzOwkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQkJbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7CiYjNDM7CQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCiYjNDM7CQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbywKJiM0MzsJCQkJCSAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKJiM0MzsJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKJiM0MzsJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaAomIzQzOwkgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuCiYjNDM7CSAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvCiYjNDM7CSAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLgomIzQzOwkgKi8KJiM0MzsJZm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgJiM0MzsgMSk7CiYjNDM7CWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MztmYWlsOgomIzQzOwkvKgomIzQzOwkgKiBJZiB3ZSB3YW50IHRvIHVzZSB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUgaW4gdW5tYXBfZm9saW8sCiYjNDM7CSAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LgomIzQzOwkgKi8KJiM0MzsJeGFzX3VubG9ja19pcnEoJmFtcDt4YXMpOwomIzQzO2ZhaWxfbW1hcF91bmxvY2s6CiYjNDM7CWlmIChucl9zaG1lbV9kcm9wcGVkKQomIzQzOwkJc2htZW1fdW5jaGFyZ2UobWFwcGluZy0mZ3Q7aG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7CiYjNDM7CS8qCiYjNDM7CSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCiYjNDM7CSAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSwgc28gZXZpY3Rpb24gY2Fubm90IGZyZWUKJiM0MzsJICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvcgomIzQzOwkgKiB0aGUgbWFwcGluZy4KJiM0MzsJICovCiYjNDM7CWlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTsKJiM0MztmYWlsX2ZyZWU6CiYjNDM7CS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovCiYjNDM7CXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKJiM0MzsJbWVtX2Nncm91cF9wdXQobWVtY2cpOwomIzQzOwl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDA4Niw5ICYjNDM7NDI2Myw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuCiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMCiAgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpCiAgKgotICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuCiYjNDM7ICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LgogICogSXQgaXMgaW4gY2hhcmdlIG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlIHNwbGl0IGlzIHN1cHBvcnRlZCBvciBub3QgYW5kCi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuCiYjNDM7ICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS4KICAqCiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBhZnRlci1zcGxpdCBmb2xpbyBjb250YWluaW5nIEBsb2NrX2F0IHJlbWFpbnMgbG9ja2VkCiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDoKQEAgLTQxMDIsMTcgJiM0Mzs0Mjc5LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKLQlYQV9TVEFURSh4YXMsICZhbXA7Zm9saW8tJmd0O21hcHBpbmctJmd0O2lfcGFnZXMsIGZvbGlvLSZndDtpbmRleCk7CiYjNDM7CWJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7CiAJYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMOwotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwotCWludCBucl9zaG1lbV9kcm9wcGVkID0gMDsKLQllbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwOwotCXBnb2ZmX3QgZW5kID0gMDsKIAlpbnQgcmV0OwogCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKQEAgLTQxMjAsMTQxICYjNDM7NDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAogCWlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG5ld19vcmRlciAmZ3Q7PSBvbGRfb3JkZXIpIHsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfbm9fbWVtY2c7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpOwogCWlmIChyZXQpIHsKIAkJVk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCAmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpbyYjMzQ7KTsKLQkJZ290byBvdXRfbm9fbWVtY2c7Ci0JfQotCi0JLyoKLQkgKiBzd2l0Y2ggdG8gZm9saW8mIzM5O3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZAotCSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KLQkgKi8KLQltZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pOwotCW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwotCi0JaWYgKGlzX2Fub24pIHsKLQkJLyoKLQkJICogVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseSBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkCi0JCSAqIHByZXZlbnQgdGhlIGFub25fdm1hIGRpc2FwcGVhcmluZyBzbyB3ZSBmaXJzdCB3ZSB0YWtlIGEKLQkJICogcmVmZXJlbmNlIHRvIGl0IGFuZCB0aGVuIGxvY2sgdGhlIGFub25fdm1hIGZvciB3cml0ZS4gVGhpcwotCQkgKiBpcyBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCBleGNlcHQgdGhlIHdyaXRlIGxvY2sKLQkJICogaXMgdGFrZW4gdG8gc2VyaWFsaXNlIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UKLQkJICogb3BlcmF0aW9ucy4KLQkJICovCi0JCWFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTsKLQkJaWYgKCFhbm9uX3ZtYSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBtaW5fb3JkZXI7Ci0JCWdmcF90IGdmcDsKLQotCQltYXBwaW5nID0gZm9saW8tJmd0O21hcHBpbmc7Ci0JCW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpOwotCQlpZiAobmV3X29yZGVyICZsdDsgbWluX29yZGVyKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJmFtcDsKLQkJCQkJCQlHRlBfUkVDTEFJTV9NQVNLKTsKLQotCQlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwotCi0JCWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewotCQkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwotCQkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwotCQkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKLQkJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJYW5vbl92bWEgPSBOVUxMOwotCQlpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpOwotCi0JCS8qCi0JCSAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZAotCQkgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZQotCQkgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suCi0JCSAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LAotCQkgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLgotCQkgKi8KLQkJZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctJmd0O2hvc3QpLCBQQUdFX1NJWkUpOwotCQlpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSkKLQkJCWVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLSZndDtob3N0LCBlbmQpOwotCX0KLQotCS8qCi0JICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGwKLQkgKiBzcGxpdCBQTURzCi0JICovCi0JaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXVubWFwX2ZvbGlvKGZvbGlvKTsKLQotCS8qIGJsb2NrIGludGVycnVwdCByZWVudHJ5IGluIHhhX2xvY2sgYW5kIHNwaW5sb2NrICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAobWFwcGluZykgewotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgotCQkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KLQkJICovCi0JCXhhc19sb2NrKCZhbXA7eGFzKTsKLQkJeGFzX3Jlc2V0KCZhbXA7eGFzKTsKLQkJaWYgKHhhc19sb2FkKCZhbXA7eGFzKSAhPSBmb2xpbykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWdvdG8gZmFpbDsKLQkJfQomIzQzOwkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCAmYW1wO3hhcywgbWFwcGluZywKLQkJCQkJCXRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgJmFtcDtucl9zaG1lbV9kcm9wcGVkKTsKLWZhaWw6Ci0JaWYgKG1hcHBpbmcpCi0JCXhhc191bmxvY2soJmFtcDt4YXMpOwotCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JaWYgKG5yX3NobWVtX2Ryb3BwZWQpCi0JCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwotCi0JaWYgKCFyZXQgJmFtcDsmYW1wOyBpc19hbm9uICZhbXA7JmFtcDsgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkKLQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7Ci0KLQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKLQotCS8qCi0JICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXMKLQkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvCi0JICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5Ci0JICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2UKLQkgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy4KLQkgKi8KLQlpZiAobWFwcGluZykgewotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7Ci0JCW1hcHBpbmcgPSBOVUxMOwotCX0KJiM0MzsJaWYgKGlzX2Fub24pCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsCiYjNDM7CQkJCQkJICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZSBpZiAoaXNfc3dhcGNhY2hlKQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpOwomIzQzOwllbHNlCiYjNDM7CQlyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwKJiM0MzsJCQkJCQkJICBsaXN0LCBzcGxpdF90eXBlKTsKIAogCS8qCiAJICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZwpAQCAtNDI2NSwyOSAmIzQzOzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAJCWlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkKIAkJCWNvbnRpbnVlOwogCi0JCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwogCQkvKgogCQkgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWQKIAkJICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlCi0JCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWwKJiM0MzsJCSAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiAJCSAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuCiAJCSAqLwotCQlmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7CiYjNDM7CQlpZiAoaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgIWZvbGlvX21hcHBlZChuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fdW5sb2NrKG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19wdXQobmV3X2ZvbGlvKTsKIAl9CiAKLW91dF91bmxvY2s6Ci0JaWYgKGFub25fdm1hKSB7Ci0JCWFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7Ci0JCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7Ci0JfQotCWlmIChtYXBwaW5nKQotCQlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiBvdXQ6Ci0JLyogcmVzdG9yZSB0byBjYWxsZXImIzM5O3Mgb2xkX21lbWNnICovCi0Jc2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpOwotCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKLW91dF9ub19tZW1jZzoKLQl4YXNfZGVzdHJveSgmYW1wO3hhcyk7CiAJaWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKQogCQljb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpOwogCWNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTsKQEAgLTQzMTEsMjkgJiM0Mzs0MzYwLDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogICogaXNvbGF0ZWQgZnJvbSBMUlUgKGlmIGFwcGxpY2FibGUpCiAgKgogICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSwKLSAqIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLgomIzQzOyAqIGZvbGlvX2ZyZWVfc3dhcCgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvCiAgKiAgICAgICAgIGluc3VmZmljaWVudCByZWZlcmVuY2UgY291bnQgb3IgZXh0cmEgcGlucykuCiAgKi8KIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewotCWludCByZXQgPSAwOwotCiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pOwogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sYXJnZShmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKIAotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIE5VTEwsCi0JCQkJCQlOVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLAotCQkJCQkJMCwgTlVMTCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJldHVybiByZXQ7CiYjNDM7CXJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgJmFtcDtmb2xpby0mZ3Q7cGFnZSwgZmFsc2UsCiYjNDM7CQkJCQkgICAgICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTsKIH0KIAogLyoKQEAgLTQzNTIsMTAgJiM0Mzs0MzkyLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyCiAgKiAgICB3aWxsIHJlY2VpdmUgYW4gLUVBR0FJTi4KICAqCi0gKiA0KSBAbmV3X29yZGVyICZndDsgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3QKLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIHdoaWNoCi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMQotICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKJiM0MzsgKiA0KSBAbmV3X29yZGVyICE9IDEgZm9yIGFub24gb3Igc3dhcGNhY2hlLiBBbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IKJiM0MzsgKiAgICBfZGVmZXJyZWRfbGlzdCwgd2hpY2ggb3JkZXItMSBmb2xpb3MgbGFjaywgYW5kIGEgc3dhcGNhY2hlIGZvbGlvIG1heQomIzQzOyAqICAgIGJlY29tZSBhbm9uIG9uY2UgZmF1bHRlZCBpbi4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCwKICAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC4KICAqCiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBjYWxsZXImIzM5O3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsCkBAIC00Mzg0LDcgJiM0Mzs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiAgKiB3aXRoIHRoZSBmb2xpby4gU3BsaXR0aW5nIHRvIG9yZGVyIDAgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBmb2xpb3MuCiAgKi8KIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotCQkJCSAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcikKJiM0MzsJCQkJICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiB7CiAJc3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiAKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0zODksOCAmIzQzOzM4OSw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwKIAkgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7CiAJCWNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtJmd0O3N3YXApOwogCQljaV9lbmQgPSBjaV9vZmYgJiM0MzsgZm9saW9fbnJfcGFnZXMob2xkKTsKLQkJd2hpbGUgKGNpX29mZiYjNDM7JiM0MzsgJmx0OyBjaV9lbmQpCiYjNDM7CQlkbyB7CiAJCQlXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7CiYjNDM7CQl9IHdoaWxlICgmIzQzOyYjNDM7Y2lfb2ZmICZsdDsgY2lfZW5kKTsKIAl9CiB9CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyODc2CgkJCQkJCQlvdXRwdXQ6IDE2NgoJCQkJCQkJdGhvdWdodHM6IDQ2OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBGb2xpbyBTcGxpdHRpbmcgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgbG9va2VkIG92ZXIgdGhpcyBwYXRjaC4gSXQmIzM5O3MgdG91Y2hpbmcgYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYCwgd2hpY2ggaW1tZWRpYXRlbHkgdGVsbHMgbWUgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCB0aGUgbml0dHktZ3JpdHR5IG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBzcGVjaWZpY2FsbHkgaG93IHdlJiMzOTtyZSBoYW5kbGluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGFuZCB0aGVpciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBzd2FwIGNhY2hlIGFuZCBwYWdlIGNhY2hlLiBUaGUgY29yZSBvZiB0aGUgY2hhbmdlcyBpcyBhIHJlZmFjdG9yaW5nIG9mIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMuIFRoZXkmIzM5O3JlIHJlbmFtaW5nIGZ1bmN0aW9ucywgbGlrZSBgX19zcGxpdF91bm1hcHBlZF9mb2xpb2AgdG8gYF9fc3BsaXRfZnJvemVuX2ZvbGlvYCBhbmQgc2ltaWxhciB2YXJpYXRpb25zLCBidXQgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBzZWVtcyB0aGUgc2FtZTogdW5tYXBwaW5nLCBmcmVlemluZywgYW5kIHNwbGl0dGluZyB0aGVzZSBmb2xpb3MuCgpNeSBpbml0aWFsIHNjYW4gdGVsbHMgbWUgdGhpcyBpcyBhbGwgcHVyZWx5IGludGVybmFsIG1lbW9yeSBtYW5hZ2VtZW50LiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBpbnRyb2R1Y2VkIHRoYXQgd291bGQgZ2V0IGV4cG9zZWQgdG8gdXNlciBzcGFjZS4gSXQmIzM5O3MgYWxsIGFib3V0IGhvdyB3ZSBtYW5hZ2UgcGFnZSByZWZjb3VudHMsIGRlYWwgd2l0aCBsb2NraW5nLCBhbmQgdXBkYXRlIHRob3NlIHhhcnJheXMgYW5kIExSVSBsaXN0cyB3aGVuIHNwbGl0dGluZyBhIGZvbGlvLgoKU2luY2UgaXQmIzM5O3MgbWVtb3J5IG1hbmFnZW1lbnQsIHRoZSB0eXBpY2FsIHJpc2tzIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHM6IHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIGFuZCBkZWFkbG9ja3MuIEJ1dCwgc2luY2UgdGhlcmUgaXMgbm8gZGF0YSBjb3BpZWQgdG8gb3IgZnJvbSB1c2VyIHNwYWNlIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBLTVNBTiBkb2VzbiYjMzk7dCBzZWVtIHRvIGJlIHJlcXVpcmVkIGZvciB0aGVzZSBjaGFuZ2VzLiBXZSYjMzk7cmUgYWxyZWFkeSBwcm90ZWN0ZWQgYnkgS0FTQU4sIEtDU0FOLCBhbmQgTE9DS0RFUCBmb3IgdGhlIHVzdWFsIG1lbW9yeSBjb3JydXB0aW9uIGFuZCBsb2NraW5nIHByb2JsZW1zLgoKSSB0b29rIGEgY2xvc2VyIGxvb2sgdG8gZG91YmxlLWNoZWNrIG15IGluaXRpYWwgYXNzZXNzbWVudC4gSSBzZWUgYHhhc19zcGxpdF9hbGxvY2AgYmVpbmcgdXNlZCwgYnV0IHRob3NlIGFyZSBqdXN0IGFsbG9jYXRpbmcgeGFycmF5IG5vZGVzLCBub3QgdXNlci12aXNpYmxlIGRhdGEuIE5vdGhpbmcgbmV3IGlzIGJlaW5nIGV4cG9zZWQgdG8gdXNlcnNwYWNlLiBNZW1vcnkgaW5pdGlhbGl6YXRpb24gZG9lc24mIzM5O3Qgc2VlbSB0byBiZSBhIGZhY3RvciBoZXJlOyB3ZSYjMzk7cmUganVzdCBzcGxpdHRpbmcgZXhpc3RpbmcgZm9saW9zLgoKVGhlcmVmb3JlLCAqTmVlZHNLTVNBTiogaXMgZGVmaW5pdGVseSBmYWxzZS4gVGhpcyBwYXRjaCBpcyBhIGdvb2QgZXhhbXBsZSBvZiBpbnRlcm5hbCBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIHRoYXQgc2hvdWxkICpub3QqIHJlcXVpcmUgS01TQU4gc2NydXRpbnkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIwIDE5OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgZm9saW8gc3BsaXR0aW5nIGxvZ2ljIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0gKHNwZWNpZmljYWxseSBmb3IgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MpLiBJdCBtb2RpZmllcyBob3cgZm9saW9zIGFyZSB1bm1hcHBlZCwgZnJvemVuLCBhbmQgc3BsaXQsIHVwZGF0aW5nIHBhZ2UgY2FjaGUgYW5kIHN3YXAgY2FjaGUgcmVmZXJlbmNlcy4gVGhlc2UgY2hhbmdlcyBpbnZvbHZlIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBhbmQgeGFycmF5IG1hbmlwdWxhdGlvbnMuIFRoZXkgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWx0ZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIG1lbW9yeSBidWZmZXJzLiBBbnkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgd291bGQgbWFuaWZlc3QgYXMgdXNlLWFmdGVyLWZyZWUsIG1lbW9yeSBjb3JydXB0aW9uLCBvciBsb2NraW5nIGlzc3Vlcywgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGRldGVjdGVkIGJ5IEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGZvciBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcykuIEl0IG1vZGlmaWVzIGhvdyBmb2xpb3MgYXJlIHVubWFwcGVkLCBmcm96ZW4sIGFuZCBzcGxpdCwgdXBkYXRpbmcgcGFnZSBjYWNoZSBhbmQgc3dhcCBjYWNoZSByZWZlcmVuY2VzLiBUaGVzZSBjaGFuZ2VzIGludm9sdmUgcGFnZSByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCB4YXJyYXkgbWFuaXB1bGF0aW9ucy4gVGhleSBkbyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbHRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJ1ZmZlcnMuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyB3b3VsZCBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGxvY2tpbmcgaXNzdWVzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjM4LjUwMjk0MjkxOFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMzI5MDY2MDU1NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGZvciBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcykuIEl0IG1vZGlmaWVzIGhvdyBmb2xpb3MgYXJlIHVubWFwcGVkLCBmcm96ZW4sIGFuZCBzcGxpdCwgdXBkYXRpbmcgcGFnZSBjYWNoZSBhbmQgc3dhcCBjYWNoZSByZWZlcmVuY2VzLiBUaGVzZSBjaGFuZ2VzIGludm9sdmUgcGFnZSByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCB4YXJyYXkgbWFuaXB1bGF0aW9ucy4gVGhleSBkbyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbHRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJ1ZmZlcnMuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyB3b3VsZCBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGxvY2tpbmcgaXNzdWVzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBmaXhlcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL2h1Z2VfbWVtb3J5LmMgYW5kIG1tL3N3YXBfc3RhdGUuYywgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCBoYXMgZnVuY3Rpb25hbCBpbXBhY3QuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjM4LjUwMjk0ODE3OFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI3MjAwMjAxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDZkYWUzZTc4MzkyNzY4MDUyYTE0MjZhZGJkN2IzOWM3YTJhMjE3ZDJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi5jYzlmN2UwZDQxOTRlIDEwMDY0NFxcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXFxuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxcbiB7XFxuIFxcdGludCBpID0gMDtcXG4gXFxuLVxcdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXFxuLVxcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4tXFx0XFx0cmV0dXJuO1xcbiBcXHRmb3IgKDs7KSB7XFxuIFxcdFxcdHJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTtcXG4gXFx0XFx0aSArPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuQEAgLTM3NTUsOCArMzc1Miw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSAtIHNwbGl0cyBhbiB1bm1hcHBlZCBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zIGluXFxuLSAqIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxcbisgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIC0gc3BsaXRzIGEgZnJvemVuIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3NcXG4rICogaW4gdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuXFxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXFxuICAqIEBuZXdfb3JkZXI6IHRoZSBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXIgc3BsaXQgZm9saW9zIChzaW5jZSBidWRkeVxcbiAgKiAgICAgICAgICAgICBhbGxvY2F0b3IgbGlrZSBzcGxpdCBnZW5lcmF0ZXMgZm9saW9zIHdpdGggb3JkZXJzIGZyb20gQGZvbGlvJ3NcXG5AQCAtMzc2NCw3ICszNzYxLDYgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxcbiAgKiBAc3BsaXRfYXQ6IGluIGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXRcXG4gICogICAgICAgICAgICB3aWxsIGJlIHNwbGl0IHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIuXFxuICAqIEB4YXM6IHhhX3N0YXRlIHBvaW50aW5nIHRvIGZvbGlvLVxcdTAwM2VtYXBwaW5nLVxcdTAwM2VpX3BhZ2VzIGFuZCBsb2NrZWQgYnkgY2FsbGVyXFxuLSAqIEBtYXBwaW5nOiBAZm9saW8tXFx1MDAzZW1hcHBpbmdcXG4gICogQHNwbGl0X3R5cGU6IGlmIHRoZSBzcGxpdCBpcyB1bmlmb3JtIG9yIG5vdCAoYnVkZHkgYWxsb2NhdG9yIGxpa2Ugc3BsaXQpXFxuICAqXFxuICAqXFxuQEAgLTM3OTUsMTEgKzM3OTEsMTIgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcXHUwMDNjMCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlXFxuICAqIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlciwgdGhlIGNhbGxlciBuZWVkcyB0byBjaGVjaylcXG4gICovXFxuLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxcbitzdGF0aWMgaW50IF9fc3BsaXRfZnJvemVuX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXFxuLVxcdFxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4rXFx0XFx0ZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4gXFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4rXFx0Y29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcdGludCBzdGFydF9vcmRlciA9IHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNID8gbmV3X29yZGVyIDogb2xkX29yZGVyIC0gMTtcXG4gXFx0c3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbztcXG5AQCAtMzgxNCwxMSArMzgxMSwxMSBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4gXFx0ICAgICBzcGxpdF9vcmRlci0tKSB7XFxuIFxcdFxcdGludCBucl9uZXdfZm9saW9zID0gMVVMIFxcdTAwM2NcXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XFxuIFxcbi1cXHRcXHQvKiBvcmRlci0xIGFub255bW91cyBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXFxuLVxcdFxcdGlmIChpc19hbm9uIFxcdTAwMjZcXHUwMDI2IHNwbGl0X29yZGVyID09IDEpXFxuK1xcdFxcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXFxuK1xcdFxcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFxcdTAwMjZcXHUwMDI2IHNwbGl0X29yZGVyID09IDEpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4tXFx0XFx0aWYgKG1hcHBpbmcpIHtcXG4rXFx0XFx0aWYgKHhhcykge1xcbiBcXHRcXHRcXHQvKlxcbiBcXHRcXHRcXHQgKiB1bmlmb3JtIHNwbGl0IGhhcyB4YXNfc3BsaXRfYWxsb2MoKSBjYWxsZWQgYmVmb3JlXFxuIFxcdFxcdFxcdCAqIGlycSBpcyBkaXNhYmxlZCB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LCB3aGVyZWFzXFxuQEAgLTM4NzgsMzIgKzM4NzUsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdFxcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxcbiB7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbitcXG4gXFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XFxuIFxcdC8qXFxuIFxcdCAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlXFxuLVxcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXFxuLVxcdCAqXFxuLVxcdCAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZVxcbi1cXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cXG4rXFx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvXFxuK1xcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFmb2xpby1cXHUwMDNlbWFwcGluZyBcXHUwMDI2XFx1MDAyNiAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4rXFx0aWYgKCFmb2xpby1cXHUwMDNlbWFwcGluZyBcXHUwMDI2XFx1MDAyNiAhaXNfc3dhcGNhY2hlKVxcbiBcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbiBcXG4tXFx0Lyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqL1xcbi1cXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcXG4tXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcbiBcXHQvKlxcbi1cXHQgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwXFxuLVxcdCAqXFxuLVxcdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cXG4tXFx0ICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueVxcbi1cXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXFxuLVxcdCAqIGhlcmUuXFxuK1xcdCAqIE9yZGVyLTEgaXMgdW5zdXBwb3J0ZWQ6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciB0aGVcXG4rXFx0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFxcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxcbitcXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcXG4rXFx0ICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcXHUwMDI2XFx1MDAyNiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcXG4rXFx0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXFx1MDAyNlxcdTAwMjYgbmV3X29yZGVyID09IDEpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHR9XFxuIFxcbiBcXHRpZiAoaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuQEAgLTM5MTEsMzkgKzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcXG4gXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXFxuK1xcdCAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0J3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXFxuK1xcdCAqIHNobWVtIG1hcHBpbmcgYWZ0ZXJ3YXJkLiBUaGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmcgdGhlbVxcbitcXHQgKiBoZW5jZSByZWplY3QgaXQgaGVyZSB1cCBmcm9udCBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWlzX2Fub24gXFx1MDAyNlxcdTAwMjYgaXNfc3dhcGNhY2hlIFxcdTAwMjZcXHUwMDI2IGZvbGlvLVxcdTAwM2VtYXBwaW5nKVxcbitcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLS8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHBhZ2VjYWNoZSBvciB0aGUgc3dhcGNhY2hlLiAqL1xcbi1zdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX2NhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiB7XFxuLVxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuK1xcdGlmICghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFx0cmV0dXJuIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBib29sIGRvX2xydSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBwZ29mZl90IGVuZCwgaW50ICpucl9zaG1lbV9kcm9wcGVkKVxcbisvKipcXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKCkgLSBzcGxpdCBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW9cXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWRcXG4rICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXFxuKyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxcbisgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcXG4rICogQGRvX2xydTogaWYgdHJ1ZSwgYWRkIGFmdGVyLXNwbGl0IGZvbGlvcyB0byBAbGlzdCBpZiBub24gTlVMTCwgb3RoZXJ3aXNlIHRvXFxuKyAqICAgICAgICAgIHRoZSBMUlUgbGlzdFxcbisgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyXFxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKlxcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW8uIEl0IHVubWFwcyBAZm9saW8gKHVubGVzc1xcbisgKiBAYW5vbl91bm1hcCBpcyBmYWxzZSksIGZyZWV6ZXMgaXRzIHJlZmNvdW50LCBhbmQgcGVyZm9ybXMgdGhlIHNwbGl0LCB1cGRhdGVzXFxuKyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC5cXG4rICovXFxuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxcbitcXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxcbiB7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuK1xcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xcbitcXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xcbiBcXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4gXFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xcbiBcXHRpbnQgcmV0ID0gMDtcXG4gXFxuLVxcdFZNX1dBUk5fT05fT05DRSghbWFwcGluZyBcXHUwMDI2XFx1MDAyNiBlbmQpO1xcbitcXHQvKlxcbitcXHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcXG4rXFx0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXFxuK1xcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xcbitcXHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xcbitcXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhbm9uX3VubWFwKSB7XFxuK1xcdFxcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcXG4rXFx0XFx0aWYgKCFhbm9uX3ZtYSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0XFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdGhlIG9wdGlvbmFsIHVubWFwLiAqL1xcbitcXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChhbm9uX3VubWFwKVxcbitcXHRcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xcbitcXG4gXFx0LypcXG4gXFx0ICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dFxcbiBcXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXFxuIFxcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxcbiBcXHQgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlXFxuIFxcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXFxuK1xcdCAqXFxuK1xcdCAqIE9ubHkgYW5vbiBmb2xpb3MgYXJlIGV2ZXIgcXVldWVkIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBsaXN0LFxcbitcXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXFxuIFxcdCAqL1xcbi1cXHRkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBvbGRfb3JkZXIgXFx1MDAzZSAxO1xcbitcXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFxcdTAwM2UgMSBcXHUwMDI2XFx1MDAyNiBpc19hbm9uO1xcbiBcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbiBcXHRcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XFxuIFxcbkBAIC0zOTUyLDEyOCArNDAwMSwyNTYgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cXG4gXFx0XFx0bHJ1ID0gbGlzdF9scnVfbG9jayhcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxcbiBcXHRcXHRcXHRcXHQgICAgZm9saW9fbmlkKGZvbGlvKSwgXFx1MDAyNm1lbWNnKTtcXG4gXFx0fVxcbi1cXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XFxuLVxcdFxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbi1cXHRcXHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XFxuIFxcbitcXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcXG4gXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0X19saXN0X2xydV9kZWwoXFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxcbi1cXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmZvbGlvLVxcdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XFxuLVxcdFxcdFxcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xcbi1cXHRcXHRcXHRcXHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xcbi1cXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xcbiBcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFx0XFx0fVxcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIG91dF9ub19zcGxpdDtcXG4rXFx0fVxcbiBcXG4tXFx0XFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0XFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbi1cXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHQgICAgbmV3X29yZGVyIFxcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XFxuLVxcdFxcdFxcdFxcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdFxcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0TlJfU0hNRU1fVEhQUywgLW5yKTtcXG4tXFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHROUl9GSUxFX1RIUFMsIC1ucik7XFxuLVxcdFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbitcXHRcXHRfX2xpc3RfbHJ1X2RlbChcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXFxuK1xcdFxcdFxcdCAgICAgICBcXHUwMDI2Zm9saW8tXFx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcXG4rXFx0XFx0XFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XFxuK1xcdFxcdFxcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XFxuIFxcdFxcdH1cXG4rXFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGlmIChtYXBwaW5nKSB7XFxuLVxcdFxcdFxcdFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XFxuLVxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuK1xcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XFxuIFxcbi1cXHRcXHRcXHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xcbi1cXHRcXHR9XFxuK1xcdGlmIChkb19scnUpXFxuK1xcdFxcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcXG4gXFxuLVxcdFxcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHRyZXQgPSBfX3NwbGl0X2Zyb3plbl9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCwgc3BsaXRfdHlwZSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XFxuK1xcdCAqIHBsYWNlLiBLZWVwIHRoZSBoZWFkIEBmb2xpbyBmcm96ZW4gdW50aWwgdGhlIGVuZDogc3ViIGVudHJpZXNcXG4rXFx0ICogaW4gc3dhcCBjYWNoZSBtdXN0IGJlIHVwZGF0ZWQgZmlyc3QsIHNvIGEgY29uY3VycmVudFxcbitcXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXFxuK1xcdCAqIGVudHJ5IChmb2xpb190cnlfZ2V0KCkgd2lsbCBmYWlsIG9uIHRoZSBoZWFkIEBmb2xpbyB1bnRpbCB1bmZyZWV6ZSkuXFxuK1xcdCAqL1xcbitcXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xcbitcXHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcXG4rXFx0XFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcXG4rXFx0XFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4rXFx0XFx0XFx0XFx0ICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XFxuIFxcdFxcdGlmIChkb19scnUpXFxuLVxcdFxcdFxcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcXG4rXFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXHRcXHRpZiAoY2kpXFxuK1xcdFxcdFxcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcXG4rXFx0fVxcbiBcXG4tXFx0XFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xcbitcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcXG4rXFx0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpO1xcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxcbi1cXHRcXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGVcXG4tXFx0XFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXFxuLVxcdFxcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuLVxcdFxcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcXG4tXFx0XFx0ICogQGZvbGlvLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcXG4tXFx0XFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XFxuLVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xcbitcXHRpZiAoZG9fbHJ1KVxcbitcXHRcXHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XFxuK1xcdGlmIChjaSlcXG4rXFx0XFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XFxuK291dF9ub19zcGxpdDpcXG4rXFx0bG9jYWxfaXJxX2VuYWJsZSgpO1xcbitcXHRpZiAoYW5vbl92bWEpIHtcXG4rXFx0XFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcXG4rXFx0XFx0XFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XFxuK1xcdFxcdHJlbWFwX3BhZ2UoZm9saW8sIDEgXFx1MDAzY1xcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xcbitcXHR9XFxuK291dF91bmxvY2s6XFxuK1xcdGlmIChhbm9uX3ZtYSkge1xcbitcXHRcXHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xcbitcXHRcXHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuIFxcbi1cXHRcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbisvKipcXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW9cXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWQgYW5kIGZpbGUtYmFja2VkXFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXFxuKyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXRcXG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXFxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKlxcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0c1xcbisgKiByZWZjb3VudCwgYW5kIHBlcmZvcm0gdGhlIHNwbGl0LCB1cGRhdGVzIHRoZSBwYWdlIGNhY2hlIGVudHJpZXMuIFNwbGl0XFxuKyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuIChpZiAtRU5PTUVNXFxuKyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKVxcbisgKi9cXG4rc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuK3tcXG4rXFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4rXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2bWFwcGluZy1cXHUwMDNlaV9wYWdlcywgZm9saW8tXFx1MDAzZWluZGV4KTtcXG4rXFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcXG4rXFx0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcXG4rXFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xcbitcXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4rXFx0cGdvZmZfdCBlbmQgPSAwO1xcbitcXHRnZnBfdCBnZnA7XFxuK1xcdGludCByZXQgPSAwO1xcbiBcXG4tXFx0XFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4rXFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuK1xcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0XFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXHQvKlxcbitcXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXFxuK1xcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cXG4rXFx0ICovXFxuK1xcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuK1xcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cXG4tXFx0XFx0XFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChjaSkge1xcbi1cXHRcXHRcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spO1xcbitcXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gZmFpbF9mcmVlO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXFxuLVxcdFxcdFxcdGlmICghbWFwcGluZylcXG4tXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdG1hcHBpbmdfc2V0X3VwZGF0ZShcXHUwMDI2eGFzLCBtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdFxcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xcbi1cXHRcXHRcXHRpZiAobmV3X2ZvbGlvLVxcdTAwM2VpbmRleCBcXHUwMDNjIGVuZCkge1xcbi1cXHRcXHRcXHRcXHRfX3hhX3N0b3JlKFxcdTAwMjZtYXBwaW5nLVxcdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXFx1MDAzZWluZGV4LFxcbi1cXHRcXHRcXHRcXHRcXHQgICBuZXdfZm9saW8sIDApO1xcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcXG4rXFx0XFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XFxuLVxcdFxcdFxcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVxcdTAwM2VpbmRleCBcXHUwMDNlPSBlbmQgKi9cXG4tXFx0XFx0XFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXFx1MDAyNlxcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcXG4tXFx0XFx0XFx0XFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxcbi1cXHRcXHRcXHRcXHRcXHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXFx1MDAzZWhvc3QpKTtcXG4tXFx0XFx0XFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xcbi1cXHRcXHRcXHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcXG4rXFx0XFx0eGFzX3NldF9vcmRlcihcXHUwMDI2eGFzLCBmb2xpby1cXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XFxuK1xcdFxcdHhhc19zcGxpdF9hbGxvYyhcXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xcbitcXHRcXHRpZiAoeGFzX2Vycm9yKFxcdTAwMjZ4YXMpKSB7XFxuK1xcdFxcdFxcdHJldCA9IHhhc19lcnJvcihcXHUwMDI2eGFzKTtcXG4rXFx0XFx0XFx0Z290byBmYWlsX2ZyZWU7XFxuIFxcdFxcdH1cXG4rXFx0fVxcbiBcXG4tXFx0XFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuLVxcdFxcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4tXFx0XFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4tXFx0XFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcXG4rXFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdGlmIChkb19scnUpXFxuLVxcdFxcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovXFxuK1xcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuK1xcdFxcdHJldCA9IC1FQUdBSU47XFxuK1xcdFxcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcXG4rXFx0fVxcbiBcXG4tXFx0XFx0aWYgKGNpKVxcbi1cXHRcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHQvKlxcbitcXHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbitcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbitcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuK1xcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbitcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbitcXHQgKi9cXG4rXFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbitcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuK1xcbitcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHR4YXNfbG9ja19pcnEoXFx1MDAyNnhhcyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxcbitcXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cXG4rXFx0ICovXFxuK1xcdGlmICh4YXNfbG9hZChcXHUwMDI2eGFzKSAhPSBmb2xpbykge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcXG4rXFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2IG5ld19vcmRlciBcXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcXG4rXFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XFxuK1xcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcXHUwMDI2eGFzLCBzcGxpdF90eXBlKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcXG4rXFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlXFxuK1xcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xcbitcXHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxcbitcXHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXFxuK1xcdCAqIEBmb2xpby5cXG4rXFx0ICovXFxuK1xcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XFxuK1xcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcXG4rXFxuK1xcdFxcdC8qIGNvbXB1dGUgbmV4dCBiZWZvcmUgdGhlIGZvbGlvIGNhbiBiZSBmcmVlZCBiZWxvdyAqL1xcbitcXHRcXHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xcbitcXG4rXFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4rXFx0XFx0XFx0XFx0ICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSArIDEpO1xcbitcXG4rXFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXG4rXFx0XFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXFxuK1xcdFxcdGlmIChuZXdfZm9saW8tXFx1MDAzZWluZGV4IFxcdTAwM2MgZW5kKSB7XFxuK1xcdFxcdFxcdF9feGFfc3RvcmUoXFx1MDAyNm1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cXHUwMDNlaW5kZXgsXFxuK1xcdFxcdFxcdFxcdCAgIG5ld19mb2xpbywgMCk7XFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHR9XFxuLVxcdFxcdHJldHVybiAtRUFHQUlOO1xcbitcXG4rXFx0XFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXFx1MDAzZWluZGV4IFxcdTAwM2U9IGVuZCAqL1xcbitcXHRcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0XFx0bnJfc2htZW1fZHJvcHBlZCArPSBucl9wYWdlcztcXG4rXFx0XFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxcbitcXHRcXHRcXHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVxcdTAwM2Vob3N0KSk7XFxuK1xcdFxcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcXG4rXFx0XFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XFxuIFxcdH1cXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuK1xcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4rXFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4rXFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuK1xcdCAqL1xcbitcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xcbitcXHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XFxuK2ZhaWw6XFxuK1xcdC8qXFxuK1xcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcXG4rXFx0ICogcmVtZW1iZXIgdG8gYWRkIHJlbWFwX3BhZ2UoKSBhbmQgYWRhcHQgaXQuXFxuK1xcdCAqL1xcbitcXHR4YXNfdW5sb2NrX2lycShcXHUwMDI2eGFzKTtcXG4rZmFpbF9tbWFwX3VubG9jazpcXG4rXFx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXFxuK1xcdFxcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXFx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xcbitcXHQvKlxcbitcXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xcbitcXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXFxuK1xcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcXG4rXFx0ICogdGhlIG1hcHBpbmcuXFxuK1xcdCAqL1xcbitcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuK2ZhaWxfZnJlZTpcXG4rXFx0LyogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbWVtY2cgKi9cXG4rXFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbitcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuK1xcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbkBAIC00MDg2LDkgKzQyNjMsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxcbiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcXG4gICpcXG4tICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuXFxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cXG4gICogSXQgaXMgaW4gY2hhcmdlIG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlIHNwbGl0IGlzIHN1cHBvcnRlZCBvciBub3QgYW5kXFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cXG4gICpcXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZFxcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcXG5AQCAtNDEwMiwxNyArNDI3OSwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0XFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCxcXG4gXFx0XFx0c3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4tXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2Zm9saW8tXFx1MDAzZW1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIGZvbGlvLVxcdTAwM2VpbmRleCk7XFxuK1xcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xcbiBcXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xcbi1cXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XFxuLVxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcXG4tXFx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcXG4tXFx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xcbi1cXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xcbi1cXHRwZ29mZl90IGVuZCA9IDA7XFxuIFxcdGludCByZXQ7XFxuIFxcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xcbkBAIC00MTIwLDE0MSArNDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFxuIFxcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XFxuIFxcdFxcdHJldCA9IC1FSU5WQUw7XFxuLVxcdFxcdGdvdG8gb3V0X25vX21lbWNnO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4gXFx0aWYgKG5ld19vcmRlciBcXHUwMDNlPSBvbGRfb3JkZXIpIHtcXG4gXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0Z290byBvdXRfbm9fbWVtY2c7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xcbiBcXHRpZiAocmV0KSB7XFxuIFxcdFxcdFZNX1dBUk5fT05DRShyZXQgPT0gLUVJTlZBTCwgXFxcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1xcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF9ub19tZW1jZztcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxcbi1cXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXFxuLVxcdCAqL1xcbi1cXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xcbi1cXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcXG4tXFxuLVxcdGlmIChpc19hbm9uKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxcbi1cXHRcXHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXFxuLVxcdFxcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcXG4tXFx0XFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXFxuLVxcdFxcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXFxuLVxcdFxcdCAqIG9wZXJhdGlvbnMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XFxuLVxcdFxcdGlmICghYW5vbl92bWEpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVCVVNZO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4tXFx0XFx0bWFwcGluZyA9IE5VTEw7XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuLVxcdFxcdGdmcF90IGdmcDtcXG4tXFxuLVxcdFxcdG1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4tXFx0XFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuLVxcdFxcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2XFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdEdGUF9SRUNMQUlNX01BU0spO1xcbi1cXG4tXFx0XFx0aWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVCVVNZO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0bWFwcGluZ19zZXRfdXBkYXRlKFxcdTAwMjZ4YXMsIG1hcHBpbmcpO1xcbi1cXG4tXFx0XFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XFxuLVxcdFxcdFxcdHhhc19zZXRfb3JkZXIoXFx1MDAyNnhhcywgZm9saW8tXFx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xcbi1cXHRcXHRcXHR4YXNfc3BsaXRfYWxsb2MoXFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcXG4tXFx0XFx0XFx0aWYgKHhhc19lcnJvcihcXHUwMDI2eGFzKSkge1xcbi1cXHRcXHRcXHRcXHRyZXQgPSB4YXNfZXJyb3IoXFx1MDAyNnhhcyk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGFub25fdm1hID0gTlVMTDtcXG4tXFx0XFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbi1cXHRcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbi1cXHRcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuLVxcdFxcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbi1cXHRcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbi1cXHRcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4tXFx0XFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuLVxcdH1cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSB3aWxsXFxuLVxcdCAqIHNwbGl0IFBNRHNcXG4tXFx0ICovXFxuLVxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuLVxcdFxcdHJldCA9IC1FQUdBSU47XFxuLVxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4tXFx0fVxcbi1cXG4tXFx0dW5tYXBfZm9saW8oZm9saW8pO1xcbi1cXG4tXFx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cXG4tXFx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcXG4tXFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS5cXG4tXFx0XFx0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHR4YXNfbG9jayhcXHUwMDI2eGFzKTtcXG4tXFx0XFx0eGFzX3Jlc2V0KFxcdTAwMjZ4YXMpO1xcbi1cXHRcXHRpZiAoeGFzX2xvYWQoXFx1MDAyNnhhcykgIT0gZm9saW8pIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4tXFx0XFx0XFx0Z290byBmYWlsO1xcbi1cXHRcXHR9XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbi1cXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFxcdTAwMjZ4YXMsIG1hcHBpbmcsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdHRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgXFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xcbi1mYWlsOlxcbi1cXHRpZiAobWFwcGluZylcXG4tXFx0XFx0eGFzX3VubG9jayhcXHUwMDI2eGFzKTtcXG4tXFxuLVxcdGxvY2FsX2lycV9lbmFibGUoKTtcXG4tXFxuLVxcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxcbi1cXHRcXHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVxcdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcXG4tXFxuLVxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2IGlzX2Fub24gXFx1MDAyNlxcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcXG4tXFx0XFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XFxuLVxcbi1cXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFxcdTAwM2NcXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXFxuLVxcdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cXG4tXFx0ICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5XFxuLVxcdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXFxuLVxcdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxcbi1cXHQgKi9cXG4tXFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xcbi1cXHRcXHRtYXBwaW5nID0gTlVMTDtcXG4tXFx0fVxcbitcXHRpZiAoaXNfYW5vbilcXG4rXFx0XFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbitcXHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXFxuK1xcdFxcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBmYWxzZSwgbGlzdCwgc3BsaXRfdHlwZSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXFxuQEAgLTQyNjUsMjkgKzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXFxuIFxcdFxcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxcbi1cXHRcXHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXFxuK1xcdFxcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXFxuIFxcdFxcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XFxuK1xcdFxcdGlmIChpc19zd2FwY2FjaGUgXFx1MDAyNlxcdTAwMjYgIWZvbGlvX21hcHBlZChuZXdfZm9saW8pKVxcbitcXHRcXHRcXHRmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XFxuK1xcdFxcdGZvbGlvX3B1dChuZXdfZm9saW8pO1xcbiBcXHR9XFxuIFxcbi1vdXRfdW5sb2NrOlxcbi1cXHRpZiAoYW5vbl92bWEpIHtcXG4tXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4tXFx0XFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcXG4tXFx0fVxcbi1cXHRpZiAobWFwcGluZylcXG4tXFx0XFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xcbiBvdXQ6XFxuLVxcdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXFxuLVxcdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcXG4tXFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbi1vdXRfbm9fbWVtY2c6XFxuLVxcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpXFxuIFxcdFxcdGNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7XFxuIFxcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcXG5AQCAtNDMxMSwyOSArNDM2MCwyMCBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gICogaXNvbGF0ZWQgZnJvbSBMUlUgKGlmIGFwcGxpY2FibGUpXFxuICAqXFxuICAqIFVwb24gcmV0dXJuLCB0aGUgZm9saW8gaXMgbm90IHJlbWFwcGVkLCBzcGxpdCBmb2xpb3MgYXJlIG5vdCBhZGRlZCB0byBMUlUsXFxuLSAqIGZyZWVfZm9saW9fYW5kX3N3YXBfY2FjaGUoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxcbisgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxcbiAgKlxcbiAgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVBR0FJTiBpZiB0aGUgZm9saW8gY2Fubm90IGJlIHNwbGl0IChlLmcuLCBkdWUgdG9cXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxcbiAgKi9cXG4gaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuIHtcXG4tXFx0aW50IHJldCA9IDA7XFxuLVxcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oZm9saW9fbWFwcGVkKGZvbGlvKSwgZm9saW8pO1xcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xcbiBcXG4tXFx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpXFxuLVxcdFxcdHJldHVybiAtRUFHQUlOO1xcbi1cXG4tXFx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcXG4tXFx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgTlVMTCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0TlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0MCwgTlVMTCk7XFxuLVxcdGxvY2FsX2lycV9lbmFibGUoKTtcXG4tXFx0cmV0dXJuIHJldDtcXG4rXFx0cmV0dXJuIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIGZhbHNlLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTtcXG4gfVxcbiBcXG4gLypcXG5AQCAtNDM1MiwxMCArNDM5Miw5IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXFxuICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLlxcbiAgKlxcbi0gKiA0KSBAbmV3X29yZGVyIFxcdTAwM2UgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3RcXG4tICogICAgc3VwcG9ydGVkIGZvciBub24tZmlsZS1iYWNrZWQgZm9saW9zLCBiZWNhdXNlIGZvbGlvLVxcdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcXG4tICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTFcXG4tICogICAgZm9saW8gb25seSBoYXMgc3VicGFnZXMgMCBhbmQgMS4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcXG4rICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yXFxuKyAqICAgIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xIGZvbGlvcyBsYWNrLCBhbmQgYSBzd2FwY2FjaGUgZm9saW8gbWF5XFxuKyAqICAgIGJlY29tZSBhbm9uIG9uY2UgZmF1bHRlZCBpbi4gRmlsZS1iYWNrZWQgb3JkZXItMSBmb2xpb3MgYXJlIHN1cHBvcnRlZCxcXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxcbiAgKlxcbiAgKiBBZnRlciBzcGxpdHRpbmcsIHRoZSBjYWxsZXIncyBmb2xpbyByZWZlcmVuY2Ugd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byBAcGFnZSxcXG5AQCAtNDM4NCw3ICs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuICAqIHdpdGggdGhlIGZvbGlvLiBTcGxpdHRpbmcgdG8gb3JkZXIgMCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIGZvbGlvcy5cXG4gICovXFxuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbi1cXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbiB7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbiBcXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXFxuaW5kZXggYjc2ZWIzZDg3NmZkNy4uNTlhNTc3ZjY4NWI1YiAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwX3N0YXRlLmNcXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcXG5AQCAtMzg5LDggKzM4OSw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4gXFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xcbiBcXHRcXHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVxcdTAwM2Vzd2FwKTtcXG4gXFx0XFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcXG4tXFx0XFx0d2hpbGUgKGNpX29mZisrIFxcdTAwM2MgY2lfZW5kKVxcbitcXHRcXHRkbyB7XFxuIFxcdFxcdFxcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcXG4rXFx0XFx0fSB3aGlsZSAoKytjaV9vZmYgXFx1MDAzYyBjaV9lbmQpO1xcbiBcXHR9XFxuIH1cXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjM5Ljc3NTU4MzU2OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjExMzA3Mzk1MDYwNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZml4ZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS9odWdlX21lbW9yeS5jIGFuZCBtbS9zd2FwX3N0YXRlLmMsIHdoaWNoIGlzIHJlYWNoYWJsZSBhbmQgaGFzIGZ1bmN0aW9uYWwgaW1wYWN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggY2VkNDAwZjcyZDQzYS4uY2M5ZjdlMGQ0MTk0ZSAxMDA2NDRcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcbisrKyBiL21tL2h1Z2VfbWVtb3J5LmNcbkBAIC0zNTg5LDkgKzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncylcbiB7XG4gXHRpbnQgaSA9IDA7XG4gXG4tXHQvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqL1xuLVx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuLVx0XHRyZXR1cm47XG4gXHRmb3IgKDs7KSB7XG4gXHRcdHJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTtcbiBcdFx0aSArPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG5AQCAtMzc1NSw4ICszNzUyLDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuIH1cbiBcbiAvKipcbi0gKiBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgLSBzcGxpdHMgYW4gdW5tYXBwZWQgQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvcyBpblxuLSAqIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgLSBzcGxpdHMgYSBmcm96ZW4gQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvc1xuKyAqIGluIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XG4gICogICAgICAgICAgICAgYWxsb2NhdG9yIGxpa2Ugc3BsaXQgZ2VuZXJhdGVzIGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tIEBmb2xpbydzXG5AQCAtMzc2NCw3ICszNzYxLDYgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuICAqIEBzcGxpdF9hdDogaW4gYnVkZHkgYWxsb2NhdG9yIGxpa2Ugc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdFxuICAqICAgICAgICAgICAgd2lsbCBiZSBzcGxpdCB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyLlxuICAqIEB4YXM6IHhhX3N0YXRlIHBvaW50aW5nIHRvIGZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcyBhbmQgbG9ja2VkIGJ5IGNhbGxlclxuLSAqIEBtYXBwaW5nOiBAZm9saW8tXHUwMDNlbWFwcGluZ1xuICAqIEBzcGxpdF90eXBlOiBpZiB0aGUgc3BsaXQgaXMgdW5pZm9ybSBvciBub3QgKGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0KVxuICAqXG4gICpcbkBAIC0zNzk1LDExICszNzkxLDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4rc3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuLVx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4rXHRcdGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsMTEgKzM4MTEsMTEgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHQgICAgIHNwbGl0X29yZGVyLS0pIHtcbiBcdFx0aW50IG5yX25ld19mb2xpb3MgPSAxVUwgXHUwMDNjXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XG4gXG4tXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbi1cdFx0aWYgKGlzX2Fub24gXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4rXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4rXHRcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRpZiAobWFwcGluZykge1xuK1x0XHRpZiAoeGFzKSB7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiB1bmlmb3JtIHNwbGl0IGhhcyB4YXNfc3BsaXRfYWxsb2MoKSBjYWxsZWQgYmVmb3JlXG4gXHRcdFx0ICogaXJxIGlzIGRpc2FibGVkIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnksIHdoZXJlYXNcbkBAIC0zODc4LDMyICszODc1LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHQvKlxuIFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcbi1cdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXG4tXHQgKlxuLVx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXG4tXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cbitcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuK1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFpc19zd2FwY2FjaGUpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4tXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuIFx0Lypcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcbi1cdCAqXG4tXHQgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tXG4tXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXG4tXHQgKiBoZXJlLlxuK1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuK1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4rXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcbitcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4rXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgKzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdGlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4rXHQvKlxuK1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIGNhbiBvbmx5IGJlIGFcbitcdCAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0J3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXG4rXHQgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW1cbitcdCAqIGhlbmNlIHJlamVjdCBpdCBoZXJlIHVwIGZyb250IGJlZm9yZSB0b3VjaGluZyBhbnl0aGluZy5cbitcdCAqL1xuK1x0aWYgKCFpc19hbm9uIFx1MDAyNlx1MDAyNiBpc19zd2FwY2FjaGUgXHUwMDI2XHUwMDI2IGZvbGlvLVx1MDAzZW1hcHBpbmcpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4rLyoqXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKCkgLSBzcGxpdCBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW9cbisgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXG4rICogQGRvX2xydTogaWYgdHJ1ZSwgYWRkIGFmdGVyLXNwbGl0IGZvbGlvcyB0byBAbGlzdCBpZiBub24gTlVMTCwgb3RoZXJ3aXNlIHRvXG4rICogICAgICAgICAgdGhlIExSVSBsaXN0XG4rICogQGFub25fdW5tYXA6IGlmIHRydWUsIHVubWFwIEBmb2xpbyBiZWZvcmUgdGhlIHNwbGl0IGFuZCByZW1hcCBpdCBhZnRlclxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbisgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICpcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW8uIEl0IHVubWFwcyBAZm9saW8gKHVubGVzc1xuKyAqIEBhbm9uX3VubWFwIGlzIGZhbHNlKSwgZnJlZXplcyBpdHMgcmVmY291bnQsIGFuZCBwZXJmb3JtcyB0aGUgc3BsaXQsIHVwZGF0ZXNcbisgKiB0aGUgc3dhcCBjYWNoZSBlbnRyaWVzLiBTcGxpdCBmb2xpb3MgYXJlIHVuZnJvemVuIGFuZCByZW1hcHBlZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLlxuKyAqL1xuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4rXHRcdFx0XHRcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4rXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuK1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuK1x0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4rXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xuIFx0c3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1O1xuK1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xuIFx0aW50IHJldCA9IDA7XG4gXG4tXHRWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgXHUwMDI2XHUwMDI2IGVuZCk7XG4rXHQvKlxuK1x0ICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5XG4rXHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cbitcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xuK1x0ICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXNcbitcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxuK1x0ICovXG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4rXHRcdGlmICghYW5vbl92bWEpXG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4rXHR9XG4rXG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gb3V0X3VubG9jaztcbitcdH1cbitcbitcdGlmIChhbm9uX3VubWFwKVxuK1x0XHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuK1xuIFx0LypcbiBcdCAqIElmIHRoaXMgZm9saW8gY2FuIGJlIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBxdWV1ZSwgbG9jayBvdXRcbiBcdCAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXNcbiBcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxuIFx0ICogbG9jayBhbmQgbXVzdCBjbGVhbiB1cCB0aGUgTFJVIHN0YXRlIC0gdGhlIHNhbWUgZGVxdWV1ZSB3ZVxuIFx0ICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC5cbitcdCAqXG4rXHQgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCxcbitcdCAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy5cbiBcdCAqL1xuLVx0ZGVxdWV1ZV9kZWZlcnJlZCA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG9sZF9vcmRlciBcdTAwM2UgMTtcbitcdGRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgXHUwMDNlIDEgXHUwMDI2XHUwMDI2IGlzX2Fub247XG4gXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuIFx0XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4gXG5AQCAtMzk1MiwxMjggKzQwMDEsMjU2IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gXHRcdGxydSA9IGxpc3RfbHJ1X2xvY2soXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxuIFx0XHRcdFx0ICAgIGZvbGlvX25pZChmb2xpbyksIFx1MDAyNm1lbWNnKTtcbiBcdH1cbi1cdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbi1cdFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4tXHRcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKSkge1xuIFx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuLVx0XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuLVx0XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4tXHRcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbi1cdFx0XHRcdFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuLVx0XHRcdH1cbiBcdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbiBcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0fVxuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF9ub19zcGxpdDtcbitcdH1cbiBcbi1cdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4tXG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX1NITUVNX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9GSUxFX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuK1x0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbitcdFx0X19saXN0X2xydV9kZWwoXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXG4rXHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbitcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbitcdFx0XHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcbitcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbitcdFx0XHRcdCAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbiBcdFx0fVxuK1x0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHR9XG4gXG4tXHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbi1cdFx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRcdH1cbitcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4gXG4tXHRcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbi1cdFx0fVxuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzXG4rXHQgKiBpbiBzd2FwIGNhY2hlIG11c3QgYmUgdXBkYXRlZCBmaXJzdCwgc28gYSBjb25jdXJyZW50XG4rXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXG4rXHQgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLlxuK1x0ICovXG4rXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuK1x0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4rXHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0XHRpZiAoY2kpXG4rXHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0fVxuIFxuLVx0XHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXG4tXHRcdFx0XHRcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XG4rXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbitcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuLVx0XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGVcbi1cdFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4tXHRcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2Zcbi1cdFx0ICogQGZvbGlvLlxuLVx0XHQgKi9cbi1cdFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbi1cdFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XG4rXHRpZiAoZG9fbHJ1KVxuK1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRpZiAoY2kpXG4rXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuK291dF9ub19zcGxpdDpcbitcdGxvY2FsX2lycV9lbmFibGUoKTtcbitcdGlmIChhbm9uX3ZtYSkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl92bWEpIHtcbitcdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcbitcdFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcbitcdH1cbiBcbi1cdFx0XHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xuK1x0cmV0dXJuIHJldDtcbit9XG4gXG4tXHRcdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcbisvKipcbisgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpb1xuKyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXG4rICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuKyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbisgKlxuKyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzXG4rICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdFxuKyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTVxuKyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKVxuKyAqL1xuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbitcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbitcdFx0XHRcdFx0ICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuK3tcbitcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbitcdFhBX1NUQVRFKHhhcywgXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuK1x0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XG4rXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4rXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XG4rXHR1bnNpZ25lZCBpbnQgbWluX29yZGVyO1xuK1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuK1x0cGdvZmZfdCBlbmQgPSAwO1xuK1x0Z2ZwX3QgZ2ZwO1xuK1x0aW50IHJldCA9IDA7XG4gXG4tXHRcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbi1cdFx0XHRcdFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbitcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuK1x0aWYgKG5ld19vcmRlciBcdTAwM2MgbWluX29yZGVyKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbi1cdFx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0LypcbitcdCAqIFN3aXRjaCB0byBmb2xpbydzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmRcbitcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cbitcdCAqL1xuK1x0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTtcbitcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cbi1cdFx0XHQgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChjaSkge1xuLVx0XHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuK1x0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKTtcbitcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdFx0Z290byBmYWlsX2ZyZWU7XG4rXHR9XG4gXG4tXHRcdFx0LyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqL1xuLVx0XHRcdGlmICghbWFwcGluZylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuK1x0bWFwcGluZ19zZXRfdXBkYXRlKFx1MDAyNnhhcywgbWFwcGluZyk7XG4gXG4tXHRcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4tXHRcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4tXHRcdFx0XHRfX3hhX3N0b3JlKFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgbmV3X2ZvbGlvLVx1MDAzZWluZGV4LFxuLVx0XHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuK1x0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4rXHRcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXG4tXHRcdFx0Vk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTtcbi1cdFx0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuLVx0XHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpIFx1MDAyNlx1MDAyNiBucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRcdFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4tXHRcdFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxuLVx0XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxuLVx0XHRcdFx0XHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuLVx0XHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbi1cdFx0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbitcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuK1x0XHR4YXNfc3BsaXRfYWxsb2MoXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xuK1x0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbitcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbitcdFx0XHRnb3RvIGZhaWxfZnJlZTtcbiBcdFx0fVxuK1x0fVxuIFxuLVx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbi1cdFx0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuLVx0XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuLVx0XHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICovXG4tXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpO1xuK1x0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbiBcbi1cdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbitcdH1cbiBcbi1cdFx0aWYgKGNpKVxuLVx0XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0fSBlbHNlIHtcbi1cdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdC8qXG4rXHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuK1x0ICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmVcbitcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbitcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuK1x0ICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy5cbitcdCAqL1xuK1x0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4rXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbitcbitcdHVubWFwX2ZvbGlvKGZvbGlvKTtcbitcbitcdHhhc19sb2NrX2lycShcdTAwMjZ4YXMpO1xuK1xuK1x0LypcbitcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4rXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbitcdCAqL1xuK1x0aWYgKHhhc19sb2FkKFx1MDAyNnhhcykgIT0gZm9saW8pIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgKyAxKSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuK1x0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcbitcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NITUVNX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuK1x0XHRlbHNlXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuK1x0fVxuK1xuK1x0LyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovXG4rXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRyZXQgPSBfX3NwbGl0X2Zyb3plbl9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbitcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0LyogY29tcHV0ZSBuZXh0IGJlZm9yZSB0aGUgZm9saW8gY2FuIGJlIGZyZWVkIGJlbG93ICovXG4rXHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICsgMSk7XG4rXG4rXHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcbitcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4rXHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuK1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4rXHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuK1x0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4tXHRcdHJldHVybiAtRUFHQUlOO1xuK1xuK1x0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuK1x0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0XHRucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuK1x0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbitcdFx0XHRcdFx0ICAgICAgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4rXHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbitcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4rXHQvKlxuK1x0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbitcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbitcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4rXHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqL1xuK1x0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgKyAxKTtcbitcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbitmYWlsOlxuK1x0LypcbitcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbitcdCAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LlxuK1x0ICovXG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSArNDI2Myw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbiAgKlxuLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiAgKiBJdCBpcyBpbiBjaGFyZ2Ugb2YgY2hlY2tpbmcgd2hldGhlciB0aGUgc3BsaXQgaXMgc3VwcG9ydGVkIG9yIG5vdCBhbmRcbi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICs0Mjc5LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxuIFx0XHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4tXHRYQV9TVEFURSh4YXMsIFx1MDAyNmZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuIFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbi1cdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbi1cdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcbi1cdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbi1cdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbi1cdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4tXHRwZ29mZl90IGVuZCA9IDA7XG4gXHRpbnQgcmV0O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbkBAIC00MTIwLDE0MSArNDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuK1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdGlmIChuZXdfb3JkZXIgXHUwMDNlPSBvbGRfb3JkZXIpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbiBcdGlmIChyZXQpIHtcbiBcdFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wiKTtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuLVx0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuLVx0ICovXG4tXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuLVx0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4tXG4tXHRpZiAoaXNfYW5vbikge1xuLVx0XHQvKlxuLVx0XHQgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGRcbi1cdFx0ICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYVxuLVx0XHQgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzXG4tXHRcdCAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9ja1xuLVx0XHQgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZVxuLVx0XHQgKiBvcGVyYXRpb25zLlxuLVx0XHQgKi9cbi1cdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuLVx0XHRpZiAoIWFub25fdm1hKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH0gZWxzZSB7XG4tXHRcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4tXHRcdGdmcF90IGdmcDtcbi1cbi1cdFx0bWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4tXHRcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuLVx0XHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpIHtcbi1cdFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjZcbi1cdFx0XHRcdFx0XHRcdEdGUF9SRUNMQUlNX01BU0spO1xuLVxuLVx0XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuLVx0XHRcdHJldCA9IC1FQlVTWTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbi1cbi1cdFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4tXHRcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuLVx0XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4tXHRcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4tXHRcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuLVxuLVx0XHRhbm9uX3ZtYSA9IE5VTEw7XG4tXHRcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuLVx0XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuLVx0XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4tXHRcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuLVx0XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuLVx0XHQgKi9cbi1cdFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4tXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuLVx0XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcbi1cdCAqIHNwbGl0IFBNRHNcbi1cdCAqL1xuLVx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbi1cdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0dW5tYXBfZm9saW8oZm9saW8pO1xuLVxuLVx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRpZiAobWFwcGluZykge1xuLVx0XHQvKlxuLVx0XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuLVx0XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbi1cdFx0ICovXG4tXHRcdHhhc19sb2NrKFx1MDAyNnhhcyk7XG4tXHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuLVx0XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuLVx0XHRcdHJldCA9IC1FQUdBSU47XG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHR9XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbitcdGlmIChpc19hbm9uKVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuK1x0ZWxzZVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgKzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XG4gXHRcdC8qXG4gXHRcdCAqIFN1YnBhZ2VzIHdob3NlIG1hcHBpbmcgaGFzIGJlZW4gemFwcGVkIG1heSBiZSBmcmVlZFxuIFx0XHQgKiBlYXJsaWVyLCBidXQgZnJlZWluZyB0aGVtIHJlcXVpcmVzIHRha2luZyB0aGVcbi1cdFx0ICogbHJ1X2xvY2ssIHNvIHdlIGRlZmVyIHB1dF9wYWdlKCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuK1x0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuIFx0XHQgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLlxuIFx0XHQgKi9cbi1cdFx0ZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pO1xuK1x0XHRpZiAoaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiAhZm9saW9fbWFwcGVkKG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzExLDI5ICs0MzYwLDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKVxuICAqXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcbi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbisgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgZmFsc2UsXG4rXHRcdFx0XHRcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTAgKzQzOTIsOSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXG4gICpcbi0gKiA0KSBAbmV3X29yZGVyIFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxuLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxuLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4rICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yXG4rICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcbisgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG5AQCAtNDM4NCw3ICs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxuICAqL1xuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0zODksOCArMzg5LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xuIFx0XHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVx1MDAzZXN3YXApO1xuIFx0XHRjaV9lbmQgPSBjaV9vZmYgKyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmKysgXHUwMDNjIGNpX2VuZClcbitcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbitcdFx0fSB3aGlsZSAoKytjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDI6MzkuNzc1NTg0OTc4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODM3NzUzMTA0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLZXJuZWwgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQncyB0b3VjaGVkIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AuIEl0IGxvb2tzIGxpa2UgdGhleSdyZSByZXdvcmtpbmcgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYywgd2hpY2ggaXMgaW50ZXJlc3RpbmcuIFNwZWNpZmljYWxseSwgaXQncyBhYm91dCBob3cgd2UgaGFuZGxlIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBUaGV5J3ZlIHJlbmFtZWQgYF9fc3BsaXRfdW5tYXBwZWRfZm9saW9gIHRvIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AsIHdoaWNoIGlzIGEgZ29vZCBpbmRpY2F0b3Igb2Ygc29tZSB1bmRlcmx5aW5nIGNoYW5nZSBpbiBzZW1hbnRpY3MsIGFuZCB0aGV5J3ZlIGFkZGVkIG5ldyBoZWxwZXJzIGxpa2UgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAuIGBfX2ZvbGlvX3NwbGl0YCBoYXMgYWxzbyBiZWVuIHJlZmFjdG9yZWQgdG8gdXNlIHRoZSBuZXcgaGVscGVycy4gVGhlIHBhdGNoIGFsc28gbW9kaWZpZXMgaG93IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBoYW5kbGVzIHN3YXBjYWNoZSBmb2xpb3MuIEFuZCwgaW1wb3J0YW50bHksIHRoZXJlJ3MgYSBjaGFuZ2UgaW4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCB0b28uXG5cbk15IGd1dCBzYXlzIHRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBhIGNsb3NlciBsb29rLCBlc3BlY2lhbGx5IGZvciBmdXp6aW5nLiBUaGlzIHRvdWNoZXMgKmNvcmUqIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUg4oCTIFRIUCwgZm9saW8gc3BsaXR0aW5nLCBhbmQgc3dhcC4gVGhlc2UgYXJlIHByaW1lIHRhcmdldHMgZm9yIGV4cG9zaW5nIHN1YnRsZSBtZW1vcnkgY29ycnVwdGlvbiBpc3N1ZXMuIEl0J3MgaGlnaC12YWx1ZSwgcG90ZW50aWFsbHkgaGlnaC1yaXNrLCBzbyBsZXQncyBkaWcgZGVlcGVyLlxuXG5TbywgbGV0J3MgaWRlbnRpZnkgdGhlIGtleSBzeW1ib2xzIGluIHRoaXMgcGF0Y2guIEkndmUgZ290OiBgcmVtYXBfcGFnZWAsIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnRgLCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCwgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlYCwgYF9fZm9saW9fc3BsaXRgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLlxuXG5Ob3csIHRoZSBpbXBvcnRhbnQgb25lcyBmb3IgYSBmdXp6aW5nIHBlcnNwZWN0aXZlIGFyZSB0aG9zZSB0aGF0IGFyZSBnbG9iYWxseSBhY2Nlc3NpYmxlIG9yIGV4dGVybmFsbHkgdmlzaWJsZSBhbmQgbm90IGlubGluZWQ6IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLCBhbmQgbWF5YmUgZXZlbiBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBJdCB3b3VsZCBiZSB3aXNlIHRvIHNlYXJjaCBmb3IgdXNhZ2VzIG9mIHRoZXNlIHRvIHVuZGVyc3RhbmQgcmVhY2hhYmlsaXR5IGFuZCBjcmVhdGUgdGVzdHMuXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHNlYXJjaGluZyBhbmQgdW5kZXJzdGFuZCBob3cgdGhlc2UgZml0IGludG8gdGhlIGxhcmdlciBtZW1vcnkgbWFuYWdlbWVudCBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjg3OSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ5MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjQ4LjE1MzExNzkyOVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTA0MTY4ODEzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl4oaW50fHZvaWR8Ym9vbCkgLipmb2xpb19jaGVja19zcGxpdHRhYmxlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwNz1pbnQgc3BsaXRfZm9saW9fdG9fbGlzdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDg6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDktXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zNzk0PXN0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3NC0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjM4NzU6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG5tbS9odWdlX21lbW9yeS5jLTM4NzYtXFx0XFx0XFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAyOjUxLjA1NzI5MjI4MloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUzODMxODg4MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSBtZW50YWwgbWFwcGluZyBwcm9jZXNzLCBhcyBJIHVuZGVyc3RhbmQgaXQ6XG5cbioqTWFwcGluZyBLZXkgRnVuY3Rpb25zIHRvIE1lbW9yeSBNYW5hZ2VtZW50IFN0cnVjdHVyZXMqKlxuXG5Pa2F5LCBzbyBJJ20gZHJpbGxpbmcgZG93biBpbnRvIHNvbWUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuIEknbSBub3RpbmcgdGhhdCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgYXJlIGFsbCBjbHVzdGVyZWQgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBUaGF0IHBsYWNlbWVudCBpcyBleGFjdGx5IHdoYXQgSSB3b3VsZCBleHBlY3QsIHRoZXkgYXJlIGFsbCB3b3JraW5nIG9uIG9wZXJhdGlvbnMgcmVsYXRlZCB0byBzcGxpdHRpbmcgYW5kIG1hbmFnaW5nIGh1Z2UgcGFnZXMsIHNvIGNsZWFybHkgdGhleSBhcmUgb3JnYW5pemVkIGxvZ2ljYWxseSBpbiB0aGUgaHVnZSBtZW1vcnkgbWFuYWdlbWVudCBhcmVhLiBUaGUgY29tbW9uIGRpcmVjdG9yeSBtYWtlcyBwZXJmZWN0IHNlbnNlLlxuXG5UaGVuIHRoZXJlJ3MgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhhdCBvbmUncyBpbiBgbW0vc3dhcF9zdGF0ZS5jYC4gSG1tLCByaWdodCwgdGhhdCdzIHJlbGF0ZWQgdG8gc3dhcHBpbmcsIHdoaWNoIG1ha2VzIHRvdGFsIHNlbnNlLiBJJ20gbWVudGFsbHkgZmlsaW5nIHRoaXMgdW5kZXIgXCJzd2FwIGNhY2hlIGludGVyYWN0aW9uLlwiIEl0IHNlZW1zIHRvIGJlIGEgZnVuY3Rpb24gZGVhbGluZyB3aXRoIHJlcGxhY2luZyBhIGZvbGlvIGluIHRoZSBzd2FwIGNhY2hlLCB3aGljaCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBodWdlIHBhZ2Ugc3BsaXR0aW5nL21hbmFnZW1lbnQsIGhlbmNlIHRoZSBkaWZmZXJlbnQgZmlsZS4gR29vZCBvcmdhbml6YXRpb24gdGhlcmUsIHRvby4gSSBhcHByZWNpYXRlIHRoZSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLCB0aGUgbW9kdWxlIG9yZ2FuaXphdGlvbiBpcyBzYW5lIGFuZCBsb2dpY2FsLiBJIGNhbiBxdWlja2x5IGRldGVybWluZSB0aGUgY29udGV4dCBmb3IgYSBnaXZlbiBmdW5jdGlvbiBieSBrbm93aW5nIGl0cyBsb2NhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQxMzYsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMjo1Ni40NDA0ODM3NDFaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzAwNzcxOTkwMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKGludHx2b2lkfGJvb2wpIC4qZm9saW9fc3BsaXRfdW5tYXBwZWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDU6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNi11bnNpZ25lZCBpbnQgbWluX29yZGVyX2Zvcl9zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDI3OD1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM2Ny0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzNjg6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxubW0vaHVnZV9tZW1vcnkuYy00MzY5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDI6NTkuNDQ4MjEwNDU0WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjI3NTU5MTQyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCoqXG5cbk9rYXksIHRpbWUgdG8gZGl2ZSBpbnRvIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gVGhpcyBmdW5jdGlvbiBpcyBsaWtlbHkgYSBjcml0aWNhbCBwaWVjZSBvZiBtZW1vcnkgbWFuYWdlbWVudCwgcHJvYmFibHkgd2l0aGluIGEgdmlydHVhbCBtZW1vcnkgc3lzdGVtLiBHaXZlbiB0aGUgbmFtZSwgSSdtIGd1ZXNzaW5nIGl0IGhhbmRsZXMgdGhlIHByb2Nlc3Mgb2YgYnJlYWtpbmcgZG93biBhIGxhcmdlLCBcImh1Z2VcIiBwYWdlIGludG8gc21hbGxlciwgbW9yZSBtYW5hZ2VhYmxlIHVuaXRzLCBhbmQgdGhlbiwgY3J1Y2lhbGx5LCBwbGFjaW5nIHRob3NlIHNtYWxsZXIgcGFnZXMgaW50byBzb21lIGtpbmQgb2Ygb3JkZXJlZCBzdHJ1Y3R1cmUg4oCTIHByb2JhYmx5IGEgbGlua2VkIGxpc3QsIHF1ZXVlLCBvciBwZXJoYXBzIGV2ZW4gYSB0cmVlIGlmIHRoZSBvcmRlciBpcyBjb21wbGV4LlxuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gbG9vayBmb3IgaG93IHRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzICp3aHkqIGl0IG5lZWRzIHRvIHNwbGl0IHRoZSBwYWdlLiBJcyBpdCBkdWUgdG8gZnJhZ21lbnRhdGlvbiwgbWVtb3J5IHByZXNzdXJlLCBhIHNwZWNpZmljIGFsbG9jYXRpb24gcmVxdWVzdCB0aGF0IGRvZXNuJ3QgYWxpZ24gd2l0aCBhIGh1Z2UgcGFnZSBib3VuZGFyeSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFRoZSAndG9fb3JkZXInIHBhcnQgc3VnZ2VzdHMgdGhhdCB0aGUgc3BsaXQgaXNuJ3QganVzdCBhIGJhc2ljIGRlY29tcG9zaXRpb247IHRoZXJlJ3MgYW4gb3JkZXJpbmcgcmVxdWlyZW1lbnQgaW52b2x2ZWQuIFRoYXQgbWFrZXMgbWUgd29uZGVyIHdoYXQgdGhlIG9yZGVyaW5nIGNyaXRlcmlhIGFyZSDigJMgYXJlIHdlIHRhbGtpbmcgYWJvdXQgcGh5c2ljYWwgYWRkcmVzcywgdmlydHVhbCBhZGRyZXNzLCBvciBzb21ldGhpbmcgbW9yZSBudWFuY2VkIGxpa2UgdXNhZ2UgcGF0dGVybnMgb3IgYWNjZXNzIGZyZXF1ZW5jeT9cblxuSSBuZWVkIHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgb3JkZXJpbmcuIFdoYXQga2luZCBvZiBvdmVyaGVhZCBpcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgb3JkZXJlZCBzdHJ1Y3R1cmU/IFdoYXQgYWxnb3JpdGhtcyBhcmUgYmVpbmcgdXNlZCB0byBtYWludGFpbiB0aGlzIG9yZGVyIGVmZmljaWVudGx5PyBBbmQsIG9mIGNvdXJzZSwgd2hhdCBhcmUgdGhlIGltcGxpY2F0aW9ucyBvbiBwZXJmb3JtYW5jZT8gQXJlIHdlIG9wdGltaXppbmcgZm9yIGFsbG9jYXRpb24gc3BlZWQsIGRlYWxsb2NhdGlvbiBzcGVlZCwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IEhvdyBkb2VzIHRoZSBjaG9zZW4gZGF0YSBzdHJ1Y3R1cmUgc2NhbGUgd2l0aCB0aGUgbnVtYmVyIG9mIHNwbGl0IHBhZ2VzPyBUaGlzIGFsc28gYmVncyB0aGUgcXVlc3Rpb24gb2YgaG93IHRoZSBodWdlIHBhZ2UgaXRzZWxmIGlzIG1hbmFnZWQgKmJlZm9yZSogYW5kICphZnRlciogdGhlIHNwbGl0IOKAkyBkbyB3ZSBuZWVkIHRvIHRyYWNrIGl0IGFzIGEgcGFydGlhbGx5LXVzZWQgZW50aXR5PyBJcyB0aGVyZSBhbnkgbWVjaGFuaXNtIGZvciBcInJlLW1lcmdpbmdcIiBzbWFsbGVyIHBhZ2VzIGJhY2sgaW50byBhIGh1Z2UgcGFnZSBsYXRlciBvbj8gVGhpcyBpcyBjcml0aWNhbCBmb3IgYXZvaWRpbmcgZnVydGhlciBmcmFnbWVudGF0aW9uLiBJIGFsc28gd2FudCB0byBjaGVjayBmb3IgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgaGVyZS4gVGhlIGZ1bmN0aW9uIGxpa2VseSB3aWxsIG9wZXJhdGUgb24gc2hhcmVkIG1lbW9yeSB3aGljaCBjb3VsZCByZXN1bHQgaW4gYSByYWNlIGNvbmRpdGlvbi5cblxuSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgbGFyZ2VyIGNvZGUgY29udGV4dCBpcy4gV2hhdCBwcm9jZXNzIG9yIHN1YnN5c3RlbSBjYWxscyB0aGlzIGZ1bmN0aW9uPyBUaGUgY29udGV4dCB3aWxsIHNoZWQgbGlnaHQgb24gd2hhdCB0aGUgZGVzaWduIGdvYWxzIGFuZCB0cmFkZS1vZmZzIGFyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ3NTYsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzowNS43MjM4MDQ3MDZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjczNzE3NzE5NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKGludHx2b2lkfGJvb2wpIC4qX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwMi1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVxcdFxcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00MzY4PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDI0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQyNTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQ0MjYtXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjA4LjQ2MDk4ODMzM1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMzI2MzU1NzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEaXZpbmcgaW50byBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gKipcblxuQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUgZ3V0cyBvZiB0aGUgc3dhcCBjYWNoZSByZXBsYWNlbWVudCBsb2dpYy4gTGV0J3Mgc2VlIGhvdyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGlzIGhhbmRsaW5nIHRoaW5ncy4gSSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGV4YWN0IG1lY2hhbmljcyBvZiB0aGlzIGZ1bmN0aW9uIGluIHBhcnRpY3VsYXIuIFdoYXQncyBpdCBkb2luZyB3aGVuIGEgZm9saW8gbmVlZHMgdG8gYmUgc3dhcHBlZCBvdXQ/IEhvdydzIGl0IG1ha2luZyByZXBsYWNlbWVudCBkZWNpc2lvbnM/IFdlIGtub3cgaG93IGNyaXRpY2FsIHRoaXMgaXMgZm9yIHBlcmZvcm1hbmNlLCBzbyBJJ20gaG9waW5nIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiBpdHMgaW1wYWN0IGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MuIE5vIHRpbWUgdG8gd2FzdGUsIGxldCdzIGxvb2sgdW5kZXIgdGhlIGhvb2QhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1NDkwLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MTEuNzkzNjI2OTY3WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzY4NDEzMTcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl4oaW50fHZvaWR8Ym9vbCkgLipfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwLmg9MzIxPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXAuaC0zMjItXFx0XFx0XFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LCB2b2lkICpzaGFkb3cpO1xcbm1tL3N3YXAuaDozMjM6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXAuaC0zMjQtXFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KTtcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYz0zMzY9dm9pZCBzd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vc3dhcF9zdGF0ZS5jLTM2MS0gKi9cXG5tbS9zd2FwX3N0YXRlLmM6MzYyOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwX3N0YXRlLmMtMzYzLVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MTQuNTYyMDU1MDg4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NTA4OTU0NTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQ2hlY2tpbmcgYSBQb3RlbnRpYWwgQm90dGxlbmVjayoqXG5cbk9rYXksIHNvIEknbSBqdXN0IHF1aWNrbHkgcnVubmluZyB0aHJvdWdoIHRoZSBtZW50YWwgY2hlY2tsaXN0IGhlcmUuIEknbSBmb2N1c2luZyBpbiBvbiB0aGUgZGF0YSBwcm9jZXNzaW5nIHNpZGUgb2YgdGhpbmdzLCBzcGVjaWZpY2FsbHkgb24gdGhpcyBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGZ1bmN0aW9uLiBJdCdzIGEgcHJpbWUgc3VzcGVjdCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzIGdpdmVuIHRoZSBzY2FsZSBvZiBkYXRhIHdlJ3JlIGxpa2VseSBkZWFsaW5nIHdpdGguIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGltcGxlbWVudGF0aW9uIGlzIGVmZmljaWVudCwgcGFydGljdWxhcmx5IGNvbmNlcm5pbmcgbWVtb3J5IGFsbG9jYXRpb24sIGl0ZXJhdGlvbiwgYW5kIGFueSBwb3RlbnRpYWwgaW5lZmZpY2llbmNpZXMgd2l0aGluIHNvcnRpbmcgb3IgaW5kZXhpbmcuIEV2ZW4gdGhvdWdoIEkgaGF2ZSBhIHByZXR0eSBzdHJvbmcgdW5kZXJzdGFuZGluZyBvZiB0aGUgc3lzdGVtLCBpdCdzIHdpc2UgdG8gcmV2aXNpdCBhbnkgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIGEgbGFyZ2UgaW5wdXQgc3BhY2UganVzdCB0byBiZSBzdXJlIHRoZXJlIGFyZW4ndCBhbnkgc3VidGxlLCBlYXNpbHkgb3Zlcmxvb2tlZCwgYm90dGxlbmVja3MuIFRpbWUgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1OTA4LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MTguMDEyOTUzOTU0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzUwNDY4OTQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl4oaW50fHZvaWR8Ym9vbCkgLipzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD0zOTg9ZW51bSBzcGxpdF90eXBlIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwMi1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDM6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVxcdFxcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00MzY4PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDI0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQyNTppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQ0MjYtXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjIwLjc2MzQyODUzMloiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNTcxNzYyNTQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgc3VtbWFyeSwgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXMgcmVxdWVzdGVkOlxuXG4qKkRlY29uc3RydWN0aW5nIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAqKlxuXG5SaWdodCwgbGV0IG1lIHNlZS4uLmBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIFRoYXQncyBhIG1vdXRoZnVsLCBhbmQgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uLCBpdCdzIGFsbW9zdCBjZXJ0YWlubHkgYW4gaW5saW5lIGZ1bmN0aW9uIG9yIGEgbWFjcm8sIGRlc2lnbmVkIGZvciBlZmZpY2llbmN5LiBHaXZlbiB0aGUgY29udGV4dCwgaXQncyBsaWtlbHkgZGVhbGluZyB3aXRoIHNvbWUgYXNwZWN0IG9mIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LCBwcm9iYWJseSByZWxhdGVkIHRvIGZyYWdtZW50YXRpb24gb3IgY29hbGVzY2luZy4gT2theSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBiZXR0ZXIuIE15IG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgaW50byB0aGUgZGVmaW5pdGlvbi4gVGhlIGtlcm5lbCdzIG5hbWluZyBjb252ZW50aW9ucyBhcmUgdXN1YWxseSBwcmV0dHkgY29uc2lzdGVudCwgc28gdGhlIGhlYWRlciBmaWxlIGRlZmluaW5nIGl0IHNob3VsZCBiZSBpbiB0aGUgb2J2aW91cyBwbGFjZS4gTGV0J3Mgc3RhcnQgd2l0aCBgaW5jbHVkZS9saW51eC9odWdlX21tLmhgLiBUaGF0J3Mgd2hlcmUgSSBleHBlY3QgdG8gZmluZCB0aGUgbWFnaWMgYmVoaW5kIHRoaXMgZnVuY3Rpb24uIFRpbWUgdG8gY2hlY2sgaXQgb3V0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjM3MSwiT3V0cHV0VG9rZW5zIjo0MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjI0LjMzNTE5MzYyOVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTY5Mjg3MDYxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTM5OD1lbnVtIHNwbGl0X3R5cGUge1xcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDAyLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwMzppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcik7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MTA9aW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsIHN0cnVjdCBwYWdlICpwYWdlLFxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDEyLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMzpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTQtXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTUte1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxNjpcXHRyZXR1cm4gX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBsaXN0LCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNy19XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDE4PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTkte1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQyMDpcXHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjEtfVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDIzPXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjQte1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQyNTpcXHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIocGFnZSwgTlVMTCwgMCk7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDI2LX1cXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY0NT1zdGF0aWMgaW5saW5lIGludFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjY0NjpzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02NDctXFx0XFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTgyNj1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTgyNy17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6ODI4OlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIE5VTEwsIG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI5LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MjUuMzA0NDg3NDNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDU1MzI2MDM1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHJldmlld2luZyB0aGlzIGNvZGU6XG5cbioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBTcGxpdHRpbmcgRnVuY3Rpb25zKipcblxuQWxyaWdodCwgc28gYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGRlZmluaXRlbHkgdGhlIGtleSBub24taW5saW5lZCBmdW5jdGlvbiBpbnZvbHZlZCBpbiB0aGlzIGh1Z2UgcGFnZSBzcGxpdHRpbmcgcHJvY2Vzcy4gVGhhdCdzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTm93LCBsZXQncyBxdWlja2x5IHNlZSBpZiB0aGVyZSBhcmUgb3RoZXIgcGxheWVycyBpbiB0aGlzIHBhcnRpY3VsYXIgZG9tYWluLiBBaCwgeWVzLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIC0gYWxsIG9mIHRoZW0gd2FycmFudCBhIGNsb3NlciBsb29rIHRvIHVuZGVyc3RhbmQgdGhlaXIgaW50ZXJhY3Rpb25zIHdpdGggdGhlIG1haW4gc3BsaXQgZnVuY3Rpb24sIGFuZCBob3cgZWFjaCBpcyBpbnZvbHZlZCBpbiB0aGUgb3ZlcmFsbCBodWdlIHBhZ2UgbWFuYWdlbWVudC5cblxuTmV4dCwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGNvbmRpdGlvbmFsIGxvZ2ljIGZvciBodWdlIHBhZ2Ugc3BsaXR0aW5nOyBzcGVjaWZpY2FsbHksIEkgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBmZWF0dXJlIGlzLCBpbmRlZWQsIGFjdGl2ZSBhbmQgcmVxdWlyZWQgaW4gdGhpcyBjb2RlIHBhdGguIFRoYXQgd2lsbCBiZSBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyAqd2h5KiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTczNTAsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzoyOS44NTc3NTAzNloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyNDc2NzYwMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04MzI9Y29uZmlnIE1NX0lEXFxuLS1cXG5tbS9LY29uZmlnLTgzNC1cXG5tbS9LY29uZmlnOjgzNTptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vS2NvbmZpZy04MzYtXFx0Ym9vbCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODUzPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04NTgtXFxubW0vS2NvbmZpZzo4NTk6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xcbm1tL0tjb25maWctODYwLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctODY1LVxcbm1tL0tjb25maWc6ODY2OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXFxubW0vS2NvbmZpZy04NjctXFx0XFx0Ym9vbCBcXFwibWFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODc0LVxcbm1tL0tjb25maWc6ODc1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxcbm1tL0tjb25maWctODc2LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZz04ODI9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg5MS1cXG5tbS9LY29uZmlnOjg5MjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxcbm1tL0tjb25maWctODkzLVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDEtXFxubW0vS2NvbmZpZzo5MDI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05MDMtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDktXFxubW0vS2NvbmZpZzo5MTA6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTkxMS1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTE3LVxcbm1tL0tjb25maWc6OTE4OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTE5LVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWc9OTI3PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy05MzYtXFxubW0vS2NvbmZpZzo5Mzc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTkzOC1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTQ1LVxcbm1tL0tjb25maWc6OTQ2OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTQ3LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTUzLVxcbm1tL0tjb25maWc6OTU0OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05NTUtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk2MS1cXG5tbS9LY29uZmlnOjk2MjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTk2My1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjMxLjM4MjUyNDkxM1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MDQ4MTEwMDYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgSHVnZSBQYWdlIERlcGVuZGVuY2llcyoqXG5cbk9rYXksIHNvIEknbSBkZWFsaW5nIHdpdGggYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBpbW1lZGlhdGVseSwgbXkgYnJhaW4gZmxhZ3MgdGhhdCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGRlZmluaXRlbHkgYSByZXF1aXJlbWVudC4gTWFrZXMgc2Vuc2UsIG9idmlvdXNseS4gTm93LCB0aGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gZGl2ZSBpbnRvIGBtbS9NYWtlZmlsZWAuIFRoYXQncyB3aGVyZSBJIG5lZWQgdG8gY29uZmlybSB0aGUgYnVpbGQgZGVwZW5kZW5jaWVzIGFuZCBlbnN1cmUgZXZlcnl0aGluZyBpcyBsaW5raW5nIGNvcnJlY3RseSBhbmQgYXMgZXhwZWN0ZWQuIEl0J3MgdGhlIHN0YW5kYXJkLCBlZmZpY2llbnQgYXBwcm9hY2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4Mzc5LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6MzUuNDMwNjM4NzQ1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDA3MjY5MjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaHVnZV9tZW1vcnkub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzozNS43NzEzNzc0MzdaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTU0NDAxOTgxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBNZW1vcnkgTWFuYWdlbWVudCBEZXBlbmRlbmNpZXMqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgZGlzY3Vzc2lvbiBoYXMgY2xlYXJseSBwb2ludGVkIG91dCB0aGF0IHdlIGFic29sdXRlbHkgbmVlZCB0byBpbmNsdWRlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAg4oCTIG5vIHF1ZXN0aW9uIGFib3V0IHRoYXQuIEl0J3MgdGhlIGx5bmNocGluLiBCdXQgbm93IEknbSBzdGFydGluZyB0byB0aGluayBhYm91dCBkZXBlbmRlbmNpZXMgZnVydGhlciBkb3duIHRoZSBsaW5lLiBXaGF0J3MgdGhlIGltcGFjdCBvZiB0aGlzIGNoYW5nZSBvbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUga2VybmVsPyBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjb25zaWRlciBgbW0vc3dhcF9zdGF0ZS5jYC4gSG93IHdpbGwgdGhpcyBuZXcgdHJhbnNwYXJlbnQgaHVnZXBhZ2UgaW1wbGVtZW50YXRpb24gaW50ZXJhY3Qgd2l0aCB0aGUgc3dhcCBtZWNoYW5pc21zPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBjb25mbGljdHMsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLCBvciByYWNlIGNvbmRpdGlvbnMgSSBuZWVkIHRvIGFudGljaXBhdGU/IFRoaXMgaXMgYSBrZXkgYXJlYSB0byBleHBsb3JlIGZ1cnRoZXIsIHNvIEknbSBmaWxpbmcgdGhhdCBmb3IgZGVlcGVyIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NjM3LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6NDEuMzE1NDAwMTJaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4ODI2MDQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN3YXBfc3RhdGUub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT03Nj1lbmRpZlxcbm1tL01ha2VmaWxlLTc3LVxcbm1tL01ha2VmaWxlOjc4Om9iai0kKENPTkZJR19TV0FQKVxcdCs9IHBhZ2VfaW8ubyBzd2FwX3N0YXRlLm8gc3dhcGZpbGUub1xcbm1tL01ha2VmaWxlLTc5LW9iai0kKENPTkZJR19aU1dBUClcXHQrPSB6c3dhcC5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjQxLjM2NDIzMTk0NVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MzQyODA1MTczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUG90ZW50aWFsIEltcGFjdCBvZiBhIFN3YXAgTW9kaWZpY2F0aW9uKipcblxuT2theSwgc28gaXQgbG9va3MgbGlrZSB0aGlzIHBhdGNoIG5lY2Vzc2l0YXRlcyBzb21lIGZvcm0gb2YgYFNXQVBgIGhhbmRsaW5nLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyBhbHdheXMgdG8gbG9vayBmb3IgY29udGV4dCwgc28gbGV0J3Mgc2VlIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbnMgbWlnaHQgYmUgaW1wYWN0ZWQuIExvb2tpbmcgdGhyb3VnaCB0aGUgcHJvcG9zZWQgY2hhbmdlcywgSSBzZWUgdGhhdCB0aGUgcGF0Y2ggdG91Y2hlcyBzZXZlcmFsIGtleSBmdW5jdGlvbnMgdGhhdCBhcmUgYWxsIHZlcnkgaW50ZXJlc3RpbmcgdG8gbWU6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhleSBhbGwgc2VlbSBoaWdobHkgcmVsZXZhbnQuXG5cbk15IGltbWVkaWF0ZSBmb2N1cywgZ2l2ZW4gbXkgZXhwZXJ0aXNlLCBpcyB0byBjYXJlZnVsbHkgZXhhbWluZSB0aG9zZSBzcGVjaWZpYyBzeW1ib2xzLiBJIG5lZWQgdG8gY29uZmlybSB0aGVzZSBmdW5jdGlvbnMgYXJlIHByZXNlbnQgaW4gdGhlIGtlcm5lbCBhbmQsIGNyaXRpY2FsbHksIGFyZW4ndCBkZWNsYXJlZCBhcyBzdGF0aWMuIFRoaXMgY29uZmlybXMgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGV4dGVybmFsbHkgYXZhaWxhYmxlIGFuZCBjYW4gYmUgcGF0Y2hlZC4gSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGRlZmluaXRpb25zIGFuZCB1c2FnZSBvZiB0aG9zZSBmdW5jdGlvbnMsIHdoYXQgZmlsZXMgdXNlIHRoZW0sIGFuZCB3aGF0IHRoZSBlZmZlY3Qgd2lsbCBiZSBvZiBtb2RpZnlpbmcgdGhlbS4gRnJvbSB0aGVyZSBJIGNhbiBkZXRlcm1pbmUgdGhlIGltcGFjdCBvZiB0aGVzZSBjaGFuZ2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODkzNywiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzo0Ni43MDcwNDIyNzhaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NTQwODY0NDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXihpbnR8dm9pZHxib29sKSAuKl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDM2OD1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDQyNC0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQ0MjU6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxubW0vaHVnZV9tZW1vcnkuYy00NDI2LVxcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowMzo0OS40NjExMzQyMTdaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzc3NTI2NzM1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEb3VibGUtQ2hlY2tpbmcgdGhlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgRnVuY3Rpb25hbGl0eSoqXG5cbk9rYXksIHNvIHRoZSBjb25jZXB0IG9mIHVubWFwcGVkIGZvbGlvc+KAlHRob3NlIHRoYXQgZG9uJ3QgbmVhdGx5IGFsaWduIHdpdGggb3VyIHN0YW5kYXJkIGluZGV4aW5n4oCUaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgd2UgbmVlZCB0byBhY2NvdW50IGZvci4gTm8gZGViYXRlIHRoZXJlLCB0aGV5ICpkbyogZXhpc3QsIGFuZCB0aGUgc3lzdGVtIG5lZWRzIHRvIGhhbmRsZSB0aGVtLiBUaGUga2V5IG5vdyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgbG9naWMgd2l0aGluIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgcm9idXN0LiBJcyBpdCBhY2NvdW50aW5nIGZvciBhbGwgZWRnZSBjYXNlcz8gQXJlIHRoZXJlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcz8gQXJlIHRoZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgdW5tYXBwZWQgZGF0YSBzdGlsbCB2YWxpZCBnaXZlbiByZWNlbnQgY2hhbmdlcyB0byB0aGUgc291cmNlIG1hdGVyaWFsPyBCZWZvcmUgSSBtb3ZlIG9uLCBJIHdhbnQgdG8gY29uZmlybSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgc3RpbGwgcGVyZm9ybWluZyBhcyBpbnRlbmRlZC4gTGV0J3Mgc2VlIGlmIHRoZSBoYW5kbGluZyBvZiBmb2xpbyBzcGxpdCBpcyBnb29kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTU1MywiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjAzOjUzLjIzNjQwNTcxM1oiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjcyNzA5Nzg2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKGludHx2b2lkfGJvb2wpIC4qZm9saW9fc3BsaXRfdW5tYXBwZWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDAzPWludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MDU6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNi11bnNpZ25lZCBpbnQgbWluX29yZGVyX2Zvcl9zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDI3OD1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM2Ny0gKi9cXG5tbS9odWdlX21lbW9yeS5jOjQzNjg6aW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxubW0vaHVnZV9tZW1vcnkuYy00MzY5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDM6NTUuOTYzNTExMzg5WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU5MzU4ODk5NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEb3VibGUtQ2hlY2tpbmcgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgKipcblxuQWxyaWdodCwgdGltZSB0byByZXZpc2l0IGBmb2xpb19jaGVja19zcGxpdHRhYmxlYC4gSSdtIGdvaW5nIGJhY2sgb3ZlciB0aGlzIGJlY2F1c2UsIGxldCdzIGJlIGhvbmVzdCwgZXZlbiBhZnRlciB0aGUgaW5pdGlhbCByZXZpZXcsIHRoZXJlJ3MgYWx3YXlzIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgc29tZXRoaW5nIGNvdWxkIGhhdmUgYmVlbiBvdmVybG9va2VkLCBlc3BlY2lhbGx5IHdpdGggYSBmdW5jdGlvbiBhcyBjcml0aWNhbCBhcyB0aGlzLiBNeSBjb25jZXJuIGlzLCBpcyBpdCB0cnVseSByb2J1c3QgZW5vdWdoIHRvIGhhbmRsZSB0aGUgZWRnZSBjYXNlcz8gRG9lcyBpdCBjb3ZlciBhbGwgdGhlIHBlcm11dGF0aW9ucyBvZiBkYXRhIHN0cnVjdHVyZXMgYW5kIHN0YXRlcyB3ZSdyZSBsaWtlbHkgdG8gZW5jb3VudGVyIGluIGEgcmVhbC13b3JsZCBzY2VuYXJpbz9cblxuSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJ3QgbWFkZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGRhdGEgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSB2YWxpZGF0ZWQgd2l0aGluIHRoZSBmdW5jdGlvbi4gVGhpbmtpbmcgYWJvdXQgaXQsIEkgc2hvdWxkIHJ1biB0aHJvdWdoIGEgbWVudGFsIGNoZWNrbGlzdCBvZiBwb3NzaWJsZSBmYWlsdXJlIHBvaW50czogbnVsbCB2YWx1ZXMsIGVtcHR5IHN0cnVjdHVyZXMsIGV4Y2VwdGlvbmFsbHkgbGFyZ2UgZGF0YXNldHMsIGFuZCBldmVuIGNvbmN1cnJlbnQgYWNjZXNzIGlzc3VlcywgaWYgYXBwbGljYWJsZS4gSSBhbHNvIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2ljIGFsaWducyBwZXJmZWN0bHkgd2l0aCB0aGUgdW5kZXJseWluZyByZXF1aXJlbWVudHMgb2YgdGhlIHNwbGl0dGluZyBwcm9jZXNzLCBzcGVjaWZpY2FsbHkgYWRkcmVzc2luZyBob3cgcGFydGlhbCBzcGxpdHMgc2hvdWxkIGJlIGV2YWx1YXRlZC5cblxuSSBhbSBnb2luZyB0byBjaGVjayB0aGUgdW5pdCB0ZXN0cywgb2J2aW91c2x5LCBidXQgc29tZXRpbWVzIHRob3NlIHRlc3RzIGFyZSB3cml0dGVuIHRvIGNvdmVyIHRoZSBvYnZpb3VzIGNhc2VzIGFuZCB0aGVyZSBhcmUgc3RpbGwgaXNzdWVzIGx1cmtpbmcgaW4gdGhlIGNvZGUuIEkgYW0gZ29pbmcgdG8gaGF2ZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgcmlnb3JvdXMuIEFuZCBJIG1heSBuZWVkIHRvIHdyaXRlIHNvbWUgbmV3IG9uZXMgdG8gZW5zdXJlIGFsbCBzY2VuYXJpb3MgYXJlIGNvdmVyZWQsIHBvdGVudGlhbGx5IGdlbmVyYXRpbmcgc29tZSByYW5kb20gZGF0YSBmb3IgYSBkZWVwZXIgZGl2ZS4gVGhlIGdvYWwgaXMgdG8gYmUgYWJzb2x1dGVseSBjb25maWRlbnQgdGhhdCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAgd29uJ3QgaW50cm9kdWNlIGFueSB1bmV4cGVjdGVkIGJlaGF2aW9yIGRvd24gdGhlIGxpbmUsIHBvdGVudGlhbGx5IGNhdXNpbmcgZGF0YSBjb3JydXB0aW9uIG9yLCBldmVuIHdvcnNlLCBzeXN0ZW0gaW5zdGFiaWxpdHkuIEkgYW0gZ29pbmcgdG8gYmUgZXh0cmEgdmlnaWxhbnQgYW5kIHRoaW5rIHRocm91Z2ggdGhlIGNvZGUgYXMgdGhvdWdoIEkgYW0gZ29pbmcgdG8gYmUgdGhlIHBlcnNvbiB3aG8gd2lsbCBiZSBkZWJ1Z2dpbmcgaXQgYXQgMyBhbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAwMDksIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMFQxOTowNDowMS44OTk0MDQzMjdaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NDYzMzc5MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXihpbnR8dm9pZHxib29sKSAuKmZvbGlvX2NoZWNrX3NwbGl0dGFibGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDA3PWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwODppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwOS1cXHRcXHRcXHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTM3OTQ9c3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zODc0LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg3NTppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3Ni1cXHRcXHRcXHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MDQuNjQ1NzQ5NzA1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY2ODUxMzYxODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEb3VibGUtQ2hlY2tpbmcgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gcmV2aXNpdCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2ljIHdpdGhpbiBpdCBpcyBzdGlsbCBzb3VuZC4gSXQncyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBhbmQgYSBzdWJ0bGUgYnVnIGhlcmUgY291bGQgaGF2ZSBjYXNjYWRpbmcgYW5kIGRldmFzdGF0aW5nIGVmZmVjdHMsIHBhcnRpY3VsYXJseSBvbiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgc3dhcCBwZXJmb3JtYW5jZS4gSSBuZWVkIHRvIHJ1biB0aHJvdWdoIHRoZSByZXBsYWNlIHN0cmF0ZWd5IHRvIGVuc3VyZSB0aGF0IHRoZSBjb25kaXRpb25zIHdpdGhpbiB0aGF0IGZ1bmN0aW9uIGFyZSBzdGlsbCBzYWZlLCBhbmQgaGF2ZSBub3QgYmVlbiBhZmZlY3RlZCBieSBzdWJzZXF1ZW50IGltcHJvdmVtZW50cy5cblxuU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGVkZ2UgY2FzZXMuIEFtIEkgc3RpbGwgaGFuZGxpbmcgdGhlIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcmVwbGFjZW1lbnQgc2NlbmFyaW9zIGNvcnJlY3RseT8gRG9lcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhdm9pZCBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucywgZXNwZWNpYWxseSBnaXZlbiBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgc3dhcCBjYWNoZT8gQXJlIHRoZSBsb2NraW5nIHByaW1pdGl2ZXMgYXBwcm9wcmlhdGUgYW5kIGVmZmVjdGl2ZT8gQXJlIHRoZSBtZW1vcnkgYmFycmllcnMgaW4gcGxhY2Ugd2hlcmUgdGhleSBuZWVkIHRvIGJlLCBvciBhcmUgdGhlcmUgYW55IG9wcG9ydHVuaXRpZXMgdG8gb3B0aW1pemUgdGhlbSB3aXRob3V0IGludHJvZHVjaW5nIHJpc2s/IEkgbmVlZCB0byByZXZpZXcgaXQgdW5kZXIgaGlnaCBsb2FkLCB0b28uIEkgd2FudCB0byBtYWtlIHN1cmUgaXQncyB3b3JraW5nIGFzIGV4cGVjdGVkLlxuXG5JIGFsc28gd2FudCB0byBjaGVjayBpdHMgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBBcmUgdGhlcmUgYW55IHVuZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIG9yIGludGVyYWN0aW9ucyB3aXRoIHBhZ2UgcmVjbGFpbSwgZGlydHkgcGFnZSBoYW5kbGluZywgb3IgTlVNQSBvcHRpbWl6YXRpb25zIHRoYXQgbWlnaHQgaW50cm9kdWNlIHN1YnRsZSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBldmVuIGNvcnJlY3RuZXNzIGlzc3Vlcz8gSSdsbCBwcm9iYWJseSBhbHNvIG5lZWQgdG8gcnVuIGl0IHRocm91Z2ggYSBiYXR0ZXJ5IG9mIHRlc3RzLCBjb3ZlcmluZyBib3RoIHR5cGljYWwgYW5kIHBhdGhvbG9naWNhbCBzY2VuYXJpb3MsIHRvIGJ1aWxkIHNvbWUgY29uZmlkZW5jZS4gT3ZlcmFsbCwgSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGlzIGlzIHNvbGlkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDYzOCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjExLjMzMDg4OTQ2NloiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjcyODQ0MTk2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKGludHx2b2lkfGJvb2wpIC4qX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcC5oPTMyMT12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzIyLVxcdFxcdFxcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTtcXG5tbS9zd2FwLmg6MzIzOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzI0LVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldyk7XFxuLS1cXG5tbS9zd2FwX3N0YXRlLmM9MzM2PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYy0zNjEtICovXFxubW0vc3dhcF9zdGF0ZS5jOjM2Mjp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxubW0vc3dhcF9zdGF0ZS5jLTM2My1cXHRcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjE0LjA1OTM0MDM1M1oiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NDU3ODM1NzA1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNZW1vcnkgTWFuYWdlbWVudCBTeW1ib2xzIGFuZCBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgZm9jdXMgc3ltYm9scyBhcmU6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gSSdtIHN0YXJ0aW5nIHRvIGdldCBhIGZlZWwgZm9yIGhvdyB0aGVzZSByZWxhdGUgdG8gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLlxuXG5JJ3ZlIGdvdCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgaW4gbXkgbWVudGFsIHN0YWNrIGZvciB0aGUgcmVxdWlyZWQgY29uZmlncy4gV2FpdCwgaG9sZCBvbi4gYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBpcyBkZWZpbml0ZWx5IHRpZWQgdG8gYG1tL3N3YXBfc3RhdGUuY2AsIHdoaWNoLCBhcyBJIHJlY2FsbCwgbmVlZHMgYENPTkZJR19TV0FQYC4gTWFrZXMgc2Vuc2UuIEFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLCBjbGVhcmx5IGltcGxpY2F0aW5nIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBObyBzdXJwcmlzZXMgdGhlcmUuXG5cbkJ1dCBJJ20gbm90IGRvbmUgeWV0LiBJIG5lZWQgdG8gYmUgdGhvcm91Z2guIEkgd29uZGVyIGlmIHRoZXJlJ3MgYW55IG90aGVyIHJlbGV2YW50IGNvbmZpZyBpbiBwbGF5PyBMZXQgbWUgY2hlY2sgZm9yIGBDT05GSUdfVEhQX1NXQVBgLiBHb3R0YSBjb25zaWRlciB0aGUgaW50ZXJwbGF5IGJldHdlZW4gdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIGFuZCBzd2FwIHNwYWNlLiBJJ2xsIG5lZWQgdG8ga2VlcCB0aGF0IGluIG1pbmQgYXMgSSBkZWx2ZSBmdXJ0aGVyIGludG8gdGhpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEyMTYsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MTkuNTE3MTc5MTg4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTY1NTIwNTU3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUSFBfU1dBUFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTk2OT1lbmRjaG9pY2VcXG5tbS9LY29uZmlnLTk3MC1cXG5tbS9LY29uZmlnOjk3MTpjb25maWcgVEhQX1NXQVBcXG5tbS9LY29uZmlnLTk3Mi1cXHRkZWZfYm9vbCB5XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjIxLjA4MjcxMTM4NVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODc0MzQyNzU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHByZXNlbnRlZCBhcyBhIGZpcnN0LXBlcnNvbiBleHBlcnQgc3VtbWFyeTpcblxuKipUaGlua2luZyBUaHJvdWdoIFRIUF9TV0FQJ3MgRGVwZW5kZW5jaWVzKipcblxuQWxyaWdodCwgc28gYFRIUF9TV0FQYC4uLiB0aGF0J3MgYSBib29sZWFuIG9wdGlvbiwgYW5kIGl0J3MgZGVmaW5lZCBhcyBgZGVmX2Jvb2wgeWAuIFRoZSBpbnRlcmVzdGluZyBwYXJ0IGlzIHdoYXQgZGV0ZXJtaW5lcyB0aGF0IGRlZmF1bHQgdmFsdWUuIFRoZSBsb2dpYyBzdGF0ZXMgdGhhdCBpdCdzIGNvbnRpbmdlbnQgb24gdHdvIHRoaW5nczogYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFNXQVBgLiBUaGF0IG1ha2VzIHBlcmZlY3Qgc2Vuc2U7IHRoZSBhYmlsaXR5IHRvIHN3YXAgb3V0IGh1Z2UgcGFnZXMsIHdlbGwsIG9idmlvdXNseSB0aGF0IGRlcGVuZHMgb24gaGF2aW5nIGJvdGggdGhlIHRyYW5zcGFyZW50IGh1Z2VwYWdlcyBmZWF0dXJlIGVuYWJsZWQgYW5kIHN3YXAgc3BhY2UgYXZhaWxhYmxlLlxuXG5UbyBjbGFyaWZ5IHRoZSBmdWxsIGltcGFjdCBvZiB0aGVzZSBjb25kaXRpb25zLCBJIG5lZWQgdG8gbG9vayBpbnRvIGhvdyBleGFjdGx5IHRoaXMgZGVwZW5kZW5jeSBjaGFpbiBpcyBzZXQgdXAuIEJlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY2hlY2sgdGhlIGBtbS9LY29uZmlnYCBmaWxlIGluIHRoZSBrZXJuZWwgc291cmNlLiBUaGF0IGZpbGUgd2lsbCBkZXRhaWwgdGhlIGV4YWN0IHJlbGF0aW9uc2hpcHMgYW5kIGNvbnN0cmFpbnRzIGluIHBsYWNlIGFyb3VuZCB0aGUgYFRIUF9TV0FQYCBvcHRpb24uIEknbGwgdGFrZSBhIGxvb2sgdGhlcmUgdG8gY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIHN1YnRsZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNzUxLCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MjQuOTU3MDU4NjNaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxNjI4NTU2NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJUSFBfU1dBUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9ODEwPWNvbmZpZyBBUkNIX1dBTlRfR0VORVJBTF9IVUdFVExCXFxuLS1cXG5tbS9LY29uZmlnLTgxMi1cXG5tbS9LY29uZmlnOjgxMzpjb25maWcgQVJDSF9XQU5UU19USFBfU1dBUFxcbm1tL0tjb25maWctODE0LVxcdGRlZl9ib29sIG5cXG4tLVxcbm1tL0tjb25maWc9OTY5PWVuZGNob2ljZVxcbm1tL0tjb25maWctOTcwLVxcbm1tL0tjb25maWc6OTcxOmNvbmZpZyBUSFBfU1dBUFxcbm1tL0tjb25maWctOTcyLVxcdGRlZl9ib29sIHlcXG5tbS9LY29uZmlnOjk3MzpcXHRkZXBlbmRzIG9uIEFSQ0hfV0FOVFNfVEhQX1NXQVAgXFx1MDAyNlxcdTAwMjYgU1dBUCBcXHUwMDI2XFx1MDAyNiA2NEJJVFxcbm1tL0tjb25maWctOTc0LVxcdGhlbHBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MjUuODczMzU2NTE2WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY5MDA2NTAwNTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgVEhQX1NXQVAgRGVwZW5kZW5jeSBhbmQgQ29kZSBDaGFuZ2VzKipcblxuT2theSwgc28gYFRIUF9TV0FQYCBoaW5nZXMgb24gYEFSQ0hfV0FOVFNfVEhQX1NXQVBgLCBgU1dBUGAsIGFuZCBhIDY0LWJpdCBhcmNoaXRlY3R1cmUuIFRoYXQncyB0aGUgZ2F0ZS4gTm93LCBsb29raW5nIGF0IHRoZSBjb2RlLCB0aGUgbW9kaWZpY2F0aW9ucyBhcmUgY29uY2VudHJhdGVkIGluIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AuIFJpZ2h0IGF3YXksIEkgc2VlIHRoYXQgYG1tL2h1Z2VfbWVtb3J5LmNgIGlzIGdvaW5nIHRvIGJlIHBhcnQgb2YgdGhlIGJ1aWxkICpvbmx5KiBpZiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlbmFibGVkLCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AgcmVsaWVzIG9uIGBDT05GSUdfU1dBUGAuIFNvLCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgYXJlIHRoZSBrZXkgY29uZmlndXJhdGlvbnMgdG8ga2VlcCBpbiBtaW5kLiBUaG9zZSBhcmUgdGhlIGJpZyBrbm9icyBoZXJlLlxuXG5Ob3csIGxldCBtZSBnbyBiYWNrIG92ZXIgdGhlIGNoYW5nZXMgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCAqZXhhY3RseSogd2hhdCdzIGJlaW5nIHRvdWNoZWQuIEFoLCB0aGV5J3ZlIG1vZGlmaWVkIGBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCAocmVuYW1lZCB0byBgX19zcGxpdF9mcm96ZW5fZm9saW9gKSwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkYCAocmVwbGFjZWQgYnkgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWApLCBgX19mb2xpb19zcGxpdGAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGFuZCBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIEl0IGxvb2tzIGxpa2UgaXQgaXMgYWxsIGFib3V0IHJlZmFjdG9yaW5nIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgdG8gaGFuZGxlIHN3YXBjYWNoZSBhbmQgYW5vbnltb3VzIGZvbGlvcyBtb3JlIGVmZmVjdGl2ZWx5LiBUaGlzIGlzIGEgZnVuZGFtZW50YWwgY2hhbmdlIGluIHRoZSB3YXkgVEhQIGludGVyYWN0cyB3aXRoIHN3YXAuIFRoaXMgaXMgZGVmaW5pdGVseSBhIHNwb3Qgd29ydGggYSBkZWVwIGZ1enppbmcgY2FtcGFpZ24uXG5cbkFscmlnaHQsIEknbSByZWFkeSB0byBtb3ZlIGZvcndhcmQuIExldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjIyMzYsIk91dHB1dFRva2VucyI6MTUwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjkzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjMyLjc3NDAxMDAxN1oiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc1NTIxMzA3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgZml4ZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBzcGVjaWZpY2FsbHkgaGFuZGxpbmcgYW5vbnltb3VzLCBzd2FwY2FjaGUsIGFuZCBmaWxlLWJhY2tlZCBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS9odWdlX21lbW9yeS5jIGFuZCBtbS9zd2FwX3N0YXRlLmMsIHdoaWNoIGlzIHJlYWNoYWJsZSBhbmQgaGFzIGZ1bmN0aW9uYWwgaW1wYWN0LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlclwiLFxuICAgIFwiZm9saW9fc3BsaXRfdW5tYXBwZWRcIixcbiAgICBcImZvbGlvX2NoZWNrX3NwbGl0dGFibGVcIixcbiAgICBcIl9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBmaXhlcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHNwZWNpZmljYWxseSBoYW5kbGluZyBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL2h1Z2VfbWVtb3J5LmMgYW5kIG1tL3N3YXBfc3RhdGUuYywgd2hpY2ggaXMgcmVhY2hhYmxlIGFuZCBoYXMgZnVuY3Rpb25hbCBpbXBhY3QuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjMyLjg0OTUzODMwNFoiLCJTZXEiOjM1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODk0NDA1NDY4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjMyLjg1MDE2MTIxNFoiLCJTZXEiOjM2LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo4OTQzNDI2MzAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChzcGVjaWZpY2FsbHkgZm9yIGFub255bW91cywgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zKS4gSXQgbW9kaWZpZXMgaG93IGZvbGlvcyBhcmUgdW5tYXBwZWQsIGZyb3plbiwgYW5kIHNwbGl0LCB1cGRhdGluZyBwYWdlIGNhY2hlIGFuZCBzd2FwIGNhY2hlIHJlZmVyZW5jZXMuIFRoZXNlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgYW5kIHhhcnJheSBtYW5pcHVsYXRpb25zLiBUaGV5IGRvIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiBtZW1vcnkgYnVmZmVycy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIHdvdWxkIG1hbmlmZXN0IGFzIHVzZS1hZnRlci1mcmVlLCBtZW1vcnkgY29ycnVwdGlvbiwgb3IgbG9ja2luZyBpc3N1ZXMsIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2ZGFlM2U3ODM5Mjc2ODA1MmExNDI2YWRiZDdiMzljN2EyYTIxN2QyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjAgMTk6MDI6MzYgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggY2VkNDAwZjcyZDQzYS4uY2M5ZjdlMGQ0MTk0ZSAxMDA2NDRcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcbisrKyBiL21tL2h1Z2VfbWVtb3J5LmNcbkBAIC0zNTg5LDkgKzM1ODksNiBAQCBzdGF0aWMgdm9pZCByZW1hcF9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGxvbmcgbnIsIGludCBmbGFncylcbiB7XG4gXHRpbnQgaSA9IDA7XG4gXG4tXHQvKiBJZiB1bm1hcF9mb2xpbygpIHVzZXMgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlLCByZW1vdmUgdGhpcyBjaGVjayAqL1xuLVx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuLVx0XHRyZXR1cm47XG4gXHRmb3IgKDs7KSB7XG4gXHRcdHJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTtcbiBcdFx0aSArPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG5AQCAtMzc1NSw4ICszNzUyLDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuIH1cbiBcbiAvKipcbi0gKiBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgLSBzcGxpdHMgYW4gdW5tYXBwZWQgQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvcyBpblxuLSAqIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgLSBzcGxpdHMgYSBmcm96ZW4gQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvc1xuKyAqIGluIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XG4gICogICAgICAgICAgICAgYWxsb2NhdG9yIGxpa2Ugc3BsaXQgZ2VuZXJhdGVzIGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tIEBmb2xpbydzXG5AQCAtMzc2NCw3ICszNzYxLDYgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuICAqIEBzcGxpdF9hdDogaW4gYnVkZHkgYWxsb2NhdG9yIGxpa2Ugc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdFxuICAqICAgICAgICAgICAgd2lsbCBiZSBzcGxpdCB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyLlxuICAqIEB4YXM6IHhhX3N0YXRlIHBvaW50aW5nIHRvIGZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcyBhbmQgbG9ja2VkIGJ5IGNhbGxlclxuLSAqIEBtYXBwaW5nOiBAZm9saW8tXHUwMDNlbWFwcGluZ1xuICAqIEBzcGxpdF90eXBlOiBpZiB0aGUgc3BsaXQgaXMgdW5pZm9ybSBvciBub3QgKGJ1ZGR5IGFsbG9jYXRvciBsaWtlIHNwbGl0KVxuICAqXG4gICpcbkBAIC0zNzk1LDExICszNzkxLDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4rc3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuLVx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4rXHRcdGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRjb25zdCBib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXHRpbnQgc3RhcnRfb3JkZXIgPSBzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSA/IG5ld19vcmRlciA6IG9sZF9vcmRlciAtIDE7XG4gXHRzdHJ1Y3QgZm9saW8gKm9sZF9mb2xpbyA9IGZvbGlvO1xuQEAgLTM4MTQsMTEgKzM4MTEsMTEgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHQgICAgIHNwbGl0X29yZGVyLS0pIHtcbiBcdFx0aW50IG5yX25ld19mb2xpb3MgPSAxVUwgXHUwMDNjXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XG4gXG4tXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbi1cdFx0aWYgKGlzX2Fub24gXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4rXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4rXHRcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRpZiAobWFwcGluZykge1xuK1x0XHRpZiAoeGFzKSB7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiB1bmlmb3JtIHNwbGl0IGhhcyB4YXNfc3BsaXRfYWxsb2MoKSBjYWxsZWQgYmVmb3JlXG4gXHRcdFx0ICogaXJxIGlzIGRpc2FibGVkIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnksIHdoZXJlYXNcbkBAIC0zODc4LDMyICszODc1LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdFx0ICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHQvKlxuIFx0ICogRm9saW9zIHRoYXQganVzdCBnb3QgdHJ1bmNhdGVkIGNhbm5vdCBnZXQgc3BsaXQuIFNpZ25hbCB0byB0aGVcbi1cdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXG4tXHQgKlxuLVx0ICogVE9ETzogdGhpcyB3aWxsIGFsc28gY3VycmVudGx5IHJlZnVzZSBmb2xpb3Mgd2l0aG91dCBhIG1hcHBpbmcgaW4gdGhlXG4tXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cbitcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuK1x0ICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuXG4gXHQgKi9cbi1cdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFpc19zd2FwY2FjaGUpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4tXHQvKiBvcmRlci0xIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFub255bW91cyBUSFAuICovXG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuIFx0Lypcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBjb3VsZCBvbmx5IGJlIHNwbGl0IHRvIG9yZGVyIDBcbi1cdCAqXG4tXHQgKiBub24tdW5pZm9ybSBzcGxpdCBjcmVhdGVzIGFmdGVyLXNwbGl0IGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tXG4tXHQgKiBmb2xpb19vcmRlcihmb2xpbykgLSAxIHRvIG5ld19vcmRlciwgbWFraW5nIGl0IG5vdCBzdWl0YWJsZSBmb3IgYW55XG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXG4tXHQgKiBoZXJlLlxuK1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuK1x0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFx1MDAyNiBzd2FwIGNhY2hlIGZvbGlvcyBhcmUgbm90XG4rXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcbitcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4rXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyID09IDEpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuIFxuIFx0aWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTM5MTEsMzkgKzM5MDIsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdGlmIChmb2xpb190ZXN0X3dyaXRlYmFjayhmb2xpbykpXG4gXHRcdHJldHVybiAtRUJVU1k7XG4gXG4rXHQvKlxuK1x0ICogQSBub24tYW5vbiBzd2FwY2FjaGUgZm9saW8gdGhhdCBzdGlsbCBoYXMgYSBtYXBwaW5nIGNhbiBvbmx5IGJlIGFcbitcdCAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0J3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXG4rXHQgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW1cbitcdCAqIGhlbmNlIHJlamVjdCBpdCBoZXJlIHVwIGZyb250IGJlZm9yZSB0b3VjaGluZyBhbnl0aGluZy5cbitcdCAqL1xuK1x0aWYgKCFpc19hbm9uIFx1MDAyNlx1MDAyNiBpc19zd2FwY2FjaGUgXHUwMDI2XHUwMDI2IGZvbGlvLVx1MDAzZW1hcHBpbmcpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4rLyoqXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKCkgLSBzcGxpdCBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW9cbisgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXG4rICogQGRvX2xydTogaWYgdHJ1ZSwgYWRkIGFmdGVyLXNwbGl0IGZvbGlvcyB0byBAbGlzdCBpZiBub24gTlVMTCwgb3RoZXJ3aXNlIHRvXG4rICogICAgICAgICAgdGhlIExSVSBsaXN0XG4rICogQGFub25fdW5tYXA6IGlmIHRydWUsIHVubWFwIEBmb2xpbyBiZWZvcmUgdGhlIHNwbGl0IGFuZCByZW1hcCBpdCBhZnRlclxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbisgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICpcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW8uIEl0IHVubWFwcyBAZm9saW8gKHVubGVzc1xuKyAqIEBhbm9uX3VubWFwIGlzIGZhbHNlKSwgZnJlZXplcyBpdHMgcmVmY291bnQsIGFuZCBwZXJmb3JtcyB0aGUgc3BsaXQsIHVwZGF0ZXNcbisgKiB0aGUgc3dhcCBjYWNoZSBlbnRyaWVzLiBTcGxpdCBmb2xpb3MgYXJlIHVuZnJvemVuIGFuZCByZW1hcHBlZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLlxuKyAqL1xuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4rXHRcdFx0XHRcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4rXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuK1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuK1x0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4rXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xuIFx0c3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1O1xuK1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xuIFx0aW50IHJldCA9IDA7XG4gXG4tXHRWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgXHUwMDI2XHUwMDI2IGVuZCk7XG4rXHQvKlxuK1x0ICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5XG4rXHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cbitcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xuK1x0ICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXNcbitcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxuK1x0ICovXG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4rXHRcdGlmICghYW5vbl92bWEpXG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4rXHR9XG4rXG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gb3V0X3VubG9jaztcbitcdH1cbitcbitcdGlmIChhbm9uX3VubWFwKVxuK1x0XHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuK1xuIFx0LypcbiBcdCAqIElmIHRoaXMgZm9saW8gY2FuIGJlIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBxdWV1ZSwgbG9jayBvdXRcbiBcdCAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXNcbiBcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxuIFx0ICogbG9jayBhbmQgbXVzdCBjbGVhbiB1cCB0aGUgTFJVIHN0YXRlIC0gdGhlIHNhbWUgZGVxdWV1ZSB3ZVxuIFx0ICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC5cbitcdCAqXG4rXHQgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCxcbitcdCAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy5cbiBcdCAqL1xuLVx0ZGVxdWV1ZV9kZWZlcnJlZCA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG9sZF9vcmRlciBcdTAwM2UgMTtcbitcdGRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgXHUwMDNlIDEgXHUwMDI2XHUwMDI2IGlzX2Fub247XG4gXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuIFx0XHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4gXG5AQCAtMzk1MiwxMjggKzQwMDEsMjU2IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gXHRcdGxydSA9IGxpc3RfbHJ1X2xvY2soXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxuIFx0XHRcdFx0ICAgIGZvbGlvX25pZChmb2xpbyksIFx1MDAyNm1lbWNnKTtcbiBcdH1cbi1cdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbi1cdFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4tXHRcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKSkge1xuIFx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuLVx0XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuLVx0XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4tXHRcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbi1cdFx0XHRcdFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuLVx0XHRcdH1cbiBcdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbiBcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0fVxuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF9ub19zcGxpdDtcbitcdH1cbiBcbi1cdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4tXG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX1NITUVNX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9GSUxFX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuK1x0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbitcdFx0X19saXN0X2xydV9kZWwoXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXG4rXHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbitcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbitcdFx0XHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcbitcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbitcdFx0XHRcdCAgICAgIE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbiBcdFx0fVxuK1x0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHR9XG4gXG4tXHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbi1cdFx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKG1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRcdH1cbitcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4rXHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4gXG4tXHRcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbi1cdFx0fVxuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzXG4rXHQgKiBpbiBzd2FwIGNhY2hlIG11c3QgYmUgdXBkYXRlZCBmaXJzdCwgc28gYSBjb25jdXJyZW50XG4rXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXG4rXHQgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLlxuK1x0ICovXG4rXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuK1x0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4rXHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0XHRpZiAoY2kpXG4rXHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0fVxuIFxuLVx0XHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXG4tXHRcdFx0XHRcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XG4rXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbitcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuLVx0XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGVcbi1cdFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4tXHRcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2Zcbi1cdFx0ICogQGZvbGlvLlxuLVx0XHQgKi9cbi1cdFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbi1cdFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XG4rXHRpZiAoZG9fbHJ1KVxuK1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRpZiAoY2kpXG4rXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuK291dF9ub19zcGxpdDpcbitcdGxvY2FsX2lycV9lbmFibGUoKTtcbitcdGlmIChhbm9uX3ZtYSkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl92bWEpIHtcbitcdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKGFub25fdm1hKTtcbitcdFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcbitcdH1cbiBcbi1cdFx0XHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xuK1x0cmV0dXJuIHJldDtcbit9XG4gXG4tXHRcdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcbisvKipcbisgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpb1xuKyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXG4rICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuKyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbisgKlxuKyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzXG4rICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdFxuKyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTVxuKyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKVxuKyAqL1xuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbitcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbitcdFx0XHRcdFx0ICAgICAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuK3tcbitcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbitcdFhBX1NUQVRFKHhhcywgXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuK1x0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XG4rXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4rXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XG4rXHR1bnNpZ25lZCBpbnQgbWluX29yZGVyO1xuK1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuK1x0cGdvZmZfdCBlbmQgPSAwO1xuK1x0Z2ZwX3QgZ2ZwO1xuK1x0aW50IHJldCA9IDA7XG4gXG4tXHRcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbi1cdFx0XHRcdFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbitcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuK1x0aWYgKG5ld19vcmRlciBcdTAwM2MgbWluX29yZGVyKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbi1cdFx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0LypcbitcdCAqIFN3aXRjaCB0byBmb2xpbydzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmRcbitcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cbitcdCAqL1xuK1x0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTtcbitcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cbi1cdFx0XHQgKiBOT1RFOiBzaG1lbSBpbiBzd2FwIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChjaSkge1xuLVx0XHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuK1x0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKTtcbitcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdFx0Z290byBmYWlsX2ZyZWU7XG4rXHR9XG4gXG4tXHRcdFx0LyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqL1xuLVx0XHRcdGlmICghbWFwcGluZylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuK1x0bWFwcGluZ19zZXRfdXBkYXRlKFx1MDAyNnhhcywgbWFwcGluZyk7XG4gXG4tXHRcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4tXHRcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4tXHRcdFx0XHRfX3hhX3N0b3JlKFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgbmV3X2ZvbGlvLVx1MDAzZWluZGV4LFxuLVx0XHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0fVxuK1x0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4rXHRcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4gXG4tXHRcdFx0Vk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTtcbi1cdFx0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuLVx0XHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpIFx1MDAyNlx1MDAyNiBucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRcdFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4tXHRcdFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxuLVx0XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxuLVx0XHRcdFx0XHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuLVx0XHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbi1cdFx0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbitcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuK1x0XHR4YXNfc3BsaXRfYWxsb2MoXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xuK1x0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbitcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbitcdFx0XHRnb3RvIGZhaWxfZnJlZTtcbiBcdFx0fVxuK1x0fVxuIFxuLVx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbi1cdFx0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuLVx0XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuLVx0XHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICovXG4tXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpO1xuK1x0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbiBcbi1cdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi9cbitcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcbitcdH1cbiBcbi1cdFx0aWYgKGNpKVxuLVx0XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0fSBlbHNlIHtcbi1cdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdC8qXG4rXHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuK1x0ICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmVcbitcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbitcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuK1x0ICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy5cbitcdCAqL1xuK1x0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4rXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbitcbitcdHVubWFwX2ZvbGlvKGZvbGlvKTtcbitcbitcdHhhc19sb2NrX2lycShcdTAwMjZ4YXMpO1xuK1xuK1x0LypcbitcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4rXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbitcdCAqL1xuK1x0aWYgKHhhc19sb2FkKFx1MDAyNnhhcykgIT0gZm9saW8pIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgKyAxKSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuK1x0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcbitcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NITUVNX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuK1x0XHRlbHNlXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9GSUxFX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuK1x0fVxuK1xuK1x0LyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovXG4rXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRyZXQgPSBfX3NwbGl0X2Zyb3plbl9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgXHUwMDI2eGFzLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbitcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0LyogY29tcHV0ZSBuZXh0IGJlZm9yZSB0aGUgZm9saW8gY2FuIGJlIGZyZWVkIGJlbG93ICovXG4rXHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICsgMSk7XG4rXG4rXHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcbitcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4rXHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuK1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4rXHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuK1x0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4tXHRcdHJldHVybiAtRUFHQUlOO1xuK1xuK1x0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuK1x0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0XHRucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuK1x0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbitcdFx0XHRcdFx0ICAgICAgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4rXHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbitcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4rXHQvKlxuK1x0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbitcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbitcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4rXHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqL1xuK1x0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgKyAxKTtcbitcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbitmYWlsOlxuK1x0LypcbitcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbitcdCAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LlxuK1x0ICovXG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSArNDI2Myw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbiAgKlxuLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiAgKiBJdCBpcyBpbiBjaGFyZ2Ugb2YgY2hlY2tpbmcgd2hldGhlciB0aGUgc3BsaXQgaXMgc3VwcG9ydGVkIG9yIG5vdCBhbmRcbi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICs0Mjc5LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxuIFx0XHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4tXHRYQV9TVEFURSh4YXMsIFx1MDAyNmZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuIFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbi1cdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbi1cdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcbi1cdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbi1cdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbi1cdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4tXHRwZ29mZl90IGVuZCA9IDA7XG4gXHRpbnQgcmV0O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbkBAIC00MTIwLDE0MSArNDI5MSwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuK1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdGlmIChuZXdfb3JkZXIgXHUwMDNlPSBvbGRfb3JkZXIpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbiBcdGlmIChyZXQpIHtcbiBcdFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wiKTtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuLVx0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuLVx0ICovXG4tXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuLVx0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4tXG4tXHRpZiAoaXNfYW5vbikge1xuLVx0XHQvKlxuLVx0XHQgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGRcbi1cdFx0ICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYVxuLVx0XHQgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzXG4tXHRcdCAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9ja1xuLVx0XHQgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZVxuLVx0XHQgKiBvcGVyYXRpb25zLlxuLVx0XHQgKi9cbi1cdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuLVx0XHRpZiAoIWFub25fdm1hKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH0gZWxzZSB7XG4tXHRcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4tXHRcdGdmcF90IGdmcDtcbi1cbi1cdFx0bWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4tXHRcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuLVx0XHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpIHtcbi1cdFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjZcbi1cdFx0XHRcdFx0XHRcdEdGUF9SRUNMQUlNX01BU0spO1xuLVxuLVx0XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuLVx0XHRcdHJldCA9IC1FQlVTWTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbi1cbi1cdFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4tXHRcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuLVx0XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4tXHRcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4tXHRcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuLVxuLVx0XHRhbm9uX3ZtYSA9IE5VTEw7XG4tXHRcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuLVx0XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuLVx0XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4tXHRcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuLVx0XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuLVx0XHQgKi9cbi1cdFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4tXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuLVx0XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcbi1cdCAqIHNwbGl0IFBNRHNcbi1cdCAqL1xuLVx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbi1cdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0dW5tYXBfZm9saW8oZm9saW8pO1xuLVxuLVx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRpZiAobWFwcGluZykge1xuLVx0XHQvKlxuLVx0XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuLVx0XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbi1cdFx0ICovXG4tXHRcdHhhc19sb2NrKFx1MDAyNnhhcyk7XG4tXHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuLVx0XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuLVx0XHRcdHJldCA9IC1FQUdBSU47XG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHR9XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbitcdGlmIChpc19hbm9uKVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuK1x0ZWxzZVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgKzQzMjQsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XG4gXHRcdC8qXG4gXHRcdCAqIFN1YnBhZ2VzIHdob3NlIG1hcHBpbmcgaGFzIGJlZW4gemFwcGVkIG1heSBiZSBmcmVlZFxuIFx0XHQgKiBlYXJsaWVyLCBidXQgZnJlZWluZyB0aGVtIHJlcXVpcmVzIHRha2luZyB0aGVcbi1cdFx0ICogbHJ1X2xvY2ssIHNvIHdlIGRlZmVyIHB1dF9wYWdlKCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuK1x0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuIFx0XHQgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLlxuIFx0XHQgKi9cbi1cdFx0ZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pO1xuK1x0XHRpZiAoaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiAhZm9saW9fbWFwcGVkKG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzExLDI5ICs0MzYwLDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKVxuICAqXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcbi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbisgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgZmFsc2UsXG4rXHRcdFx0XHRcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTAgKzQzOTIsOSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXG4gICpcbi0gKiA0KSBAbmV3X29yZGVyIFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxuLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxuLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4rICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yXG4rICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcbisgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG5AQCAtNDM4NCw3ICs0NDIzLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxuICAqL1xuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCBiNzZlYjNkODc2ZmQ3Li41OWE1NzdmNjg1YjViIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0zODksOCArMzg5LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xuIFx0XHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVx1MDAzZXN3YXApO1xuIFx0XHRjaV9lbmQgPSBjaV9vZmYgKyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmKysgXHUwMDNjIGNpX2VuZClcbitcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbitcdFx0fSB3aGlsZSAoKytjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjBUMTk6MDQ6MzIuODUwMTYxOTQ0WiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg5NDMzOTc3NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgRm9saW8gU3BsaXR0aW5nIFBhdGNoKipcblxuT2theSwgc28gSSd2ZSBsb29rZWQgb3ZlciB0aGlzIHBhdGNoLiBJdCdzIHRvdWNoaW5nIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AsIHdoaWNoIGltbWVkaWF0ZWx5IHRlbGxzIG1lIHdlJ3JlIGRlYWxpbmcgd2l0aCB0aGUgbml0dHktZ3JpdHR5IG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBzcGVjaWZpY2FsbHkgaG93IHdlJ3JlIGhhbmRsaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgYW5kIHRoZWlyIGludGVyYWN0aW9uIHdpdGggdGhlIHN3YXAgY2FjaGUgYW5kIHBhZ2UgY2FjaGUuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2VzIGlzIGEgcmVmYWN0b3Jpbmcgb2YgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYy4gVGhleSdyZSByZW5hbWluZyBmdW5jdGlvbnMsIGxpa2UgYF9fc3BsaXRfdW5tYXBwZWRfZm9saW9gIHRvIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AgYW5kIHNpbWlsYXIgdmFyaWF0aW9ucywgYnV0IHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgc2VlbXMgdGhlIHNhbWU6IHVubWFwcGluZywgZnJlZXppbmcsIGFuZCBzcGxpdHRpbmcgdGhlc2UgZm9saW9zLlxuXG5NeSBpbml0aWFsIHNjYW4gdGVsbHMgbWUgdGhpcyBpcyBhbGwgcHVyZWx5IGludGVybmFsIG1lbW9yeSBtYW5hZ2VtZW50LiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBpbnRyb2R1Y2VkIHRoYXQgd291bGQgZ2V0IGV4cG9zZWQgdG8gdXNlciBzcGFjZS4gSXQncyBhbGwgYWJvdXQgaG93IHdlIG1hbmFnZSBwYWdlIHJlZmNvdW50cywgZGVhbCB3aXRoIGxvY2tpbmcsIGFuZCB1cGRhdGUgdGhvc2UgeGFycmF5cyBhbmQgTFJVIGxpc3RzIHdoZW4gc3BsaXR0aW5nIGEgZm9saW8uXG5cblNpbmNlIGl0J3MgbWVtb3J5IG1hbmFnZW1lbnQsIHRoZSB0eXBpY2FsIHJpc2tzIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHM6IHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZXMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIGFuZCBkZWFkbG9ja3MuIEJ1dCwgc2luY2UgdGhlcmUgaXMgbm8gZGF0YSBjb3BpZWQgdG8gb3IgZnJvbSB1c2VyIHNwYWNlIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBLTVNBTiBkb2Vzbid0IHNlZW0gdG8gYmUgcmVxdWlyZWQgZm9yIHRoZXNlIGNoYW5nZXMuIFdlJ3JlIGFscmVhZHkgcHJvdGVjdGVkIGJ5IEtBU0FOLCBLQ1NBTiwgYW5kIExPQ0tERVAgZm9yIHRoZSB1c3VhbCBtZW1vcnkgY29ycnVwdGlvbiBhbmQgbG9ja2luZyBwcm9ibGVtcy5cblxuSSB0b29rIGEgY2xvc2VyIGxvb2sgdG8gZG91YmxlLWNoZWNrIG15IGluaXRpYWwgYXNzZXNzbWVudC4gSSBzZWUgYHhhc19zcGxpdF9hbGxvY2AgYmVpbmcgdXNlZCwgYnV0IHRob3NlIGFyZSBqdXN0IGFsbG9jYXRpbmcgeGFycmF5IG5vZGVzLCBub3QgdXNlci12aXNpYmxlIGRhdGEuIE5vdGhpbmcgbmV3IGlzIGJlaW5nIGV4cG9zZWQgdG8gdXNlcnNwYWNlLiBNZW1vcnkgaW5pdGlhbGl6YXRpb24gZG9lc24ndCBzZWVtIHRvIGJlIGEgZmFjdG9yIGhlcmU7IHdlJ3JlIGp1c3Qgc3BsaXR0aW5nIGV4aXN0aW5nIGZvbGlvcy5cblxuVGhlcmVmb3JlLCAqTmVlZHNLTVNBTiogaXMgZGVmaW5pdGVseSBmYWxzZS4gVGhpcyBwYXRjaCBpcyBhIGdvb2QgZXhhbXBsZSBvZiBpbnRlcm5hbCBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIHRoYXQgc2hvdWxkICpub3QqIHJlcXVpcmUgS01TQU4gc2NydXRpbnkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyODc2LCJPdXRwdXRUb2tlbnMiOjE2NiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIwVDE5OjA0OjQxLjc5MzU2NDQ2NVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGZvciBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcykuIEl0IG1vZGlmaWVzIGhvdyBmb2xpb3MgYXJlIHVubWFwcGVkLCBmcm96ZW4sIGFuZCBzcGxpdCwgdXBkYXRpbmcgcGFnZSBjYWNoZSBhbmQgc3dhcCBjYWNoZSByZWZlcmVuY2VzLiBUaGVzZSBjaGFuZ2VzIGludm9sdmUgcGFnZSByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCB4YXJyYXkgbWFuaXB1bGF0aW9ucy4gVGhleSBkbyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbHRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJ1ZmZlcnMuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyB3b3VsZCBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGxvY2tpbmcgaXNzdWVzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGZvciBhbm9ueW1vdXMsIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcykuIEl0IG1vZGlmaWVzIGhvdyBmb2xpb3MgYXJlIHVubWFwcGVkLCBmcm96ZW4sIGFuZCBzcGxpdCwgdXBkYXRpbmcgcGFnZSBjYWNoZSBhbmQgc3dhcCBjYWNoZSByZWZlcmVuY2VzLiBUaGVzZSBjaGFuZ2VzIGludm9sdmUgcGFnZSByZWZlcmVuY2UgY291bnRpbmcsIGxvY2tpbmcsIGFuZCB4YXJyYXkgbWFuaXB1bGF0aW9ucy4gVGhleSBkbyBub3QgaW50cm9kdWNlIG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbHRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgbWVtb3J5IGJ1ZmZlcnMuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyB3b3VsZCBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGxvY2tpbmcgaXNzdWVzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowft9df[1] Phase: Succeeded StartedAt: 2026-08-20 19:04:52 +0000 UTC FinishedAt: 2026-08-20 19:04:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-20 19:04:52 +0000 UTC FinishedAt: 2026-08-20 19:04:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2] Phase: Succeeded StartedAt: 2026-08-20 19:04:52 +0000 UTC FinishedAt: 2026-08-20 22:45:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:04:52 +0000 UTC FinishedAt: 2026-08-20 22:45:20 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:04:52 +0000 UTC FinishedAt: 2026-08-20 19:05:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:04:52 +0000 UTC FinishedAt: 2026-08-20 19:04:57 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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-workflowft9df/series-workflowft9df-convert-artifact-3532257159/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:05:02 +0000 UTC FinishedAt: 2026-08-20 19:22:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:05:02 +0000 UTC FinishedAt: 2026-08-20 19:22:31 +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:*10ebd4b5-990c-490d-b47a-147c0305ebfe,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-workflowft9df/series-workflowft9df-convert-artifact-3532257159/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": "6d8cc3af-149b-472b-aae0-14baabd5e562", "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-workflowft9df/series-workflowft9df-build-action-2591770141/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:05:02 +0000 UTC FinishedAt: 2026-08-20 19:22:21 +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:*10ebd4b5-990c-490d-b47a-147c0305ebfe,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-workflowft9df/series-workflowft9df-convert-artifact-3532257159/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": "6d8cc3af-149b-472b-aae0-14baabd5e562", "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-workflowft9df/series-workflowft9df-build-action-2591770141/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:22:31 +0000 UTC FinishedAt: 2026-08-20 19:22:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:22:31 +0000 UTC FinishedAt: 2026-08-20 19:22:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:22:31 +0000 UTC FinishedAt: 2026-08-20 19:22:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:22:31 +0000 UTC FinishedAt: 2026-08-20 19:22:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-workflowft9df/series-workflowft9df-convert-artifact-1302517942/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:22:41 +0000 UTC FinishedAt: 2026-08-20 19:24:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:22:41 +0000 UTC FinishedAt: 2026-08-20 19:24:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*6d8cc3af-149b-472b-aae0-14baabd5e562,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-workflowft9df/series-workflowft9df-build-action-2591770141/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-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:24:34 +0000 UTC FinishedAt: 2026-08-20 19:24:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:24:34 +0000 UTC FinishedAt: 2026-08-20 19:24:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:24:34 +0000 UTC FinishedAt: 2026-08-20 19:41:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:24:34 +0000 UTC FinishedAt: 2026-08-20 19:41:34 +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:*10ebd4b5-990c-490d-b47a-147c0305ebfe,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-workflowft9df/series-workflowft9df-convert-artifact-1302517942/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": "a5614e5d-0149-42dc-90d8-3734fbb275e0", "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-workflowft9df/series-workflowft9df-build-action-2946178490/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:24:34 +0000 UTC FinishedAt: 2026-08-20 19:41:24 +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:*10ebd4b5-990c-490d-b47a-147c0305ebfe,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-workflowft9df/series-workflowft9df-convert-artifact-1302517942/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": "a5614e5d-0149-42dc-90d8-3734fbb275e0", "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-workflowft9df/series-workflowft9df-build-action-2946178490/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:41:34 +0000 UTC FinishedAt: 2026-08-20 19:41:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:41:34 +0000 UTC FinishedAt: 2026-08-20 19:41:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:41:34 +0000 UTC FinishedAt: 2026-08-20 19:43:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:41:34 +0000 UTC FinishedAt: 2026-08-20 19:43:16 +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:*a5614e5d-0149-42dc-90d8-3734fbb275e0,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-workflowft9df/series-workflowft9df-build-action-2946178490/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-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:26 +0000 UTC FinishedAt: 2026-08-20 22:45:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:26 +0000 UTC FinishedAt: 2026-08-20 22:45:20 +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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"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:*6d8cc3af-149b-472b-aae0-14baabd5e562,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a5614e5d-0149-42dc-90d8-3734fbb275e0,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-workflowft9df/series-workflowft9df-build-action-2591770141/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-workflowft9df/series-workflowft9df-build-action-2946178490/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:26 +0000 UTC FinishedAt: 2026-08-20 19:43:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:26 +0000 UTC FinishedAt: 2026-08-20 19:43:31 +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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"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-workflowft9df/series-workflowft9df-convert-artifact-1049344475/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:26 +0000 UTC FinishedAt: 2026-08-20 19:43:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:26 +0000 UTC FinishedAt: 2026-08-20 19:43:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:26 +0000 UTC FinishedAt: 2026-08-20 19:43:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:36 +0000 UTC FinishedAt: 2026-08-20 22:45:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowft9df[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"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":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"4b2ae13f3393ef4b4bce0021e8762790354f369f","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"4b03c31f-5176-4b89-ab75-977f5f471d85","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-08-20 19:43:36 +0000 UTC FinishedAt: 2026-08-20 22:45:11 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*6d8cc3af-149b-472b-aae0-14baabd5e562,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a5614e5d-0149-42dc-90d8-3734fbb275e0,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-workflowft9df/series-workflowft9df-build-action-2591770141/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-workflowft9df/series-workflowft9df-build-action-2946178490/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-workflowft9df/series-workflowft9df-convert-artifact-1049344475/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,}