Name: series-workflow4gscf Phase: Succeeded StartedAt: 2026-07-15 08:23:24 +0000 UTC FinishedAt: 2026-07-15 13:23:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[0] Phase: Succeeded StartedAt: 2026-07-15 08:23:24 +0000 UTC FinishedAt: 2026-07-15 08:57:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[0].run-triage Phase: Succeeded StartedAt: 2026-07-15 08:23:24 +0000 UTC FinishedAt: 2026-07-15 08:57:22 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "2ef7aa14db59fb1d5f562e6e425ef39509cb033b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "TRANSPARENT_HUGEPAGE_ALWAYS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "2ef7aa14db59fb1d5f562e6e425ef39509cb033b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "TRANSPARENT_HUGEPAGE_ALWAYS" ], "series_id": "9c681b44-9d52-4a6c-9a3a-04bb7151ca2e" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "collapse_check_pte", "__collapse_huge_page_isolate", "collapse_scan_pmd", "collapse_scan_file", "collapse_huge_page" ], "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+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvbGxhcHNlX2NoZWNrX3B0ZSYjMzQ7LAogICAgJiMzNDtfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX3NjYW5fcG1kJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX3NjYW5fZmlsZSYjMzQ7LAogICAgJiMzNDtjb2xsYXBzZV9odWdlX3BhZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5YjQ0YzY2NjE1MTYwOTM1YjgxZjI1ZjJiOGE0NGRkMTIwNTg3N2JiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBKdWwgMTUgMDg6NTU6NDAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5pbmRleCAxNmYzNzEzNWVkODBkZi4uYjE4N2Q2MTg0NTJmNDQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkXG4gKGVpdGhlciBvZiB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIG9yIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBhcmUgc2V0XG4gdG8gXCYjMzQ7YWx3YXlzXCYjMzQ7IG9yIFwmIzM0O21hZHZpc2VcJiMzNDspLCBhbmQgaXQmIzM5O2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlblxuIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlXG4tdG9wLWxldmVsIGNvbnRyb2wgYXJlIFwmIzM0O25ldmVyXCYjMzQ7KVxuJiM0Mzt0b3AtbGV2ZWwgY29udHJvbCBhcmUgXCYjMzQ7bmV2ZXJcJiMzNDspLlxuIFxuIHByb2Nlc3MgVEhQIGNvbnRyb2xzXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBAIC0zMDEsNyAmIzQzOzMwMSw5IEBAIGJlaW5nIHJlcGxhY2VkIGJ5IGEgUE1EIG1hcHBpbmcsIG9yICgyKSBwaHlzaWNhbCBwYWdlcyByZXBsYWNlZCBieSBvbmVcbiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LFxuIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci5cbiBBcyBzdWNoLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCByb3VnaGx5IGFzIGEgc2lnbiBvZiBwcm9ncmVzcyxcbi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6XG4mIzQzO2FuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcuXG4mIzQzO1Blci1vcmRlciBtVEhQIGNvbGxhcHNlIHN0YXRpc3RpY3MgYXJlIGFsc28gYXZhaWxhYmxlIHVuZGVyXG4mIzQzOy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy1cdTAwM2NzaXplXHUwMDNla0Ivc3RhdHMvKTo6XG4gXG4gXHQvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZFxuIFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xuaW5kZXggNTUxNTc1NjdkYzRjYzEuLjQwMTI1ZGNiNGRlOWQ2IDEwMDY0NFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9raHVnZXBhZ2VkLmNcbkBAIC02NCw2ICYjNDM7NjQsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7XG4gXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxuIH07XG4gXG4mIzQzO2VudW0gcHRlX2NoZWNrX3Jlc3VsdCB7XG4mIzQzO1x0UFRFX0NIRUNLX1NVQ0NFRUQsXG4mIzQzO1x0UFRFX0NIRUNLX0ZBSUwsXG4mIzQzO1x0UFRFX0NIRUNLX0NPTlRJTlVFLFxuJiM0Mzt9O1xuJiM0MztcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcbiAjaW5jbHVkZSBcdTAwM2N0cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaFx1MDAzZVxuIFxuQEAgLTExOCw2ICYjNDM7MTI0LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHtcbiBcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiB9O1xuIFxuJiM0MztzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuJiM0MztcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcbiYjNDM7XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRpbnQgbm9uZV9vcl96ZXJvO1xuJiM0MztcdGludCBzaGFyZWQ7XG4mIzQzO1x0aW50IHVubWFwcGVkO1xuJiM0MztcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7XG4mIzQzO307XG4mIzQzO1xuIC8qKlxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXG4gICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW5cbkBAIC02MjAsNyAmIzQzOzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHRcdC8qXG4gXHRcdCAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3RcbiBcdFx0ICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuXG4tXHRcdCAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuJiM0MztcdFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuIFx0XHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxuIFx0XHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXG4gXHRcdCAqL1xuQEAgLTYyOSw2ICYjNDM7NjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHR9XG4gfVxuIFxuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4mIzQzO3tcbiYjNDM7XHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4mIzQzO1x0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiBcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXG5AQCAtNjY1LDc2ICYjNDM7NjkyLDE1NiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcbiBcdH1cbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoKSAtIENoZWNrIGZvciBlbm91Z2ggcmVmZXJlbmNlZCBQVEVzIHRvIGp1c3RpZnkgY29sbGFwc2luZ1xuJiM0MzsgKlxuJiM0MzsgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlIHBhZ2UgaGFzIGJlZW5cbiYjNDM7ICogcmVjZW50bHkgYWNjZXNzZWQgKHlvdW5nIHB0ZSkgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gcmVjZW50bHkgYWNjZXNzZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgY29sbGFwc2VfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCxcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuJiM0MztcdFx0Zm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxuJiM0MztcdFx0bW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LFxuJiM0MztcdFx0ZW51bSBtdGhwX3N0YXRfaXRlbSBtdGhwX2V2ZW50KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4mIzQzO1x0XHRjb3VudF92bV9ldmVudCh2bV9ldmVudCk7XG4mIzQzO1x0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBtdGhwX2V2ZW50KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmRcbiYjNDM7ICogcmV0dXJuIFBURV9DSEVDS19GQUlMLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcbiYjNDM7XHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0KVxuJiM0Mzt7XG4mIzQzO1x0Y3R4LVx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcbiYjNDM7XHRyZXR1cm4gUFRFX0NIRUNLX0ZBSUw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIC0gQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlXG4mIzQzOyAqXG4mIzQzOyAqIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOlxuJiM0MzsgKiAtIG1heF9wdGVfKiB2YWx1ZXMgYXJlIG5vdCBleGNlZWRlZFxuJiM0MzsgKiAtIHVmZmQgaXMgbm90IGFjdGl2ZVxuJiM0MzsgKiAtIGxhenlmcmVlIHByb3BlcnRpZXMgYXJlIG5vdCBwcmVzZW50XG4mIzQzOyAqIC0gb25seSBhbm9ueW1vdXMgcGFnZXMgYXJlIHByZXNlbnRcbiYjNDM7ICpcbiYjNDM7ICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnRcbiYjNDM7ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUFRFX0NIRUNLX1NVQ0NFRUQgaWYgdGhlIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4mIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0ZBSUwgaWYgdGhlIFBURSBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbGxhcHNlLFxuJiM0MzsgKiAgICAgICAgIFBURV9DSEVDS19DT05USU5VRSBpZiB0aGUgc2NhbiBzaG91bGQgY29udGludWUgdG8gY2hlY2sgdGhlIG5leHQgUFRFLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcbiYjNDM7e1xuJiM0MztcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7Y3R4LVx1MDAzZW5vbmVfb3JfemVybyBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX25vbmUpIHtcbiYjNDM7XHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsXG4mIzQzO1x0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuJiM0MztcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbiYjNDM7XHRcdGlmIChjdHgtXHUwMDNldW5tYXBwZWQgPT0gLTEpXG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7Y3R4LVx1MDAzZXVubWFwcGVkIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xuJiM0MztcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbiYjNDM7XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuJiM0MztcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbiYjNDM7XHR9XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEb24mIzM5O3QgY29sbGFwc2UgaWYgYW55IG9mIHRoZSBzbWFsbCBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmRcbiYjNDM7XHQgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkXG4mIzQzO1x0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxuJiM0MztcdCAqIHJlZ2lzdGVyZWQgcmFuZ2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTtcbiYjNDM7XG4mIzQzO1x0Y3R4LVx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cdTAwM2V2bWEsIGFkZHIsIHB0ZXZhbCk7XG4mIzQzO1x0aWYgKHVubGlrZWx5KCFjdHgtXHUwMDNlZm9saW8pIHx8IHVubGlrZWx5KGZvbGlvX2lzX3pvbmVfZGV2aWNlKGN0eC1cdTAwM2Vmb2xpbykpKVxuJiM0MztcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbiYjNDM7XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGN0eC1cdTAwM2VjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKGN0eC1cdTAwM2V2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoY3R4LVx1MDAzZWZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKVxuJiM0MztcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSkge1xuJiM0MztcdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtXHUwMDNlZm9saW8pKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbiYjNDM7XHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuJiM0MztcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuJiM0MztcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2N0eC1cdTAwM2VzaGFyZWQgXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpIHtcbiYjNDM7XHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcbiYjNDM7XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXG4gXHRcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IGxpc3RfaGVhZCAqY29tcG91bmRfcGFnZWxpc3QpXG4ge1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKTtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKTtcbiBcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMO1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyO1xuLVx0cHRlX3QgKl9wdGU7XG4tXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XG4mIzQzO1x0cHRlX3QgKl9wdGUsIHB0ZXZhbDtcbiYjNDM7XHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4gXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiYjNDM7XHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xuJiM0MztcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XG4mIzQzO1x0XHQuY2MgPSBjYyxcbiYjNDM7XHRcdC52bWEgPSB2bWEsXG4mIzQzO1x0XHQub3JkZXIgPSBvcmRlcixcbiYjNDM7XHRcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24mIzM5O3QgY2hlY2sgc3dhcCBQVEVzICovXG4mIzQzO1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLFxuJiM0MztcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxuJiM0MztcdH07XG4gXG4gXHRmb3IgKF9wdGUgPSBwdGU7IF9wdGUgXHUwMDNjIHB0ZSAmIzQzOyBucl9wYWdlcztcbiBcdCAgICAgX3B0ZSYjNDM7JiM0MzssIGFkZHIgJiM0Mzs9IFBBR0VfU0laRSkge1xuLVx0XHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcbi1cdFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuLVx0XHRcdGlmICgmIzQzOyYjNDM7bm9uZV9vcl96ZXJvIFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcbi1cdFx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX05PTl9QUkVTRU5UO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0XHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xuLVx0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVx0XHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuLVx0XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xuJiM0MztcdFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4mIzQzO1x0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xuJiM0MztcdFx0Zm9saW8gPSBjdHguZm9saW87XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4mIzQzO1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiYjNDM7XHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovXG4tXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbi1cdFx0XHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcbi1cdFx0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4tXHRcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICgmIzQzOyYjNDM7c2hhcmVkIFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7XG4tXHRcdFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0XHR9XG4tXHRcdH1cbiBcdFx0LypcbiBcdFx0ICogVE9ETzogSW4gc29tZSBjYXNlcyBvZiBwYXJ0aWFsbHktbWFwcGVkIGZvbGlvcywgd2UmIzM5O2QgYWN0dWFsbHlcbiBcdFx0ICogd2FudCB0byBjb2xsYXBzZS5cbkBAIC03NTksNyAmIzQzOzg2Niw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHRcdC8qXG4gXHRcdCAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGVcbi1cdFx0ICogZm9saW8gY2FuJiMzOTt0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IFBHX2xvY2tcbiYjNDM7XHRcdCAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrXG4gXHRcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcbiBcdFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxuIFx0XHQgKi9cbkBAIC03ODYsNyAmIzQzOzg5Myw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdH1cbiBcbiBcdFx0Lypcbi1cdFx0ICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlXG4mIzQzO1x0XHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcbiBcdFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXG4gXHRcdCAqL1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xuQEAgLTgwMywxNCAmIzQzOzkxMCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmZvbGlvLVx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xuIG5leHQ6XG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4mIzQzO1x0XHRpZiAoY29sbGFwc2VfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSlcbiBcdFx0XHRyZWZlcmVuY2VkJiM0MzsmIzQzOztcbiBcdH1cbiBcbkBAIC04MTgsMTMgJiM0Mzs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcbiBcdH0gZWxzZSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbi1cdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbiYjNDM7XHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4mIzQzO1x0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuQEAgLTEwNzgsNyAmIzQzOzExNzgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbFxuIFx0XHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XG4gXHQvKlxuIFx0ICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuXG4tXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4mIzQzO1x0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYWNxdWlyZWQgdGhlIG1tYXBfbG9jay5cbiBcdCAqXG4gXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxuIFx0ICogdm1hcy5cbkBAIC0xMTM2LDcgJiM0MzsxMjM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY2hlY2tfcG1kX3N0aWxsX3ZhbGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIC8qXG4gICogQnJpbmcgbWlzc2luZyBwYWdlcyBpbiBmcm9tIHN3YXAsIHRvIGNvbXBsZXRlIFRIUCBjb2xsYXBzZS5cbi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxuJiM0MzsgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cbiAgKlxuICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2VcbiAgKiBmYXVsdGluZyBwYWdlcyBiYWNrIGluIGR1cmluZyBjb2xsYXBzZSBjb3VsZCByZS1wb3B1bGF0ZSBQVEVzIHRoYXRcbkBAIC0xMjQ3LDE1ICYjNDM7MTM0NywxMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIFx0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFx1MDAyNmNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiBcdGlmICghZm9saW8pIHtcbiBcdFx0KmZvbGlvcCA9IE5VTEw7XG4tXHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuLVx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuJiM0MztcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQsXG4mIzQzO1x0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4gXHRcdHJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMO1xuIFx0fVxuIFxuLVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XG4tXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4mIzQzO1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdC8qXG4gXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2Zcbi1cdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxuLVx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBQR19sb2NrLlxuJiM0MztcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2ggYW5kIHRoZSBWTVxuJiM0MztcdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgZm9saW8gbG9jay5cbiBcdCAqXG4gXHQgKiBVRkZESU9fTU9WRSBpcyBwcmV2ZW50ZWQgdG8gcmFjZSBhcyB3ZWxsIHRoYW5rcyB0byB0aGVcbiBcdCAqIG1tYXBfbG9jay5cbkBAIC0xNDM5LDcgJiM0MzsxNTM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdFx0XHRzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTtcbiBcdFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcbiBcdFx0bWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLFxuLVx0XHRcdFx0XHQgIC8qdWZmZF93cD0qLyBmYWxzZSk7XG4mIzQzO1x0XHRcdFx0XHQgIC8qdWZmZD0qLyBmYWxzZSk7XG4gXHRcdGlmIChwdGVfcHRsICE9IHBtZF9wdGwpXG4gXHRcdFx0c3Bpbl91bmxvY2socHRlX3B0bCk7XG4gXHR9XG5AQCAtMTQ0OSwxMCAmIzQzOzE1NDYsMTAgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcbiBcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbiBvdXRfdXBfd3JpdGU6XG4tXHRpZiAoYW5vbl92bWFfbG9ja2VkKVxuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLVx1MDAzZWFub25fdm1hKTtcbiBcdGlmIChwdGUpXG4gXHRcdHB0ZV91bm1hcChwdGUpO1xuJiM0MztcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4mIzQzO1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLVx1MDAzZWFub25fdm1hKTtcbiBcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcbiBvdXRfbm9sb2NrOlxuIFx0aWYgKGZvbGlvKVxuQEAgLTE1OTMsNDIgJiM0MzsxNjkwLDQ3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxuIFx0XHRib29sICpsb2NrX2Ryb3BwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYylcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuLVx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7XG4gXHRlbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLVx1MDAzZWlzX2todWdlcGFnZWQgPyBUVkFfS0hVR0VQQUdFRCA6IFRWQV9GT1JDRURfQ09MTEFQU0U7XG4gXHRwbWRfdCAqcG1kO1xuIFx0cHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDtcbiBcdGludCBpO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuLVx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiYjNDM7XHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4mIzQzO1x0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHI7XG4gXHR1bnNpZ25lZCBsb25nIGVuYWJsZWRfb3JkZXJzO1xuIFx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0aW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDtcbiYjNDM7XHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcbiYjNDM7XHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xuIFxuIFx0Vk1fQlVHX09OKHN0YXJ0X2FkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4gXG4mIzQzO1x0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcbiYjNDM7XHRcdC5jYyA9IGNjLFxuJiM0MztcdFx0LnZtYSA9IHZtYSxcbiYjNDM7XHRcdC5vcmRlciA9IEhQQUdFX1BNRF9PUkRFUixcbiYjNDM7XHRcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLFxuJiM0MztcdFx0Lm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuJiM0MztcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKSxcbiYjNDM7XHR9O1xuJiM0MztcbiBcdHJlc3VsdCA9IGZpbmRfcG1kX29yX3RocF9vcl9ub25lKG1tLCBzdGFydF9hZGRyLCBcdTAwMjZwbWQpO1xuIFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MmIzQzOyYjNDM7O1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiYjNDM7XHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXG4gXHRlbmFibGVkX29yZGVycyA9IGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcbiBcbiBcdC8qXG4gXHQgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2Vcbi1cdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuXG4mIzQzO1x0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcFxuJiM0MztcdCAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLlxuIFx0ICovXG4gXHRpZiAoZW5hYmxlZF9vcmRlcnMgIT0gQklUKEhQQUdFX1BNRF9PUkRFUikpXG4tXHRcdG1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuJiM0MztcdFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuIFxuIFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcdTAwMjZwdGwpO1xuIFx0aWYgKCFwdGUpIHtcbkBAIC0xNjQ0LDg0ICYjNDM7MTc0NiwxNCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MmIzQzOyYjNDM7O1xuIFxuLVx0XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO3VubWFwcGVkIFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbHdheXMgYmUgc3RyaWN0IHdpdGggdWZmZC13cFxuLVx0XHRcdCAqIGVuYWJsZWQgc3dhcCBlbnRyaWVzLiAgUGxlYXNlIHNlZVxuLVx0XHRcdCAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogRG9uJiMzOTt0IGNvbGxhcHNlIHRoZSBwYWdlIGlmIGFueSBvZiB0aGUgc21hbGxcbi1cdFx0XHQgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi5cbi1cdFx0XHQgKiBIZXJlIHdlIGNhbiBhbHNvIG1hcmsgdGhlIG5ldyBodWdlIHBtZCBhc1xuLVx0XHRcdCAqIHdyaXRlIHByb3RlY3RlZCBpZiBhbnkgb2YgdGhlIHNtYWxsIG9uZXMgaXNcbi1cdFx0XHQgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93blxuLVx0XHRcdCAqIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGxzIG91dHNpZGUgb2Zcbi1cdFx0XHQgKiB0aGUgcmVnaXN0ZXJlZCByYW5nZS4gIFNvLCBqdXN0IGJlIHNpbXBsZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbiYjNDM7XHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4mIzQzO1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbi1cbi1cdFx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0FOT047XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgdHJlYXQgYSBzaW5nbGUgcGFnZSBhcyBzaGFyZWQgaWYgYW55IHBhcnQgb2YgdGhlIFRIUFxuLVx0XHQgKiBpcyBzaGFyZWQuXG4tXHRcdCAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdH1cbiYjNDM7XHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuIFxuIFx0XHQvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqL1xuIFx0XHRfX3NldF9iaXQoaSwgY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMpO1xuQEAgLTE3NDksMzEgJiM0MzsxNzgxLDIxIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHQvKlxuIFx0XHQgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuXG4gXHRcdCAqXG4tXHRcdCAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5OlxuLVx0XHQgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgXHUwMDNlIGZvbGlvX3JlZl9jb3VudCgpLlxuLVx0XHQgKiBCdXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2Vcbi1cdFx0ICogbGF0ZXIuICBIb3dldmVyIGl0IG1heSByZXBvcnQgZmFsc2UgcG9zaXRpdmUgaWYgdGhlIHBhZ2Vcbi1cdFx0ICogaGFzIGV4Y2Vzc2l2ZSBHVVAgcGlucyAoaS5lLiA1MTIpLiAgQW55d2F5IHRoZSBzYW1lIGNoZWNrXG4tXHRcdCAqIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4mIzQzO1x0XHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcbiYjNDM7XHRcdCAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lXG4mIzQzO1x0XHQgKiBjaGVjayB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxuIFx0XHQgKi9cbiBcdFx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSkge1xuIFx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDtcbiBcdFx0XHRnb3RvIG91dF91bm1hcDtcbiBcdFx0fVxuIFxuLVx0XHQvKlxuLVx0XHQgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXNcbi1cdFx0ICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2Vcbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8XG4tXHRcdCAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxuLVx0XHQgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcikpKVxuJiM0MztcdFx0aWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXG4gXHRcdFx0cmVmZXJlbmNlZCYjNDM7JiM0Mzs7XG4gXHR9XG4gXHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgKCFyZWZlcmVuY2VkIHx8XG4tXHRcdCAgICAodW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuJiM0MztcdFx0ICAgIChjdHgudW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuQEAgLTE3ODQsMTMgJiM0MzsxODA2LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4gXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuJiM0MztcdFx0XHRcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4gXHRcdC8qIG1tYXBfbG9jayB3YXMgcmVsZWFzZWQgYWJvdmUsIHNldCBsb2NrX2Ryb3BwZWQgKi9cbiBcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4gXHR9XG4gb3V0OlxuIFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XG4mIzQzO1x0XHRcdFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XG4gXHRyZXR1cm4gcmVzdWx0O1xuIH1cbiBcbkBAIC0yNjkxLDggJiM0MzsyNzEzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0cHJlc2VudCA9IDA7XG4gXHRzd2FwID0gMDtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiYjNDM7XHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXHRyY3VfcmVhZF9sb2NrKCk7XG4gXHR4YXNfZm9yX2VhY2goXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgJiM0MzsgSFBBR0VfUE1EX05SIC0gMSkge1xuIFx0XHRpZiAoeGFzX3JldHJ5KFx1MDAyNnhhcywgZm9saW8pKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvbGxhcHNlX2NoZWNrX3B0ZSYjMzQ7LAogICAgJiMzNDtfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX3NjYW5fcG1kJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX3NjYW5fZmlsZSYjMzQ7LAogICAgJiMzNDtjb2xsYXBzZV9odWdlX3BhZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDliNDRjNjY2MTUxNjA5MzViODFmMjVmMmI4YTQ0ZGQxMjA1ODc3YmIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEp1bCAxNSAwODo1NTo0MCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAppbmRleCAxNmYzNzEzNWVkODBkZi4uYjE4N2Q2MTg0NTJmNDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QKQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkCiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXQKIHRvICYjMzQ7YWx3YXlzJiMzNDsgb3IgJiMzNDttYWR2aXNlJiMzNDspLCBhbmQgaXQmIzM5O2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlbgogYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGUKLXRvcC1sZXZlbCBjb250cm9sIGFyZSAmIzM0O25ldmVyJiMzNDspCiYjNDM7dG9wLWxldmVsIGNvbnRyb2wgYXJlICYjMzQ7bmV2ZXImIzM0OykuCiAKIHByb2Nlc3MgVEhQIGNvbnRyb2xzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzAxLDcgJiM0MzszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lCiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LAogb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLgogQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsCi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6CiYjNDM7YW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy4KJiM0MztQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlcgomIzQzOy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy0mbHQ7c2l6ZSZndDtrQi9zdGF0cy8pOjoKIAogCS9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkCiAKZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuYwppbmRleCA1NTE1NzU2N2RjNGNjMS4uNDAxMjVkY2I0ZGU5ZDYgMTAwNjQ0Ci0tLSBhL21tL2todWdlcGFnZWQuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9raHVnZXBhZ2VkLmMKQEAgLTY0LDYgJiM0Mzs2NCwxMiBAQCBlbnVtIHNjYW5fcmVzdWx0IHsKIAlTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLAogfTsKIAomIzQzO2VudW0gcHRlX2NoZWNrX3Jlc3VsdCB7CiYjNDM7CVBURV9DSEVDS19TVUNDRUVELAomIzQzOwlQVEVfQ0hFQ0tfRkFJTCwKJiM0MzsJUFRFX0NIRUNLX0NPTlRJTlVFLAomIzQzO307CiYjNDM7CiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlICZsdDt0cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaCZndDsKIApAQCAtMTE4LDYgJiM0MzsxMjQsMjAgQEAgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgewogCURFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTsKIH07CiAKJiM0MztzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgewomIzQzOwlzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2M7CiYjNDM7CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwomIzQzOwl1bnNpZ25lZCBpbnQgb3JkZXI7CiYjNDM7CXN0cnVjdCBmb2xpbyAqZm9saW87CiYjNDM7CWludCBub25lX29yX3plcm87CiYjNDM7CWludCBzaGFyZWQ7CiYjNDM7CWludCB1bm1hcHBlZDsKJiM0MzsJZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lOwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcDsKJiM0MzsJdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZDsKJiM0Mzt9OwomIzQzOwogLyoqCiAgKiBzdHJ1Y3Qga2h1Z2VwYWdlZF9zY2FuIC0gY3Vyc29yIGZvciBzY2FubmluZwogICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW4KQEAgLTYyMCw3ICYjNDM7NjQwLDcgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAkJLyoKIAkJICogVGhpcyBpcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYWdhaW5zdAogCQkgKiBjb2xsYXBzZV90ZXN0X2V4aXQoKSAod2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW4KLQkJICogdW5kZXIgbW1hcCBzZW0gcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsCiYjNDM7CQkgKiB1bmRlciBtbWFwX2xvY2sgcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsCiAJCSAqIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkCiAJCSAqIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMgdW5kZXIgdGhlIG1tYXBfbG9jay4KIAkJICovCkBAIC02MjksNiAmIzQzOzY0OSwxMyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogCX0KIH0KIAomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYykKJiM0Mzt7CiYjNDM7CW1lbXNldChjYy0mZ3Q7bm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtJmd0O25vZGVfbG9hZCkpOwomIzQzOwlub2Rlc19jbGVhcihjYy0mZ3Q7YWxsb2Nfbm1hc2spOwomIzQzOwliaXRtYXBfemVybyhjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pCiB7CiAJbm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywKQEAgLTY2NSw3NiAmIzQzOzY5MiwxNTYgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfcGFnZXMocHRlX3QgKnB0ZSwgcHRlX3QgKl9wdGUsCiAJfQogfQogCiYjNDM7LyoKJiM0MzsgKiBjb2xsYXBzZV9pc19yZWZlcmVuY2VkKCkgLSBDaGVjayBmb3IgZW5vdWdoIHJlZmVyZW5jZWQgUFRFcyB0byBqdXN0aWZ5IGNvbGxhcHNpbmcKJiM0MzsgKgomIzQzOyAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGUgcGFnZSBoYXMgYmVlbgomIzQzOyAqIHJlY2VudGx5IGFjY2Vzc2VkICh5b3VuZyBwdGUpIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgYmVlbiByZWNlbnRseSBhY2Nlc3NlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgY29sbGFwc2VfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCwKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKJiM0Mzt7CiYjNDM7CXJldHVybiBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKJiM0MzsJCWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHwKJiM0MzsJCW1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsCiYjNDM7CQllbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpCiYjNDM7ewomIzQzOwlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKJiM0MzsJCWNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTsKJiM0MzsJY291bnRfbXRocF9zdGF0KG9yZGVyLCBtdGhwX2V2ZW50KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZAomIzQzOyAqIHJldHVybiBQVEVfQ0hFQ0tfRkFJTC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LAomIzQzOwkJZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpCiYjNDM7ewomIzQzOwljdHgtJmd0O3Jlc3VsdCA9IHJlc3VsdDsKJiM0MzsJcmV0dXJuIFBURV9DSEVDS19GQUlMOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIC0gQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlCiYjNDM7ICoKJiM0MzsgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKJiM0MzsgKiAtIG1heF9wdGVfKiB2YWx1ZXMgYXJlIG5vdCBleGNlZWRlZAomIzQzOyAqIC0gdWZmZCBpcyBub3QgYWN0aXZlCiYjNDM7ICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudAomIzQzOyAqIC0gb25seSBhbm9ueW1vdXMgcGFnZXMgYXJlIHByZXNlbnQKJiM0MzsgKgomIzQzOyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50CiYjNDM7ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLAomIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0ZBSUwgaWYgdGhlIFBURSBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbGxhcHNlLAomIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0NPTlRJTlVFIGlmIHRoZSBzY2FuIHNob3VsZCBjb250aW51ZSB0byBjaGVjayB0aGUgbmV4dCBQVEUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCkKJiM0Mzt7CiYjNDM7CWlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHsKJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDtub25lX29yX3plcm8gJmd0OyBjdHgtJmd0O21heF9wdGVzX25vbmUpIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsCiYjNDM7CQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX05PTkVfUFRFKTsKJiM0MzsJCX0KJiM0MzsJCXJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7CiYjNDM7CX0KJiM0MzsJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7CiYjNDM7CQlpZiAoY3R4LSZndDt1bm1hcHBlZCA9PSAtMSkKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7CiYjNDM7CQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7dW5tYXBwZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3N3YXApIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsCiYjNDM7CQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpCiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7CiYjNDM7CQlyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFOwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIERvbiYjMzk7dCBjb2xsYXBzZSBpZiBhbnkgb2YgdGhlIHNtYWxsIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZAomIzQzOwkgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkCiYjNDM7CSAqIGNvdWxkIGJyaW5nIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGwgb3V0c2lkZSBvZiB0aGUKJiM0MzsJICogcmVnaXN0ZXJlZCByYW5nZS4KJiM0MzsJICovCiYjNDM7CWlmIChwdGVfdWZmZChwdGV2YWwpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7CiYjNDM7CiYjNDM7CWN0eC0mZ3Q7Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LSZndDt2bWEsIGFkZHIsIHB0ZXZhbCk7CiYjNDM7CWlmICh1bmxpa2VseSghY3R4LSZndDtmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LSZndDtmb2xpbykpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCiYjNDM7CSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KJiM0MzsJICovCiYjNDM7CWlmIChjdHgtJmd0O2NjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgIShjdHgtJmd0O3ZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC0mZ3Q7Zm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTsKJiM0MzsKJiM0MzsJaWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LSZndDtmb2xpbykpIHsKJiM0MzsJCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtJmd0O2ZvbGlvKSwgY3R4LSZndDtmb2xpbyk7CiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LSZndDtmb2xpbykpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlcgomIzQzOwkJICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhCiYjNDM7CQkgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhCiYjNDM7CQkgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDtzaGFyZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3NoYXJlZCkgewomIzQzOwkJCWNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC0mZ3Q7b3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLAomIzQzOwkJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYywKIAkJdW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdCkKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKTsKIAljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyOwotCXB0ZV90ICpfcHRlOwotCWludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDsKJiM0MzsJcHRlX3QgKl9wdGUsIHB0ZXZhbDsKJiM0MzsJaW50IHJlZmVyZW5jZWQgPSAwOwogCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwomIzQzOwllbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrOwomIzQzOwlzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0gewomIzQzOwkJLmNjID0gY2MsCiYjNDM7CQkudm1hID0gdm1hLAomIzQzOwkJLm9yZGVyID0gb3JkZXIsCiYjNDM7CQkudW5tYXBwZWQgPSAtMSwgLyogZG9uJiMzOTt0IGNoZWNrIHN3YXAgUFRFcyAqLwomIzQzOwkJLm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSwKJiM0MzsJCS5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSwKJiM0MzsJfTsKIAogCWZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSAmbHQ7IHB0ZSAmIzQzOyBucl9wYWdlczsKIAkgICAgIF9wdGUmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHsKLQkJcHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7Ci0JCWlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHsKLQkJCWlmICgmIzQzOyYjNDM7bm9uZV9vcl96ZXJvICZndDsgbWF4X3B0ZXNfbm9uZSkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFOwotCQkJCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAocHRlX3VmZmQocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QVEVfVUZGRDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7Ci0JCWlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCVZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKLQkJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgotCQkgKi8KLQkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgISh2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTsKJiM0MzsJCXB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpOwomIzQzOwkJcHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgJmFtcDtjdHgpOwomIzQzOwkJZm9saW8gPSBjdHguZm9saW87CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7CiYjNDM7CQkJcmVzdWx0ID0gY3R4LnJlc3VsdDsKIAkJCWdvdG8gb3V0OwogCQl9CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSkKJiM0MzsJCQljb250aW51ZTsKIAotCQkvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi8KLQkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7Ci0JCQkvKgotCQkJICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXIKLQkJCSAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYQotCQkJICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYQotCQkJICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLgotCQkJICovCi0JCQlpZiAoJiM0MzsmIzQzO3NoYXJlZCAmZ3Q7IG1heF9wdGVzX3NoYXJlZCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7Ci0JCQkJaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQogCQkvKgogCQkgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSYjMzk7ZCBhY3R1YWxseQogCQkgKiB3YW50IHRvIGNvbGxhcHNlLgpAQCAtNzU5LDcgJiM0Mzs4NjYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCiAJCS8qCiAJCSAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGUKLQkJICogZm9saW8gY2FuJiMzOTt0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IFBHX2xvY2sKJiM0MzsJCSAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrCiAJCSAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2UKIAkJICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLgogCQkgKi8KQEAgLTc4Niw3ICYjNDM7ODkzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJfQogCiAJCS8qCi0JCSAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZQomIzQzOwkJICogSXNvbGF0ZSB0aGUgZm9saW8gdG8gYXZvaWQgY29sbGFwc2luZyBhIGh1Z2VwYWdlCiAJCSAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLgogCQkgKi8KIAkJaWYgKCFmb2xpb19pc29sYXRlX2xydShmb2xpbykpIHsKQEAgLTgwMywxNCAmIzQzOzkxMCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKIAkJCWxpc3RfYWRkX3RhaWwoJmFtcDtmb2xpby0mZ3Q7bHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7CiBuZXh0OgotCQkvKgotCQkgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXMKLQkJICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UKLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7Ci0JCSAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKLQkJICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8Ci0JCSAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcikpKQomIzQzOwkJaWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpCiAJCQlyZWZlcmVuY2VkJiM0MzsmIzQzOzsKIAl9CiAKQEAgLTgxOCwxMyAmIzQzOzkxOCwxMyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFOwogCX0gZWxzZSB7CiAJCXJlc3VsdCA9IFNDQU5fU1VDQ0VFRDsKLQkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybywKJiM0MzsJCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLAogCQkJCQkJICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIG91dDoKIAlyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTsKLQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLAomIzQzOwl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybywKIAkJCQkJICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMDc4LDcgJiM0MzsxMTc4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGwKIAkJcmV0dXJuIFNDQU5fVk1BX0NIRUNLOwogCS8qCiAJICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuCi0JICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLgomIzQzOwkgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLgogCSAqCiAJICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGUKIAkgKiB2bWFzLgpAQCAtMTEzNiw3ICYjNDM7MTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogLyoKICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuCi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgomIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgogICoKICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2UKICAqIGZhdWx0aW5nIHBhZ2VzIGJhY2sgaW4gZHVyaW5nIGNvbGxhcHNlIGNvdWxkIHJlLXBvcHVsYXRlIFBURXMgdGhhdApAQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIAlmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgJmFtcDtjYy0mZ3Q7YWxsb2Nfbm1hc2spOwogCWlmICghZm9saW8pIHsKIAkJKmZvbGlvcCA9IE5VTEw7Ci0JCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7Ci0JCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiYjNDM7CQljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCwKJiM0MzsJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiAJCXJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMOwogCX0KIAotCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQljb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpOwotCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTsKJiM0MzsJY291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTsKIAogCWlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7CiAJCWZvbGlvX3B1dChmb2xpbyk7CkBAIC0xMzMxLDggJiM0MzsxNDI4LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAltbWFwX3JlYWRfdW5sb2NrKG1tKTsKIAkvKgogCSAqIFByZXZlbnQgYWxsIGFjY2VzcyB0byBwYWdldGFibGVzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgotCSAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTQotCSAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgUEdfbG9jay4KJiM0MzsJICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcG1kcF9jb2xsYXBzZV9mbHVzaCBhbmQgdGhlIFZNCiYjNDM7CSAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgZm9saW8gbG9jay4KIAkgKgogCSAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZQogCSAqIG1tYXBfbG9jay4KQEAgLTE0MzksNyAmIzQzOzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCQkJc3Bpbl9sb2NrX25lc3RlZChwdGVfcHRsLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7CiAJCW1hcF9hbm9uX2ZvbGlvX3B0ZV9ub3BmKGZvbGlvLCBwdGUsIHZtYSwgc3RhcnRfYWRkciwKLQkJCQkJICAvKnVmZmRfd3A9Ki8gZmFsc2UpOwomIzQzOwkJCQkJICAvKnVmZmQ9Ki8gZmFsc2UpOwogCQlpZiAocHRlX3B0bCAhPSBwbWRfcHRsKQogCQkJc3Bpbl91bmxvY2socHRlX3B0bCk7CiAJfQpAQCAtMTQ0OSwxMCAmIzQzOzE1NDYsMTAgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAogCXJlc3VsdCA9IFNDQU5fU1VDQ0VFRDsKIG91dF91cF93cml0ZToKLQlpZiAoYW5vbl92bWFfbG9ja2VkKQotCQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLSZndDthbm9uX3ZtYSk7CiAJaWYgKHB0ZSkKIAkJcHRlX3VubWFwKHB0ZSk7CiYjNDM7CWlmIChhbm9uX3ZtYV9sb2NrZWQpCiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLSZndDthbm9uX3ZtYSk7CiAJbW1hcF93cml0ZV91bmxvY2sobW0pOwogb3V0X25vbG9jazoKIAlpZiAoZm9saW8pCkBAIC0xNTkzLDQyICYjNDM7MTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwKIAkJYm9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7Ci0JdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7CiAJZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7CiAJaW50IGk7Ci0JaW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwOwotCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDsKJiM0MzsJaW50IHJlZmVyZW5jZWQgPSAwOwomIzQzOwllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVyczsKIAlzcGlubG9ja190ICpwdGw7Ci0JaW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDsKJiM0MzsJaW50IG5vZGUgPSBOVU1BX05PX05PREU7CiYjNDM7CWVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7CiAKIAlWTV9CVUdfT04oc3RhcnRfYWRkciAmYW1wOyB+SFBBR0VfUE1EX01BU0spOwogCiYjNDM7CXN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7CiYjNDM7CQkuY2MgPSBjYywKJiM0MzsJCS52bWEgPSB2bWEsCiYjNDM7CQkub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsCiYjNDM7CQkubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJCS5tYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJCS5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksCiYjNDM7CX07CiYjNDM7CiAJcmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsICZhbXA7cG1kKTsKIAlpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkgewogCQljYy0mZ3Q7cHJvZ3Jlc3MmIzQzOyYjNDM7OwogCQlnb3RvIG91dDsKIAl9CiAKLQliaXRtYXBfemVybyhjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpOwotCW1lbXNldChjYy0mZ3Q7bm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtJmd0O25vZGVfbG9hZCkpOwotCW5vZGVzX2NsZWFyKGNjLSZndDthbGxvY19ubWFzayk7CiYjNDM7CWNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTsKIAogCWVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLSZndDt2bV9mbGFncywgdHZhX2ZsYWdzKTsKIAogCS8qCiAJICogSWYgUE1EIGlzIHRoZSBvbmx5IGVuYWJsZWQgb3JkZXIsIGVuZm9yY2UgbWF4X3B0ZXNfbm9uZSwgb3RoZXJ3aXNlCi0JICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4KJiM0MzsJICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcAomIzQzOwkgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci4KIAkgKi8KIAlpZiAoZW5hYmxlZF9vcmRlcnMgIT0gQklUKEhQQUdFX1BNRF9PUkRFUikpCi0JCW1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUOwomIzQzOwkJY3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUOwogCiAJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCAmYW1wO3B0bCk7CiAJaWYgKCFwdGUpIHsKQEAgLTE2NDQsODQgJiM0MzsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCiAJCWNjLSZndDtwcm9ncmVzcyYjNDM7JiM0Mzs7CiAKLQkJaWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gJmd0OyBtYXhfcHRlc19ub25lKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7Ci0JCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLAotCQkJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mzt1bm1hcHBlZCAmZ3Q7IG1heF9wdGVzX3N3YXApIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJLyoKLQkJCSAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwCi0JCQkgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWUKLQkJCSAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuCi0JCQkgKi8KLQkJCWlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHsKLQkJCS8qCi0JCQkgKiBEb24mIzM5O3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbAotCQkJICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uCi0JCQkgKiBIZXJlIHdlIGNhbiBhbHNvIG1hcmsgdGhlIG5ldyBodWdlIHBtZCBhcwotCQkJICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpcwotCQkJICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd24KLQkJCSAqIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGxzIG91dHNpZGUgb2YKLQkJCSAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLgotCQkJICovCi0JCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQotCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpOwotCQlpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDsKLQkJCWdvdG8gb3V0X3VubWFwOwotCQl9Ci0JCWZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCi0JCSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7ICEodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9EUk9QUEFCTEUpICZhbXA7JmFtcDsKLQkJICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7CiYjNDM7CQlwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCAmYW1wO2N0eCk7CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7CiYjNDM7CQkJcmVzdWx0ID0gY3R4LnJlc3VsdDsKIAkJCWdvdG8gb3V0X3VubWFwOwogCQl9Ci0KLQkJaWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfQU5PTjsKLQkJCWdvdG8gb3V0X3VubWFwOwotCQl9Ci0KLQkJLyoKLQkJICogV2UgdHJlYXQgYSBzaW5nbGUgcGFnZSBhcyBzaGFyZWQgaWYgYW55IHBhcnQgb2YgdGhlIFRIUAotCQkgKiBpcyBzaGFyZWQuCi0JCSAqLwotCQlpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHsKLQkJCWlmICgmIzQzOyYjNDM7c2hhcmVkICZndDsgbWF4X3B0ZXNfc2hhcmVkKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUiwKLQkJCQkJCU1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTsKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJCX0KLQkJfQomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlmb2xpbyA9IGN0eC5mb2xpbzsKIAogCQkvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqLwogCQlfX3NldF9iaXQoaSwgY2MtJmd0O210aHBfcHJlc2VudF9wdGVzKTsKQEAgLTE3NDksMzEgJiM0MzsxNzgxLDIxIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkvKgogCQkgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuCiAJCSAqCi0JCSAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5OgotCQkgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgJmd0OyBmb2xpb19yZWZfY291bnQoKS4KLQkJICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlCi0JCSAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlCi0JCSAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVjawotCQkgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LgomIzQzOwkJICogSGVyZSB0aGUgY2hlY2sgaXMgcmFjeSwgYnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgYW5kCiYjNDM7CQkgKiB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UgbGF0ZXIuIEFueXdheSB0aGUgc2FtZQomIzQzOwkJICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy4KIAkJICovCiAJCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHsKIAkJCXJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDsKIAkJCWdvdG8gb3V0X3VubWFwOwogCQl9CiAKLQkJLyoKLQkJICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzCi0JCSAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlCi0JCSAqLwotCQlpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOwotCQkgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8Ci0JCSAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fAotCQkgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKSkKJiM0MzsJCWlmIChjb2xsYXBzZV9pc19yZWZlcmVuY2VkKGNjLCBwdGV2YWwsIGZvbGlvLCB2bWEsIGFkZHIpKQogCQkJcmVmZXJlbmNlZCYjNDM7JiM0Mzs7CiAJfQogCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiAJCSAgICghcmVmZXJlbmNlZCB8fAotCQkgICAgKHVubWFwcGVkICZhbXA7JmFtcDsgcmVmZXJlbmNlZCAmbHQ7IEhQQUdFX1BNRF9OUiAvIDIpKSkgewomIzQzOwkJICAgIChjdHgudW5tYXBwZWQgJmFtcDsmYW1wOyByZWZlcmVuY2VkICZsdDsgSFBBR0VfUE1EX05SIC8gMikpKSB7CiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwpAQCAtMTc4NCwxMyAmIzQzOzE4MDYsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCS8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi8KIAkJbW1hcF9yZWFkX3VubG9jayhtbSk7CiAJCXJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsCi0JCQkJICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpOwomIzQzOwkJCQkgICAgICAgY3R4LnVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpOwogCQkvKiBtbWFwX2xvY2sgd2FzIHJlbGVhc2VkIGFib3ZlLCBzZXQgbG9ja19kcm9wcGVkICovCiAJCSpsb2NrX2Ryb3BwZWQgPSB0cnVlOwogCX0KIG91dDoKIAl0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCwKLQkJCQkgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7CiYjNDM7CQkJCSAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI2OTEsOCAmIzQzOzI3MTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAlwcmVzZW50ID0gMDsKIAlzd2FwID0gMDsKLQltZW1zZXQoY2MtJmd0O25vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLSZndDtub2RlX2xvYWQpKTsKLQlub2Rlc19jbGVhcihjYy0mZ3Q7YWxsb2Nfbm1hc2spOwomIzQzOwljb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7CiAJcmN1X3JlYWRfbG9jaygpOwogCXhhc19mb3JfZWFjaCgmYW1wO3hhcywgZm9saW8sIHN0YXJ0ICYjNDM7IEhQQUdFX1BNRF9OUiAtIDEpIHsKIAkJaWYgKHhhc19yZXRyeSgmYW1wO3hhcywgZm9saW8pKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDA4MAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDQ2MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtodWdlcGFnZWQgUFRFIENoZWNraW5nIFJlZmFjdG9yKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQgdG91Y2hlcyBgbW0va2h1Z2VwYWdlZC5jYCBhbmQgYERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdGAuIEltbWVkaWF0ZWx5LCBJIHNlZSBpdCYjMzk7cyBpbnRyb2R1Y2luZyBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB3aGljaCBpbmRpY2F0ZXMgYSByZWZhY3RvcmluZyBvZiB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIHdpdGhpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBJdCBhbHNvIGJyaW5ncyBpbiBgY29sbGFwc2VfaXNfcmVmZXJlbmNlZCgpYCBhbmQgYGNvdW50X2NvbGxhcHNlX2V2ZW50KClgLiBUaGlzIGlzIGFsbCBjbGVhcmx5IGZvY3VzZWQgb24gY2xlYW5pbmcgdXAgYW5kIHBvdGVudGlhbGx5IG9wdGltaXppbmcgdGhlIGtodWdlcGFnZWQgY29tcG9uZW50LCBwYXJ0aWN1bGFybHkgdGhhdCBjcnVjaWFsIFBURSB2YWxpZGF0aW9uLgoKR2l2ZW4gdGhhdCBgbW0va2h1Z2VwYWdlZC5jYCBkZWFscyB3aXRoIGNvcmUga2VybmVsIGZ1bmN0aW9uYWxpdHkg4oCTIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkg4oCTIGFuZCBUSFAgaXMgYSBmYWlybHkgc3RhbmRhcmQgZmVhdHVyZSB3aXRoIGtodWdlcGFnZWQgY29uc3RhbnRseSBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLCBJIG5lZWQgdG8gdHJlYXQgdGhpcyBjaGFuZ2Ugd2l0aCBjb25zaWRlcmFibGUgY2FyZS4gSXQmIzM5O3MgZGVmaW5pdGVseSByZWFjaGFibGUuCgpMZXQmIzM5O3MgYnJlYWsgZG93biB0aGUgc3BlY2lmaWMgZnVuY3Rpb24gY2hhbmdlcy4gSSYjMzk7bSBzZWVpbmcgbW9kaWZpY2F0aW9ucyB0bzoKKiAgIGBfX2todWdlcGFnZWRfZXhpdGAgKGNvbW1lbnQgY2hhbmdlKQoqICAgYGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuYCAobmV3KQoqICAgYGNvbGxhcHNlX2lzX3JlZmVyZW5jZWRgIChuZXcpCiogICBgY291bnRfY29sbGFwc2VfZXZlbnRgIChuZXcpCiogICBgcHRlX2NoZWNrX2ZhaWxgIChuZXcpCiogICBgY29sbGFwc2VfY2hlY2tfcHRlYCAobmV3KQoqICAgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIChtb2RpZmllZCkKKiAgIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAgKGNvbW1lbnQgY2hhbmdlKQoqICAgYGFsbG9jX2NoYXJnZV9mb2xpb2AgKG1vZGlmaWVkKQoqICAgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgKG1vZGlmaWVkKQoqICAgYGNvbGxhcHNlX3NjYW5fcG1kYCAobW9kaWZpZWQpCiogICBgY29sbGFwc2Vfc2Nhbl9maWxlYCAobW9kaWZpZWQpCgpUaGUgbW9kaWZpZWQgZnVuY3Rpb25zIGFyZSB0aGUgb25lcyB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBoaWdoZXN0IHNjcnV0aW55LiBJJiMzOTttIGZvY3VzaW5nIG9uIGZ1enppbmcgdGhlc2UgYXJlYXM6IGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCwgYGNvbGxhcHNlX3NjYW5fcG1kYCwgYGNvbGxhcHNlX3NjYW5fZmlsZWAsIGFuZCBgY29sbGFwc2VfaHVnZV9wYWdlYC4KCkZyb20gYSBjb25maWd1cmF0aW9uIHBlcnNwZWN0aXZlLCBJJiMzOTtsbCBkZWZpbml0ZWx5IGJlIGVuYWJsaW5nIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGFuZCBwcm9iYWJseSBsZWFuaW5nIHRvd2FyZCBlaXRoZXIgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VgIG9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIHRvIGZ1bGx5IGV4ZXJjaXNlIHRoZSBjaGFuZ2VzIGR1cmluZyB0ZXN0aW5nLgoKTm93LCBsZXQmIzM5O3MgaGF2ZSBhIGxvb2sgYXQgdGhlIEtjb25maWcgZmlsZSB0byBjb25maXJtIHNvbWUgYXNzdW1wdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2h1Z2VwYWdlZFxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZV9kZXZpY2Uub1xubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgJiM0Mzs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEyMDcKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipLZXJuZWwgQ29uZmlndXJhdGlvbiBDb25zaWRlcmF0aW9ucyoqCgpBbHJpZ2h0LCBzbyB0aGUgaW1tZWRpYXRlIG5lZWQgaXMgZGVmaW5pdGVseSBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gVGhhdCBtdWNoIGlzIGNsZWFyLiBCdXQgYXMgd2UmIzM5O3JlIGRpZ2dpbmcgaW50byB0aGlzLCBJIGtub3cgd2UgY2FuJiMzOTt0IHN0b3AgdGhlcmUuIE15IGludGVybmFsIGNoZWNrbGlzdCBpbW1lZGlhdGVseSBqdW1wcyB0bzogd2hhdCBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWlnaHQgYmUgcmVsZXZhbnQgb3IgaW1wYWN0ZWQ/IFRoaXMgc2l0dWF0aW9uIGlzIHJhcmVseSBpc29sYXRlZC4gSSBuZWVkIHRvIHF1aWNrbHkgaWRlbnRpZnkgYW55IGRlcGVuZGVuY2llcywgY29uZmxpY3RzLCBvciBjb21wbGVtZW50YXJ5IGZlYXR1cmVzIHRoYXQgSSBzaG91bGQgYmUgYXdhcmUgb2YgYW5kIGNoZWNrIG91dCB0byBtYWtlIHN1cmUgbXkgZmluYWwgY29uZmlnIGlzIHNldCB1cCBvcHRpbWFsbHkuIFdlIGFsbCBrbm93IGhvdyBlYXN5IGl0IGlzIHRvIG1pc3Mgc29tZXRoaW5nIGFuZCBlbmQgdXAgd2l0aCBhIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2sgb3IsIHdvcnNlLCBpbnN0YWJpbGl0eS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGNvbmZpZyBtZXNoZXMgd2VsbCB3aXRoIGFueSBleGlzdGluZyBhbmQvb3IgZnV0dXJlIHBsYW5zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgzNT1jb25maWcgTU1fSURcbi0tXG5tbS9LY29uZmlnLTgzNy1cbm1tL0tjb25maWc6ODM4Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODM5LVx0Ym9vbCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04NTY9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04NjEtXG5tbS9LY29uZmlnOjg2MjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcbm1tL0tjb25maWctODYzLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctODY4LVxubW0vS2NvbmZpZzo4Njk6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxubW0vS2NvbmZpZy04NzAtXHRcdGJvb2wgXCYjMzQ7bWFkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWctODc3LVxubW0vS2NvbmZpZzo4Nzg6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcbm1tL0tjb25maWctODc5LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04ODU9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04OTQtXG5tbS9LY29uZmlnOjg5NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXG5tbS9LY29uZmlnLTg5Ni1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTA0LVxubW0vS2NvbmZpZzo5MDU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTA2LVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTEyLVxubW0vS2NvbmZpZzo5MTM6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05MTQtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkyMC1cbm1tL0tjb25maWc6OTIxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTkyMi1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTkzMD1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTkzOS1cbm1tL0tjb25maWc6OTQwOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTQxLVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NDgtXG5tbS9LY29uZmlnOjk0OTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05NTAtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NTYtXG5tbS9LY29uZmlnOjk1NzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTk1OC1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTY0LVxubW0vS2NvbmZpZzo5NjU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTY2LVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMTQwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBIdWdlIFBhZ2UgQ29sbGFwc2UgT3B0aW1pemF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gdGhpbmtpbmcgSSBuZWVkIHRvIGFkZCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTYCB0byB0aGUgYEVuYWJsZUNvbmZpZ3NgLiBUaGF0IHNlZW1zIGxpa2UgdGhlIHJpZ2h0IG1vdmUsIGdpdmVuIHdoYXQgSSYjMzk7bSB0cnlpbmcgdG8gYWNoaWV2ZS4KCk5vdywgbGV0JiMzOTtzIGp1c3QgbWFrZSBzdXJlIEkmIzM5O3ZlIGdvdCBteSBoZWFkIGFyb3VuZCB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGFmZmVjdGVkIGJ5IHRoZXNlIGNoYW5nZXMuIEkmIzM5O3ZlIGdvdDogYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLCBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgY29sbGFwc2Vfc2Nhbl9maWxlYCwgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLgoKUmlnaHQsIGFsbCBvZiB0aG9zZSBhcmUgZWl0aGVyIHN0YXRpYyBvciBwYXJ0IG9mIGBraHVnZXBhZ2VkYC4gT2theSwgYXJlIGFueSBvZiB0aGVzZSBpbiBhIGhvdCBwYXRoPyBJIGhhdmUgdG8gY29uc2lkZXIgdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4gYGNvbGxhcHNlX3NjYW5fcG1kYCBpcyBjYWxsZWQgYnkgYGtodWdlcGFnZWRgLCBhIGJhY2tncm91bmQgdGhyZWFkLCBzbyBpdCYjMzk7cyBub3QgYSBkaXJlY3Qgc3lzY2FsbCBob3RwYXRoLCBidXQgaXQgKmRvZXMqIHNjYW4gbWVtb3J5LCB3aGljaCBpcyBpbXBvcnRhbnQuIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGlzIGFsc28gY2FsbGVkIGJ5IGBraHVnZXBhZ2VkYC4gQW5kIHRoZW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGlzIGNhbGxlZCBieSBib3RoIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGFuZCBgbWFkdmlzZV9jb2xsYXBzZWAuIE5lZWQgdG8gY2hlY2sgYG1hZHZpc2VfY29sbGFwc2VgLiBUaGF0JiMzOTtzIGEgY3JpdGljYWwgcGF0aCwgc28gbXVzdCB0YWtlIGNhcmUgdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9NzQ3PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtODEyLVxubW0va2h1Z2VwYWdlZC5jOjgxMzpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0va2h1Z2VwYWdlZC5jLTgxNC1cdFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTk5Nj1zdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDEzLVx0ICogUmVsZWFzZSBib3RoIHJhdyBhbmQgY29tcG91bmQgcGFnZXMgaXNvbGF0ZWRcbm1tL2todWdlcGFnZWQuYzoxMDE0Olx0ICogaW4gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZS5cbm1tL2todWdlcGFnZWQuYy0xMDE1LVx0ICovXG4tLVxubW0va2h1Z2VwYWdlZC5jPTEzNzY9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE0NzctXHRpZiAocHRlKSB7XG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcdFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSh2bWEsIHN0YXJ0X2FkZHIsIHB0ZSwgY2MsXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cdFx0XHRcdFx0XHQgICAgICBvcmRlciwgXHUwMDI2Y29tcG91bmRfcGFnZWxpc3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMDE0CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhlIGV4cGVydDoKCioqVHJhY2luZyB0aGUgSHVnZSBQYWdlIENvbGxhcHNlKioKCk9rYXksIHNvIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaXMgdGhlIHJlYWwgd29ya2hvcnNlIGhlcmUsIGNhbGxlZCBieSBgY29sbGFwc2VfaHVnZV9wYWdlYC4gUmlnaHQsIHRoYXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3cgdGhlIHF1ZXN0aW9uIGlzLCB3aGF0IHRyaWdnZXJzIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGl0c2VsZj8gSXQgbG9va3MgbGlrZSB0aGUgdHdvIHByaW1hcnkgcGF0aHMgYXJlIGBraHVnZXBhZ2VkX3NjYW5fcG1kYCDigJMgdGhlIGtlcm5lbCYjMzk7cyBodWdlIHBhZ2UgbWFuYWdlbWVudCBkYWVtb24g4oCTIGFuZCBwb3RlbnRpYWxseSBgbWFkdmlzZV9jb2xsYXBzZWAgd2hpY2ggaXMgcmVsYXRlZCB0byB1c2Vyc3BhY2UgcGFnZSBhZHZpc29yeS4gSSBuZWVkIHRvIGNvbmZpcm0gdGhhdC4gVGhlcmVmb3JlLCBJIHNob3VsZCBzdGFydCBieSBkaWdnaW5nIGludG8gdGhlIGNhbGxpbmcgY29udGV4dHMgb2YgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgZGlyZWN0bHkuIFRoYXQmIzM5O2xsIGdpdmUgbWUgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHRoZXNlIGh1Z2UgcGFnZXMgYXJlIGJlaW5nIHRhcmdldGVkIGZvciBjb2xsYXBzZS4gVGltZSB0byBkaXZlIGludG8gdGhlIHNvdXJjZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29sbGFwc2VfaHVnZV9wYWdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz03NDc9c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLFxuLS1cbm1tL2todWdlcGFnZWQuYy04MTItXG5tbS9raHVnZXBhZ2VkLmM6ODEzOnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9raHVnZXBhZ2VkLmMtODE0LVx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtOTIwLVx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG5tbS9raHVnZXBhZ2VkLmM6OTIxOlx0XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbm1tL2todWdlcGFnZWQuYy05MjItXHRcdFx0XHRcdFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xuLS1cbm1tL2todWdlcGFnZWQuYy05MjYtXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbm1tL2todWdlcGFnZWQuYzo5Mjc6XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbm1tL2todWdlcGFnZWQuYy05MjgtXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtOTMxLVxubW0va2h1Z2VwYWdlZC5jOjkzMjpzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X3N1Y2NlZWRlZChwdGVfdCAqcHRlLFxubW0va2h1Z2VwYWdlZC5jLTkzMy1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtOTk1LVxubW0va2h1Z2VwYWdlZC5jOjk5NjpzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxubW0va2h1Z2VwYWdlZC5jLTk5Ny1cdFx0cG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDEzLVx0ICogUmVsZWFzZSBib3RoIHJhdyBhbmQgY29tcG91bmQgcGFnZXMgaXNvbGF0ZWRcbm1tL2todWdlcGFnZWQuYzoxMDE0Olx0ICogaW4gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZS5cbm1tL2todWdlcGFnZWQuYy0xMDE1LVx0ICovXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwMTktLypcbm1tL2todWdlcGFnZWQuYzoxMDIwOiAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHkgLSBhdHRlbXB0cyB0byBjb3B5IG1lbW9yeSBjb250ZW50cyBmcm9tIHJhd1xubW0va2h1Z2VwYWdlZC5jLTEwMjEtICogcGFnZXMgdG8gYSBodWdlcGFnZS4gQ2xlYW5zIHVwIHRoZSByYXcgcGFnZXMgaWYgY29weWluZyBzdWNjZWVkcztcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTAzMy0gKi9cbm1tL2todWdlcGFnZWQuYzoxMDM0OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHkocHRlX3QgKnB0ZSwgc3RydWN0IGZvbGlvICpmb2xpbyxcbm1tL2todWdlcGFnZWQuYy0xMDM1LVx0XHRwbWRfdCAqcG1kLCBwbWRfdCBvcmlnX3BtZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwNjMtXHRpZiAobGlrZWx5KHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpKVxubW0va2h1Z2VwYWdlZC5jOjEwNjQ6XHRcdF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfc3VjY2VlZGVkKHB0ZSwgdm1hLCBhZGRyZXNzLCBwdGwsXG5tbS9raHVnZXBhZ2VkLmMtMTA2NS1cdFx0XHRcdFx0XHQgICAgb3JkZXIsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbm1tL2todWdlcGFnZWQuYy0xMDY2LVx0ZWxzZVxubW0va2h1Z2VwYWdlZC5jOjEwNjc6XHRcdF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZSwgcG1kLCBvcmlnX3BtZCwgdm1hLFxubW0va2h1Z2VwYWdlZC5jLTEwNjgtXHRcdFx0XHRcdFx0IG9yZGVyLCBjb21wb3VuZF9wYWdlbGlzdCk7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTEyMjQ9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY2hlY2tfcG1kX3N0aWxsX3ZhbGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMjQ3LSAqL1xubW0va2h1Z2VwYWdlZC5jOjEyNDg6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxubW0va2h1Z2VwYWdlZC5jLTEyNDktXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEzMzMtb3V0OlxubW0va2h1Z2VwYWdlZC5jOjEzMzQ6XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCByZXN1bHQsXG5tbS9raHVnZXBhZ2VkLmMtMTMzNS1cdFx0XHRcdFx0ICAgb3JkZXIpO1xuLS1cbm1tL2todWdlcGFnZWQuYz0xMzM5PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMzcwLS8qXG5tbS9raHVnZXBhZ2VkLmM6MTM3MTogKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcbm1tL2todWdlcGFnZWQuYy0xMzcyLSAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2tcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTM3NS0gKi9cbm1tL2todWdlcGFnZWQuYzoxMzc2OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxubW0va2h1Z2VwYWdlZC5jLTEzNzctXHRcdGludCByZWZlcmVuY2VkLCBpbnQgdW5tYXBwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTQxNy1cdFx0Lypcbm1tL2todWdlcGFnZWQuYzoxNDE4Olx0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcbm1tL2todWdlcGFnZWQuYy0xNDE5LVx0XHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTQyMS1cdFx0ICovXG5tbS9raHVnZXBhZ2VkLmM6MTQyMjpcdFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCB2bWEsIHN0YXJ0X2FkZHIsIHBtZCxcbm1tL2todWdlcGFnZWQuYy0xNDIzLVx0XHRcdFx0XHRcdCAgICAgcmVmZXJlbmNlZCwgb3JkZXIpO1xuLS1cbm1tL2todWdlcGFnZWQuYy0xNDc3LVx0aWYgKHB0ZSkge1xubW0va2h1Z2VwYWdlZC5jOjE0Nzg6XHRcdHJlc3VsdCA9IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUodm1hLCBzdGFydF9hZGRyLCBwdGUsIGNjLFxubW0va2h1Z2VwYWdlZC5jLTE0NzktXHRcdFx0XHRcdFx0ICAgICAgb3JkZXIsIFx1MDAyNmNvbXBvdW5kX3BhZ2VsaXN0KTtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTUwOS1cbm1tL2todWdlcGFnZWQuYzoxNTEwOlx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weShwdGUsIGZvbGlvLCBwbWQsIF9wbWQsXG5tbS9raHVnZXBhZ2VkLmMtMTUxMS1cdFx0XHRcdFx0ICAgdm1hLCBzdGFydF9hZGRyLCBwdGVfcHRsLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xNTU2LVx0XHRmb2xpb19wdXQoZm9saW8pO1xubW0va2h1Z2VwYWdlZC5jOjE1NTc6XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2UobW0sIHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQsIHJlc3VsdCwgb3JkZXIpO1xubW0va2h1Z2VwYWdlZC5jLTE1NTgtXHRyZXR1cm4gcmVzdWx0O1xuLS1cbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE2MjAtXHRcdFx0Y29sbGFwc2VfYWRkcmVzcyA9IGFkZHJlc3MgJiM0Mzsgb2Zmc2V0ICogUEFHRV9TSVpFO1xubW0va2h1Z2VwYWdlZC5jOjE2MjE6XHRcdFx0cmV0ID0gY29sbGFwc2VfaHVnZV9wYWdlKG1tLCBjb2xsYXBzZV9hZGRyZXNzLCByZWZlcmVuY2VkLFxubW0va2h1Z2VwYWdlZC5jLTE2MjItXHRcdFx0XHRcdFx0IHVubWFwcGVkLCBjYywgb3JkZXIpO1xuLS1cbm1tL2todWdlcGFnZWQuYz0xNjg5PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xODA1LVx0aWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHtcbm1tL2todWdlcGFnZWQuYzoxODA2Olx0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG5tbS9raHVnZXBhZ2VkLmMtMTgwNy1cdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1MjczCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogNTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0JiMzOTtzIHBlcnNwZWN0aXZlOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBgY29sbGFwc2VfaHVnZV9wYWdlYCBDYWxsIENoYWluKioKClJpZ2h0LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUgYW5kIHRyeWluZyB0byB0cmFjZSB0aGUgZXhlY3V0aW9uIHBhdGguIEkgc2VlIHRoYXQgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgaXMgYmVpbmcgaW52b2tlZCBieSBgbXRocF9jb2xsYXBzZWAsIGFuZCB0aGF0IGluIHR1cm4gaXMgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zY2FuX3BtZGAuIFRoYXQmIzM5O3MgYSBwcmV0dHkgY2xlYXIgY2hhaW4sIGVhc3kgZW5vdWdoIHRvIGZvbGxvdy4gTm93LCB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoZXRoZXIgb3Igbm90IGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhbHNvIGNhbGxpbmcgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIEkgbmVlZCB0byBjb25maXJtIGlmIGl0IGhhcyBpdHMgb3duIHBhdGggdG8gaXQsIG9yIGlmIGl0IGlzIHJlbGlhbnQgb24gdGhpcyBleGlzdGluZyBwYXRoLiBJIHdhbnQgdG8gZG91YmxlLWNoZWNrIHRoYXQ7IHRoZXJlIGNvdWxkIGJlIHNvbWUgYXNzdW1wdGlvbnMgYmVpbmcgbWFkZSB0aGF0IGFyZW4mIzM5O3QgcXVpdGUgY29ycmVjdCwgb3IgbWF5YmUgc29tZSB1bmV4cGVjdGVkIGJlaGF2aW9yIGVtZXJnaW5nIGZyb20gdGhpcyBwYXJ0aWN1bGFyIGNhbGwuIEkgYmV0dGVyIGdvIGFuZCBjaGVjayB0aGUgY3Jvc3MtcmVmZXJlbmNlcyBmb3IgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgdG8gc2VlIGlmIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBpbmRlZWQgY2FsbGluZyBpdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiBJdCYjMzk7cyBhIGZ1bmRhbWVudGFsIHBhcnQgb2YgdGhlIG92ZXJhbGwgZmxvdyBmb3IgbWFuYWdpbmcgaHVnZSBwYWdlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MzE3ND1ib29sIGN1cnJlbnRfaXNfa2h1Z2VwYWdlZCh2b2lkKVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMTc4LVxubW0va2h1Z2VwYWdlZC5jOjMxNzk6c3RhdGljIGludCBtYWR2aXNlX2NvbGxhcHNlX2Vycm5vKGVudW0gc2Nhbl9yZXN1bHQgcilcbm1tL2todWdlcGFnZWQuYy0zMTgwLXtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzIxMC1cbm1tL2todWdlcGFnZWQuYzozMjExOmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxubW0va2h1Z2VwYWdlZC5jLTMyMTItXHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzI5OC1cdHJldHVybiB0aHBzID09ICgoaGVuZCAtIGhzdGFydCkgXHUwMDNlXHUwMDNlIEhQQUdFX1BNRF9TSElGVCkgPyAwXG5tbS9raHVnZXBhZ2VkLmM6MzI5OTpcdFx0XHQ6IG1hZHZpc2VfY29sbGFwc2VfZXJybm8obGFzdF9mYWlsKTtcbm1tL2todWdlcGFnZWQuYy0zMzAwLX1cbi0tXG5tbS9tYWR2aXNlLmM9MTMzOD1zdGF0aWMgaW50IG1hZHZpc2Vfdm1hX2JlaGF2aW9yKHN0cnVjdCBtYWR2aXNlX2JlaGF2aW9yICptYWR2X2JlaGF2aW9yKVxuLS1cbm1tL21hZHZpc2UuYy0xMzYyLVx0Y2FzZSBNQURWX0NPTExBUFNFOlxubW0vbWFkdmlzZS5jOjEzNjM6XHRcdHJldHVybiBtYWR2aXNlX2NvbGxhcHNlKHZtYSwgcmFuZ2UtXHUwMDNlc3RhcnQsIHJhbmdlLVx1MDAzZWVuZCxcbm1tL21hZHZpc2UuYy0xMzY0LVx0XHRcdFx1MDAyNm1hZHZfYmVoYXZpb3ItXHUwMDNlbG9ja19kcm9wcGVkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU5NjkKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA1OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipJbml0aWFsIEFzc2Vzc21lbnQ6IE1BRFZfQ09MTEFQU0UgaXMgYSBUYXJnZXQqKgoKQWxyaWdodCwgc28gYG1hZHZpc2VfY29sbGFwc2VgIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgYG1hZHZpc2VgIHdpdGggdGhlIGBNQURWX0NPTExBUFNFYCBmbGFnLiBUaGF0IG1ha2VzIGl0IGltbWVkaWF0ZWx5IGludGVyZXN0aW5nIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLiBJdCYjMzk7cyBjb3JlIGtlcm5lbCBjb2RlLCBkaXJlY3RseSBhZGRyZXNzYWJsZSwgYW5kIHJpcGUgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5IGRpc2NvdmVyeS4gQSBzdHJhaWdodGZvcndhcmQgcm91dGUgdG8gcmVhY2ggaXQuIEdvb2QuCgpOb3csIG15IG5leHQgc3RlcCBpcyBjbGVhcjogSSBuZWVkIHRvIGRlbHZlIGludG8gdGhlIGBtYWR2aXNlX2NvbGxhcHNlYCBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHRyYWNlIHRoZSBjb2RlIHBhdGgsIGlkZW50aWZ5IHRoZSBmdW5jdGlvbnMgaXQgY2FsbHMsIGFuZCB1bmRlcnN0YW5kIGl0cyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBLbm93aW5nIHdoYXQgaXQgdG91Y2hlcyBpcyBrZXkgdG8gY29uc3RydWN0aW5nIGVmZmVjdGl2ZSBmdXp6aW5nIHN0cmF0ZWdpZXMuIEdvdHRhIHVuZGVyc3RhbmQgdGhlIGVjb3N5c3RlbSB0aGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGhpbi4gRnJvbSB0aGVyZSwgSSBjYW4gZmlndXJlIG91dCB3aGF0IHBhcnRzIG9mIHRoZSBzeXN0ZW0gYXJlIG1vc3QgbGlrZWx5IHRvIGZhaWwgdW5kZXIgc3RyZXNzZnVsIGFuZCB1bmV4cGVjdGVkIGlucHV0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz0zMTc0PWJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMxNzgtXG5tbS9raHVnZXBhZ2VkLmM6MzE3OTpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxubW0va2h1Z2VwYWdlZC5jLTMxODAte1xuLS1cbm1tL2todWdlcGFnZWQuYy0zMjEwLVxubW0va2h1Z2VwYWdlZC5jOjMyMTE6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG5tbS9raHVnZXBhZ2VkLmMtMzIxMi1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMjk4LVx0cmV0dXJuIHRocHMgPT0gKChoZW5kIC0gaHN0YXJ0KSBcdTAwM2VcdTAwM2UgSFBBR0VfUE1EX1NISUZUKSA/IDBcbm1tL2todWdlcGFnZWQuYzozMjk5Olx0XHRcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xubW0va2h1Z2VwYWdlZC5jLTMzMDAtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjUyMwoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgYG1hZHZpc2VfY29sbGFwc2VgJiMzOTtzIERlcGVuZGVuY3kgb24gSHVnZSBQYWdlIENvbGxhcHNlIE1lY2hhbmlzbXMqKgoKQWxyaWdodCwgSSYjMzk7bSBkaXZpbmcgaW50byB0aGUgYG1hZHZpc2VfY29sbGFwc2VgIGZ1bmN0aW9uLiBNeSBwcmltYXJ5IGZvY3VzIHJpZ2h0IG5vdyBpcyBwaW5wb2ludGluZyBob3cgaXQgaGFuZGxlcyBodWdlIHBhZ2UgY29sbGFwc2VzLiBUaGUgcXVlc3Rpb24gaXMsIGRvZXMgYG1hZHZpc2VfY29sbGFwc2VgIGRpcmVjdGx5IGxldmVyYWdlIGVpdGhlciBgY29sbGFwc2VfaHVnZV9wYWdlYCBvciBgY29sbGFwc2Vfc2Nhbl9wbWRgPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udHJvbCBmbG93IGhlcmUsIGJlY2F1c2UgdGhhdCB3aWxsIGRpcmVjdGx5IGFmZmVjdCBvdXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgdW5kZXJseWluZyBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneS4gU3BlY2lmaWNhbGx5LCBhcmUgd2UgbG9va2luZyBhdCBkaXJlY3QsIHRhcmdldGVkIGNvbGxhcHNlcyBvciBhIG1vcmUgc3dlZXBpbmcgc2Nhbi1iYXNlZCBhcHByb2FjaD8gTXkgZ29hbCBpcyB0byBxdWlja2x5IGFzY2VydGFpbiB3aGV0aGVyIGBtYWR2aXNlX2NvbGxhcHNlYCB0cmlnZ2VycyBlaXRoZXIgZnVuY3Rpb24sIGFuZCBpZiBzbywgaG93LiBUaGlzIGlzIGNyaXRpY2FsIGZvciB1bmRlcnN0YW5kaW5nIGl0cyBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbiB3aXRoIGV4aXN0aW5nIGh1Z2UgcGFnZSBjb25maWd1cmF0aW9ucy4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzIxMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MzIxMTpcdGludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxuMzIxMjpcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXG4zMjEzOlx0e1xuMzIxNDpcdFx0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xuMzIxNTpcdFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4zMjE2Olx0XHR1bnNpZ25lZCBsb25nIGhzdGFydCwgaGVuZCwgYWRkcjtcbjMyMTc6XHRcdGVudW0gc2Nhbl9yZXN1bHQgbGFzdF9mYWlsID0gU0NBTl9GQUlMO1xuMzIxODpcdFx0aW50IHRocHMgPSAwO1xuMzIxOTpcdFx0Ym9vbCBtbWFwX3VubG9ja2VkID0gZmFsc2U7XG4zMjIwOlx0XG4zMjIxOlx0XHRCVUdfT04odm1hLVx1MDAzZXZtX3N0YXJ0IFx1MDAzZSBzdGFydCk7XG4zMjIyOlx0XHRCVUdfT04odm1hLVx1MDAzZXZtX2VuZCBcdTAwM2MgZW5kKTtcbjMyMjM6XHRcbjMyMjQ6XHRcdGlmICghY29sbGFwc2VfcG9zc2libGUodm1hLCB2bWEtXHUwMDNldm1fZmxhZ3MsIFRWQV9GT1JDRURfQ09MTEFQU0UpKVxuMzIyNTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjMyMjY6XHRcbjMyMjc6XHRcdGhzdGFydCA9IEFMSUdOKHN0YXJ0LCBIUEFHRV9QTURfU0laRSk7XG4zMjI4Olx0XHRoZW5kID0gQUxJR05fRE9XTihlbmQsIEhQQUdFX1BNRF9TSVpFKTtcbjMyMjk6XHRcbjMyMzA6XHRcdGlmIChoc3RhcnQgXHUwMDNlPSBoZW5kKVxuMzIzMTpcdFx0XHRyZXR1cm4gMDtcbjMyMzI6XHRcbjMyMzM6XHRcdGNjID0ga21hbGxvY19vYmooKmNjKTtcbjMyMzQ6XHRcdGlmICghY2MpXG4zMjM1Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuMzIzNjpcdFx0Y2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA9IGZhbHNlO1xuMzIzNzpcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MgPSAwO1xuMzIzODpcdFxuMzIzOTpcdFx0bW1ncmFiKG1tKTtcbjMyNDA6XHRcdGxydV9hZGRfZHJhaW5fYWxsKCk7XG4zMjQxOlx0XG4zMjQyOlx0XHRmb3IgKGFkZHIgPSBoc3RhcnQ7IGFkZHIgXHUwMDNjIGhlbmQ7IGFkZHIgJiM0Mzs9IEhQQUdFX1BNRF9TSVpFKSB7XG4zMjQzOlx0XHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuMzI0NDpcdFxuMzI0NTpcdFx0XHRpZiAobW1hcF91bmxvY2tlZCkge1xuMzI0NjpcdFx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuMzI0NzpcdFx0XHRcdG1tYXBfcmVhZF9sb2NrKG1tKTtcbjMyNDg6XHRcdFx0XHRtbWFwX3VubG9ja2VkID0gZmFsc2U7XG4zMjQ5Olx0XHRcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4zMjUwOlx0XHRcdFx0cmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHIsIGZhbHNlLCBcdTAwMjZ2bWEsXG4zMjUxOlx0XHRcdFx0XHRcdFx0XHQgY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4zMjUyOlx0XHRcdFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcbjMyNTM6XHRcdFx0XHRcdGxhc3RfZmFpbCA9IHJlc3VsdDtcbjMyNTQ6XHRcdFx0XHRcdGdvdG8gb3V0X25vbG9jaztcbjMyNTU6XHRcdFx0XHR9XG4zMjU2Olx0XG4zMjU3Olx0XHRcdFx0aGVuZCA9IG1pbihoZW5kLCB2bWEtXHUwMDNldm1fZW5kIFx1MDAyNiBIUEFHRV9QTURfTUFTSyk7XG4zMjU4Olx0XHRcdH1cbjMyNTk6XHRcbjMyNjA6XHRcdFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFx1MDAyNm1tYXBfdW5sb2NrZWQsIGNjKTtcbjMyNjE6XHRcbjMyNjI6XHRcdFx0c3dpdGNoIChyZXN1bHQpIHtcbjMyNjM6XHRcdFx0Y2FzZSBTQ0FOX1NVQ0NFRUQ6XG4zMjY0Olx0XHRcdGNhc2UgU0NBTl9QTURfTUFQUEVEOlxuMzI2NTpcdFx0XHRcdCYjNDM7JiM0Mzt0aHBzO1xuMzI2NjpcdFx0XHRcdGJyZWFrO1xuMzI2NzpcdFx0XHQvKiBXaGl0ZWxpc3RlZCBzZXQgb2YgcmVzdWx0cyB3aGVyZSBjb250aW51aW5nIE9LICovXG4zMjY4Olx0XHRcdGNhc2UgU0NBTl9OT19QVEVfVEFCTEU6XG4zMjY5Olx0XHRcdGNhc2UgU0NBTl9QVEVfTk9OX1BSRVNFTlQ6XG4zMjcwOlx0XHRcdGNhc2UgU0NBTl9QVEVfVUZGRDpcbjMyNzE6XHRcdFx0Y2FzZSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFOlxuMzI3MjpcdFx0XHRjYXNlIFNDQU5fUEFHRV9OVUxMOlxuMzI3MzpcdFx0XHRjYXNlIFNDQU5fUEFHRV9DT1VOVDpcbjMyNzQ6XHRcdFx0Y2FzZSBTQ0FOX1BBR0VfTE9DSzpcbjMyNzU6XHRcdFx0Y2FzZSBTQ0FOX1BBR0VfQ09NUE9VTkQ6XG4zMjc2Olx0XHRcdGNhc2UgU0NBTl9QQUdFX0xSVTpcbjMyNzc6XHRcdFx0Y2FzZSBTQ0FOX0RFTF9QQUdFX0xSVTpcbjMyNzg6XHRcdFx0XHRsYXN0X2ZhaWwgPSByZXN1bHQ7XG4zMjc5Olx0XHRcdFx0YnJlYWs7XG4zMjgwOlx0XHRcdGRlZmF1bHQ6XG4zMjgxOlx0XHRcdFx0bGFzdF9mYWlsID0gcmVzdWx0O1xuMzI4MjpcdFx0XHRcdC8qIE90aGVyIGVycm9yLCBleGl0ICovXG4zMjgzOlx0XHRcdFx0Z290byBvdXRfbWF5YmVsb2NrO1xuMzI4NDpcdFx0XHR9XG4zMjg1Olx0XHR9XG4zMjg2Olx0XG4zMjg3Olx0b3V0X21heWJlbG9jazpcbjMyODg6XHRcdC8qIENhbGxlciBleHBlY3RzIHVzIHRvIGhvbGQgbW1hcF9sb2NrIG9uIHJldHVybiAqL1xuMzI4OTpcdFx0aWYgKG1tYXBfdW5sb2NrZWQpIHtcbjMyOTA6XHRcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4zMjkxOlx0XHRcdG1tYXBfcmVhZF9sb2NrKG1tKTtcbjMyOTI6XHRcdH1cbjMyOTM6XHRvdXRfbm9sb2NrOlxuMzI5NDpcdFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcbjMyOTU6XHRcdG1tZHJvcChtbSk7XG4zMjk2Olx0XHRrZnJlZShjYyk7XG4zMjk3Olx0XG4zMjk4Olx0XHRyZXR1cm4gdGhwcyA9PSAoKGhlbmQgLSBoc3RhcnQpIFx1MDAzZVx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxuMzI5OTpcdFx0XHRcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xuMzMwMDpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgxMDEKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYG1hZHZpc2VfY29sbGFwc2VgIGFuZCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAqKgoKT2theSwgc28gSSBzZWUgYG1hZHZpc2VfY29sbGFwc2VgIGlzIGNhbGxpbmcgYGNvbGxhcHNlX3NpbmdsZV9wbWRgLiBOYXR1cmFsbHksIG15IGZpcnN0IGluc3RpbmN0IGlzIHRvIGRpdmUgaW50byBgY29sbGFwc2Vfc2luZ2xlX3BtZGAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCYjMzk7cyBnb2luZyBvbiB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyB0aGUgZW50cnkgcG9pbnQsIGJ1dCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAgaXMgY2xlYXJseSB3aGVyZSB0aGUgY29yZSBvcGVyYXRpb24gaXMgaGFwcGVuaW5nLiBJIG5lZWQgdG8gdHJhY2UgdGhlIGZsb3csIHNlZSB3aGF0IGRhdGEgc3RydWN0dXJlcyBpdCYjMzk7cyBvcGVyYXRpbmcgb24sIGFuZCB1bmRlcnN0YW5kIHRoZSBsb2dpYyBiZWhpbmQgdGhlIGNvbGxhcHNlIG1lY2hhbmlzbS4gV2hhdCBhcmUgdGhlIHByZWNvbmRpdGlvbnM/IFdoYXQgYXJlIHRoZSBlZGdlIGNhc2VzPyBJJiMzOTttIGFudGljaXBhdGluZyB0aGlzIGlzIHdoZXJlIHRoZSByZWFsIGludGVyZXN0aW5nIHN0dWZmIGhhcHBlbnMsIHNvIGxldCYjMzk7cyBnZXQgaW50byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29sbGFwc2Vfc2luZ2xlX3BtZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MjcwMT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI4MTAtICovXG5tbS9raHVnZXBhZ2VkLmM6MjgxMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcbm1tL2todWdlcGFnZWQuYy0yODEyLVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCAqbG9ja19kcm9wcGVkLFxuLS1cbm1tL2todWdlcGFnZWQuYz0yODY4PXN0YXRpYyB2b2lkIGNvbGxhcHNlX3NjYW5fbW1fc2xvdCh1bnNpZ25lZCBpbnQgcHJvZ3Jlc3NfbWF4LFxuLS1cbm1tL2todWdlcGFnZWQuYy0yOTM4LVxubW0va2h1Z2VwYWdlZC5jOjI5Mzk6XHRcdFx0KnJlc3VsdCA9IGNvbGxhcHNlX3NpbmdsZV9wbWQoa2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MsXG5tbS9raHVnZXBhZ2VkLmMtMjk0MC1cdFx0XHRcdFx0XHQgICAgICB2bWEsIFx1MDAyNmxvY2tfZHJvcHBlZCwgY2MpO1xuLS1cbm1tL2todWdlcGFnZWQuYz0zMjExPWludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxuLS1cbm1tL2todWdlcGFnZWQuYy0zMjU5LVxubW0va2h1Z2VwYWdlZC5jOjMyNjA6XHRcdHJlc3VsdCA9IGNvbGxhcHNlX3NpbmdsZV9wbWQoYWRkciwgdm1hLCBcdTAwMjZtbWFwX3VubG9ja2VkLCBjYyk7XG5tbS9raHVnZXBhZ2VkLmMtMzI2MS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg2OTEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIHRoZSBGdW5jdGlvbiAmIzM5O2NvbGxhcHNlX3NpbmdsZV9wbWQmIzM5OyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgZnVuY3Rpb24sIGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2Ugd2l0aGluIHRoZSBicm9hZGVyIGNvbnRleHQuIFdoYXQmIzM5O3MgaXRzIHJvbGU/IElzIGl0IGEgY29yZSBjb21wb25lbnQgb3IgYSB1dGlsaXR5IGZ1bmN0aW9uPyBCYXNlZCBvbiB0aGUgbmFtZSwgbXkgZ3Vlc3MgaXMgaXQmIzM5O3MgZGVzaWduZWQgdG8gdGFrZSBhIHNpbmdsZSBQTUQgKHByZXN1bWFibHkgYSAmIzM0O1BhcnRpYWwgTW9kZSBEZWNvbXBvc2l0aW9uJiMzNDsgb2JqZWN0IG9yIHNpbWlsYXIsIGRlcGVuZGluZyBvbiB0aGUgZmllbGQpIGFuZCByZWR1Y2UgaXQsIG9yICYjMzQ7Y29sbGFwc2UmIzM0OyBpdCwgaW4gc29tZSB3YXkuIFRoZSAmIzM0O3NpbmdsZSYjMzQ7IHBhcnQgaXMga2V5OyBpdCBoaW50cyBhdCBlaXRoZXIgYSBiYXRjaC1wcm9jZXNzaW5nIHNjZW5hcmlvICh3aGVyZSB0aGlzIHdvdWxkIGJlIG9uZSBpdGVyYXRpb24pIG9yIGEgZnVuY3Rpb24gc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciBpbmRpdmlkdWFsIG9wZXJhdGlvbnMuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBhdCBpdHMgaW1wbGVtZW50YXRpb24gb3IgYXQgbGVhc3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG8gY29uZmlybSB0aGlzLiBXaGF0IGFyZSBpdHMgaW5wdXRzPyBXaGF0JiMzOTtzIHRoZSBhbnRpY2lwYXRlZCBvdXRwdXQgZm9ybWF0PyBBcmUgdGhlcmUgYW55IHByZWNvbmRpdGlvbnMgaXQgZXhwZWN0cywgc3VjaCBhcyB0aGUgUE1EIGJlaW5nIGFscmVhZHkgcHJlcHJvY2Vzc2VkPyBBcmUgdGhlcmUgcG90ZW50aWFsIGVkZ2UgY2FzZXMgb3IgZXJyb3IgY29uZGl0aW9ucyBpdCYjMzk7cyBkZXNpZ25lZCB0byBoYW5kbGUsIG9yIGRvZXMgaXQgYXNzdW1lIGNlcnRhaW4gZGF0YSBzdHJ1Y3R1cmVzPyBHZXR0aW5nIGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBpcyB0aGUgZmlyc3Qgc3RlcCB0b3dhcmRzIHVuZGVyc3RhbmRpbmcgaXRzIGZ1bmN0aW9uYWxpdHkgYW5kIGhvdyBpdCBtaWdodCBmaXQgaW50byBhIGxhcmdlciBkYXRhIGFuYWx5c2lzIHBpcGVsaW5lLiBJJiMzOTttIGtlZW4gdG8gc2VlIGlmIHRoaXMgZnVuY3Rpb24gaXMgb3B0aW1pemVkIGZvciBzcGVlZCBvciBmb3IgY2xhcml0eSwgb3IgaWYgaXQgbWFrZXMgYW55IGFzc3VtcHRpb25zIEkgbmVlZCB0byBiZSBhd2FyZSBvZi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODExLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzI4MTE6XHRzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcbjI4MTI6XHRcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGJvb2wgKmxvY2tfZHJvcHBlZCxcbjI4MTM6XHRcdFx0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuMjgxNDpcdHtcbjI4MTU6XHRcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuMjgxNjpcdFx0Ym9vbCB0cmlnZ2VyZWRfd2IgPSBmYWxzZTtcbjI4MTc6XHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xuMjgxODpcdFx0c3RydWN0IGZpbGUgKmZpbGU7XG4yODE5Olx0XHRwZ29mZl90IHBnb2ZmO1xuMjgyMDpcdFxuMjgyMTpcdFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcbjI4MjI6XHRcbjI4MjM6XHRcdGlmICh2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcbjI4MjQ6XHRcdFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9wbWQobW0sIHZtYSwgYWRkciwgbG9ja19kcm9wcGVkLCBjYyk7XG4yODI1Olx0XHRcdGdvdG8gZW5kO1xuMjgyNjpcdFx0fVxuMjgyNzpcdFxuMjgyODpcdFx0ZmlsZSA9IGdldF9maWxlKHZtYS1cdTAwM2V2bV9maWxlKTtcbjI4Mjk6XHRcdHBnb2ZmID0gbGluZWFyX3BhZ2VfaW5kZXgodm1hLCBhZGRyKTtcbjI4MzA6XHRcbjI4MzE6XHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuMjgzMjpcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4yODMzOlx0cmV0cnk6XG4yODM0Olx0XHRyZXN1bHQgPSBjb2xsYXBzZV9zY2FuX2ZpbGUobW0sIGFkZHIsIGZpbGUsIHBnb2ZmLCBjYyk7XG4yODM1Olx0XG4yODM2Olx0XHQvKlxuMjgzNzpcdFx0ICogRm9yIE1BRFZfQ09MTEFQU0UsIHdoZW4gZW5jb3VudGVyaW5nIGRpcnR5IHBhZ2VzLCB0cnkgdG8gd3JpdGViYWNrLFxuMjgzODpcdFx0ICogdGhlbiByZXRyeSB0aGUgY29sbGFwc2Ugb25lIHRpbWUuXG4yODM5Olx0XHQgKi9cbjI4NDA6XHRcdGlmICghY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgcmVzdWx0ID09IFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0sgXHUwMDI2XHUwMDI2XG4yODQxOlx0XHQgICAgIXRyaWdnZXJlZF93YiBcdTAwMjZcdTAwMjYgbWFwcGluZ19jYW5fd3JpdGViYWNrKGZpbGUtXHUwMDNlZl9tYXBwaW5nKSkge1xuMjg0MjpcdFx0XHRjb25zdCBsb2ZmX3QgbHN0YXJ0ID0gKGxvZmZfdClwZ29mZiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbjI4NDM6XHRcdFx0Y29uc3QgbG9mZl90IGxlbmQgPSBsc3RhcnQgJiM0MzsgSFBBR0VfUE1EX1NJWkUgLSAxO1xuMjg0NDpcdFxuMjg0NTpcdFx0XHRmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGZpbGUtXHUwMDNlZl9tYXBwaW5nLCBsc3RhcnQsIGxlbmQpO1xuMjg0NjpcdFx0XHR0cmlnZ2VyZWRfd2IgPSB0cnVlO1xuMjg0NzpcdFx0XHRnb3RvIHJldHJ5O1xuMjg0ODpcdFx0fVxuMjg0OTpcdFx0ZnB1dChmaWxlKTtcbjI4NTA6XHRcbjI4NTE6XHRcdGlmIChyZXN1bHQgPT0gU0NBTl9QVEVfTUFQUEVEX0hVR0VQQUdFKSB7XG4yODUyOlx0XHRcdG1tYXBfcmVhZF9sb2NrKG1tKTtcbjI4NTM6XHRcdFx0aWYgKGNvbGxhcHNlX3Rlc3RfZXhpdF9vcl9kaXNhYmxlKG1tKSlcbjI4NTQ6XHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0FOWV9QUk9DRVNTO1xuMjg1NTpcdFx0XHRlbHNlXG4yODU2Olx0XHRcdFx0cmVzdWx0ID0gdHJ5X2NvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKG1tLCBhZGRyLFxuMjg1NzpcdFx0XHRcdFx0XHRcdFx0ICAgICAhY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCk7XG4yODU4Olx0XHRcdGlmIChyZXN1bHQgPT0gU0NBTl9QTURfTUFQUEVEKVxuMjg1OTpcdFx0XHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbjI4NjA6XHRcdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5ODU5CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBUSFAgQ29sbGFwc2UqKgoKT2theSwgc28gYGNvbGxhcHNlX3NpbmdsZV9wbWRgIGlzIHRoZSBrZXksIGFuZCBpdCBjYWxscyBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgY29sbGFwc2Vfc2Nhbl9maWxlYC4gR29vZC4gV2Uga25vdyB0aG9zZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBUaGF0IG1lYW5zIHRoaXMgaXMgYWxsIHJlYWNoYWJsZSB0aHJvdWdoIGBtYWR2aXNlKC4uLiwgTUFEVl9DT0xMQVBTRSlgICphbmQqIHRoZSBiYWNrZ3JvdW5kIGBraHVnZXBhZ2VkYCBkYWVtb24uIFBlcmZlY3QuIFRoYXQmIzM5O3MgYSBzb2xpZCBhdHRhY2sgc3VyZmFjZSBmb3IgZnV6emluZy4gVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIHB1cnN1aW5nLgoKTGV0JiMzOTtzIHF1aWNrbHkgcmVjYXAgd2hhdCYjMzk7cyBjaGFuZ2VkOgoKKiAgIFdlJiMzOTtyZSBsb29raW5nIGF0IG1vZGlmaWNhdGlvbnMgdG8gYG1tL2todWdlcGFnZWQuY2AuCiogICBBbmQgdGhlIGRvY3VtZW50YXRpb24gdXBkYXRlIGluIGBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RgIHByb3ZpZGVzIGNvbnRleHQuCgpFc3NlbnRpYWxseSwgdGhlIGNoYW5nZXMgcmVzdHJ1Y3R1cmUgdGhlIFBURS1jaGVja2luZyBsb2dpYyB3aXRoaW4gYGtodWdlcGFnZWRgLiBUaGV5JiMzOTt2ZSBjcmVhdGVkIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIHRoZSBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCwgcmVmYWN0b3JpbmcgaG93IGJvdGggYW5vbnltb3VzIGFuZCBmaWxlLWJhY2tlZCBUSFAgY29sbGFwc2Ugd29yay4KClNvIHRoZSBtYWluIHN5bWJvbHMgdG8gZm9jdXMgb24gYXJlOgoKKiAgIGBjb2xsYXBzZV9jaGVja19wdGVgICh0aGF0IG5ldyBoZWxwZXIpCiogICBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAKKiAgIGBjb2xsYXBzZV9zY2FuX3BtZGAKKiAgIGBjb2xsYXBzZV9zY2FuX2ZpbGVgCiogICBgY29sbGFwc2VfaHVnZV9wYWdlYAoqICAgYG1hZHZpc2VfY29sbGFwc2VgCgpOb3csIGxldCYjMzk7cyBuYWlsIGRvd24gdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9ucyB0byB0ZXN0IHRoaXMgZWZmZWN0aXZlbHkuIFdlIG5lZWQ6CgoqICAgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYAoqICAgRWl0aGVyIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIG9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFYC4KCkp1c3QgdG8gYmUgdGhvcm91Z2gsIGFyZSB0aGVyZSBhbnkgKm90aGVyKiByZWxhdGVkIGNvbmZpZ3Mgd2Ugc2hvdWxkIGJlIGF3YXJlIG9mPyBMZXQmIzM5O3MgY2hlY2sgYENPTkZJR19SRUFEX09OTFlfVEhQX0ZPUl9GU2AuLi4gTWlnaHQgYmUgd29ydGggYSBxdWljayBsb29rIGluIGBtbS9LY29uZmlnYCB0byBzZWUgaWYgdGhlcmUmIzM5O3MgYW55dGhpbmcgZWxzZSB0aGF0JiMzOTtzIHJlbGV2YW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1JFQURfT05MWV9USFBfRk9SX0ZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA2NDcKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiA1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKktlcm5lbCBDb25maWd1cmF0aW9uIEh1bnRpbmcqKgoKUmlnaHQsIHNvIEkmIzM5O20gdHJ5aW5nIHRvIHRyYWNrIGRvd24gdGhpcyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBJdCYjMzk7cyBjb21pbmcgdG8gbWUgdGhhdCBJIG1pZ2h0IGJlIGRlYWxpbmcgd2l0aCBhbiBvbGRlciBrZXJuZWwgdmVyc2lvbiB3aGVyZSBpdCB3YXMgc3BlY2lmaWNhbGx5IGxhYmVsbGVkIGFzIGBDT05GSUdfUkVBRF9PTkxZX1RIUF9GT1JfRlNgLCBvciBzb21ldGhpbmcgc2ltaWxhci4gTW9yZSBsaWtlbHksIGFuZCBtb3JlIGNvbnRlbXBvcmFyeSwgSSYjMzk7bSBwcm9iYWJseSBsb29raW5nIGZvciBzaW1wbHkgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYC4gSSBrbm93IHRoZXNlIHRoaW5ncyB0ZW5kIHRvIGV2b2x2ZS4KCkJlc3QgYmV0IGlzIHRvIGRpdmUgaW50byB0aGUgS2NvbmZpZyBmaWxlcywgc3BlY2lmaWNhbGx5IGBtbS9LY29uZmlnYC4gVGhhdCYjMzk7cyB3aGVyZSBhbGwgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHJlbGF0ZWQgY29uZmlndXJhdGlvbnMgYXJlIGRlZmluZWQsIGFuZCB0aGUgVEhQLXJlbGF0ZWQgc3R1ZmYgKmhhcyogdG8gYmUgaW4gdGhlcmUuIFRpbWUgdG8gY29uZmlybSBteSBhc3N1bXB0aW9ucyBhbmQgbmFpbCBkb3duIHRoZSBwcmVjaXNlIG5hbWUsIHBvdGVudGlhbCBkZXBlbmRlbmNpZXMsIGFuZCBkZWZhdWx0IHNldHRpbmdzLiBJdCYjMzk7cyBmcnVzdHJhdGluZyB3aGVuIHRoZXNlIG9wdGlvbnMgZ2V0IHJlbmFtZWQuIEkganVzdCBuZWVkIHRvIGdldCB0aGUgcmlnaHQgbm9tZW5jbGF0dXJlIHN0cmFpZ2h0IHNvIEkgY2FuIHByb2NlZWQgd2l0aCB0aGUgdGFzayBhdCBoYW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcuKlRIUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgxMz1jb25maWcgQVJDSF9XQU5UX0dFTkVSQUxfSFVHRVRMQlxuLS1cbm1tL0tjb25maWctODE1LVxubW0vS2NvbmZpZzo4MTY6Y29uZmlnIEFSQ0hfV0FOVFNfVEhQX1NXQVBcbm1tL0tjb25maWctODE3LVx0ZGVmX2Jvb2wgblxuLS1cbm1tL0tjb25maWc9OTcyPWVuZGNob2ljZVxubW0vS2NvbmZpZy05NzMtXG5tbS9LY29uZmlnOjk3NDpjb25maWcgVEhQX1NXQVBcbm1tL0tjb25maWctOTc1LVx0ZGVmX2Jvb2wgeVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTA4NAoJCQkJCQkJb3V0cHV0OiAyMTEKCQkJCQkJCXRob3VnaHRzOiA3NDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIFRIUCBDb2xsYXBzZSBSZWZhY3RvcmluZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IHRhcmdldCBpcyB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBmdW5jdGlvbmFsaXR5IOKAkyB0aGF0JiMzOTtzIHRoZSBjb3JlIGFyZWEgb2YgaW50ZXJlc3QuIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlIGNoYW5nZXMgcmVsYXRlZCB0byBodWdlIHBhZ2UgY29sbGFwc2UsIGFuZCBzcGVjaWZpY2FsbHksIGhvdyB0aGlzIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIChQYWdlIFRhYmxlIEVudHJ5KSBjaGVja2luZyBsb2dpYy4KCkZpcnN0LCBJIGlkZW50aWZpZWQgYG1hZHZpc2VfY29sbGFwc2VgIGFzIGEga2V5IGVudHJ5IHBvaW50LCBzaW5jZSBpdCYjMzk7cyB0aGUgdXNlcnNwYWNlIHRyaWdnZXIgZm9yIHRoaXMgYmVoYXZpb3IuIFdoaWxlIGBraHVnZXBhZ2VkYCBoYW5kbGVzIHRoaXMgaW4gdGhlIGJhY2tncm91bmQsIGBtYWR2aXNlYCBnaXZlcyBhIG1vcmUgZGlyZWN0IHdheSB0byBoaXQgdGhpcyBjb2RlIGR1cmluZyBmdXp6aW5nLgoKTXkgYW5hbHlzaXMgbGVkIG1lIHRvIGEgZmV3IGtleSBmb2N1cyBzeW1ib2xzIHRoYXQgZW5jYXBzdWxhdGUgdGhlIGNvcmUgbW9kaWZpY2F0aW9ucy4gYGNvbGxhcHNlX2NoZWNrX3B0ZWAgaXMgdGhlIG5ldyBoZWxwZXIgZnVuY3Rpb24gaW50cm9kdWNlZCwgYW5kIGl0IGFwcGVhcnMgdG8gYmUgY2VudHJhbCB0byB0aGUgY2hhbmdlcywgc28gSSYjMzk7bGwgYmUga2VlcGluZyBhIHZlcnkgY2xvc2UgZXllIG9uIHRoYXQuIFRoZW4gdGhlcmUmIzM5O3MgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIHdoaWNoIHVzZXMgaXQsIGFsb25nIHdpdGggYGNvbGxhcHNlX3NjYW5fcG1kYCwgYGNvbGxhcHNlX3NjYW5fZmlsZWAgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLiAgSSYjMzk7bSBhbHNvIHBheWluZyBhdHRlbnRpb24gdG8gYGFsbG9jX2NoYXJnZV9mb2xpb2AgZHVlIHRvIGl0cyBtb2RpZmljYXRpb24gdXNpbmcgYGNvdW50X2NvbGxhcHNlX2V2ZW50YC4KCkkgY29uZmlybWVkIHRoYXQgYGNvbGxhcHNlX2NoZWNrX3B0ZWAgaXMgc3RhdGljLCBtZWFuaW5nIGl0IHNob3VsZCBiZSBpbiB0aGUgc3ltYm9sIHRhYmxlIHVubGVzcyBpbmxpbmVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCB0cmFjaW5nLiBgY29sbGFwc2VfaXNfcmVmZXJlbmNlZGAgaXMgc3RhdGljIGlubGluZSwgc28gaXQgbWlnaHQgYmUgaW5saW5lZC4gYGNvdW50X2NvbGxhcHNlX2V2ZW50YCBpcyBhbHNvIHN0YXRpYywgc28gaXQgc2hvdWxkIGJlIGluIHRoZSBzeW1ib2wgdGFibGUuCgpUaGVyZWZvcmUsIHRoZSBrZXkgc3ltYm9scyBJJiMzOTttIGZvY3VzaW5nIG9uIGFyZToKKiAgIGBjb2xsYXBzZV9jaGVja19wdGVgCiogICBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAKKiAgIGBjb2xsYXBzZV9zY2FuX3BtZGAKKiAgIGBjb2xsYXBzZV9zY2FuX2ZpbGVgCiogICBgY29sbGFwc2VfaHVnZV9wYWdlYAoKTXkgcmVhc29uaW5nIGlzIHRoYXQgdGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIGR1cmluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgY29sbGFwc2UsIGludm9sdmluZyBuZXcgc3RydWN0dXJlcyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiBga2h1Z2VwYWdlZGAgYW5kIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgY2hhbmdlIHRvIGhvdyBwYWdlcyBhcmUgbWFuYWdlZCBhbmQgY29sbGFwc2VkIGludG8gVEhQcywgYW5kIHRoYXQmIzM5O3MgcHJlY2lzZWx5IHdoZXJlIG15IGF0dGVudGlvbiBsaWVzLgoKSW4gdGVybXMgb2YgY29uZmlndXJhdGlvbiwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCAoYW5kIHNwZWNpZmljYWxseSwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VgIHdoaWNoIGNvbnRyb2xzIHRoZSBgbWFkdmlzZWAgYmVoYXZpb3IpIHdpbGwgYmUgY3JpdGljYWwgdG8gcmVwcm9kdWNlIHRoaXMgYmVoYXZpb3IuIEl0IHNlZW1zIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIGlzIGFub3RoZXIgb3B0aW9uIHRoYXQgd29ya3MuCgpPa2F5LCBsZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29sbGFwc2VfY2hlY2tfcHRlJiMzNDssCiAgICAmIzM0O19fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUmIzM0OywKICAgICYjMzQ7Y29sbGFwc2Vfc2Nhbl9wbWQmIzM0OywKICAgICYjMzQ7Y29sbGFwc2Vfc2Nhbl9maWxlJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX2h1Z2VfcGFnZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBkdXJpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIGNvbGxhcHNlIGluIGBraHVnZXBhZ2VkYC4gSXQgaW50cm9kdWNlcyBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBoZWxwZXIgZnVuY3Rpb24sIHdoaWNoIGFyZSB1c2VkIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGFuZCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFRoaXMgbW9kaWZpZXMgdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIGNvbGxhcHNpbmcgcGFnZXMgaW50byBUSFBzLCB3aGljaCBpcyByZWFjaGFibGUgdmlhIHRoZSBiYWNrZ3JvdW5kIGBraHVnZXBhZ2VkYCBkYWVtb24gYW5kIHRoZSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgc3lzY2FsbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29sbGFwc2VfY2hlY2tfcHRlJiMzNDssCiAgICAmIzM0O19fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUmIzM0OywKICAgICYjMzQ7Y29sbGFwc2Vfc2Nhbl9wbWQmIzM0OywKICAgICYjMzQ7Y29sbGFwc2Vfc2Nhbl9maWxlJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX2h1Z2VfcGFnZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBkdXJpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIGNvbGxhcHNlIGluIGBraHVnZXBhZ2VkYC4gSXQgaW50cm9kdWNlcyBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBoZWxwZXIgZnVuY3Rpb24sIHdoaWNoIGFyZSB1c2VkIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGFuZCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFRoaXMgbW9kaWZpZXMgdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIGNvbGxhcHNpbmcgcGFnZXMgaW50byBUSFBzLCB3aGljaCBpcyByZWFjaGFibGUgdmlhIHRoZSBiYWNrZ3JvdW5kIGBraHVnZXBhZ2VkYCBkYWVtb24gYW5kIHRoZSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgc3lzY2FsbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU1OjQyLjM0Mjk2MjM4NloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg4MjA2MTUzNTM0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJjb2xsYXBzZV9jaGVja19wdGVcIixcbiAgICBcIl9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVcIixcbiAgICBcImNvbGxhcHNlX3NjYW5fcG1kXCIsXG4gICAgXCJjb2xsYXBzZV9zY2FuX2ZpbGVcIixcbiAgICBcImNvbGxhcHNlX2h1Z2VfcGFnZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIGR1cmluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgY29sbGFwc2UgaW4gYGtodWdlcGFnZWRgLiBJdCBpbnRyb2R1Y2VzIGEgbmV3IGBwdGVfY2hlY2tfY29udGV4dGAgc3RydWN0IGFuZCBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGhlbHBlciBmdW5jdGlvbiwgd2hpY2ggYXJlIHVzZWQgaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgYW5kIGBjb2xsYXBzZV9zY2FuX3BtZCgpYC4gVGhpcyBtb2RpZmllcyB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBmb3IgY29sbGFwc2luZyBwYWdlcyBpbnRvIFRIUHMsIHdoaWNoIGlzIHJlYWNoYWJsZSB2aWEgdGhlIGJhY2tncm91bmQgYGtodWdlcGFnZWRgIGRhZW1vbiBhbmQgdGhlIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYCBzeXNjYWxsLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NTo0Mi4zNDI5NzA1OTZaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyNzI4NTgxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDliNDRjNjY2MTUxNjA5MzViODFmMjVmMmI4YTQ0ZGQxMjA1ODc3YmJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBKdWwgMTUgMDg6NTU6NDAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XFxuaW5kZXggMTZmMzcxMzVlZDgwZGYuLmIxODdkNjE4NDUyZjQ0IDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxcbkBAIC0yMjQsNyArMjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkXFxuIChlaXRoZXIgb2YgdGhlIHBlci1zaXplIGFub24gY29udHJvbCBvciB0aGUgdG9wLWxldmVsIGNvbnRyb2wgYXJlIHNldFxcbiB0byBcXFwiYWx3YXlzXFxcIiBvciBcXFwibWFkdmlzZVxcXCIpLCBhbmQgaXQnbGwgYmUgYXV0b21hdGljYWxseSBzaHV0ZG93biB3aGVuXFxuIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlXFxuLXRvcC1sZXZlbCBjb250cm9sIGFyZSBcXFwibmV2ZXJcXFwiKVxcbit0b3AtbGV2ZWwgY29udHJvbCBhcmUgXFxcIm5ldmVyXFxcIikuXFxuIFxcbiBwcm9jZXNzIFRIUCBjb250cm9sc1xcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxcbkBAIC0zMDEsNyArMzAxLDkgQEAgYmVpbmcgcmVwbGFjZWQgYnkgYSBQTUQgbWFwcGluZywgb3IgKDIpIHBoeXNpY2FsIHBhZ2VzIHJlcGxhY2VkIGJ5IG9uZVxcbiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LFxcbiBvciB0b2dldGhlciwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG1lbW9yeSBhbmQgdGhlIGZhaWx1cmVzIHRoYXQgb2NjdXIuXFxuIEFzIHN1Y2gsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIHJvdWdobHkgYXMgYSBzaWduIG9mIHByb2dyZXNzLFxcbi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6XFxuK2FuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcuXFxuK1Blci1vcmRlciBtVEhQIGNvbGxhcHNlIHN0YXRpc3RpY3MgYXJlIGFsc28gYXZhaWxhYmxlIHVuZGVyXFxuKy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy1cXHUwMDNjc2l6ZVxcdTAwM2VrQi9zdGF0cy8pOjpcXG4gXFxuIFxcdC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkXFxuIFxcbmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmNcXG5pbmRleCA1NTE1NzU2N2RjNGNjMS4uNDAxMjVkY2I0ZGU5ZDYgMTAwNjQ0XFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXFxuKysrIGIvbW0va2h1Z2VwYWdlZC5jXFxuQEAgLTY0LDYgKzY0LDEyIEBAIGVudW0gc2Nhbl9yZXN1bHQge1xcbiBcXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxcbiB9O1xcbiBcXG4rZW51bSBwdGVfY2hlY2tfcmVzdWx0IHtcXG4rXFx0UFRFX0NIRUNLX1NVQ0NFRUQsXFxuK1xcdFBURV9DSEVDS19GQUlMLFxcbitcXHRQVEVfQ0hFQ0tfQ09OVElOVUUsXFxuK307XFxuK1xcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcXG4gI2luY2x1ZGUgXFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXFx1MDAzZVxcbiBcXG5AQCAtMTE4LDYgKzEyNCwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7XFxuIFxcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcXG4gfTtcXG4gXFxuK3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7XFxuK1xcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XFxuK1xcdHVuc2lnbmVkIGludCBvcmRlcjtcXG4rXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4rXFx0aW50IG5vbmVfb3JfemVybztcXG4rXFx0aW50IHNoYXJlZDtcXG4rXFx0aW50IHVubWFwcGVkO1xcbitcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDtcXG4rXFx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7XFxuK1xcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xcbitcXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkO1xcbit9O1xcbitcXG4gLyoqXFxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXFxuICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuXFxuQEAgLTYyMCw3ICs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0XFxuIFxcdFxcdCAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1blxcbi1cXHRcXHQgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcXG4rXFx0XFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxcbiBcXHRcXHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxcbiBcXHRcXHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXFxuIFxcdFxcdCAqL1xcbkBAIC02MjksNiArNjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuIFxcdH1cXG4gfVxcbiBcXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxcbit7XFxuK1xcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbitcXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRiaXRtYXBfemVybyhjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiB7XFxuIFxcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXFxuQEAgLTY2NSw3NiArNjkyLDE1NiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBjb2xsYXBzZV9pc19yZWZlcmVuY2VkKCkgLSBDaGVjayBmb3IgZW5vdWdoIHJlZmVyZW5jZWQgUFRFcyB0byBqdXN0aWZ5IGNvbGxhcHNpbmdcXG4rICpcXG4rICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZSBwYWdlIGhhcyBiZWVuXFxuKyAqIHJlY2VudGx5IGFjY2Vzc2VkICh5b3VuZyBwdGUpIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZS5cXG4rICpcXG4rICogUmV0dXJuOiB0cnVlIGlmIHRoZSBwYWdlIGhhcyBiZWVuIHJlY2VudGx5IGFjY2Vzc2VkLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBib29sIGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLCBwdGVfdCBwdGV2YWwsXFxuK1xcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpXFxuK3tcXG4rXFx0cmV0dXJuIGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcXG4rXFx0XFx0Zm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxcbitcXHRcXHRtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXFx1MDAzZXZtX21tLCBhZGRyKSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LFxcbitcXHRcXHRlbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpXFxuK3tcXG4rXFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuK1xcdFxcdGNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTtcXG4rXFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBtdGhwX2V2ZW50KTtcXG4rfVxcbitcXG4rLypcXG4rICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmRcXG4rICogcmV0dXJuIFBURV9DSEVDS19GQUlMLlxcbisgKi9cXG4rc3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcXG4rXFx0XFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpXFxuK3tcXG4rXFx0Y3R4LVxcdTAwM2VyZXN1bHQgPSByZXN1bHQ7XFxuK1xcdHJldHVybiBQVEVfQ0hFQ0tfRkFJTDtcXG4rfVxcbitcXG4rLypcXG4rICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2VcXG4rICpcXG4rICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6XFxuKyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkXFxuKyAqIC0gdWZmZCBpcyBub3QgYWN0aXZlXFxuKyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnRcXG4rICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudFxcbisgKlxcbisgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxcbisgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci5cXG4rICpcXG4rICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcXG4rICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXFxuKyAqICAgICAgICAgUFRFX0NIRUNLX0NPTlRJTlVFIGlmIHRoZSBzY2FuIHNob3VsZCBjb250aW51ZSB0byBjaGVjayB0aGUgbmV4dCBQVEUuXFxuKyAqL1xcbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXFxuK3tcXG4rXFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbitcXHRcXHRpZiAoKytjdHgtXFx1MDAzZW5vbmVfb3JfemVybyBcXHUwMDNlIGN0eC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsXFxuK1xcdFxcdFxcdFxcdFxcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX05PTkVfUFRFKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xcbitcXHR9XFxuK1xcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xcbitcXHRcXHRpZiAoY3R4LVxcdTAwM2V1bm1hcHBlZCA9PSAtMSlcXG4rXFx0XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfTk9OX1BSRVNFTlQpO1xcbitcXHRcXHRpZiAoKytjdHgtXFx1MDAzZXVubWFwcGVkIFxcdTAwM2UgY3R4LVxcdTAwM2VtYXhfcHRlc19zd2FwKSB7XFxuK1xcdFxcdFxcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXHRcXHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xcbitcXHR9XFxuK1xcdC8qXFxuK1xcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXFxuK1xcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcXG4rXFx0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxcbitcXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxcbitcXHQgKi9cXG4rXFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXG4rXFx0Y3R4LVxcdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXFx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcXG4rXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4rXFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbitcXHQgKi9cXG4rXFx0aWYgKGN0eC1cXHUwMDNlY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgIShjdHgtXFx1MDAzZXZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9EUk9QUEFCTEUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC1cXHUwMDNlZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcXG4rXFxuK1xcdGlmICghZm9saW9fdGVzdF9hbm9uKGN0eC1cXHUwMDNlZm9saW8pKSB7XFxuK1xcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXFx1MDAzZWZvbGlvKSwgY3R4LVxcdTAwM2Vmb2xpbyk7XFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LVxcdTAwM2Vmb2xpbykpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcXG4rXFx0XFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXFxuK1xcdFxcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcXG4rXFx0XFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2VzaGFyZWQgXFx1MDAzZSBjdHgtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xcbitcXHRcXHRcXHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7XFxuK31cXG4rXFxuIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxcbiBcXHRcXHR1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KVxcbiB7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKTtcXG4gXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4tXFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcXG4gXFx0dW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjtcXG4tXFx0cHRlX3QgKl9wdGU7XFxuLVxcdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcXG4rXFx0cHRlX3QgKl9wdGUsIHB0ZXZhbDtcXG4rXFx0aW50IHJlZmVyZW5jZWQgPSAwO1xcbiBcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcXG4rXFx0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcXG4rXFx0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcXG4rXFx0XFx0LmNjID0gY2MsXFxuK1xcdFxcdC52bWEgPSB2bWEsXFxuK1xcdFxcdC5vcmRlciA9IG9yZGVyLFxcbitcXHRcXHQudW5tYXBwZWQgPSAtMSwgLyogZG9uJ3QgY2hlY2sgc3dhcCBQVEVzICovXFxuK1xcdFxcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlciksXFxuK1xcdFxcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSxcXG4rXFx0fTtcXG4gXFxuIFxcdGZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSBcXHUwMDNjIHB0ZSArIG5yX3BhZ2VzO1xcbiBcXHQgICAgIF9wdGUrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcXG4tXFx0XFx0cHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XFxuLVxcdFxcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0aWYgKCsrbm9uZV9vcl96ZXJvIFxcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcXG4tXFx0XFx0XFx0XFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdFxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XFxuLVxcdFxcdFxcdFxcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX05PTl9QUkVTRU5UO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xcbi1cXHRcXHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbi1cXHRcXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4tXFx0XFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2ICEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0RST1BQQUJMRSkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XFxuK1xcdFxcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xcbitcXHRcXHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0Zm9saW8gPSBjdHguZm9saW87XFxuK1xcdFxcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcXG4rXFx0XFx0XFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcXG4gXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdFxcdH1cXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4tXFx0XFx0LyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovXFxuLVxcdFxcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlclxcbi1cXHRcXHRcXHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcXG4tXFx0XFx0XFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxcbi1cXHRcXHRcXHQgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAoKytzaGFyZWQgXFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcXG4tXFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcXG4tXFx0XFx0XFx0XFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdFxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogVE9ETzogSW4gc29tZSBjYXNlcyBvZiBwYXJ0aWFsbHktbWFwcGVkIGZvbGlvcywgd2UnZCBhY3R1YWxseVxcbiBcXHRcXHQgKiB3YW50IHRvIGNvbGxhcHNlLlxcbkBAIC03NTksNyArODY2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGVcXG4tXFx0XFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9ja1xcbitcXHRcXHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrXFxuIFxcdFxcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcXG4gXFx0XFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxcbiBcXHRcXHQgKi9cXG5AQCAtNzg2LDcgKzg5Myw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZVxcbitcXHRcXHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcXG4gXFx0XFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xcbkBAIC04MDMsMTQgKzkxMCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcXG4gXFx0XFx0XFx0bGlzdF9hZGRfdGFpbChcXHUwMDI2Zm9saW8tXFx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xcbiBuZXh0Olxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXNcXG4tXFx0XFx0ICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2VcXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8XFxuLVxcdFxcdCAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxcbi1cXHRcXHQgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cXHUwMDNldm1fbW0sIGFkZHIpKSlcXG4rXFx0XFx0aWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXFxuIFxcdFxcdFxcdHJlZmVyZW5jZWQrKztcXG4gXFx0fVxcbiBcXG5AQCAtODE4LDEzICs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xcbi1cXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLFxcbitcXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xcbiBcXHRcXHRyZXR1cm4gcmVzdWx0O1xcbiBcXHR9XFxuIG91dDpcXG4gXFx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuLVxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXFxuK1xcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XFxuIFxcdHJldHVybiByZXN1bHQ7XFxuIH1cXG5AQCAtMTA3OCw3ICsxMTc4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcXG4gXFx0XFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xcbiBcXHQvKlxcbiBcXHQgKiBBbm9uIFZNQSBleHBlY3RlZCwgdGhlIGFkZHJlc3MgbWF5IGJlIHVubWFwcGVkIHRoZW5cXG4tXFx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxcbitcXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLlxcbiBcXHQgKlxcbiBcXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxcbiBcXHQgKiB2bWFzLlxcbkBAIC0xMTM2LDcgKzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiAvKlxcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxcbi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxcbisgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cXG4gICpcXG4gICogRm9yIG1USFAgb3JkZXJzIHRoZSBmdW5jdGlvbiBiYWlscyBvbiB0aGUgZmlyc3Qgc3dhcCBlbnRyeSwgYmVjYXVzZVxcbiAgKiBmYXVsdGluZyBwYWdlcyBiYWNrIGluIGR1cmluZyBjb2xsYXBzZSBjb3VsZCByZS1wb3B1bGF0ZSBQVEVzIHRoYXRcXG5AQCAtMTI0NywxNSArMTM0NywxMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxcbiBcXHRmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgXFx1MDAyNmNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuIFxcdGlmICghZm9saW8pIHtcXG4gXFx0XFx0KmZvbGlvcCA9IE5VTEw7XFxuLVxcdFxcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxcbi1cXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcXG4tXFx0XFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcXG4rXFx0XFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQsXFxuK1xcdFxcdFxcdFxcdE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xcbiBcXHRcXHRyZXR1cm4gU0NBTl9BTExPQ19IVUdFX1BBR0VfRkFJTDtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XFxuLVxcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcXG4rXFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcXG4gXFxuIFxcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XFxuIFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuQEAgLTEzMzEsOCArMTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xcbiBcXHQvKlxcbiBcXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2ZcXG4tXFx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNXFxuLVxcdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgKyBQR19sb2NrLlxcbitcXHQgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwbWRwX2NvbGxhcHNlX2ZsdXNoIGFuZCB0aGUgVk1cXG4rXFx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIGZvbGlvIGxvY2suXFxuIFxcdCAqXFxuIFxcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxcbiBcXHQgKiBtbWFwX2xvY2suXFxuQEAgLTE0MzksNyArMTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdFxcdFxcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xcbiBcXHRcXHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xcbiBcXHRcXHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXFxuLVxcdFxcdFxcdFxcdFxcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAvKnVmZmQ9Ki8gZmFsc2UpO1xcbiBcXHRcXHRpZiAocHRlX3B0bCAhPSBwbWRfcHRsKVxcbiBcXHRcXHRcXHRzcGluX3VubG9jayhwdGVfcHRsKTtcXG4gXFx0fVxcbkBAIC0xNDQ5LDEwICsxNTQ2LDEwIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcbiBcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuIG91dF91cF93cml0ZTpcXG4tXFx0aWYgKGFub25fdm1hX2xvY2tlZClcXG4tXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cXHUwMDNlYW5vbl92bWEpO1xcbiBcXHRpZiAocHRlKVxcbiBcXHRcXHRwdGVfdW5tYXAocHRlKTtcXG4rXFx0aWYgKGFub25fdm1hX2xvY2tlZClcXG4rXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cXHUwMDNlYW5vbl92bWEpO1xcbiBcXHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XFxuIG91dF9ub2xvY2s6XFxuIFxcdGlmIChmb2xpbylcXG5AQCAtMTU5Myw0MiArMTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4gXFx0XFx0Ym9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuIHtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xcbi1cXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcXG4gXFx0ZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcXG4gXFx0cG1kX3QgKnBtZDtcXG4gXFx0cHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDtcXG4gXFx0aW50IGk7XFxuLVxcdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcXG4tXFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuLVxcdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XFxuK1xcdGludCByZWZlcmVuY2VkID0gMDtcXG4rXFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuIFxcdHVuc2lnbmVkIGxvbmcgYWRkcjtcXG4gXFx0dW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVycztcXG4gXFx0c3BpbmxvY2tfdCAqcHRsO1xcbi1cXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xcbitcXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcXG4rXFx0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcXG4gXFxuIFxcdFZNX0JVR19PTihzdGFydF9hZGRyIFxcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcXG4gXFxuK1xcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XFxuK1xcdFxcdC5jYyA9IGNjLFxcbitcXHRcXHQudm1hID0gdm1hLFxcbitcXHRcXHQub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsXFxuK1xcdFxcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLFxcbitcXHRcXHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXFxuK1xcdFxcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksXFxuK1xcdH07XFxuK1xcbiBcXHRyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgXFx1MDAyNnBtZCk7XFxuIFxcdGlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7XFxuIFxcdFxcdGNjLVxcdTAwM2Vwcm9ncmVzcysrO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4tXFx0Yml0bWFwX3plcm8oY2MtXFx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcXG4tXFx0bWVtc2V0KGNjLVxcdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cXHUwMDNlbm9kZV9sb2FkKSk7XFxuLVxcdG5vZGVzX2NsZWFyKGNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuK1xcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcXG4gXFxuIFxcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVxcdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxcbi1cXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLlxcbitcXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXFxuK1xcdCAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLlxcbiBcXHQgKi9cXG4gXFx0aWYgKGVuYWJsZWRfb3JkZXJzICE9IEJJVChIUEFHRV9QTURfT1JERVIpKVxcbi1cXHRcXHRtYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcXG4rXFx0XFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xcbiBcXG4gXFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcXHUwMDI2cHRsKTtcXG4gXFx0aWYgKCFwdGUpIHtcXG5AQCAtMTY0NCw4NCArMTc0NiwxNCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFxuIFxcdFxcdGNjLVxcdTAwM2Vwcm9ncmVzcysrO1xcbiBcXG4tXFx0XFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbi1cXHRcXHRcXHRpZiAoKytub25lX29yX3plcm8gXFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0aWYgKCsrdW5tYXBwZWQgXFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBBbHdheXMgYmUgc3RyaWN0IHdpdGggdWZmZC13cFxcbi1cXHRcXHRcXHQgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWVcXG4tXFx0XFx0XFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogRG9uJ3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxcbi1cXHRcXHRcXHQgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi5cXG4tXFx0XFx0XFx0ICogSGVyZSB3ZSBjYW4gYWxzbyBtYXJrIHRoZSBuZXcgaHVnZSBwbWQgYXNcXG4tXFx0XFx0XFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xcbi1cXHRcXHRcXHQgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93blxcbi1cXHRcXHRcXHQgKiB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxscyBvdXRzaWRlIG9mXFxuLVxcdFxcdFxcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcXG4tXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuLVxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4tXFx0XFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2ICEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0RST1BQQUJMRSkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XFxuK1xcdFxcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XFxuK1xcdFxcdFxcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XFxuIFxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbiBcXHRcXHR9XFxuLVxcbi1cXHRcXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX0FOT047XFxuLVxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBXZSB0cmVhdCBhIHNpbmdsZSBwYWdlIGFzIHNoYXJlZCBpZiBhbnkgcGFydCBvZiB0aGUgVEhQXFxuLVxcdFxcdCAqIGlzIHNoYXJlZC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xcbi1cXHRcXHRcXHRpZiAoKytzaGFyZWQgXFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcXG4tXFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4gXFxuIFxcdFxcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXFxuIFxcdFxcdF9fc2V0X2JpdChpLCBjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMpO1xcbkBAIC0xNzQ5LDMxICsxNzgxLDIxIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuXFxuIFxcdFxcdCAqXFxuLVxcdFxcdCAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5Olxcbi1cXHRcXHQgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgXFx1MDAzZSBmb2xpb19yZWZfY291bnQoKS5cXG4tXFx0XFx0ICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlXFxuLVxcdFxcdCAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlXFxuLVxcdFxcdCAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVja1xcbi1cXHRcXHQgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxcbitcXHRcXHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcXG4rXFx0XFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcXG4rXFx0XFx0ICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHtcXG4gXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXFxuLVxcdFxcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxcbi1cXHRcXHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXFx1MDAzZXZtX21tLCBhZGRyKSkpXFxuK1xcdFxcdGlmIChjb2xsYXBzZV9pc19yZWZlcmVuY2VkKGNjLCBwdGV2YWwsIGZvbGlvLCB2bWEsIGFkZHIpKVxcbiBcXHRcXHRcXHRyZWZlcmVuY2VkKys7XFxuIFxcdH1cXG4gXFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdCAgICghcmVmZXJlbmNlZCB8fFxcbi1cXHRcXHQgICAgKHVubWFwcGVkIFxcdTAwMjZcXHUwMDI2IHJlZmVyZW5jZWQgXFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcXG4rXFx0XFx0ICAgIChjdHgudW5tYXBwZWQgXFx1MDAyNlxcdTAwMjYgcmVmZXJlbmNlZCBcXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuQEAgLTE3ODQsMTMgKzE4MDYsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cXG4gXFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuIFxcdFxcdHJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsXFxuLVxcdFxcdFxcdFxcdCAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcXG4gXFx0XFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xcbiBcXHRcXHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcXG4gXFx0fVxcbiBvdXQ6XFxuIFxcdHRyYWNlX21tX2todWdlcGFnZWRfc2Nhbl9wbWQobW0sIGZvbGlvLCByZWZlcmVuY2VkLFxcbi1cXHRcXHRcXHRcXHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XFxuK1xcdFxcdFxcdFxcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xcbiBcXHRyZXR1cm4gcmVzdWx0O1xcbiB9XFxuIFxcbkBAIC0yNjkxLDggKzI3MTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiBcXHRwcmVzZW50ID0gMDtcXG4gXFx0c3dhcCA9IDA7XFxuLVxcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbi1cXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XFxuIFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gXFx0eGFzX2Zvcl9lYWNoKFxcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCArIEhQQUdFX1BNRF9OUiAtIDEpIHtcXG4gXFx0XFx0aWYgKHhhc19yZXRyeShcXHUwMDI2eGFzLCBmb2xpbykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU1OjQzLjA3MjM2NzQ0MVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODc0NzY3MjMwOTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvbGxhcHNlX2NoZWNrX3B0ZVwiLFxuICAgIFwiX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwiLFxuICAgIFwiY29sbGFwc2Vfc2Nhbl9wbWRcIixcbiAgICBcImNvbGxhcHNlX3NjYW5fZmlsZVwiLFxuICAgIFwiY29sbGFwc2VfaHVnZV9wYWdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgOWI0NGM2NjYxNTE2MDkzNWI4MWYyNWYyYjhhNDRkZDEyMDU4NzdiYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgSnVsIDE1IDA4OjU1OjQwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5pbmRleCAxNmYzNzEzNWVkODBkZi4uYjE4N2Q2MTg0NTJmNDQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuQEAgLTIyNCw3ICsyMjQsNyBAQCBraHVnZXBhZ2VkIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gYW55IFRIUCBzaXplIGlzIGVuYWJsZWRcbiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXRcbiB0byBcImFsd2F5c1wiIG9yIFwibWFkdmlzZVwiKSwgYW5kIGl0J2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlblxuIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlXG4tdG9wLWxldmVsIGNvbnRyb2wgYXJlIFwibmV2ZXJcIilcbit0b3AtbGV2ZWwgY29udHJvbCBhcmUgXCJuZXZlclwiKS5cbiBcbiBwcm9jZXNzIFRIUCBjb250cm9sc1xuIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AQCAtMzAxLDcgKzMwMSw5IEBAIGJlaW5nIHJlcGxhY2VkIGJ5IGEgUE1EIG1hcHBpbmcsIG9yICgyKSBwaHlzaWNhbCBwYWdlcyByZXBsYWNlZCBieSBvbmVcbiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LFxuIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci5cbiBBcyBzdWNoLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCByb3VnaGx5IGFzIGEgc2lnbiBvZiBwcm9ncmVzcyxcbi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6XG4rYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy5cbitQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlclxuKy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy1cdTAwM2NzaXplXHUwMDNla0Ivc3RhdHMvKTo6XG4gXG4gXHQvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZFxuIFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xuaW5kZXggNTUxNTc1NjdkYzRjYzEuLjQwMTI1ZGNiNGRlOWQ2IDEwMDY0NFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXG4rKysgYi9tbS9raHVnZXBhZ2VkLmNcbkBAIC02NCw2ICs2NCwxMiBAQCBlbnVtIHNjYW5fcmVzdWx0IHtcbiBcdFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssXG4gfTtcbiBcbitlbnVtIHB0ZV9jaGVja19yZXN1bHQge1xuK1x0UFRFX0NIRUNLX1NVQ0NFRUQsXG4rXHRQVEVfQ0hFQ0tfRkFJTCxcbitcdFBURV9DSEVDS19DT05USU5VRSxcbit9O1xuK1xuICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xuICNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXHUwMDNlXG4gXG5AQCAtMTE4LDYgKzEyNCwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7XG4gXHRERUNMQVJFX0JJVE1BUChtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4gfTtcbiBcbitzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuK1x0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xuK1x0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XG4rXHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0aW50IG5vbmVfb3JfemVybztcbitcdGludCBzaGFyZWQ7XG4rXHRpbnQgdW5tYXBwZWQ7XG4rXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDtcbitcdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuK1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7XG4rXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkO1xuK307XG4rXG4gLyoqXG4gICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmdcbiAgKiBAbW1faGVhZDogdGhlIGhlYWQgb2YgdGhlIG1tIGxpc3QgdG8gc2NhblxuQEAgLTYyMCw3ICs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIFx0XHQvKlxuIFx0XHQgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0XG4gXHRcdCAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1blxuLVx0XHQgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcbitcdFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuIFx0XHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxuIFx0XHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXG4gXHRcdCAqL1xuQEAgLTYyOSw2ICs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdH1cbiB9XG4gXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuK3tcbitcdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbitcdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4gXHRub2RlX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuQEAgLTY2NSw3NiArNjkyLDE1NiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcbiBcdH1cbiB9XG4gXG4rLypcbisgKiBjb2xsYXBzZV9pc19yZWZlcmVuY2VkKCkgLSBDaGVjayBmb3IgZW5vdWdoIHJlZmVyZW5jZWQgUFRFcyB0byBqdXN0aWZ5IGNvbGxhcHNpbmdcbisgKlxuKyAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGUgcGFnZSBoYXMgYmVlblxuKyAqIHJlY2VudGx5IGFjY2Vzc2VkICh5b3VuZyBwdGUpIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZS5cbisgKlxuKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgYmVlbiByZWNlbnRseSBhY2Nlc3NlZC5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgY29sbGFwc2VfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCxcbitcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpXG4re1xuK1x0cmV0dXJuIGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8XG4rXHRcdGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbitcdFx0bW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LFxuK1x0XHRlbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpXG4re1xuK1x0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4rXHRcdGNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTtcbitcdGNvdW50X210aHBfc3RhdChvcmRlciwgbXRocF9ldmVudCk7XG4rfVxuK1xuKy8qXG4rICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmRcbisgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXG4rICovXG4rc3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcbitcdFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpXG4re1xuK1x0Y3R4LVx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcbitcdHJldHVybiBQVEVfQ0hFQ0tfRkFJTDtcbit9XG4rXG4rLypcbisgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxuKyAqXG4rICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6XG4rICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcbisgKiAtIHVmZmQgaXMgbm90IGFjdGl2ZVxuKyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnRcbisgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XG4rICpcbisgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxuKyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxuKyAqXG4rICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbisgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbisgKiAgICAgICAgIFBURV9DSEVDS19DT05USU5VRSBpZiB0aGUgc2NhbiBzaG91bGQgY29udGludWUgdG8gY2hlY2sgdGhlIG5leHQgUFRFLlxuKyAqL1xuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcbit7XG4rXHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2Vub25lX29yX3plcm8gXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19ub25lKSB7XG4rXHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsXG4rXHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuK1x0XHR9XG4rXHRcdHJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7XG4rXHR9XG4rXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbitcdFx0aWYgKGN0eC1cdTAwM2V1bm1hcHBlZCA9PSAtMSlcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbitcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TV0FQX1BURSk7XG4rXHRcdH1cbitcdFx0aWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSlcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTtcbitcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbitcdH1cbitcdC8qXG4rXHQgKiBEb24ndCBjb2xsYXBzZSBpZiBhbnkgb2YgdGhlIHNtYWxsIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZFxuK1x0ICogd3JpdGUgcHJvdGVjdGlvbi4gTWFya2luZyB0aGUgbmV3IGh1Z2UgcG1kIGFzIHdyaXRlIHByb3RlY3RlZFxuK1x0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxuK1x0ICogcmVnaXN0ZXJlZCByYW5nZS5cbitcdCAqL1xuK1x0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuK1xuK1x0Y3R4LVx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cdTAwM2V2bWEsIGFkZHIsIHB0ZXZhbCk7XG4rXHRpZiAodW5saWtlbHkoIWN0eC1cdTAwM2Vmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LVx1MDAzZWZvbGlvKSkpXG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTtcbitcbitcdC8qXG4rXHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4rXHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4rXHQgKi9cbitcdGlmIChjdHgtXHUwMDNlY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgIShjdHgtXHUwMDNldm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoY3R4LVx1MDAzZWZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKVxuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTEFaWUZSRUUpO1xuK1xuK1x0aWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSkge1xuK1x0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSwgY3R4LVx1MDAzZWZvbGlvKTtcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0FOT04pO1xuK1x0fVxuK1xuK1x0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LVx1MDAzZWZvbGlvKSkge1xuK1x0XHQvKlxuK1x0XHQgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlclxuK1x0XHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcbitcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuK1x0XHQgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuXG4rXHRcdCAqL1xuK1x0XHRpZiAoKytjdHgtXHUwMDNlc2hhcmVkIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKSB7XG4rXHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcbitcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7XG4rfVxuK1xuIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxuIFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlcik7XG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjtcbi1cdHB0ZV90ICpfcHRlO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuK1x0cHRlX3QgKl9wdGUsIHB0ZXZhbDtcbitcdGludCByZWZlcmVuY2VkID0gMDtcbiBcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuK1x0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcbitcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XG4rXHRcdC5jYyA9IGNjLFxuK1x0XHQudm1hID0gdm1hLFxuK1x0XHQub3JkZXIgPSBvcmRlcixcbitcdFx0LnVubWFwcGVkID0gLTEsIC8qIGRvbid0IGNoZWNrIHN3YXAgUFRFcyAqL1xuK1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLFxuK1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlciksXG4rXHR9O1xuIFxuIFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFx1MDAzYyBwdGUgKyBucl9wYWdlcztcbiBcdCAgICAgX3B0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xuLVx0XHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcbi1cdFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuLVx0XHRcdGlmICgrK25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9OT05fUFJFU0VOVDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbitcdFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4rXHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4rXHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4rXHRcdFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbitcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovXG4tXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbi1cdFx0XHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcbi1cdFx0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4tXHRcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICgrK3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4gXHRcdC8qXG4gXHRcdCAqIFRPRE86IEluIHNvbWUgY2FzZXMgb2YgcGFydGlhbGx5LW1hcHBlZCBmb2xpb3MsIHdlJ2QgYWN0dWFsbHlcbiBcdFx0ICogd2FudCB0byBjb2xsYXBzZS5cbkBAIC03NTksNyArODY2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdFx0LypcbiBcdFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxuLVx0XHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXG4rXHRcdCAqIGZvbGlvIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2tcbiBcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZVxuIFx0XHQgKiB3aGVuIGludm9rZWQgZnJvbSB0aGUgVk0uXG4gXHRcdCAqL1xuQEAgLTc4Niw3ICs4OTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR9XG4gXG4gXHRcdC8qXG4tXHRcdCAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZVxuK1x0XHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcbiBcdFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXG4gXHRcdCAqL1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xuQEAgLTgwMywxNCArOTEwLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Zm9saW8tXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XG4gbmV4dDpcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbitcdFx0aWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXG4gXHRcdFx0cmVmZXJlbmNlZCsrO1xuIFx0fVxuIFxuQEAgLTgxOCwxMyArOTE4LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG4tXHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4rXHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4rXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbiBcdFx0XHRcdFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xuIFx0cmV0dXJuIHJlc3VsdDtcbiB9XG5AQCAtMTA3OCw3ICsxMTc4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcbiBcdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuIFx0LypcbiBcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxuLVx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxuK1x0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYWNxdWlyZWQgdGhlIG1tYXBfbG9jay5cbiBcdCAqXG4gXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxuIFx0ICogdm1hcy5cbkBAIC0xMTM2LDcgKzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gLypcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4rICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4gICpcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XG5AQCAtMTI0NywxNSArMTM0NywxMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIFx0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFx1MDAyNmNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiBcdGlmICghZm9saW8pIHtcbiBcdFx0KmZvbGlvcCA9IE5VTEw7XG4tXHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuLVx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuK1x0XHRjb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCxcbitcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuIFx0XHRyZXR1cm4gU0NBTl9BTExPQ19IVUdFX1BBR0VfRkFJTDtcbiBcdH1cbiBcbi1cdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpO1xuLVx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpO1xuK1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTMzMSw4ICsxNDI4LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0LypcbiBcdCAqIFByZXZlbnQgYWxsIGFjY2VzcyB0byBwYWdldGFibGVzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuLVx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNXG4tXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgUEdfbG9jay5cbitcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2ggYW5kIHRoZSBWTVxuK1x0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIGZvbGlvIGxvY2suXG4gXHQgKlxuIFx0ICogVUZGRElPX01PVkUgaXMgcHJldmVudGVkIHRvIHJhY2UgYXMgd2VsbCB0aGFua3MgdG8gdGhlXG4gXHQgKiBtbWFwX2xvY2suXG5AQCAtMTQzOSw3ICsxNTM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdFx0XHRzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTtcbiBcdFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcbiBcdFx0bWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLFxuLVx0XHRcdFx0XHQgIC8qdWZmZF93cD0qLyBmYWxzZSk7XG4rXHRcdFx0XHRcdCAgLyp1ZmZkPSovIGZhbHNlKTtcbiBcdFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcbiBcdFx0XHRzcGluX3VubG9jayhwdGVfcHRsKTtcbiBcdH1cbkBAIC0xNDQ5LDEwICsxNTQ2LDEwIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG4gb3V0X3VwX3dyaXRlOlxuLVx0aWYgKGFub25fdm1hX2xvY2tlZClcbi1cdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cdTAwM2Vhbm9uX3ZtYSk7XG4gXHRpZiAocHRlKVxuIFx0XHRwdGVfdW5tYXAocHRlKTtcbitcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4rXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuIG91dF9ub2xvY2s6XG4gXHRpZiAoZm9saW8pXG5AQCAtMTU5Myw0MiArMTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcbiBcdFx0Ym9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4ge1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTtcbi1cdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpO1xuIFx0ZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFO1xuIFx0cG1kX3QgKnBtZDtcbiBcdHB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7XG4gXHRpbnQgaTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbi1cdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMO1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XG4rXHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4rXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiBcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xuK1x0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4rXHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xuIFxuIFx0Vk1fQlVHX09OKHN0YXJ0X2FkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4gXG4rXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuK1x0XHQuY2MgPSBjYyxcbitcdFx0LnZtYSA9IHZtYSxcbitcdFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxuK1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSxcbitcdFx0Lm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0fTtcbitcbiBcdHJlc3VsdCA9IGZpbmRfcG1kX29yX3RocF9vcl9ub25lKG1tLCBzdGFydF9hZGRyLCBcdTAwMjZwbWQpO1xuIFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MrKztcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRiaXRtYXBfemVybyhjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4tXHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4tXHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXG4gXHRlbmFibGVkX29yZGVycyA9IGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcbiBcbiBcdC8qXG4gXHQgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2Vcbi1cdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuXG4rXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXG4rXHQgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci5cbiBcdCAqL1xuIFx0aWYgKGVuYWJsZWRfb3JkZXJzICE9IEJJVChIUEFHRV9QTURfT1JERVIpKVxuLVx0XHRtYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcbitcdFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuIFxuIFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcdTAwMjZwdGwpO1xuIFx0aWYgKCFwdGUpIHtcbkBAIC0xNjQ0LDg0ICsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcysrO1xuIFxuLVx0XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCsrbm9uZV9vcl96ZXJvIFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCsrdW5tYXBwZWQgXHUwMDNlIG1heF9wdGVzX3N3YXApIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwXG4tXHRcdFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXG4tXHRcdFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBEb24ndCBjb2xsYXBzZSB0aGUgcGFnZSBpZiBhbnkgb2YgdGhlIHNtYWxsXG4tXHRcdFx0ICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uXG4tXHRcdFx0ICogSGVyZSB3ZSBjYW4gYWxzbyBtYXJrIHRoZSBuZXcgaHVnZSBwbWQgYXNcbi1cdFx0XHQgKiB3cml0ZSBwcm90ZWN0ZWQgaWYgYW55IG9mIHRoZSBzbWFsbCBvbmVzIGlzXG4tXHRcdFx0ICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd25cbi1cdFx0XHQgKiB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxscyBvdXRzaWRlIG9mXG4tXHRcdFx0ICogdGhlIHJlZ2lzdGVyZWQgcmFuZ2UuICBTbywganVzdCBiZSBzaW1wbGUuXG4tXHRcdFx0ICovXG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVxuLVx0XHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xuLVx0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cdFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4rXHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4rXHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcbitcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4tXG4tXHRcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcbi1cdFx0ICogaXMgc2hhcmVkLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCsrc2hhcmVkIFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0fVxuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Zm9saW8gPSBjdHguZm9saW87XG4gXG4gXHRcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXG4gXHRcdF9fc2V0X2JpdChpLCBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcyk7XG5AQCAtMTc0OSwzMSArMTc4MSwyMSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0LypcbiBcdFx0ICogQ2hlY2sgaWYgdGhlIHBhZ2UgaGFzIGFueSBHVVAgKG9yIG90aGVyIGV4dGVybmFsKSBwaW5zLlxuIFx0XHQgKlxuLVx0XHQgKiBIZXJlIHRoZSBjaGVjayBtYXkgYmUgcmFjeTpcbi1cdFx0ICogaXQgbWF5IHNlZSBmb2xpb19tYXBjb3VudCgpIFx1MDAzZSBmb2xpb19yZWZfY291bnQoKS5cbi1cdFx0ICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlXG4tXHRcdCAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlXG4tXHRcdCAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVja1xuLVx0XHQgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxuK1x0XHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcbitcdFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcbitcdFx0ICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbiBcdFx0ICovXG4gXHRcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHtcbiBcdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfQ09VTlQ7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbiBcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbitcdFx0aWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXG4gXHRcdFx0cmVmZXJlbmNlZCsrO1xuIFx0fVxuIFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICghcmVmZXJlbmNlZCB8fFxuLVx0XHQgICAgKHVubWFwcGVkIFx1MDAyNlx1MDAyNiByZWZlcmVuY2VkIFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcbitcdFx0ICAgIChjdHgudW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuQEAgLTE3ODQsMTMgKzE4MDYsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cbiBcdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4gXHRcdHJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgICAgdW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4rXHRcdFx0XHQgICAgICAgY3R4LnVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuIFx0XHQvKiBtbWFwX2xvY2sgd2FzIHJlbGVhc2VkIGFib3ZlLCBzZXQgbG9ja19kcm9wcGVkICovXG4gXHRcdCpsb2NrX2Ryb3BwZWQgPSB0cnVlO1xuIFx0fVxuIG91dDpcbiBcdHRyYWNlX21tX2todWdlcGFnZWRfc2Nhbl9wbWQobW0sIGZvbGlvLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICBub25lX29yX3plcm8sIHJlc3VsdCwgdW5tYXBwZWQpO1xuK1x0XHRcdFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XG4gXHRyZXR1cm4gcmVzdWx0O1xuIH1cbiBcbkBAIC0yNjkxLDggKzI3MTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRwcmVzZW50ID0gMDtcbiBcdHN3YXAgPSAwO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuK1x0Y29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpO1xuIFx0cmN1X3JlYWRfbG9jaygpO1xuIFx0eGFzX2Zvcl9lYWNoKFx1MDAyNnhhcywgZm9saW8sIHN0YXJ0ICsgSFBBR0VfUE1EX05SIC0gMSkge1xuIFx0XHRpZiAoeGFzX3JldHJ5KFx1MDAyNnhhcywgZm9saW8pKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTU6NDMuMDcyMzY5ODlaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTEwMTg2MTc4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEtodWdlcGFnZWQgUFRFIENoZWNraW5nIFJlZmFjdG9yKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYSBwYXRjaCB0aGF0IHRvdWNoZXMgYG1tL2todWdlcGFnZWQuY2AgYW5kIGBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RgLiBJbW1lZGlhdGVseSwgSSBzZWUgaXQncyBpbnRyb2R1Y2luZyBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB3aGljaCBpbmRpY2F0ZXMgYSByZWZhY3RvcmluZyBvZiB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIHdpdGhpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBJdCBhbHNvIGJyaW5ncyBpbiBgY29sbGFwc2VfaXNfcmVmZXJlbmNlZCgpYCBhbmQgYGNvdW50X2NvbGxhcHNlX2V2ZW50KClgLiBUaGlzIGlzIGFsbCBjbGVhcmx5IGZvY3VzZWQgb24gY2xlYW5pbmcgdXAgYW5kIHBvdGVudGlhbGx5IG9wdGltaXppbmcgdGhlIGtodWdlcGFnZWQgY29tcG9uZW50LCBwYXJ0aWN1bGFybHkgdGhhdCBjcnVjaWFsIFBURSB2YWxpZGF0aW9uLlxuXG5HaXZlbiB0aGF0IGBtbS9raHVnZXBhZ2VkLmNgIGRlYWxzIHdpdGggY29yZSBrZXJuZWwgZnVuY3Rpb25hbGl0eSDigJMgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSDigJMgYW5kIFRIUCBpcyBhIGZhaXJseSBzdGFuZGFyZCBmZWF0dXJlIHdpdGgga2h1Z2VwYWdlZCBjb25zdGFudGx5IHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQsIEkgbmVlZCB0byB0cmVhdCB0aGlzIGNoYW5nZSB3aXRoIGNvbnNpZGVyYWJsZSBjYXJlLiBJdCdzIGRlZmluaXRlbHkgcmVhY2hhYmxlLlxuXG5MZXQncyBicmVhayBkb3duIHRoZSBzcGVjaWZpYyBmdW5jdGlvbiBjaGFuZ2VzLiBJJ20gc2VlaW5nIG1vZGlmaWNhdGlvbnMgdG86XG4qICAgYF9fa2h1Z2VwYWdlZF9leGl0YCAoY29tbWVudCBjaGFuZ2UpXG4qICAgYGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuYCAobmV3KVxuKiAgIGBjb2xsYXBzZV9pc19yZWZlcmVuY2VkYCAobmV3KVxuKiAgIGBjb3VudF9jb2xsYXBzZV9ldmVudGAgKG5ldylcbiogICBgcHRlX2NoZWNrX2ZhaWxgIChuZXcpXG4qICAgYGNvbGxhcHNlX2NoZWNrX3B0ZWAgKG5ldylcbiogICBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgKG1vZGlmaWVkKVxuKiAgIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAgKGNvbW1lbnQgY2hhbmdlKVxuKiAgIGBhbGxvY19jaGFyZ2VfZm9saW9gIChtb2RpZmllZClcbiogICBgY29sbGFwc2VfaHVnZV9wYWdlYCAobW9kaWZpZWQpXG4qICAgYGNvbGxhcHNlX3NjYW5fcG1kYCAobW9kaWZpZWQpXG4qICAgYGNvbGxhcHNlX3NjYW5fZmlsZWAgKG1vZGlmaWVkKVxuXG5UaGUgbW9kaWZpZWQgZnVuY3Rpb25zIGFyZSB0aGUgb25lcyB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBoaWdoZXN0IHNjcnV0aW55LiBJJ20gZm9jdXNpbmcgb24gZnV6emluZyB0aGVzZSBhcmVhczogYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLCBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgY29sbGFwc2Vfc2Nhbl9maWxlYCwgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLlxuXG5Gcm9tIGEgY29uZmlndXJhdGlvbiBwZXJzcGVjdGl2ZSwgSSdsbCBkZWZpbml0ZWx5IGJlIGVuYWJsaW5nIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGFuZCBwcm9iYWJseSBsZWFuaW5nIHRvd2FyZCBlaXRoZXIgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VgIG9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIHRvIGZ1bGx5IGV4ZXJjaXNlIHRoZSBjaGFuZ2VzIGR1cmluZyB0ZXN0aW5nLlxuXG5Ob3csIGxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSBLY29uZmlnIGZpbGUgdG8gY29uZmlybSBzb21lIGFzc3VtcHRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDA4MCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2MywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU1OjU0LjE3NDIzNDgyMVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjM3MDIwMzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2h1Z2VwYWdlZFxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSArPSBtaWdyYXRlX2RldmljZS5vXFxubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgKz0gaHVnZV9tZW1vcnkubyBraHVnZXBhZ2VkLm9cXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgKz0gcGFnZV9jb3VudGVyLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTU6NTQuNzM3OTQ0ODc4WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM5MjA3Njg0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gQ29uc2lkZXJhdGlvbnMqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgaW1tZWRpYXRlIG5lZWQgaXMgZGVmaW5pdGVseSBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gVGhhdCBtdWNoIGlzIGNsZWFyLiBCdXQgYXMgd2UncmUgZGlnZ2luZyBpbnRvIHRoaXMsIEkga25vdyB3ZSBjYW4ndCBzdG9wIHRoZXJlLiBNeSBpbnRlcm5hbCBjaGVja2xpc3QgaW1tZWRpYXRlbHkganVtcHMgdG86IHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIG1pZ2h0IGJlIHJlbGV2YW50IG9yIGltcGFjdGVkPyBUaGlzIHNpdHVhdGlvbiBpcyByYXJlbHkgaXNvbGF0ZWQuIEkgbmVlZCB0byBxdWlja2x5IGlkZW50aWZ5IGFueSBkZXBlbmRlbmNpZXMsIGNvbmZsaWN0cywgb3IgY29tcGxlbWVudGFyeSBmZWF0dXJlcyB0aGF0IEkgc2hvdWxkIGJlIGF3YXJlIG9mIGFuZCBjaGVjayBvdXQgdG8gbWFrZSBzdXJlIG15IGZpbmFsIGNvbmZpZyBpcyBzZXQgdXAgb3B0aW1hbGx5LiBXZSBhbGwga25vdyBob3cgZWFzeSBpdCBpcyB0byBtaXNzIHNvbWV0aGluZyBhbmQgZW5kIHVwIHdpdGggYSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrIG9yLCB3b3JzZSwgaW5zdGFiaWxpdHkuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBjb25maWcgbWVzaGVzIHdlbGwgd2l0aCBhbnkgZXhpc3RpbmcgYW5kL29yIGZ1dHVyZSBwbGFucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEyMDcsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NTo1OC4xMzAwMjU3OTVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTAwNDYyMDA1MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9ODM1PWNvbmZpZyBNTV9JRFxcbi0tXFxubW0vS2NvbmZpZy04MzctXFxubW0vS2NvbmZpZzo4Mzg6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODM5LVxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg1Nj1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODYxLVxcbm1tL0tjb25maWc6ODYyOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTg2My1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg2OC1cXG5tbS9LY29uZmlnOjg2OTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxcbm1tL0tjb25maWctODcwLVxcdFxcdGJvb2wgXFxcIm1hZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg3Ny1cXG5tbS9LY29uZmlnOjg3ODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg3OS1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODg1PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04OTQtXFxubW0vS2NvbmZpZzo4OTU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg5Ni1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTA0LVxcbm1tL0tjb25maWc6OTA1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTA2LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTEyLVxcbm1tL0tjb25maWc6OTEzOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05MTQtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkyMC1cXG5tbS9LY29uZmlnOjkyMTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTkyMi1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTkzMD1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctOTM5LVxcbm1tL0tjb25maWc6OTQwOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05NDEtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0OC1cXG5tbS9LY29uZmlnOjk0OTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTk1MC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk1Ni1cXG5tbS9LY29uZmlnOjk1NzpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTU4LVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NjQtXFxubW0vS2NvbmZpZzo5NjU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05NjYtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NjowMy4xMzQ2NTIzNDdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MjgzNjgyNDU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBIdWdlIFBhZ2UgQ29sbGFwc2UgT3B0aW1pemF0aW9uKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIEkgbmVlZCB0byBhZGQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU2AgdG8gdGhlIGBFbmFibGVDb25maWdzYC4gVGhhdCBzZWVtcyBsaWtlIHRoZSByaWdodCBtb3ZlLCBnaXZlbiB3aGF0IEknbSB0cnlpbmcgdG8gYWNoaWV2ZS5cblxuTm93LCBsZXQncyBqdXN0IG1ha2Ugc3VyZSBJJ3ZlIGdvdCBteSBoZWFkIGFyb3VuZCB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGFmZmVjdGVkIGJ5IHRoZXNlIGNoYW5nZXMuIEkndmUgZ290OiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBjb2xsYXBzZV9zY2FuX2ZpbGVgLCBhbmQgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuXG5cblJpZ2h0LCBhbGwgb2YgdGhvc2UgYXJlIGVpdGhlciBzdGF0aWMgb3IgcGFydCBvZiBga2h1Z2VwYWdlZGAuIE9rYXksIGFyZSBhbnkgb2YgdGhlc2UgaW4gYSBob3QgcGF0aD8gSSBoYXZlIHRvIGNvbnNpZGVyIHRoZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXMgY2FsbGVkIGJ5IGBraHVnZXBhZ2VkYCwgYSBiYWNrZ3JvdW5kIHRocmVhZCwgc28gaXQncyBub3QgYSBkaXJlY3Qgc3lzY2FsbCBob3RwYXRoLCBidXQgaXQgKmRvZXMqIHNjYW4gbWVtb3J5LCB3aGljaCBpcyBpbXBvcnRhbnQuIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGlzIGFsc28gY2FsbGVkIGJ5IGBraHVnZXBhZ2VkYC4gQW5kIHRoZW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGlzIGNhbGxlZCBieSBib3RoIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGFuZCBgbWFkdmlzZV9jb2xsYXBzZWAuIE5lZWQgdG8gY2hlY2sgYG1hZHZpc2VfY29sbGFwc2VgLiBUaGF0J3MgYSBjcml0aWNhbCBwYXRoLCBzbyBtdXN0IHRha2UgY2FyZSB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIxNDAsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MDguNDE4MzM3NTczWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNjgyOTUwNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9NzQ3PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy04MTItXFxubW0va2h1Z2VwYWdlZC5jOjgxMzpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2todWdlcGFnZWQuYy04MTQtXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9OTk2PXN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAxMy1cXHQgKiBSZWxlYXNlIGJvdGggcmF3IGFuZCBjb21wb3VuZCBwYWdlcyBpc29sYXRlZFxcbm1tL2todWdlcGFnZWQuYzoxMDE0OlxcdCAqIGluIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUuXFxubW0va2h1Z2VwYWdlZC5jLTEwMTUtXFx0ICovXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTM3Nj1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNDc3LVxcdGlmIChwdGUpIHtcXG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcXHRcXHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHZtYSwgc3RhcnRfYWRkciwgcHRlLCBjYyxcXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICBvcmRlciwgXFx1MDAyNmNvbXBvdW5kX3BhZ2VsaXN0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MDguNjQ1MTc1MDE4WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTc1Mjg5NTkzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRoZSBleHBlcnQ6XG5cbioqVHJhY2luZyB0aGUgSHVnZSBQYWdlIENvbGxhcHNlKipcblxuT2theSwgc28gbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGlzIHRoZSByZWFsIHdvcmtob3JzZSBoZXJlLCBjYWxsZWQgYnkgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIFJpZ2h0LCB0aGF0J3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3cgdGhlIHF1ZXN0aW9uIGlzLCB3aGF0IHRyaWdnZXJzIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGl0c2VsZj8gSXQgbG9va3MgbGlrZSB0aGUgdHdvIHByaW1hcnkgcGF0aHMgYXJlIGBraHVnZXBhZ2VkX3NjYW5fcG1kYCDigJMgdGhlIGtlcm5lbCdzIGh1Z2UgcGFnZSBtYW5hZ2VtZW50IGRhZW1vbiDigJMgYW5kIHBvdGVudGlhbGx5IGBtYWR2aXNlX2NvbGxhcHNlYCB3aGljaCBpcyByZWxhdGVkIHRvIHVzZXJzcGFjZSBwYWdlIGFkdmlzb3J5LiBJIG5lZWQgdG8gY29uZmlybSB0aGF0LiBUaGVyZWZvcmUsIEkgc2hvdWxkIHN0YXJ0IGJ5IGRpZ2dpbmcgaW50byB0aGUgY2FsbGluZyBjb250ZXh0cyBvZiBgY29sbGFwc2VfaHVnZV9wYWdlYCBkaXJlY3RseS4gVGhhdCdsbCBnaXZlIG1lIGEgY2xlYXJlciBwaWN0dXJlIG9mIGhvdyB0aGVzZSBodWdlIHBhZ2VzIGFyZSBiZWluZyB0YXJnZXRlZCBmb3IgY29sbGFwc2UuIFRpbWUgdG8gZGl2ZSBpbnRvIHRoZSBzb3VyY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMDE0LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MTQuMzk4MDc1MDU0WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDAxNjU4NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29sbGFwc2VfaHVnZV9wYWdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2todWdlcGFnZWQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9NzQ3PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy04MTItXFxubW0va2h1Z2VwYWdlZC5jOjgxMzpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2todWdlcGFnZWQuYy04MTQtXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtOTIwLVxcdFxcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcXG5tbS9raHVnZXBhZ2VkLmM6OTIxOlxcdFxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbm1tL2todWdlcGFnZWQuYy05MjItXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTkyNi1cXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcXG5tbS9raHVnZXBhZ2VkLmM6OTI3OlxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbm1tL2todWdlcGFnZWQuYy05MjgtXFx0XFx0XFx0XFx0XFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTkzMS1cXG5tbS9raHVnZXBhZ2VkLmM6OTMyOnN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfc3VjY2VlZGVkKHB0ZV90ICpwdGUsXFxubW0va2h1Z2VwYWdlZC5jLTkzMy1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTk5NS1cXG5tbS9raHVnZXBhZ2VkLmM6OTk2OnN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXFxubW0va2h1Z2VwYWdlZC5jLTk5Ny1cXHRcXHRwbWRfdCAqcG1kLCBwbWRfdCBvcmlnX3BtZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAxMy1cXHQgKiBSZWxlYXNlIGJvdGggcmF3IGFuZCBjb21wb3VuZCBwYWdlcyBpc29sYXRlZFxcbm1tL2todWdlcGFnZWQuYzoxMDE0OlxcdCAqIGluIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUuXFxubW0va2h1Z2VwYWdlZC5jLTEwMTUtXFx0ICovXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAxOS0vKlxcbm1tL2todWdlcGFnZWQuYzoxMDIwOiAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHkgLSBhdHRlbXB0cyB0byBjb3B5IG1lbW9yeSBjb250ZW50cyBmcm9tIHJhd1xcbm1tL2todWdlcGFnZWQuYy0xMDIxLSAqIHBhZ2VzIHRvIGEgaHVnZXBhZ2UuIENsZWFucyB1cCB0aGUgcmF3IHBhZ2VzIGlmIGNvcHlpbmcgc3VjY2VlZHM7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAzMy0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MTAzNDpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZV90ICpwdGUsIHN0cnVjdCBmb2xpbyAqZm9saW8sXFxubW0va2h1Z2VwYWdlZC5jLTEwMzUtXFx0XFx0cG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwNjMtXFx0aWYgKGxpa2VseShyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSlcXG5tbS9raHVnZXBhZ2VkLmM6MTA2NDpcXHRcXHRfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X3N1Y2NlZWRlZChwdGUsIHZtYSwgYWRkcmVzcywgcHRsLFxcbm1tL2todWdlcGFnZWQuYy0xMDY1LVxcdFxcdFxcdFxcdFxcdFxcdCAgICBvcmRlciwgY29tcG91bmRfcGFnZWxpc3QpO1xcbm1tL2todWdlcGFnZWQuYy0xMDY2LVxcdGVsc2VcXG5tbS9raHVnZXBhZ2VkLmM6MTA2NzpcXHRcXHRfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGUsIHBtZCwgb3JpZ19wbWQsIHZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtMTA2OC1cXHRcXHRcXHRcXHRcXHRcXHQgb3JkZXIsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMjQ3LSAqL1xcbm1tL2todWdlcGFnZWQuYzoxMjQ4OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9raHVnZXBhZ2VkLmMtMTI0OS1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEzMzMtb3V0Olxcbm1tL2todWdlcGFnZWQuYzoxMzM0OlxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4obW0sIHN3YXBwZWRfaW4sIHJlZmVyZW5jZWQsIHJlc3VsdCxcXG5tbS9raHVnZXBhZ2VkLmMtMTMzNS1cXHRcXHRcXHRcXHRcXHQgICBvcmRlcik7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTMzOT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMzcwLS8qXFxubW0va2h1Z2VwYWdlZC5jOjEzNzE6ICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXFxubW0va2h1Z2VwYWdlZC5jLTEzNzItICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEzNzUtICovXFxubW0va2h1Z2VwYWdlZC5jOjEzNzY6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXFxubW0va2h1Z2VwYWdlZC5jLTEzNzctXFx0XFx0aW50IHJlZmVyZW5jZWQsIGludCB1bm1hcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE0MTctXFx0XFx0LypcXG5tbS9raHVnZXBhZ2VkLmM6MTQxODpcXHRcXHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcXG5tbS9raHVnZXBhZ2VkLmMtMTQxOS1cXHRcXHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNDIxLVxcdFxcdCAqL1xcbm1tL2todWdlcGFnZWQuYzoxNDIyOlxcdFxcdHJlc3VsdCA9IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihtbSwgdm1hLCBzdGFydF9hZGRyLCBwbWQsXFxubW0va2h1Z2VwYWdlZC5jLTE0MjMtXFx0XFx0XFx0XFx0XFx0XFx0ICAgICByZWZlcmVuY2VkLCBvcmRlcik7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTQ3Ny1cXHRpZiAocHRlKSB7XFxubW0va2h1Z2VwYWdlZC5jOjE0Nzg6XFx0XFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSh2bWEsIHN0YXJ0X2FkZHIsIHB0ZSwgY2MsXFxubW0va2h1Z2VwYWdlZC5jLTE0NzktXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgb3JkZXIsIFxcdTAwMjZjb21wb3VuZF9wYWdlbGlzdCk7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTUwOS1cXG5tbS9raHVnZXBhZ2VkLmM6MTUxMDpcXHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZSwgZm9saW8sIHBtZCwgX3BtZCxcXG5tbS9raHVnZXBhZ2VkLmMtMTUxMS1cXHRcXHRcXHRcXHRcXHQgICB2bWEsIHN0YXJ0X2FkZHIsIHB0ZV9wdGwsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTU1Ni1cXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbm1tL2todWdlcGFnZWQuYzoxNTU3OlxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZShtbSwgcmVzdWx0ID09IFNDQU5fU1VDQ0VFRCwgcmVzdWx0LCBvcmRlcik7XFxubW0va2h1Z2VwYWdlZC5jLTE1NTgtXFx0cmV0dXJuIHJlc3VsdDtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTYyMC1cXHRcXHRcXHRjb2xsYXBzZV9hZGRyZXNzID0gYWRkcmVzcyArIG9mZnNldCAqIFBBR0VfU0laRTtcXG5tbS9raHVnZXBhZ2VkLmM6MTYyMTpcXHRcXHRcXHRyZXQgPSBjb2xsYXBzZV9odWdlX3BhZ2UobW0sIGNvbGxhcHNlX2FkZHJlc3MsIHJlZmVyZW5jZWQsXFxubW0va2h1Z2VwYWdlZC5jLTE2MjItXFx0XFx0XFx0XFx0XFx0XFx0IHVubWFwcGVkLCBjYywgb3JkZXIpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTgwNS1cXHRpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkge1xcbm1tL2todWdlcGFnZWQuYzoxODA2OlxcdFxcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cXG5tbS9raHVnZXBhZ2VkLmMtMTgwNy1cXHRcXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MTQuNTM4MjUxMzMxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMTgyNDEwNDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZTpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBgY29sbGFwc2VfaHVnZV9wYWdlYCBDYWxsIENoYWluKipcblxuUmlnaHQsIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCB0cnlpbmcgdG8gdHJhY2UgdGhlIGV4ZWN1dGlvbiBwYXRoLiBJIHNlZSB0aGF0IGBjb2xsYXBzZV9odWdlX3BhZ2VgIGlzIGJlaW5nIGludm9rZWQgYnkgYG10aHBfY29sbGFwc2VgLCBhbmQgdGhhdCBpbiB0dXJuIGlzIGNhbGxlZCBieSBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBUaGF0J3MgYSBwcmV0dHkgY2xlYXIgY2hhaW4sIGVhc3kgZW5vdWdoIHRvIGZvbGxvdy4gTm93LCB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoZXRoZXIgb3Igbm90IGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhbHNvIGNhbGxpbmcgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIEkgbmVlZCB0byBjb25maXJtIGlmIGl0IGhhcyBpdHMgb3duIHBhdGggdG8gaXQsIG9yIGlmIGl0IGlzIHJlbGlhbnQgb24gdGhpcyBleGlzdGluZyBwYXRoLiBJIHdhbnQgdG8gZG91YmxlLWNoZWNrIHRoYXQ7IHRoZXJlIGNvdWxkIGJlIHNvbWUgYXNzdW1wdGlvbnMgYmVpbmcgbWFkZSB0aGF0IGFyZW4ndCBxdWl0ZSBjb3JyZWN0LCBvciBtYXliZSBzb21lIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZW1lcmdpbmcgZnJvbSB0aGlzIHBhcnRpY3VsYXIgY2FsbC4gSSBiZXR0ZXIgZ28gYW5kIGNoZWNrIHRoZSBjcm9zcy1yZWZlcmVuY2VzIGZvciBgY29sbGFwc2VfaHVnZV9wYWdlYCB0byBzZWUgaWYgYG1hZHZpc2VfY29sbGFwc2VgIGlzIGluZGVlZCBjYWxsaW5nIGl0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuIEl0J3MgYSBmdW5kYW1lbnRhbCBwYXJ0IG9mIHRoZSBvdmVyYWxsIGZsb3cgZm9yIG1hbmFnaW5nIGh1Z2UgcGFnZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MjczLCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MTkuNTU2NDk2NjkyWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDU0MTIyNTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWFkdmlzZV9jb2xsYXBzZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0va2h1Z2VwYWdlZC5jPTMxNzQ9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTc4LVxcbm1tL2todWdlcGFnZWQuYzozMTc5OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXFxubW0va2h1Z2VwYWdlZC5jLTMxODAte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyMTAtXFxubW0va2h1Z2VwYWdlZC5jOjMyMTE6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxubW0va2h1Z2VwYWdlZC5jLTMyMTItXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyOTgtXFx0cmV0dXJuIHRocHMgPT0gKChoZW5kIC0gaHN0YXJ0KSBcXHUwMDNlXFx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxcbm1tL2todWdlcGFnZWQuYzozMjk5OlxcdFxcdFxcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xcbm1tL2todWdlcGFnZWQuYy0zMzAwLX1cXG4tLVxcbm1tL21hZHZpc2UuYz0xMzM4PXN0YXRpYyBpbnQgbWFkdmlzZV92bWFfYmVoYXZpb3Ioc3RydWN0IG1hZHZpc2VfYmVoYXZpb3IgKm1hZHZfYmVoYXZpb3IpXFxuLS1cXG5tbS9tYWR2aXNlLmMtMTM2Mi1cXHRjYXNlIE1BRFZfQ09MTEFQU0U6XFxubW0vbWFkdmlzZS5jOjEzNjM6XFx0XFx0cmV0dXJuIG1hZHZpc2VfY29sbGFwc2Uodm1hLCByYW5nZS1cXHUwMDNlc3RhcnQsIHJhbmdlLVxcdTAwM2VlbmQsXFxubW0vbWFkdmlzZS5jLTEzNjQtXFx0XFx0XFx0XFx1MDAyNm1hZHZfYmVoYXZpb3ItXFx1MDAzZWxvY2tfZHJvcHBlZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjE5LjcwMTkxNDUxOVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NzMyNTA3MDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipJbml0aWFsIEFzc2Vzc21lbnQ6IE1BRFZfQ09MTEFQU0UgaXMgYSBUYXJnZXQqKlxuXG5BbHJpZ2h0LCBzbyBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBgbWFkdmlzZWAgd2l0aCB0aGUgYE1BRFZfQ09MTEFQU0VgIGZsYWcuIFRoYXQgbWFrZXMgaXQgaW1tZWRpYXRlbHkgaW50ZXJlc3RpbmcgZnJvbSBhIGZ1enppbmcgcGVyc3BlY3RpdmUuIEl0J3MgY29yZSBrZXJuZWwgY29kZSwgZGlyZWN0bHkgYWRkcmVzc2FibGUsIGFuZCByaXBlIGZvciBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eSBkaXNjb3ZlcnkuIEEgc3RyYWlnaHRmb3J3YXJkIHJvdXRlIHRvIHJlYWNoIGl0LiBHb29kLlxuXG5Ob3csIG15IG5leHQgc3RlcCBpcyBjbGVhcjogSSBuZWVkIHRvIGRlbHZlIGludG8gdGhlIGBtYWR2aXNlX2NvbGxhcHNlYCBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHRyYWNlIHRoZSBjb2RlIHBhdGgsIGlkZW50aWZ5IHRoZSBmdW5jdGlvbnMgaXQgY2FsbHMsIGFuZCB1bmRlcnN0YW5kIGl0cyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBLbm93aW5nIHdoYXQgaXQgdG91Y2hlcyBpcyBrZXkgdG8gY29uc3RydWN0aW5nIGVmZmVjdGl2ZSBmdXp6aW5nIHN0cmF0ZWdpZXMuIEdvdHRhIHVuZGVyc3RhbmQgdGhlIGVjb3N5c3RlbSB0aGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGhpbi4gRnJvbSB0aGVyZSwgSSBjYW4gZmlndXJlIG91dCB3aGF0IHBhcnRzIG9mIHRoZSBzeXN0ZW0gYXJlIG1vc3QgbGlrZWx5IHRvIGZhaWwgdW5kZXIgc3RyZXNzZnVsIGFuZCB1bmV4cGVjdGVkIGlucHV0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTk2OSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjI0LjQzNDQyNDIxN1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzg3NTAwODAxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1hZHZpc2VfY29sbGFwc2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0va2h1Z2VwYWdlZC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz0zMTc0PWJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMzE3OC1cXG5tbS9raHVnZXBhZ2VkLmM6MzE3OTpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxcbm1tL2todWdlcGFnZWQuYy0zMTgwLXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjEwLVxcbm1tL2todWdlcGFnZWQuYzozMjExOmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2todWdlcGFnZWQuYy0zMjEyLVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjk4LVxcdHJldHVybiB0aHBzID09ICgoaGVuZCAtIGhzdGFydCkgXFx1MDAzZVxcdTAwM2UgSFBBR0VfUE1EX1NISUZUKSA/IDBcXG5tbS9raHVnZXBhZ2VkLmM6MzI5OTpcXHRcXHRcXHQ6IG1hZHZpc2VfY29sbGFwc2VfZXJybm8obGFzdF9mYWlsKTtcXG5tbS9raHVnZXBhZ2VkLmMtMzMwMC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjI0LjgyMTkzMTk4OFoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODQ5MTU0NjI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQW5hbHl6aW5nIGBtYWR2aXNlX2NvbGxhcHNlYCdzIERlcGVuZGVuY3kgb24gSHVnZSBQYWdlIENvbGxhcHNlIE1lY2hhbmlzbXMqKlxuXG5BbHJpZ2h0LCBJJ20gZGl2aW5nIGludG8gdGhlIGBtYWR2aXNlX2NvbGxhcHNlYCBmdW5jdGlvbi4gTXkgcHJpbWFyeSBmb2N1cyByaWdodCBub3cgaXMgcGlucG9pbnRpbmcgaG93IGl0IGhhbmRsZXMgaHVnZSBwYWdlIGNvbGxhcHNlcy4gVGhlIHF1ZXN0aW9uIGlzLCBkb2VzIGBtYWR2aXNlX2NvbGxhcHNlYCBkaXJlY3RseSBsZXZlcmFnZSBlaXRoZXIgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgb3IgYGNvbGxhcHNlX3NjYW5fcG1kYD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdyBoZXJlLCBiZWNhdXNlIHRoYXQgd2lsbCBkaXJlY3RseSBhZmZlY3Qgb3VyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5IG1hbmFnZW1lbnQgc3RyYXRlZ3kuIFNwZWNpZmljYWxseSwgYXJlIHdlIGxvb2tpbmcgYXQgZGlyZWN0LCB0YXJnZXRlZCBjb2xsYXBzZXMgb3IgYSBtb3JlIHN3ZWVwaW5nIHNjYW4tYmFzZWQgYXBwcm9hY2g/IE15IGdvYWwgaXMgdG8gcXVpY2tseSBhc2NlcnRhaW4gd2hldGhlciBgbWFkdmlzZV9jb2xsYXBzZWAgdHJpZ2dlcnMgZWl0aGVyIGZ1bmN0aW9uLCBhbmQgaWYgc28sIGhvdy4gVGhpcyBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIGFuZCBwb3RlbnRpYWwgaW50ZXJhY3Rpb24gd2l0aCBleGlzdGluZyBodWdlIHBhZ2UgY29uZmlndXJhdGlvbnMuIExldCdzIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NTIzLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MjguNjcxMDkwMjA1WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0MTU4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9raHVnZXBhZ2VkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzIxMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjMyMTE6XFx0aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuMzIxMjpcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXFxuMzIxMzpcXHR7XFxuMzIxNDpcXHRcXHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2M7XFxuMzIxNTpcXHRcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuMzIxNjpcXHRcXHR1bnNpZ25lZCBsb25nIGhzdGFydCwgaGVuZCwgYWRkcjtcXG4zMjE3OlxcdFxcdGVudW0gc2Nhbl9yZXN1bHQgbGFzdF9mYWlsID0gU0NBTl9GQUlMO1xcbjMyMTg6XFx0XFx0aW50IHRocHMgPSAwO1xcbjMyMTk6XFx0XFx0Ym9vbCBtbWFwX3VubG9ja2VkID0gZmFsc2U7XFxuMzIyMDpcXHRcXG4zMjIxOlxcdFxcdEJVR19PTih2bWEtXFx1MDAzZXZtX3N0YXJ0IFxcdTAwM2Ugc3RhcnQpO1xcbjMyMjI6XFx0XFx0QlVHX09OKHZtYS1cXHUwMDNldm1fZW5kIFxcdTAwM2MgZW5kKTtcXG4zMjIzOlxcdFxcbjMyMjQ6XFx0XFx0aWYgKCFjb2xsYXBzZV9wb3NzaWJsZSh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9GT1JDRURfQ09MTEFQU0UpKVxcbjMyMjU6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMzIyNjpcXHRcXG4zMjI3OlxcdFxcdGhzdGFydCA9IEFMSUdOKHN0YXJ0LCBIUEFHRV9QTURfU0laRSk7XFxuMzIyODpcXHRcXHRoZW5kID0gQUxJR05fRE9XTihlbmQsIEhQQUdFX1BNRF9TSVpFKTtcXG4zMjI5OlxcdFxcbjMyMzA6XFx0XFx0aWYgKGhzdGFydCBcXHUwMDNlPSBoZW5kKVxcbjMyMzE6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMzIzMjpcXHRcXG4zMjMzOlxcdFxcdGNjID0ga21hbGxvY19vYmooKmNjKTtcXG4zMjM0OlxcdFxcdGlmICghY2MpXFxuMzIzNTpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4zMjM2OlxcdFxcdGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkID0gZmFsc2U7XFxuMzIzNzpcXHRcXHRjYy1cXHUwMDNlcHJvZ3Jlc3MgPSAwO1xcbjMyMzg6XFx0XFxuMzIzOTpcXHRcXHRtbWdyYWIobW0pO1xcbjMyNDA6XFx0XFx0bHJ1X2FkZF9kcmFpbl9hbGwoKTtcXG4zMjQxOlxcdFxcbjMyNDI6XFx0XFx0Zm9yIChhZGRyID0gaHN0YXJ0OyBhZGRyIFxcdTAwM2MgaGVuZDsgYWRkciArPSBIUEFHRV9QTURfU0laRSkge1xcbjMyNDM6XFx0XFx0XFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuMzI0NDpcXHRcXG4zMjQ1OlxcdFxcdFxcdGlmIChtbWFwX3VubG9ja2VkKSB7XFxuMzI0NjpcXHRcXHRcXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4zMjQ3OlxcdFxcdFxcdFxcdG1tYXBfcmVhZF9sb2NrKG1tKTtcXG4zMjQ4OlxcdFxcdFxcdFxcdG1tYXBfdW5sb2NrZWQgPSBmYWxzZTtcXG4zMjQ5OlxcdFxcdFxcdFxcdCpsb2NrX2Ryb3BwZWQgPSB0cnVlO1xcbjMyNTA6XFx0XFx0XFx0XFx0cmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHIsIGZhbHNlLCBcXHUwMDI2dm1hLFxcbjMyNTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0IGNjLCBIUEFHRV9QTURfT1JERVIpO1xcbjMyNTI6XFx0XFx0XFx0XFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcXG4zMjUzOlxcdFxcdFxcdFxcdFxcdGxhc3RfZmFpbCA9IHJlc3VsdDtcXG4zMjU0OlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0X25vbG9jaztcXG4zMjU1OlxcdFxcdFxcdFxcdH1cXG4zMjU2OlxcdFxcbjMyNTc6XFx0XFx0XFx0XFx0aGVuZCA9IG1pbihoZW5kLCB2bWEtXFx1MDAzZXZtX2VuZCBcXHUwMDI2IEhQQUdFX1BNRF9NQVNLKTtcXG4zMjU4OlxcdFxcdFxcdH1cXG4zMjU5OlxcdFxcbjMyNjA6XFx0XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFxcdTAwMjZtbWFwX3VubG9ja2VkLCBjYyk7XFxuMzI2MTpcXHRcXG4zMjYyOlxcdFxcdFxcdHN3aXRjaCAocmVzdWx0KSB7XFxuMzI2MzpcXHRcXHRcXHRjYXNlIFNDQU5fU1VDQ0VFRDpcXG4zMjY0OlxcdFxcdFxcdGNhc2UgU0NBTl9QTURfTUFQUEVEOlxcbjMyNjU6XFx0XFx0XFx0XFx0Kyt0aHBzO1xcbjMyNjY6XFx0XFx0XFx0XFx0YnJlYWs7XFxuMzI2NzpcXHRcXHRcXHQvKiBXaGl0ZWxpc3RlZCBzZXQgb2YgcmVzdWx0cyB3aGVyZSBjb250aW51aW5nIE9LICovXFxuMzI2ODpcXHRcXHRcXHRjYXNlIFNDQU5fTk9fUFRFX1RBQkxFOlxcbjMyNjk6XFx0XFx0XFx0Y2FzZSBTQ0FOX1BURV9OT05fUFJFU0VOVDpcXG4zMjcwOlxcdFxcdFxcdGNhc2UgU0NBTl9QVEVfVUZGRDpcXG4zMjcxOlxcdFxcdFxcdGNhc2UgU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTpcXG4zMjcyOlxcdFxcdFxcdGNhc2UgU0NBTl9QQUdFX05VTEw6XFxuMzI3MzpcXHRcXHRcXHRjYXNlIFNDQU5fUEFHRV9DT1VOVDpcXG4zMjc0OlxcdFxcdFxcdGNhc2UgU0NBTl9QQUdFX0xPQ0s6XFxuMzI3NTpcXHRcXHRcXHRjYXNlIFNDQU5fUEFHRV9DT01QT1VORDpcXG4zMjc2OlxcdFxcdFxcdGNhc2UgU0NBTl9QQUdFX0xSVTpcXG4zMjc3OlxcdFxcdFxcdGNhc2UgU0NBTl9ERUxfUEFHRV9MUlU6XFxuMzI3ODpcXHRcXHRcXHRcXHRsYXN0X2ZhaWwgPSByZXN1bHQ7XFxuMzI3OTpcXHRcXHRcXHRcXHRicmVhaztcXG4zMjgwOlxcdFxcdFxcdGRlZmF1bHQ6XFxuMzI4MTpcXHRcXHRcXHRcXHRsYXN0X2ZhaWwgPSByZXN1bHQ7XFxuMzI4MjpcXHRcXHRcXHRcXHQvKiBPdGhlciBlcnJvciwgZXhpdCAqL1xcbjMyODM6XFx0XFx0XFx0XFx0Z290byBvdXRfbWF5YmVsb2NrO1xcbjMyODQ6XFx0XFx0XFx0fVxcbjMyODU6XFx0XFx0fVxcbjMyODY6XFx0XFxuMzI4NzpcXHRvdXRfbWF5YmVsb2NrOlxcbjMyODg6XFx0XFx0LyogQ2FsbGVyIGV4cGVjdHMgdXMgdG8gaG9sZCBtbWFwX2xvY2sgb24gcmV0dXJuICovXFxuMzI4OTpcXHRcXHRpZiAobW1hcF91bmxvY2tlZCkge1xcbjMyOTA6XFx0XFx0XFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XFxuMzI5MTpcXHRcXHRcXHRtbWFwX3JlYWRfbG9jayhtbSk7XFxuMzI5MjpcXHRcXHR9XFxuMzI5MzpcXHRvdXRfbm9sb2NrOlxcbjMyOTQ6XFx0XFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcXG4zMjk1OlxcdFxcdG1tZHJvcChtbSk7XFxuMzI5NjpcXHRcXHRrZnJlZShjYyk7XFxuMzI5NzpcXHRcXG4zMjk4OlxcdFxcdHJldHVybiB0aHBzID09ICgoaGVuZCAtIGhzdGFydCkgXFx1MDAzZVxcdTAwM2UgSFBBR0VfUE1EX1NISUZUKSA/IDBcXG4zMjk5OlxcdFxcdFxcdFxcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xcbjMzMDA6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NjoyOC42NzEzMzQwMjVaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTY2MjE5MDI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYG1hZHZpc2VfY29sbGFwc2VgIGFuZCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAqKlxuXG5Pa2F5LCBzbyBJIHNlZSBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgY2FsbGluZyBgY29sbGFwc2Vfc2luZ2xlX3BtZGAuIE5hdHVyYWxseSwgbXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZGl2ZSBpbnRvIGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF0J3MgZ29pbmcgb24gd2l0aGluIHRoYXQgZnVuY3Rpb24uICBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgdGhlIGVudHJ5IHBvaW50LCBidXQgYGNvbGxhcHNlX3NpbmdsZV9wbWRgIGlzIGNsZWFybHkgd2hlcmUgdGhlIGNvcmUgb3BlcmF0aW9uIGlzIGhhcHBlbmluZy4gSSBuZWVkIHRvIHRyYWNlIHRoZSBmbG93LCBzZWUgd2hhdCBkYXRhIHN0cnVjdHVyZXMgaXQncyBvcGVyYXRpbmcgb24sIGFuZCB1bmRlcnN0YW5kIHRoZSBsb2dpYyBiZWhpbmQgdGhlIGNvbGxhcHNlIG1lY2hhbmlzbS4gV2hhdCBhcmUgdGhlIHByZWNvbmRpdGlvbnM/IFdoYXQgYXJlIHRoZSBlZGdlIGNhc2VzPyBJJ20gYW50aWNpcGF0aW5nIHRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgaW50ZXJlc3Rpbmcgc3R1ZmYgaGFwcGVucywgc28gbGV0J3MgZ2V0IGludG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MTAxLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NjozNC4zMzM1MjkyOTNaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMjUwNzU4NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2xsYXBzZV9zaW5nbGVfcG1kXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2todWdlcGFnZWQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9MjcwMT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjgxMC0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MjgxMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcXG5tbS9raHVnZXBhZ2VkLmMtMjgxMi1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCAqbG9ja19kcm9wcGVkLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTI4Njg9c3RhdGljIHZvaWQgY29sbGFwc2Vfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwcm9ncmVzc19tYXgsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjkzOC1cXG5tbS9raHVnZXBhZ2VkLmM6MjkzOTpcXHRcXHRcXHQqcmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyxcXG5tbS9raHVnZXBhZ2VkLmMtMjk0MC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICB2bWEsIFxcdTAwMjZsb2NrX2Ryb3BwZWQsIGNjKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMjExPWludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyNTktXFxubW0va2h1Z2VwYWdlZC5jOjMyNjA6XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFxcdTAwMjZtbWFwX3VubG9ja2VkLCBjYyk7XFxubW0va2h1Z2VwYWdlZC5jLTMyNjEtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjM0LjQ2NjA0NDE3WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzOTU0NTk3MDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIEZ1bmN0aW9uICdjb2xsYXBzZV9zaW5nbGVfcG1kJyoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIGZ1bmN0aW9uLCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGl0cyBwdXJwb3NlIHdpdGhpbiB0aGUgYnJvYWRlciBjb250ZXh0LiBXaGF0J3MgaXRzIHJvbGU/IElzIGl0IGEgY29yZSBjb21wb25lbnQgb3IgYSB1dGlsaXR5IGZ1bmN0aW9uPyBCYXNlZCBvbiB0aGUgbmFtZSwgbXkgZ3Vlc3MgaXMgaXQncyBkZXNpZ25lZCB0byB0YWtlIGEgc2luZ2xlIFBNRCAocHJlc3VtYWJseSBhIFwiUGFydGlhbCBNb2RlIERlY29tcG9zaXRpb25cIiBvYmplY3Qgb3Igc2ltaWxhciwgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCkgYW5kIHJlZHVjZSBpdCwgb3IgXCJjb2xsYXBzZVwiIGl0LCBpbiBzb21lIHdheS4gVGhlIFwic2luZ2xlXCIgcGFydCBpcyBrZXk7IGl0IGhpbnRzIGF0IGVpdGhlciBhIGJhdGNoLXByb2Nlc3Npbmcgc2NlbmFyaW8gKHdoZXJlIHRoaXMgd291bGQgYmUgb25lIGl0ZXJhdGlvbikgb3IgYSBmdW5jdGlvbiBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIGluZGl2aWR1YWwgb3BlcmF0aW9ucy4gSSdsbCBuZWVkIHRvIGxvb2sgYXQgaXRzIGltcGxlbWVudGF0aW9uIG9yIGF0IGxlYXN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIHRvIGNvbmZpcm0gdGhpcy4gV2hhdCBhcmUgaXRzIGlucHV0cz8gV2hhdCdzIHRoZSBhbnRpY2lwYXRlZCBvdXRwdXQgZm9ybWF0PyBBcmUgdGhlcmUgYW55IHByZWNvbmRpdGlvbnMgaXQgZXhwZWN0cywgc3VjaCBhcyB0aGUgUE1EIGJlaW5nIGFscmVhZHkgcHJlcHJvY2Vzc2VkPyBBcmUgdGhlcmUgcG90ZW50aWFsIGVkZ2UgY2FzZXMgb3IgZXJyb3IgY29uZGl0aW9ucyBpdCdzIGRlc2lnbmVkIHRvIGhhbmRsZSwgb3IgZG9lcyBpdCBhc3N1bWUgY2VydGFpbiBkYXRhIHN0cnVjdHVyZXM/IEdldHRpbmcgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGlzIHRoZSBmaXJzdCBzdGVwIHRvd2FyZHMgdW5kZXJzdGFuZGluZyBpdHMgZnVuY3Rpb25hbGl0eSBhbmQgaG93IGl0IG1pZ2h0IGZpdCBpbnRvIGEgbGFyZ2VyIGRhdGEgYW5hbHlzaXMgcGlwZWxpbmUuIEknbSBrZWVuIHRvIHNlZSBpZiB0aGlzIGZ1bmN0aW9uIGlzIG9wdGltaXplZCBmb3Igc3BlZWQgb3IgZm9yIGNsYXJpdHksIG9yIGlmIGl0IG1ha2VzIGFueSBhc3N1bXB0aW9ucyBJIG5lZWQgdG8gYmUgYXdhcmUgb2YuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NjkxLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MzguODYxNTA2MTA1WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM3MjczMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9raHVnZXBhZ2VkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjgxMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjgxMTpcXHRzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcXG4yODEyOlxcdFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBib29sICpsb2NrX2Ryb3BwZWQsXFxuMjgxMzpcXHRcXHRcXHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuMjgxNDpcXHR7XFxuMjgxNTpcXHRcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuMjgxNjpcXHRcXHRib29sIHRyaWdnZXJlZF93YiA9IGZhbHNlO1xcbjI4MTc6XFx0XFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7XFxuMjgxODpcXHRcXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcXG4yODE5OlxcdFxcdHBnb2ZmX3QgcGdvZmY7XFxuMjgyMDpcXHRcXG4yODIxOlxcdFxcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XFxuMjgyMjpcXHRcXG4yODIzOlxcdFxcdGlmICh2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcXG4yODI0OlxcdFxcdFxcdHJlc3VsdCA9IGNvbGxhcHNlX3NjYW5fcG1kKG1tLCB2bWEsIGFkZHIsIGxvY2tfZHJvcHBlZCwgY2MpO1xcbjI4MjU6XFx0XFx0XFx0Z290byBlbmQ7XFxuMjgyNjpcXHRcXHR9XFxuMjgyNzpcXHRcXG4yODI4OlxcdFxcdGZpbGUgPSBnZXRfZmlsZSh2bWEtXFx1MDAzZXZtX2ZpbGUpO1xcbjI4Mjk6XFx0XFx0cGdvZmYgPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIGFkZHIpO1xcbjI4MzA6XFx0XFxuMjgzMTpcXHRcXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG4yODMyOlxcdFxcdCpsb2NrX2Ryb3BwZWQgPSB0cnVlO1xcbjI4MzM6XFx0cmV0cnk6XFxuMjgzNDpcXHRcXHRyZXN1bHQgPSBjb2xsYXBzZV9zY2FuX2ZpbGUobW0sIGFkZHIsIGZpbGUsIHBnb2ZmLCBjYyk7XFxuMjgzNTpcXHRcXG4yODM2OlxcdFxcdC8qXFxuMjgzNzpcXHRcXHQgKiBGb3IgTUFEVl9DT0xMQVBTRSwgd2hlbiBlbmNvdW50ZXJpbmcgZGlydHkgcGFnZXMsIHRyeSB0byB3cml0ZWJhY2ssXFxuMjgzODpcXHRcXHQgKiB0aGVuIHJldHJ5IHRoZSBjb2xsYXBzZSBvbmUgdGltZS5cXG4yODM5OlxcdFxcdCAqL1xcbjI4NDA6XFx0XFx0aWYgKCFjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCBcXHUwMDI2XFx1MDAyNiByZXN1bHQgPT0gU0NBTl9QQUdFX0RJUlRZX09SX1dSSVRFQkFDSyBcXHUwMDI2XFx1MDAyNlxcbjI4NDE6XFx0XFx0ICAgICF0cmlnZ2VyZWRfd2IgXFx1MDAyNlxcdTAwMjYgbWFwcGluZ19jYW5fd3JpdGViYWNrKGZpbGUtXFx1MDAzZWZfbWFwcGluZykpIHtcXG4yODQyOlxcdFxcdFxcdGNvbnN0IGxvZmZfdCBsc3RhcnQgPSAobG9mZl90KXBnb2ZmIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuMjg0MzpcXHRcXHRcXHRjb25zdCBsb2ZmX3QgbGVuZCA9IGxzdGFydCArIEhQQUdFX1BNRF9TSVpFIC0gMTtcXG4yODQ0OlxcdFxcbjI4NDU6XFx0XFx0XFx0ZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShmaWxlLVxcdTAwM2VmX21hcHBpbmcsIGxzdGFydCwgbGVuZCk7XFxuMjg0NjpcXHRcXHRcXHR0cmlnZ2VyZWRfd2IgPSB0cnVlO1xcbjI4NDc6XFx0XFx0XFx0Z290byByZXRyeTtcXG4yODQ4OlxcdFxcdH1cXG4yODQ5OlxcdFxcdGZwdXQoZmlsZSk7XFxuMjg1MDpcXHRcXG4yODUxOlxcdFxcdGlmIChyZXN1bHQgPT0gU0NBTl9QVEVfTUFQUEVEX0hVR0VQQUdFKSB7XFxuMjg1MjpcXHRcXHRcXHRtbWFwX3JlYWRfbG9jayhtbSk7XFxuMjg1MzpcXHRcXHRcXHRpZiAoY29sbGFwc2VfdGVzdF9leGl0X29yX2Rpc2FibGUobW0pKVxcbjI4NTQ6XFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9BTllfUFJPQ0VTUztcXG4yODU1OlxcdFxcdFxcdGVsc2VcXG4yODU2OlxcdFxcdFxcdFxcdHJlc3VsdCA9IHRyeV9jb2xsYXBzZV9wdGVfbWFwcGVkX3RocChtbSwgYWRkcixcXG4yODU3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIWNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkKTtcXG4yODU4OlxcdFxcdFxcdGlmIChyZXN1bHQgPT0gU0NBTl9QTURfTUFQUEVEKVxcbjI4NTk6XFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xcbjI4NjA6XFx0XFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjM4Ljg2MTg4MTUxNVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTUyOTA0NzE3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbjogVEhQIENvbGxhcHNlKipcblxuT2theSwgc28gYGNvbGxhcHNlX3NpbmdsZV9wbWRgIGlzIHRoZSBrZXksIGFuZCBpdCBjYWxscyBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgY29sbGFwc2Vfc2Nhbl9maWxlYC4gR29vZC4gV2Uga25vdyB0aG9zZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBUaGF0IG1lYW5zIHRoaXMgaXMgYWxsIHJlYWNoYWJsZSB0aHJvdWdoIGBtYWR2aXNlKC4uLiwgTUFEVl9DT0xMQVBTRSlgICphbmQqIHRoZSBiYWNrZ3JvdW5kIGBraHVnZXBhZ2VkYCBkYWVtb24uIFBlcmZlY3QuIFRoYXQncyBhIHNvbGlkIGF0dGFjayBzdXJmYWNlIGZvciBmdXp6aW5nLiBUaGlzIGlzIGRlZmluaXRlbHkgd29ydGggcHVyc3VpbmcuXG5cbkxldCdzIHF1aWNrbHkgcmVjYXAgd2hhdCdzIGNoYW5nZWQ6XG5cbiogICBXZSdyZSBsb29raW5nIGF0IG1vZGlmaWNhdGlvbnMgdG8gYG1tL2todWdlcGFnZWQuY2AuXG4qICAgQW5kIHRoZSBkb2N1bWVudGF0aW9uIHVwZGF0ZSBpbiBgRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0YCBwcm92aWRlcyBjb250ZXh0LlxuXG5Fc3NlbnRpYWxseSwgdGhlIGNoYW5nZXMgcmVzdHJ1Y3R1cmUgdGhlIFBURS1jaGVja2luZyBsb2dpYyB3aXRoaW4gYGtodWdlcGFnZWRgLiBUaGV5J3ZlIGNyZWF0ZWQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBhbmQgdGhlIGBwdGVfY2hlY2tfY29udGV4dGAgc3RydWN0LCByZWZhY3RvcmluZyBob3cgYm90aCBhbm9ueW1vdXMgYW5kIGZpbGUtYmFja2VkIFRIUCBjb2xsYXBzZSB3b3JrLlxuXG5TbyB0aGUgbWFpbiBzeW1ib2xzIHRvIGZvY3VzIG9uIGFyZTpcblxuKiAgIGBjb2xsYXBzZV9jaGVja19wdGVgICh0aGF0IG5ldyBoZWxwZXIpXG4qICAgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgXG4qICAgYGNvbGxhcHNlX3NjYW5fcG1kYFxuKiAgIGBjb2xsYXBzZV9zY2FuX2ZpbGVgXG4qICAgYGNvbGxhcHNlX2h1Z2VfcGFnZWBcbiogICBgbWFkdmlzZV9jb2xsYXBzZWBcblxuTm93LCBsZXQncyBuYWlsIGRvd24gdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9ucyB0byB0ZXN0IHRoaXMgZWZmZWN0aXZlbHkuIFdlIG5lZWQ6XG5cbiogICBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgXG4qICAgRWl0aGVyIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIG9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFYC5cblxuSnVzdCB0byBiZSB0aG9yb3VnaCwgYXJlIHRoZXJlIGFueSAqb3RoZXIqIHJlbGF0ZWQgY29uZmlncyB3ZSBzaG91bGQgYmUgYXdhcmUgb2Y/IExldCdzIGNoZWNrIGBDT05GSUdfUkVBRF9PTkxZX1RIUF9GT1JfRlNgLi4uIE1pZ2h0IGJlIHdvcnRoIGEgcXVpY2sgbG9vayBpbiBgbW0vS2NvbmZpZ2AgdG8gc2VlIGlmIHRoZXJlJ3MgYW55dGhpbmcgZWxzZSB0aGF0J3MgcmVsZXZhbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5ODU5LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzE2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6NTAuMzkwOTMxODc2WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjEyODExNjUsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlJFQURfT05MWV9USFBfRk9SX0ZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6NTAuNjEyMjIxNjQxWiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzMzIzNzQxMzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gSHVudGluZyoqXG5cblJpZ2h0LCBzbyBJJ20gdHJ5aW5nIHRvIHRyYWNrIGRvd24gdGhpcyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBJdCdzIGNvbWluZyB0byBtZSB0aGF0IEkgbWlnaHQgYmUgZGVhbGluZyB3aXRoIGFuIG9sZGVyIGtlcm5lbCB2ZXJzaW9uIHdoZXJlIGl0IHdhcyBzcGVjaWZpY2FsbHkgbGFiZWxsZWQgYXMgYENPTkZJR19SRUFEX09OTFlfVEhQX0ZPUl9GU2AsIG9yIHNvbWV0aGluZyBzaW1pbGFyLiBNb3JlIGxpa2VseSwgYW5kIG1vcmUgY29udGVtcG9yYXJ5LCBJJ20gcHJvYmFibHkgbG9va2luZyBmb3Igc2ltcGx5IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEkga25vdyB0aGVzZSB0aGluZ3MgdGVuZCB0byBldm9sdmUuXG5cbkJlc3QgYmV0IGlzIHRvIGRpdmUgaW50byB0aGUgS2NvbmZpZyBmaWxlcywgc3BlY2lmaWNhbGx5IGBtbS9LY29uZmlnYC4gVGhhdCdzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCwgYW5kIHRoZSBUSFAtcmVsYXRlZCBzdHVmZiAqaGFzKiB0byBiZSBpbiB0aGVyZS4gVGltZSB0byBjb25maXJtIG15IGFzc3VtcHRpb25zIGFuZCBuYWlsIGRvd24gdGhlIHByZWNpc2UgbmFtZSwgcG90ZW50aWFsIGRlcGVuZGVuY2llcywgYW5kIGRlZmF1bHQgc2V0dGluZ3MuIEl0J3MgZnJ1c3RyYXRpbmcgd2hlbiB0aGVzZSBvcHRpb25zIGdldCByZW5hbWVkLiBJIGp1c3QgbmVlZCB0byBnZXQgdGhlIHJpZ2h0IG5vbWVuY2xhdHVyZSBzdHJhaWdodCBzbyBJIGNhbiBwcm9jZWVkIHdpdGggdGhlIHRhc2sgYXQgaGFuZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA2NDcsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1Njo1NC45NDQ2MDA0OThaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MDQ4NTg2NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcuKlRIUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04MTM9Y29uZmlnIEFSQ0hfV0FOVF9HRU5FUkFMX0hVR0VUTEJcXG4tLVxcbm1tL0tjb25maWctODE1LVxcbm1tL0tjb25maWc6ODE2OmNvbmZpZyBBUkNIX1dBTlRTX1RIUF9TV0FQXFxubW0vS2NvbmZpZy04MTctXFx0ZGVmX2Jvb2wgblxcbi0tXFxubW0vS2NvbmZpZz05NzI9ZW5kY2hvaWNlXFxubW0vS2NvbmZpZy05NzMtXFxubW0vS2NvbmZpZzo5NzQ6Y29uZmlnIFRIUF9TV0FQXFxubW0vS2NvbmZpZy05NzUtXFx0ZGVmX2Jvb2wgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1Njo1NS4xMjUwOTMwMDRaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTUxOTE1OTQ1MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIFRIUCBDb2xsYXBzZSBSZWZhY3RvcmluZyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSB0YXJnZXQgaXMgdGhlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgZnVuY3Rpb25hbGl0eSDigJMgdGhhdCdzIHRoZSBjb3JlIGFyZWEgb2YgaW50ZXJlc3QuIEknbSBmb2N1c2luZyBvbiB0aGUgY2hhbmdlcyByZWxhdGVkIHRvIGh1Z2UgcGFnZSBjb2xsYXBzZSwgYW5kIHNwZWNpZmljYWxseSwgaG93IHRoaXMgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgKFBhZ2UgVGFibGUgRW50cnkpIGNoZWNraW5nIGxvZ2ljLlxuXG5GaXJzdCwgSSBpZGVudGlmaWVkIGBtYWR2aXNlX2NvbGxhcHNlYCBhcyBhIGtleSBlbnRyeSBwb2ludCwgc2luY2UgaXQncyB0aGUgdXNlcnNwYWNlIHRyaWdnZXIgZm9yIHRoaXMgYmVoYXZpb3IuIFdoaWxlIGBraHVnZXBhZ2VkYCBoYW5kbGVzIHRoaXMgaW4gdGhlIGJhY2tncm91bmQsIGBtYWR2aXNlYCBnaXZlcyBhIG1vcmUgZGlyZWN0IHdheSB0byBoaXQgdGhpcyBjb2RlIGR1cmluZyBmdXp6aW5nLlxuXG5NeSBhbmFseXNpcyBsZWQgbWUgdG8gYSBmZXcga2V5IGZvY3VzIHN5bWJvbHMgdGhhdCBlbmNhcHN1bGF0ZSB0aGUgY29yZSBtb2RpZmljYXRpb25zLiBgY29sbGFwc2VfY2hlY2tfcHRlYCBpcyB0aGUgbmV3IGhlbHBlciBmdW5jdGlvbiBpbnRyb2R1Y2VkLCBhbmQgaXQgYXBwZWFycyB0byBiZSBjZW50cmFsIHRvIHRoZSBjaGFuZ2VzLCBzbyBJJ2xsIGJlIGtlZXBpbmcgYSB2ZXJ5IGNsb3NlIGV5ZSBvbiB0aGF0LiBUaGVuIHRoZXJlJ3MgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIHdoaWNoIHVzZXMgaXQsIGFsb25nIHdpdGggYGNvbGxhcHNlX3NjYW5fcG1kYCwgYGNvbGxhcHNlX3NjYW5fZmlsZWAgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLiAgSSdtIGFsc28gcGF5aW5nIGF0dGVudGlvbiB0byBgYWxsb2NfY2hhcmdlX2ZvbGlvYCBkdWUgdG8gaXRzIG1vZGlmaWNhdGlvbiB1c2luZyBgY291bnRfY29sbGFwc2VfZXZlbnRgLlxuXG5JIGNvbmZpcm1lZCB0aGF0IGBjb2xsYXBzZV9jaGVja19wdGVgIGlzIHN0YXRpYywgbWVhbmluZyBpdCBzaG91bGQgYmUgaW4gdGhlIHN5bWJvbCB0YWJsZSB1bmxlc3MgaW5saW5lZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgdHJhY2luZy4gYGNvbGxhcHNlX2lzX3JlZmVyZW5jZWRgIGlzIHN0YXRpYyBpbmxpbmUsIHNvIGl0IG1pZ2h0IGJlIGlubGluZWQuIGBjb3VudF9jb2xsYXBzZV9ldmVudGAgaXMgYWxzbyBzdGF0aWMsIHNvIGl0IHNob3VsZCBiZSBpbiB0aGUgc3ltYm9sIHRhYmxlLlxuXG5UaGVyZWZvcmUsIHRoZSBrZXkgc3ltYm9scyBJJ20gZm9jdXNpbmcgb24gYXJlOlxuKiAgIGBjb2xsYXBzZV9jaGVja19wdGVgXG4qICAgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgXG4qICAgYGNvbGxhcHNlX3NjYW5fcG1kYFxuKiAgIGBjb2xsYXBzZV9zY2FuX2ZpbGVgXG4qICAgYGNvbGxhcHNlX2h1Z2VfcGFnZWBcblxuTXkgcmVhc29uaW5nIGlzIHRoYXQgdGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIGR1cmluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgY29sbGFwc2UsIGludm9sdmluZyBuZXcgc3RydWN0dXJlcyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiBga2h1Z2VwYWdlZGAgYW5kIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuIEl0J3MgYSBmdW5kYW1lbnRhbCBjaGFuZ2UgdG8gaG93IHBhZ2VzIGFyZSBtYW5hZ2VkIGFuZCBjb2xsYXBzZWQgaW50byBUSFBzLCBhbmQgdGhhdCdzIHByZWNpc2VseSB3aGVyZSBteSBhdHRlbnRpb24gbGllcy5cblxuSW4gdGVybXMgb2YgY29uZmlndXJhdGlvbiwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCAoYW5kIHNwZWNpZmljYWxseSwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VgIHdoaWNoIGNvbnRyb2xzIHRoZSBgbWFkdmlzZWAgYmVoYXZpb3IpIHdpbGwgYmUgY3JpdGljYWwgdG8gcmVwcm9kdWNlIHRoaXMgYmVoYXZpb3IuIEl0IHNlZW1zIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIGlzIGFub3RoZXIgb3B0aW9uIHRoYXQgd29ya3MuXG5cbk9rYXksIGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEwODQsIk91dHB1dFRva2VucyI6MjExLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzQ0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU3OjEwLjMxNjY5MDIzNloiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMjM5MzM1NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvbGxhcHNlX2NoZWNrX3B0ZVwiLFxuICAgIFwiX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwiLFxuICAgIFwiY29sbGFwc2Vfc2Nhbl9wbWRcIixcbiAgICBcImNvbGxhcHNlX3NjYW5fZmlsZVwiLFxuICAgIFwiY29sbGFwc2VfaHVnZV9wYWdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvbGxhcHNlX2NoZWNrX3B0ZVwiLFxuICAgIFwiX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwiLFxuICAgIFwiY29sbGFwc2Vfc2Nhbl9wbWRcIixcbiAgICBcImNvbGxhcHNlX3NjYW5fZmlsZVwiLFxuICAgIFwiY29sbGFwc2VfaHVnZV9wYWdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflow4gscf[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-15 08:23:24 +0000 UTC FinishedAt: 2026-07-15 08:57:12 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "2ef7aa14db59fb1d5f562e6e425ef39509cb033b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "TRANSPARENT_HUGEPAGE_ALWAYS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "2ef7aa14db59fb1d5f562e6e425ef39509cb033b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "TRANSPARENT_HUGEPAGE_ALWAYS" ], "series_id": "9c681b44-9d52-4a6c-9a3a-04bb7151ca2e" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "collapse_check_pte", "__collapse_huge_page_isolate", "collapse_scan_pmd", "collapse_scan_file", "collapse_huge_page" ], "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+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvbGxhcHNlX2NoZWNrX3B0ZSYjMzQ7LAogICAgJiMzNDtfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX3NjYW5fcG1kJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX3NjYW5fZmlsZSYjMzQ7LAogICAgJiMzNDtjb2xsYXBzZV9odWdlX3BhZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5YjQ0YzY2NjE1MTYwOTM1YjgxZjI1ZjJiOGE0NGRkMTIwNTg3N2JiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBKdWwgMTUgMDg6NTU6NDAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5pbmRleCAxNmYzNzEzNWVkODBkZi4uYjE4N2Q2MTg0NTJmNDQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkXG4gKGVpdGhlciBvZiB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIG9yIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBhcmUgc2V0XG4gdG8gXCYjMzQ7YWx3YXlzXCYjMzQ7IG9yIFwmIzM0O21hZHZpc2VcJiMzNDspLCBhbmQgaXQmIzM5O2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlblxuIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlXG4tdG9wLWxldmVsIGNvbnRyb2wgYXJlIFwmIzM0O25ldmVyXCYjMzQ7KVxuJiM0Mzt0b3AtbGV2ZWwgY29udHJvbCBhcmUgXCYjMzQ7bmV2ZXJcJiMzNDspLlxuIFxuIHByb2Nlc3MgVEhQIGNvbnRyb2xzXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBAIC0zMDEsNyAmIzQzOzMwMSw5IEBAIGJlaW5nIHJlcGxhY2VkIGJ5IGEgUE1EIG1hcHBpbmcsIG9yICgyKSBwaHlzaWNhbCBwYWdlcyByZXBsYWNlZCBieSBvbmVcbiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LFxuIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci5cbiBBcyBzdWNoLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCByb3VnaGx5IGFzIGEgc2lnbiBvZiBwcm9ncmVzcyxcbi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6XG4mIzQzO2FuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcuXG4mIzQzO1Blci1vcmRlciBtVEhQIGNvbGxhcHNlIHN0YXRpc3RpY3MgYXJlIGFsc28gYXZhaWxhYmxlIHVuZGVyXG4mIzQzOy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy1cdTAwM2NzaXplXHUwMDNla0Ivc3RhdHMvKTo6XG4gXG4gXHQvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZFxuIFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xuaW5kZXggNTUxNTc1NjdkYzRjYzEuLjQwMTI1ZGNiNGRlOWQ2IDEwMDY0NFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9raHVnZXBhZ2VkLmNcbkBAIC02NCw2ICYjNDM7NjQsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7XG4gXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxuIH07XG4gXG4mIzQzO2VudW0gcHRlX2NoZWNrX3Jlc3VsdCB7XG4mIzQzO1x0UFRFX0NIRUNLX1NVQ0NFRUQsXG4mIzQzO1x0UFRFX0NIRUNLX0ZBSUwsXG4mIzQzO1x0UFRFX0NIRUNLX0NPTlRJTlVFLFxuJiM0Mzt9O1xuJiM0MztcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcbiAjaW5jbHVkZSBcdTAwM2N0cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaFx1MDAzZVxuIFxuQEAgLTExOCw2ICYjNDM7MTI0LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHtcbiBcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiB9O1xuIFxuJiM0MztzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuJiM0MztcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcbiYjNDM7XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRpbnQgbm9uZV9vcl96ZXJvO1xuJiM0MztcdGludCBzaGFyZWQ7XG4mIzQzO1x0aW50IHVubWFwcGVkO1xuJiM0MztcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7XG4mIzQzO307XG4mIzQzO1xuIC8qKlxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXG4gICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW5cbkBAIC02MjAsNyAmIzQzOzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHRcdC8qXG4gXHRcdCAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3RcbiBcdFx0ICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuXG4tXHRcdCAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuJiM0MztcdFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuIFx0XHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxuIFx0XHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXG4gXHRcdCAqL1xuQEAgLTYyOSw2ICYjNDM7NjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHR9XG4gfVxuIFxuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4mIzQzO3tcbiYjNDM7XHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4mIzQzO1x0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiBcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXG5AQCAtNjY1LDc2ICYjNDM7NjkyLDE1NiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcbiBcdH1cbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoKSAtIENoZWNrIGZvciBlbm91Z2ggcmVmZXJlbmNlZCBQVEVzIHRvIGp1c3RpZnkgY29sbGFwc2luZ1xuJiM0MzsgKlxuJiM0MzsgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlIHBhZ2UgaGFzIGJlZW5cbiYjNDM7ICogcmVjZW50bHkgYWNjZXNzZWQgKHlvdW5nIHB0ZSkgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gcmVjZW50bHkgYWNjZXNzZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgY29sbGFwc2VfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCxcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuJiM0MztcdFx0Zm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxuJiM0MztcdFx0bW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LFxuJiM0MztcdFx0ZW51bSBtdGhwX3N0YXRfaXRlbSBtdGhwX2V2ZW50KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4mIzQzO1x0XHRjb3VudF92bV9ldmVudCh2bV9ldmVudCk7XG4mIzQzO1x0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBtdGhwX2V2ZW50KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmRcbiYjNDM7ICogcmV0dXJuIFBURV9DSEVDS19GQUlMLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcbiYjNDM7XHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0KVxuJiM0Mzt7XG4mIzQzO1x0Y3R4LVx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcbiYjNDM7XHRyZXR1cm4gUFRFX0NIRUNLX0ZBSUw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIC0gQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlXG4mIzQzOyAqXG4mIzQzOyAqIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOlxuJiM0MzsgKiAtIG1heF9wdGVfKiB2YWx1ZXMgYXJlIG5vdCBleGNlZWRlZFxuJiM0MzsgKiAtIHVmZmQgaXMgbm90IGFjdGl2ZVxuJiM0MzsgKiAtIGxhenlmcmVlIHByb3BlcnRpZXMgYXJlIG5vdCBwcmVzZW50XG4mIzQzOyAqIC0gb25seSBhbm9ueW1vdXMgcGFnZXMgYXJlIHByZXNlbnRcbiYjNDM7ICpcbiYjNDM7ICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnRcbiYjNDM7ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUFRFX0NIRUNLX1NVQ0NFRUQgaWYgdGhlIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4mIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0ZBSUwgaWYgdGhlIFBURSBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbGxhcHNlLFxuJiM0MzsgKiAgICAgICAgIFBURV9DSEVDS19DT05USU5VRSBpZiB0aGUgc2NhbiBzaG91bGQgY29udGludWUgdG8gY2hlY2sgdGhlIG5leHQgUFRFLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcbiYjNDM7e1xuJiM0MztcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7Y3R4LVx1MDAzZW5vbmVfb3JfemVybyBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX25vbmUpIHtcbiYjNDM7XHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsXG4mIzQzO1x0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuJiM0MztcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbiYjNDM7XHRcdGlmIChjdHgtXHUwMDNldW5tYXBwZWQgPT0gLTEpXG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7Y3R4LVx1MDAzZXVubWFwcGVkIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xuJiM0MztcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbiYjNDM7XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuJiM0MztcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbiYjNDM7XHR9XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEb24mIzM5O3QgY29sbGFwc2UgaWYgYW55IG9mIHRoZSBzbWFsbCBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmRcbiYjNDM7XHQgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkXG4mIzQzO1x0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxuJiM0MztcdCAqIHJlZ2lzdGVyZWQgcmFuZ2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTtcbiYjNDM7XG4mIzQzO1x0Y3R4LVx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cdTAwM2V2bWEsIGFkZHIsIHB0ZXZhbCk7XG4mIzQzO1x0aWYgKHVubGlrZWx5KCFjdHgtXHUwMDNlZm9saW8pIHx8IHVubGlrZWx5KGZvbGlvX2lzX3pvbmVfZGV2aWNlKGN0eC1cdTAwM2Vmb2xpbykpKVxuJiM0MztcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbiYjNDM7XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGN0eC1cdTAwM2VjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKGN0eC1cdTAwM2V2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoY3R4LVx1MDAzZWZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKVxuJiM0MztcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSkge1xuJiM0MztcdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtXHUwMDNlZm9saW8pKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbiYjNDM7XHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuJiM0MztcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuJiM0MztcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2N0eC1cdTAwM2VzaGFyZWQgXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpIHtcbiYjNDM7XHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcbiYjNDM7XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXG4gXHRcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IGxpc3RfaGVhZCAqY29tcG91bmRfcGFnZWxpc3QpXG4ge1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKTtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKTtcbiBcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMO1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyO1xuLVx0cHRlX3QgKl9wdGU7XG4tXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XG4mIzQzO1x0cHRlX3QgKl9wdGUsIHB0ZXZhbDtcbiYjNDM7XHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4gXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiYjNDM7XHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xuJiM0MztcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XG4mIzQzO1x0XHQuY2MgPSBjYyxcbiYjNDM7XHRcdC52bWEgPSB2bWEsXG4mIzQzO1x0XHQub3JkZXIgPSBvcmRlcixcbiYjNDM7XHRcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24mIzM5O3QgY2hlY2sgc3dhcCBQVEVzICovXG4mIzQzO1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLFxuJiM0MztcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxuJiM0MztcdH07XG4gXG4gXHRmb3IgKF9wdGUgPSBwdGU7IF9wdGUgXHUwMDNjIHB0ZSAmIzQzOyBucl9wYWdlcztcbiBcdCAgICAgX3B0ZSYjNDM7JiM0MzssIGFkZHIgJiM0Mzs9IFBBR0VfU0laRSkge1xuLVx0XHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcbi1cdFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuLVx0XHRcdGlmICgmIzQzOyYjNDM7bm9uZV9vcl96ZXJvIFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcbi1cdFx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX05PTl9QUkVTRU5UO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0XHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xuLVx0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVx0XHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuLVx0XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xuJiM0MztcdFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4mIzQzO1x0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xuJiM0MztcdFx0Zm9saW8gPSBjdHguZm9saW87XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4mIzQzO1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiYjNDM7XHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovXG4tXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbi1cdFx0XHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcbi1cdFx0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4tXHRcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICgmIzQzOyYjNDM7c2hhcmVkIFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7XG4tXHRcdFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0XHR9XG4tXHRcdH1cbiBcdFx0LypcbiBcdFx0ICogVE9ETzogSW4gc29tZSBjYXNlcyBvZiBwYXJ0aWFsbHktbWFwcGVkIGZvbGlvcywgd2UmIzM5O2QgYWN0dWFsbHlcbiBcdFx0ICogd2FudCB0byBjb2xsYXBzZS5cbkBAIC03NTksNyAmIzQzOzg2Niw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHRcdC8qXG4gXHRcdCAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGVcbi1cdFx0ICogZm9saW8gY2FuJiMzOTt0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IFBHX2xvY2tcbiYjNDM7XHRcdCAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrXG4gXHRcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcbiBcdFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxuIFx0XHQgKi9cbkBAIC03ODYsNyAmIzQzOzg5Myw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdH1cbiBcbiBcdFx0Lypcbi1cdFx0ICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlXG4mIzQzO1x0XHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcbiBcdFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXG4gXHRcdCAqL1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xuQEAgLTgwMywxNCAmIzQzOzkxMCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmZvbGlvLVx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xuIG5leHQ6XG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4mIzQzO1x0XHRpZiAoY29sbGFwc2VfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSlcbiBcdFx0XHRyZWZlcmVuY2VkJiM0MzsmIzQzOztcbiBcdH1cbiBcbkBAIC04MTgsMTMgJiM0Mzs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcbiBcdH0gZWxzZSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbi1cdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbiYjNDM7XHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4mIzQzO1x0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuQEAgLTEwNzgsNyAmIzQzOzExNzgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbFxuIFx0XHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XG4gXHQvKlxuIFx0ICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuXG4tXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4mIzQzO1x0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYWNxdWlyZWQgdGhlIG1tYXBfbG9jay5cbiBcdCAqXG4gXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxuIFx0ICogdm1hcy5cbkBAIC0xMTM2LDcgJiM0MzsxMjM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY2hlY2tfcG1kX3N0aWxsX3ZhbGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIC8qXG4gICogQnJpbmcgbWlzc2luZyBwYWdlcyBpbiBmcm9tIHN3YXAsIHRvIGNvbXBsZXRlIFRIUCBjb2xsYXBzZS5cbi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxuJiM0MzsgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cbiAgKlxuICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2VcbiAgKiBmYXVsdGluZyBwYWdlcyBiYWNrIGluIGR1cmluZyBjb2xsYXBzZSBjb3VsZCByZS1wb3B1bGF0ZSBQVEVzIHRoYXRcbkBAIC0xMjQ3LDE1ICYjNDM7MTM0NywxMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIFx0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFx1MDAyNmNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiBcdGlmICghZm9saW8pIHtcbiBcdFx0KmZvbGlvcCA9IE5VTEw7XG4tXHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuLVx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuJiM0MztcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQsXG4mIzQzO1x0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4gXHRcdHJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMO1xuIFx0fVxuIFxuLVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XG4tXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4mIzQzO1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdC8qXG4gXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2Zcbi1cdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxuLVx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBQR19sb2NrLlxuJiM0MztcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2ggYW5kIHRoZSBWTVxuJiM0MztcdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgZm9saW8gbG9jay5cbiBcdCAqXG4gXHQgKiBVRkZESU9fTU9WRSBpcyBwcmV2ZW50ZWQgdG8gcmFjZSBhcyB3ZWxsIHRoYW5rcyB0byB0aGVcbiBcdCAqIG1tYXBfbG9jay5cbkBAIC0xNDM5LDcgJiM0MzsxNTM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdFx0XHRzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTtcbiBcdFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcbiBcdFx0bWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLFxuLVx0XHRcdFx0XHQgIC8qdWZmZF93cD0qLyBmYWxzZSk7XG4mIzQzO1x0XHRcdFx0XHQgIC8qdWZmZD0qLyBmYWxzZSk7XG4gXHRcdGlmIChwdGVfcHRsICE9IHBtZF9wdGwpXG4gXHRcdFx0c3Bpbl91bmxvY2socHRlX3B0bCk7XG4gXHR9XG5AQCAtMTQ0OSwxMCAmIzQzOzE1NDYsMTAgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcbiBcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbiBvdXRfdXBfd3JpdGU6XG4tXHRpZiAoYW5vbl92bWFfbG9ja2VkKVxuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLVx1MDAzZWFub25fdm1hKTtcbiBcdGlmIChwdGUpXG4gXHRcdHB0ZV91bm1hcChwdGUpO1xuJiM0MztcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4mIzQzO1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLVx1MDAzZWFub25fdm1hKTtcbiBcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcbiBvdXRfbm9sb2NrOlxuIFx0aWYgKGZvbGlvKVxuQEAgLTE1OTMsNDIgJiM0MzsxNjkwLDQ3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxuIFx0XHRib29sICpsb2NrX2Ryb3BwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYylcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuLVx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7XG4gXHRlbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLVx1MDAzZWlzX2todWdlcGFnZWQgPyBUVkFfS0hVR0VQQUdFRCA6IFRWQV9GT1JDRURfQ09MTEFQU0U7XG4gXHRwbWRfdCAqcG1kO1xuIFx0cHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDtcbiBcdGludCBpO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuLVx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiYjNDM7XHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4mIzQzO1x0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHI7XG4gXHR1bnNpZ25lZCBsb25nIGVuYWJsZWRfb3JkZXJzO1xuIFx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0aW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDtcbiYjNDM7XHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcbiYjNDM7XHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xuIFxuIFx0Vk1fQlVHX09OKHN0YXJ0X2FkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4gXG4mIzQzO1x0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcbiYjNDM7XHRcdC5jYyA9IGNjLFxuJiM0MztcdFx0LnZtYSA9IHZtYSxcbiYjNDM7XHRcdC5vcmRlciA9IEhQQUdFX1BNRF9PUkRFUixcbiYjNDM7XHRcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLFxuJiM0MztcdFx0Lm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuJiM0MztcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKSxcbiYjNDM7XHR9O1xuJiM0MztcbiBcdHJlc3VsdCA9IGZpbmRfcG1kX29yX3RocF9vcl9ub25lKG1tLCBzdGFydF9hZGRyLCBcdTAwMjZwbWQpO1xuIFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MmIzQzOyYjNDM7O1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiYjNDM7XHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXG4gXHRlbmFibGVkX29yZGVycyA9IGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcbiBcbiBcdC8qXG4gXHQgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2Vcbi1cdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuXG4mIzQzO1x0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcFxuJiM0MztcdCAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLlxuIFx0ICovXG4gXHRpZiAoZW5hYmxlZF9vcmRlcnMgIT0gQklUKEhQQUdFX1BNRF9PUkRFUikpXG4tXHRcdG1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuJiM0MztcdFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuIFxuIFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcdTAwMjZwdGwpO1xuIFx0aWYgKCFwdGUpIHtcbkBAIC0xNjQ0LDg0ICYjNDM7MTc0NiwxNCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MmIzQzOyYjNDM7O1xuIFxuLVx0XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO3VubWFwcGVkIFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbHdheXMgYmUgc3RyaWN0IHdpdGggdWZmZC13cFxuLVx0XHRcdCAqIGVuYWJsZWQgc3dhcCBlbnRyaWVzLiAgUGxlYXNlIHNlZVxuLVx0XHRcdCAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogRG9uJiMzOTt0IGNvbGxhcHNlIHRoZSBwYWdlIGlmIGFueSBvZiB0aGUgc21hbGxcbi1cdFx0XHQgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi5cbi1cdFx0XHQgKiBIZXJlIHdlIGNhbiBhbHNvIG1hcmsgdGhlIG5ldyBodWdlIHBtZCBhc1xuLVx0XHRcdCAqIHdyaXRlIHByb3RlY3RlZCBpZiBhbnkgb2YgdGhlIHNtYWxsIG9uZXMgaXNcbi1cdFx0XHQgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93blxuLVx0XHRcdCAqIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGxzIG91dHNpZGUgb2Zcbi1cdFx0XHQgKiB0aGUgcmVnaXN0ZXJlZCByYW5nZS4gIFNvLCBqdXN0IGJlIHNpbXBsZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbiYjNDM7XHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4mIzQzO1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbi1cbi1cdFx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0FOT047XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgdHJlYXQgYSBzaW5nbGUgcGFnZSBhcyBzaGFyZWQgaWYgYW55IHBhcnQgb2YgdGhlIFRIUFxuLVx0XHQgKiBpcyBzaGFyZWQuXG4tXHRcdCAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdH1cbiYjNDM7XHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuIFxuIFx0XHQvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqL1xuIFx0XHRfX3NldF9iaXQoaSwgY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMpO1xuQEAgLTE3NDksMzEgJiM0MzsxNzgxLDIxIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHQvKlxuIFx0XHQgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuXG4gXHRcdCAqXG4tXHRcdCAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5OlxuLVx0XHQgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgXHUwMDNlIGZvbGlvX3JlZl9jb3VudCgpLlxuLVx0XHQgKiBCdXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2Vcbi1cdFx0ICogbGF0ZXIuICBIb3dldmVyIGl0IG1heSByZXBvcnQgZmFsc2UgcG9zaXRpdmUgaWYgdGhlIHBhZ2Vcbi1cdFx0ICogaGFzIGV4Y2Vzc2l2ZSBHVVAgcGlucyAoaS5lLiA1MTIpLiAgQW55d2F5IHRoZSBzYW1lIGNoZWNrXG4tXHRcdCAqIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4mIzQzO1x0XHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcbiYjNDM7XHRcdCAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lXG4mIzQzO1x0XHQgKiBjaGVjayB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxuIFx0XHQgKi9cbiBcdFx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSkge1xuIFx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDtcbiBcdFx0XHRnb3RvIG91dF91bm1hcDtcbiBcdFx0fVxuIFxuLVx0XHQvKlxuLVx0XHQgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXNcbi1cdFx0ICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2Vcbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8XG4tXHRcdCAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxuLVx0XHQgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcikpKVxuJiM0MztcdFx0aWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXG4gXHRcdFx0cmVmZXJlbmNlZCYjNDM7JiM0Mzs7XG4gXHR9XG4gXHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgKCFyZWZlcmVuY2VkIHx8XG4tXHRcdCAgICAodW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuJiM0MztcdFx0ICAgIChjdHgudW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuQEAgLTE3ODQsMTMgJiM0MzsxODA2LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4gXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuJiM0MztcdFx0XHRcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4gXHRcdC8qIG1tYXBfbG9jayB3YXMgcmVsZWFzZWQgYWJvdmUsIHNldCBsb2NrX2Ryb3BwZWQgKi9cbiBcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4gXHR9XG4gb3V0OlxuIFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XG4mIzQzO1x0XHRcdFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XG4gXHRyZXR1cm4gcmVzdWx0O1xuIH1cbiBcbkBAIC0yNjkxLDggJiM0MzsyNzEzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0cHJlc2VudCA9IDA7XG4gXHRzd2FwID0gMDtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiYjNDM7XHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXHRyY3VfcmVhZF9sb2NrKCk7XG4gXHR4YXNfZm9yX2VhY2goXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgJiM0MzsgSFBBR0VfUE1EX05SIC0gMSkge1xuIFx0XHRpZiAoeGFzX3JldHJ5KFx1MDAyNnhhcywgZm9saW8pKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvbGxhcHNlX2NoZWNrX3B0ZSYjMzQ7LAogICAgJiMzNDtfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX3NjYW5fcG1kJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX3NjYW5fZmlsZSYjMzQ7LAogICAgJiMzNDtjb2xsYXBzZV9odWdlX3BhZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDliNDRjNjY2MTUxNjA5MzViODFmMjVmMmI4YTQ0ZGQxMjA1ODc3YmIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEp1bCAxNSAwODo1NTo0MCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAppbmRleCAxNmYzNzEzNWVkODBkZi4uYjE4N2Q2MTg0NTJmNDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QKQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkCiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXQKIHRvICYjMzQ7YWx3YXlzJiMzNDsgb3IgJiMzNDttYWR2aXNlJiMzNDspLCBhbmQgaXQmIzM5O2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlbgogYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGUKLXRvcC1sZXZlbCBjb250cm9sIGFyZSAmIzM0O25ldmVyJiMzNDspCiYjNDM7dG9wLWxldmVsIGNvbnRyb2wgYXJlICYjMzQ7bmV2ZXImIzM0OykuCiAKIHByb2Nlc3MgVEhQIGNvbnRyb2xzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzAxLDcgJiM0MzszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lCiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LAogb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLgogQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsCi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6CiYjNDM7YW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy4KJiM0MztQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlcgomIzQzOy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy0mbHQ7c2l6ZSZndDtrQi9zdGF0cy8pOjoKIAogCS9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkCiAKZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuYwppbmRleCA1NTE1NzU2N2RjNGNjMS4uNDAxMjVkY2I0ZGU5ZDYgMTAwNjQ0Ci0tLSBhL21tL2todWdlcGFnZWQuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9raHVnZXBhZ2VkLmMKQEAgLTY0LDYgJiM0Mzs2NCwxMiBAQCBlbnVtIHNjYW5fcmVzdWx0IHsKIAlTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLAogfTsKIAomIzQzO2VudW0gcHRlX2NoZWNrX3Jlc3VsdCB7CiYjNDM7CVBURV9DSEVDS19TVUNDRUVELAomIzQzOwlQVEVfQ0hFQ0tfRkFJTCwKJiM0MzsJUFRFX0NIRUNLX0NPTlRJTlVFLAomIzQzO307CiYjNDM7CiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlICZsdDt0cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaCZndDsKIApAQCAtMTE4LDYgJiM0MzsxMjQsMjAgQEAgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgewogCURFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTsKIH07CiAKJiM0MztzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgewomIzQzOwlzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2M7CiYjNDM7CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwomIzQzOwl1bnNpZ25lZCBpbnQgb3JkZXI7CiYjNDM7CXN0cnVjdCBmb2xpbyAqZm9saW87CiYjNDM7CWludCBub25lX29yX3plcm87CiYjNDM7CWludCBzaGFyZWQ7CiYjNDM7CWludCB1bm1hcHBlZDsKJiM0MzsJZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lOwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcDsKJiM0MzsJdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZDsKJiM0Mzt9OwomIzQzOwogLyoqCiAgKiBzdHJ1Y3Qga2h1Z2VwYWdlZF9zY2FuIC0gY3Vyc29yIGZvciBzY2FubmluZwogICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW4KQEAgLTYyMCw3ICYjNDM7NjQwLDcgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAkJLyoKIAkJICogVGhpcyBpcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYWdhaW5zdAogCQkgKiBjb2xsYXBzZV90ZXN0X2V4aXQoKSAod2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW4KLQkJICogdW5kZXIgbW1hcCBzZW0gcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsCiYjNDM7CQkgKiB1bmRlciBtbWFwX2xvY2sgcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsCiAJCSAqIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkCiAJCSAqIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMgdW5kZXIgdGhlIG1tYXBfbG9jay4KIAkJICovCkBAIC02MjksNiAmIzQzOzY0OSwxMyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogCX0KIH0KIAomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYykKJiM0Mzt7CiYjNDM7CW1lbXNldChjYy0mZ3Q7bm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtJmd0O25vZGVfbG9hZCkpOwomIzQzOwlub2Rlc19jbGVhcihjYy0mZ3Q7YWxsb2Nfbm1hc2spOwomIzQzOwliaXRtYXBfemVybyhjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pCiB7CiAJbm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbywKQEAgLTY2NSw3NiAmIzQzOzY5MiwxNTYgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfcGFnZXMocHRlX3QgKnB0ZSwgcHRlX3QgKl9wdGUsCiAJfQogfQogCiYjNDM7LyoKJiM0MzsgKiBjb2xsYXBzZV9pc19yZWZlcmVuY2VkKCkgLSBDaGVjayBmb3IgZW5vdWdoIHJlZmVyZW5jZWQgUFRFcyB0byBqdXN0aWZ5IGNvbGxhcHNpbmcKJiM0MzsgKgomIzQzOyAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGUgcGFnZSBoYXMgYmVlbgomIzQzOyAqIHJlY2VudGx5IGFjY2Vzc2VkICh5b3VuZyBwdGUpIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgYmVlbiByZWNlbnRseSBhY2Nlc3NlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgY29sbGFwc2VfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCwKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKJiM0Mzt7CiYjNDM7CXJldHVybiBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKJiM0MzsJCWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHwKJiM0MzsJCW1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsCiYjNDM7CQllbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpCiYjNDM7ewomIzQzOwlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKJiM0MzsJCWNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTsKJiM0MzsJY291bnRfbXRocF9zdGF0KG9yZGVyLCBtdGhwX2V2ZW50KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZAomIzQzOyAqIHJldHVybiBQVEVfQ0hFQ0tfRkFJTC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LAomIzQzOwkJZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpCiYjNDM7ewomIzQzOwljdHgtJmd0O3Jlc3VsdCA9IHJlc3VsdDsKJiM0MzsJcmV0dXJuIFBURV9DSEVDS19GQUlMOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIC0gQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlCiYjNDM7ICoKJiM0MzsgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKJiM0MzsgKiAtIG1heF9wdGVfKiB2YWx1ZXMgYXJlIG5vdCBleGNlZWRlZAomIzQzOyAqIC0gdWZmZCBpcyBub3QgYWN0aXZlCiYjNDM7ICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudAomIzQzOyAqIC0gb25seSBhbm9ueW1vdXMgcGFnZXMgYXJlIHByZXNlbnQKJiM0MzsgKgomIzQzOyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50CiYjNDM7ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLAomIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0ZBSUwgaWYgdGhlIFBURSBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbGxhcHNlLAomIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0NPTlRJTlVFIGlmIHRoZSBzY2FuIHNob3VsZCBjb250aW51ZSB0byBjaGVjayB0aGUgbmV4dCBQVEUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCkKJiM0Mzt7CiYjNDM7CWlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHsKJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDtub25lX29yX3plcm8gJmd0OyBjdHgtJmd0O21heF9wdGVzX25vbmUpIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsCiYjNDM7CQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX05PTkVfUFRFKTsKJiM0MzsJCX0KJiM0MzsJCXJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7CiYjNDM7CX0KJiM0MzsJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7CiYjNDM7CQlpZiAoY3R4LSZndDt1bm1hcHBlZCA9PSAtMSkKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7CiYjNDM7CQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7dW5tYXBwZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3N3YXApIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsCiYjNDM7CQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpCiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7CiYjNDM7CQlyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFOwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIERvbiYjMzk7dCBjb2xsYXBzZSBpZiBhbnkgb2YgdGhlIHNtYWxsIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZAomIzQzOwkgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkCiYjNDM7CSAqIGNvdWxkIGJyaW5nIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGwgb3V0c2lkZSBvZiB0aGUKJiM0MzsJICogcmVnaXN0ZXJlZCByYW5nZS4KJiM0MzsJICovCiYjNDM7CWlmIChwdGVfdWZmZChwdGV2YWwpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7CiYjNDM7CiYjNDM7CWN0eC0mZ3Q7Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LSZndDt2bWEsIGFkZHIsIHB0ZXZhbCk7CiYjNDM7CWlmICh1bmxpa2VseSghY3R4LSZndDtmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LSZndDtmb2xpbykpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCiYjNDM7CSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KJiM0MzsJICovCiYjNDM7CWlmIChjdHgtJmd0O2NjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgIShjdHgtJmd0O3ZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC0mZ3Q7Zm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTsKJiM0MzsKJiM0MzsJaWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LSZndDtmb2xpbykpIHsKJiM0MzsJCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtJmd0O2ZvbGlvKSwgY3R4LSZndDtmb2xpbyk7CiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LSZndDtmb2xpbykpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlcgomIzQzOwkJICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhCiYjNDM7CQkgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhCiYjNDM7CQkgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDtzaGFyZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3NoYXJlZCkgewomIzQzOwkJCWNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC0mZ3Q7b3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLAomIzQzOwkJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYywKIAkJdW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdCkKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKTsKIAljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyOwotCXB0ZV90ICpfcHRlOwotCWludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDsKJiM0MzsJcHRlX3QgKl9wdGUsIHB0ZXZhbDsKJiM0MzsJaW50IHJlZmVyZW5jZWQgPSAwOwogCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwomIzQzOwllbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrOwomIzQzOwlzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0gewomIzQzOwkJLmNjID0gY2MsCiYjNDM7CQkudm1hID0gdm1hLAomIzQzOwkJLm9yZGVyID0gb3JkZXIsCiYjNDM7CQkudW5tYXBwZWQgPSAtMSwgLyogZG9uJiMzOTt0IGNoZWNrIHN3YXAgUFRFcyAqLwomIzQzOwkJLm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSwKJiM0MzsJCS5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSwKJiM0MzsJfTsKIAogCWZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSAmbHQ7IHB0ZSAmIzQzOyBucl9wYWdlczsKIAkgICAgIF9wdGUmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHsKLQkJcHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7Ci0JCWlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHsKLQkJCWlmICgmIzQzOyYjNDM7bm9uZV9vcl96ZXJvICZndDsgbWF4X3B0ZXNfbm9uZSkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFOwotCQkJCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAocHRlX3VmZmQocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QVEVfVUZGRDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7Ci0JCWlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCVZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKLQkJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgotCQkgKi8KLQkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgISh2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTsKJiM0MzsJCXB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpOwomIzQzOwkJcHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgJmFtcDtjdHgpOwomIzQzOwkJZm9saW8gPSBjdHguZm9saW87CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7CiYjNDM7CQkJcmVzdWx0ID0gY3R4LnJlc3VsdDsKIAkJCWdvdG8gb3V0OwogCQl9CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSkKJiM0MzsJCQljb250aW51ZTsKIAotCQkvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi8KLQkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7Ci0JCQkvKgotCQkJICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXIKLQkJCSAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYQotCQkJICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYQotCQkJICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLgotCQkJICovCi0JCQlpZiAoJiM0MzsmIzQzO3NoYXJlZCAmZ3Q7IG1heF9wdGVzX3NoYXJlZCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7Ci0JCQkJaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQogCQkvKgogCQkgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSYjMzk7ZCBhY3R1YWxseQogCQkgKiB3YW50IHRvIGNvbGxhcHNlLgpAQCAtNzU5LDcgJiM0Mzs4NjYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCiAJCS8qCiAJCSAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGUKLQkJICogZm9saW8gY2FuJiMzOTt0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IFBHX2xvY2sKJiM0MzsJCSAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrCiAJCSAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2UKIAkJICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLgogCQkgKi8KQEAgLTc4Niw3ICYjNDM7ODkzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJfQogCiAJCS8qCi0JCSAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZQomIzQzOwkJICogSXNvbGF0ZSB0aGUgZm9saW8gdG8gYXZvaWQgY29sbGFwc2luZyBhIGh1Z2VwYWdlCiAJCSAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLgogCQkgKi8KIAkJaWYgKCFmb2xpb19pc29sYXRlX2xydShmb2xpbykpIHsKQEAgLTgwMywxNCAmIzQzOzkxMCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKIAkJCWxpc3RfYWRkX3RhaWwoJmFtcDtmb2xpby0mZ3Q7bHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7CiBuZXh0OgotCQkvKgotCQkgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXMKLQkJICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UKLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7Ci0JCSAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKLQkJICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8Ci0JCSAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcikpKQomIzQzOwkJaWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpCiAJCQlyZWZlcmVuY2VkJiM0MzsmIzQzOzsKIAl9CiAKQEAgLTgxOCwxMyAmIzQzOzkxOCwxMyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFOwogCX0gZWxzZSB7CiAJCXJlc3VsdCA9IFNDQU5fU1VDQ0VFRDsKLQkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybywKJiM0MzsJCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLAogCQkJCQkJICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIG91dDoKIAlyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTsKLQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLAomIzQzOwl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybywKIAkJCQkJICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMDc4LDcgJiM0MzsxMTc4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGwKIAkJcmV0dXJuIFNDQU5fVk1BX0NIRUNLOwogCS8qCiAJICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuCi0JICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLgomIzQzOwkgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLgogCSAqCiAJICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGUKIAkgKiB2bWFzLgpAQCAtMTEzNiw3ICYjNDM7MTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogLyoKICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuCi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgomIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgogICoKICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2UKICAqIGZhdWx0aW5nIHBhZ2VzIGJhY2sgaW4gZHVyaW5nIGNvbGxhcHNlIGNvdWxkIHJlLXBvcHVsYXRlIFBURXMgdGhhdApAQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIAlmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgJmFtcDtjYy0mZ3Q7YWxsb2Nfbm1hc2spOwogCWlmICghZm9saW8pIHsKIAkJKmZvbGlvcCA9IE5VTEw7Ci0JCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7Ci0JCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiYjNDM7CQljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCwKJiM0MzsJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiAJCXJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMOwogCX0KIAotCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQljb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpOwotCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTsKJiM0MzsJY291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTsKIAogCWlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7CiAJCWZvbGlvX3B1dChmb2xpbyk7CkBAIC0xMzMxLDggJiM0MzsxNDI4LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAltbWFwX3JlYWRfdW5sb2NrKG1tKTsKIAkvKgogCSAqIFByZXZlbnQgYWxsIGFjY2VzcyB0byBwYWdldGFibGVzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgotCSAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTQotCSAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgUEdfbG9jay4KJiM0MzsJICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcG1kcF9jb2xsYXBzZV9mbHVzaCBhbmQgdGhlIFZNCiYjNDM7CSAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgZm9saW8gbG9jay4KIAkgKgogCSAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZQogCSAqIG1tYXBfbG9jay4KQEAgLTE0MzksNyAmIzQzOzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCQkJc3Bpbl9sb2NrX25lc3RlZChwdGVfcHRsLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7CiAJCW1hcF9hbm9uX2ZvbGlvX3B0ZV9ub3BmKGZvbGlvLCBwdGUsIHZtYSwgc3RhcnRfYWRkciwKLQkJCQkJICAvKnVmZmRfd3A9Ki8gZmFsc2UpOwomIzQzOwkJCQkJICAvKnVmZmQ9Ki8gZmFsc2UpOwogCQlpZiAocHRlX3B0bCAhPSBwbWRfcHRsKQogCQkJc3Bpbl91bmxvY2socHRlX3B0bCk7CiAJfQpAQCAtMTQ0OSwxMCAmIzQzOzE1NDYsMTAgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAogCXJlc3VsdCA9IFNDQU5fU1VDQ0VFRDsKIG91dF91cF93cml0ZToKLQlpZiAoYW5vbl92bWFfbG9ja2VkKQotCQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLSZndDthbm9uX3ZtYSk7CiAJaWYgKHB0ZSkKIAkJcHRlX3VubWFwKHB0ZSk7CiYjNDM7CWlmIChhbm9uX3ZtYV9sb2NrZWQpCiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLSZndDthbm9uX3ZtYSk7CiAJbW1hcF93cml0ZV91bmxvY2sobW0pOwogb3V0X25vbG9jazoKIAlpZiAoZm9saW8pCkBAIC0xNTkzLDQyICYjNDM7MTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwKIAkJYm9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7Ci0JdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7CiAJZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7CiAJaW50IGk7Ci0JaW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwOwotCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDsKJiM0MzsJaW50IHJlZmVyZW5jZWQgPSAwOwomIzQzOwllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVyczsKIAlzcGlubG9ja190ICpwdGw7Ci0JaW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDsKJiM0MzsJaW50IG5vZGUgPSBOVU1BX05PX05PREU7CiYjNDM7CWVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7CiAKIAlWTV9CVUdfT04oc3RhcnRfYWRkciAmYW1wOyB+SFBBR0VfUE1EX01BU0spOwogCiYjNDM7CXN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7CiYjNDM7CQkuY2MgPSBjYywKJiM0MzsJCS52bWEgPSB2bWEsCiYjNDM7CQkub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsCiYjNDM7CQkubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJCS5tYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJCS5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksCiYjNDM7CX07CiYjNDM7CiAJcmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsICZhbXA7cG1kKTsKIAlpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkgewogCQljYy0mZ3Q7cHJvZ3Jlc3MmIzQzOyYjNDM7OwogCQlnb3RvIG91dDsKIAl9CiAKLQliaXRtYXBfemVybyhjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpOwotCW1lbXNldChjYy0mZ3Q7bm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtJmd0O25vZGVfbG9hZCkpOwotCW5vZGVzX2NsZWFyKGNjLSZndDthbGxvY19ubWFzayk7CiYjNDM7CWNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTsKIAogCWVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLSZndDt2bV9mbGFncywgdHZhX2ZsYWdzKTsKIAogCS8qCiAJICogSWYgUE1EIGlzIHRoZSBvbmx5IGVuYWJsZWQgb3JkZXIsIGVuZm9yY2UgbWF4X3B0ZXNfbm9uZSwgb3RoZXJ3aXNlCi0JICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4KJiM0MzsJICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcAomIzQzOwkgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci4KIAkgKi8KIAlpZiAoZW5hYmxlZF9vcmRlcnMgIT0gQklUKEhQQUdFX1BNRF9PUkRFUikpCi0JCW1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUOwomIzQzOwkJY3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUOwogCiAJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCAmYW1wO3B0bCk7CiAJaWYgKCFwdGUpIHsKQEAgLTE2NDQsODQgJiM0MzsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCiAJCWNjLSZndDtwcm9ncmVzcyYjNDM7JiM0Mzs7CiAKLQkJaWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gJmd0OyBtYXhfcHRlc19ub25lKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7Ci0JCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLAotCQkJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mzt1bm1hcHBlZCAmZ3Q7IG1heF9wdGVzX3N3YXApIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJLyoKLQkJCSAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwCi0JCQkgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWUKLQkJCSAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuCi0JCQkgKi8KLQkJCWlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHsKLQkJCS8qCi0JCQkgKiBEb24mIzM5O3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbAotCQkJICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uCi0JCQkgKiBIZXJlIHdlIGNhbiBhbHNvIG1hcmsgdGhlIG5ldyBodWdlIHBtZCBhcwotCQkJICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpcwotCQkJICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd24KLQkJCSAqIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGxzIG91dHNpZGUgb2YKLQkJCSAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLgotCQkJICovCi0JCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQotCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpOwotCQlpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDsKLQkJCWdvdG8gb3V0X3VubWFwOwotCQl9Ci0JCWZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCi0JCSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7ICEodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9EUk9QUEFCTEUpICZhbXA7JmFtcDsKLQkJICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7CiYjNDM7CQlwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCAmYW1wO2N0eCk7CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7CiYjNDM7CQkJcmVzdWx0ID0gY3R4LnJlc3VsdDsKIAkJCWdvdG8gb3V0X3VubWFwOwogCQl9Ci0KLQkJaWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfQU5PTjsKLQkJCWdvdG8gb3V0X3VubWFwOwotCQl9Ci0KLQkJLyoKLQkJICogV2UgdHJlYXQgYSBzaW5nbGUgcGFnZSBhcyBzaGFyZWQgaWYgYW55IHBhcnQgb2YgdGhlIFRIUAotCQkgKiBpcyBzaGFyZWQuCi0JCSAqLwotCQlpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHsKLQkJCWlmICgmIzQzOyYjNDM7c2hhcmVkICZndDsgbWF4X3B0ZXNfc2hhcmVkKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUiwKLQkJCQkJCU1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTsKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJCX0KLQkJfQomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlmb2xpbyA9IGN0eC5mb2xpbzsKIAogCQkvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqLwogCQlfX3NldF9iaXQoaSwgY2MtJmd0O210aHBfcHJlc2VudF9wdGVzKTsKQEAgLTE3NDksMzEgJiM0MzsxNzgxLDIxIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkvKgogCQkgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuCiAJCSAqCi0JCSAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5OgotCQkgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgJmd0OyBmb2xpb19yZWZfY291bnQoKS4KLQkJICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlCi0JCSAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlCi0JCSAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVjawotCQkgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LgomIzQzOwkJICogSGVyZSB0aGUgY2hlY2sgaXMgcmFjeSwgYnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgYW5kCiYjNDM7CQkgKiB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UgbGF0ZXIuIEFueXdheSB0aGUgc2FtZQomIzQzOwkJICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy4KIAkJICovCiAJCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHsKIAkJCXJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDsKIAkJCWdvdG8gb3V0X3VubWFwOwogCQl9CiAKLQkJLyoKLQkJICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzCi0JCSAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlCi0JCSAqLwotCQlpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOwotCQkgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8Ci0JCSAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fAotCQkgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKSkKJiM0MzsJCWlmIChjb2xsYXBzZV9pc19yZWZlcmVuY2VkKGNjLCBwdGV2YWwsIGZvbGlvLCB2bWEsIGFkZHIpKQogCQkJcmVmZXJlbmNlZCYjNDM7JiM0Mzs7CiAJfQogCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiAJCSAgICghcmVmZXJlbmNlZCB8fAotCQkgICAgKHVubWFwcGVkICZhbXA7JmFtcDsgcmVmZXJlbmNlZCAmbHQ7IEhQQUdFX1BNRF9OUiAvIDIpKSkgewomIzQzOwkJICAgIChjdHgudW5tYXBwZWQgJmFtcDsmYW1wOyByZWZlcmVuY2VkICZsdDsgSFBBR0VfUE1EX05SIC8gMikpKSB7CiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwpAQCAtMTc4NCwxMyAmIzQzOzE4MDYsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCS8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi8KIAkJbW1hcF9yZWFkX3VubG9jayhtbSk7CiAJCXJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsCi0JCQkJICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpOwomIzQzOwkJCQkgICAgICAgY3R4LnVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpOwogCQkvKiBtbWFwX2xvY2sgd2FzIHJlbGVhc2VkIGFib3ZlLCBzZXQgbG9ja19kcm9wcGVkICovCiAJCSpsb2NrX2Ryb3BwZWQgPSB0cnVlOwogCX0KIG91dDoKIAl0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCwKLQkJCQkgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7CiYjNDM7CQkJCSAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI2OTEsOCAmIzQzOzI3MTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAlwcmVzZW50ID0gMDsKIAlzd2FwID0gMDsKLQltZW1zZXQoY2MtJmd0O25vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLSZndDtub2RlX2xvYWQpKTsKLQlub2Rlc19jbGVhcihjYy0mZ3Q7YWxsb2Nfbm1hc2spOwomIzQzOwljb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7CiAJcmN1X3JlYWRfbG9jaygpOwogCXhhc19mb3JfZWFjaCgmYW1wO3hhcywgZm9saW8sIHN0YXJ0ICYjNDM7IEhQQUdFX1BNRF9OUiAtIDEpIHsKIAkJaWYgKHhhc19yZXRyeSgmYW1wO3hhcywgZm9saW8pKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDA4MAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDQ2MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtodWdlcGFnZWQgUFRFIENoZWNraW5nIFJlZmFjdG9yKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQgdG91Y2hlcyBgbW0va2h1Z2VwYWdlZC5jYCBhbmQgYERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdGAuIEltbWVkaWF0ZWx5LCBJIHNlZSBpdCYjMzk7cyBpbnRyb2R1Y2luZyBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB3aGljaCBpbmRpY2F0ZXMgYSByZWZhY3RvcmluZyBvZiB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIHdpdGhpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBJdCBhbHNvIGJyaW5ncyBpbiBgY29sbGFwc2VfaXNfcmVmZXJlbmNlZCgpYCBhbmQgYGNvdW50X2NvbGxhcHNlX2V2ZW50KClgLiBUaGlzIGlzIGFsbCBjbGVhcmx5IGZvY3VzZWQgb24gY2xlYW5pbmcgdXAgYW5kIHBvdGVudGlhbGx5IG9wdGltaXppbmcgdGhlIGtodWdlcGFnZWQgY29tcG9uZW50LCBwYXJ0aWN1bGFybHkgdGhhdCBjcnVjaWFsIFBURSB2YWxpZGF0aW9uLgoKR2l2ZW4gdGhhdCBgbW0va2h1Z2VwYWdlZC5jYCBkZWFscyB3aXRoIGNvcmUga2VybmVsIGZ1bmN0aW9uYWxpdHkg4oCTIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkg4oCTIGFuZCBUSFAgaXMgYSBmYWlybHkgc3RhbmRhcmQgZmVhdHVyZSB3aXRoIGtodWdlcGFnZWQgY29uc3RhbnRseSBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLCBJIG5lZWQgdG8gdHJlYXQgdGhpcyBjaGFuZ2Ugd2l0aCBjb25zaWRlcmFibGUgY2FyZS4gSXQmIzM5O3MgZGVmaW5pdGVseSByZWFjaGFibGUuCgpMZXQmIzM5O3MgYnJlYWsgZG93biB0aGUgc3BlY2lmaWMgZnVuY3Rpb24gY2hhbmdlcy4gSSYjMzk7bSBzZWVpbmcgbW9kaWZpY2F0aW9ucyB0bzoKKiAgIGBfX2todWdlcGFnZWRfZXhpdGAgKGNvbW1lbnQgY2hhbmdlKQoqICAgYGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuYCAobmV3KQoqICAgYGNvbGxhcHNlX2lzX3JlZmVyZW5jZWRgIChuZXcpCiogICBgY291bnRfY29sbGFwc2VfZXZlbnRgIChuZXcpCiogICBgcHRlX2NoZWNrX2ZhaWxgIChuZXcpCiogICBgY29sbGFwc2VfY2hlY2tfcHRlYCAobmV3KQoqICAgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIChtb2RpZmllZCkKKiAgIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAgKGNvbW1lbnQgY2hhbmdlKQoqICAgYGFsbG9jX2NoYXJnZV9mb2xpb2AgKG1vZGlmaWVkKQoqICAgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgKG1vZGlmaWVkKQoqICAgYGNvbGxhcHNlX3NjYW5fcG1kYCAobW9kaWZpZWQpCiogICBgY29sbGFwc2Vfc2Nhbl9maWxlYCAobW9kaWZpZWQpCgpUaGUgbW9kaWZpZWQgZnVuY3Rpb25zIGFyZSB0aGUgb25lcyB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBoaWdoZXN0IHNjcnV0aW55LiBJJiMzOTttIGZvY3VzaW5nIG9uIGZ1enppbmcgdGhlc2UgYXJlYXM6IGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCwgYGNvbGxhcHNlX3NjYW5fcG1kYCwgYGNvbGxhcHNlX3NjYW5fZmlsZWAsIGFuZCBgY29sbGFwc2VfaHVnZV9wYWdlYC4KCkZyb20gYSBjb25maWd1cmF0aW9uIHBlcnNwZWN0aXZlLCBJJiMzOTtsbCBkZWZpbml0ZWx5IGJlIGVuYWJsaW5nIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGFuZCBwcm9iYWJseSBsZWFuaW5nIHRvd2FyZCBlaXRoZXIgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VgIG9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIHRvIGZ1bGx5IGV4ZXJjaXNlIHRoZSBjaGFuZ2VzIGR1cmluZyB0ZXN0aW5nLgoKTm93LCBsZXQmIzM5O3MgaGF2ZSBhIGxvb2sgYXQgdGhlIEtjb25maWcgZmlsZSB0byBjb25maXJtIHNvbWUgYXNzdW1wdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2h1Z2VwYWdlZFxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZV9kZXZpY2Uub1xubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgJiM0Mzs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEyMDcKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipLZXJuZWwgQ29uZmlndXJhdGlvbiBDb25zaWRlcmF0aW9ucyoqCgpBbHJpZ2h0LCBzbyB0aGUgaW1tZWRpYXRlIG5lZWQgaXMgZGVmaW5pdGVseSBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gVGhhdCBtdWNoIGlzIGNsZWFyLiBCdXQgYXMgd2UmIzM5O3JlIGRpZ2dpbmcgaW50byB0aGlzLCBJIGtub3cgd2UgY2FuJiMzOTt0IHN0b3AgdGhlcmUuIE15IGludGVybmFsIGNoZWNrbGlzdCBpbW1lZGlhdGVseSBqdW1wcyB0bzogd2hhdCBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWlnaHQgYmUgcmVsZXZhbnQgb3IgaW1wYWN0ZWQ/IFRoaXMgc2l0dWF0aW9uIGlzIHJhcmVseSBpc29sYXRlZC4gSSBuZWVkIHRvIHF1aWNrbHkgaWRlbnRpZnkgYW55IGRlcGVuZGVuY2llcywgY29uZmxpY3RzLCBvciBjb21wbGVtZW50YXJ5IGZlYXR1cmVzIHRoYXQgSSBzaG91bGQgYmUgYXdhcmUgb2YgYW5kIGNoZWNrIG91dCB0byBtYWtlIHN1cmUgbXkgZmluYWwgY29uZmlnIGlzIHNldCB1cCBvcHRpbWFsbHkuIFdlIGFsbCBrbm93IGhvdyBlYXN5IGl0IGlzIHRvIG1pc3Mgc29tZXRoaW5nIGFuZCBlbmQgdXAgd2l0aCBhIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2sgb3IsIHdvcnNlLCBpbnN0YWJpbGl0eS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGNvbmZpZyBtZXNoZXMgd2VsbCB3aXRoIGFueSBleGlzdGluZyBhbmQvb3IgZnV0dXJlIHBsYW5zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgzNT1jb25maWcgTU1fSURcbi0tXG5tbS9LY29uZmlnLTgzNy1cbm1tL0tjb25maWc6ODM4Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODM5LVx0Ym9vbCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04NTY9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04NjEtXG5tbS9LY29uZmlnOjg2MjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcbm1tL0tjb25maWctODYzLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctODY4LVxubW0vS2NvbmZpZzo4Njk6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxubW0vS2NvbmZpZy04NzAtXHRcdGJvb2wgXCYjMzQ7bWFkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWctODc3LVxubW0vS2NvbmZpZzo4Nzg6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcbm1tL0tjb25maWctODc5LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04ODU9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04OTQtXG5tbS9LY29uZmlnOjg5NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXG5tbS9LY29uZmlnLTg5Ni1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTA0LVxubW0vS2NvbmZpZzo5MDU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTA2LVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTEyLVxubW0vS2NvbmZpZzo5MTM6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05MTQtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkyMC1cbm1tL0tjb25maWc6OTIxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTkyMi1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTkzMD1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTkzOS1cbm1tL0tjb25maWc6OTQwOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTQxLVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NDgtXG5tbS9LY29uZmlnOjk0OTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05NTAtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NTYtXG5tbS9LY29uZmlnOjk1NzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTk1OC1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTY0LVxubW0vS2NvbmZpZzo5NjU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTY2LVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMTQwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTkyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBIdWdlIFBhZ2UgQ29sbGFwc2UgT3B0aW1pemF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gdGhpbmtpbmcgSSBuZWVkIHRvIGFkZCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTYCB0byB0aGUgYEVuYWJsZUNvbmZpZ3NgLiBUaGF0IHNlZW1zIGxpa2UgdGhlIHJpZ2h0IG1vdmUsIGdpdmVuIHdoYXQgSSYjMzk7bSB0cnlpbmcgdG8gYWNoaWV2ZS4KCk5vdywgbGV0JiMzOTtzIGp1c3QgbWFrZSBzdXJlIEkmIzM5O3ZlIGdvdCBteSBoZWFkIGFyb3VuZCB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGFmZmVjdGVkIGJ5IHRoZXNlIGNoYW5nZXMuIEkmIzM5O3ZlIGdvdDogYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLCBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgY29sbGFwc2Vfc2Nhbl9maWxlYCwgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLgoKUmlnaHQsIGFsbCBvZiB0aG9zZSBhcmUgZWl0aGVyIHN0YXRpYyBvciBwYXJ0IG9mIGBraHVnZXBhZ2VkYC4gT2theSwgYXJlIGFueSBvZiB0aGVzZSBpbiBhIGhvdCBwYXRoPyBJIGhhdmUgdG8gY29uc2lkZXIgdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4gYGNvbGxhcHNlX3NjYW5fcG1kYCBpcyBjYWxsZWQgYnkgYGtodWdlcGFnZWRgLCBhIGJhY2tncm91bmQgdGhyZWFkLCBzbyBpdCYjMzk7cyBub3QgYSBkaXJlY3Qgc3lzY2FsbCBob3RwYXRoLCBidXQgaXQgKmRvZXMqIHNjYW4gbWVtb3J5LCB3aGljaCBpcyBpbXBvcnRhbnQuIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGlzIGFsc28gY2FsbGVkIGJ5IGBraHVnZXBhZ2VkYC4gQW5kIHRoZW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGlzIGNhbGxlZCBieSBib3RoIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGFuZCBgbWFkdmlzZV9jb2xsYXBzZWAuIE5lZWQgdG8gY2hlY2sgYG1hZHZpc2VfY29sbGFwc2VgLiBUaGF0JiMzOTtzIGEgY3JpdGljYWwgcGF0aCwgc28gbXVzdCB0YWtlIGNhcmUgdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9NzQ3PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtODEyLVxubW0va2h1Z2VwYWdlZC5jOjgxMzpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0va2h1Z2VwYWdlZC5jLTgxNC1cdFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTk5Nj1zdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDEzLVx0ICogUmVsZWFzZSBib3RoIHJhdyBhbmQgY29tcG91bmQgcGFnZXMgaXNvbGF0ZWRcbm1tL2todWdlcGFnZWQuYzoxMDE0Olx0ICogaW4gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZS5cbm1tL2todWdlcGFnZWQuYy0xMDE1LVx0ICovXG4tLVxubW0va2h1Z2VwYWdlZC5jPTEzNzY9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE0NzctXHRpZiAocHRlKSB7XG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcdFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSh2bWEsIHN0YXJ0X2FkZHIsIHB0ZSwgY2MsXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cdFx0XHRcdFx0XHQgICAgICBvcmRlciwgXHUwMDI2Y29tcG91bmRfcGFnZWxpc3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMDE0CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhlIGV4cGVydDoKCioqVHJhY2luZyB0aGUgSHVnZSBQYWdlIENvbGxhcHNlKioKCk9rYXksIHNvIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaXMgdGhlIHJlYWwgd29ya2hvcnNlIGhlcmUsIGNhbGxlZCBieSBgY29sbGFwc2VfaHVnZV9wYWdlYC4gUmlnaHQsIHRoYXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3cgdGhlIHF1ZXN0aW9uIGlzLCB3aGF0IHRyaWdnZXJzIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGl0c2VsZj8gSXQgbG9va3MgbGlrZSB0aGUgdHdvIHByaW1hcnkgcGF0aHMgYXJlIGBraHVnZXBhZ2VkX3NjYW5fcG1kYCDigJMgdGhlIGtlcm5lbCYjMzk7cyBodWdlIHBhZ2UgbWFuYWdlbWVudCBkYWVtb24g4oCTIGFuZCBwb3RlbnRpYWxseSBgbWFkdmlzZV9jb2xsYXBzZWAgd2hpY2ggaXMgcmVsYXRlZCB0byB1c2Vyc3BhY2UgcGFnZSBhZHZpc29yeS4gSSBuZWVkIHRvIGNvbmZpcm0gdGhhdC4gVGhlcmVmb3JlLCBJIHNob3VsZCBzdGFydCBieSBkaWdnaW5nIGludG8gdGhlIGNhbGxpbmcgY29udGV4dHMgb2YgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgZGlyZWN0bHkuIFRoYXQmIzM5O2xsIGdpdmUgbWUgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHRoZXNlIGh1Z2UgcGFnZXMgYXJlIGJlaW5nIHRhcmdldGVkIGZvciBjb2xsYXBzZS4gVGltZSB0byBkaXZlIGludG8gdGhlIHNvdXJjZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29sbGFwc2VfaHVnZV9wYWdlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz03NDc9c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLFxuLS1cbm1tL2todWdlcGFnZWQuYy04MTItXG5tbS9raHVnZXBhZ2VkLmM6ODEzOnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9raHVnZXBhZ2VkLmMtODE0LVx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtOTIwLVx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG5tbS9raHVnZXBhZ2VkLmM6OTIxOlx0XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbm1tL2todWdlcGFnZWQuYy05MjItXHRcdFx0XHRcdFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xuLS1cbm1tL2todWdlcGFnZWQuYy05MjYtXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbm1tL2todWdlcGFnZWQuYzo5Mjc6XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbm1tL2todWdlcGFnZWQuYy05MjgtXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtOTMxLVxubW0va2h1Z2VwYWdlZC5jOjkzMjpzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X3N1Y2NlZWRlZChwdGVfdCAqcHRlLFxubW0va2h1Z2VwYWdlZC5jLTkzMy1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtOTk1LVxubW0va2h1Z2VwYWdlZC5jOjk5NjpzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxubW0va2h1Z2VwYWdlZC5jLTk5Ny1cdFx0cG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDEzLVx0ICogUmVsZWFzZSBib3RoIHJhdyBhbmQgY29tcG91bmQgcGFnZXMgaXNvbGF0ZWRcbm1tL2todWdlcGFnZWQuYzoxMDE0Olx0ICogaW4gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZS5cbm1tL2todWdlcGFnZWQuYy0xMDE1LVx0ICovXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwMTktLypcbm1tL2todWdlcGFnZWQuYzoxMDIwOiAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHkgLSBhdHRlbXB0cyB0byBjb3B5IG1lbW9yeSBjb250ZW50cyBmcm9tIHJhd1xubW0va2h1Z2VwYWdlZC5jLTEwMjEtICogcGFnZXMgdG8gYSBodWdlcGFnZS4gQ2xlYW5zIHVwIHRoZSByYXcgcGFnZXMgaWYgY29weWluZyBzdWNjZWVkcztcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTAzMy0gKi9cbm1tL2todWdlcGFnZWQuYzoxMDM0OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHkocHRlX3QgKnB0ZSwgc3RydWN0IGZvbGlvICpmb2xpbyxcbm1tL2todWdlcGFnZWQuYy0xMDM1LVx0XHRwbWRfdCAqcG1kLCBwbWRfdCBvcmlnX3BtZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwNjMtXHRpZiAobGlrZWx5KHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpKVxubW0va2h1Z2VwYWdlZC5jOjEwNjQ6XHRcdF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfc3VjY2VlZGVkKHB0ZSwgdm1hLCBhZGRyZXNzLCBwdGwsXG5tbS9raHVnZXBhZ2VkLmMtMTA2NS1cdFx0XHRcdFx0XHQgICAgb3JkZXIsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbm1tL2todWdlcGFnZWQuYy0xMDY2LVx0ZWxzZVxubW0va2h1Z2VwYWdlZC5jOjEwNjc6XHRcdF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZSwgcG1kLCBvcmlnX3BtZCwgdm1hLFxubW0va2h1Z2VwYWdlZC5jLTEwNjgtXHRcdFx0XHRcdFx0IG9yZGVyLCBjb21wb3VuZF9wYWdlbGlzdCk7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTEyMjQ9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY2hlY2tfcG1kX3N0aWxsX3ZhbGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMjQ3LSAqL1xubW0va2h1Z2VwYWdlZC5jOjEyNDg6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxubW0va2h1Z2VwYWdlZC5jLTEyNDktXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEzMzMtb3V0OlxubW0va2h1Z2VwYWdlZC5jOjEzMzQ6XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCByZXN1bHQsXG5tbS9raHVnZXBhZ2VkLmMtMTMzNS1cdFx0XHRcdFx0ICAgb3JkZXIpO1xuLS1cbm1tL2todWdlcGFnZWQuYz0xMzM5PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMzcwLS8qXG5tbS9raHVnZXBhZ2VkLmM6MTM3MTogKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcbm1tL2todWdlcGFnZWQuYy0xMzcyLSAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2tcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTM3NS0gKi9cbm1tL2todWdlcGFnZWQuYzoxMzc2OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxubW0va2h1Z2VwYWdlZC5jLTEzNzctXHRcdGludCByZWZlcmVuY2VkLCBpbnQgdW5tYXBwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTQxNy1cdFx0Lypcbm1tL2todWdlcGFnZWQuYzoxNDE4Olx0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcbm1tL2todWdlcGFnZWQuYy0xNDE5LVx0XHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTQyMS1cdFx0ICovXG5tbS9raHVnZXBhZ2VkLmM6MTQyMjpcdFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCB2bWEsIHN0YXJ0X2FkZHIsIHBtZCxcbm1tL2todWdlcGFnZWQuYy0xNDIzLVx0XHRcdFx0XHRcdCAgICAgcmVmZXJlbmNlZCwgb3JkZXIpO1xuLS1cbm1tL2todWdlcGFnZWQuYy0xNDc3LVx0aWYgKHB0ZSkge1xubW0va2h1Z2VwYWdlZC5jOjE0Nzg6XHRcdHJlc3VsdCA9IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUodm1hLCBzdGFydF9hZGRyLCBwdGUsIGNjLFxubW0va2h1Z2VwYWdlZC5jLTE0NzktXHRcdFx0XHRcdFx0ICAgICAgb3JkZXIsIFx1MDAyNmNvbXBvdW5kX3BhZ2VsaXN0KTtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTUwOS1cbm1tL2todWdlcGFnZWQuYzoxNTEwOlx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weShwdGUsIGZvbGlvLCBwbWQsIF9wbWQsXG5tbS9raHVnZXBhZ2VkLmMtMTUxMS1cdFx0XHRcdFx0ICAgdm1hLCBzdGFydF9hZGRyLCBwdGVfcHRsLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xNTU2LVx0XHRmb2xpb19wdXQoZm9saW8pO1xubW0va2h1Z2VwYWdlZC5jOjE1NTc6XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2UobW0sIHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQsIHJlc3VsdCwgb3JkZXIpO1xubW0va2h1Z2VwYWdlZC5jLTE1NTgtXHRyZXR1cm4gcmVzdWx0O1xuLS1cbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE2MjAtXHRcdFx0Y29sbGFwc2VfYWRkcmVzcyA9IGFkZHJlc3MgJiM0Mzsgb2Zmc2V0ICogUEFHRV9TSVpFO1xubW0va2h1Z2VwYWdlZC5jOjE2MjE6XHRcdFx0cmV0ID0gY29sbGFwc2VfaHVnZV9wYWdlKG1tLCBjb2xsYXBzZV9hZGRyZXNzLCByZWZlcmVuY2VkLFxubW0va2h1Z2VwYWdlZC5jLTE2MjItXHRcdFx0XHRcdFx0IHVubWFwcGVkLCBjYywgb3JkZXIpO1xuLS1cbm1tL2todWdlcGFnZWQuYz0xNjg5PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xODA1LVx0aWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHtcbm1tL2todWdlcGFnZWQuYzoxODA2Olx0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG5tbS9raHVnZXBhZ2VkLmMtMTgwNy1cdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1MjczCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogNTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0JiMzOTtzIHBlcnNwZWN0aXZlOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBgY29sbGFwc2VfaHVnZV9wYWdlYCBDYWxsIENoYWluKioKClJpZ2h0LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUgYW5kIHRyeWluZyB0byB0cmFjZSB0aGUgZXhlY3V0aW9uIHBhdGguIEkgc2VlIHRoYXQgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgaXMgYmVpbmcgaW52b2tlZCBieSBgbXRocF9jb2xsYXBzZWAsIGFuZCB0aGF0IGluIHR1cm4gaXMgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zY2FuX3BtZGAuIFRoYXQmIzM5O3MgYSBwcmV0dHkgY2xlYXIgY2hhaW4sIGVhc3kgZW5vdWdoIHRvIGZvbGxvdy4gTm93LCB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoZXRoZXIgb3Igbm90IGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhbHNvIGNhbGxpbmcgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIEkgbmVlZCB0byBjb25maXJtIGlmIGl0IGhhcyBpdHMgb3duIHBhdGggdG8gaXQsIG9yIGlmIGl0IGlzIHJlbGlhbnQgb24gdGhpcyBleGlzdGluZyBwYXRoLiBJIHdhbnQgdG8gZG91YmxlLWNoZWNrIHRoYXQ7IHRoZXJlIGNvdWxkIGJlIHNvbWUgYXNzdW1wdGlvbnMgYmVpbmcgbWFkZSB0aGF0IGFyZW4mIzM5O3QgcXVpdGUgY29ycmVjdCwgb3IgbWF5YmUgc29tZSB1bmV4cGVjdGVkIGJlaGF2aW9yIGVtZXJnaW5nIGZyb20gdGhpcyBwYXJ0aWN1bGFyIGNhbGwuIEkgYmV0dGVyIGdvIGFuZCBjaGVjayB0aGUgY3Jvc3MtcmVmZXJlbmNlcyBmb3IgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgdG8gc2VlIGlmIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBpbmRlZWQgY2FsbGluZyBpdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiBJdCYjMzk7cyBhIGZ1bmRhbWVudGFsIHBhcnQgb2YgdGhlIG92ZXJhbGwgZmxvdyBmb3IgbWFuYWdpbmcgaHVnZSBwYWdlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MzE3ND1ib29sIGN1cnJlbnRfaXNfa2h1Z2VwYWdlZCh2b2lkKVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMTc4LVxubW0va2h1Z2VwYWdlZC5jOjMxNzk6c3RhdGljIGludCBtYWR2aXNlX2NvbGxhcHNlX2Vycm5vKGVudW0gc2Nhbl9yZXN1bHQgcilcbm1tL2todWdlcGFnZWQuYy0zMTgwLXtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzIxMC1cbm1tL2todWdlcGFnZWQuYzozMjExOmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxubW0va2h1Z2VwYWdlZC5jLTMyMTItXHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzI5OC1cdHJldHVybiB0aHBzID09ICgoaGVuZCAtIGhzdGFydCkgXHUwMDNlXHUwMDNlIEhQQUdFX1BNRF9TSElGVCkgPyAwXG5tbS9raHVnZXBhZ2VkLmM6MzI5OTpcdFx0XHQ6IG1hZHZpc2VfY29sbGFwc2VfZXJybm8obGFzdF9mYWlsKTtcbm1tL2todWdlcGFnZWQuYy0zMzAwLX1cbi0tXG5tbS9tYWR2aXNlLmM9MTMzOD1zdGF0aWMgaW50IG1hZHZpc2Vfdm1hX2JlaGF2aW9yKHN0cnVjdCBtYWR2aXNlX2JlaGF2aW9yICptYWR2X2JlaGF2aW9yKVxuLS1cbm1tL21hZHZpc2UuYy0xMzYyLVx0Y2FzZSBNQURWX0NPTExBUFNFOlxubW0vbWFkdmlzZS5jOjEzNjM6XHRcdHJldHVybiBtYWR2aXNlX2NvbGxhcHNlKHZtYSwgcmFuZ2UtXHUwMDNlc3RhcnQsIHJhbmdlLVx1MDAzZWVuZCxcbm1tL21hZHZpc2UuYy0xMzY0LVx0XHRcdFx1MDAyNm1hZHZfYmVoYXZpb3ItXHUwMDNlbG9ja19kcm9wcGVkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU5NjkKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA1OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipJbml0aWFsIEFzc2Vzc21lbnQ6IE1BRFZfQ09MTEFQU0UgaXMgYSBUYXJnZXQqKgoKQWxyaWdodCwgc28gYG1hZHZpc2VfY29sbGFwc2VgIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgYG1hZHZpc2VgIHdpdGggdGhlIGBNQURWX0NPTExBUFNFYCBmbGFnLiBUaGF0IG1ha2VzIGl0IGltbWVkaWF0ZWx5IGludGVyZXN0aW5nIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLiBJdCYjMzk7cyBjb3JlIGtlcm5lbCBjb2RlLCBkaXJlY3RseSBhZGRyZXNzYWJsZSwgYW5kIHJpcGUgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5IGRpc2NvdmVyeS4gQSBzdHJhaWdodGZvcndhcmQgcm91dGUgdG8gcmVhY2ggaXQuIEdvb2QuCgpOb3csIG15IG5leHQgc3RlcCBpcyBjbGVhcjogSSBuZWVkIHRvIGRlbHZlIGludG8gdGhlIGBtYWR2aXNlX2NvbGxhcHNlYCBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHRyYWNlIHRoZSBjb2RlIHBhdGgsIGlkZW50aWZ5IHRoZSBmdW5jdGlvbnMgaXQgY2FsbHMsIGFuZCB1bmRlcnN0YW5kIGl0cyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBLbm93aW5nIHdoYXQgaXQgdG91Y2hlcyBpcyBrZXkgdG8gY29uc3RydWN0aW5nIGVmZmVjdGl2ZSBmdXp6aW5nIHN0cmF0ZWdpZXMuIEdvdHRhIHVuZGVyc3RhbmQgdGhlIGVjb3N5c3RlbSB0aGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGhpbi4gRnJvbSB0aGVyZSwgSSBjYW4gZmlndXJlIG91dCB3aGF0IHBhcnRzIG9mIHRoZSBzeXN0ZW0gYXJlIG1vc3QgbGlrZWx5IHRvIGZhaWwgdW5kZXIgc3RyZXNzZnVsIGFuZCB1bmV4cGVjdGVkIGlucHV0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz0zMTc0PWJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMxNzgtXG5tbS9raHVnZXBhZ2VkLmM6MzE3OTpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxubW0va2h1Z2VwYWdlZC5jLTMxODAte1xuLS1cbm1tL2todWdlcGFnZWQuYy0zMjEwLVxubW0va2h1Z2VwYWdlZC5jOjMyMTE6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG5tbS9raHVnZXBhZ2VkLmMtMzIxMi1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMjk4LVx0cmV0dXJuIHRocHMgPT0gKChoZW5kIC0gaHN0YXJ0KSBcdTAwM2VcdTAwM2UgSFBBR0VfUE1EX1NISUZUKSA/IDBcbm1tL2todWdlcGFnZWQuYzozMjk5Olx0XHRcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xubW0va2h1Z2VwYWdlZC5jLTMzMDAtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjUyMwoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgYG1hZHZpc2VfY29sbGFwc2VgJiMzOTtzIERlcGVuZGVuY3kgb24gSHVnZSBQYWdlIENvbGxhcHNlIE1lY2hhbmlzbXMqKgoKQWxyaWdodCwgSSYjMzk7bSBkaXZpbmcgaW50byB0aGUgYG1hZHZpc2VfY29sbGFwc2VgIGZ1bmN0aW9uLiBNeSBwcmltYXJ5IGZvY3VzIHJpZ2h0IG5vdyBpcyBwaW5wb2ludGluZyBob3cgaXQgaGFuZGxlcyBodWdlIHBhZ2UgY29sbGFwc2VzLiBUaGUgcXVlc3Rpb24gaXMsIGRvZXMgYG1hZHZpc2VfY29sbGFwc2VgIGRpcmVjdGx5IGxldmVyYWdlIGVpdGhlciBgY29sbGFwc2VfaHVnZV9wYWdlYCBvciBgY29sbGFwc2Vfc2Nhbl9wbWRgPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udHJvbCBmbG93IGhlcmUsIGJlY2F1c2UgdGhhdCB3aWxsIGRpcmVjdGx5IGFmZmVjdCBvdXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgdW5kZXJseWluZyBtZW1vcnkgbWFuYWdlbWVudCBzdHJhdGVneS4gU3BlY2lmaWNhbGx5LCBhcmUgd2UgbG9va2luZyBhdCBkaXJlY3QsIHRhcmdldGVkIGNvbGxhcHNlcyBvciBhIG1vcmUgc3dlZXBpbmcgc2Nhbi1iYXNlZCBhcHByb2FjaD8gTXkgZ29hbCBpcyB0byBxdWlja2x5IGFzY2VydGFpbiB3aGV0aGVyIGBtYWR2aXNlX2NvbGxhcHNlYCB0cmlnZ2VycyBlaXRoZXIgZnVuY3Rpb24sIGFuZCBpZiBzbywgaG93LiBUaGlzIGlzIGNyaXRpY2FsIGZvciB1bmRlcnN0YW5kaW5nIGl0cyBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbiB3aXRoIGV4aXN0aW5nIGh1Z2UgcGFnZSBjb25maWd1cmF0aW9ucy4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzIxMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MzIxMTpcdGludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxuMzIxMjpcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXG4zMjEzOlx0e1xuMzIxNDpcdFx0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xuMzIxNTpcdFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4zMjE2Olx0XHR1bnNpZ25lZCBsb25nIGhzdGFydCwgaGVuZCwgYWRkcjtcbjMyMTc6XHRcdGVudW0gc2Nhbl9yZXN1bHQgbGFzdF9mYWlsID0gU0NBTl9GQUlMO1xuMzIxODpcdFx0aW50IHRocHMgPSAwO1xuMzIxOTpcdFx0Ym9vbCBtbWFwX3VubG9ja2VkID0gZmFsc2U7XG4zMjIwOlx0XG4zMjIxOlx0XHRCVUdfT04odm1hLVx1MDAzZXZtX3N0YXJ0IFx1MDAzZSBzdGFydCk7XG4zMjIyOlx0XHRCVUdfT04odm1hLVx1MDAzZXZtX2VuZCBcdTAwM2MgZW5kKTtcbjMyMjM6XHRcbjMyMjQ6XHRcdGlmICghY29sbGFwc2VfcG9zc2libGUodm1hLCB2bWEtXHUwMDNldm1fZmxhZ3MsIFRWQV9GT1JDRURfQ09MTEFQU0UpKVxuMzIyNTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjMyMjY6XHRcbjMyMjc6XHRcdGhzdGFydCA9IEFMSUdOKHN0YXJ0LCBIUEFHRV9QTURfU0laRSk7XG4zMjI4Olx0XHRoZW5kID0gQUxJR05fRE9XTihlbmQsIEhQQUdFX1BNRF9TSVpFKTtcbjMyMjk6XHRcbjMyMzA6XHRcdGlmIChoc3RhcnQgXHUwMDNlPSBoZW5kKVxuMzIzMTpcdFx0XHRyZXR1cm4gMDtcbjMyMzI6XHRcbjMyMzM6XHRcdGNjID0ga21hbGxvY19vYmooKmNjKTtcbjMyMzQ6XHRcdGlmICghY2MpXG4zMjM1Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuMzIzNjpcdFx0Y2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA9IGZhbHNlO1xuMzIzNzpcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MgPSAwO1xuMzIzODpcdFxuMzIzOTpcdFx0bW1ncmFiKG1tKTtcbjMyNDA6XHRcdGxydV9hZGRfZHJhaW5fYWxsKCk7XG4zMjQxOlx0XG4zMjQyOlx0XHRmb3IgKGFkZHIgPSBoc3RhcnQ7IGFkZHIgXHUwMDNjIGhlbmQ7IGFkZHIgJiM0Mzs9IEhQQUdFX1BNRF9TSVpFKSB7XG4zMjQzOlx0XHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuMzI0NDpcdFxuMzI0NTpcdFx0XHRpZiAobW1hcF91bmxvY2tlZCkge1xuMzI0NjpcdFx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuMzI0NzpcdFx0XHRcdG1tYXBfcmVhZF9sb2NrKG1tKTtcbjMyNDg6XHRcdFx0XHRtbWFwX3VubG9ja2VkID0gZmFsc2U7XG4zMjQ5Olx0XHRcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4zMjUwOlx0XHRcdFx0cmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHIsIGZhbHNlLCBcdTAwMjZ2bWEsXG4zMjUxOlx0XHRcdFx0XHRcdFx0XHQgY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4zMjUyOlx0XHRcdFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcbjMyNTM6XHRcdFx0XHRcdGxhc3RfZmFpbCA9IHJlc3VsdDtcbjMyNTQ6XHRcdFx0XHRcdGdvdG8gb3V0X25vbG9jaztcbjMyNTU6XHRcdFx0XHR9XG4zMjU2Olx0XG4zMjU3Olx0XHRcdFx0aGVuZCA9IG1pbihoZW5kLCB2bWEtXHUwMDNldm1fZW5kIFx1MDAyNiBIUEFHRV9QTURfTUFTSyk7XG4zMjU4Olx0XHRcdH1cbjMyNTk6XHRcbjMyNjA6XHRcdFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFx1MDAyNm1tYXBfdW5sb2NrZWQsIGNjKTtcbjMyNjE6XHRcbjMyNjI6XHRcdFx0c3dpdGNoIChyZXN1bHQpIHtcbjMyNjM6XHRcdFx0Y2FzZSBTQ0FOX1NVQ0NFRUQ6XG4zMjY0Olx0XHRcdGNhc2UgU0NBTl9QTURfTUFQUEVEOlxuMzI2NTpcdFx0XHRcdCYjNDM7JiM0Mzt0aHBzO1xuMzI2NjpcdFx0XHRcdGJyZWFrO1xuMzI2NzpcdFx0XHQvKiBXaGl0ZWxpc3RlZCBzZXQgb2YgcmVzdWx0cyB3aGVyZSBjb250aW51aW5nIE9LICovXG4zMjY4Olx0XHRcdGNhc2UgU0NBTl9OT19QVEVfVEFCTEU6XG4zMjY5Olx0XHRcdGNhc2UgU0NBTl9QVEVfTk9OX1BSRVNFTlQ6XG4zMjcwOlx0XHRcdGNhc2UgU0NBTl9QVEVfVUZGRDpcbjMyNzE6XHRcdFx0Y2FzZSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFOlxuMzI3MjpcdFx0XHRjYXNlIFNDQU5fUEFHRV9OVUxMOlxuMzI3MzpcdFx0XHRjYXNlIFNDQU5fUEFHRV9DT1VOVDpcbjMyNzQ6XHRcdFx0Y2FzZSBTQ0FOX1BBR0VfTE9DSzpcbjMyNzU6XHRcdFx0Y2FzZSBTQ0FOX1BBR0VfQ09NUE9VTkQ6XG4zMjc2Olx0XHRcdGNhc2UgU0NBTl9QQUdFX0xSVTpcbjMyNzc6XHRcdFx0Y2FzZSBTQ0FOX0RFTF9QQUdFX0xSVTpcbjMyNzg6XHRcdFx0XHRsYXN0X2ZhaWwgPSByZXN1bHQ7XG4zMjc5Olx0XHRcdFx0YnJlYWs7XG4zMjgwOlx0XHRcdGRlZmF1bHQ6XG4zMjgxOlx0XHRcdFx0bGFzdF9mYWlsID0gcmVzdWx0O1xuMzI4MjpcdFx0XHRcdC8qIE90aGVyIGVycm9yLCBleGl0ICovXG4zMjgzOlx0XHRcdFx0Z290byBvdXRfbWF5YmVsb2NrO1xuMzI4NDpcdFx0XHR9XG4zMjg1Olx0XHR9XG4zMjg2Olx0XG4zMjg3Olx0b3V0X21heWJlbG9jazpcbjMyODg6XHRcdC8qIENhbGxlciBleHBlY3RzIHVzIHRvIGhvbGQgbW1hcF9sb2NrIG9uIHJldHVybiAqL1xuMzI4OTpcdFx0aWYgKG1tYXBfdW5sb2NrZWQpIHtcbjMyOTA6XHRcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4zMjkxOlx0XHRcdG1tYXBfcmVhZF9sb2NrKG1tKTtcbjMyOTI6XHRcdH1cbjMyOTM6XHRvdXRfbm9sb2NrOlxuMzI5NDpcdFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcbjMyOTU6XHRcdG1tZHJvcChtbSk7XG4zMjk2Olx0XHRrZnJlZShjYyk7XG4zMjk3Olx0XG4zMjk4Olx0XHRyZXR1cm4gdGhwcyA9PSAoKGhlbmQgLSBoc3RhcnQpIFx1MDAzZVx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxuMzI5OTpcdFx0XHRcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xuMzMwMDpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgxMDEKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYG1hZHZpc2VfY29sbGFwc2VgIGFuZCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAqKgoKT2theSwgc28gSSBzZWUgYG1hZHZpc2VfY29sbGFwc2VgIGlzIGNhbGxpbmcgYGNvbGxhcHNlX3NpbmdsZV9wbWRgLiBOYXR1cmFsbHksIG15IGZpcnN0IGluc3RpbmN0IGlzIHRvIGRpdmUgaW50byBgY29sbGFwc2Vfc2luZ2xlX3BtZGAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCYjMzk7cyBnb2luZyBvbiB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyB0aGUgZW50cnkgcG9pbnQsIGJ1dCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAgaXMgY2xlYXJseSB3aGVyZSB0aGUgY29yZSBvcGVyYXRpb24gaXMgaGFwcGVuaW5nLiBJIG5lZWQgdG8gdHJhY2UgdGhlIGZsb3csIHNlZSB3aGF0IGRhdGEgc3RydWN0dXJlcyBpdCYjMzk7cyBvcGVyYXRpbmcgb24sIGFuZCB1bmRlcnN0YW5kIHRoZSBsb2dpYyBiZWhpbmQgdGhlIGNvbGxhcHNlIG1lY2hhbmlzbS4gV2hhdCBhcmUgdGhlIHByZWNvbmRpdGlvbnM/IFdoYXQgYXJlIHRoZSBlZGdlIGNhc2VzPyBJJiMzOTttIGFudGljaXBhdGluZyB0aGlzIGlzIHdoZXJlIHRoZSByZWFsIGludGVyZXN0aW5nIHN0dWZmIGhhcHBlbnMsIHNvIGxldCYjMzk7cyBnZXQgaW50byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29sbGFwc2Vfc2luZ2xlX3BtZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MjcwMT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI4MTAtICovXG5tbS9raHVnZXBhZ2VkLmM6MjgxMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcbm1tL2todWdlcGFnZWQuYy0yODEyLVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCAqbG9ja19kcm9wcGVkLFxuLS1cbm1tL2todWdlcGFnZWQuYz0yODY4PXN0YXRpYyB2b2lkIGNvbGxhcHNlX3NjYW5fbW1fc2xvdCh1bnNpZ25lZCBpbnQgcHJvZ3Jlc3NfbWF4LFxuLS1cbm1tL2todWdlcGFnZWQuYy0yOTM4LVxubW0va2h1Z2VwYWdlZC5jOjI5Mzk6XHRcdFx0KnJlc3VsdCA9IGNvbGxhcHNlX3NpbmdsZV9wbWQoa2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MsXG5tbS9raHVnZXBhZ2VkLmMtMjk0MC1cdFx0XHRcdFx0XHQgICAgICB2bWEsIFx1MDAyNmxvY2tfZHJvcHBlZCwgY2MpO1xuLS1cbm1tL2todWdlcGFnZWQuYz0zMjExPWludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxuLS1cbm1tL2todWdlcGFnZWQuYy0zMjU5LVxubW0va2h1Z2VwYWdlZC5jOjMyNjA6XHRcdHJlc3VsdCA9IGNvbGxhcHNlX3NpbmdsZV9wbWQoYWRkciwgdm1hLCBcdTAwMjZtbWFwX3VubG9ja2VkLCBjYyk7XG5tbS9raHVnZXBhZ2VkLmMtMzI2MS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg2OTEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIHRoZSBGdW5jdGlvbiAmIzM5O2NvbGxhcHNlX3NpbmdsZV9wbWQmIzM5OyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgZnVuY3Rpb24sIGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2Ugd2l0aGluIHRoZSBicm9hZGVyIGNvbnRleHQuIFdoYXQmIzM5O3MgaXRzIHJvbGU/IElzIGl0IGEgY29yZSBjb21wb25lbnQgb3IgYSB1dGlsaXR5IGZ1bmN0aW9uPyBCYXNlZCBvbiB0aGUgbmFtZSwgbXkgZ3Vlc3MgaXMgaXQmIzM5O3MgZGVzaWduZWQgdG8gdGFrZSBhIHNpbmdsZSBQTUQgKHByZXN1bWFibHkgYSAmIzM0O1BhcnRpYWwgTW9kZSBEZWNvbXBvc2l0aW9uJiMzNDsgb2JqZWN0IG9yIHNpbWlsYXIsIGRlcGVuZGluZyBvbiB0aGUgZmllbGQpIGFuZCByZWR1Y2UgaXQsIG9yICYjMzQ7Y29sbGFwc2UmIzM0OyBpdCwgaW4gc29tZSB3YXkuIFRoZSAmIzM0O3NpbmdsZSYjMzQ7IHBhcnQgaXMga2V5OyBpdCBoaW50cyBhdCBlaXRoZXIgYSBiYXRjaC1wcm9jZXNzaW5nIHNjZW5hcmlvICh3aGVyZSB0aGlzIHdvdWxkIGJlIG9uZSBpdGVyYXRpb24pIG9yIGEgZnVuY3Rpb24gc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciBpbmRpdmlkdWFsIG9wZXJhdGlvbnMuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBhdCBpdHMgaW1wbGVtZW50YXRpb24gb3IgYXQgbGVhc3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG8gY29uZmlybSB0aGlzLiBXaGF0IGFyZSBpdHMgaW5wdXRzPyBXaGF0JiMzOTtzIHRoZSBhbnRpY2lwYXRlZCBvdXRwdXQgZm9ybWF0PyBBcmUgdGhlcmUgYW55IHByZWNvbmRpdGlvbnMgaXQgZXhwZWN0cywgc3VjaCBhcyB0aGUgUE1EIGJlaW5nIGFscmVhZHkgcHJlcHJvY2Vzc2VkPyBBcmUgdGhlcmUgcG90ZW50aWFsIGVkZ2UgY2FzZXMgb3IgZXJyb3IgY29uZGl0aW9ucyBpdCYjMzk7cyBkZXNpZ25lZCB0byBoYW5kbGUsIG9yIGRvZXMgaXQgYXNzdW1lIGNlcnRhaW4gZGF0YSBzdHJ1Y3R1cmVzPyBHZXR0aW5nIGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBpcyB0aGUgZmlyc3Qgc3RlcCB0b3dhcmRzIHVuZGVyc3RhbmRpbmcgaXRzIGZ1bmN0aW9uYWxpdHkgYW5kIGhvdyBpdCBtaWdodCBmaXQgaW50byBhIGxhcmdlciBkYXRhIGFuYWx5c2lzIHBpcGVsaW5lLiBJJiMzOTttIGtlZW4gdG8gc2VlIGlmIHRoaXMgZnVuY3Rpb24gaXMgb3B0aW1pemVkIGZvciBzcGVlZCBvciBmb3IgY2xhcml0eSwgb3IgaWYgaXQgbWFrZXMgYW55IGFzc3VtcHRpb25zIEkgbmVlZCB0byBiZSBhd2FyZSBvZi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODExLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzI4MTE6XHRzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcbjI4MTI6XHRcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGJvb2wgKmxvY2tfZHJvcHBlZCxcbjI4MTM6XHRcdFx0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuMjgxNDpcdHtcbjI4MTU6XHRcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuMjgxNjpcdFx0Ym9vbCB0cmlnZ2VyZWRfd2IgPSBmYWxzZTtcbjI4MTc6XHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xuMjgxODpcdFx0c3RydWN0IGZpbGUgKmZpbGU7XG4yODE5Olx0XHRwZ29mZl90IHBnb2ZmO1xuMjgyMDpcdFxuMjgyMTpcdFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcbjI4MjI6XHRcbjI4MjM6XHRcdGlmICh2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcbjI4MjQ6XHRcdFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9wbWQobW0sIHZtYSwgYWRkciwgbG9ja19kcm9wcGVkLCBjYyk7XG4yODI1Olx0XHRcdGdvdG8gZW5kO1xuMjgyNjpcdFx0fVxuMjgyNzpcdFxuMjgyODpcdFx0ZmlsZSA9IGdldF9maWxlKHZtYS1cdTAwM2V2bV9maWxlKTtcbjI4Mjk6XHRcdHBnb2ZmID0gbGluZWFyX3BhZ2VfaW5kZXgodm1hLCBhZGRyKTtcbjI4MzA6XHRcbjI4MzE6XHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuMjgzMjpcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4yODMzOlx0cmV0cnk6XG4yODM0Olx0XHRyZXN1bHQgPSBjb2xsYXBzZV9zY2FuX2ZpbGUobW0sIGFkZHIsIGZpbGUsIHBnb2ZmLCBjYyk7XG4yODM1Olx0XG4yODM2Olx0XHQvKlxuMjgzNzpcdFx0ICogRm9yIE1BRFZfQ09MTEFQU0UsIHdoZW4gZW5jb3VudGVyaW5nIGRpcnR5IHBhZ2VzLCB0cnkgdG8gd3JpdGViYWNrLFxuMjgzODpcdFx0ICogdGhlbiByZXRyeSB0aGUgY29sbGFwc2Ugb25lIHRpbWUuXG4yODM5Olx0XHQgKi9cbjI4NDA6XHRcdGlmICghY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgcmVzdWx0ID09IFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0sgXHUwMDI2XHUwMDI2XG4yODQxOlx0XHQgICAgIXRyaWdnZXJlZF93YiBcdTAwMjZcdTAwMjYgbWFwcGluZ19jYW5fd3JpdGViYWNrKGZpbGUtXHUwMDNlZl9tYXBwaW5nKSkge1xuMjg0MjpcdFx0XHRjb25zdCBsb2ZmX3QgbHN0YXJ0ID0gKGxvZmZfdClwZ29mZiBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbjI4NDM6XHRcdFx0Y29uc3QgbG9mZl90IGxlbmQgPSBsc3RhcnQgJiM0MzsgSFBBR0VfUE1EX1NJWkUgLSAxO1xuMjg0NDpcdFxuMjg0NTpcdFx0XHRmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGZpbGUtXHUwMDNlZl9tYXBwaW5nLCBsc3RhcnQsIGxlbmQpO1xuMjg0NjpcdFx0XHR0cmlnZ2VyZWRfd2IgPSB0cnVlO1xuMjg0NzpcdFx0XHRnb3RvIHJldHJ5O1xuMjg0ODpcdFx0fVxuMjg0OTpcdFx0ZnB1dChmaWxlKTtcbjI4NTA6XHRcbjI4NTE6XHRcdGlmIChyZXN1bHQgPT0gU0NBTl9QVEVfTUFQUEVEX0hVR0VQQUdFKSB7XG4yODUyOlx0XHRcdG1tYXBfcmVhZF9sb2NrKG1tKTtcbjI4NTM6XHRcdFx0aWYgKGNvbGxhcHNlX3Rlc3RfZXhpdF9vcl9kaXNhYmxlKG1tKSlcbjI4NTQ6XHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0FOWV9QUk9DRVNTO1xuMjg1NTpcdFx0XHRlbHNlXG4yODU2Olx0XHRcdFx0cmVzdWx0ID0gdHJ5X2NvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKG1tLCBhZGRyLFxuMjg1NzpcdFx0XHRcdFx0XHRcdFx0ICAgICAhY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCk7XG4yODU4Olx0XHRcdGlmIChyZXN1bHQgPT0gU0NBTl9QTURfTUFQUEVEKVxuMjg1OTpcdFx0XHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbjI4NjA6XHRcdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE1IDA4OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5ODU5CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBUSFAgQ29sbGFwc2UqKgoKT2theSwgc28gYGNvbGxhcHNlX3NpbmdsZV9wbWRgIGlzIHRoZSBrZXksIGFuZCBpdCBjYWxscyBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgY29sbGFwc2Vfc2Nhbl9maWxlYC4gR29vZC4gV2Uga25vdyB0aG9zZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBUaGF0IG1lYW5zIHRoaXMgaXMgYWxsIHJlYWNoYWJsZSB0aHJvdWdoIGBtYWR2aXNlKC4uLiwgTUFEVl9DT0xMQVBTRSlgICphbmQqIHRoZSBiYWNrZ3JvdW5kIGBraHVnZXBhZ2VkYCBkYWVtb24uIFBlcmZlY3QuIFRoYXQmIzM5O3MgYSBzb2xpZCBhdHRhY2sgc3VyZmFjZSBmb3IgZnV6emluZy4gVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIHB1cnN1aW5nLgoKTGV0JiMzOTtzIHF1aWNrbHkgcmVjYXAgd2hhdCYjMzk7cyBjaGFuZ2VkOgoKKiAgIFdlJiMzOTtyZSBsb29raW5nIGF0IG1vZGlmaWNhdGlvbnMgdG8gYG1tL2todWdlcGFnZWQuY2AuCiogICBBbmQgdGhlIGRvY3VtZW50YXRpb24gdXBkYXRlIGluIGBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RgIHByb3ZpZGVzIGNvbnRleHQuCgpFc3NlbnRpYWxseSwgdGhlIGNoYW5nZXMgcmVzdHJ1Y3R1cmUgdGhlIFBURS1jaGVja2luZyBsb2dpYyB3aXRoaW4gYGtodWdlcGFnZWRgLiBUaGV5JiMzOTt2ZSBjcmVhdGVkIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIHRoZSBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCwgcmVmYWN0b3JpbmcgaG93IGJvdGggYW5vbnltb3VzIGFuZCBmaWxlLWJhY2tlZCBUSFAgY29sbGFwc2Ugd29yay4KClNvIHRoZSBtYWluIHN5bWJvbHMgdG8gZm9jdXMgb24gYXJlOgoKKiAgIGBjb2xsYXBzZV9jaGVja19wdGVgICh0aGF0IG5ldyBoZWxwZXIpCiogICBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAKKiAgIGBjb2xsYXBzZV9zY2FuX3BtZGAKKiAgIGBjb2xsYXBzZV9zY2FuX2ZpbGVgCiogICBgY29sbGFwc2VfaHVnZV9wYWdlYAoqICAgYG1hZHZpc2VfY29sbGFwc2VgCgpOb3csIGxldCYjMzk7cyBuYWlsIGRvd24gdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9ucyB0byB0ZXN0IHRoaXMgZWZmZWN0aXZlbHkuIFdlIG5lZWQ6CgoqICAgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYAoqICAgRWl0aGVyIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIG9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFYC4KCkp1c3QgdG8gYmUgdGhvcm91Z2gsIGFyZSB0aGVyZSBhbnkgKm90aGVyKiByZWxhdGVkIGNvbmZpZ3Mgd2Ugc2hvdWxkIGJlIGF3YXJlIG9mPyBMZXQmIzM5O3MgY2hlY2sgYENPTkZJR19SRUFEX09OTFlfVEhQX0ZPUl9GU2AuLi4gTWlnaHQgYmUgd29ydGggYSBxdWljayBsb29rIGluIGBtbS9LY29uZmlnYCB0byBzZWUgaWYgdGhlcmUmIzM5O3MgYW55dGhpbmcgZWxzZSB0aGF0JiMzOTtzIHJlbGV2YW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1JFQURfT05MWV9USFBfRk9SX0ZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTUgMDg6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA2NDcKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiA1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKktlcm5lbCBDb25maWd1cmF0aW9uIEh1bnRpbmcqKgoKUmlnaHQsIHNvIEkmIzM5O20gdHJ5aW5nIHRvIHRyYWNrIGRvd24gdGhpcyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBJdCYjMzk7cyBjb21pbmcgdG8gbWUgdGhhdCBJIG1pZ2h0IGJlIGRlYWxpbmcgd2l0aCBhbiBvbGRlciBrZXJuZWwgdmVyc2lvbiB3aGVyZSBpdCB3YXMgc3BlY2lmaWNhbGx5IGxhYmVsbGVkIGFzIGBDT05GSUdfUkVBRF9PTkxZX1RIUF9GT1JfRlNgLCBvciBzb21ldGhpbmcgc2ltaWxhci4gTW9yZSBsaWtlbHksIGFuZCBtb3JlIGNvbnRlbXBvcmFyeSwgSSYjMzk7bSBwcm9iYWJseSBsb29raW5nIGZvciBzaW1wbHkgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYC4gSSBrbm93IHRoZXNlIHRoaW5ncyB0ZW5kIHRvIGV2b2x2ZS4KCkJlc3QgYmV0IGlzIHRvIGRpdmUgaW50byB0aGUgS2NvbmZpZyBmaWxlcywgc3BlY2lmaWNhbGx5IGBtbS9LY29uZmlnYC4gVGhhdCYjMzk7cyB3aGVyZSBhbGwgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHJlbGF0ZWQgY29uZmlndXJhdGlvbnMgYXJlIGRlZmluZWQsIGFuZCB0aGUgVEhQLXJlbGF0ZWQgc3R1ZmYgKmhhcyogdG8gYmUgaW4gdGhlcmUuIFRpbWUgdG8gY29uZmlybSBteSBhc3N1bXB0aW9ucyBhbmQgbmFpbCBkb3duIHRoZSBwcmVjaXNlIG5hbWUsIHBvdGVudGlhbCBkZXBlbmRlbmNpZXMsIGFuZCBkZWZhdWx0IHNldHRpbmdzLiBJdCYjMzk7cyBmcnVzdHJhdGluZyB3aGVuIHRoZXNlIG9wdGlvbnMgZ2V0IHJlbmFtZWQuIEkganVzdCBuZWVkIHRvIGdldCB0aGUgcmlnaHQgbm9tZW5jbGF0dXJlIHN0cmFpZ2h0IHNvIEkgY2FuIHByb2NlZWQgd2l0aCB0aGUgdGFzayBhdCBoYW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcuKlRIUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgxMz1jb25maWcgQVJDSF9XQU5UX0dFTkVSQUxfSFVHRVRMQlxuLS1cbm1tL0tjb25maWctODE1LVxubW0vS2NvbmZpZzo4MTY6Y29uZmlnIEFSQ0hfV0FOVFNfVEhQX1NXQVBcbm1tL0tjb25maWctODE3LVx0ZGVmX2Jvb2wgblxuLS1cbm1tL0tjb25maWc9OTcyPWVuZGNob2ljZVxubW0vS2NvbmZpZy05NzMtXG5tbS9LY29uZmlnOjk3NDpjb25maWcgVEhQX1NXQVBcbm1tL0tjb25maWctOTc1LVx0ZGVmX2Jvb2wgeVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTA4NAoJCQkJCQkJb3V0cHV0OiAyMTEKCQkJCQkJCXRob3VnaHRzOiA3NDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIFRIUCBDb2xsYXBzZSBSZWZhY3RvcmluZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IHRhcmdldCBpcyB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBmdW5jdGlvbmFsaXR5IOKAkyB0aGF0JiMzOTtzIHRoZSBjb3JlIGFyZWEgb2YgaW50ZXJlc3QuIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlIGNoYW5nZXMgcmVsYXRlZCB0byBodWdlIHBhZ2UgY29sbGFwc2UsIGFuZCBzcGVjaWZpY2FsbHksIGhvdyB0aGlzIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIChQYWdlIFRhYmxlIEVudHJ5KSBjaGVja2luZyBsb2dpYy4KCkZpcnN0LCBJIGlkZW50aWZpZWQgYG1hZHZpc2VfY29sbGFwc2VgIGFzIGEga2V5IGVudHJ5IHBvaW50LCBzaW5jZSBpdCYjMzk7cyB0aGUgdXNlcnNwYWNlIHRyaWdnZXIgZm9yIHRoaXMgYmVoYXZpb3IuIFdoaWxlIGBraHVnZXBhZ2VkYCBoYW5kbGVzIHRoaXMgaW4gdGhlIGJhY2tncm91bmQsIGBtYWR2aXNlYCBnaXZlcyBhIG1vcmUgZGlyZWN0IHdheSB0byBoaXQgdGhpcyBjb2RlIGR1cmluZyBmdXp6aW5nLgoKTXkgYW5hbHlzaXMgbGVkIG1lIHRvIGEgZmV3IGtleSBmb2N1cyBzeW1ib2xzIHRoYXQgZW5jYXBzdWxhdGUgdGhlIGNvcmUgbW9kaWZpY2F0aW9ucy4gYGNvbGxhcHNlX2NoZWNrX3B0ZWAgaXMgdGhlIG5ldyBoZWxwZXIgZnVuY3Rpb24gaW50cm9kdWNlZCwgYW5kIGl0IGFwcGVhcnMgdG8gYmUgY2VudHJhbCB0byB0aGUgY2hhbmdlcywgc28gSSYjMzk7bGwgYmUga2VlcGluZyBhIHZlcnkgY2xvc2UgZXllIG9uIHRoYXQuIFRoZW4gdGhlcmUmIzM5O3MgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIHdoaWNoIHVzZXMgaXQsIGFsb25nIHdpdGggYGNvbGxhcHNlX3NjYW5fcG1kYCwgYGNvbGxhcHNlX3NjYW5fZmlsZWAgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLiAgSSYjMzk7bSBhbHNvIHBheWluZyBhdHRlbnRpb24gdG8gYGFsbG9jX2NoYXJnZV9mb2xpb2AgZHVlIHRvIGl0cyBtb2RpZmljYXRpb24gdXNpbmcgYGNvdW50X2NvbGxhcHNlX2V2ZW50YC4KCkkgY29uZmlybWVkIHRoYXQgYGNvbGxhcHNlX2NoZWNrX3B0ZWAgaXMgc3RhdGljLCBtZWFuaW5nIGl0IHNob3VsZCBiZSBpbiB0aGUgc3ltYm9sIHRhYmxlIHVubGVzcyBpbmxpbmVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCB0cmFjaW5nLiBgY29sbGFwc2VfaXNfcmVmZXJlbmNlZGAgaXMgc3RhdGljIGlubGluZSwgc28gaXQgbWlnaHQgYmUgaW5saW5lZC4gYGNvdW50X2NvbGxhcHNlX2V2ZW50YCBpcyBhbHNvIHN0YXRpYywgc28gaXQgc2hvdWxkIGJlIGluIHRoZSBzeW1ib2wgdGFibGUuCgpUaGVyZWZvcmUsIHRoZSBrZXkgc3ltYm9scyBJJiMzOTttIGZvY3VzaW5nIG9uIGFyZToKKiAgIGBjb2xsYXBzZV9jaGVja19wdGVgCiogICBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAKKiAgIGBjb2xsYXBzZV9zY2FuX3BtZGAKKiAgIGBjb2xsYXBzZV9zY2FuX2ZpbGVgCiogICBgY29sbGFwc2VfaHVnZV9wYWdlYAoKTXkgcmVhc29uaW5nIGlzIHRoYXQgdGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIGR1cmluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgY29sbGFwc2UsIGludm9sdmluZyBuZXcgc3RydWN0dXJlcyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiBga2h1Z2VwYWdlZGAgYW5kIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgY2hhbmdlIHRvIGhvdyBwYWdlcyBhcmUgbWFuYWdlZCBhbmQgY29sbGFwc2VkIGludG8gVEhQcywgYW5kIHRoYXQmIzM5O3MgcHJlY2lzZWx5IHdoZXJlIG15IGF0dGVudGlvbiBsaWVzLgoKSW4gdGVybXMgb2YgY29uZmlndXJhdGlvbiwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCAoYW5kIHNwZWNpZmljYWxseSwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VgIHdoaWNoIGNvbnRyb2xzIHRoZSBgbWFkdmlzZWAgYmVoYXZpb3IpIHdpbGwgYmUgY3JpdGljYWwgdG8gcmVwcm9kdWNlIHRoaXMgYmVoYXZpb3IuIEl0IHNlZW1zIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIGlzIGFub3RoZXIgb3B0aW9uIHRoYXQgd29ya3MuCgpPa2F5LCBsZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNSAwODo1NzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29sbGFwc2VfY2hlY2tfcHRlJiMzNDssCiAgICAmIzM0O19fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUmIzM0OywKICAgICYjMzQ7Y29sbGFwc2Vfc2Nhbl9wbWQmIzM0OywKICAgICYjMzQ7Y29sbGFwc2Vfc2Nhbl9maWxlJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX2h1Z2VfcGFnZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBkdXJpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIGNvbGxhcHNlIGluIGBraHVnZXBhZ2VkYC4gSXQgaW50cm9kdWNlcyBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBoZWxwZXIgZnVuY3Rpb24sIHdoaWNoIGFyZSB1c2VkIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGFuZCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFRoaXMgbW9kaWZpZXMgdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIGNvbGxhcHNpbmcgcGFnZXMgaW50byBUSFBzLCB3aGljaCBpcyByZWFjaGFibGUgdmlhIHRoZSBiYWNrZ3JvdW5kIGBraHVnZXBhZ2VkYCBkYWVtb24gYW5kIHRoZSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgc3lzY2FsbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29sbGFwc2VfY2hlY2tfcHRlJiMzNDssCiAgICAmIzM0O19fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUmIzM0OywKICAgICYjMzQ7Y29sbGFwc2Vfc2Nhbl9wbWQmIzM0OywKICAgICYjMzQ7Y29sbGFwc2Vfc2Nhbl9maWxlJiMzNDssCiAgICAmIzM0O2NvbGxhcHNlX2h1Z2VfcGFnZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBkdXJpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIGNvbGxhcHNlIGluIGBraHVnZXBhZ2VkYC4gSXQgaW50cm9kdWNlcyBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBoZWxwZXIgZnVuY3Rpb24sIHdoaWNoIGFyZSB1c2VkIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGFuZCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFRoaXMgbW9kaWZpZXMgdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZm9yIGNvbGxhcHNpbmcgcGFnZXMgaW50byBUSFBzLCB3aGljaCBpcyByZWFjaGFibGUgdmlhIHRoZSBiYWNrZ3JvdW5kIGBraHVnZXBhZ2VkYCBkYWVtb24gYW5kIHRoZSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgc3lzY2FsbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU1OjQyLjM0Mjk2MjM4NloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg4MjA2MTUzNTM0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJjb2xsYXBzZV9jaGVja19wdGVcIixcbiAgICBcIl9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVcIixcbiAgICBcImNvbGxhcHNlX3NjYW5fcG1kXCIsXG4gICAgXCJjb2xsYXBzZV9zY2FuX2ZpbGVcIixcbiAgICBcImNvbGxhcHNlX2h1Z2VfcGFnZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIGR1cmluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgY29sbGFwc2UgaW4gYGtodWdlcGFnZWRgLiBJdCBpbnRyb2R1Y2VzIGEgbmV3IGBwdGVfY2hlY2tfY29udGV4dGAgc3RydWN0IGFuZCBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGhlbHBlciBmdW5jdGlvbiwgd2hpY2ggYXJlIHVzZWQgaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgYW5kIGBjb2xsYXBzZV9zY2FuX3BtZCgpYC4gVGhpcyBtb2RpZmllcyB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBmb3IgY29sbGFwc2luZyBwYWdlcyBpbnRvIFRIUHMsIHdoaWNoIGlzIHJlYWNoYWJsZSB2aWEgdGhlIGJhY2tncm91bmQgYGtodWdlcGFnZWRgIGRhZW1vbiBhbmQgdGhlIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYCBzeXNjYWxsLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NTo0Mi4zNDI5NzA1OTZaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyNzI4NTgxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDliNDRjNjY2MTUxNjA5MzViODFmMjVmMmI4YTQ0ZGQxMjA1ODc3YmJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBKdWwgMTUgMDg6NTU6NDAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XFxuaW5kZXggMTZmMzcxMzVlZDgwZGYuLmIxODdkNjE4NDUyZjQ0IDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxcbkBAIC0yMjQsNyArMjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkXFxuIChlaXRoZXIgb2YgdGhlIHBlci1zaXplIGFub24gY29udHJvbCBvciB0aGUgdG9wLWxldmVsIGNvbnRyb2wgYXJlIHNldFxcbiB0byBcXFwiYWx3YXlzXFxcIiBvciBcXFwibWFkdmlzZVxcXCIpLCBhbmQgaXQnbGwgYmUgYXV0b21hdGljYWxseSBzaHV0ZG93biB3aGVuXFxuIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlXFxuLXRvcC1sZXZlbCBjb250cm9sIGFyZSBcXFwibmV2ZXJcXFwiKVxcbit0b3AtbGV2ZWwgY29udHJvbCBhcmUgXFxcIm5ldmVyXFxcIikuXFxuIFxcbiBwcm9jZXNzIFRIUCBjb250cm9sc1xcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxcbkBAIC0zMDEsNyArMzAxLDkgQEAgYmVpbmcgcmVwbGFjZWQgYnkgYSBQTUQgbWFwcGluZywgb3IgKDIpIHBoeXNpY2FsIHBhZ2VzIHJlcGxhY2VkIGJ5IG9uZVxcbiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LFxcbiBvciB0b2dldGhlciwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG1lbW9yeSBhbmQgdGhlIGZhaWx1cmVzIHRoYXQgb2NjdXIuXFxuIEFzIHN1Y2gsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIHJvdWdobHkgYXMgYSBzaWduIG9mIHByb2dyZXNzLFxcbi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6XFxuK2FuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcuXFxuK1Blci1vcmRlciBtVEhQIGNvbGxhcHNlIHN0YXRpc3RpY3MgYXJlIGFsc28gYXZhaWxhYmxlIHVuZGVyXFxuKy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy1cXHUwMDNjc2l6ZVxcdTAwM2VrQi9zdGF0cy8pOjpcXG4gXFxuIFxcdC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkXFxuIFxcbmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmNcXG5pbmRleCA1NTE1NzU2N2RjNGNjMS4uNDAxMjVkY2I0ZGU5ZDYgMTAwNjQ0XFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXFxuKysrIGIvbW0va2h1Z2VwYWdlZC5jXFxuQEAgLTY0LDYgKzY0LDEyIEBAIGVudW0gc2Nhbl9yZXN1bHQge1xcbiBcXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxcbiB9O1xcbiBcXG4rZW51bSBwdGVfY2hlY2tfcmVzdWx0IHtcXG4rXFx0UFRFX0NIRUNLX1NVQ0NFRUQsXFxuK1xcdFBURV9DSEVDS19GQUlMLFxcbitcXHRQVEVfQ0hFQ0tfQ09OVElOVUUsXFxuK307XFxuK1xcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcXG4gI2luY2x1ZGUgXFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXFx1MDAzZVxcbiBcXG5AQCAtMTE4LDYgKzEyNCwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7XFxuIFxcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcXG4gfTtcXG4gXFxuK3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7XFxuK1xcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XFxuK1xcdHVuc2lnbmVkIGludCBvcmRlcjtcXG4rXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4rXFx0aW50IG5vbmVfb3JfemVybztcXG4rXFx0aW50IHNoYXJlZDtcXG4rXFx0aW50IHVubWFwcGVkO1xcbitcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDtcXG4rXFx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7XFxuK1xcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xcbitcXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkO1xcbit9O1xcbitcXG4gLyoqXFxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXFxuICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuXFxuQEAgLTYyMCw3ICs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0XFxuIFxcdFxcdCAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1blxcbi1cXHRcXHQgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcXG4rXFx0XFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxcbiBcXHRcXHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxcbiBcXHRcXHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXFxuIFxcdFxcdCAqL1xcbkBAIC02MjksNiArNjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuIFxcdH1cXG4gfVxcbiBcXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxcbit7XFxuK1xcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbitcXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRiaXRtYXBfemVybyhjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiB7XFxuIFxcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXFxuQEAgLTY2NSw3NiArNjkyLDE1NiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBjb2xsYXBzZV9pc19yZWZlcmVuY2VkKCkgLSBDaGVjayBmb3IgZW5vdWdoIHJlZmVyZW5jZWQgUFRFcyB0byBqdXN0aWZ5IGNvbGxhcHNpbmdcXG4rICpcXG4rICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZSBwYWdlIGhhcyBiZWVuXFxuKyAqIHJlY2VudGx5IGFjY2Vzc2VkICh5b3VuZyBwdGUpIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZS5cXG4rICpcXG4rICogUmV0dXJuOiB0cnVlIGlmIHRoZSBwYWdlIGhhcyBiZWVuIHJlY2VudGx5IGFjY2Vzc2VkLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBib29sIGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLCBwdGVfdCBwdGV2YWwsXFxuK1xcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpXFxuK3tcXG4rXFx0cmV0dXJuIGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcXG4rXFx0XFx0Zm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxcbitcXHRcXHRtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXFx1MDAzZXZtX21tLCBhZGRyKSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LFxcbitcXHRcXHRlbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpXFxuK3tcXG4rXFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuK1xcdFxcdGNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTtcXG4rXFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBtdGhwX2V2ZW50KTtcXG4rfVxcbitcXG4rLypcXG4rICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmRcXG4rICogcmV0dXJuIFBURV9DSEVDS19GQUlMLlxcbisgKi9cXG4rc3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcXG4rXFx0XFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpXFxuK3tcXG4rXFx0Y3R4LVxcdTAwM2VyZXN1bHQgPSByZXN1bHQ7XFxuK1xcdHJldHVybiBQVEVfQ0hFQ0tfRkFJTDtcXG4rfVxcbitcXG4rLypcXG4rICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2VcXG4rICpcXG4rICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6XFxuKyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkXFxuKyAqIC0gdWZmZCBpcyBub3QgYWN0aXZlXFxuKyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnRcXG4rICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudFxcbisgKlxcbisgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxcbisgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci5cXG4rICpcXG4rICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcXG4rICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXFxuKyAqICAgICAgICAgUFRFX0NIRUNLX0NPTlRJTlVFIGlmIHRoZSBzY2FuIHNob3VsZCBjb250aW51ZSB0byBjaGVjayB0aGUgbmV4dCBQVEUuXFxuKyAqL1xcbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXFxuK3tcXG4rXFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbitcXHRcXHRpZiAoKytjdHgtXFx1MDAzZW5vbmVfb3JfemVybyBcXHUwMDNlIGN0eC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsXFxuK1xcdFxcdFxcdFxcdFxcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX05PTkVfUFRFKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xcbitcXHR9XFxuK1xcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xcbitcXHRcXHRpZiAoY3R4LVxcdTAwM2V1bm1hcHBlZCA9PSAtMSlcXG4rXFx0XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfTk9OX1BSRVNFTlQpO1xcbitcXHRcXHRpZiAoKytjdHgtXFx1MDAzZXVubWFwcGVkIFxcdTAwM2UgY3R4LVxcdTAwM2VtYXhfcHRlc19zd2FwKSB7XFxuK1xcdFxcdFxcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXHRcXHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xcbitcXHR9XFxuK1xcdC8qXFxuK1xcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXFxuK1xcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcXG4rXFx0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxcbitcXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxcbitcXHQgKi9cXG4rXFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXG4rXFx0Y3R4LVxcdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXFx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcXG4rXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4rXFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbitcXHQgKi9cXG4rXFx0aWYgKGN0eC1cXHUwMDNlY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgIShjdHgtXFx1MDAzZXZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9EUk9QUEFCTEUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC1cXHUwMDNlZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcXG4rXFxuK1xcdGlmICghZm9saW9fdGVzdF9hbm9uKGN0eC1cXHUwMDNlZm9saW8pKSB7XFxuK1xcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXFx1MDAzZWZvbGlvKSwgY3R4LVxcdTAwM2Vmb2xpbyk7XFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LVxcdTAwM2Vmb2xpbykpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcXG4rXFx0XFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXFxuK1xcdFxcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcXG4rXFx0XFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2VzaGFyZWQgXFx1MDAzZSBjdHgtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xcbitcXHRcXHRcXHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7XFxuK31cXG4rXFxuIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxcbiBcXHRcXHR1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KVxcbiB7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKTtcXG4gXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4tXFx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcXG4gXFx0dW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjtcXG4tXFx0cHRlX3QgKl9wdGU7XFxuLVxcdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcXG4rXFx0cHRlX3QgKl9wdGUsIHB0ZXZhbDtcXG4rXFx0aW50IHJlZmVyZW5jZWQgPSAwO1xcbiBcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcXG4rXFx0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcXG4rXFx0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcXG4rXFx0XFx0LmNjID0gY2MsXFxuK1xcdFxcdC52bWEgPSB2bWEsXFxuK1xcdFxcdC5vcmRlciA9IG9yZGVyLFxcbitcXHRcXHQudW5tYXBwZWQgPSAtMSwgLyogZG9uJ3QgY2hlY2sgc3dhcCBQVEVzICovXFxuK1xcdFxcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlciksXFxuK1xcdFxcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSxcXG4rXFx0fTtcXG4gXFxuIFxcdGZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSBcXHUwMDNjIHB0ZSArIG5yX3BhZ2VzO1xcbiBcXHQgICAgIF9wdGUrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcXG4tXFx0XFx0cHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XFxuLVxcdFxcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0aWYgKCsrbm9uZV9vcl96ZXJvIFxcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcXG4tXFx0XFx0XFx0XFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdFxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XFxuLVxcdFxcdFxcdFxcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX05PTl9QUkVTRU5UO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xcbi1cXHRcXHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbi1cXHRcXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4tXFx0XFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2ICEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0RST1BQQUJMRSkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XFxuK1xcdFxcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xcbitcXHRcXHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0Zm9saW8gPSBjdHguZm9saW87XFxuK1xcdFxcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcXG4rXFx0XFx0XFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcXG4gXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdFxcdH1cXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4tXFx0XFx0LyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovXFxuLVxcdFxcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlclxcbi1cXHRcXHRcXHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcXG4tXFx0XFx0XFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxcbi1cXHRcXHRcXHQgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAoKytzaGFyZWQgXFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcXG4tXFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcXG4tXFx0XFx0XFx0XFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdFxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogVE9ETzogSW4gc29tZSBjYXNlcyBvZiBwYXJ0aWFsbHktbWFwcGVkIGZvbGlvcywgd2UnZCBhY3R1YWxseVxcbiBcXHRcXHQgKiB3YW50IHRvIGNvbGxhcHNlLlxcbkBAIC03NTksNyArODY2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGVcXG4tXFx0XFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9ja1xcbitcXHRcXHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrXFxuIFxcdFxcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcXG4gXFx0XFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxcbiBcXHRcXHQgKi9cXG5AQCAtNzg2LDcgKzg5Myw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZVxcbitcXHRcXHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcXG4gXFx0XFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xcbkBAIC04MDMsMTQgKzkxMCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcXG4gXFx0XFx0XFx0bGlzdF9hZGRfdGFpbChcXHUwMDI2Zm9saW8tXFx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xcbiBuZXh0Olxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXNcXG4tXFx0XFx0ICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2VcXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8XFxuLVxcdFxcdCAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxcbi1cXHRcXHQgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cXHUwMDNldm1fbW0sIGFkZHIpKSlcXG4rXFx0XFx0aWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXFxuIFxcdFxcdFxcdHJlZmVyZW5jZWQrKztcXG4gXFx0fVxcbiBcXG5AQCAtODE4LDEzICs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xcbi1cXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLFxcbitcXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xcbiBcXHRcXHRyZXR1cm4gcmVzdWx0O1xcbiBcXHR9XFxuIG91dDpcXG4gXFx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuLVxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXFxuK1xcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XFxuIFxcdHJldHVybiByZXN1bHQ7XFxuIH1cXG5AQCAtMTA3OCw3ICsxMTc4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcXG4gXFx0XFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xcbiBcXHQvKlxcbiBcXHQgKiBBbm9uIFZNQSBleHBlY3RlZCwgdGhlIGFkZHJlc3MgbWF5IGJlIHVubWFwcGVkIHRoZW5cXG4tXFx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxcbitcXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLlxcbiBcXHQgKlxcbiBcXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxcbiBcXHQgKiB2bWFzLlxcbkBAIC0xMTM2LDcgKzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiAvKlxcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxcbi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxcbisgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cXG4gICpcXG4gICogRm9yIG1USFAgb3JkZXJzIHRoZSBmdW5jdGlvbiBiYWlscyBvbiB0aGUgZmlyc3Qgc3dhcCBlbnRyeSwgYmVjYXVzZVxcbiAgKiBmYXVsdGluZyBwYWdlcyBiYWNrIGluIGR1cmluZyBjb2xsYXBzZSBjb3VsZCByZS1wb3B1bGF0ZSBQVEVzIHRoYXRcXG5AQCAtMTI0NywxNSArMTM0NywxMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxcbiBcXHRmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgXFx1MDAyNmNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuIFxcdGlmICghZm9saW8pIHtcXG4gXFx0XFx0KmZvbGlvcCA9IE5VTEw7XFxuLVxcdFxcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxcbi1cXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcXG4tXFx0XFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcXG4rXFx0XFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQsXFxuK1xcdFxcdFxcdFxcdE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xcbiBcXHRcXHRyZXR1cm4gU0NBTl9BTExPQ19IVUdFX1BBR0VfRkFJTDtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XFxuLVxcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcXG4rXFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcXG4gXFxuIFxcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XFxuIFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuQEAgLTEzMzEsOCArMTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xcbiBcXHQvKlxcbiBcXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2ZcXG4tXFx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNXFxuLVxcdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgKyBQR19sb2NrLlxcbitcXHQgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwbWRwX2NvbGxhcHNlX2ZsdXNoIGFuZCB0aGUgVk1cXG4rXFx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIGZvbGlvIGxvY2suXFxuIFxcdCAqXFxuIFxcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxcbiBcXHQgKiBtbWFwX2xvY2suXFxuQEAgLTE0MzksNyArMTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdFxcdFxcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xcbiBcXHRcXHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xcbiBcXHRcXHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXFxuLVxcdFxcdFxcdFxcdFxcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAvKnVmZmQ9Ki8gZmFsc2UpO1xcbiBcXHRcXHRpZiAocHRlX3B0bCAhPSBwbWRfcHRsKVxcbiBcXHRcXHRcXHRzcGluX3VubG9jayhwdGVfcHRsKTtcXG4gXFx0fVxcbkBAIC0xNDQ5LDEwICsxNTQ2LDEwIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcbiBcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuIG91dF91cF93cml0ZTpcXG4tXFx0aWYgKGFub25fdm1hX2xvY2tlZClcXG4tXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cXHUwMDNlYW5vbl92bWEpO1xcbiBcXHRpZiAocHRlKVxcbiBcXHRcXHRwdGVfdW5tYXAocHRlKTtcXG4rXFx0aWYgKGFub25fdm1hX2xvY2tlZClcXG4rXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cXHUwMDNlYW5vbl92bWEpO1xcbiBcXHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XFxuIG91dF9ub2xvY2s6XFxuIFxcdGlmIChmb2xpbylcXG5AQCAtMTU5Myw0MiArMTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4gXFx0XFx0Ym9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuIHtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xcbi1cXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcXG4gXFx0ZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcXG4gXFx0cG1kX3QgKnBtZDtcXG4gXFx0cHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDtcXG4gXFx0aW50IGk7XFxuLVxcdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcXG4tXFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuLVxcdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XFxuK1xcdGludCByZWZlcmVuY2VkID0gMDtcXG4rXFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuIFxcdHVuc2lnbmVkIGxvbmcgYWRkcjtcXG4gXFx0dW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVycztcXG4gXFx0c3BpbmxvY2tfdCAqcHRsO1xcbi1cXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xcbitcXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcXG4rXFx0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcXG4gXFxuIFxcdFZNX0JVR19PTihzdGFydF9hZGRyIFxcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcXG4gXFxuK1xcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XFxuK1xcdFxcdC5jYyA9IGNjLFxcbitcXHRcXHQudm1hID0gdm1hLFxcbitcXHRcXHQub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsXFxuK1xcdFxcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLFxcbitcXHRcXHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXFxuK1xcdFxcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksXFxuK1xcdH07XFxuK1xcbiBcXHRyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgXFx1MDAyNnBtZCk7XFxuIFxcdGlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7XFxuIFxcdFxcdGNjLVxcdTAwM2Vwcm9ncmVzcysrO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4tXFx0Yml0bWFwX3plcm8oY2MtXFx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcXG4tXFx0bWVtc2V0KGNjLVxcdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cXHUwMDNlbm9kZV9sb2FkKSk7XFxuLVxcdG5vZGVzX2NsZWFyKGNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuK1xcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcXG4gXFxuIFxcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVxcdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxcbi1cXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLlxcbitcXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXFxuK1xcdCAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLlxcbiBcXHQgKi9cXG4gXFx0aWYgKGVuYWJsZWRfb3JkZXJzICE9IEJJVChIUEFHRV9QTURfT1JERVIpKVxcbi1cXHRcXHRtYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcXG4rXFx0XFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xcbiBcXG4gXFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcXHUwMDI2cHRsKTtcXG4gXFx0aWYgKCFwdGUpIHtcXG5AQCAtMTY0NCw4NCArMTc0NiwxNCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFxuIFxcdFxcdGNjLVxcdTAwM2Vwcm9ncmVzcysrO1xcbiBcXG4tXFx0XFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbi1cXHRcXHRcXHRpZiAoKytub25lX29yX3plcm8gXFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0aWYgKCsrdW5tYXBwZWQgXFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBBbHdheXMgYmUgc3RyaWN0IHdpdGggdWZmZC13cFxcbi1cXHRcXHRcXHQgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWVcXG4tXFx0XFx0XFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogRG9uJ3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxcbi1cXHRcXHRcXHQgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi5cXG4tXFx0XFx0XFx0ICogSGVyZSB3ZSBjYW4gYWxzbyBtYXJrIHRoZSBuZXcgaHVnZSBwbWQgYXNcXG4tXFx0XFx0XFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xcbi1cXHRcXHRcXHQgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93blxcbi1cXHRcXHRcXHQgKiB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxscyBvdXRzaWRlIG9mXFxuLVxcdFxcdFxcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcXG4tXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuLVxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4tXFx0XFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2ICEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0RST1BQQUJMRSkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XFxuK1xcdFxcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XFxuK1xcdFxcdFxcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XFxuIFxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbiBcXHRcXHR9XFxuLVxcbi1cXHRcXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX0FOT047XFxuLVxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBXZSB0cmVhdCBhIHNpbmdsZSBwYWdlIGFzIHNoYXJlZCBpZiBhbnkgcGFydCBvZiB0aGUgVEhQXFxuLVxcdFxcdCAqIGlzIHNoYXJlZC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xcbi1cXHRcXHRcXHRpZiAoKytzaGFyZWQgXFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcXG4tXFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4gXFxuIFxcdFxcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXFxuIFxcdFxcdF9fc2V0X2JpdChpLCBjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMpO1xcbkBAIC0xNzQ5LDMxICsxNzgxLDIxIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuXFxuIFxcdFxcdCAqXFxuLVxcdFxcdCAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5Olxcbi1cXHRcXHQgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgXFx1MDAzZSBmb2xpb19yZWZfY291bnQoKS5cXG4tXFx0XFx0ICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlXFxuLVxcdFxcdCAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlXFxuLVxcdFxcdCAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVja1xcbi1cXHRcXHQgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxcbitcXHRcXHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcXG4rXFx0XFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcXG4rXFx0XFx0ICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHtcXG4gXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXFxuLVxcdFxcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxcbi1cXHRcXHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXFx1MDAzZXZtX21tLCBhZGRyKSkpXFxuK1xcdFxcdGlmIChjb2xsYXBzZV9pc19yZWZlcmVuY2VkKGNjLCBwdGV2YWwsIGZvbGlvLCB2bWEsIGFkZHIpKVxcbiBcXHRcXHRcXHRyZWZlcmVuY2VkKys7XFxuIFxcdH1cXG4gXFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdCAgICghcmVmZXJlbmNlZCB8fFxcbi1cXHRcXHQgICAgKHVubWFwcGVkIFxcdTAwMjZcXHUwMDI2IHJlZmVyZW5jZWQgXFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcXG4rXFx0XFx0ICAgIChjdHgudW5tYXBwZWQgXFx1MDAyNlxcdTAwMjYgcmVmZXJlbmNlZCBcXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuQEAgLTE3ODQsMTMgKzE4MDYsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cXG4gXFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuIFxcdFxcdHJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsXFxuLVxcdFxcdFxcdFxcdCAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcXG4gXFx0XFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xcbiBcXHRcXHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcXG4gXFx0fVxcbiBvdXQ6XFxuIFxcdHRyYWNlX21tX2todWdlcGFnZWRfc2Nhbl9wbWQobW0sIGZvbGlvLCByZWZlcmVuY2VkLFxcbi1cXHRcXHRcXHRcXHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XFxuK1xcdFxcdFxcdFxcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xcbiBcXHRyZXR1cm4gcmVzdWx0O1xcbiB9XFxuIFxcbkBAIC0yNjkxLDggKzI3MTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiBcXHRwcmVzZW50ID0gMDtcXG4gXFx0c3dhcCA9IDA7XFxuLVxcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbi1cXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XFxuIFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gXFx0eGFzX2Zvcl9lYWNoKFxcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCArIEhQQUdFX1BNRF9OUiAtIDEpIHtcXG4gXFx0XFx0aWYgKHhhc19yZXRyeShcXHUwMDI2eGFzLCBmb2xpbykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU1OjQzLjA3MjM2NzQ0MVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODc0NzY3MjMwOTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvbGxhcHNlX2NoZWNrX3B0ZVwiLFxuICAgIFwiX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwiLFxuICAgIFwiY29sbGFwc2Vfc2Nhbl9wbWRcIixcbiAgICBcImNvbGxhcHNlX3NjYW5fZmlsZVwiLFxuICAgIFwiY29sbGFwc2VfaHVnZV9wYWdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgOWI0NGM2NjYxNTE2MDkzNWI4MWYyNWYyYjhhNDRkZDEyMDU4NzdiYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgSnVsIDE1IDA4OjU1OjQwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5pbmRleCAxNmYzNzEzNWVkODBkZi4uYjE4N2Q2MTg0NTJmNDQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuQEAgLTIyNCw3ICsyMjQsNyBAQCBraHVnZXBhZ2VkIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gYW55IFRIUCBzaXplIGlzIGVuYWJsZWRcbiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXRcbiB0byBcImFsd2F5c1wiIG9yIFwibWFkdmlzZVwiKSwgYW5kIGl0J2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlblxuIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlXG4tdG9wLWxldmVsIGNvbnRyb2wgYXJlIFwibmV2ZXJcIilcbit0b3AtbGV2ZWwgY29udHJvbCBhcmUgXCJuZXZlclwiKS5cbiBcbiBwcm9jZXNzIFRIUCBjb250cm9sc1xuIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AQCAtMzAxLDcgKzMwMSw5IEBAIGJlaW5nIHJlcGxhY2VkIGJ5IGEgUE1EIG1hcHBpbmcsIG9yICgyKSBwaHlzaWNhbCBwYWdlcyByZXBsYWNlZCBieSBvbmVcbiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LFxuIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci5cbiBBcyBzdWNoLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCByb3VnaGx5IGFzIGEgc2lnbiBvZiBwcm9ncmVzcyxcbi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6XG4rYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy5cbitQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlclxuKy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy1cdTAwM2NzaXplXHUwMDNla0Ivc3RhdHMvKTo6XG4gXG4gXHQvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZFxuIFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xuaW5kZXggNTUxNTc1NjdkYzRjYzEuLjQwMTI1ZGNiNGRlOWQ2IDEwMDY0NFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXG4rKysgYi9tbS9raHVnZXBhZ2VkLmNcbkBAIC02NCw2ICs2NCwxMiBAQCBlbnVtIHNjYW5fcmVzdWx0IHtcbiBcdFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssXG4gfTtcbiBcbitlbnVtIHB0ZV9jaGVja19yZXN1bHQge1xuK1x0UFRFX0NIRUNLX1NVQ0NFRUQsXG4rXHRQVEVfQ0hFQ0tfRkFJTCxcbitcdFBURV9DSEVDS19DT05USU5VRSxcbit9O1xuK1xuICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xuICNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXHUwMDNlXG4gXG5AQCAtMTE4LDYgKzEyNCwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7XG4gXHRERUNMQVJFX0JJVE1BUChtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4gfTtcbiBcbitzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuK1x0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xuK1x0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XG4rXHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0aW50IG5vbmVfb3JfemVybztcbitcdGludCBzaGFyZWQ7XG4rXHRpbnQgdW5tYXBwZWQ7XG4rXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDtcbitcdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuK1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7XG4rXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkO1xuK307XG4rXG4gLyoqXG4gICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmdcbiAgKiBAbW1faGVhZDogdGhlIGhlYWQgb2YgdGhlIG1tIGxpc3QgdG8gc2NhblxuQEAgLTYyMCw3ICs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIFx0XHQvKlxuIFx0XHQgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0XG4gXHRcdCAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1blxuLVx0XHQgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcbitcdFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuIFx0XHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxuIFx0XHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXG4gXHRcdCAqL1xuQEAgLTYyOSw2ICs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdH1cbiB9XG4gXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuK3tcbitcdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbitcdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4gXHRub2RlX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuQEAgLTY2NSw3NiArNjkyLDE1NiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcbiBcdH1cbiB9XG4gXG4rLypcbisgKiBjb2xsYXBzZV9pc19yZWZlcmVuY2VkKCkgLSBDaGVjayBmb3IgZW5vdWdoIHJlZmVyZW5jZWQgUFRFcyB0byBqdXN0aWZ5IGNvbGxhcHNpbmdcbisgKlxuKyAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGUgcGFnZSBoYXMgYmVlblxuKyAqIHJlY2VudGx5IGFjY2Vzc2VkICh5b3VuZyBwdGUpIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZS5cbisgKlxuKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgYmVlbiByZWNlbnRseSBhY2Nlc3NlZC5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgY29sbGFwc2VfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCxcbitcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpXG4re1xuK1x0cmV0dXJuIGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8XG4rXHRcdGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbitcdFx0bW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LFxuK1x0XHRlbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpXG4re1xuK1x0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4rXHRcdGNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTtcbitcdGNvdW50X210aHBfc3RhdChvcmRlciwgbXRocF9ldmVudCk7XG4rfVxuK1xuKy8qXG4rICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmRcbisgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXG4rICovXG4rc3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcbitcdFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpXG4re1xuK1x0Y3R4LVx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcbitcdHJldHVybiBQVEVfQ0hFQ0tfRkFJTDtcbit9XG4rXG4rLypcbisgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxuKyAqXG4rICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6XG4rICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcbisgKiAtIHVmZmQgaXMgbm90IGFjdGl2ZVxuKyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnRcbisgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XG4rICpcbisgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxuKyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxuKyAqXG4rICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbisgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbisgKiAgICAgICAgIFBURV9DSEVDS19DT05USU5VRSBpZiB0aGUgc2NhbiBzaG91bGQgY29udGludWUgdG8gY2hlY2sgdGhlIG5leHQgUFRFLlxuKyAqL1xuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcbit7XG4rXHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2Vub25lX29yX3plcm8gXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19ub25lKSB7XG4rXHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsXG4rXHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuK1x0XHR9XG4rXHRcdHJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7XG4rXHR9XG4rXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbitcdFx0aWYgKGN0eC1cdTAwM2V1bm1hcHBlZCA9PSAtMSlcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbitcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TV0FQX1BURSk7XG4rXHRcdH1cbitcdFx0aWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSlcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTtcbitcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbitcdH1cbitcdC8qXG4rXHQgKiBEb24ndCBjb2xsYXBzZSBpZiBhbnkgb2YgdGhlIHNtYWxsIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZFxuK1x0ICogd3JpdGUgcHJvdGVjdGlvbi4gTWFya2luZyB0aGUgbmV3IGh1Z2UgcG1kIGFzIHdyaXRlIHByb3RlY3RlZFxuK1x0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxuK1x0ICogcmVnaXN0ZXJlZCByYW5nZS5cbitcdCAqL1xuK1x0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuK1xuK1x0Y3R4LVx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cdTAwM2V2bWEsIGFkZHIsIHB0ZXZhbCk7XG4rXHRpZiAodW5saWtlbHkoIWN0eC1cdTAwM2Vmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LVx1MDAzZWZvbGlvKSkpXG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTtcbitcbitcdC8qXG4rXHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4rXHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4rXHQgKi9cbitcdGlmIChjdHgtXHUwMDNlY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgIShjdHgtXHUwMDNldm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoY3R4LVx1MDAzZWZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKVxuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTEFaWUZSRUUpO1xuK1xuK1x0aWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSkge1xuK1x0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSwgY3R4LVx1MDAzZWZvbGlvKTtcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0FOT04pO1xuK1x0fVxuK1xuK1x0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LVx1MDAzZWZvbGlvKSkge1xuK1x0XHQvKlxuK1x0XHQgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlclxuK1x0XHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcbitcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuK1x0XHQgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuXG4rXHRcdCAqL1xuK1x0XHRpZiAoKytjdHgtXHUwMDNlc2hhcmVkIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKSB7XG4rXHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcbitcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7XG4rfVxuK1xuIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxuIFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlcik7XG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjtcbi1cdHB0ZV90ICpfcHRlO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuK1x0cHRlX3QgKl9wdGUsIHB0ZXZhbDtcbitcdGludCByZWZlcmVuY2VkID0gMDtcbiBcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuK1x0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcbitcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XG4rXHRcdC5jYyA9IGNjLFxuK1x0XHQudm1hID0gdm1hLFxuK1x0XHQub3JkZXIgPSBvcmRlcixcbitcdFx0LnVubWFwcGVkID0gLTEsIC8qIGRvbid0IGNoZWNrIHN3YXAgUFRFcyAqL1xuK1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLFxuK1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlciksXG4rXHR9O1xuIFxuIFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFx1MDAzYyBwdGUgKyBucl9wYWdlcztcbiBcdCAgICAgX3B0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xuLVx0XHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcbi1cdFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuLVx0XHRcdGlmICgrK25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9OT05fUFJFU0VOVDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbitcdFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4rXHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4rXHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4rXHRcdFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbitcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovXG4tXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbi1cdFx0XHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcbi1cdFx0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4tXHRcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICgrK3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4gXHRcdC8qXG4gXHRcdCAqIFRPRE86IEluIHNvbWUgY2FzZXMgb2YgcGFydGlhbGx5LW1hcHBlZCBmb2xpb3MsIHdlJ2QgYWN0dWFsbHlcbiBcdFx0ICogd2FudCB0byBjb2xsYXBzZS5cbkBAIC03NTksNyArODY2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdFx0LypcbiBcdFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxuLVx0XHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXG4rXHRcdCAqIGZvbGlvIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2tcbiBcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZVxuIFx0XHQgKiB3aGVuIGludm9rZWQgZnJvbSB0aGUgVk0uXG4gXHRcdCAqL1xuQEAgLTc4Niw3ICs4OTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR9XG4gXG4gXHRcdC8qXG4tXHRcdCAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZVxuK1x0XHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcbiBcdFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXG4gXHRcdCAqL1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xuQEAgLTgwMywxNCArOTEwLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Zm9saW8tXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XG4gbmV4dDpcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbitcdFx0aWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXG4gXHRcdFx0cmVmZXJlbmNlZCsrO1xuIFx0fVxuIFxuQEAgLTgxOCwxMyArOTE4LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG4tXHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4rXHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4rXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbiBcdFx0XHRcdFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xuIFx0cmV0dXJuIHJlc3VsdDtcbiB9XG5AQCAtMTA3OCw3ICsxMTc4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcbiBcdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuIFx0LypcbiBcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxuLVx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxuK1x0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYWNxdWlyZWQgdGhlIG1tYXBfbG9jay5cbiBcdCAqXG4gXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxuIFx0ICogdm1hcy5cbkBAIC0xMTM2LDcgKzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gLypcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4rICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4gICpcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XG5AQCAtMTI0NywxNSArMTM0NywxMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIFx0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFx1MDAyNmNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiBcdGlmICghZm9saW8pIHtcbiBcdFx0KmZvbGlvcCA9IE5VTEw7XG4tXHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuLVx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuK1x0XHRjb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCxcbitcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuIFx0XHRyZXR1cm4gU0NBTl9BTExPQ19IVUdFX1BBR0VfRkFJTDtcbiBcdH1cbiBcbi1cdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpO1xuLVx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpO1xuK1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTMzMSw4ICsxNDI4LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0LypcbiBcdCAqIFByZXZlbnQgYWxsIGFjY2VzcyB0byBwYWdldGFibGVzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuLVx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNXG4tXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgUEdfbG9jay5cbitcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2ggYW5kIHRoZSBWTVxuK1x0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIGZvbGlvIGxvY2suXG4gXHQgKlxuIFx0ICogVUZGRElPX01PVkUgaXMgcHJldmVudGVkIHRvIHJhY2UgYXMgd2VsbCB0aGFua3MgdG8gdGhlXG4gXHQgKiBtbWFwX2xvY2suXG5AQCAtMTQzOSw3ICsxNTM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdFx0XHRzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTtcbiBcdFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcbiBcdFx0bWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLFxuLVx0XHRcdFx0XHQgIC8qdWZmZF93cD0qLyBmYWxzZSk7XG4rXHRcdFx0XHRcdCAgLyp1ZmZkPSovIGZhbHNlKTtcbiBcdFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcbiBcdFx0XHRzcGluX3VubG9jayhwdGVfcHRsKTtcbiBcdH1cbkBAIC0xNDQ5LDEwICsxNTQ2LDEwIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG4gb3V0X3VwX3dyaXRlOlxuLVx0aWYgKGFub25fdm1hX2xvY2tlZClcbi1cdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cdTAwM2Vhbm9uX3ZtYSk7XG4gXHRpZiAocHRlKVxuIFx0XHRwdGVfdW5tYXAocHRlKTtcbitcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4rXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuIG91dF9ub2xvY2s6XG4gXHRpZiAoZm9saW8pXG5AQCAtMTU5Myw0MiArMTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcbiBcdFx0Ym9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4ge1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTtcbi1cdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpO1xuIFx0ZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFO1xuIFx0cG1kX3QgKnBtZDtcbiBcdHB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7XG4gXHRpbnQgaTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbi1cdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMO1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XG4rXHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4rXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiBcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xuK1x0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4rXHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xuIFxuIFx0Vk1fQlVHX09OKHN0YXJ0X2FkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4gXG4rXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuK1x0XHQuY2MgPSBjYyxcbitcdFx0LnZtYSA9IHZtYSxcbitcdFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxuK1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSxcbitcdFx0Lm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0fTtcbitcbiBcdHJlc3VsdCA9IGZpbmRfcG1kX29yX3RocF9vcl9ub25lKG1tLCBzdGFydF9hZGRyLCBcdTAwMjZwbWQpO1xuIFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MrKztcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRiaXRtYXBfemVybyhjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4tXHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4tXHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXG4gXHRlbmFibGVkX29yZGVycyA9IGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcbiBcbiBcdC8qXG4gXHQgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2Vcbi1cdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuXG4rXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXG4rXHQgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci5cbiBcdCAqL1xuIFx0aWYgKGVuYWJsZWRfb3JkZXJzICE9IEJJVChIUEFHRV9QTURfT1JERVIpKVxuLVx0XHRtYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcbitcdFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuIFxuIFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcdTAwMjZwdGwpO1xuIFx0aWYgKCFwdGUpIHtcbkBAIC0xNjQ0LDg0ICsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcysrO1xuIFxuLVx0XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCsrbm9uZV9vcl96ZXJvIFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCsrdW5tYXBwZWQgXHUwMDNlIG1heF9wdGVzX3N3YXApIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwXG4tXHRcdFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXG4tXHRcdFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBEb24ndCBjb2xsYXBzZSB0aGUgcGFnZSBpZiBhbnkgb2YgdGhlIHNtYWxsXG4tXHRcdFx0ICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uXG4tXHRcdFx0ICogSGVyZSB3ZSBjYW4gYWxzbyBtYXJrIHRoZSBuZXcgaHVnZSBwbWQgYXNcbi1cdFx0XHQgKiB3cml0ZSBwcm90ZWN0ZWQgaWYgYW55IG9mIHRoZSBzbWFsbCBvbmVzIGlzXG4tXHRcdFx0ICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd25cbi1cdFx0XHQgKiB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxscyBvdXRzaWRlIG9mXG4tXHRcdFx0ICogdGhlIHJlZ2lzdGVyZWQgcmFuZ2UuICBTbywganVzdCBiZSBzaW1wbGUuXG4tXHRcdFx0ICovXG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVxuLVx0XHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xuLVx0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cdFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4rXHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4rXHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcbitcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4tXG4tXHRcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcbi1cdFx0ICogaXMgc2hhcmVkLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCsrc2hhcmVkIFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0fVxuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Zm9saW8gPSBjdHguZm9saW87XG4gXG4gXHRcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXG4gXHRcdF9fc2V0X2JpdChpLCBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcyk7XG5AQCAtMTc0OSwzMSArMTc4MSwyMSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0LypcbiBcdFx0ICogQ2hlY2sgaWYgdGhlIHBhZ2UgaGFzIGFueSBHVVAgKG9yIG90aGVyIGV4dGVybmFsKSBwaW5zLlxuIFx0XHQgKlxuLVx0XHQgKiBIZXJlIHRoZSBjaGVjayBtYXkgYmUgcmFjeTpcbi1cdFx0ICogaXQgbWF5IHNlZSBmb2xpb19tYXBjb3VudCgpIFx1MDAzZSBmb2xpb19yZWZfY291bnQoKS5cbi1cdFx0ICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlXG4tXHRcdCAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlXG4tXHRcdCAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVja1xuLVx0XHQgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxuK1x0XHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcbitcdFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcbitcdFx0ICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbiBcdFx0ICovXG4gXHRcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHtcbiBcdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfQ09VTlQ7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbiBcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbitcdFx0aWYgKGNvbGxhcHNlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXG4gXHRcdFx0cmVmZXJlbmNlZCsrO1xuIFx0fVxuIFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICghcmVmZXJlbmNlZCB8fFxuLVx0XHQgICAgKHVubWFwcGVkIFx1MDAyNlx1MDAyNiByZWZlcmVuY2VkIFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcbitcdFx0ICAgIChjdHgudW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuQEAgLTE3ODQsMTMgKzE4MDYsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cbiBcdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4gXHRcdHJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgICAgdW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4rXHRcdFx0XHQgICAgICAgY3R4LnVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuIFx0XHQvKiBtbWFwX2xvY2sgd2FzIHJlbGVhc2VkIGFib3ZlLCBzZXQgbG9ja19kcm9wcGVkICovXG4gXHRcdCpsb2NrX2Ryb3BwZWQgPSB0cnVlO1xuIFx0fVxuIG91dDpcbiBcdHRyYWNlX21tX2todWdlcGFnZWRfc2Nhbl9wbWQobW0sIGZvbGlvLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICBub25lX29yX3plcm8sIHJlc3VsdCwgdW5tYXBwZWQpO1xuK1x0XHRcdFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XG4gXHRyZXR1cm4gcmVzdWx0O1xuIH1cbiBcbkBAIC0yNjkxLDggKzI3MTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRwcmVzZW50ID0gMDtcbiBcdHN3YXAgPSAwO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuK1x0Y29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpO1xuIFx0cmN1X3JlYWRfbG9jaygpO1xuIFx0eGFzX2Zvcl9lYWNoKFx1MDAyNnhhcywgZm9saW8sIHN0YXJ0ICsgSFBBR0VfUE1EX05SIC0gMSkge1xuIFx0XHRpZiAoeGFzX3JldHJ5KFx1MDAyNnhhcywgZm9saW8pKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTU6NDMuMDcyMzY5ODlaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTEwMTg2MTc4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEtodWdlcGFnZWQgUFRFIENoZWNraW5nIFJlZmFjdG9yKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYSBwYXRjaCB0aGF0IHRvdWNoZXMgYG1tL2todWdlcGFnZWQuY2AgYW5kIGBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RgLiBJbW1lZGlhdGVseSwgSSBzZWUgaXQncyBpbnRyb2R1Y2luZyBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB3aGljaCBpbmRpY2F0ZXMgYSByZWZhY3RvcmluZyBvZiB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIHdpdGhpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBJdCBhbHNvIGJyaW5ncyBpbiBgY29sbGFwc2VfaXNfcmVmZXJlbmNlZCgpYCBhbmQgYGNvdW50X2NvbGxhcHNlX2V2ZW50KClgLiBUaGlzIGlzIGFsbCBjbGVhcmx5IGZvY3VzZWQgb24gY2xlYW5pbmcgdXAgYW5kIHBvdGVudGlhbGx5IG9wdGltaXppbmcgdGhlIGtodWdlcGFnZWQgY29tcG9uZW50LCBwYXJ0aWN1bGFybHkgdGhhdCBjcnVjaWFsIFBURSB2YWxpZGF0aW9uLlxuXG5HaXZlbiB0aGF0IGBtbS9raHVnZXBhZ2VkLmNgIGRlYWxzIHdpdGggY29yZSBrZXJuZWwgZnVuY3Rpb25hbGl0eSDigJMgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSDigJMgYW5kIFRIUCBpcyBhIGZhaXJseSBzdGFuZGFyZCBmZWF0dXJlIHdpdGgga2h1Z2VwYWdlZCBjb25zdGFudGx5IHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQsIEkgbmVlZCB0byB0cmVhdCB0aGlzIGNoYW5nZSB3aXRoIGNvbnNpZGVyYWJsZSBjYXJlLiBJdCdzIGRlZmluaXRlbHkgcmVhY2hhYmxlLlxuXG5MZXQncyBicmVhayBkb3duIHRoZSBzcGVjaWZpYyBmdW5jdGlvbiBjaGFuZ2VzLiBJJ20gc2VlaW5nIG1vZGlmaWNhdGlvbnMgdG86XG4qICAgYF9fa2h1Z2VwYWdlZF9leGl0YCAoY29tbWVudCBjaGFuZ2UpXG4qICAgYGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuYCAobmV3KVxuKiAgIGBjb2xsYXBzZV9pc19yZWZlcmVuY2VkYCAobmV3KVxuKiAgIGBjb3VudF9jb2xsYXBzZV9ldmVudGAgKG5ldylcbiogICBgcHRlX2NoZWNrX2ZhaWxgIChuZXcpXG4qICAgYGNvbGxhcHNlX2NoZWNrX3B0ZWAgKG5ldylcbiogICBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgKG1vZGlmaWVkKVxuKiAgIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZWAgKGNvbW1lbnQgY2hhbmdlKVxuKiAgIGBhbGxvY19jaGFyZ2VfZm9saW9gIChtb2RpZmllZClcbiogICBgY29sbGFwc2VfaHVnZV9wYWdlYCAobW9kaWZpZWQpXG4qICAgYGNvbGxhcHNlX3NjYW5fcG1kYCAobW9kaWZpZWQpXG4qICAgYGNvbGxhcHNlX3NjYW5fZmlsZWAgKG1vZGlmaWVkKVxuXG5UaGUgbW9kaWZpZWQgZnVuY3Rpb25zIGFyZSB0aGUgb25lcyB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBoaWdoZXN0IHNjcnV0aW55LiBJJ20gZm9jdXNpbmcgb24gZnV6emluZyB0aGVzZSBhcmVhczogYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLCBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgY29sbGFwc2Vfc2Nhbl9maWxlYCwgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLlxuXG5Gcm9tIGEgY29uZmlndXJhdGlvbiBwZXJzcGVjdGl2ZSwgSSdsbCBkZWZpbml0ZWx5IGJlIGVuYWJsaW5nIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGFuZCBwcm9iYWJseSBsZWFuaW5nIHRvd2FyZCBlaXRoZXIgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VgIG9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIHRvIGZ1bGx5IGV4ZXJjaXNlIHRoZSBjaGFuZ2VzIGR1cmluZyB0ZXN0aW5nLlxuXG5Ob3csIGxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSBLY29uZmlnIGZpbGUgdG8gY29uZmlybSBzb21lIGFzc3VtcHRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDA4MCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2MywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU1OjU0LjE3NDIzNDgyMVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjM3MDIwMzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2h1Z2VwYWdlZFxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSArPSBtaWdyYXRlX2RldmljZS5vXFxubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgKz0gaHVnZV9tZW1vcnkubyBraHVnZXBhZ2VkLm9cXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgKz0gcGFnZV9jb3VudGVyLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTU6NTQuNzM3OTQ0ODc4WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM5MjA3Njg0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gQ29uc2lkZXJhdGlvbnMqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgaW1tZWRpYXRlIG5lZWQgaXMgZGVmaW5pdGVseSBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gVGhhdCBtdWNoIGlzIGNsZWFyLiBCdXQgYXMgd2UncmUgZGlnZ2luZyBpbnRvIHRoaXMsIEkga25vdyB3ZSBjYW4ndCBzdG9wIHRoZXJlLiBNeSBpbnRlcm5hbCBjaGVja2xpc3QgaW1tZWRpYXRlbHkganVtcHMgdG86IHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIG1pZ2h0IGJlIHJlbGV2YW50IG9yIGltcGFjdGVkPyBUaGlzIHNpdHVhdGlvbiBpcyByYXJlbHkgaXNvbGF0ZWQuIEkgbmVlZCB0byBxdWlja2x5IGlkZW50aWZ5IGFueSBkZXBlbmRlbmNpZXMsIGNvbmZsaWN0cywgb3IgY29tcGxlbWVudGFyeSBmZWF0dXJlcyB0aGF0IEkgc2hvdWxkIGJlIGF3YXJlIG9mIGFuZCBjaGVjayBvdXQgdG8gbWFrZSBzdXJlIG15IGZpbmFsIGNvbmZpZyBpcyBzZXQgdXAgb3B0aW1hbGx5LiBXZSBhbGwga25vdyBob3cgZWFzeSBpdCBpcyB0byBtaXNzIHNvbWV0aGluZyBhbmQgZW5kIHVwIHdpdGggYSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrIG9yLCB3b3JzZSwgaW5zdGFiaWxpdHkuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBjb25maWcgbWVzaGVzIHdlbGwgd2l0aCBhbnkgZXhpc3RpbmcgYW5kL29yIGZ1dHVyZSBwbGFucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEyMDcsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NTo1OC4xMzAwMjU3OTVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTAwNDYyMDA1MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9ODM1PWNvbmZpZyBNTV9JRFxcbi0tXFxubW0vS2NvbmZpZy04MzctXFxubW0vS2NvbmZpZzo4Mzg6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODM5LVxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg1Nj1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODYxLVxcbm1tL0tjb25maWc6ODYyOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTg2My1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg2OC1cXG5tbS9LY29uZmlnOjg2OTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxcbm1tL0tjb25maWctODcwLVxcdFxcdGJvb2wgXFxcIm1hZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg3Ny1cXG5tbS9LY29uZmlnOjg3ODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg3OS1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODg1PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04OTQtXFxubW0vS2NvbmZpZzo4OTU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg5Ni1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTA0LVxcbm1tL0tjb25maWc6OTA1OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTA2LVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTEyLVxcbm1tL0tjb25maWc6OTEzOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05MTQtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkyMC1cXG5tbS9LY29uZmlnOjkyMTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTkyMi1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTkzMD1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctOTM5LVxcbm1tL0tjb25maWc6OTQwOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05NDEtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0OC1cXG5tbS9LY29uZmlnOjk0OTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTk1MC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk1Ni1cXG5tbS9LY29uZmlnOjk1NzpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTU4LVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NjQtXFxubW0vS2NvbmZpZzo5NjU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05NjYtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NjowMy4xMzQ2NTIzNDdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MjgzNjgyNDU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBIdWdlIFBhZ2UgQ29sbGFwc2UgT3B0aW1pemF0aW9uKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nIEkgbmVlZCB0byBhZGQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU2AgdG8gdGhlIGBFbmFibGVDb25maWdzYC4gVGhhdCBzZWVtcyBsaWtlIHRoZSByaWdodCBtb3ZlLCBnaXZlbiB3aGF0IEknbSB0cnlpbmcgdG8gYWNoaWV2ZS5cblxuTm93LCBsZXQncyBqdXN0IG1ha2Ugc3VyZSBJJ3ZlIGdvdCBteSBoZWFkIGFyb3VuZCB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGFmZmVjdGVkIGJ5IHRoZXNlIGNoYW5nZXMuIEkndmUgZ290OiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBjb2xsYXBzZV9zY2FuX2ZpbGVgLCBhbmQgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuXG5cblJpZ2h0LCBhbGwgb2YgdGhvc2UgYXJlIGVpdGhlciBzdGF0aWMgb3IgcGFydCBvZiBga2h1Z2VwYWdlZGAuIE9rYXksIGFyZSBhbnkgb2YgdGhlc2UgaW4gYSBob3QgcGF0aD8gSSBoYXZlIHRvIGNvbnNpZGVyIHRoZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXMgY2FsbGVkIGJ5IGBraHVnZXBhZ2VkYCwgYSBiYWNrZ3JvdW5kIHRocmVhZCwgc28gaXQncyBub3QgYSBkaXJlY3Qgc3lzY2FsbCBob3RwYXRoLCBidXQgaXQgKmRvZXMqIHNjYW4gbWVtb3J5LCB3aGljaCBpcyBpbXBvcnRhbnQuIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGlzIGFsc28gY2FsbGVkIGJ5IGBraHVnZXBhZ2VkYC4gQW5kIHRoZW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGlzIGNhbGxlZCBieSBib3RoIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGFuZCBgbWFkdmlzZV9jb2xsYXBzZWAuIE5lZWQgdG8gY2hlY2sgYG1hZHZpc2VfY29sbGFwc2VgLiBUaGF0J3MgYSBjcml0aWNhbCBwYXRoLCBzbyBtdXN0IHRha2UgY2FyZSB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIxNDAsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MDguNDE4MzM3NTczWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNjgyOTUwNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9NzQ3PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy04MTItXFxubW0va2h1Z2VwYWdlZC5jOjgxMzpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2todWdlcGFnZWQuYy04MTQtXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9OTk2PXN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAxMy1cXHQgKiBSZWxlYXNlIGJvdGggcmF3IGFuZCBjb21wb3VuZCBwYWdlcyBpc29sYXRlZFxcbm1tL2todWdlcGFnZWQuYzoxMDE0OlxcdCAqIGluIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUuXFxubW0va2h1Z2VwYWdlZC5jLTEwMTUtXFx0ICovXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTM3Nj1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNDc3LVxcdGlmIChwdGUpIHtcXG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcXHRcXHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHZtYSwgc3RhcnRfYWRkciwgcHRlLCBjYyxcXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICBvcmRlciwgXFx1MDAyNmNvbXBvdW5kX3BhZ2VsaXN0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MDguNjQ1MTc1MDE4WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTc1Mjg5NTkzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRoZSBleHBlcnQ6XG5cbioqVHJhY2luZyB0aGUgSHVnZSBQYWdlIENvbGxhcHNlKipcblxuT2theSwgc28gbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGlzIHRoZSByZWFsIHdvcmtob3JzZSBoZXJlLCBjYWxsZWQgYnkgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIFJpZ2h0LCB0aGF0J3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3cgdGhlIHF1ZXN0aW9uIGlzLCB3aGF0IHRyaWdnZXJzIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGl0c2VsZj8gSXQgbG9va3MgbGlrZSB0aGUgdHdvIHByaW1hcnkgcGF0aHMgYXJlIGBraHVnZXBhZ2VkX3NjYW5fcG1kYCDigJMgdGhlIGtlcm5lbCdzIGh1Z2UgcGFnZSBtYW5hZ2VtZW50IGRhZW1vbiDigJMgYW5kIHBvdGVudGlhbGx5IGBtYWR2aXNlX2NvbGxhcHNlYCB3aGljaCBpcyByZWxhdGVkIHRvIHVzZXJzcGFjZSBwYWdlIGFkdmlzb3J5LiBJIG5lZWQgdG8gY29uZmlybSB0aGF0LiBUaGVyZWZvcmUsIEkgc2hvdWxkIHN0YXJ0IGJ5IGRpZ2dpbmcgaW50byB0aGUgY2FsbGluZyBjb250ZXh0cyBvZiBgY29sbGFwc2VfaHVnZV9wYWdlYCBkaXJlY3RseS4gVGhhdCdsbCBnaXZlIG1lIGEgY2xlYXJlciBwaWN0dXJlIG9mIGhvdyB0aGVzZSBodWdlIHBhZ2VzIGFyZSBiZWluZyB0YXJnZXRlZCBmb3IgY29sbGFwc2UuIFRpbWUgdG8gZGl2ZSBpbnRvIHRoZSBzb3VyY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMDE0LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MTQuMzk4MDc1MDU0WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDAxNjU4NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29sbGFwc2VfaHVnZV9wYWdlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2todWdlcGFnZWQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9NzQ3PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy04MTItXFxubW0va2h1Z2VwYWdlZC5jOjgxMzpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2todWdlcGFnZWQuYy04MTQtXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtOTIwLVxcdFxcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcXG5tbS9raHVnZXBhZ2VkLmM6OTIxOlxcdFxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbm1tL2todWdlcGFnZWQuYy05MjItXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTkyNi1cXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcXG5tbS9raHVnZXBhZ2VkLmM6OTI3OlxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbm1tL2todWdlcGFnZWQuYy05MjgtXFx0XFx0XFx0XFx0XFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTkzMS1cXG5tbS9raHVnZXBhZ2VkLmM6OTMyOnN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfc3VjY2VlZGVkKHB0ZV90ICpwdGUsXFxubW0va2h1Z2VwYWdlZC5jLTkzMy1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTk5NS1cXG5tbS9raHVnZXBhZ2VkLmM6OTk2OnN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXFxubW0va2h1Z2VwYWdlZC5jLTk5Ny1cXHRcXHRwbWRfdCAqcG1kLCBwbWRfdCBvcmlnX3BtZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAxMy1cXHQgKiBSZWxlYXNlIGJvdGggcmF3IGFuZCBjb21wb3VuZCBwYWdlcyBpc29sYXRlZFxcbm1tL2todWdlcGFnZWQuYzoxMDE0OlxcdCAqIGluIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUuXFxubW0va2h1Z2VwYWdlZC5jLTEwMTUtXFx0ICovXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAxOS0vKlxcbm1tL2todWdlcGFnZWQuYzoxMDIwOiAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHkgLSBhdHRlbXB0cyB0byBjb3B5IG1lbW9yeSBjb250ZW50cyBmcm9tIHJhd1xcbm1tL2todWdlcGFnZWQuYy0xMDIxLSAqIHBhZ2VzIHRvIGEgaHVnZXBhZ2UuIENsZWFucyB1cCB0aGUgcmF3IHBhZ2VzIGlmIGNvcHlpbmcgc3VjY2VlZHM7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAzMy0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MTAzNDpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZV90ICpwdGUsIHN0cnVjdCBmb2xpbyAqZm9saW8sXFxubW0va2h1Z2VwYWdlZC5jLTEwMzUtXFx0XFx0cG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwNjMtXFx0aWYgKGxpa2VseShyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSlcXG5tbS9raHVnZXBhZ2VkLmM6MTA2NDpcXHRcXHRfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X3N1Y2NlZWRlZChwdGUsIHZtYSwgYWRkcmVzcywgcHRsLFxcbm1tL2todWdlcGFnZWQuYy0xMDY1LVxcdFxcdFxcdFxcdFxcdFxcdCAgICBvcmRlciwgY29tcG91bmRfcGFnZWxpc3QpO1xcbm1tL2todWdlcGFnZWQuYy0xMDY2LVxcdGVsc2VcXG5tbS9raHVnZXBhZ2VkLmM6MTA2NzpcXHRcXHRfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGUsIHBtZCwgb3JpZ19wbWQsIHZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtMTA2OC1cXHRcXHRcXHRcXHRcXHRcXHQgb3JkZXIsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMjQ3LSAqL1xcbm1tL2todWdlcGFnZWQuYzoxMjQ4OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9raHVnZXBhZ2VkLmMtMTI0OS1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEzMzMtb3V0Olxcbm1tL2todWdlcGFnZWQuYzoxMzM0OlxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4obW0sIHN3YXBwZWRfaW4sIHJlZmVyZW5jZWQsIHJlc3VsdCxcXG5tbS9raHVnZXBhZ2VkLmMtMTMzNS1cXHRcXHRcXHRcXHRcXHQgICBvcmRlcik7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTMzOT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMzcwLS8qXFxubW0va2h1Z2VwYWdlZC5jOjEzNzE6ICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXFxubW0va2h1Z2VwYWdlZC5jLTEzNzItICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEzNzUtICovXFxubW0va2h1Z2VwYWdlZC5jOjEzNzY6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXFxubW0va2h1Z2VwYWdlZC5jLTEzNzctXFx0XFx0aW50IHJlZmVyZW5jZWQsIGludCB1bm1hcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE0MTctXFx0XFx0LypcXG5tbS9raHVnZXBhZ2VkLmM6MTQxODpcXHRcXHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcXG5tbS9raHVnZXBhZ2VkLmMtMTQxOS1cXHRcXHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNDIxLVxcdFxcdCAqL1xcbm1tL2todWdlcGFnZWQuYzoxNDIyOlxcdFxcdHJlc3VsdCA9IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihtbSwgdm1hLCBzdGFydF9hZGRyLCBwbWQsXFxubW0va2h1Z2VwYWdlZC5jLTE0MjMtXFx0XFx0XFx0XFx0XFx0XFx0ICAgICByZWZlcmVuY2VkLCBvcmRlcik7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTQ3Ny1cXHRpZiAocHRlKSB7XFxubW0va2h1Z2VwYWdlZC5jOjE0Nzg6XFx0XFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSh2bWEsIHN0YXJ0X2FkZHIsIHB0ZSwgY2MsXFxubW0va2h1Z2VwYWdlZC5jLTE0NzktXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgb3JkZXIsIFxcdTAwMjZjb21wb3VuZF9wYWdlbGlzdCk7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTUwOS1cXG5tbS9raHVnZXBhZ2VkLmM6MTUxMDpcXHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZSwgZm9saW8sIHBtZCwgX3BtZCxcXG5tbS9raHVnZXBhZ2VkLmMtMTUxMS1cXHRcXHRcXHRcXHRcXHQgICB2bWEsIHN0YXJ0X2FkZHIsIHB0ZV9wdGwsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTU1Ni1cXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbm1tL2todWdlcGFnZWQuYzoxNTU3OlxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZShtbSwgcmVzdWx0ID09IFNDQU5fU1VDQ0VFRCwgcmVzdWx0LCBvcmRlcik7XFxubW0va2h1Z2VwYWdlZC5jLTE1NTgtXFx0cmV0dXJuIHJlc3VsdDtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTYyMC1cXHRcXHRcXHRjb2xsYXBzZV9hZGRyZXNzID0gYWRkcmVzcyArIG9mZnNldCAqIFBBR0VfU0laRTtcXG5tbS9raHVnZXBhZ2VkLmM6MTYyMTpcXHRcXHRcXHRyZXQgPSBjb2xsYXBzZV9odWdlX3BhZ2UobW0sIGNvbGxhcHNlX2FkZHJlc3MsIHJlZmVyZW5jZWQsXFxubW0va2h1Z2VwYWdlZC5jLTE2MjItXFx0XFx0XFx0XFx0XFx0XFx0IHVubWFwcGVkLCBjYywgb3JkZXIpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTgwNS1cXHRpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkge1xcbm1tL2todWdlcGFnZWQuYzoxODA2OlxcdFxcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cXG5tbS9raHVnZXBhZ2VkLmMtMTgwNy1cXHRcXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MTQuNTM4MjUxMzMxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwMTgyNDEwNDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZTpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBgY29sbGFwc2VfaHVnZV9wYWdlYCBDYWxsIENoYWluKipcblxuUmlnaHQsIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCB0cnlpbmcgdG8gdHJhY2UgdGhlIGV4ZWN1dGlvbiBwYXRoLiBJIHNlZSB0aGF0IGBjb2xsYXBzZV9odWdlX3BhZ2VgIGlzIGJlaW5nIGludm9rZWQgYnkgYG10aHBfY29sbGFwc2VgLCBhbmQgdGhhdCBpbiB0dXJuIGlzIGNhbGxlZCBieSBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBUaGF0J3MgYSBwcmV0dHkgY2xlYXIgY2hhaW4sIGVhc3kgZW5vdWdoIHRvIGZvbGxvdy4gTm93LCB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoZXRoZXIgb3Igbm90IGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhbHNvIGNhbGxpbmcgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIEkgbmVlZCB0byBjb25maXJtIGlmIGl0IGhhcyBpdHMgb3duIHBhdGggdG8gaXQsIG9yIGlmIGl0IGlzIHJlbGlhbnQgb24gdGhpcyBleGlzdGluZyBwYXRoLiBJIHdhbnQgdG8gZG91YmxlLWNoZWNrIHRoYXQ7IHRoZXJlIGNvdWxkIGJlIHNvbWUgYXNzdW1wdGlvbnMgYmVpbmcgbWFkZSB0aGF0IGFyZW4ndCBxdWl0ZSBjb3JyZWN0LCBvciBtYXliZSBzb21lIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZW1lcmdpbmcgZnJvbSB0aGlzIHBhcnRpY3VsYXIgY2FsbC4gSSBiZXR0ZXIgZ28gYW5kIGNoZWNrIHRoZSBjcm9zcy1yZWZlcmVuY2VzIGZvciBgY29sbGFwc2VfaHVnZV9wYWdlYCB0byBzZWUgaWYgYG1hZHZpc2VfY29sbGFwc2VgIGlzIGluZGVlZCBjYWxsaW5nIGl0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuIEl0J3MgYSBmdW5kYW1lbnRhbCBwYXJ0IG9mIHRoZSBvdmVyYWxsIGZsb3cgZm9yIG1hbmFnaW5nIGh1Z2UgcGFnZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MjczLCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MTkuNTU2NDk2NjkyWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDU0MTIyNTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibWFkdmlzZV9jb2xsYXBzZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0va2h1Z2VwYWdlZC5jPTMxNzQ9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTc4LVxcbm1tL2todWdlcGFnZWQuYzozMTc5OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXFxubW0va2h1Z2VwYWdlZC5jLTMxODAte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyMTAtXFxubW0va2h1Z2VwYWdlZC5jOjMyMTE6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxubW0va2h1Z2VwYWdlZC5jLTMyMTItXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyOTgtXFx0cmV0dXJuIHRocHMgPT0gKChoZW5kIC0gaHN0YXJ0KSBcXHUwMDNlXFx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxcbm1tL2todWdlcGFnZWQuYzozMjk5OlxcdFxcdFxcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xcbm1tL2todWdlcGFnZWQuYy0zMzAwLX1cXG4tLVxcbm1tL21hZHZpc2UuYz0xMzM4PXN0YXRpYyBpbnQgbWFkdmlzZV92bWFfYmVoYXZpb3Ioc3RydWN0IG1hZHZpc2VfYmVoYXZpb3IgKm1hZHZfYmVoYXZpb3IpXFxuLS1cXG5tbS9tYWR2aXNlLmMtMTM2Mi1cXHRjYXNlIE1BRFZfQ09MTEFQU0U6XFxubW0vbWFkdmlzZS5jOjEzNjM6XFx0XFx0cmV0dXJuIG1hZHZpc2VfY29sbGFwc2Uodm1hLCByYW5nZS1cXHUwMDNlc3RhcnQsIHJhbmdlLVxcdTAwM2VlbmQsXFxubW0vbWFkdmlzZS5jLTEzNjQtXFx0XFx0XFx0XFx1MDAyNm1hZHZfYmVoYXZpb3ItXFx1MDAzZWxvY2tfZHJvcHBlZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjE5LjcwMTkxNDUxOVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NzMyNTA3MDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipJbml0aWFsIEFzc2Vzc21lbnQ6IE1BRFZfQ09MTEFQU0UgaXMgYSBUYXJnZXQqKlxuXG5BbHJpZ2h0LCBzbyBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBgbWFkdmlzZWAgd2l0aCB0aGUgYE1BRFZfQ09MTEFQU0VgIGZsYWcuIFRoYXQgbWFrZXMgaXQgaW1tZWRpYXRlbHkgaW50ZXJlc3RpbmcgZnJvbSBhIGZ1enppbmcgcGVyc3BlY3RpdmUuIEl0J3MgY29yZSBrZXJuZWwgY29kZSwgZGlyZWN0bHkgYWRkcmVzc2FibGUsIGFuZCByaXBlIGZvciBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eSBkaXNjb3ZlcnkuIEEgc3RyYWlnaHRmb3J3YXJkIHJvdXRlIHRvIHJlYWNoIGl0LiBHb29kLlxuXG5Ob3csIG15IG5leHQgc3RlcCBpcyBjbGVhcjogSSBuZWVkIHRvIGRlbHZlIGludG8gdGhlIGBtYWR2aXNlX2NvbGxhcHNlYCBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHRyYWNlIHRoZSBjb2RlIHBhdGgsIGlkZW50aWZ5IHRoZSBmdW5jdGlvbnMgaXQgY2FsbHMsIGFuZCB1bmRlcnN0YW5kIGl0cyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBLbm93aW5nIHdoYXQgaXQgdG91Y2hlcyBpcyBrZXkgdG8gY29uc3RydWN0aW5nIGVmZmVjdGl2ZSBmdXp6aW5nIHN0cmF0ZWdpZXMuIEdvdHRhIHVuZGVyc3RhbmQgdGhlIGVjb3N5c3RlbSB0aGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGhpbi4gRnJvbSB0aGVyZSwgSSBjYW4gZmlndXJlIG91dCB3aGF0IHBhcnRzIG9mIHRoZSBzeXN0ZW0gYXJlIG1vc3QgbGlrZWx5IHRvIGZhaWwgdW5kZXIgc3RyZXNzZnVsIGFuZCB1bmV4cGVjdGVkIGlucHV0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTk2OSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjI0LjQzNDQyNDIxN1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzg3NTAwODAxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1hZHZpc2VfY29sbGFwc2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0va2h1Z2VwYWdlZC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz0zMTc0PWJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMzE3OC1cXG5tbS9raHVnZXBhZ2VkLmM6MzE3OTpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxcbm1tL2todWdlcGFnZWQuYy0zMTgwLXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjEwLVxcbm1tL2todWdlcGFnZWQuYzozMjExOmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2todWdlcGFnZWQuYy0zMjEyLVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjk4LVxcdHJldHVybiB0aHBzID09ICgoaGVuZCAtIGhzdGFydCkgXFx1MDAzZVxcdTAwM2UgSFBBR0VfUE1EX1NISUZUKSA/IDBcXG5tbS9raHVnZXBhZ2VkLmM6MzI5OTpcXHRcXHRcXHQ6IG1hZHZpc2VfY29sbGFwc2VfZXJybm8obGFzdF9mYWlsKTtcXG5tbS9raHVnZXBhZ2VkLmMtMzMwMC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjI0LjgyMTkzMTk4OFoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODQ5MTU0NjI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQW5hbHl6aW5nIGBtYWR2aXNlX2NvbGxhcHNlYCdzIERlcGVuZGVuY3kgb24gSHVnZSBQYWdlIENvbGxhcHNlIE1lY2hhbmlzbXMqKlxuXG5BbHJpZ2h0LCBJJ20gZGl2aW5nIGludG8gdGhlIGBtYWR2aXNlX2NvbGxhcHNlYCBmdW5jdGlvbi4gTXkgcHJpbWFyeSBmb2N1cyByaWdodCBub3cgaXMgcGlucG9pbnRpbmcgaG93IGl0IGhhbmRsZXMgaHVnZSBwYWdlIGNvbGxhcHNlcy4gVGhlIHF1ZXN0aW9uIGlzLCBkb2VzIGBtYWR2aXNlX2NvbGxhcHNlYCBkaXJlY3RseSBsZXZlcmFnZSBlaXRoZXIgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgb3IgYGNvbGxhcHNlX3NjYW5fcG1kYD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdyBoZXJlLCBiZWNhdXNlIHRoYXQgd2lsbCBkaXJlY3RseSBhZmZlY3Qgb3VyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5IG1hbmFnZW1lbnQgc3RyYXRlZ3kuIFNwZWNpZmljYWxseSwgYXJlIHdlIGxvb2tpbmcgYXQgZGlyZWN0LCB0YXJnZXRlZCBjb2xsYXBzZXMgb3IgYSBtb3JlIHN3ZWVwaW5nIHNjYW4tYmFzZWQgYXBwcm9hY2g/IE15IGdvYWwgaXMgdG8gcXVpY2tseSBhc2NlcnRhaW4gd2hldGhlciBgbWFkdmlzZV9jb2xsYXBzZWAgdHJpZ2dlcnMgZWl0aGVyIGZ1bmN0aW9uLCBhbmQgaWYgc28sIGhvdy4gVGhpcyBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIGFuZCBwb3RlbnRpYWwgaW50ZXJhY3Rpb24gd2l0aCBleGlzdGluZyBodWdlIHBhZ2UgY29uZmlndXJhdGlvbnMuIExldCdzIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NTIzLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MjguNjcxMDkwMjA1WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0MTU4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9raHVnZXBhZ2VkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzIxMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjMyMTE6XFx0aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuMzIxMjpcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXFxuMzIxMzpcXHR7XFxuMzIxNDpcXHRcXHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2M7XFxuMzIxNTpcXHRcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuMzIxNjpcXHRcXHR1bnNpZ25lZCBsb25nIGhzdGFydCwgaGVuZCwgYWRkcjtcXG4zMjE3OlxcdFxcdGVudW0gc2Nhbl9yZXN1bHQgbGFzdF9mYWlsID0gU0NBTl9GQUlMO1xcbjMyMTg6XFx0XFx0aW50IHRocHMgPSAwO1xcbjMyMTk6XFx0XFx0Ym9vbCBtbWFwX3VubG9ja2VkID0gZmFsc2U7XFxuMzIyMDpcXHRcXG4zMjIxOlxcdFxcdEJVR19PTih2bWEtXFx1MDAzZXZtX3N0YXJ0IFxcdTAwM2Ugc3RhcnQpO1xcbjMyMjI6XFx0XFx0QlVHX09OKHZtYS1cXHUwMDNldm1fZW5kIFxcdTAwM2MgZW5kKTtcXG4zMjIzOlxcdFxcbjMyMjQ6XFx0XFx0aWYgKCFjb2xsYXBzZV9wb3NzaWJsZSh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIFRWQV9GT1JDRURfQ09MTEFQU0UpKVxcbjMyMjU6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMzIyNjpcXHRcXG4zMjI3OlxcdFxcdGhzdGFydCA9IEFMSUdOKHN0YXJ0LCBIUEFHRV9QTURfU0laRSk7XFxuMzIyODpcXHRcXHRoZW5kID0gQUxJR05fRE9XTihlbmQsIEhQQUdFX1BNRF9TSVpFKTtcXG4zMjI5OlxcdFxcbjMyMzA6XFx0XFx0aWYgKGhzdGFydCBcXHUwMDNlPSBoZW5kKVxcbjMyMzE6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMzIzMjpcXHRcXG4zMjMzOlxcdFxcdGNjID0ga21hbGxvY19vYmooKmNjKTtcXG4zMjM0OlxcdFxcdGlmICghY2MpXFxuMzIzNTpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4zMjM2OlxcdFxcdGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkID0gZmFsc2U7XFxuMzIzNzpcXHRcXHRjYy1cXHUwMDNlcHJvZ3Jlc3MgPSAwO1xcbjMyMzg6XFx0XFxuMzIzOTpcXHRcXHRtbWdyYWIobW0pO1xcbjMyNDA6XFx0XFx0bHJ1X2FkZF9kcmFpbl9hbGwoKTtcXG4zMjQxOlxcdFxcbjMyNDI6XFx0XFx0Zm9yIChhZGRyID0gaHN0YXJ0OyBhZGRyIFxcdTAwM2MgaGVuZDsgYWRkciArPSBIUEFHRV9QTURfU0laRSkge1xcbjMyNDM6XFx0XFx0XFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuMzI0NDpcXHRcXG4zMjQ1OlxcdFxcdFxcdGlmIChtbWFwX3VubG9ja2VkKSB7XFxuMzI0NjpcXHRcXHRcXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4zMjQ3OlxcdFxcdFxcdFxcdG1tYXBfcmVhZF9sb2NrKG1tKTtcXG4zMjQ4OlxcdFxcdFxcdFxcdG1tYXBfdW5sb2NrZWQgPSBmYWxzZTtcXG4zMjQ5OlxcdFxcdFxcdFxcdCpsb2NrX2Ryb3BwZWQgPSB0cnVlO1xcbjMyNTA6XFx0XFx0XFx0XFx0cmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHIsIGZhbHNlLCBcXHUwMDI2dm1hLFxcbjMyNTE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0IGNjLCBIUEFHRV9QTURfT1JERVIpO1xcbjMyNTI6XFx0XFx0XFx0XFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcXG4zMjUzOlxcdFxcdFxcdFxcdFxcdGxhc3RfZmFpbCA9IHJlc3VsdDtcXG4zMjU0OlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0X25vbG9jaztcXG4zMjU1OlxcdFxcdFxcdFxcdH1cXG4zMjU2OlxcdFxcbjMyNTc6XFx0XFx0XFx0XFx0aGVuZCA9IG1pbihoZW5kLCB2bWEtXFx1MDAzZXZtX2VuZCBcXHUwMDI2IEhQQUdFX1BNRF9NQVNLKTtcXG4zMjU4OlxcdFxcdFxcdH1cXG4zMjU5OlxcdFxcbjMyNjA6XFx0XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFxcdTAwMjZtbWFwX3VubG9ja2VkLCBjYyk7XFxuMzI2MTpcXHRcXG4zMjYyOlxcdFxcdFxcdHN3aXRjaCAocmVzdWx0KSB7XFxuMzI2MzpcXHRcXHRcXHRjYXNlIFNDQU5fU1VDQ0VFRDpcXG4zMjY0OlxcdFxcdFxcdGNhc2UgU0NBTl9QTURfTUFQUEVEOlxcbjMyNjU6XFx0XFx0XFx0XFx0Kyt0aHBzO1xcbjMyNjY6XFx0XFx0XFx0XFx0YnJlYWs7XFxuMzI2NzpcXHRcXHRcXHQvKiBXaGl0ZWxpc3RlZCBzZXQgb2YgcmVzdWx0cyB3aGVyZSBjb250aW51aW5nIE9LICovXFxuMzI2ODpcXHRcXHRcXHRjYXNlIFNDQU5fTk9fUFRFX1RBQkxFOlxcbjMyNjk6XFx0XFx0XFx0Y2FzZSBTQ0FOX1BURV9OT05fUFJFU0VOVDpcXG4zMjcwOlxcdFxcdFxcdGNhc2UgU0NBTl9QVEVfVUZGRDpcXG4zMjcxOlxcdFxcdFxcdGNhc2UgU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTpcXG4zMjcyOlxcdFxcdFxcdGNhc2UgU0NBTl9QQUdFX05VTEw6XFxuMzI3MzpcXHRcXHRcXHRjYXNlIFNDQU5fUEFHRV9DT1VOVDpcXG4zMjc0OlxcdFxcdFxcdGNhc2UgU0NBTl9QQUdFX0xPQ0s6XFxuMzI3NTpcXHRcXHRcXHRjYXNlIFNDQU5fUEFHRV9DT01QT1VORDpcXG4zMjc2OlxcdFxcdFxcdGNhc2UgU0NBTl9QQUdFX0xSVTpcXG4zMjc3OlxcdFxcdFxcdGNhc2UgU0NBTl9ERUxfUEFHRV9MUlU6XFxuMzI3ODpcXHRcXHRcXHRcXHRsYXN0X2ZhaWwgPSByZXN1bHQ7XFxuMzI3OTpcXHRcXHRcXHRcXHRicmVhaztcXG4zMjgwOlxcdFxcdFxcdGRlZmF1bHQ6XFxuMzI4MTpcXHRcXHRcXHRcXHRsYXN0X2ZhaWwgPSByZXN1bHQ7XFxuMzI4MjpcXHRcXHRcXHRcXHQvKiBPdGhlciBlcnJvciwgZXhpdCAqL1xcbjMyODM6XFx0XFx0XFx0XFx0Z290byBvdXRfbWF5YmVsb2NrO1xcbjMyODQ6XFx0XFx0XFx0fVxcbjMyODU6XFx0XFx0fVxcbjMyODY6XFx0XFxuMzI4NzpcXHRvdXRfbWF5YmVsb2NrOlxcbjMyODg6XFx0XFx0LyogQ2FsbGVyIGV4cGVjdHMgdXMgdG8gaG9sZCBtbWFwX2xvY2sgb24gcmV0dXJuICovXFxuMzI4OTpcXHRcXHRpZiAobW1hcF91bmxvY2tlZCkge1xcbjMyOTA6XFx0XFx0XFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XFxuMzI5MTpcXHRcXHRcXHRtbWFwX3JlYWRfbG9jayhtbSk7XFxuMzI5MjpcXHRcXHR9XFxuMzI5MzpcXHRvdXRfbm9sb2NrOlxcbjMyOTQ6XFx0XFx0bW1hcF9hc3NlcnRfbG9ja2VkKG1tKTtcXG4zMjk1OlxcdFxcdG1tZHJvcChtbSk7XFxuMzI5NjpcXHRcXHRrZnJlZShjYyk7XFxuMzI5NzpcXHRcXG4zMjk4OlxcdFxcdHJldHVybiB0aHBzID09ICgoaGVuZCAtIGhzdGFydCkgXFx1MDAzZVxcdTAwM2UgSFBBR0VfUE1EX1NISUZUKSA/IDBcXG4zMjk5OlxcdFxcdFxcdFxcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xcbjMzMDA6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NjoyOC42NzEzMzQwMjVaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTY2MjE5MDI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYG1hZHZpc2VfY29sbGFwc2VgIGFuZCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAqKlxuXG5Pa2F5LCBzbyBJIHNlZSBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgY2FsbGluZyBgY29sbGFwc2Vfc2luZ2xlX3BtZGAuIE5hdHVyYWxseSwgbXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZGl2ZSBpbnRvIGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF0J3MgZ29pbmcgb24gd2l0aGluIHRoYXQgZnVuY3Rpb24uICBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgdGhlIGVudHJ5IHBvaW50LCBidXQgYGNvbGxhcHNlX3NpbmdsZV9wbWRgIGlzIGNsZWFybHkgd2hlcmUgdGhlIGNvcmUgb3BlcmF0aW9uIGlzIGhhcHBlbmluZy4gSSBuZWVkIHRvIHRyYWNlIHRoZSBmbG93LCBzZWUgd2hhdCBkYXRhIHN0cnVjdHVyZXMgaXQncyBvcGVyYXRpbmcgb24sIGFuZCB1bmRlcnN0YW5kIHRoZSBsb2dpYyBiZWhpbmQgdGhlIGNvbGxhcHNlIG1lY2hhbmlzbS4gV2hhdCBhcmUgdGhlIHByZWNvbmRpdGlvbnM/IFdoYXQgYXJlIHRoZSBlZGdlIGNhc2VzPyBJJ20gYW50aWNpcGF0aW5nIHRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgaW50ZXJlc3Rpbmcgc3R1ZmYgaGFwcGVucywgc28gbGV0J3MgZ2V0IGludG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MTAxLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1NjozNC4zMzM1MjkyOTNaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMjUwNzU4NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2xsYXBzZV9zaW5nbGVfcG1kXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2todWdlcGFnZWQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9MjcwMT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjgxMC0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MjgxMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcXG5tbS9raHVnZXBhZ2VkLmMtMjgxMi1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCAqbG9ja19kcm9wcGVkLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTI4Njg9c3RhdGljIHZvaWQgY29sbGFwc2Vfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwcm9ncmVzc19tYXgsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjkzOC1cXG5tbS9raHVnZXBhZ2VkLmM6MjkzOTpcXHRcXHRcXHQqcmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyxcXG5tbS9raHVnZXBhZ2VkLmMtMjk0MC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICB2bWEsIFxcdTAwMjZsb2NrX2Ryb3BwZWQsIGNjKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMjExPWludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyNTktXFxubW0va2h1Z2VwYWdlZC5jOjMyNjA6XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFxcdTAwMjZtbWFwX3VubG9ja2VkLCBjYyk7XFxubW0va2h1Z2VwYWdlZC5jLTMyNjEtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjM0LjQ2NjA0NDE3WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzOTU0NTk3MDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIEZ1bmN0aW9uICdjb2xsYXBzZV9zaW5nbGVfcG1kJyoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIGZ1bmN0aW9uLCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGl0cyBwdXJwb3NlIHdpdGhpbiB0aGUgYnJvYWRlciBjb250ZXh0LiBXaGF0J3MgaXRzIHJvbGU/IElzIGl0IGEgY29yZSBjb21wb25lbnQgb3IgYSB1dGlsaXR5IGZ1bmN0aW9uPyBCYXNlZCBvbiB0aGUgbmFtZSwgbXkgZ3Vlc3MgaXMgaXQncyBkZXNpZ25lZCB0byB0YWtlIGEgc2luZ2xlIFBNRCAocHJlc3VtYWJseSBhIFwiUGFydGlhbCBNb2RlIERlY29tcG9zaXRpb25cIiBvYmplY3Qgb3Igc2ltaWxhciwgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCkgYW5kIHJlZHVjZSBpdCwgb3IgXCJjb2xsYXBzZVwiIGl0LCBpbiBzb21lIHdheS4gVGhlIFwic2luZ2xlXCIgcGFydCBpcyBrZXk7IGl0IGhpbnRzIGF0IGVpdGhlciBhIGJhdGNoLXByb2Nlc3Npbmcgc2NlbmFyaW8gKHdoZXJlIHRoaXMgd291bGQgYmUgb25lIGl0ZXJhdGlvbikgb3IgYSBmdW5jdGlvbiBzcGVjaWZpY2FsbHkgZGVzaWduZWQgZm9yIGluZGl2aWR1YWwgb3BlcmF0aW9ucy4gSSdsbCBuZWVkIHRvIGxvb2sgYXQgaXRzIGltcGxlbWVudGF0aW9uIG9yIGF0IGxlYXN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIHRvIGNvbmZpcm0gdGhpcy4gV2hhdCBhcmUgaXRzIGlucHV0cz8gV2hhdCdzIHRoZSBhbnRpY2lwYXRlZCBvdXRwdXQgZm9ybWF0PyBBcmUgdGhlcmUgYW55IHByZWNvbmRpdGlvbnMgaXQgZXhwZWN0cywgc3VjaCBhcyB0aGUgUE1EIGJlaW5nIGFscmVhZHkgcHJlcHJvY2Vzc2VkPyBBcmUgdGhlcmUgcG90ZW50aWFsIGVkZ2UgY2FzZXMgb3IgZXJyb3IgY29uZGl0aW9ucyBpdCdzIGRlc2lnbmVkIHRvIGhhbmRsZSwgb3IgZG9lcyBpdCBhc3N1bWUgY2VydGFpbiBkYXRhIHN0cnVjdHVyZXM/IEdldHRpbmcgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGlzIHRoZSBmaXJzdCBzdGVwIHRvd2FyZHMgdW5kZXJzdGFuZGluZyBpdHMgZnVuY3Rpb25hbGl0eSBhbmQgaG93IGl0IG1pZ2h0IGZpdCBpbnRvIGEgbGFyZ2VyIGRhdGEgYW5hbHlzaXMgcGlwZWxpbmUuIEknbSBrZWVuIHRvIHNlZSBpZiB0aGlzIGZ1bmN0aW9uIGlzIG9wdGltaXplZCBmb3Igc3BlZWQgb3IgZm9yIGNsYXJpdHksIG9yIGlmIGl0IG1ha2VzIGFueSBhc3N1bXB0aW9ucyBJIG5lZWQgdG8gYmUgYXdhcmUgb2YuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NjkxLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6MzguODYxNTA2MTA1WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM3MjczMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9raHVnZXBhZ2VkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjgxMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjgxMTpcXHRzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcXG4yODEyOlxcdFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBib29sICpsb2NrX2Ryb3BwZWQsXFxuMjgxMzpcXHRcXHRcXHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuMjgxNDpcXHR7XFxuMjgxNTpcXHRcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuMjgxNjpcXHRcXHRib29sIHRyaWdnZXJlZF93YiA9IGZhbHNlO1xcbjI4MTc6XFx0XFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7XFxuMjgxODpcXHRcXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcXG4yODE5OlxcdFxcdHBnb2ZmX3QgcGdvZmY7XFxuMjgyMDpcXHRcXG4yODIxOlxcdFxcdG1tYXBfYXNzZXJ0X2xvY2tlZChtbSk7XFxuMjgyMjpcXHRcXG4yODIzOlxcdFxcdGlmICh2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcXG4yODI0OlxcdFxcdFxcdHJlc3VsdCA9IGNvbGxhcHNlX3NjYW5fcG1kKG1tLCB2bWEsIGFkZHIsIGxvY2tfZHJvcHBlZCwgY2MpO1xcbjI4MjU6XFx0XFx0XFx0Z290byBlbmQ7XFxuMjgyNjpcXHRcXHR9XFxuMjgyNzpcXHRcXG4yODI4OlxcdFxcdGZpbGUgPSBnZXRfZmlsZSh2bWEtXFx1MDAzZXZtX2ZpbGUpO1xcbjI4Mjk6XFx0XFx0cGdvZmYgPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIGFkZHIpO1xcbjI4MzA6XFx0XFxuMjgzMTpcXHRcXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG4yODMyOlxcdFxcdCpsb2NrX2Ryb3BwZWQgPSB0cnVlO1xcbjI4MzM6XFx0cmV0cnk6XFxuMjgzNDpcXHRcXHRyZXN1bHQgPSBjb2xsYXBzZV9zY2FuX2ZpbGUobW0sIGFkZHIsIGZpbGUsIHBnb2ZmLCBjYyk7XFxuMjgzNTpcXHRcXG4yODM2OlxcdFxcdC8qXFxuMjgzNzpcXHRcXHQgKiBGb3IgTUFEVl9DT0xMQVBTRSwgd2hlbiBlbmNvdW50ZXJpbmcgZGlydHkgcGFnZXMsIHRyeSB0byB3cml0ZWJhY2ssXFxuMjgzODpcXHRcXHQgKiB0aGVuIHJldHJ5IHRoZSBjb2xsYXBzZSBvbmUgdGltZS5cXG4yODM5OlxcdFxcdCAqL1xcbjI4NDA6XFx0XFx0aWYgKCFjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCBcXHUwMDI2XFx1MDAyNiByZXN1bHQgPT0gU0NBTl9QQUdFX0RJUlRZX09SX1dSSVRFQkFDSyBcXHUwMDI2XFx1MDAyNlxcbjI4NDE6XFx0XFx0ICAgICF0cmlnZ2VyZWRfd2IgXFx1MDAyNlxcdTAwMjYgbWFwcGluZ19jYW5fd3JpdGViYWNrKGZpbGUtXFx1MDAzZWZfbWFwcGluZykpIHtcXG4yODQyOlxcdFxcdFxcdGNvbnN0IGxvZmZfdCBsc3RhcnQgPSAobG9mZl90KXBnb2ZmIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuMjg0MzpcXHRcXHRcXHRjb25zdCBsb2ZmX3QgbGVuZCA9IGxzdGFydCArIEhQQUdFX1BNRF9TSVpFIC0gMTtcXG4yODQ0OlxcdFxcbjI4NDU6XFx0XFx0XFx0ZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShmaWxlLVxcdTAwM2VmX21hcHBpbmcsIGxzdGFydCwgbGVuZCk7XFxuMjg0NjpcXHRcXHRcXHR0cmlnZ2VyZWRfd2IgPSB0cnVlO1xcbjI4NDc6XFx0XFx0XFx0Z290byByZXRyeTtcXG4yODQ4OlxcdFxcdH1cXG4yODQ5OlxcdFxcdGZwdXQoZmlsZSk7XFxuMjg1MDpcXHRcXG4yODUxOlxcdFxcdGlmIChyZXN1bHQgPT0gU0NBTl9QVEVfTUFQUEVEX0hVR0VQQUdFKSB7XFxuMjg1MjpcXHRcXHRcXHRtbWFwX3JlYWRfbG9jayhtbSk7XFxuMjg1MzpcXHRcXHRcXHRpZiAoY29sbGFwc2VfdGVzdF9leGl0X29yX2Rpc2FibGUobW0pKVxcbjI4NTQ6XFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9BTllfUFJPQ0VTUztcXG4yODU1OlxcdFxcdFxcdGVsc2VcXG4yODU2OlxcdFxcdFxcdFxcdHJlc3VsdCA9IHRyeV9jb2xsYXBzZV9wdGVfbWFwcGVkX3RocChtbSwgYWRkcixcXG4yODU3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIWNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkKTtcXG4yODU4OlxcdFxcdFxcdGlmIChyZXN1bHQgPT0gU0NBTl9QTURfTUFQUEVEKVxcbjI4NTk6XFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xcbjI4NjA6XFx0XFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU2OjM4Ljg2MTg4MTUxNVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTUyOTA0NzE3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbjogVEhQIENvbGxhcHNlKipcblxuT2theSwgc28gYGNvbGxhcHNlX3NpbmdsZV9wbWRgIGlzIHRoZSBrZXksIGFuZCBpdCBjYWxscyBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgY29sbGFwc2Vfc2Nhbl9maWxlYC4gR29vZC4gV2Uga25vdyB0aG9zZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBUaGF0IG1lYW5zIHRoaXMgaXMgYWxsIHJlYWNoYWJsZSB0aHJvdWdoIGBtYWR2aXNlKC4uLiwgTUFEVl9DT0xMQVBTRSlgICphbmQqIHRoZSBiYWNrZ3JvdW5kIGBraHVnZXBhZ2VkYCBkYWVtb24uIFBlcmZlY3QuIFRoYXQncyBhIHNvbGlkIGF0dGFjayBzdXJmYWNlIGZvciBmdXp6aW5nLiBUaGlzIGlzIGRlZmluaXRlbHkgd29ydGggcHVyc3VpbmcuXG5cbkxldCdzIHF1aWNrbHkgcmVjYXAgd2hhdCdzIGNoYW5nZWQ6XG5cbiogICBXZSdyZSBsb29raW5nIGF0IG1vZGlmaWNhdGlvbnMgdG8gYG1tL2todWdlcGFnZWQuY2AuXG4qICAgQW5kIHRoZSBkb2N1bWVudGF0aW9uIHVwZGF0ZSBpbiBgRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0YCBwcm92aWRlcyBjb250ZXh0LlxuXG5Fc3NlbnRpYWxseSwgdGhlIGNoYW5nZXMgcmVzdHJ1Y3R1cmUgdGhlIFBURS1jaGVja2luZyBsb2dpYyB3aXRoaW4gYGtodWdlcGFnZWRgLiBUaGV5J3ZlIGNyZWF0ZWQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBhbmQgdGhlIGBwdGVfY2hlY2tfY29udGV4dGAgc3RydWN0LCByZWZhY3RvcmluZyBob3cgYm90aCBhbm9ueW1vdXMgYW5kIGZpbGUtYmFja2VkIFRIUCBjb2xsYXBzZSB3b3JrLlxuXG5TbyB0aGUgbWFpbiBzeW1ib2xzIHRvIGZvY3VzIG9uIGFyZTpcblxuKiAgIGBjb2xsYXBzZV9jaGVja19wdGVgICh0aGF0IG5ldyBoZWxwZXIpXG4qICAgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgXG4qICAgYGNvbGxhcHNlX3NjYW5fcG1kYFxuKiAgIGBjb2xsYXBzZV9zY2FuX2ZpbGVgXG4qICAgYGNvbGxhcHNlX2h1Z2VfcGFnZWBcbiogICBgbWFkdmlzZV9jb2xsYXBzZWBcblxuTm93LCBsZXQncyBuYWlsIGRvd24gdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9ucyB0byB0ZXN0IHRoaXMgZWZmZWN0aXZlbHkuIFdlIG5lZWQ6XG5cbiogICBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgXG4qICAgRWl0aGVyIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIG9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFYC5cblxuSnVzdCB0byBiZSB0aG9yb3VnaCwgYXJlIHRoZXJlIGFueSAqb3RoZXIqIHJlbGF0ZWQgY29uZmlncyB3ZSBzaG91bGQgYmUgYXdhcmUgb2Y/IExldCdzIGNoZWNrIGBDT05GSUdfUkVBRF9PTkxZX1RIUF9GT1JfRlNgLi4uIE1pZ2h0IGJlIHdvcnRoIGEgcXVpY2sgbG9vayBpbiBgbW0vS2NvbmZpZ2AgdG8gc2VlIGlmIHRoZXJlJ3MgYW55dGhpbmcgZWxzZSB0aGF0J3MgcmVsZXZhbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5ODU5LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzE2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6NTAuMzkwOTMxODc2WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjEyODExNjUsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlJFQURfT05MWV9USFBfRk9SX0ZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTVUMDg6NTY6NTAuNjEyMjIxNjQxWiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzMzIzNzQxMzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgcHJlc2VudGVkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gSHVudGluZyoqXG5cblJpZ2h0LCBzbyBJJ20gdHJ5aW5nIHRvIHRyYWNrIGRvd24gdGhpcyBUSFAgKFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMpIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBJdCdzIGNvbWluZyB0byBtZSB0aGF0IEkgbWlnaHQgYmUgZGVhbGluZyB3aXRoIGFuIG9sZGVyIGtlcm5lbCB2ZXJzaW9uIHdoZXJlIGl0IHdhcyBzcGVjaWZpY2FsbHkgbGFiZWxsZWQgYXMgYENPTkZJR19SRUFEX09OTFlfVEhQX0ZPUl9GU2AsIG9yIHNvbWV0aGluZyBzaW1pbGFyLiBNb3JlIGxpa2VseSwgYW5kIG1vcmUgY29udGVtcG9yYXJ5LCBJJ20gcHJvYmFibHkgbG9va2luZyBmb3Igc2ltcGx5IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEkga25vdyB0aGVzZSB0aGluZ3MgdGVuZCB0byBldm9sdmUuXG5cbkJlc3QgYmV0IGlzIHRvIGRpdmUgaW50byB0aGUgS2NvbmZpZyBmaWxlcywgc3BlY2lmaWNhbGx5IGBtbS9LY29uZmlnYC4gVGhhdCdzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCwgYW5kIHRoZSBUSFAtcmVsYXRlZCBzdHVmZiAqaGFzKiB0byBiZSBpbiB0aGVyZS4gVGltZSB0byBjb25maXJtIG15IGFzc3VtcHRpb25zIGFuZCBuYWlsIGRvd24gdGhlIHByZWNpc2UgbmFtZSwgcG90ZW50aWFsIGRlcGVuZGVuY2llcywgYW5kIGRlZmF1bHQgc2V0dGluZ3MuIEl0J3MgZnJ1c3RyYXRpbmcgd2hlbiB0aGVzZSBvcHRpb25zIGdldCByZW5hbWVkLiBJIGp1c3QgbmVlZCB0byBnZXQgdGhlIHJpZ2h0IG5vbWVuY2xhdHVyZSBzdHJhaWdodCBzbyBJIGNhbiBwcm9jZWVkIHdpdGggdGhlIHRhc2sgYXQgaGFuZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA2NDcsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1Njo1NC45NDQ2MDA0OThaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MDQ4NTg2NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcuKlRIUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04MTM9Y29uZmlnIEFSQ0hfV0FOVF9HRU5FUkFMX0hVR0VUTEJcXG4tLVxcbm1tL0tjb25maWctODE1LVxcbm1tL0tjb25maWc6ODE2OmNvbmZpZyBBUkNIX1dBTlRTX1RIUF9TV0FQXFxubW0vS2NvbmZpZy04MTctXFx0ZGVmX2Jvb2wgblxcbi0tXFxubW0vS2NvbmZpZz05NzI9ZW5kY2hvaWNlXFxubW0vS2NvbmZpZy05NzMtXFxubW0vS2NvbmZpZzo5NzQ6Y29uZmlnIFRIUF9TV0FQXFxubW0vS2NvbmZpZy05NzUtXFx0ZGVmX2Jvb2wgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNVQwODo1Njo1NS4xMjUwOTMwMDRaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTUxOTE1OTQ1MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIFRIUCBDb2xsYXBzZSBSZWZhY3RvcmluZyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSB0YXJnZXQgaXMgdGhlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgZnVuY3Rpb25hbGl0eSDigJMgdGhhdCdzIHRoZSBjb3JlIGFyZWEgb2YgaW50ZXJlc3QuIEknbSBmb2N1c2luZyBvbiB0aGUgY2hhbmdlcyByZWxhdGVkIHRvIGh1Z2UgcGFnZSBjb2xsYXBzZSwgYW5kIHNwZWNpZmljYWxseSwgaG93IHRoaXMgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgKFBhZ2UgVGFibGUgRW50cnkpIGNoZWNraW5nIGxvZ2ljLlxuXG5GaXJzdCwgSSBpZGVudGlmaWVkIGBtYWR2aXNlX2NvbGxhcHNlYCBhcyBhIGtleSBlbnRyeSBwb2ludCwgc2luY2UgaXQncyB0aGUgdXNlcnNwYWNlIHRyaWdnZXIgZm9yIHRoaXMgYmVoYXZpb3IuIFdoaWxlIGBraHVnZXBhZ2VkYCBoYW5kbGVzIHRoaXMgaW4gdGhlIGJhY2tncm91bmQsIGBtYWR2aXNlYCBnaXZlcyBhIG1vcmUgZGlyZWN0IHdheSB0byBoaXQgdGhpcyBjb2RlIGR1cmluZyBmdXp6aW5nLlxuXG5NeSBhbmFseXNpcyBsZWQgbWUgdG8gYSBmZXcga2V5IGZvY3VzIHN5bWJvbHMgdGhhdCBlbmNhcHN1bGF0ZSB0aGUgY29yZSBtb2RpZmljYXRpb25zLiBgY29sbGFwc2VfY2hlY2tfcHRlYCBpcyB0aGUgbmV3IGhlbHBlciBmdW5jdGlvbiBpbnRyb2R1Y2VkLCBhbmQgaXQgYXBwZWFycyB0byBiZSBjZW50cmFsIHRvIHRoZSBjaGFuZ2VzLCBzbyBJJ2xsIGJlIGtlZXBpbmcgYSB2ZXJ5IGNsb3NlIGV5ZSBvbiB0aGF0LiBUaGVuIHRoZXJlJ3MgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIHdoaWNoIHVzZXMgaXQsIGFsb25nIHdpdGggYGNvbGxhcHNlX3NjYW5fcG1kYCwgYGNvbGxhcHNlX3NjYW5fZmlsZWAgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLiAgSSdtIGFsc28gcGF5aW5nIGF0dGVudGlvbiB0byBgYWxsb2NfY2hhcmdlX2ZvbGlvYCBkdWUgdG8gaXRzIG1vZGlmaWNhdGlvbiB1c2luZyBgY291bnRfY29sbGFwc2VfZXZlbnRgLlxuXG5JIGNvbmZpcm1lZCB0aGF0IGBjb2xsYXBzZV9jaGVja19wdGVgIGlzIHN0YXRpYywgbWVhbmluZyBpdCBzaG91bGQgYmUgaW4gdGhlIHN5bWJvbCB0YWJsZSB1bmxlc3MgaW5saW5lZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgdHJhY2luZy4gYGNvbGxhcHNlX2lzX3JlZmVyZW5jZWRgIGlzIHN0YXRpYyBpbmxpbmUsIHNvIGl0IG1pZ2h0IGJlIGlubGluZWQuIGBjb3VudF9jb2xsYXBzZV9ldmVudGAgaXMgYWxzbyBzdGF0aWMsIHNvIGl0IHNob3VsZCBiZSBpbiB0aGUgc3ltYm9sIHRhYmxlLlxuXG5UaGVyZWZvcmUsIHRoZSBrZXkgc3ltYm9scyBJJ20gZm9jdXNpbmcgb24gYXJlOlxuKiAgIGBjb2xsYXBzZV9jaGVja19wdGVgXG4qICAgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgXG4qICAgYGNvbGxhcHNlX3NjYW5fcG1kYFxuKiAgIGBjb2xsYXBzZV9zY2FuX2ZpbGVgXG4qICAgYGNvbGxhcHNlX2h1Z2VfcGFnZWBcblxuTXkgcmVhc29uaW5nIGlzIHRoYXQgdGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIGR1cmluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgY29sbGFwc2UsIGludm9sdmluZyBuZXcgc3RydWN0dXJlcyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiBga2h1Z2VwYWdlZGAgYW5kIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuIEl0J3MgYSBmdW5kYW1lbnRhbCBjaGFuZ2UgdG8gaG93IHBhZ2VzIGFyZSBtYW5hZ2VkIGFuZCBjb2xsYXBzZWQgaW50byBUSFBzLCBhbmQgdGhhdCdzIHByZWNpc2VseSB3aGVyZSBteSBhdHRlbnRpb24gbGllcy5cblxuSW4gdGVybXMgb2YgY29uZmlndXJhdGlvbiwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCAoYW5kIHNwZWNpZmljYWxseSwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VgIHdoaWNoIGNvbnRyb2xzIHRoZSBgbWFkdmlzZWAgYmVoYXZpb3IpIHdpbGwgYmUgY3JpdGljYWwgdG8gcmVwcm9kdWNlIHRoaXMgYmVoYXZpb3IuIEl0IHNlZW1zIGBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNgIGlzIGFub3RoZXIgb3B0aW9uIHRoYXQgd29ya3MuXG5cbk9rYXksIGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEwODQsIk91dHB1dFRva2VucyI6MjExLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzQ0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE1VDA4OjU3OjEwLjMxNjY5MDIzNloiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMjM5MzM1NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvbGxhcHNlX2NoZWNrX3B0ZVwiLFxuICAgIFwiX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwiLFxuICAgIFwiY29sbGFwc2Vfc2Nhbl9wbWRcIixcbiAgICBcImNvbGxhcHNlX3NjYW5fZmlsZVwiLFxuICAgIFwiY29sbGFwc2VfaHVnZV9wYWdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvbGxhcHNlX2NoZWNrX3B0ZVwiLFxuICAgIFwiX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwiLFxuICAgIFwiY29sbGFwc2Vfc2Nhbl9wbWRcIixcbiAgICBcImNvbGxhcHNlX3NjYW5fZmlsZVwiLFxuICAgIFwiY29sbGFwc2VfaHVnZV9wYWdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgZHVyaW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBjb2xsYXBzZSBpbiBga2h1Z2VwYWdlZGAuIEl0IGludHJvZHVjZXMgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaGVscGVyIGZ1bmN0aW9uLCB3aGljaCBhcmUgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBUaGlzIG1vZGlmaWVzIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGZvciBjb2xsYXBzaW5nIHBhZ2VzIGludG8gVEhQcywgd2hpY2ggaXMgcmVhY2hhYmxlIHZpYSB0aGUgYmFja2dyb3VuZCBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIHN5c2NhbGwuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflow4gscf[1] Phase: Succeeded StartedAt: 2026-07-15 08:57:22 +0000 UTC FinishedAt: 2026-07-15 08:57:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-15 08:57:22 +0000 UTC FinishedAt: 2026-07-15 08:57:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2] Phase: Succeeded StartedAt: 2026-07-15 08:57:22 +0000 UTC FinishedAt: 2026-07-15 13:23:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-15 08:57:22 +0000 UTC FinishedAt: 2026-07-15 13:23:30 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-15 08:57:22 +0000 UTC FinishedAt: 2026-07-15 08:58:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-15 08:57:22 +0000 UTC FinishedAt: 2026-07-15 08:57:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow4gscf/series-workflow4gscf-convert-artifact-4021257367/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-15 08:58:03 +0000 UTC FinishedAt: 2026-07-15 09:44:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-15 08:58:03 +0000 UTC FinishedAt: 2026-07-15 09:44:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*ca83cbbf-ac74-4834-aad2-aaf7be89991b,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-workflow4gscf/series-workflow4gscf-convert-artifact-4021257367/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": "a1a8ccfc-c92a-4e1b-b907-e63f3ce70108", "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-workflow4gscf/series-workflow4gscf-build-action-3085058541/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-15 08:58:03 +0000 UTC FinishedAt: 2026-07-15 09:44:45 +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:*ca83cbbf-ac74-4834-aad2-aaf7be89991b,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-workflow4gscf/series-workflow4gscf-convert-artifact-4021257367/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": "a1a8ccfc-c92a-4e1b-b907-e63f3ce70108", "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-workflow4gscf/series-workflow4gscf-build-action-3085058541/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-15 09:44:55 +0000 UTC FinishedAt: 2026-07-15 09:44:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-15 09:44:55 +0000 UTC FinishedAt: 2026-07-15 09:44:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-15 09:44:55 +0000 UTC FinishedAt: 2026-07-15 09:45:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-15 09:44:55 +0000 UTC FinishedAt: 2026-07-15 09:45:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow4gscf/series-workflow4gscf-convert-artifact-223422662/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-15 09:45:06 +0000 UTC FinishedAt: 2026-07-15 09:47:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-15 09:45:06 +0000 UTC FinishedAt: 2026-07-15 09:47:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a1a8ccfc-c92a-4e1b-b907-e63f3ce70108,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-workflow4gscf/series-workflow4gscf-build-action-3085058541/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-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-15 09:47:22 +0000 UTC FinishedAt: 2026-07-15 09:47:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-15 09:47:22 +0000 UTC FinishedAt: 2026-07-15 09:47:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-15 09:47:22 +0000 UTC FinishedAt: 2026-07-15 10:17:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-15 09:47:22 +0000 UTC FinishedAt: 2026-07-15 10:17:20 +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:*ca83cbbf-ac74-4834-aad2-aaf7be89991b,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-workflow4gscf/series-workflow4gscf-convert-artifact-223422662/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": "7f9a7a7a-9c99-4541-ba5c-00d13a61df5b", "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-workflow4gscf/series-workflow4gscf-build-action-1086172170/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-15 09:47:22 +0000 UTC FinishedAt: 2026-07-15 10:17:10 +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:*ca83cbbf-ac74-4834-aad2-aaf7be89991b,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-workflow4gscf/series-workflow4gscf-convert-artifact-223422662/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": "7f9a7a7a-9c99-4541-ba5c-00d13a61df5b", "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-workflow4gscf/series-workflow4gscf-build-action-1086172170/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-15 10:17:20 +0000 UTC FinishedAt: 2026-07-15 10:17:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-15 10:17:20 +0000 UTC FinishedAt: 2026-07-15 10:17:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-15 10:17:20 +0000 UTC FinishedAt: 2026-07-15 10:19:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-15 10:17:20 +0000 UTC FinishedAt: 2026-07-15 10:19:26 +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:*7f9a7a7a-9c99-4541-ba5c-00d13a61df5b,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-workflow4gscf/series-workflow4gscf-build-action-1086172170/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-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-15 10:19:36 +0000 UTC FinishedAt: 2026-07-15 13:23:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-15 10:19:36 +0000 UTC FinishedAt: 2026-07-15 13:23:30 +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":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"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:*a1a8ccfc-c92a-4e1b-b907-e63f3ce70108,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*7f9a7a7a-9c99-4541-ba5c-00d13a61df5b,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-workflow4gscf/series-workflow4gscf-build-action-3085058541/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-workflow4gscf/series-workflow4gscf-build-action-1086172170/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-15 10:19:36 +0000 UTC FinishedAt: 2026-07-15 10:19:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-15 10:19:36 +0000 UTC FinishedAt: 2026-07-15 10:19:42 +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":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"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-workflow4gscf/series-workflow4gscf-convert-artifact-3940994699/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-15 10:19:36 +0000 UTC FinishedAt: 2026-07-15 10:19:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-15 10:19:36 +0000 UTC FinishedAt: 2026-07-15 10:19:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-15 10:19:36 +0000 UTC FinishedAt: 2026-07-15 10:19:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-15 10:19:46 +0000 UTC FinishedAt: 2026-07-15 13:23:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflow4gscf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["collapse_check_pte","__collapse_huge_page_isolate","collapse_scan_pmd","collapse_scan_file","collapse_huge_page"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"2ef7aa14db59fb1d5f562e6e425ef39509cb033b","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","TRANSPARENT_HUGEPAGE_ALWAYS"],"series_id":"9c681b44-9d52-4a6c-9a3a-04bb7151ca2e","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-15 10:19:46 +0000 UTC FinishedAt: 2026-07-15 13:23:20 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a1a8ccfc-c92a-4e1b-b907-e63f3ce70108,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*7f9a7a7a-9c99-4541-ba5c-00d13a61df5b,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-workflow4gscf/series-workflow4gscf-build-action-3085058541/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-workflow4gscf/series-workflow4gscf-build-action-1086172170/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-workflow4gscf/series-workflow4gscf-convert-artifact-3940994699/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,}